使用Python的Tornado框架实现一个简单的WebQQ机器人

下面我会详细讲解使用Python的Tornado框架实现一个简单的WebQQ机器人的完整攻略。

1. 准备工作

首先,你需要申请QQ机器人账号、安装Python语言环境及Tornado框架。

2. 获取QQ机器人的cookie和ptwebqq

在Python代码中通过模拟浏览器登录QQ账号,然后从登录后的cookie和ptwebqq中获取QQ机器人的cookie和ptwebqq。获取cookie和ptwebqq的代码如下所示。

import requests
from requests.utils import cookiejar_from_dict
from urllib.parse import urlencode

# 模拟登录QQ账号并获取Cookie和ptwebqq
def login(qq, password):
    url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin'
    params = {
        'appid': 1003903,
        's_url': 'https://im.qq.com',
        'f_url': 'loginerroralert',
        'low_login': 1,
        'hln_css': 'https://ui.ptlogin2.qq.com/style/26/qq_login.css',
        'hln_color': '000000',
        'no_verifyimg': 1,
        'mibao_css': 'https://ui.ptlogin2.qq.com/style/26/mb_save.css',
        'aid': 1003903,
        'u1': 'https://im.qq.com',
        'u2': 'https://im.qq.com/cgi-bin/readtemplate?t=login',
        'u3': 'https://web2.qq.com/loginproxy.html',
        'u4': 'https://ui.ptlogin2.qq.com/cgi-bin/login',
        'login_redirect': 1,
        'pt_locale': '2052',
    }
    cookies = requests.get(url + '?' + urlencode(params)).cookies
    params['pt_tea'] = 2
    params['low_login_hour'] = 360
    params['u'] = qq
    params['p'] = password
    params['pt_rsa'] = 1
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0',
        'Referer': 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?appid=1003903&s_url=https://im.qq.com&f_url=loginerroralert&pt_tea=2&low_login_hour=360&u1=https://im.qq.com&u2=https://im.qq.com/cgi-bin/readtemplate?t=login&u3=https://web2.qq.com/loginproxy.html&u4=https://ui.ptlogin2.qq.com/cgi-bin/login&login_redirect=1&pt_locale=2052',
    }
    response = requests.post(url, data=params, headers=headers, cookies=cookies, allow_redirects=False)
    cookies.update(response.cookies)
    ptwebqq = ''
    for key, value in cookies.items():
        if key == 'ptwebqq':
            ptwebqq = value
            break
    return {'cookie': cookiejar_from_dict(requests.utils.dict_from_cookiejar(response.history[0].cookies)), 'ptwebqq': ptwebqq[1:-1]}

3. 连接WebQQ服务

连接WebQQ服务需要使用前面获取到的cookie和ptwebqq。连接WebQQ服务的代码如下所示。

import requests
import json

# 连接WebQQ服务
def connect(cookie, ptwebqq):
    url = 'https://s.web2.qq.com/api/login/qrcode/qrcode'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0',
        'Referer': 'https://s.web2.qq.com/proxy.html?v=20210311001&callback=1&id=1',
        'Origin': 'https://s.web2.qq.com',
        'Host': 's.web2.qq.com',
    }
    cookies = requests.utils.dict_from_cookiejar(cookie)
    cookies['ptwebqq'] = ptwebqq
    response = requests.get(url, headers=headers, cookies=cookies)
    result = json.loads(response.text)
    if result['retcode'] != 0:
        print('Error:', result['errmsg'])
    else:
        print('登录成功!')

4. 实现WebQQ机器人

实现WebQQ机器人需要使用Tornado框架。机器人的核心代码如下所示。

import requests
import json
from tornado.web import RequestHandler, Application
from tornado.ioloop import IOLoop


