此文由 Mix Space 同步更新至 xLog
为获得最佳浏览体验,建议访问原始链接
https://www.do1e.cn/posts/code/building-your-own-qq-bot
前言#
最近发现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#
未完待续,可以先参考文档