各语言框架 CoolQ HTTP API 插件 近期要求搭建docker容器,就玩起了之前很早就想玩的CoolQ机器人。

1、Docker拉取CoolQ环境

sudo docker pull richardchien/cqhttp:latest
sudo docker pull richardchien/cqhttp:4.8.0

这里拉取的版本我拉取了4.8.0是因为之后我使用的java框架是只支持4.8.0的,所以在拉取的时候应该选取自己框架对应的版本拉取。

2、创建镜像的参数

我创建镜像的参数

docker run -ti --rm --name cqhttp-test \
--network host \
-v $(pwd)/coolq:/home/user/coolq \
-e COOLQ_ACCOUNT=106******** \
-e CQHTTP_POST_URL=http://127.0.0.1:9999 \
-e CQHTTP_SERVE_DATA_FILES=yes \
richardchien/cqhttp:4.8.0

朋友那挖的参数,比较全面,对应着看。

#sudo docker run -ti --rm --name cqhttp-coolq \   #
#             -d \   # daemon,后台运行
#             --network host \   # host 模式下,容器的 localhost,就是宿主机的 localhost。即与宿主机共用网络
#             -v ~/coolq:/home/user/coolq \   # 将容器的 /home/user/coolq 文件夹映射到宿主机
#             -e COOLQ_ACCOUNT=$COOLQ_ACCOUNT  \   # 酷Q 账号(QQ账号)
#             -e VNC_PASSWD=$VNC_PASSWD \     # nvc 密码
#             -e FORCE_ENV=$FORCE_ENV \       # 强制覆盖原有配置,否则配置不会更新。。
#             -e CQHTTP_USE_HTTP=no \         # 关闭 http api
#             -e CQHTTP_USE_WS_REVERSE=yes  \  # 启用反向 websocket api
#             -e CQHTTP_ACCESS_TOKEN=$CQHTTP_ACCESS_TOKEN  \  # api 连接时需要的 token
#             -e CQHTTP_SECRET=$CQHTTP_SECRET \   # secret 用于数据签名,反向 websocket 中不需要(因为握手阶段没有数据要传输)
#             -e CQHTTP_WS_REVERSE_API_URL=$CQHTTP_WS_REVERSE_API_URL  \
#             -e CQHTTP_WS_REVERSE_EVENT_URL=$CQHTTP_WS_REVERSE_EVENT_URL  \
#             -e CQHTTP_SERVE_DATA_FILES=$CQHTTP_SERVE_DATA_FILES  \  # 允许访问 data 文件夹中的文件
#             richardchien/cqhttp:latest

对于为什么需要,--network host,师傅说,程序访问酷Q,可以直接走端口映射。但是酷Q要将消息发给你,就有问题了,docker 内部访问宿主机,默认是要走网桥的 咱也不知道,咱也不敢问。

3、VNC登录QQ

在这步我出现了问题,是因为我将9000的端口映射给了docker的GUI,pointer,然而我的VNC映射设置为--network host,所以只能将别的端口映射移开,将9000端口让给VNC界面。 登录时要是一路顺风就没什么好说的,但会出现一个坑,就是异地登录,如果遇到异地登录会让你用chrome插件来验证,然而我尝试了也没什么用, 验证码还是不会出现。 获取chrome

解决方法就是,在提示你用chrome的时候,你选择否,再登录一次就会使用到旧版的VNC。后面会让你开启设备锁发短信来验证登录(来自论坛管理回复,亲测有效) 解决方式

登录QQ后的界面 这个时候,部署就已经完成了

4、调用API

几个常用的调用API

http://你的IP:5700/send_private_msg?user_id=QQ号&message=要发送的消息
http://你的IP:5700/send_group_msg?group_id=QQ群号&message=要发送的消息
http://你的IP:5700/delete_msg?message_id=消息ID

5、使用java库响应QQ消息

注意这里创建机器人对象的的openIP为返回消息的端口 添加机器人账户为机器人接受消息的端口 我使用的是PicqBotX框架 机器人配置Json

