用Python开发QQ机器人详解

news2024/12/28 20:14:26

 前言

  • 虽然该文最终是达到以python开发mirai机器人的目的,但起步教程,尤其是环境配置上仍然有大量的相同操作,对其他编程语言仍有借鉴之处

  • 假设你已经安装好了 Java、Python等运行必须的环境

 mirai生态

  • mirai官方生态文档

  • 要使用mirai开发QQ机器人,首先要对其生态有一定的了解,因为它太复杂了,坑特别多,所以多了解一点,遇到问题之后解决起来也会更快

  • mirai生态汇总图

640?wx_fmt=jpeg&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 简单来说,mirai生态的核心是Mirai框架,其中包含了mirai-core及mirai-core-api两部分。

  • 其中,前者负责协议相关的内容,而后者负责对外提供操作前者的接口。因此与程序员直接打交道的是mirai-core-api,而mirai-core,对我们是不可见的。

  • 使用mirai-core-api就已经可以开发QQ机器人了,但对萌新来说难度还是太大,于是mirai官方开发组编写了一个QQ机器人程序,mirai-console,它在 mirai 框架提供的基础功能的基础上进行了封装并进一步提供了更方便的开放接口。

  • 有了mirai-console,我们就不用直接去开发mirai的QQ机器人了,而是去开发mirai-console的插件,如下面的模式:

    640?wx_fmt=jpeg&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 尴尬的是,开发mirai-console的插件,又需要使用java或者kotlin。如果你跟我一样,对他们都不熟悉,那么官方的另一个插件mirai-api-http,则可以解决这个问题。

  • 于是借助mirai-api-http开发QQ机器人,就成了下面这种模式:

    640?wx_fmt=jpeg&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 可以看到,当我们使用了mirai-api-http后,我们就有了更多的开发语言选择。此处我选择python。

 起步

使用 mirai-console-loader 启动 mirai-console

  • 根据上面的介绍,要开发一个mirai的QQ机器人,我们首先需要将mirai-console给运行起来,而要做到这一步,可难。例如你需要准备mirai-core,mirai-console 和 mirai-console-terminal,然后还需要通过一大串指令来启动它。

  • 而官方显然考虑到这一点,为了挽回被这一高难度操作劝退的萌新,官方又推出了mirai-console-loader(简称mcl) —— mirai-console 的官方一键启动器。因此你仅需要下载它即可(第一步说的都不用管0.0)。github仓库位置:mirai-console-loader[2]

  • 下载完成mcl之后,解压、打开cmd、切换到mcl所在目录、运行mcl。如下图:

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 不出意外的话,mirai-console就成功启动了,如下图:

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 然而,咱从官方下载的项目,运行时却出错了0.0 ( 如果你没有出错,忽略此步骤 )。原因是配置文件出错 (太倒霉了 - -)。修改方式如图:

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 然后再重新运行一下,mcl,不出意料的话,能成功运行。

  • 第一个大坎就迈过了…接下来是另一个大坎

使用 mirai-login-solver-selenium 处理滑块验证辅助登录

  • 在成功启动的mcl窗口,运行命令登录qq:login 账号 密码

  • 应该是会出错的,因为mirai-console在登录时,不能处理滑块验证:

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 于是我们需要mirai的另一个项目 mirai-login-solver-selenium[3] 来辅助登录

  • mirai-login-solver-selenium安装步骤 (需要先安装 Chrome 浏览器)

  • 先结束掉之前运行的 mirai-console, 然后在命令行运行如下命令,添加该包

mcl --update-package net.mamoe:mirai-login-solver-selenium --channel nightly --type plugin
  • 然后再重新运行mcl,这样mcl就会去尝试下载mirai-login-solver-selenium。

  • 然而,我这一步也出现问题了(如果你没有问题,也请跳过)。因为它用到了selenium,所以就要用chromedriver。但是chromedriver总是下载失败,所以这一步需要手动下载chromedriver,然后替换到对应目录。步骤如下:

    1.查看cmd窗口,找到mcl正在下载的chromedriver是什么版本

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    2.然后去chromedriver的另一个镜像源下载,推荐:chromedriver[4]

    3.找到一个版本号相近的即可,例如我就下载 86.0.4240.22

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    4.将下载好的文件解压,再重命名成chromedriver-86.0.4240.198.exe,也就是刚刚我们在命令行窗口查看的文件名,一定要跟它想下载的文件名一致

    5.结束之前运行的mcl命令行程序,然后将准备好的chromedriver-86.0.4240.198.exe, 替换到以下目录

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

    6.重新运行mcl程序,如果一切顺利,就可以继续之前的步骤,输入命令:login 账号 密码 尝试登录。接下来会弹出一个浏览器窗口,你只需要傻瓜式的完成登录验证即可。如果登录成功,以后的每次登录,应该都是不需要再次验证的。

  • 又跨过一个坎…接下来就到了另外一个坎

