几十行代码让QQ机器人实现自然复读

最近在玩酷Q这个工具,酷Q本身是一个封装了QQ各种东西以实现QQ机器人的程序,但是酷Q本身是一个白板,想要启动一个真正的QQ机器人需要装插件。

得益于酷Q比较开放的Api和开源社区的强大力量,我使用第三方SDK —— Native.SDK(原生C#)写了一个机器人。

鉴于时下各个Q群充斥着大量复读机,于是我给机器人添加了复读功能。

过于机械的复读会使得我们的复读机变得非常僵硬,没有灵魂,为了让它拟人化复读,我们在记录发言的同时还需要判断其发言人。

于是复读部分的代码是这样的,以下代码是自动复读的部分

RepeatProcessor.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
namespace BackRunner.QQBot.Processors
{
public static class RepeatProcessor
{
private static List<GroupMessage> lastGroupMessage = new List<GroupMessage>();

#region == 自动复读 ==
public static void Process(GroupMessageEventArgs e)
{
//查询之前的各群最后一次发言
GroupMessage gm = lastGroupMessage.Find(t => t.FromGroup.Equals(e.FromGroup));

if (gm == null)
{
//无该群的最后一次发言记录,则新建记录并添加
gm = new GroupMessage(e.FromGroup, e.FromQQ, e.Msg);
lastGroupMessage.Add(gm);
} else
{
//存在该群的最后一次发言记录
//判断消息是否为复读
if (gm.Msg == e.Msg)
{
//判断是否为同一个人发送的
if (gm.FromQQ != e.FromQQ)
{
gm.RepeatCount++; //复读计数器递增
gm.FromQQ = e.FromQQ; //更新QQ
if (gm.RepeatCount >= 3)
{
//当复读次数达到三次的时候进行复读
EnApi.Instance.SendGroupMessage(e.FromGroup, e.Msg);
gm.isRepeated = true;
}
} else
{
//为同一个人发送,更新fromQQ,不更新其他值
gm.FromQQ = e.FromQQ;
}
} else
{
//消息不是复读,更新相应的内容
gm.Msg = e.Msg;
gm.FromQQ = e.FromQQ;
//重置
gm.RepeatCount = 0;
gm.isRepeated = false;
}
}
}
#endregion
}
}

其中用到了一个自定义类
GroupMessage.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace BackRunner.QQBot.Models
{
public class GroupMessage
{
public long FromGroup;
public long FromQQ;
public string Msg;
public int RepeatCount;

//flags
public bool isRepeated = false;

public GroupMessage(long fromGroup, long fromQQ, string msg)
{
FromGroup = fromGroup;
FromQQ = fromQQ;
Msg = msg;
RepeatCount = 0;
}

public GroupMessage(long fromGroup, long fromQQ, string msg, int repeatCount)
{
FromGroup = fromGroup;
FromQQ = fromQQ;
Msg = msg;
RepeatCount = repeatCount;
}
}
}

得益于C#的特性我们可以很方便地做发言记录,从而实现复读。主要的代码也就几十行。

这个代码还可以优化,例如给GroupMessage封装一个Reset()方法,复读的时候判断次数用随机数使其更具灵性,加入敏感词过滤等等。


手动at复读机进行复读这个操作太简单了,这里就不提了,自动复读这一块酷Q论坛里的插件是易语言写的,还有这样那样的毛病,用C#实现其实就这么简单。

各位看官有兴趣的话可以自己搞个酷Q,搞个SDK,弄一个复读机出来玩玩。