wechaty 基础

本章知识点
  • Wechaty 基础概念
    • Wechaty 是什么
    • Wechaty 整体结构
  • 多语言Wechaty
    • Wechaty
    • Python-Wechaty
    • Java-Wechaty

Wechaty 基础

Wechaty是一个跨语言跨平台的对话机器人开发工具包(Conversational AI SDK),支持使用不同编程语言(TypeScript、Python、Java、Go等)使用一套代码开发不同平台(钉钉、飞书、WhatsApp、Teams等)的聊天机器人。那Wechaty给开发者提供了哪些功能接口?是如何支持多语言开发?以及让多种不同语言的Wechaty能够工作到一起的呢?

这一切都要从Wechaty是什么开始将起。

Wechaty 是什么?

Wechaty是一个开源聊天机器人框架SDK,于2016年发布于 GitHub,是一个基于 Apache-2.0 许可证的开源项目,具有高度封装、高可用的特性,支持 NodeJs, Python, Go 和 Java 等多语言版本。

经过4年多的发展,现在 Wechaty 开源社区已经拥有数十位 Committers,百余位 Contributors ,并被近万名 GitHub 开发者 Star 。使用 Wechaty 的开发者已覆盖数万人,并拥有基于微信群的数千人活跃开发者群。Wechaty 社区的 Contributors 遍布全球多个国家地区,和各大互联网公司,职业背景从程序员到设计师,从大学教授到创业者,非常多样化。GitHub 上有千余个开源项目基于 Wechaty 构建了聊天机器人,这些开发者用户也极大地促进了社区的活跃和发展。

Wechaty自身对代码质量的管理,使用了 GitHub Actions 的 DevOps 工具完成了 CI/CD 工作流,从自动化单元测试到自动打包集成测试,从自动发布 NPM 包到自动构建和发布对应版本的 Docker Image ,实现了全自动的社区代码发布,极大的提高了社区的协同效率。在开源社区管理上,Wechaty 遵循 The Apache Way ,拥有 PMC / Committer 管理制度,和完善的 Issue / PR / Release 等管理制度。

截止2020年,Wechaty 已经有超百万次 NPM 安装下载,并由社区自发推动了 Python, Go, Java, Scala, CSharp, PHP 等语言的适配和发布,是国内最活跃的 Conversational AI Chatbot 开发者社区。

Wechaty 支持的功能包括:接收消息,发送消息、添加好友、为好友备注、接受好友请求、发起群聊、加人入群等功能。只需要6行代码,你就可以 通过个人号 搭建一个 微信机器人功能 ,用来自动管理微信消息。

更多功能包括:

  • 消息处理:关键词回复
  • 群管理:自动入群,拉人,踢人
  • 自动处理好友请求
  • 智能对话:通过简单配置,即可加入智能对话系统,完成指定任务

Wechaty理论上是可以支持所有IM平台,未来也将持续开发不同平台的底层Puppet。Wechaty的多功能,高扩展性想必已经让各位开发者想深入了解了,那接下来我将给大家从整体结构层面介绍Wechaty是如何工作的?

特性

Wechaty 能够帮助开发完成IM平台对话功能的对接,主要包含如下功能:

  • 发送和接受:图片、语音、视频和文字消息。
  • 创建群聊、添加删除群成员以及修改群名等。
  • 通过手机或者平台唯一标识来搜索对应的联系人,并添加好友。
  • 编写一次,多平台运行。

Wechaty 整体结构

这个图应该需要重新画一下

  +--------------------------+ +--------------------------+
  |                          | |                          |
  |   Wechaty (TypeScript)   | |    Wechaty(Polyglot)     |
  |                          | |  Python, Go, Java, etc.  |
  +--------------------------+ +--------------------------+

  +-------------------------------------------------------+
  |                 Wechaty Puppet Service                |
  |                                                       |
  |                (wechaty-puppet-service)               |
  +-------------------------------------------------------+

