使用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
进入后到以下界面
其中您可以使用ws服务或http服务进行监听,这里以HTTP为例,需打开服务与事件上报,同时设置Access token
Access token指的是在使用api时需要带上该token才能正常执行,能够防止其他人利用HTTP服务来操控机器人
事件上报是将事件上报POST传入指定IP,在flask监听的时候能够接受消息
如果没有修改成功,可在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)