搭建你自己的QQ机器人
前言
最近发现NapCatQQ的WebUI已经完善了,相当适合新手入门,因此写下这篇文章。
本文只涉及基础的使用方法,可能缺少一些进阶功能。但同时也需要了解以下的基础知识:命令行、HTTP协议、Docker、Python,并非完全零基础。(如果只想使用Webhook进行通知或者使用现有的NoneBot插件,不需要进行Python编程)
所使用到工具有NapCatQQ和NoneBot,前者运行QQ并接入OneBot11等协议,后者是基于Python调用协议实现的框架,遇到问题时可以查看官方文档。(如果只想使用Webhook进行通知,搭建完NapCatQQ即可。)
准备工作
- 一台服务器,不限内网和外网。
- 一个QQ号作为QQ机器人,不建议使用主号。
QQ能够检测到是否使用了插件,你的账号可能出现下列问题:强制下线、限制登陆、冻结。
请各位根据自己的实际情况自行评估决定是否继续尝试使用,作者不对参考本文搭建机器人的任何后果负责。
NapCatQQ
安装
NapCatQQ的安装方法有很多,但既然作为一个服务,我还是推荐使用Docker安装Shell版本的: https://napneko.github.io/guide/boot/Shell#napcat-docker-linux容器化部署
Docker容器中自带NTQQ本体,不必额外安装对应版本的QQ。
docker run -d \
-v /data/napcat/QQdata:/app/.config/QQ \ # QQ数据目录
-v /data/napcat/logs:/app/napcat/logs \ # 日志目录
-v /data/napcat/config:/app/napcat/config \ # 配置目录
-v /etc/localtime:/etc/localtime:ro \
--net=host \ # 建议使用host网络,以便连接后续的NoneBot
--name napcat \
--restart=always \
mlikiowa/napcat-docker:latest
此时访问 http://[IP]:6099/webui 即可看到NTQQ的Web页面,可以进行登录和设置,登录密码可以查看日志文件(默认为:napcat
),建议登录后修改。
或者也可docker logs napcat
查看日志、扫码登录QQ。
扫码登录建议勾选后续无需手机验证。
启用http协议
在WebUI中找到网络配置->新建->HTTP服务器
,名称、Host、端口随意,消息格式建议选择Array
,实际测试下来是兼容String
的,并且可以发送文本图片混合消息,并且强烈建议填写Token防止恶意请求。
启用后可以在接口调试->HTTP
中或者其他你用着顺手的API测试工具进行测试。API可参考: https://napcat.apifox.cn/
Token有两种使用方法:
- 在请求头中添加
Authorization: [Token]
。
curl -X GET 'http://[IP]:3000/get_friend_list' -H 'Authorization: [Token]'
- 在URL中添加
?access_token=[Token]
。
curl -X GET 'http://[IP]:3000/get_friend_list?access_token=[Token]'
使用Webhook进行通知
这里最重要的的接口自然是发送私聊消息和发送群消息啦,可以在接口调试->HTTP
中找到对应的API,里面也有构造消息的功能,挺简单的。
这里给一个发送私聊消息的例子:
curl -X POST 'http://[IP]:3000/send_private_msg' -H 'Content-Type: application/json' -H 'Authorization: [Token]' -d '{
"user_id": "[TargetQQ]",
"message": [
{
"type": "text",
"data": {
"text": "Hello World!"
}
},
{
"type": "face",
"data": {
"id": "63"
}
},
{
"type": "image",
"data": {
"file": "https://napneko.github.io/assets/newlogo.png"
}
}
]
}'

有些应用会使用shoutrrr作为Webhook的实现,可以参考下述的配置:
generic://[IP]:3000/send_private_msg?access_token=[Token]&template=json&titleKey=user_id&messageKey=message&@Content-Type=application/json&$user_id=[TargetQQ]
有些应用可能本身就支持了OneBot11协议,此时填入http://[IP]:3000
、Token和目标QQ号即可。
nginx反代
如果你有域名的话,可以参考下述NapCatQQ的nginx配置示例:
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name qq.example.cn;
access_log /var/log/nginx/access.qq.log;
error_log /var/log/nginx/error.qq.log;
location /webui {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /api {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /files {
proxy_pass http://127.0.0.1:6099$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($request_method = POST) {
access_log /var/log/nginx/post.qq.log postdata;
}
proxy_pass http://127.0.0.1:3000$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
NoneBot
未完待续,可以先参考文档