碎碎念:
最近想搭个机器人给自己发消息提醒的,本来想做微信的,结果尝试了好久,从itchat、wxpy到PyOfficeRobot(itchat和wxpy都是基于网页版微信进行登录的,现在已经被微信限制了,我说怎么按照别人的教程总是出问题呢,然后找到PyOfficeRobot就几行代码就能实现自动发送消息,但是问题总比办法多,PyOfficeRobot的微信机器人不支持mac的,原因:为什么 python-office自动化办公 不支持 mac 和 linux 系统?,哭泣!)算了,还是做qq的机器人吧
在做qq机器人的时候也遇到了很多问题,但是总算小阶段的成功了。这次做这个机器人完全是小白,全靠的搜索网上的教程一步步进行的,而且大部分教程都是基于windows的,mac的几乎找不到,其中也遇到了很多问题,以下纪录一下遇到的问题,希望能帮助到有需要的人,也算是复盘一下。
我是本地搭建,Mac的m1芯片。
1.下载go-cqhttp
(Releases · Mrs4s/go-cqhttp · GitHub)
在GitHub上下载对应的版本并解压,我下载的是 go-cqhttp_darwin_amd64.tar.gz(Intel和m1版可用)
2.运行go-cqhttp
2.1 生成配置
进入到解压后的go-cqhttp文件夹下,运行./go-cqhttp,选择通信方式,选0即可。(我已经生成了,就不会再生成了,截取的是别人教程里的图片)
运行后会生成config.yml文件。
2.2 修改配置
打开config.yml,有几处地方需要修改:
1.填写你的QQ号和密码,我这边直接填的密码,好像是扫码登录有问题
2.取消注释,其为用来监听消息的路由,后面我们使用flask,开启该路由,来使得qq的消息可以传入后台,使我们可以处理
3.填写签名服务器(好像现在的都需要签名服务器,不然会报登录45的错误)
可以自己搭建也可以使用线上别人搭建的,建议自己搭建,别人搭建的存在潜在风险,也可能容易被封号,而且使用他人搭建的会别人是能知道你的帐号给谁发了消息,什么时候发了什么消息。注重隐私!还是自己搭建吧!
ps:一般的教程就到这边重新运行./go-cqhttp了就可以顺利登录监听了,然而,我遇到了问题:
登录失败,code:45,你的账号被限制登录, 请配置 SignServer 后重试
这边就是因为签名服务器没有部署,当sign-server填的是http://127.0.0.1:8080时我们需要在本地搭建签名服务器。
3.搭建qsign签名服务器
3.1 下载qsign
下载地址:
https://github.com/fuqiuluo/unidbg-fetch-qsign/releases/download/1.1.0/unidbg-fetch-qsign-1.1.0.zip
或 https://ghproxy.com/github.com/fuqiuluo/unidbg-fetch-qsign/releases/download/1.1.0/unidbg-fetch-qsign-1.1.0.zip
解压后放到你想放的位置即可,注意版本,暂不支持最新版qsign服务(可用v1.1.0)
3.2 下载txlib
下载地址:
https://ghproxy.com/raw.githubusercontent.com/MoYoez/moyoez.github.io/main/txlib.zip
下载后,解压放到qsign的文件里
3.3 启动程序
1.看看go-cqhttp的文件夹下有没有device.json,没有的话重新运行一下./go-cqhttp
2.打开device.json,找到android_id对应的值
3.运行,在qsign文件下,进入终端,输入:
./bin/unidbg-fetch-qsign --host=127.0.0.1 --port=8080 --count=1 --library=txlib/8.9.63 --android_id=xxx
其中:
xxx对应device.json的android_id的值,每个的id是不一样的;
txlib/8.9.63是txlib下的对应的版本,按照之前的链接下载就有8.9.63,可以对应版本调节;
count表示最大连接数。
不出意外的话就能够运行起qsin服务了。
注意:1.需要提前处理好java环境。2.对应好版本,否则可能会有问题。3.“/”和“\”在mac和windows上的区别,不要写反了
附上windows和Linux的搭建教程,均为搜索到的教程,未亲验。
1.windows
步骤与前面的相同,运行语句时有些不同
cmd 到qsign目录下
.\bin\unidbg-fetch-qsign.bat --host=127.0.0.1 --port=8080 --count=1 --library=txlib\8.9.63 --android_id=xxx
2.linux
安装和启动docker
# 下载docker安装脚本,一键安装
curl -fsSL https://get.docker.com -o get-docker.sh
bash get-docker.sh
# 启动docker服务
systemctl start docker
# 查看docker状态,是否正常启动
service docker status
实例化qsign的docker镜像
# 开放防火墙端口(用docker默认的8080)
firewall-cmd --permanent --add-port=8080/tcp
# 重载防火墙
firewall-cmd --reload
# 运行docker
docker run -d --restart=always --name qsign -p 8080:8080 -e ANDROID_ID=d9b3a88f3cd1f951 xzhouqd/qsign:8.9.63
# 检查运行是否成功,访问主机端口没有报错就行
curl localhost:8080
之前因为搜索不到mac的相关教程,我也有尝试使用docker的方式部署,但是不知道为什么一直启动失败然后一直在重启服务,由于本地打开docker比较占内存,我一直不太想使用这个方式部署qsign服务,后边也没有去看问题解决问题。
4.重新运行go-cqhttp
运行./go-cqhttp,这时候不出意外的话,go-cqhttp就能顺利运行起来了,注意启动qsign服务的窗口不要关闭。
5.接收发送的消息/主动发消息
这边使用的是python,下边的代码是接收消息
from flask import Flask, request
import api
app = Flask(__name__)
@app.route('/', methods=["POST"])
def post_data():
'下面的request.get_json().get......是用来获取关键字的值用的,关键字参考上面代码段的数据格式'
if request.get_json().get('message_type')=='private':# 如果是私聊信息
uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
message = request.get_json().get('raw_message') # 获取原始信息
print("个人" + uid + "发送信息:" + message)
if request.get_json().get('message_type')=='group':# 如果是群聊信息
gid = request.get_json().get('group_id') # 获取群号
uid = request.get_json().get('sender').get('user_id') # 获取信息发送者的 QQ号码
message = request.get_json().get('raw_message') # 获取原始信息
print("群聊" + gid + "的" + uid + "发送信息:" + message)
return 'OK'
if __name__ == '__main__':
app.run(debug=True, host='127.0.0.1', port=5701)# 此处的 host和 port对应上面 yml文件的设置
到目前为止,接管消息的机器人就小阶段的完成了,一路遇到的坑实在是太太多了,基本走一步就遇到好些问题,中途都想放弃不弄了,还好最后也基本能对接上了,当克服了种种问题之后弄出来后还是很开心的。后续可能也会有新改动导致其他的问题,目前至2023.09.27按照以上步骤操作还是能做出来的。