QQBot Cqhttp服务器配置
配这个一开始的时候还有点蒙,在这里记录一下。
看到QQ指令机器人,心血来潮打算自己也下个cqhttp配一配,然后就有了这篇博客。
QQ指令机器人的历史还是相当古老的。10年左右QQ推出了webQQ,基于http协议下的通信特别方便进行抓包篡改,于是就有了酷Q机器人这个小东西。
而cqhttp也是相当轻量级的,在一开始的时候mrds一行人只打算做一个路由器上可以跑的酷Q,现在已经发展成为了一个成熟的机器人。
下面来一点配置过程:
1、进入cqhttp仓库所在地址:
https://github.com/Mrs4s/go-cqhttp/releases/tag/v1.2.0
下载linux环境下对应的安装包进行安装。
2、安装完成后在根目录~/下新建一个文件夹,比如QQBot,直接运行go-cqhttp,这时会在文件夹下生成一些配置文件:
进入config.yml文件:
在这里修改好用户名。
可以看到这里还有签名服务器需要配置,我们接下来要解决。
3、再运行的时候一般会出现一些问题:
提示签名服务器不可用。
这个时候我们就要用到docker,docker的下载安装过程参考:这边这边
下面我们要进行签名服务器的配置
由于别人已经造好轮子了,可以直接用这一行命令进行run:
sudo docker run -d --restart=always --name qsign -p 7778:8080 hansaes/unidbg-fetch-qsign:latest
这样就可以啦!签名服务器跑起来了。
4、最后还要在原config.yml下更新关于服务器的配置:
一切配置正常的话就可以看到go-cqhttp正常启动:
5、新建QQBot网络转发程序
在一个文件夹下配置:
bot.py:
import re from receive import rev_msg from send_msg import send_msg import socket import requests import random import urllib.request, json while True: try: rev = rev_msg() print(rev) if rev == None: continue except: continue if rev["post_type"] == "message": if rev["message_type"] == "private": # 私聊 if '在吗' in rev['raw_message']: qq = rev['sender']['user_id'] # 获取消息发出者的qq号 send_msg({'msg_type': 'private', 'number': qq, 'msg': '我在'}) # 发送 if '不知道' in rev['raw_message']: qq = rev['sender']['user_id'] # 获取消息发出者的qq号 send_msg({'msg_type': 'private', 'number': qq, 'msg': '我也不知道'}) # 发送 if '醒了' in rev['raw_message']: qq = rev['sender']['user_id'] # 获取消息发出者的qq号 send_msg({'msg_type': 'private', 'number': qq, 'msg': '自动回复!!!'}) # 发送 elif rev["message_type"] == "group": # 群聊 group = rev['group_id'] if '在干嘛' in rev['raw_message']: qq = rev['sender']['user_id'] send_msg({'msg_type': 'group', 'number': group, 'msg': '在干嘛'}) if '逆天' in rev['raw_message']: qq = rev['sender']['user_id'] send_msg({'msg_type': 'group', 'number': group, 'msg': '逆天'}) if '在吗' in rev['raw_message']: qq = rev['sender']['user_id'] send_msg({'msg_type': 'group', 'number': group, 'msg': '你好'}) else: continue else: # rev["post_type"]=="meta_event": continue
receive.py:
import socket import json ListenSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ListenSocket.bind(('127.0.0.1', 5701)) ListenSocket.listen(100) HttpResponseHeader = '''HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n\r\n ''' def request_to_json(msg): for i in range(len(msg)): if msg[i] == "{" and msg[-1] == "\n": return json.loads(msg[i:]) return None # 需要循环执行,返回值为json格式 def rev_msg(): # json or None Client, Address = ListenSocket.accept() Request = Client.recv(1024).decode(encoding='utf-8') rev_json = request_to_json(Request) Client.sendall((HttpResponseHeader).encode(encoding='utf-8')) Client.close() return rev_json
send_msg.py:
import socket port = 5700 def send_msg(resp_dict): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ip = '127.0.0.1' client.connect((ip, port)) msg_type = resp_dict['msg_type'] # 回复类型(群聊/私聊) number = resp_dict['number'] # 回复账号(群号/好友号) msg = resp_dict['msg'] # 要回复的消息 # 将字符中的特殊字符进行url编码 msg = msg.replace(" ", "%20") msg = msg.replace("\n", "%0a") if msg_type == 'group': payload = "GET /send_group_msg?group_id=" + str( number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + f":{port}\r\nConnection: close\r\n\r\n" elif msg_type == 'private': payload = "GET /send_private_msg?user_id=" + str( number) + "&message=" + msg + " HTTP/1.1\r\nHost:" + ip + f":{port}\r\nConnection: close\r\n\r\n" print("发送" + payload) client.send(payload.encode("utf-8")) client.close() return 0
可以跑起来,但是不是QQBot回车指令的效果,QQBot之后再配。