搭建你自己的QQ机器人

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。

Copy
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]。

Copy
curl -X GET 'http://[IP]:3000/get_friend_list' -H 'Authorization: [Token]'

在 URL 中添加?access_token=[Token]。

Copy
curl -X GET 'http://[IP]:3000/get_friend_list?access_token=[Token]'

使用 Webhook 进行通知

这里最重要的的接口自然是发送私聊消息和发送群消息啦，可以在接口调试->HTTP中找到对应的 API，里面也有构造消息的功能，挺简单的。
这里给一个发送私聊消息的例子：

Copy
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 的实现，可以参考下述的配置：

Copy
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 配置示例：

Copy
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

文档 已经很完善了，这里不做赘述吧。