[card]huntersxy/astrbot_plugin_qcm[/card]
最近折腾出了一个轻量小插件——astrbot-plugin-qcm,全称是 AstrBot QQ Connect Minecraft,核心功能只有一个:实现QQ群与我的世界(Minecraft)服务器之间,双向聊天消息的实时互通。
写这个插件的初衷特别纯粹。我自己运营着一个MC服务器,一直有个非常刚需的痛点:游戏内和QQ群的消息完全是割裂的。玩家要么在游戏里肝进度,要么在QQ群里水聊,群里喊人开黑,游戏里的人看不到;游戏里发生的趣事、组队需求,群里潜水的朋友也接不上话,体验特别割裂。
本来想着找个现成的插件直接用,结果翻遍了AstrBot的插件市场,又找了全网的相关工具,发现市面上的群服互联方案,大多适配的是其他机器人框架,专门给AstrBot做的群服互联插件,我愣是一个都没找到。既然找不到合适的轮子,那就干脆自己动手,vibe一个出来。
插件的核心能力
这个插件的设计目标很明确:开箱即用、轻量化、能满足服主最核心的互通需求,同时做基础的安全保障。目前实现的核心功能如下:
- 双向消息实时同步:监听指定QQ群的消息,将图片、表情、@提及做纯文本化处理后,实时转发到MC服务器;同时捕获MC服务器内的玩家聊天消息,自动推送到目标QQ群
- 加密通信:采用AES-128-ECB加密算法做端到端消息加密,避免消息明文传输带来的风险
- 来源可信验证:新增消息前缀校验机制,只有携带约定前缀的可信消息才会被转发,拦截恶意请求
- 高灵活度配置:支持多群、多会话批量推送,目标URL、服务端口、加密密钥、消息前缀等所有核心参数,都支持可视化配置
- 配套开箱即用的MC端mod:打包了适配服务端的Forge mod,不用手写任何通信逻辑,修改配置文件即可完成配对,对非技术型服主非常友好
开发路上的小坑与小惊喜
整个开发过程其实还算顺畅,没有遇到什么啃不动的技术难点,大多是边写边调,遇到问题就解决问题。不过还是有几个印象很深的细节,也是个人开发里最有实感的部分。
第一个s,是异步操作的坑。最开始写通信逻辑的时候没太注意,用了同步的网络请求,结果测试的时候直接踩了大雷:消息转发的时候,会直接导致MC服务器卡顿,甚至出现短暂的主线程阻塞。毕竟MC服务端的核心逻辑是单线程的,同步网络IO会直接占用主线程资源,不卡才怪。后来把所有的网络请求、消息监听逻辑全部换成了异步实现,基于aiohttp做HTTP通信,才彻底解决了卡顿问题,最终的转发延迟极低,游戏内完全感知不到。
第二个:原来在MC的服务端mod里,能直接跑一个完整的HTTP服务器。最开始设计双向通信的时候,还以为要做很复杂的跨进程通信方案,结果尝试之后发现,直接在mod里起一个轻量HTTP服务,监听指定端口的请求,就能顺畅地接收QQ端转发的消息,同时把游戏内的聊天消息POST出去,实现起来比我预想的简单太多,当时还挺惊喜的——原来MC的mod能做这么多超出游戏本身的事。
第三个差点把我搞懵的,是进程卡死的bug。第一版写完测试的时候,发现一个很离谱的问题:关闭MC服务器的时候,进程居然卡着退不出去,甚至还能正常收到QQ端发过来的消息。排查了半天才定位到问题:HTTP服务器没有在游戏关闭的时候正确销毁,端口还被占用,事件循环也没有正常关闭,直接把进程锁死了。后来我加了游戏生命周期的监听逻辑,在服务器关闭的回调里,手动停止HTTP服务、释放端口、关闭事件循环,才彻底解决了这个卡死的问题。
关于插件的优势,和一些小遗憾
很多朋友可能会问,这个插件和市面上其他的群服互联工具比,有什么核心优势?说实话,我自己觉得,它没有什么特别亮眼的、颠覆性的优势。它唯一的核心价值,就是填补了AstrBot生态里,群服互联插件的空白。
对于已经在用AstrBot搭建QQ机器人的MC服主来说,不用再额外部署一套其他的机器人框架,不用做复杂的环境适配,直接在AstrBot插件市场安装,简单几步配置就能用,足够轻量化,也足够开箱即用,这就是它最大的意义。
当然,它也有很多不足。毕竟是为了解决自己的刚需,快速迭代出来的插件,代码和安全设计上,肯定没有专业工具那么完善,甚至还有一些我自己都知道的隐藏安全问题,这也是它没能通过AstrBot官方安全审核的原因。这里也和大家提前说明,如果要在生产环境的服务器里使用,一定要做好网络隔离、强密钥管理,尽量不要把服务端口直接暴露在公网。 
简单的使用指引
如果有和我有同样需求的MC服主,想要试试这个插件,可以直接去我的GitHub仓库查看完整的部署文档,仓库地址:https://github.com/huntersxy/astrbot_plugin_qcm
这里也给大家梳理一下核心的部署步骤,全程不用写代码,跟着配置就能用:
- AstrBot端配置:在AstrBot插件市场安装qcm插件,在需要接收推送的群聊里发送
/get_umo获取会话ID,在插件管理面板,配置好目标MC服务器URL、目标群号、会话ID、AES密钥、服务端口等核心参数 - MC端配置:将仓库里配套的mod文件放入MC服务端的mods文件夹,启动一次服务器,会自动生成配置文件;编辑配置文件,填写AstrBot端的通信地址,保持AES密钥、消息前缀和AstrBot端完全一致,重启服务器即可
- 配对测试:分别在QQ群和MC游戏内发送一条测试消息,确认两边都能正常收到,就完成了全部部署
最后想说的话
至于这个插件后续的更新规划,说实话,我目前还没有特别明确的想法。现在的1.0.0版本,已经实现了我最核心的需求——QQ群和MC服务器的双向消息互通,自己日常用起来已经完全够用了。
如果后续大家试用的时候,有新的功能需求,或者发现了bug,欢迎去GitHub仓库提issue或者PR,我会尽量抽时间维护。当然,如果有大佬愿意帮忙优化安全问题、完善功能,那就再好不过了。
其实做这个插件的整个过程,最开心的不是写完了多少行代码,而是自己遇到的一个刚需问题,从找不到解决方案,到自己动手把它实现出来,还能分享给有同样需求的人。这大概就是开源的乐趣吧,哪怕它只是一个很小、很简单的插件,也能给别人带来一点点便利。
最后,感谢AstrBot项目提供的完善的插件开发框架,也感谢愿意试用这个插件的每一位朋友。