【开源访谈】对接 QQ 机器人平台,对接共同成长的开源社区(开源中国采访)
本文是Newbe接受"开源中国"采访内容,原文链接:https://www.oschina.net/question/3820517_2283450
上个月末,用于对接 QQ 机器人平台的开发框架 Newbe.Mahua 发布了 1.10 版本,为开发者带来了完整的 Amanda 平台开发体验,一时间引起了热议。Newbe.Mahua 是一个基于 QQ 机器人平台的上层开发框架,优秀的跨平台能力让开发者只进行一次开发,便可以将代码适配到多个不同的 QQ 机器人平台上。
对第三方 QQ 机器人平台进行再封装,那么 Newbe.Mahua 的主要功能也就显而易见了,它可以实现灵活的 QQ 消息智能回复、QQ 群成员管理、指定 QQ 群成员发送消息等高级功能,满足用户的特定需求。我们采访了项目作者 Newbe,他为我们分享了开发 Newbe.Mahua 项目的心路历程,他表示开源社区是技术成长的美好模式。本文由采访整理而成。
项目地址:
- Gitee:https://gitee.com/yks/Newbe.Mahua.Framework
- GitHub:https://github.com/newbe36524/Newbe.Mahua.Framework
站在巨人肩上,Newbe.Mahua 离不开机器人平台
首先明确一点,Newbe.Mahua 本身并不是一个直接切入 QQ 底层的 QQ 机器人平台,它只是实现了与多个 QQ 机器人平台的对接能力。
说到 QQ 机器人,微信有一个常见的场景可以用来说明大家对"机器人"的迫切需求。微信火了之后,很多社区使用微信群进行在线课程教育、技术分享,而微信群功能有限,无法满足课程组织者的常规需求,比如,因为参加在线群课程的人数过多,而每个微信群又有人数限制,这就使得组织者需要在多个群中同步转发分享内容,而这样一个简单的操作实际执行起来却比较繁琐,浪费人力与时间。这样催生出了许许多多的微信群机器人,它们的任务通常很简单,最主要就是自动转发群消息,此外还有进行简单的群成员管理等能力。
然而,微信平台下是不允许出现第三方机器人工具的,我们可以看到很多群机器人被封杀,甚至开发者也受到处罚。QQ 上也是类似的情况,对于通信协议的严格管控,使得开发者只能通过非公开 API 的方式切入其底层,实现自己的需求。这也就是当下有一些 QQ 机器人平台存在的简单背景。
QQ 机器人平台通常是通过逆向 QQ 的通信协议来实现相关功能。逆向通信协议并利用通信协议实现相关功能的做法,是否合适、是否被允许,我不能给出具体的解释,并且这也不是本文讨论的内容。
但是,简单地讲,我认为对于这类型项目的限制还是存在的,大概分为两部分:
- 一部分是法律限制,这点容易理解,开发出国家或地区法律所禁止的插件功能,这必然是会被封杀的,比如博彩、反动、色情等相关内容。
- 第二部分是技术性的限制,例如高频发送消息、消息内容异常等等,这些技术性限制没有明确说明,但随着腾讯公司的检测机制不断强大,技术性的限制也势必会越来越严格。
Newbe.Mahua 是一套提供了与多个 QQ 机器人平台进行对接的插件开发 SDK,它实质上是通过调用互联网上存在的一些 QQ 机器人平台的接口来实现相关功能的。因此本框架仅仅被定义为一个"用于开发插件的 SDK",插件必须依附于这些 QQ 机器人平台才能运行,并且在 API 能力上也受限于特定的机器人平台。
Newbe.Mahua 是站在了巨人肩膀上,同时它也反过来为 QQ 机器人平台插上翅膀。
为什么开发这样一个框架?
Newbe.Mahua 框架采用 C# 语言实现,为开发者提供了统一的开发接口,使开发者不需要针对不同 QQ 机器人平台进行定制化对接,减轻了其工作负担。开发者可以使用本框架开发属于自己的 QQ 机器人平台插件,实现 QQ 消息智能回复、群成员管理等一系列功能。
这些是 Newbe.Mahua 框架能够满足的业务需求,然而这并不是当初开发这样一个框架的真正目的。
按照我的了解,现代业务系统开发中,B/S 和 C/S 架构仍然是无法逃开的系统结构形式。因此,以 Newbe.Mahua 项目所使用的 .Net 语言生态来讲,开发人员在入行之后,一般都会接触 B/S 或 C/S 架构的开发,然而这两者通常都需要一定的界面制作技术,也就是面向用户的相关技能。
这些内容当然是重要的,也是需要开发者去了解的。但是我一直认为,这不是技术人员应该学习的重点,在如今技术更新迭代如此快速的时代,"学会开发哲学,学会如何学习"才是成为不被淘汰的技术人员所应该具备的素质。
入行以来,我试图通过书籍、互联网去了解、去学习各种关于开发的知识,然而在实践过程中,我发现实际上人与人之间的交流沟通,更加能够丰富我们的知识储备,并让我们不断成长。而在技术领域,开源社区就是一个理想的模式。
为此,我开始着手创建 Newbe.Mahua 项目,并希望由此衍生出一个生态相对完善的开源社区。Newbe.Mahua 框架,或者说 QQ 机器人插件的开发是一个相对不要求界面制作技术的领域,首先这可以让我和参与项目的开发者把目光聚焦在我所说的"学会学习"上。而社区的意义在于让其中的开发者,能够在项目过程中,在一步步解决诸如"如何一套接口对接多个平台"、"如何制作简单的 IDE 插件"、"如何实现非托管代码与托管代码的调用"等问题的过程中,学习到开发的各种工具、过程和方法,让刚刚入行的程序员能够学会例如设计模式、单元测试、开发工具等一些进阶技能。
总结来说,建立围绕 .Net 开发的开源交流社区,这才是 Newbe.Mahua 项目的目的。
Newbe.Mahua,2 个亮点,4 大模块
作为一个 SDK,针对功能、语言的关注点不同,市面上可用的同类型项目数不胜数。相比之下,Newbe.Mahua 的亮点主要可以归结为两点:
通过模块化的方式,实现了一套接口对接多个不同平台的能力,很大程度上简化了开发者的工作。 除了本身带来的业务价值,更重要的是建立的 .Net 交流社区,分析学习项目实现中的"工具、过程和方法"更是本项目的亮点。 Newbe.Mahua 目前为开发者提供了类库、构建工具、IDE 插件和文档四大块内容。项目的总体架构如下图所示:
图中的 Newbe.Mahua 便是本 SDK 的核心内容,开发者可以基于本 SDK 开发实现满足自己业务需求的机器人平台插件。
Newbe.Mahua.Ipc 则是基于本 SDK 开发的一个插件,它提供其它进程跨进程调用机器人平台的能力。
若将 Newbe.Mahua 这一层展开来看,则包含下图所示内容:
其中各个模块的简介如下:
Newbe.Mahua
提供了接口层能力,本 SDK 提供的所有接口都定义于该类库中,开发者可以通过调用该层接口实现业务需求。
Newbe.Mahua.PluginLoader
SDK 实现的核心所在。主要实现了几块内容: 通过模块化加载实现了针对不同平台实现层加载不通运行时类库的能力。 通过 AppDomain 实现了插件的托管代码与机器人平台的非托管代码进行通信的能力。
Newbe.Mahua.*
平台实现层,针对不同的机器人平台,实现了接口层的接口。
Newbe.Mahua.Tools.Psake
构建工具包,通过 Newbe.Build.Psake 实现了开发阶段的插件打包功能,减少开发难度。
Newbe.Mahua.ApiExtensions
平台 API 拓展类库,允许 SDK 的使用者添加或者替换接口的实现,从而实现一些原平台不具备或实现不佳的 API。
Newbe.Mahua.Administration
提供一个多平台统一的管理中心界面,可以进行挂载菜单和界面的管理中心。开发者可以通过实现特定的接口来实现一个跨平台的统一管理界面。 除了以上所描述的类库和工具,Newbe.Mahua 框架还包含以下这些内容:
Visual Studio 插件,提供了一些常用的开发模板 样例代码与特性帮助
与社区、开发者一起成长
作为开源项目,开发过程中我们一直坚持"社区主导,社区优先"的原则,每个版本迭代,一般会按照社区所反馈 issue 的优先级,订立相关的里程碑。确保每一个里程碑的发布,都能给社区一个新特性的反馈和若干优化项。
在一步步开发、成长的过程中,作为管理人员,我的工作主要包括这些:
- 回复社区反馈
- 确定版本迭代计划
- 开发主体框架
- 开发 IDE 插件
- 编写开发文档
- 发布版本
在平时与社区成员的互动中,我不时为社区成员组织技术交流活动,整理学习成果,分享学习的阶段成果。
而整个社区作为一个整体,其中的成员们也在不断付出,社区成员 Traceless 曾多次为改版后的 SDK 录制教学视频并校对开发教程;Byboy 更是在自己的直播过程中推荐了本 SDK。还有更多的社区开发者,他们热心解答他人的技术疑问。
其中有一件事让我印象深刻,它也让我看到了这个社区的整体性,大家为了同一个目标在集思广益。
当时我们是被的问题困扰住了。程序集重定向,是指在 .Net 开发过程中,由于程序集的版本依赖版本不同,而需要进行重定向到特定版本的功能,这是 .Net 开发的原生能力。举个简单的例子,A 程序集依赖了 C 程序集的 10 版本,B 程序集依赖了 C 程序集的 8 版本,而在插件当中需要依赖 A/B/C 三个程序集,因此需要对 C 程序集的版本配置重定向。
通常,这个问题可以通过直接在程序集的 App.config 文件中配置解决,然而,机器人平台都是非托管程序,因此无法直接加载 App.config 文件,这需要另辟蹊径。经过社区的激烈讨论,有些人提出的方案都因为有瑕疵而被否决了,而其中一位名为月落的社区开发者提出了"使用单独的 AppDomain 来单独加载插件程序集"的方案,得到了社区的一致认可,最终经过验证,这是一种可行的方案。
在这个过程中,社区开发者的热情和努力令我感动。
经过近 16 个月的发展,Newbe.Mahua 项目和社区在一步步的成长,项目从最初针对特定平台的简易 SDK,发展到如今的四大相对比较丰富的模块,功能也不断完善;而社区,从最开始只有我一个人,发展到今天 200+ 成员,核心开发人员十余人。大家欢聚在一起,互相帮助,互相学习,分享自己从业领域的相关经验,也不断帮助其他人解决技术与非技术问题,在社区的发展中成长。
至于 Newbe.Mahua 的使用情况,它的影响力方面,因为一般使用这种 SDK 都不会公开出来,所以具体案例不好介绍,不过,通过在 GitHub 上进行代码查找,能够找到一些使用该框架的例子:
- https://github.com/evesgf/LarkBot
- https://github.com/traceless0929/Site.Traceless.SmartT
- https://github.com/Cyl18/CardSharp
- https://github.com/ly123567/CQP-LiveSignForDouyu
- https://github.com/chenxuuu/receiver-meow
另外,相关的机器人平台上,也可以看到相应的开放插件,感兴趣的读者可以自行前往相应的机器人平台官网进行了解。
目前 Newbe.Mahua 在各代码托管平台都有一百多的 star,已知基于该 SDK 开发的插件十余个,虽然不算多,但是这也是一步步积累下来的成绩,并且我们相信它会不断发展得更好,按照社区目前的计划,该项目后续的 roadmap 大致如下:
适配更多的机器人平台 编写项目实现技术细节的说明文档 完善 Newbe.Mahua.Ipc 而未来,伴随着社区自身的不断成长,我很期待我们将会有更多的开发创造不断涌现。技术的发展是永无止境的,在有限的生命之中,与有相同奋进目标的人为伍,一起学习、进步,共同缔造优秀的成果是一件其乐无穷的事情。Newbe.Mahua 对接的是 QQ 机器人平台,同时它也对接了一个共同成长的开源社区。
嘉宾介绍
Newbe,C# 开发者,当初单纯觉得 VS 好用就学了 C#。正在为了成为真正的架构师而不断努力。自带 Slogan:Newbe 便是新生,唯有不断蜕变才能焕然新生。