欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python如何在个人QQ后端部署图灵机器人

程序员文章站 2022-06-04 09:52:46
...

因为腾讯官方加强了各方面的检查,目前许多QQAPI接口库都已经不能用了,但最近想写一个QQ机器人,查找了很多资料,却不得要领。今天终于找到了一个神奇的插件–酷Q,它可以将qq信息转成http形式。发送,接收信息的时候,只需要使用http请求,即可和server进行交互,非常方便,也非常适用python。当然,插件运行基于酷Q,需要用酷Q加载插件才能正常使用。

要实现用python发送/接收消息,除了要用requests发送http请求之外,还要用flask在本地搭建一个flask服务端,告知插件flask服务器的地址和端口,这样所有的qq消息都会自动传递给flask,我们可以将接收的消息转发给图灵机器人,再将返回的信息回馈给用户,这样就在后端部署了一个机器人。

一. 酷Q的使用

1. 准备工作

  1. 酷Q下载安装地址:酷Q社区
  2. 插件下载安装地址:Github,到github官网下载cpk文件,下载完成后放到解压后的酷Q文件夹根目录下的app文件夹中,完成之后应该是这样的:python如何在个人QQ后端部署图灵机器人然后打开酷Q根目录下的CQA.exe文件,登陆要做机器人的QQ号,建议使用小号,防止被封。

登陆成功后右键点击酷Q,打开应用-应用管理,进入如下页面:python如何在个人QQ后端部署图灵机器人选择CQHTTP,点击启用:python如何在个人QQ后端部署图灵机器人在之后弹出来的窗口中一路选择”是“,之后出现一个命令行窗口:python如何在个人QQ后端部署图灵机器人表示正在监听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插件文档

可以先进行以下简单配置:python如何在个人QQ后端部署图灵机器人

3. 使用酷Q 发送消息

首先需要查看插件的API文档:API描述-列表
我们来看看如何发送消息:python如何在个人QQ后端部署图灵机器人我们可以用一个字典对象来储存参数信息,然后用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成功发送了消息:python如何在个人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)#在配置文件中定义的端口号

运行之后,我们给这个机器人发送消息:python如何在个人QQ后端部署图灵机器人接着本地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中,首先我们新建一个项目,项目目录如下:python如何在个人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()方法,它传入useridmsg两个参数,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如何在个人QQ后端部署图灵机器人表示机器人成功开始工作!

如果你觉得文章对你有帮助,可以关注微信公众号“机器图腾”,里面有免费的网络爬虫教程以及python学习资源,每周不定时更新一些有趣的python小项目。有趣的事,python从不缺席。