欢迎食用『主界面』~,这里是赵苦瓜的看板娘desu~

#
使用go-cqhttp和Python的QQ机器人
首页 > 点滴记录    作者:赵苦瓜   2021年7月17日 20:37 星期六   热度:33093°   百度已收录  
时间:2021-7-17 20:37   热度:33093° 

对于自定义开发QQ机器人的需求

之前写项目的时候有一个需求,就是要保持数据库中和QQ群中人员一致,也就是说从数据库里面删人的时候,QQ群里面也要对应踢出群聊。

听到这个需求,我一下子就想到了我从初中就开始接触的QQ机器人。

第三方QQ机器人环境变化

当年酷Q的机器人是非常好用的,我也用过一些点歌插件、自动回复插件以及一些管理群的插件。这些第三方的机器人功能非常强大,不知道比现在QQ官方的机器人功能多到那里去了,而且还能根据自己的需求开发。

只可惜,前几个月TX对这些第三方机器人进行封杀,不仅是酷Q,其它很多机器人框架都凉了。

选择了go-cqhttp

在这种环境背景下,我调查了很多现有机器人,其中有很多都是使用的小栗子框架。然而这个框架新版收费,老版功能虽说也很强大,但是不满足我的需求。于是,我看向了cqhttp。

简单易上手的初步配置

本来以为这种框架没个一两天搞不会,没想到不到1个小时就测试好了,确实轻量好用!

官网的教程也写的非常清楚:go-cqhttp 帮助中心

windows环境下就更加简单了,直接下载打开,改配置文件,再打开就能用了,

下面讲一下Linux环境下的使用:

1.到github下载对应的release包。我下载的是go-cqhttp_linux_amd64.tar.gz

2.找一个合适的地方解压缩。这东西下载好之后用FTP工具传上去,然后在SSH中输入命令解压就行了。

tar -xjf go-cqhttp_linux_amd64.tar.gz

3.解压之后cd到对应路径,然后直接运行go-cqhttp即可

./go-cqhttp

之后和windows一样,写配置文件,再进入。

要注意的是,如果要允许外面访问服务器的话,需要把host改为0.0.0.0  端口不要和现有端口冲突

然后在宝塔面板、阿里云安全组等地方把这个端口放行,这样就能随时随地访问了。

还有一点,直接这样运行的,ssh会话关闭时程序也会关闭,于是可以使用nohup命令,让它在后台运行

nohup ./go-cqhttp

这样关闭SSH会话,go-cqhttp也能处于一直运行的状态。

关闭后台应用的方法:

[root@nyan]# ps -aux | grep go-cqhttp
root     13812  0.0  1.3 730020 50556 ?        Sl   Jul17   3:15 ./go-cqhttp
root     21397  0.0  0.0 112816   968 pts/0    S+   09:13   0:00 grep --color=auto go-cqhttp
[root@nyan]# kill 13812

使用Python完善功能

看标题应该直到,我是使用Python进行自定义开发的。

cqhttp是基于http协议的,也就是说所有的指令都通过http来进行传输。

这样,我使用了requests模块,来实现我的指令。

比如:

url = 'host:port/send_private_msg?user_id=1066168689&message=好欸'

requests.get(url)

这样我的机器人就给我发了一个好欸。

靠这种方法,我简单实现了一个根据群名片自动踢人。

用到了两个指令,一个是获取群成员列表,可以通过这个列表获取到群里每一个成员的群名片(cart)和qq号(user_id)对应的信息,第二个就是从群里踢人的命令,这个命令必须使用qq号进行操作。

于是,我就很顺利的完成了这个功能。


POST消息上报

cqhttp的POST上报采用json格式,包括收到消息、心跳等类型。

可以在cqhttp的配置文件里面这样写:

# 连接服务列表
servers:
  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
  #- http: # http 通信
  #- ws:   # 正向 Websocket
  #- ws-reverse: # 反向 Websocket
  #- pprof: #性能分析服务器
  # HTTP 通信设置
  - http:
      # 服务端监听地址
      host: 0.0.0.0
      # 服务端监听端口
      port: 端口号
      # 反向HTTP超时时间, 单位秒
      # 最小值为5,小于5将会忽略本项设置
      timeout: 10
      middlewares:
        <<: *default # 引用默认中间件
      # 反向HTTP POST地址列表
      post:
      - url: 'https://你机器人会上报的地址' # 地址
      #  secret: ''           # 密钥
      #- url: 127.0.0.1:2223 # 地址
      #  secret: ''          # 密钥


我打印了一下Django收到的请求的body,得到了以下结果:

b'{"font":0,"message":"\xe5\x96\xb5","message_id":-1338703603,"message_type":"private","post_type":"message","raw_message":"\xe5\x96\xb5","self_id":2473457354,"sender":{"age":0,"nickname":"\xe8\xb5\xb5\xe8\x8b\xa6\xe7\x93\x9c","sex":"unknown","user_id":1066168689},"sub_type":"friend","target_id":2473457354,"time":1631032386,"user_id":1066168689}\n'


可以看到是一段二进制文本。

可以先将其使用utf-8解码,然后去掉尾部的换行符,得到json文本。

再使用json库的loads方法转换成dict就可以直接使用了

{
    "font":0,
    "message":"喵",
    "message_id":-1338703603,
    "message_type":"private",
    "post_type":"message",
    "raw_message":"喵",
    "self_id":2473457354,
    "sender":{
        "age":0,
        "nickname":"赵苦瓜",
        "sex":"unknown",
        "user_id":1066168689
    },
    "sub_type":"friend",
    "target_id":2473457354,
    "time":1631032386,
    "user_id":1066168689
}


详细开发进行中。。。

本文作者:赵苦瓜      文章标题: 使用go-cqhttp和Python的QQ机器人
本文地址:https://blog.jixiaob.cn/?post=62
版权声明:若无注明,本文皆为“赵苦瓜のBlog~”原创,转载请保留文章出处。

返回顶部    首页    后花园  
版权所有:赵苦瓜のBlog~    站长: 赵苦瓜    程序:emlog   鲁ICP备20030743号-1   鲁公网安备37048102006726 萌ICP备20222268号    sitemap