这个bot写了有段小时间了,一直没有做个总结之类的,正好最近使用了saya, 代码算是可以看了点,于是就准备做个小总结。

Bot是什么

输入 - 处理 - 结果

大致上就是如此,发送一句话,bot根据这句话进行处理,然后得到预期结果。很明显,bot就是IO密集型程序,使用异步的方式是最便捷也是最高效的,这里就要说下开发框架

  • Mirai:一个在全平台下运行,提供 QQ Android 协议支持的高效率机器人库(Kotlin)
  • Mirai Console Loader:模块化、轻量级且支持完全自定义的 Mirai 加载器
  • **Mirai-API-http:**一个插件 提供HTTP API供所有语言使用mirai
  • Graia Application for mirai-api-http:一个设计精巧, 协议实现完备的, 基于 mirai-api-http 的即时聊天软件自动化框架
  • Saya:一个Graia的模块化控制器

Mirai是主要的QQ协议支持,通俗理解就是负责登录一个QQ账号,操作这个账号的所有活动,从消息接收到发送,从全体禁言到修改群设置,都可以进行操作。它负责的就是与QQ协议进行交互(当然也可以直接写bot,但我不会kotlin)。

启动一个Mirai服务是个挺麻烦的事情,特别是对于我这种没有接触过java的小白,所以就有**Mirai Console Loader**这种Mirai启动器,一键启动一个完整的Mirai服务,不用关心这里面发生了什么。

Mirai是Kotlin编写的,而我只会点python,这要怎么写呢......。这里就要说到**Mirai-API-http**了,它能将Mirai的服务以http-api的形式进行扩展,只要能进行http交互,那么就能使用任意一种语言,通过它操作Mirai。

有了协议,有了交互方式,就到了使用python进行具体的逻辑编写的时候了,于是就用上了**Graia。它作为一个框架,规范了与Mirai-API-http**交互的行为,提供了众多的工具给开发者,让开发者的操作便利了许多,不用去烦恼具体的交互逻辑而去专注于bot业务编写上。

当需要的功能多了,管理这么多的功能又成了一件麻烦事,于是加入了**Saya**,能把具体的功能实现包装成一个个saya模块,不仅让文件结构和功能逻辑更加清晰,还让分享功能变得便捷。

这些加在一起,便构成了CUAVbot的整个框架

CUAVbot地址:https://github.com/kuttakke/CUAVbot

功能和实现

写bot这件事让我收获最多的一件事,就是对python异步的理解加深。bot有可能在任何地方遇到io阻塞而导致不必要的等待,文件读写、网络请求等待操作若不进行异步操作,很大可能会使bot遇上长时间的IO阻塞而停滞,所以异步是编写bot的最要注意的点。用异步去进行各种功能的支撑,能做到快速响应,不必为了等待其他IO的回应而阻塞整个程序。

另一件事就是函数输入参数的规范,这里面涉及到Typing这个python模块,既帮助了后续代码维护的便捷,也能让编译器更好的理解参数类型从而进行提示。

最后一件以前经常被忽略的事,就是代码优化。我这个bot是使用docker挂载在Nas上的,cpu只能说是够用,如果写功能的时候不注意对各种资源消耗进行优化,那么反应慢将会是一个非常令人苦恼的问题。具体到这个bot,我不能说它写的足够完美~~(甚至挺烂的)~~,但至少它是我第一次注意着优化而编写的程序,第一次主动考虑这节省资源而编写的程序。

其余的地方其实并不复杂,看懂这个bot的代码也并不是非常难,就不再赘述。

总结

这个bot技术含量没多少,但对我的意义还算不小,它让我对开源社区这一概念有了理解,对api、异步、git、docker、类、python、网络、编程思维都有了不一样的理解,我很庆幸我能用浅薄的编程知识把写bot给坚持了下去,并持续学习、收获。