class WebQQBot(RequestHandler):

    def get(self):
        url = 'https://s.web2.qq.com/api/get_self_info2'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0',
            'Referer': 'https://s.web2.qq.com/proxy.html?v=20210311001&callback=1&id=1',
            'Origin': 'https://s.web2.qq.com',
            'Host': 's.web2.qq.com',
        }
        cookies = requests.utils.dict_from_cookiejar(self.application.settings['cookie'])
        cookies['ptwebqq'] = self.application.settings['ptwebqq']
        response = requests.get(url, headers=headers, cookies=cookies)
        result = json.loads(response.text)
        if result['retcode'] != 0:
            self.write('获取个人信息失败:' + result['errmsg'])
        else:
            self.write('我的QQ号是:' + str(result['result']['uin']))

    def post(self):
        msg = self.get_argument('msg')
        url = 'https://s.web2.qq.com/api/get_friend_uin2'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:86.0) Gecko/20100101 Firefox/86.0',
            'Referer': 'https://s.web2.qq.com/proxy.html?v=20210311001&callback=1&id=1',
            'Origin': 'https://s.web2.qq.com',
            'Host': 's.web2.qq.com',
        }
        cookies = requests.utils.dict_from_cookiejar(self.application.settings['cookie'])
        cookies['ptwebqq'] = self.application.settings['ptwebqq']
        params = {
            'type': 1,
            'content': '["%s",["font",{"name":"宋体","size":10,"style":[0,0,0],"color":"000000"}]]' % msg
        }
        response = requests.get(url, headers=headers, cookies=cookies, params=params)
        result = json.loads(response.text)
        if result['retcode'] != 0:
            self.write('获取好友信息失败:' + result['errmsg'])
        else:
            qq = result['result']['uin']
            url = 'https://s.web2.qq.com/api/send_private_msg2'
            cookies = requests.utils.dict_from_cookiejar(self.application.settings['cookie'])
            cookies['ptwebqq'] = self.application.settings['ptwebqq']
            params = {
                'to': qq,
                'face': 0,
                'content': '["%s",["font",{"name":"宋体","size":10,"style":[0,0,0],"color":"000000"}]]' % msg
            }
            response = requests.post(url, headers=headers, cookies=cookies, json=params)
            result = json.loads(response.text)
            if result['retcode'] != 0:
                self.write('发送消息失败:' + result['errmsg'])
            else:
                self.write('回复消息成功!')


if __name__ == '__main__':
    qq = '' # 填写你的QQ号
    password = '' # 填写你的QQ密码
    login_result = login(qq, password)
    connect(login_result['cookie'], login_result['ptwebqq'])
    app = Application([
        ('/webqqbot', WebQQBot),
    ], cookie=login_result['cookie'], ptwebqq=login_result['ptwebqq'])
    app.listen(8000)
    print('WebQQ机器人已启动,监听端口:8000')
    IOLoop.current().start()

机器人的实现示例:

当机器人收到一条QQ消息时,它会将消息回复给QQ好友,并将消息内容在控制台上输出。

class WebQQBot(RequestHandler):

    def post(self):
        msg = self.get_argument('msg')
        # 此处省略获取好友QQ号的代码
        # ...
        url = 'https://s.web2.qq.com/api/send_private_msg2'
        cookies = requests.utils.dict_from_cookiejar(self.application.settings['cookie'])
        cookies['ptwebqq'] = self.application.settings['ptwebqq']
        params = {
            'to': str(qq),
            'face': 0,
            'content': '["%s",["font",{"name":"宋体","size":10,"style":[0,0,0],"color":"000000"}]]' % msg
        }
        response = requests.post(url, headers=headers, cookies=cookies, json=params)
        result = json.loads(response.text)
        if result['retcode'] != 0:
            print('发送消息失败:' + result['errmsg'])
        else:
            print('回复消息成功:' + msg)

5. 启动WebQQ机器人

运行机器人的主文件,启动监听器,并在命令行上显示机器人已经启动。

if __name__ == '__main__':
    qq = '' # 填写你的QQ号
    password = '' # 填写你的QQ密码
    login_result = login(qq, password)
    connect(login_result['cookie'], login_result['ptwebqq'])
    app = Application([
        ('/webqqbot', WebQQBot),
    ], cookie=login_result['cookie'], ptwebqq=login_result['ptwebqq'])
    app.listen(8000)
    print('WebQQ机器人已启动,监听端口:8000')
    IOLoop.current().start()

