转载请注明出处:小锋学长生活大爆炸( ) 由于CSDN编辑器问题,存在很多图片缺失,强烈建议访问原文:
目录
QQ、微信是我们平常使用最多的通讯工具,网上也有很多通过软件去控制QQ/微信的开源工具,通过这些工具,我们可以实现许多有意思的效果,而不仅仅局限于消息聊天。
自从微信网页版被官方禁用后,微信的软件工具几乎已经失效了,现有的一些是通过hook微信本身来实现,这种很容易被官方检测并封号。另一些是通过注册企业号来控制,但不直观且功能受限。
这里我们借助相对更开放的QQ来制作我们的机器人,对比几款工具后,最终选择了mirai。
网上现有开源的机器人大多只是实现了类似“自动推送天气、接入图灵机器人自动聊天”等等,大多属于自娱自乐,没有发挥最大用途。
因此,我们的QQ机器人(暂且取名为“小锋仔”)是根据日常所需而制,包含常用功能且设计得易于扩展。
目前包含的功能有:
将来可能包含的功能有:
接下来详细介绍如何自己搭建一个这样的QQ机器人。篇幅较长且保姆级详细,建议收藏后慢慢看。
首先为了能运行mirai,且随时随地能连接,我们需要有一个 具备公网IP的服务器。这里使用腾讯云的 免费服务器。undefined 如果你已有服务器了,可以跳过本节,当然也可以看一看下面介绍的性价比超高的服务器。
对比云服务器 CVM,轻量应用服务器 更聚焦于中小企业、开发者、云计算入门者、学生等用户群体。详细的对比可以看:。
因此,对于个人学习与使用而言,轻量服务器更便宜、更实用,且性能不输。如果是想要进阶的童靴,可以上手CVM、ECS服务器。
对于还不想买的童靴,可以免费领取腾讯云提供的1个月服务器试用套餐。直接上领取步骤:
然后需要扫码进行人脸认证
完成支付即可,金额0元,也即白送。
注:试用时间使用完之后,也可以继续续费。对比其他几家的云服务提供商如华为云、百度云、阿里云,服务器的价格都较贵,即使是1核1G2M的学生价服务器,也要近99元/年。但腾讯云的2核2G4M轻量应用服务器只需65元/年,确实是很诱人了。进入可以选择不同的配置。当然,对于学生用户,也可以直接在选择。
这里腾讯云可能有个小特点。如果发现在控制台防火墙放行后,还是无法访问。需要再在服务器里放行一下端口。这里先写着,大家可以在后面一节中连接上了服务器,再回过来这里输入指令。
服务器初始化完成后,就可以通过SSH去连接了。这里我们可以直接使用powershell来连接,其他SSH软件我强推mobaxterm!!安装包也已经准备好了:
然后将账户加入sudoers组:
然后退出软件,重新用新建的账号登录即可。
至此,服务器环境就搭建完成了。
这篇博客里记录了很多我在使用过程中,常用软件的安装,非常详细且经过亲测,时不时也会更新内容,大家可以收藏以备下次使用。
Ubuntu20.04 + VirtualBox相关_小锋学长生活大爆炸的博客-CSDN博客
接下来就要在服务器上搭建QQ机器人(mirai)基础环境。搭建完成后,我们就可以远程跟机器人进行交互。
官方mirai的github仓库:
由于github是国外的,而官方已经不再支持的维护,因此如果大家无法访问上面的连接,可以用我帮大家下载下来的安装包:
其他的一些文档:
官方论坛:
下面开始正式安装:
此时需要输入密码(在上面选购并装完服务器后会显示,当时要求记下的)。
此时进入安装流程,弹出的几个选项都直接回车选默认即可。
首次启动会自动下载jar包。等待启动完成后,输入"?",可以查看所有支持的mcl命令。
如果想要启动mcl后自动登录QQ号,可以用:
也可以设置不同的设备登录。
它对应的配置文件其实就在:config/Console/AutoLogin.yml
当服务器成功运行了mirai后,我们就可以在本地进行Python脚本的编写了。由于最新的mirai-api-http变更过接口规范,因此网上某些一两年前的代码已经失效了。本教程对应的mirai-api-http使用的是最新的2.x版本。
接下来的操作,都默认已经完成“启动mcl并login了QQ号”。
在上面setting.yml中,有两个配置项值得注意,他是我们脚本可以控制的密钥:
简单封装下。直接用print也是可以的。
在交互前,脚本需要先向mirai获取一个verifyKey,之后在每个请求时候,都需要带上这个key,也叫session。其中,参数auth_key对应了上面setting.yml里的verifyKey。
使用此方法校验并激活你的Session,同时将Session与一个已登录的Bot绑定。
使用此方式释放session及其相关资源(Bot不会被释放)
获取当前有多少条未读消息。
获取消息后会从队列中移除。
简单实现了部分消息类型的解析,会有消息丢失,请根据使用需求自行调整。
向指定好友发送消息。
也只是简单实现。
跟上面的差不多,消息类型变了一下,从而支持类似HTML形式的消息发送。
以上就是几个简单、常用的函数。基于这些函数,就已经可以实现蛮多有趣的功能了。
这部分可以直接参考之前的博客:Q群消息转发例程。其实也就是把上面的函数整合一下,放一个完整版:
其中,conf.json内容为:
下面,我们就先从类似QMsg酱的消息通知开始。
设计目标:通过调用指定的URL,小锋仔机器人就会给指定的好友发送指定的消息。
关于QMsg酱的使用教程可以看:
前面我们特地开放了9966端口,因此可以使用Flask来监听这个端口。
本着越简单越好的原则,我们把“发给好友还是群”、“目标好友或群的号”、“发送的内容”三部分都拼接到URL上,因此有:
因此,代码可以写成:
由于Flask和小锋仔QQBot都要阻塞运行,因此稍微变动一下,让小锋仔以子线程的形式运行即可。
测试一下:
如果我们把这个脚本放到服务器上去运行,那么链接就变成了:
当然,能发消息的前提是“先加好友”或“加群”啦。
上面我们进行了简单地尝鲜。
1、从这部分开始,我们涉及的功能比较杂,为了能更好的区分功能,需要设计一个简单的交互协议。
根据以上内容,小锋仔需要记录的状态信息至少有:
2、并且我们设置,只有从指定QQ发过来消息,才能响应。因此在接收到消息时,需要判断对方的信息。对于好友类型的消息,mirai返回格式如:
因此,我们可以从"type"和 "sender:id"入手判断。
3、我们暂时考虑只有一个主QQ能发送指令的情况。
4、定义一个类来专门管理不同功能的函数,例如:
5、大致实现流程的想法是:
对应代码实现:
最终的框架就是:
看一下效果:
至此,骨架有了,接下来开始填充功能了。
根据上面的骨架可知,我们只需要实现MultiFunction类下的translate函数即可。如果想快速测试函数效果,可以使用以下代码,而不用先启动mirai:
要做翻译,最方便的就是调用API了(没错,调包侠!)。
这里使用腾讯的翻译API,可以免费领取:。点进链接后,往下拖到“云产品体验”专区,选择“人工智能”,下面有“机器翻译”。他的调用量是每月更新,非常的良心了。
点击“立即体验”,进入控制台界面,虽然上面显示的是“开通付费版”,但不用担心,他是有免费额度的,更何况你账户里又没充余额,哈哈哈。
支持很多类型的翻译,这次我们先选文本翻译,:
我们用SDK的方式,免去了自己封装复杂的加密步骤:
然后去获取密钥,记下APPID、SecretId、SecretKey:
小锋仔bot结合翻译功能,直接上代码:
使用测试效果:
天气部分,我们是用免费的和风天气API:。
首先也要进行登录并获取KEY,这个步骤官网讲的很详细,图文并茂的,这边就不多写了,大家可以跳转过去(注意我们选的是Web API):。
同样的,直接上代码:
测试效果:
这部分用的是天行数据,免费会员每天赠送100次调用额度:。先注册账号,然后点击“申请接口”即可。
注意,首次注册需要在控制台完成“实名认证”和“邮箱验证”(马上通过,不需要等待审核)。
对于密钥Key,是在“控制台-数据管理-我的密钥KEY”中。
同样的,直接上代码:
测试效果:
有时候我们想保存一些照片,但又不想放手机里,那我们可以做个“通过把照片发给小锋仔机器人,让小锋仔再上传到服务器或者COS上”的功能。
还是这个链接:,在“云产品体验-基础-对象存储COS”下面。对象存储不止可以用来存文件,这里我们只用来存图片。
通过mirai文档可知,图片消息格式为:
因此只需要拿到里面的URL就行,而我们的analyzeFriendMsg函数就已经提取了URl了,因此啥都不用多改!!(结构好,就是方便呀~)
直接测试:
通过上面几个小功能,不难发现我们的程序在功能上很方便扩展,总结一下,就2步:
下面提供几个好玩的接口,给大家留个作业,自己集成到机器人中去:
如果以后功能越来越多,我们很容易记不住关键词是啥,因此,稍稍变动一下,让我们可以知道功能清单。在xiaofengzai函数这个位置添加一段代码:
这部分摘自我前面的博客:
与树莓派的主要交互,这里主要有两种方式:
我的另一个大型项目“”,它里面树莓派与手机的通信,就是通过MQTT实现的。很贴心的,B站还有配套的视频教程,欢迎来踩,哈哈哈~。
树莓派由于不在身边,因此这部分暂时先略过,大家可以通过上面几篇博客自学一下,他们也都是使用到了mirai的。这里讲一下MQTT的安装,也可以参考安装EMQX MQTT。
ESP32是一块可以链接WIFI的嵌入式开发板,支持MQTT协议。这样一来,只要通过跟我们的机器人互相订阅Topic,在通过设计一套通信协议,就可以实现远程交互了。进一步地,给ESP32接入外设,就可以很容易的实现一个智能家居,而我们则可以通过QQ机器人来实现对智能家居的控制。
为了方便,我们把所有需要修改的变量,都统一提取到了最前面。大家在复制过程中,务必记得都填上自己的!!