搭建你自己的QQ机器人

25 天前(已编辑)
/ , ,
40

搭建你自己的QQ机器人

前言

最近发现NapCatQQ的WebUI已经完善了,相当适合新手入门,因此写下这篇文章。

本文只涉及基础的使用方法,可能缺少一些进阶功能。但同时也需要了解以下的基础知识:命令行、HTTP协议、Docker、Python,并非完全零基础。(如果只想使用Webhook进行通知或者使用现有的NoneBot插件,不需要进行Python编程)

所使用到工具有NapCatQQNoneBot,前者运行QQ并接入OneBot11等协议,后者是基于Python调用协议实现的框架,遇到问题时可以查看官方文档。(如果只想使用Webhook进行通知,搭建完NapCatQQ即可。)

准备工作

  1. 一台服务器,不限内网和外网。
  2. 一个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有两种使用方法:

  1. 在请求头中添加Authorization: [Token]
curl -X GET 'http://[IP]:3000/get_friend_list' -H 'Authorization: [Token]'
  1. 在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

未完待续,可以先参考文档

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...