使用 mirai-api-http 增加语言拓展性 (为了能用其他语言来开发)

  • 前面一直在说 mirai-api-http,但是到目前为止,我们都还没有用上它。前面的工作就做了两个事情

    1.使用mcl运行mirai-console

    2.使用 mirai-login-solver-selenium 辅助通过滑块验证码,完成登录

  • 那么接下来就开始用mirai-api-http,首先在mirai-api-http项目地址,下载mirai-api-http[5]

  • 然后将下载到的jar包,放在plugin文件夹下,如图

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 然后再重启mcl,重新进行登录。这样准备工作就完成了,但是我出现了一些错误,看意思应该是签名验证的问题,错误如下:

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

  • 四处咨询后了解到,是oracle JDK的问题,因此只需要将orcaleJDK 替换成为 open JDK即可,步骤如下:

1.下载 open JDK[6],例如我下载如图所示的版本:

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

2.解压open JDK, 并放在你认为合适的位置,例如我放在如下图所示的位置:

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

3.添加 jdk 所在路径到环境变量:此电脑 ->右键属性 -> 高级系统设置 -> 高级 -> 环境变量, 再按下图操作

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

通过 graia-application-mirai 使用 python 开发 mirai 机器人

  • 前面的操作,直到该步为止,基本对所有使用除java/kotlin语言的程序员,都是通用的。而后面的操作,仅写给使用python的程序员

  • graia-application-mirai官方文档[7]

  • 首先对mirai-api-http进行配置,如图:
     

    640?wx_fmt=png&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1


    以下是参考,自己看着配就行

# file: mcl-1.0.3/config/net.mamoe.mirai.api.http/setting.yml
authKey: graia-mirai-api-http-authkey # 你可以自己设定, 这里作为示范

# 可选,缓存大小,默认4096.缓存过小会导致引用回复与撤回消息失败
cacheSize: 4096

enableWebsocket: true # 是否启用 websocket 方式, 若使用 websocket 方式交互会得到更好的性能
host: '0.0.0.0' # httpapi 服务监听的地址, 错误的设置会造成 Graia Application 无法与其交互
port: 8080 # httpapi 服务监听的端口, 错误的设置会造成 Graia Application 无法与其交互
  • 重启mcl, 更新配置

  • 接着,安装 python 操作 mirai-api-http 接口的模块:graia-application-mirai

pip install graia-application-mirai
  • 将以下代码复制到bot.py,按注释提示,再结合刚刚对mirai-api-http的配置,稍作修改。然后运行

from graia.broadcast import Broadcast
from graia.application import GraiaMiraiApplication, Session
from graia.application.message.chain import MessageChain
import asyncio

from graia.application.message.elements.internal import Plain
from graia.application.friend import Friend

loop = asyncio.get_event_loop()

bcc = Broadcast(loop=loop)
app = GraiaMiraiApplication(
    broadcast=bcc,
    connect_info=Session(
        host="http://localhost:8080", # 填入 httpapi 服务运行的地址
        authKey="graia-mirai-api-http-authkey", # 填入 authKey
        account=5234120587, # 你的机器人的 qq 号
        websocket=True # Graia 已经可以根据所配置的消息接收的方式来保证消息接收部分的正常运作.
    )
)

@bcc.receiver("FriendMessage")
async def friend_message_listener(app: GraiaMiraiApplication, friend: Friend):
    await app.sendFriendMessage(friend, MessageChain.create([
        Plain("Hello, World!")
    ]))

app.launch_blocking()
  • 然后向你的QQ机器人,随便发送一条消息,如果它回复你Hello, World!,则表示运行成功

  • 成功所示如下:

    640?wx_fmt=jpeg&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

 结语

上面的全部操作,不过是使用mirai进行开发QQ机器人的起步教程而已,需要了解更多,还是去阅读官方文档,以学习更多的api。


                

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075834.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四届厦门国际银行数创金融杯建模大赛火热进行中!丰厚奖励等你来拿!

第四届厦门国际银行数创金融杯建模大赛火热进行中!厦门国际银行联合厦门大学数据挖掘中心诚邀您一起用科技的力量,探索数据的奥秘。 本届大赛以实际金融业务场景中的文本识别作为主题,设置了高达38万元的丰厚奖金以及竞赛获奖证书&#xff0c…

pdf怎么转成jpg图片格式

pdf怎么转成jpg图片格式?对于大家平时在工作或者生活中的图片使用习惯,经常需要将各种格式的文件转换成易于浏览和使用的JPG格式图片以便保存。如今,因为pdf文件具有更强的稳定性和设备兼容性,PDF文件在平时的电脑使用过程中可以说…

AQS面试题

更多面试资料请添加wx:suns45 ———Java的AQS——— 1、AQS的理解 AQS是一个锁框架,提供了扩展地方 当多个线程抢锁时,获取不到锁的线程,AQS会自动管理 AQS是同步队列条件队列 AQS分为4个时机,获取锁&#xff0c…

国产化技术探究达梦8数据库搭建一主一从双机热备守护Data Watch集群搭建实战

