铮铮卡穆 发表于 2016-9-28 17:25:34

酷Q机器人开发笔记(C++)

本帖最后由 铮铮卡穆 于 2016-10-9 20:11 编辑

声明
本人做C开发的,C++略懂,最近觉得QQ群机器人有点意思,所以找到酷Q的平台玩一玩。
说实话,C++的SDK太不完善,函数没有说明,主要靠参数名来猜。论坛里基本都是易语言的,搞了一个发现实在是看不懂,不会写,但是注释相对完善,就当一个文档来看了,主要还是C++来做开发。
PS:两个开发者群都申请了,但是没人答复,不知道怎么回事,只好来论坛上边摸索边分享了。

前期准备
按照[官方文档],下载 VC++ SDK,开启开发者模式。SDK是用VC++2010编写的,实测用VS2015也可以。编译出dll之后,和json文件一起copy到酷Q的app文件夹,酷Q重启,正常就可以加载到新的插件了。
这里踩过的坑:

[*]一定要开启开发者模式,否则编译的dll库不会被载入;
[*] 程序里的appid、dll文件名、json文件名一定要一致,否则载入失败。
[*] 每次编译、更新dll之后都要重启酷Q,否则加载的还是原来的库,新增功能不生效。





蓝色幻想 发表于 2016-9-28 17:31:12

感谢分享经验,帮助更多开发者!

铮铮卡穆 发表于 2016-9-28 17:31:15

RE: 酷Q机器人开发笔记

本帖最后由 铮铮卡穆 于 2016-10-12 20:22 编辑

基本功能验证
消息回放
先放一段消息回放的代码,后面会用得到。
另外后文写的关于日志的部分,由于代码是私人的,我没有权力公开,所以就不要照抄了,作为参考代码来看看。

const char* buildSendBackMsg(const char* msg)
{
    static const char *back = "你刚才说:";
    char *sendback;
    if (NULL == msg)return NULL;
    sendback = (char*)malloc(strlen(msg) + +strlen(back) + 1);
    if (sendback)
    {
      sprintf(sendback, "%s%s", back, msg);
      return sendback;
    }
    else
      return NULL;
}
void releaseSendBackMsg(const char* msg)
{
    free((void*)msg);
}接收和发送私聊消息
__eventPrivateMsg 接收到私聊信息的回调函数
subType 子类型 11/来自好友 1/来自在线状态 2/来自群 3/来自讨论组
sendTime 时间戳
fromQQ 哪个QQ发过来的
msg 消息内容
font 字面意思字体
CQ_sendPrivateMsg 发送私聊消息
AuthCode 校验码,在Initialize初始化的全局变量ac
QQID 要发给哪个QQ号
msg 发送的内容<blockquote>CQEVENT(int32_t, __eventPrivateMsg, 24)(int32_t subType, int32_t sendTime, int64_t fromQQ, const char *msg, int32_t font) {上面这一块有问题,无法贴上来完整的代码,总被改掉

实测效果
* 日志和返回都正常,使用格式化输出请注意int64_t类型的数据应该使用%lld才能正确输出,否则会导致后面的格式错乱,后文不会再提;
* LOG_INFO是我自己的日志封装接口,不是SDK提供的,我不对外提供;
* 不是好友的QQ,从QQ群里点开机器人的,subtype是来自群;
* 不是好友的QQ,从讨论组里点开机器人的,subtype是来自讨论组;
* 来自在线状态不知道是什么;
* 消息内容为标准表情,日志里会使用 这样的编码来标记,不认识的表情用 来标记;
* 消息内容为emoji表情,日志里会使用 这样的编码来标记,关于CQ编码后面再详细研究。


铮铮卡穆 发表于 2016-9-28 17:36:59

RE: 酷Q机器人开发笔记

本帖最后由 铮铮卡穆 于 2016-10-9 19:54 编辑

接收和发送群消息
__eventGroupMsg 接收到群信息的回调函数
subType 子类型,实测全是1
sendTime 时间戳
fromGroup 哪个群发来的消息
fromQQ 哪个QQ发过来的
fromAnonymous 匿名者的标识
msg 消息内容
font 字体
CQ_sendGroupMsg 发送群消息
AuthCode 校验码,在Initialize初始化的全局变量ac
groupid 要发给哪个QQ群号
msg 发送的内容
CQEVENT(int32_t, __eventGroupMsg, 36)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t fromQQ, const char *fromAnonymous, const char *msg, int32_t font) {

    const char* send = NULL;

    LOG_INFO("fromGroup:[%lld], fromQQ:[%lld], fromAnonymous:[%s], msg:%s", fromGroup, fromQQ, fromAnonymous, msg);

    send = buildSendBackMsg(msg);
    CQ_sendGroupMsg(ac, fromGroup, send);
    releaseSendBackMsg(send);

    return EVENT_BLOCK;
}
实测效果

[*]* 非匿名用户发消息,fromAnonymous为空字符串;
* 匿名用户发消息,fromQQ为80000000,msg里面会包含匿名的名字(如:[誉王]),fromAnonymous为一串base64编码,是匿名者的标识,后面会介绍利用这个标识对指定的匿名用户禁言;