以上就是使用Python的Tornado框架实现一个简单的WebQQ机器人的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Python的Tornado框架实现一个简单的WebQQ机器人 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • Python – 文件处理 – 无法将’int’对象隐式转换为str [重复]

    【问题标题】:Python – File handling – Can’t convert ‘int’ object to str implicitly [duplicate]Python – 文件处理 – 无法将’int’对象隐式转换为str [重复] 【发布时间】:2023-04-06 11:31:01 【问题描述】: 我正在尝试将冒险游戏的故事从文件读…

    Python开发 2023年4月6日
    00
  • 6个实用的Python自动化脚本详解

    《6个实用的Python自动化脚本详解》是一篇介绍如何使用Python编写自动化脚本的文章,主要介绍了6种实用的自动化脚本,分别涉及监视文件夹、发送电子邮件、生成PDF文件、截图、自动化ERP系统和爬取网站数据等方面。 下面对每个脚本进行详细讲解。 监视文件夹 这个示例演示了如何使用Python监视目录中的文件变化,并在有新文件时触发某些操作。示例代码中使用…

    python 2023年5月19日
    00
  • re模块的正则匹配的表达式详解

    re模块的正则匹配的表达式详解 什么是正则表达式 在计算机科学中,正则表达式是一种描述字符串匹配模式的方法。正则表达式通常被用来检索或替换符合特定模式的文本。 re模块的基本使用 Python中提供了re模块,可以使用re模块的方法来对字符串进行正则匹配 re.match() 函数 re.match()函数用于匹配字符串的开头,如果字符串的开头不符合正则表达…

    python 2023年6月3日
    00
  • python 爬取腾讯视频评论的实现步骤

    要爬取腾讯视频评论,可以采用以下步骤: 1. 分析腾讯视频评论的接口 腾讯视频评论的接口为:https://video.coral.qq.com/video/article/comment/v2 在浏览器中打开该接口,可以看到该接口需要传入以下参数: cid:视频id,例如 1047256471。 pageflag:分页标志,用于翻页,第一页为 0,第二页为…

    python 2023年6月7日
    00
  • python实习总结(yeild,async,azwait和协程)

    Python实习总结 本文将介绍在Python实习中所了解到的yield、async、await和协程的知识点以及如何使用它们。 yield和生成器 yield是一种特殊的关键字,它可以让函数暂停执行,并将函数的当前状态保持下来。yield常用于生成器中,生成器可以用来迭代一组数据,而不用事先生成整组数据,这样可以节省内存空间。以下是yield的示例代码: …

    python 2023年5月13日
    00
  • 2D 数组 (PYTHON) 的 len() 未正确出现

    【问题标题】:len() of a 2D array (PYTHON) is not coming correctly2D 数组 (PYTHON) 的 len() 未正确出现 【发布时间】:2023-04-03 00:16:02 【问题描述】: 参考下面的简单代码sn-p。获取二维数组的输入并打印它的大小 def prefix_sum_Rish(): row…

    Python开发 2023年4月8日
    00
  • python跳过第一行快速读取文件内容的实例

    当我们需要读取一个文件的内容时,往往需要跳过文件中的第一行。Python提供了一种快速跳过第一行的方法,以便能够更快地读取文件内容。下面是详细的攻略: 1. 准备数据文件 首先,我们需要准备一份数据文件作为示例。这个文件应该至少包含两行内容,以便我们可以测试跳过第一行的效果。下面是一个简单的数据文件示例: Name, Age, Gender Alice, 2…

    python 2023年6月3日
    00
  • Python实现搜索Google Scholar论文信息的示例代码

    Python实现搜索Google Scholar论文信息的示例代码 Google Scholar是一个免费的学术搜索引擎,可以搜索学术文献、论文、书籍、报告等。本文将详细讲解如何使用Python实现搜索Google Scholar论文信息的示例代码,包括如何发送HTTP请求、如何解析响应、如何提取数据等。 发送HTTP请求 要实现搜索Google Schol…

    python 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部