Wechaty 介绍及其工作原理

什么是 Wechaty

微信机器人这个功能,目前在市面上运用的还不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群;也有的为了机器人对话聊天等等一系列。

但是到目前为止,微信尚无任何官方的微信机器人 API 发布。而 Wechaty 正是一个开源的微信机器人 SDK。

目前关于 Wechaty 的源码,都可以在 Github 上找到。截止到2021.8月为止, Wechaty 已拥有 10.8k 的 star。

Wechaty Github 官方仓库

实现原理

这种非官方的 SDK,实现方法都大同小异,绝大部分是基于 Hook 来实现的,其中 Hook 也分 Web Hook 和 客户端 Hook。

这里解释一下,所谓 Hook 就是通过抓包,分析出官方比如发送消息时,官方发送的 TCP 包里面的内容。之后向相同接口,发送相同 TCP 报文内容,即可达到自己也能发送消息的目的。

Hook 难度是比较大的,因为虽然抓包比较简单,但是当你抓到报文后,如果你想对其进行更改,那么还需要去进行逆向,即将报文进行解析,而这个解析的过程又设计到数据的加密等等,因此 Hook 往往费心费力。

相比之下 Web Hook 难度会小点,Web Hook 一般所使用的协议是 HTTP(也有 HTTPS,因为也有加密所以 HTTPS 难度会高一些),而 HTTP 是一种明文的协议,只需要使用 Chrome 等工具即可 Hook。但是需要官方原生支持网页版,才能进行 Web Hook,否则只能选择难度较大的客户端 Hook。

最开始的 Wechaty

关于 Wechaty 发布的初衷,起初是因为项目的创始人,他是一个留学生。当时他在做一个关于国外租房的项目,就是给同样是留学生的人推荐房子去租,并从中收取费用。

因为自己平时联系人比较多(据称当时达到 12859 人,而群未读信息 1000+),而其中大部分的问题是重复的信息。创始人刚好也会写代码,喜欢开源,因此就想着开发出一款微信机器人,能够自动回复被反复问的问题,从而节省自己的时间。

一开始的 Wechaty,使用的是 Web Hook,当时微信网页版刚刚兴起。在2016年左右,Wechaty 创始人基于微信网页版,很快在 Github 上发布了自己的第一个版本。Wechaty 受到大家的欢迎,当时在 Github 上收获了 300 多个 star。Wechaty 第一个版本支持热加载,只支持微信。

创始人看到项目受到大家的欢迎后,并继续维护这个项目。

重构后的Wechaty

好景不长,在 2018 年左右,发生了一件大事,即微信官方对网页版的登录进行限制,导致大量使用 Wechaty 的用户无法继续使用。与此同时,Wechaty 社区中出现了非网页版登录,即上文所说的客户端 Hook。

于是 Wechaty 进行了重构,引入了 "Puppet" 这个概念,并且 Wechaty 不再专注了微信,而是把眼光放在了所有即时聊天工具上(IMs)。这也是我们今天在 Github 上看到的版本。

在现在的 Wechaty 中,一共有三种角色,分别是 "Wechaty","Puppet","IMs"。接下来我将一一介绍这三种角色。

Wechaty 架构图

首先是 Wechaty 本体,这里说的 Wechaty 是重构后的版本。

我们可以在 Wechaty 本体这里编写相应的交互逻辑代码。比如可以编写,当收到 "Ping" 之后,回复一个 "Pong"。同时,Wechaty 最初的版本是使用 TypeScript 进行编写,但目前 Wechaty 已支持多语言版本。

Wechaty 多语言版本支持

而 Puppet,翻译是叫作傀儡,我们可以理解为一层中间件。

前文说到的 Hook,就是在这一层。开发人员把 Hook 之后的成果,进行封装,便成了 Puppet。

整个系统通信交互过程是这样的,平时我们在 Wechaty 本体中,可以用多语言写相应的交互逻辑代码,Wechaty 本体负责和 Puppet 通信,而 Puppet 负责和 IMs 通信。

Puppet 起到了中间件的作用,屏蔽了 Wechaty 和 IMs 具体的通信过程,普通使用者只需要写相应的交互逻辑代码即可。并且在使用多语言版本 Wechaty 时,不需要用各自的语言去再 Hook 一遍。

目前 Puppet 也支持多版本,比如网页版,iPad,Windows 等等。大家在使用时,可以随意切换通信协议。但是目前除了网页版外,其他版本的 Puppet 都要钱。

PS:这也是典型的开源软件商业模式,即代码开源但是服务要钱。

Puppet 架构图

而 IMs,前文说到,如今的 Wechaty 已将目光放在所有即时通信工具上。现在打开 Wechaty 的官方仓库,可以看到 Wechaty 已经实现了 Whatapps,飞书,Gitter,钉钉的聊天机器人。

但相应的,如果要实现飞书机器人,那么就要实现飞书对应的 Puppet。

Wechaty 目前支持的 IM 列表

总结

机缘巧合之下,我接触到了 Wechaty 这个项目,起初是因为听了 Wechaty 官方人员的讲座,介绍了 Wechaty 2016 以来的开源之路。

随即报名了 Wechaty 飞书项目的完善,虽然最后没有被选上,但还是对 Wechaty 比较感兴趣,觉得是一个很不错的项目。

所以写了一篇博客来介绍一下 Wechaty,并且写了官方文档中没有提及的工作原理。也希望对大家有做帮助。

西楼

西楼

粤ICP备2021121522号