铮铮卡穆 发表于 2016-9-28 17:38:43

RE: 酷Q机器人开发笔记

本帖最后由 铮铮卡穆 于 2016-10-9 19:55 编辑

接收和发送讨论组消息
__eventDiscussMsg 接收到讨论组信息的回调函数
subType 子类型
sendTime 时间戳
fromDiscuss 哪个讨论组发来的消息
fromQQ 哪个QQ发过来的
msg 消息内容
font 字体
CQ_sendDiscussMsg 发送讨论组消息
AuthCode 校验码,在Initialize初始化的全局变量ac
discussid 要发给哪个讨论组号
msg 发送的内容
<blockquote>CQEVENT(int32_t, __eventDiscussMsg, 32)(int32_t subType, int32_t sendTime, int64_t fromDiscuss, int64_t fromQQ, const char *msg, int32_t font) {


实测效果
* 日志和返回都正常



︶悠扬、Le逍遥^ 发表于 2016-9-28 17:40:12

本帖最后由 ︶悠扬、Le逍遥^ 于 2016-9-28 17:41 编辑

感谢分享
msg乱码可能是正则的问题

铮铮卡穆 发表于 2016-9-28 17:41:30

RE: 酷Q机器人开发笔记

本帖最后由 铮铮卡穆 于 2016-10-9 19:57 编辑

群事件
__eventSystem_GroupAdmin 管理员变动
subType 子类型,1/被取消管理员 2/被设置管理员
fromGroup 群号
beingOperateQQ 被操作者QQ号
__eventSystem_GroupMemberDecrease 群成员减少
subType 子类型,1/群员离开 2/群员被踢 3/自己(即登录号)被踢
sendTime 时间戳
fromGroup 群号
fromQQ 操作者QQ号(管理员,仅subType为2、3时存在)
beingOperateQQ 被操作者QQ号
__eventSystem_GroupMemberIncrease 群成员增加
subType 子类型,1/管理员已同意 2/管理员邀请
sendTime 时间戳
fromGroup 群号
fromQQ 操作者QQ号(管理员)
beingOperateQQ 被操作者QQ号

<blockquote>CQEVENT(int32_t, __eventSystem_GroupAdmin, 24)(int32_t subType, int32_t sendTime, int64_t fromGroup, int64_t beingOperateQQ) {


实测效果
* 1/被取消管理员 2/被设置管理员 1/群员离开 2/群员被踢 1/管理员已同意 2/管理员邀请 六个功能的subtype验证正常,**3/自己(即登录号)被踢**没有出现,被踢时表现为**2/群员被踢**;


铮铮卡穆 发表于 2016-9-28 17:43:18

RE: 酷Q机器人开发笔记

︶悠扬、Le逍遥^ 发表于 2016-9-28 17:40
感谢分享
msg乱码可能是正则的问题

直接原样返回就是乱码,这也跟正则有关系?

︶悠扬、Le逍遥^ 发表于 2016-9-28 17:45:52

RE: 酷Q机器人开发笔记

你的json里有没有这东西……,
            "regex":{
                "key":["qq","action"],
                "expression":["^(?<action>\\S{1,4}?)\\s*(?<qq>\\d{5,10})\\s*?$",
                         "^(?<action>\\S{1,4}?)\\s*\\\\s*?$"]
            }易语言是要解析下的,不知道C怎么样

铮铮卡穆 发表于 2016-9-28 17:48:33

RE: 酷Q机器人开发笔记

︶悠扬、Le逍遥^ 发表于 2016-9-28 17:45
你的json里有没有这东西……易语言是要解析下的,不知道C怎么样

默认的json配置我没动,没看到有类似的代码。

371655313 发表于 2016-9-29 13:35:49

哥们,我也是C++的,能加个好友吗,想跟你请教个问题?加我Q

铮铮卡穆 发表于 2016-9-29 16:40:22

RE: 酷Q机器人开发笔记

本帖最后由 铮铮卡穆 于 2016-9-29 16:41 编辑

371655313 发表于 2016-9-29 13:35
哥们,我也是C++的,能加个好友吗,想跟你请教个问题?加我Q
我自己也没弄明白呢……你的名字就是QQ号?官方的两个QQ群都没有批准我,现在只能自己摸索。

371655313 发表于 2016-9-29 16:42:20

RE: 酷Q机器人开发笔记

铮铮卡穆 发表于 2016-9-29 16:40
我自己也没弄明白呢……你的名字就是QQ号?官方的两个QQ群都没有批准我,现在只能自己摸索。
...

对的,昵称就是QQ号码,加我一下一起研究下

铮铮卡穆 发表于 2016-9-29 20:18:01

7楼提到的错位问题已经验证了,前文所有的实例,应该把%ld改成%lld,就可以正常显示了。
既然是错位,那就是说数据本身没有问题,是格式化输出出的问题。

铮铮卡穆 发表于 2016-10-9 19:58:33

RE: 酷Q机器人开发笔记

前面的楼层已经更新过了,后面会继续补充新内容
页: [1] 2 3
查看完整版本: 酷Q机器人开发笔记(C++)