
基于go-cqhttp实现QQ机器人
信息分类判断(群聊/私聊) 群号/QQ号提取 消息内容提取 基本对话处理(如帮助指令、发送表情 packs 等) 截取有效信息:
发布日期:2021-05-10 03:43:43
浏览次数:29
分类:精选文章
本文共 2854 字,大约阅读时间需要 9 分钟。
前言
本篇文章记录作者在编写基于go-cqhttp框架的QQ机器人RabbitBot时所遇到的问题及核心功能的实现方法。RabbitBot采用Python编写,主要用于个人学习,因此不会开放完整代码,但核心功能的代码片段将进行分享和分析。主要基于go-cqhttp项目,结合HTTP API和反向HTTP POST接口对 QQ信息的读取和发送进行控制。
初期配置
go-cqhttp的安装和配置步骤相对标准化,但以下是一些关键配置说明:
配置文件示例:
{ "uin": 1234567890, // 机器人QQ号 "password": "" , //_PASSWORD_ "enable_db": false, // 是否使用数据库(本文不开启) "http_config": { "enabled": true, "host": "0.0.0.0", "port": 5700, "timeout": 0, "post_urls": { "127.0.0.1:5710": "secret" } }, "ws_config": { "enabled": false, "host": "0.0.0.0", "port": 6700 }}
注意:上述配置文件中,由于涉及个人隐私信息,相关细节已被替换,实际使用请根据实际需求配置。
信息发送与接收
客户端与服务器端的通信采用标准的HTTP协议,发送端口默认为5700,接收端口设置为5710。以下为常用API及其功能说明:
- 发送私聊消息:
/send_private_msg
- 发送群聊消息:
/send_group_msg
服务器端接收信息逻辑如下:
def rev_msg(): conn, addr = ListenSocket.accept() request = conn.recv(1024).decode('utf-8') rev_json = request_to_json(request) conn.sendall((HTTP_RESPONSE_HEADER).encode('utf-8')) conn.close() return rev_json
信息接收后会进行JSON解析处理,并返回相应的HTTP响应。
接收到的信息格式示例:
群聊信息:
{ "group_id": 123456789, "user_id": 123456789, "message": "信息内容", "message_id": 12345678, "message_type": "group", //...其他字段}
私聊信息:
{ "user_id": 123456789, "message": "[CQ:face,id=107]", //...其他字段}
信息发送逻辑如下:
def client_to_conn(): label = get_message_type() number = get_number() msg = get_raw_message() # 根据信息类型构造不同的URL请求 if label == 'group': payload = f"GET /send_group_msg?group_id={number}&message={msg} HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n" elif label == 'private': payload = f"GET /send_private_msg?user_id={number}&message=... HTTP/1.1\r\nHost: 127.0.0.1:5700\r\nConnection: close\r\n\r\n" client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 5700)) client.send(payload.encode('utf-8')) client.close()
信息处理
本机器人采用简单的基于文本文件的数据存储方式进行信息处理,主要包括以下功能模块:
自定义处理逻辑可通过配置文件或代码扩展,但在本项目中前者方式被采用。
核心功能实现
def request_to_json(msg): for i in range(len(msg)): if msg[i] == "{" and msg[-1] == "}": return json.loads(msg[i:]) return None
- 消息存储:
- 特殊指令处理:
- 错误处理机制:
- performance optimization:
- 使用线程池(
ThreadPoolExecutor
)增加并发处理能力 - 设置请求超时
- 做好资源释放(如网络连接、文件资源等)
- 智能对话能力的提升
- 多语言支持
- 更复杂的数据存储方式
- 优化性能表现
- 增加更多的功能模块(如音乐播放、游戏支持等)
def add_message(msg): fp = open("messages.txt", "a", encoding='utf-8') fp.write(f"{msg}\n") fp.close()
def handle_special_commands(msg): if msg.startswith('[CQ:at,qq='): target_qq = msg.split('qq=')[1].split(']')[0] # 根据目标QQ号执行相应操作(如回复、提醒等) elif msg.startswith('[CQ:image,file='): image_url = msg.split('file=')[1].split(']')[0] # 下载并处理图片文件 pass
异常处理与优化
def error_handling(e): print(f"错误发生:{str(e)}") # 进行默认回复或其他处理 # 如随机生成回复内容并发送
项目展望
RabbitBot 目前已实现基础功能,包括信息接收、存储与发送、支持文本、图片、表情包等类型。项目背景可以部署在普通服务器上进行24小时运行。本项目的设计以功能实现为主,存在一定的完善空间,包括:
如对本项目感兴趣,欢迎加入讨论群或联系作者,进行技术交流和联合优化。
发表评论
最新留言
很好
[***.229.124.182]2025年04月13日 17时54分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
有道云笔记 同步到我的博客园
2019-03-06
李笑来必读书籍整理
2019-03-06
Hadoop(十六)之使用Combiner优化MapReduce
2019-03-06
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
2019-03-06
CoreCLR源码探索(八) JIT的工作原理(详解篇)
2019-03-06
andriod 开发错误记录
2019-03-07
C语言编译错误列表
2019-03-07
看明白这两种情况,才敢说自己懂跨链! | 喵懂区块链24期
2019-03-07
《web安全入门》(四)前端开发基础Javascript
2019-03-07
python中列表 元组 字典 集合的区别
2019-03-07
Android DEX加固方案与原理
2019-03-07
iOS_Runtime3_动态添加方法
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
Problem G. The Stones Game【取石子博弈 & 思维】
2019-03-07
Java多线程
2019-03-07
openssl服务器证书操作
2019-03-07
我用wxPython搭建GUI量化系统之最小架构的运行
2019-03-07
我用wxPython搭建GUI量化系统之多只股票走势对比界面
2019-03-07