跳到主要内容

Puppet-Whatsapp 1.0 发布!

· 8 分钟阅读
高原

Puppet-Whatsapp 已经发布了一年多了(当时的公告在这),但是项目还仍旧处于 Alpha 阶段,功能上仅支持扫码登录和文字消息的收发处理。句子互动 近期打算在产品中支持 Whatsapp 的功能,所以我们着手开始优化 Puppet-Whatsapp 这个项目。

主要目标

让 puppet-whatsapp 达到商业化 Beta 标准

为了达成这个目标,我们从一下几个方面开始了优化:

  • 优化代码结构
  • 提高稳定性
  • 增强功能性

优化代码结构

代码结构关系到了程序应用结构,在我们开始优化之前,我们浏览了一遍代码,发现 Alpha 的版本里,大部分的代码都写进了一个巨大的 PuppetWhatsapp 类中。对于一个 Alpha 阶段的 puppet,这样是完全没有问题的,但是整体的可扩展性和灵活性都会被整个结构所限制。为了保证这个 Puppet-Whatsapp 能够达到商业化 Beta 要求,我们需要搭建一个更好的结构基础。基于我们之前的经验,我们从之前的代码中抽取出了一下两个组件:

  • WhatsappManager:主要负责一切和 whatsapp-web.js 交互有关的逻辑和实现
  • 'mixins':将不同实体对象的方法分别实现在不同的 mixin 里面

除此之外,我们还增加了额外的一层抽象,PuppetManager。有了 PuppetManager,我们可以将大部分的逻辑从 PuppetWhatsapp 里面抽取出来,使得整个类简单易读。

提高稳定性

稳定性对于一个商业级可用的 puppet 来说,是非常重要的。

登录状态持久化

一般来说,对于一个 puppet 项目,提高稳定性的第一步往往都是将登录状态持久化。做这件事情主要有以下两个好处:

  1. 在开发阶段提供便利:当修改了代码,重新启动应用的时候,不需要手动扫码登录,可以直接登录进来
  2. 更好的维护稳定性:当程序运行过程中遇到了一些未知的状态,导致程序卡住或者崩溃,我们可以非常自信的增加一个检测并重启的逻辑,来让程序自恢复稳定性

所以我们花了不少时间在这个登录状态持久化上。我们在这个过程中还发现了一些 whatsapp-web.js 里面的一些问题,但是为了保证项目能按时完成,我们自己 fork 了 whatsapp-web.js 这个项目,快速修复了问题,然后引用在了 Puppet-Whatsapp 里面。我们计划后续完成了 Puppet-Whatsapp 之后,再把对应的 PR 提交到 whatsapp-web.js 中。

请求调用控制

whatsapp-web.js 是通过 puppeteer 控制了网页版的 whatsapp 应用,所以 api 的调用频率和数量是需要被慎重对待的。如果我们调用频率太快,那么可能会造成 puppeteer 的崩溃,如果我们调用的数量太多,有可能会触发 whatsapp 的风控机制,进而造成一些不稳定的情况。所以请求调用控制是保证 puppet 稳定性的一个关键点。

为了控制调用的请求,有两个方式可以优化,且这两个方式都很重要

  1. 程序中增加逻辑来控制调用频率
  2. 使用缓存了减少读数据的请求

Request Manager

我们封装了一个新的类叫做 RequestManager,我们用这个类来处理一切发送到 whatsapp 的请求。在这个 RequestManager 内部,我们又封装了另外一个类叫做 RateManager,这个类是专门来进行频率控制的。这个类可以实现针对不同类型的请求做单独的频率控制或排队。想要了解更多详细的信息,可以来看看这个 PR

Cache Manager

我们封装了新的类 CacheManager 来管理不同的缓存。我们使用了 flash-store 作为底层的数据持久化存储,其实,这个库已经是 puppet 的老朋友了,之前很多不同的 puppet 都是用这个库来做的数据持久化存储。

有了 CacheManager,发送到 whatsapp 的读请求就可以很好的被控制下来。从我们之前的经验看,这个是可以显著减少对于 IM 的读请求数量的。

增强功能性

当初实现的 Alpha 版本只支持文本消息的收发,对于一个企业级的 puppet 来说,功能就太过于基础了,所以我们开始在 Puppet-Whatsapp 中增加更多功能

参考新版本的 Wechaty 1.0 mixin 的设计,我们决定也用 mixins 来实现所有新的功能,所以我们新增了 7 个mixins。

其中一些 mixin 可能只有一些没有实现的方法,但是这些方法作为一个占位符方便未来实现这些功能。

鸣谢

以上的这些工作都完成之后,我们在这很高兴的宣布:Puppet-Whatsapp 1.0 发布!

感谢以下在这次项目中做出贡献的开发者们:

新晋 Puppet-Whatsapp 维护者

为了奖励在 Puppet-Whatsapp 1.0 项目中卓越贡献的开发者们,Wechaty 作者,Huan,公布了两名新的 Puppet-Whatsapp 维护者:SuperChangNickWang。Huan 赠与了他们每人一件 Github T恤,一包 Github 贴纸和一枚 Github 胸针作为礼物。另外,为了奖励 SuperChang 在 Wechaty 社区里的持续贡献,Huan 还另外赠与了一个 Github 限量款水杯。

Reference

代码仓库:https://github.com/wechaty/puppet-whatsapp

主要 Issue:https://github.com/wechaty/puppet-whatsapp/issues/263