+---------------------  wechaty_grpc  ----------------------+

  +-------------------------------------------------------+
  |                Wechaty Puppet Abstract                |
  |                                                       |
  |                   (wechaty-puppet)                    |
  +-------------------------------------------------------+

  +--------------------------+ +--------------------------+
  |      Pad Protocol        | |      Web Protocol        |
  |                          | |                          |
  | wechaty-puppet-padlocal  | |  (wechaty-puppet-wechat) |
  +--------------------------+ +--------------------------+
  +--------------------------+ +--------------------------+
  |     Friday Protocol      | |       Mac Protocol       |
  |                          | |                          |
  |  (wechaty-puppet-frida)  | |   (wechaty-puppet-mac)   |
  +--------------------------+ +--------------------------+

通过上图可以得知,整个Wechaty结构是分为四个部分:Wechaty上层接口层、Wechaty Puppet Service 服务层、Wechaty Puppet Abstract 抽象层以及 各种Puppet协议层。

多语言Wechaty接口层

其中Wechaty属于上层接口,主要是面向开发者,提供了非常人性化的接口以及多种语法糖,能够很快的上手各种定制化功能的开发,而且每个模块的相似功能的接口名称都很类似,大大减小了不同模块之间的学习难度。比如向联系人和群聊中发送文本消息的代码非常类似:

let msg: string = 'hello world'

// 某个联系人对象
await contact.say(msg)
// 某个群聊对象
await room.say(msg)

以上代码以TypeScript语言为例,给大家演示了Wechaty提供给开发者的其中一个接口,还有很多类似的功能非常强大的接口等待着大家去发掘。

而除了TypeScript和JavaScript语言版本的Wechaty之外,还有多种不同语言的Wechaty上层接口,比如Python-Wechaty、Java-Wechaty、Go-Wechaty、PHP-Wechaty等,每种语言的接口封装都是类似的,基本上保持了一直,不过会根据不同语言有不同的函数命名习惯。

比如当使用Python-Wechaty来编写以上发消息的代码时,大家会发现与此非常类似:

msg: str = 'hello world'
await contact.say(msg)
await room.say(msg)

当然如果你是其他语言的开发者,看到这里的代码时,相信大家已经能够举一反三,自行调用对应语言下的对应接口,实现自己的业务功能开发。

如大家所见,最上层的Wechaty仅仅是一个面向开发者的接口,而且还有多种编程语言的实现,那是如何使用上层接口来实现对应IM平台的对接的呢?

Wechaty Puppet Service 层

Puppet Service层能够给不同语言下的Wechaty提供统一的接口服务,这样就只需要一个后端服务便能够支持所有语言下的Wechaty的连接,在一定程度上大大减小了开发工作量与维护成本。

TODO: 图一 后续时需要再进行更改的。

根据图一即可看出,多语言下的Wechaty是依赖Wechaty Puppet Service的,因为此层才是最终和对应IM平台对接数据的层。比如要使用Wechaty编写基于钉钉平台的机器人,此时最上层使用哪种语言的Wechaty都无所谓,不过都会使用一个底层Pupppet Service:wechaty-puppet-dingtalk

这个Service将会以gRPC的方式来暴露服务,给不同语言Wechaty来调用,此时就屏蔽了不同语言下的实现区别,减少了底层服务的开发和维护的工作量。否则不同语言下的Wechaty都会实现一套底层的协议Puppet,一方面工作量非常打,另一方面无法保证所有语言的实现都能够保持一致。

可是当要开发一个新版本的底层IM平台协议时,为了保证不同协议对上层提供统一的服务,此时需要有一个抽象接口层来保证所有协议对外的一致性,这层便是Wechaty中一个非常重要的Puppet抽象曾。

Wechaty Puppet Abstract

此抽象层主要是为了解决上层Wechaty的依赖性问题,比如说给某个联系人发消息这个功能是需要调用底层Puppet的多个不同的功能从而实现,其中可能包括发送文字消息,图片消息,语音消息,富文本消息等,然而此时底层会有多种不同协议Puppet,其中包括面向钉钉平台的Puppet、面向飞书平台的Puppet以及面向其他平台的Puppet,而具体使用哪一种协议由用户在实际的开发中决定。

