名奢网 名表 查看内容

桔子互动|给微信机器人添加热重启功能

2023-5-7 11:57| 发布者: fuwanbiao| 查看: 82| 评论: 0

放大 缩小
简介:Wechaty解决了很多我在使用微信运营过程中的痛点问题,这里就不再一一赘述了。同时Wechaty的API设计简洁优雅,部署方便也是另外一个吸引我的地方。快速上手后,在开发调试过程中,修改代码需要频繁重启Wechaty程序。 ...

Wechaty解决了很多我在使用微信运营过程中的痛点问题,这里就不再一一赘述了。同时Wechaty的API设计简洁优雅,部署方便也是另外一个吸引我的地方。


快速上手后,在开发调试过程中,修改代码需要频繁重启Wechaty程序。相信绝大多数人都有着类似的问题, 下面就聊一聊怎么避免类似问题。


1. 问题分析


在开发调试过程中,修改代码后必须重启Wechaty程序。每次重启大概会花上30s-60s左右。还需要开发者频繁扫码登陆,对于在调试阶段的程序来说,成本还是很高的。因此考虑从这里入手看能否优化这里的启动时间。


对于扫码登陆的问题,从Wiki中找到答案


wiki中的答案详见:https://github.com/Chatie/wechaty/wiki/API#wechaty-class


Wechaty.instance(profile:string): Wechaty


profile(OPTIONAL): profile name. if a profile name is provided, wechaty will save login status to it, and automatically restored on next time of wechaty start(restart).


can be set by environment variable: WECHATY_PROFILE

也就是说设置一个profile就可以记住登录态,避免重启时的重复扫码动作。 扫码问题可以得到解决,那么30-60s的启动时间是否还可以进一步优化呢?那就得弄清楚这30s的时间里,程序都在做什么。


通过查看源代码 browser-driver.ts 发现,在执行init时,程序会启动一个driver,可以看作是打开了一个浏览器,然后获取浏览器 session,重复尝试三次直到失败。这里是Wechaty运行的基础,我们没有办法从这里去避免这30s的时间开销。只能从另外的方面去思考。


源代码browser-driver.ts详见:


https://github.com/Chatie/wechaty/blob/master/src/puppet-web/browser-driver.ts


2. Node.js 热重启


这里实际就是Node.js本身的特性了,与Wechaty本身关联不大。可能通过监听文件改动从而动态加载模块内容,这里首先就要了解Node.js的模块缓存机制,参看module.js关键代码:


桔子互动|给微信机器人添加热重启功能


如果Node.js已经require某个模块后,模块更新后,再次require这个模块时,实际读取的是内存中的原模块的缓存。除非手动清除掉require.cache的内容,这样才能重新加载更新后的模块内容。因此参照Node.js源码写出require缓存清除方法:


桔子互动|给微信机器人添加热重启功能


再利用fs.watch或者chokidar之类的库完成文件监听功能,实现文件改动后重新加载模块:


桔子互动|给微信机器人添加热重启功能


3. 逻辑抽离


在使用Wechaty的时候,开发者更多的是关心事件响应,比如响应扫码事件、好友请求事件、发送消息事件等等。因此可以单独将这些响应事件抽离出来。如果我需要关注好友请求事件,那么我就添加一个friend.js去处理。如果我需要关注发消息事件,那么就去添加一个message.js去处理。相反,不需要了我删除掉该js文件即可。每一个文件就是一个事件处理器。代码如下:


桔子互动|给微信机器人添加热重启功能


4. 整合


接着就是整合逻辑代码与热重启功能,让每个事件处理器都具有热重启功能。


桔子互动|给微信机器人添加热重启功能


检测到./listener目录下的文件改动后,自动删除原来事件监听并且更新,这样就完美的实现了Wechaty免重启开发调试了。


最后,还需要一个环境变量来区分开发模式和线上模式,在线上模式中就不需要使用热重启功能。


桔子互动|给微信机器人添加热重启功能


这样就可以通过以下命令来进入开发模式或者线上模式了。


桔子互动|给微信机器人添加热重启功能


附热重启机器人效果图:


桔子互动|给微信机器人添加热重启功能


到这里就基本介绍完了本篇文章的全部内容了,可以使用example代码来体验。


example代码详见:


https://github.com/Chatie/wechaty/tree/master/example/hot-reload-bot


作者:Gcaufy, Tencent, Wechaty Contributor


作者资料详见:https://github.com/gcaufy


【文章最初版本来自http://blog.chatie.io/由桔子互动(BotOrange)联合发布】


博客地址:http://blog.chatie.io/


Github地址:https://github.com/chatie/wechaty



路过

雷人

握手

鲜花

鸡蛋