基于go-cqhttp实现QQ机器人
发布日期: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()

信息处理

本机器人采用简单的基于文本文件的数据存储方式进行信息处理,主要包括以下功能模块:

  • 信息分类判断(群聊/私聊)
  • 群号/QQ号提取
  • 消息内容提取
  • 基本对话处理(如帮助指令、发送表情 packs 等)
  • 自定义处理逻辑可通过配置文件或代码扩展,但在本项目中前者方式被采用。

    核心功能实现

  • 截取有效信息:
  • def request_to_json(msg):  for i in range(len(msg)):    if msg[i] == "{" and msg[-1] == "}":      return json.loads(msg[i:])  return None
    1. 消息存储:
    2. def add_message(msg):  fp = open("messages.txt", "a", encoding='utf-8')  fp.write(f"{msg}\n")  fp.close()
      1. 特殊指令处理:
      2. 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

        异常处理与优化

      3. 错误处理机制:
      4. def error_handling(e):  print(f"错误发生:{str(e)}")  # 进行默认回复或其他处理  # 如随机生成回复内容并发送
        1. performance optimization:
          • 使用线程池(ThreadPoolExecutor)增加并发处理能力
          • 设置请求超时
          • 做好资源释放(如网络连接、文件资源等)

          项目展望

          RabbitBot 目前已实现基础功能,包括信息接收、存储与发送、支持文本、图片、表情包等类型。项目背景可以部署在普通服务器上进行24小时运行。本项目的设计以功能实现为主,存在一定的完善空间,包括:

          • 智能对话能力的提升
          • 多语言支持
          • 更复杂的数据存储方式
          • 优化性能表现
          • 增加更多的功能模块(如音乐播放、游戏支持等)

          如对本项目感兴趣,欢迎加入讨论群或联系作者,进行技术交流和联合优化。

    上一篇:VNCTF2021 MISC wp
    下一篇:CTFshow DJBCTF MISC(大吉杯) WP

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年04月13日 17时54分11秒