国产化技术探究达梦8数据库搭建一主一从双机热备守护集群搭建实战 一、环境说明 服务器类型IP地址操作系统数据库实例名称主机172.18.21.144centos7DMSERVER备机172.18.21.147centos7DMSERVER2 参数主库备库实例名称DMSERVERDMSERVER 2IP172.18.21.144172.18.21.147OGUID453…

有趣的数学 积分符号∫ (integration)简述

1、简述 积分是微积分的一个主要部分。它是求和概念的延伸。事实上,积分符号源自一个拉长的字母S,最初由莱布尼茨使用(也有人说是牛顿),代表Summa,在拉丁语中意为“和”,对切片进行求和的想法。…

计算机的体系与结构

文章目录 前言一、冯诺依曼体系二、现代计算机的结构总结 前言 今天给大家介绍计算机的体系和结构,分为两个板块:冯诺依曼体系和现代计算机的结构。 一、冯诺依曼体系 冯诺依曼体系是将程序指令和数据一起存储的计算机设计概念结构。 冯诺依曼体系可以…

基于LSTM-Adaboost的电力负荷预测的MATLAB程序

微❤关注“电气仔推送”获得资料(专享优惠) 主要内容: LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。代码中的LST…

MySQL之MHA集群

MHA概述 什么是 MHA MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换…

hbba网站下载国家标准/行业标准的方法

hbba网站是不提供下载按钮并且不支持右键的,那么如何下载呢? 1、首先看一下pdf有多少页,一般标准介绍上有写。 2、使用edge或google浏览器打开pdf预览页面,打开开发者模式,用小箭头指向第一页,这样就获取到…

数据库引擎选择指南:MyISM和InnoDB哪个更适合你?

亲爱的小伙伴们,大家好!我是小米,今天我要和大家一起来聊一聊两个数据库引擎,分别是MyISM和InnoDB。这两个数据库引擎在MySQL中都扮演着非常重要的角色,了解它们的特点和区别对于我们理解数据库的工作原理和性能优化非…

短视频矩阵系统源码--saas开发

一、概述 抖音SEO矩阵系统源代码是一套针对抖音平台的搜索引擎优化工具,它可以帮助用户提高抖音视频在搜索结果中的排名,增加曝光率和流量。本开发文档旨在提供系统的功能框架、技术要求和开发示例,以便开发者进行二次开发和优化。 二、功能框…

ctfshow web入门 php特性 web136-web140

1.web136 还有一种写文件的命令时tee命令 payload&#xff1a; : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…

【m98】视频帧的 jitterbuffer 1:

管理待解码的视频帧: VCMFrameBuffer VCMFrameBufferStateEnum 代表帧的状态信息:组帧失败的(kStateEmpty)?kStateIncomplete(存储了部分包)?kStateComplete(拥有了所有包?) enum VCMFrameBufferStateEnum {kStateEmpty, // frame popped by the RTP receiver…

phpstorm不提示$this->request,不提示Controller父类的方法

![在这里插入图片描述](https://img-blog.csdnimg.cn/d55799a22b724099930eb7fb67260a12.png 最后 保存就可以了

Vue-2.0组件化开发

组件化 一个页面可以拆分成一个个组件&#xff0c;每个组件有着自己独立的结构、样式、行为。 好处&#xff1a;便于维护&#xff0c;利于复用->提升开发效率 组件分类&#xff1a;普通组件、根组件 根组件 整个应用最上层的组件&#xff0c;包裹所有普通小组件。 Ctrl…

leetCode 53.最大子数组和 动态规划 + 优化空间复杂度

关于此题我的往期文章&#xff1a; leetCode 53.最大子数和 图解 贪心算法/动态规划优化_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/13349726853. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; >&…

WebKit Insie: Active 样式表

WebKit Inside: CSS 样式表的匹配时机介绍了当 HTML 页面有不同 CSS 样式表引入时&#xff0c;CSS 样式表开始匹配的时机。后续文章继续介绍 CSS 样式表的匹配过程&#xff0c;但是在匹配之前&#xff0c;首先需要收集页面里面的 Active 样式表。 1 Active 样式表 在一个 HTML …

Windows下Mosquitto服务配置监听任何IP,搭配使用MQTTX

Mosquitto 默认只监听本地地址&#xff0c;想让它监听其他的IP和端口需要以下操作在mosquitto.conf文件最后加如下内容 allow_anonymous true listener 1883 0.0.0.0 在启动的时候只需要 .\mosquitto.exe -c .\mosquitto.conf -v 就可以了

2023年中国临床信息系统市场规模及细分市场结构分析[图]

临床信息系统(ClinicalInformationSystem&#xff09;&#xff0c;其主要目标是支持医院医护人员的临床活动&#xff0c;收集和处理病人的临床医疗信息&#xff0c;丰富和积累临床医学知识&#xff0c;并提供临床咨询、辅助诊疗、辅助临床决策。传统上&#xff0c;一些人把直接…