python如何在个人QQ后端部署图灵机器人
因为腾讯官方加强了各方面的检查,目前许多QQAPI接口库都已经不能用了,但最近想写一个QQ机器人,查找了很多资料,却不得要领。今天终于找到了一个神奇的插件–酷Q,它可以将qq信息转成http形式。发送,接收信息的时候,只需要使用http请求,即可和server进行交互,非常方便,也非常适用python。当然,插件运行基于酷Q,需要用酷Q加载插件才能正常使用。
要实现用python发送/接收消息,除了要用requests发送http请求之外,还要用flask在本地搭建一个flask服务端,告知插件flask服务器的地址和端口,这样所有的qq消息都会自动传递给flask,我们可以将接收的消息转发给图灵机器人,再将返回的信息回馈给用户,这样就在后端部署了一个机器人。
一. 酷Q的使用
1. 准备工作
- 酷Q下载安装地址:酷Q社区。
- 插件下载安装地址:Github,到github官网下载cpk文件,下载完成后放到解压后的酷Q文件夹根目录下的app文件夹中,完成之后应该是这样的:然后打开酷Q根目录下的CQA.exe文件,登陆要做机器人的QQ号,建议使用小号,防止被封。
登陆成功后右键点击酷Q,打开应用-应用管理,进入如下页面:选择CQHTTP,点击启用:在之后弹出来的窗口中一路选择”是“,之后出现一个命令行窗口:表示正在监听5700端口。
2. 配置酷Q httpAPI插件
首次运行酷Q会生成一个配置文件,配置文件在酷Q Air\data\app\io.github.richardchien.coolqhttpapi\config 文件夹下,是一个以QQ名称命名的json文件。
在这里我们只需要关心以下配置:
port : 酷Q server监听的端口,可自定义。
use_http:务必是true,除非你使用websocket。
post_url:flask服务端接收消息的接口,可自定义。
post_message_format:酷Q向flask发送消息的格式。
其他配置项可以参考配置文档coolQ HTTP插件文档。
可以先进行以下简单配置:
3. 使用酷Q 发送消息
首先需要查看插件的API文档:API描述-列表。
我们来看看如何发送消息:我们可以用一个字典对象来储存参数信息,然后用requests库来发送请求,如果你还不了解requests库,或者未安装requests,可以参考我的另一篇文章python网络爬虫教程(四):强大便捷的请求库requests详解与编程实战,接下来就用python构造一个HTTP请求,示例代码如下:
import requests
data = {
'user_id':这里改为要目标QQ号,
'message':'Hello word!',
}
url = 'http://127.0.0.1:5700/send_private_msg'
r = requests.post(url,data=data)
print(r.text)
运行之后,我们可以向目标QQ成功发送了消息:
4. 使用酷Q 接收消息
接收消息需要用flask在本地构建一个服务器,如果你没有安装flask,可以在命令行中用pip下载安装:
pip install flask
示例代码如下:
from flask import Flask,request
from json import loads
bot_server = Flask(__name__)#构建一个flask
@bot_server.route('/api/message',methods=['POST'])#在配置文件中定义的路径
def server():
'''接收消息处理函数'''
data = request.get_data().decode('utf-8')
data = loads(data)
print(data)
if __name__ == '__main__':
bot_server.run(port=8088)#在配置文件中定义的端口号
运行之后,我们给这个机器人发送消息:接着本地flask接收到如下数据:
{'font': 8563960, 'message': [{'data': {'text': '你好'}, 'type': 'text'}], 'message_id': 27, 'message_type': 'private', 'post_type': 'message', 'raw_message': '你好', 'self_id': self_id, 'sender': {'age': 120, 'nickname': 'friend', 'sex': 'male', 'user_id': userid}, 'sub_type': 'friend', 'time': 1590578188, 'user_id': userid}
实际上,控制台输出的结果是一个字典类型,好处就是方便我们后续提取信息。
二. 图灵机器人的使用
由于本节内容过长,我将本节内容放在了我的另一篇文章中,有需要可以直接访问:python轻松实现与图灵机器人的人机交互。如果你了解本节内容,可以直接跳过。
三. 将机器人部署于后端
在了解了如何使用机器人接口、如何用酷Q来为我们接收和发送QQ消息,我们就可以将机器人接入到个人QQ中,首先我们新建一个项目,项目目录如下:在robots.py文件中,我们定义了机器人的访问接口,它包含一个访问机器人接口的Robot对象,这样在后续需要调度机器人的时候将会非常方便,示例代码如下:
import requests
import json
class Robot():
def __init__(self):
'''先初始化请求URL和apikey'''
self.url = 'http://openapi.tuling123.com/openapi/api/v2'
self.apikey = '这里换成自己的apikey'
def send_msg(self, userid, msg):
'''向机器人发送消息,并返回结果'''
base_data = { #构造一个字典参数
"perception": {
"inputText": {
"text": msg
}
},
"userInfo": {
"apiKey": self.apikey,
"userId": userid
}
}
headers = { #构造一个请求头,其中定义了传输格式
'content-type': 'application/json'
}
data = json.dumps(base_data).encode('utf8')#将字典对象转化为JSON对象,再编码为uft-8
resp = requests.post(self.url, data=data)#发送请求
self.msg_analysis(resp)#解析结果
def msg_analysis(self, resp):
'''解析返回结果'''
resp_dic = resp.json()#将结果转化为字典类型,方便解析
if resp_dic['intent']['code'] == 10004:#如果返回成功状态码,才进行下列操作
self.result_type = resp_dic['results'][0]['resultType']
self.result_text = resp_dic['results'][0]['values']['text']#将解析的结果保存为对象属性
Robot包含一个send_msg()方法,它传入userid、msg两个参数,userid用来标记会话用户,维持会话信息;msg表示发送的消息,解析返回结果之后,将结果保存在result_text属性中。
因为使用酷Q发送消息非常简单,只需要构造请求、发送请求即可,所以我们可以用一个函数来完成消息的发送,在send_msg.py文件中,我们编写一个send_msg函数,代码如下:
import requests
def send_msg(user_id, msg):
data = {
'user_id': user_id,
'message':msg,
}
api_url = 'http://127.0.0.1:5700/send_private_msg'
r = requests.post(api_url,data=data)
print(r.text)
我们提供被发送者的QQ号码以及发送的内容组为两个参数,然后打印响应结果,方便我们后续调试。
实际上整个过程中最重要的就是消息的接收,因为只有完整地接收到消息,一个会话才能开始,而接收信息就是我们会话开始的标识,所以我们在目录下创建一个启动文件app_main.py,当我们启动这个文件时,表示酷Q开始监听事件端口,但是在那之前,我们需要先导入已经写好的另外两个文件:
from send_msg import send_msg
from robots import Robot
除此之外还需要先将Robot()对象实例化:
robot = Robot()
然后就可以开始监听事件窗口了,完整代码如下:
from flask import Flask,request
from json import loads
from send_msg import send_msg
from robots import Robot
bot_server = Flask(__name__)
robot = Robot()#实例化机器人接口对象
@bot_server.route('/api/message',methods=['POST'])#在配置文件中定义的路径
def server():
data = request.get_data().decode('utf-8')#将utf-8编码解码为unicode
data = loads(data)#将str对象转化为字典对象
qq = data['sender']['user_id']#获得发送者qq号
msg = data['raw_message']#获得接收的消息
robot.send_msg(qq, msg)#将发送者qq、接收的消息转发给图灵机器人
send_msg(qq, robot.result_text)#将图灵机器人的回馈消息转发给发送者
if __name__ == '__main__':
bot_server.run(port=8088)#在配置文件中定义的端口号
运行以上代码后,我们试着给机器人发送消息:表示机器人成功开始工作!
如果你觉得文章对你有帮助,可以关注微信公众号“机器图腾”,里面有免费的网络爬虫教程以及python学习资源,每周不定时更新一些有趣的python小项目。有趣的事,python从不缺席。
上一篇: 香蕉芋头可以一起吃吗,绝对不能一起吃