可是在项目定义层,是不需要依赖于某个具体的协议,而是基于抽象接口开发即可,这样便屏蔽了不同IM平台底层实现的细节区别,让所有平台的对话操作统一于标准的接口之上。

再次先使用一个基础的代码来演示这个过程:

import {WechatyPuppet} from 'wechaty-puppet';
import {Wechaty} from 'wechaty';

puppet = WechatyPuppet()
bot = Wechaty(puppet)

此时的WechatyPuppet实际上只是一个没有任何底层具体实现的抽象层模块,而具体的puppet实现是在运行时决定的,这也是软件设计中减少模块之间的耦合性最常用的方法之一。

可是在实际的代码编写时,需要指定某一个具体的协议,例如在以下代码中使用了面向钉钉平台的底层Puppet:

import {PuppetDing} from 'wechaty-puppet-dingtalk';
import {Wechaty} from 'wechaty';

puppet = PuppetDing()
bot = Wechaty(puppet)

在以上代码中,PuppetDing就是在运行时指定的协议Puppet,所以能够运行在顶顶平台上。如果将PupppetDing换成PuppetLark即可让机器人运行在飞书的平台上。

此类设计时软件开发中常见的设计方法,相信很多有一定经验的开发者看到这里会非常熟悉,也希望初级开发者能够在实际的项目开发中多多考虑系统的设计,尽量实现高内聚,低耦合,将不同功能模块给抽离出来,这样系统在重用性和可维护性上会有一定的提升。

Covnersational SDK

Wechaty 是一个对话型的SDK,主要为了解决对接不同对话平台之间纷繁复杂的细节,只需要使用一套代码即可实现完整对接。

什么是对话?

语言交流在人们的生活工作当中占据着举足轻重的地位,是任何生产生活都离不开的一件事情。而在现代的对话过程中,会存在多个社交平台,比如微信、钉钉、飞书以及国外IM软件WhatsApp等,还存在多种对话媒体,比如文字、图片、语音以及视频等等,这些都是在人与人之间的对话的一种方式。

在互联网行业当中有一句话是非常重要:得社交者得天下,现在很多公司都想做社交这块,是因为这个能带来很多流量,从而 给公司带来更多的可能性。而如果没有一个好的对话体验,将没有办法留住客户。

用户对话接口

TODO: 此处的逻辑需要进行转化

用户对话接口(Conversational User Interface,CUI)是计算机的用户界面,它可以模拟与真人的对话。历史上,计算机依赖于基于文本的用户界面和图形用户界面(gui)(如用户按下“返回”按钮),将用户期望的操作转换为计算机能够理解的命令。

在聊天界面的帮助下,聊天机器人可以根据用户的查询与用户进行聊天。这个应用程序最好的地方是:你可以和其他很多应用程序一起使用,可以毫无障碍地建立方便的沟通。

人工智能对话

对话型人工智能是一种技术,它使计算机能够像人类一样说话和交流。它允许聊天机器人等人工智能技术以人道的方式与人互动。通过弥合人类和计算机语言之间的鸿沟,它使两者之间的交流变得容易和自然。

和其他人工智能机制一样,聊天机器人将被用来提高人类的能力,解放他们,让他们变得更强大。

自动化机器人

什么是自动化机器人

机器人流程自动化是一种技术,它允许今天的任何人配置计算机软件,或一个“机器人”来模拟和集成人类在数字系统中交互的动作,以执行业务流程。RPA机器人利用用户界面捕获数据并像人类一样操作应用程序。它们解释、触发响应并与其他系统通信,以便执行各种各样的重复性任务。只有本质上更好:一个RPA软件机器人从不睡觉,不会犯任何错误

为什么需要自动化机器人

会话RPA (cRPA)连接任何聊天机器人系统到会话AI。我们作为发布在GitHub上的SDK开发了这个模块,这个模块可以设置为企业喜欢的任何对话AI/聊天机器人系统。