public class TestBot
{
    public static void main(String[] args)
    {
        // 创建机器人对象 ( 传入配置 )
        PicqBotX bot = new PicqBotX(new PicqConfig(9999).setDebug(true));

        // 添加一个机器人账户 ( 名字, 发送URL, 发送端口 )
        bot.addAccount("Bot01", "127.0.0.1", 5700);

        // 注册事件监听器, 可以注册多个监听器
        bot.getEventManager().registerListeners(
                new TestListener(), 
                new RequestListener(),
                new ExceptionListener()
        );

        // 启用指令管理器
        // 这些字符串是指令前缀, 比如指令"!help"的前缀就是"!"
        bot.enableCommandManager("bot -", "!", "/", "~");

        // 注册指令, 可以注册多个指令
        bot.getCommandManager().registerCommands(
                new CommandSay(),
                new CommandTest(),
                new CommandVersion()
        );

        // 启动机器人, 不会占用主线程
        bot.startBot();
    }
}
有两个监听
一个为事件监听器继承IcqListener类

监听事件

事件类名	事件介绍
Event	所有事件(不推荐监听)
EventMessage	所有消息事件
EventDiscussMessage	讨论组消息事件
EventGroupMessage	群聊消息事件
EventPrivateMessage	私聊消息事件
EventNotice	所有提醒事件
EventNoticeFriendAdd	加好友提醒
EventNoticeGroupAdminChange	所有群管理员数量更改事件
EventNoticeGroupAdminSet	群员被设为管理员事件
EventNoticeGroupAdminRemove	群员被取消管理员事件
EventNoticeGroupMemberChange	所有群员数量更改事件
EventNoticeGroupMemberDecrease	所有群员数量减少事件
EventNoticeGroupMemberKick	群员被踢事件
EventNoticeGroupMemberKickBot	自己被踢事件
EventNoticeGroupMemberLeave	群员主动退出事件
EventNoticeGroupMemberIncrease	所有群员数量增加事件
EventNoticeGroupMemberApprove	群员被同意进群事件
EventNoticeGroupMemberInvite	群员被邀请进群事件
EventNoticeGroupUpload	上传群文件事件
EventRequest	所有请求事件
EventFriendRequest	加好友请求事件
EventGroupAddRequest	加群请求事件
EventGroupInviteRequest	拉你入群请求事件
EventLocal	所有本地事件
EventLocalSendMessage	所有本地向外发送的事件
EventLocalSendDiscussMessage	发送讨论组消息事件
EventLocalSendGroupMessage	发送群聊消息事件
EventLocalSendPrivateMessage	发送私聊消息事件
EventLocalHttpRecieveEvent	接收HTTP请求事件
EventLocalHttpFailEvent	接收HTTP请求失败事件
EventMeta	Meta事件
EventMetaLifecycle	生命周期事件
EventMetaHeartbeat	心跳事件

@EventHandler
    public void 方法名(事件类型 event)
另一个为指令,实现的是EverywhereCommand接口

public class CommandVersion implements EverywhereCommand // 实现EverywhereCommand就是无论私聊群聊还是讨论组都能收到的指令
{
    // 指令属性
    @Override
    public CommandProperties properties()
    {
        // 这个括号里填指令名和其他名称, 指令名必须至少有一个
        // 这个的话, 用"!v", "!version", 和"!版本"都能触发指令 (感叹号为你设置的前缀, 不一定必须要感叹号)
        return new CommandProperties("version", "v", "版本");
    }
    
    // 机器人接到指令后会执行这个方法 ( 实现不同的接口的话方法名不一定一样 )
    @Override
    public String run(EventMessage event, User sender, String command, ArrayList<String> args)
    {
        // 处理, 返回值会自动回复回去
        // 这里因为这个指令是用来查版本的, 所以直接返回字符串了
        return "TestBot - PicqBotX v4.10.1.928";
    }
}

例子都搬运自使用手册,这里只举最基础的。可以自行去插件下载页面看readme 人工智障

做大自然的搬运工,Cool!Q!