逆向学习QQ机器人——辅助资料

在看了川川菜鸟的博客之后,基本上仿造了一个qq机器人,但是对其中原理并不是很清楚,对插件的写法也不是很清楚,在此逆向分析代码。

以下为原博主链接:

手把手教你python制作一个完整qq机器人_python菜鸟-CSDN博客_python做qq机器人

而且博主也是很贴心地出了B站视频,链接如下:

 https://www.bilibili.com/video/BV1Z64y197Ps?from=search&seid=1917020917211050235&spm_id_from=333.337.0.0

看视频的时候,虽然挺轻松的,但是脑中仍旧有几个疑点。就是nb的机器人框架。所谓框架到底是什么东西?

在网络上进行一番冲浪后,终于挑选到了令自己满意的答案:nb框架就是选好需求,目录代码结构自动生成。

实际情况也是这样的,只是挑选了几个选项,一个比较完善的archive便出现在我的预先准备的文件夹中。

之后经过一系列配置,就到了撸代码环节。因为框架已经解决了连接框架等问题,因此,需要我们自定义的仅仅是一些插件,也就是实现功能的模块,plugins。

但是我并不理解其中的接口。

因此,第一个需要解决的问题就是,程序如何接收到发送方所发送的关键词并与特定功能产生映射关系。

 虽然去看了go-cqhttp帮助文档,但是仍旧一头雾水。

那么就直接开始对着代码找规律。首先,打开自己的机器人,测试到能够执行的功能,就把源代码拿过来总结。以下是输出菜单的功能的代码

from nonebot import on_keyword, on_command
from nonebot.typing import T_State
from nonebot.adapters.cqhttp import Message, Bot, Event  # 这两个没用的别删
from nonebot.adapters.cqhttp.message import MessageSegment
import requests
from nonebot.permission import *
from nonebot.rule import to_me

"""菜单"""

menu = on_keyword({'菜单'})

@menu.handle()

async def main(bot: Bot, event: Event, state: T_State):
    smg = """
    1.今日人品, 全国降雨预报图, 点歌
    2.动漫, cos, 精选壁纸, 美腿
    3.奥运会, 随机美图, 天气, 彩虹屁
    5.今日哔哩排行, 哔哩热搜, 微博热搜
    6.网易云评论, 今日人品, 英汉语录
    7.舔狗日记, 一言语录, 精神语录
    8.网红视频, 随机毒汤, 随机一言
    9.随机笑话, 绕口令, 狗屁不通文章生成
    10.彩虹屁文案, 散文文案, 伤感语录
    11.古诗一言, 随机段子, 二次元
    12.随机mc酱壁纸, 渣男文案, 涩图
    13.随机摄影, 随机setu, 随机girl
    """
    await menu.send(smg)

遇到了不解的地方,一是@符号的意思;二十async的用法,另外就是最后await的意思。老规矩,继续百度。

@修饰符
  '@'符号用作函数修饰符是python2.4新增加的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。也就是说@A def f(): 是非法的。 只可以在模块或类定义层内对函数进行修饰,不允许修修饰一个类。一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。

本质上讲,装饰符@类似于回调函数,把其它的函数(暂且称为目的参数)作为自己的入参,在目的函数执行前,执行一些自己的操作,比如:计数、打印一些提示信息等,然后返回目的函数。下面列举一个简单的例子。

def test(func):
    print("a")
    return func()
    
@test# 从这里可以看出@test等价于 test(xxx()),但是这种写法你得考虑python代码的执行顺序
def xxx():
    print('Hello world!')

运行结果:
a
Hello world!

————————————————
版权声明:本文为CSDN博主「yjreset」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yjreset/article/details/79329979

想来就是定义了一个以函数为参数的函数,因此此函数可以有两个函数的执行。第一个函数先执行之后内部的函数才执行,因此有顺序的关系。而@定义的函数便是外层即第一个函数。

接下来是关键词async的解读。

首先是异步的概念,异步:执行 IO 操作时,不必等待执行就能得到返回结果。然后是协程的概念,协程:协程(Coroutines)是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。

然后是async/await的使用方法

正常的函数在执行时是不会中断的,所以你要写一个能够中断的函数,就需要添加async关键。

async 用来声明一个函数为异步函数,异步函数的特点是能在函数执行过程中挂起,去执行其他异步函数,等到挂起条件(假设挂起条件是sleep(5))消失后,也就是5秒到了再回来执行。

await 用来用来声明程序挂起,比如异步程序执行到某一步时需要等待的时间很长,就将此挂起,去执行其他的异步程序。await 后面只能跟异步程序或有__await__属性的对象,因为异步程序与一般程序不同。假设有两个异步函数async a,async b,a中的某一步有await,当程序碰到关键字await b()后,异步程序挂起后去执行另一个异步b程序,就是从函数内部跳出去执行其他函数,当挂起条件消失后,不管b是否执行完,要马上从b程序中跳出来,回到原程序执行原来的操作。如果await后面跟的b函数不是异步函数,那么操作就只能等b执行完再返回,无法在b执行的过程中返回。如果要在b执行完才返回,也就不需要用await关键字了,直接调用b函数就行。所以这就需要await后面跟的是异步函数了。在一个异步函数中,可以不止一次挂起,也就是可以用多个await。

引用自https://www.cnblogs.com/xinghun85/p/9937741.html

在网上冲浪的时候,意外发现知乎上另有人写了更加详细的教程。

https://zhuanlan.zhihu.com/p/373305833

第二章:基础插件编写指南,第一节(此为其题目,有意者转走)

插件时机器人实现具体功能的基本单位。而使用插件最好是以包的形式。

理解事件、事件响应器与事件处理器

一次事件就是一次QQ推送的消息,事件可以分为几类,消息事件--message;通知事件--notice;请求事件--request;元事件--metaevent。

事件响应器对事件进行识别和筛选。

事件处理器 进行事件的处理工作。

事件响应器可分为:匹配规则、优先度设置、事件继续执行。

若要进一步深入学习事件处理器,可以使用

https://zhuanlan.zhihu.com/p/373323656

对于目前来说,我只需要用到on_message()事件相应器就行了。

 同样,事件处理器xxx.handle()用于立即处理信息,同样符合我的使用期待。

以下是个人认为还不错的github资源地址:

https://github.com/Well2333/NoneBot2_NoobGuide

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辞夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值