Skip to main content

使用NapCatQQ搭建QQ机器人

时间:2024年6月11日

原生


首先,你需要拥有一个公网IP,可以在腾讯云或者阿里云购买一个win服务器或者linux服务器,我用的是在腾讯云过年的时候促销的2h2g的ubuntu

接着,您需要进入NapCatQQ官网简单了解一下https://napneko.github.io/zh-CN/guide/getting-started

安装NapCatQQ

全文使用Linux服务器搭建

首先下载并安装NapCatQQ

sudo apt install libgbm1 libasound2
wget https://dldir1.qq.com/qqfile/qq/QQNT/8b4fdf81/linuxqq_3.2.7-23361_amd64.deb #以当前最新版为准
sudo apt install ./linuxqq_3.2.7-23361_amd64.deb -y
curl -L -o NapCat.linux.x64.zip https://github.com/NapNeko/NapCatQQ/releases/download/v1.5.4/NapCat.linux.x64.zip
#以官网最新版为准,速度慢直接github下载后上传至服务器
unzip NapCat.linux.x64.zip -d ./NapCat
cd NapCat/NapCat.linux.x64/

启动NatCatQQ

首次登录该QQ

NapCat.linux.x64目录下能看到napcat.sh文件,添加权限并启动

chmod u+x ./napcat.sh
./napcat.sh

此时让扫码登录,用手机QQ登录上提前准备好的QQ小号,上号之后扫描二维码,推荐扫描保存到本地的二维码

后续启动该QQ

使用-q重新登录即可无需扫码,例如napcat.sh -q 1234567

配置HTTP与WS

访问你的http://IP:6099/webui/login.html,token密码可在./config/webui.json下找到

cat ./config/webui.json

进入后到以下界面

image-20240611174716938

其中您可以使用ws服务或http服务进行监听,这里以HTTP为例,需打开服务与事件上报,同时设置Access token

Access token指的是在使用api时需要带上该token才能正常执行,能够防止其他人利用HTTP服务来操控机器人

事件上报是将事件上报POST传入指定IP,在flask监听的时候能够接受消息

image-20240611182137856

如果没有修改成功,可在config/onebot11_QQ号.json中进行修改

API List

NapCatQQ 实现了 OneBot 11 以及 go-cqhttp 的大部分 API,可以直接点击查看API,详细可查看https://napneko.github.io/zh-CN/develop/api

测试消息发送

假设小号与大号创建了一个群聊,这里测试的是群聊中是否出现指定字符串,出现则发送一条消息,以“肘子”和“hello world”为例

首先确保pip已经安装了flask和requests

pip install flask requests

接着编写flask脚本,监听上面上报到的位置

#main.py
from flask import Flask, request
import requests

app = Flask(__name__)

# NapCatQQ API的基础URL
base_url = "http://服务器IP:HTTP监听端口"

# 发送群聊消息的函数
def send_group_message(group_id, message):
url = f"{base_url}/send_group_msg"
params = {
"group_id": group_id,
"message": message,
"access_token":"你的token值"
}
response = requests.get(url, params=params)

if response.status_code == 200:
print("Message sent successfully")
else:
print("Failed to send message")
print(response.status_code, response.text)

@app.route('/', methods=['POST'])
def receive_event():
指定群聊 = 1234567
data = request.json
print("Received event:", data)

# 检查是否是群消息事件并且是目标群消息
if data['post_type'] == 'message' and data['message_type'] == 'group' and data['group_id'] == 指定群聊:
# 提取消息内容并确保是字符串
message_objects = data['message']
message = ''.join([m['data']['text'] for m in message_objects if m['type'] == 'text'])

print(f"Processed message: {message}")

# 检查消息内容是否包含“肘子”
if '肘子' in message:
send_group_message(指定群聊, "hello world")

return "OK", 200

if __name__ == '__main__':
app.run(host='0.0.0.0', port=7777)

image-20240611184032370

image-20240611183956068