惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
G
GRAHAM CLULEY
S
Schneier on Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
IT之家
IT之家
阮一峰的网络日志
阮一峰的网络日志
Recorded Future
Recorded Future
I
Intezer
云风的 BLOG
云风的 BLOG
博客园 - Franky
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
T
Tenable Blog
The Hacker News
The Hacker News
T
The Blog of Author Tim Ferriss
Attack and Defense Labs
Attack and Defense Labs
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
N
News and Events Feed by Topic
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Secure Thoughts
The Register - Security
The Register - Security
B
Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
The Cloudflare Blog
Webroot Blog
Webroot Blog
W
WeLiveSecurity
H
Heimdal Security Blog
博客园 - 三生石上(FineUI控件)
V
Vulnerabilities – Threatpost
G
Google Developers Blog
O
OpenAI News
V
V2EX
罗磊的独立博客
博客园_首页
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
TaoSecurity Blog
TaoSecurity Blog
Cloudbric
Cloudbric
H
Hacker News: Front Page
博客园 - 叶小钗
T
Tor Project blog
AI
AI

犀利豆的博客

《SRE google 运维解密》读书笔记 (六) 《SRE google 运维解密》读书笔记 (五) 《SRE google 运维解密》读书笔记 (四) 《SRE google 运维解密》读书笔记 (三) 《SRE google 运维解密》读书笔记 (二) 《SRE google 运维解密》读书笔记 (一) 2021 总结 Vertx入门到实战—实现钉钉机器人内网穿透代理 钉钉机器人回调内网穿透代理--使用篇 周末补习(一)trie 树 那些有趣的代码(三)--勤俭持家的 ArrayList 那些有趣的代码(二)--偏不听父母话的 Tomcat 类加载器 那些有趣的代码(一)--有点萌的 Tomcat 的线程池 从需求第三定律说起--为什么知乎的回答质量下降了 如何利用 Spring Hibernate 高级特性设计实现一个权限系统 居然有人能忘记吃饭?写个微信机器人提醒他 我的2018年总结 从 LongAdder 中窥见并发组件的设计思路 徒手撸框架--实现 RPC 远程调用 我的写作工具链 Java 渲染 docx 文件,并生成 pdf 加水印 撸码的福音--变量名生成器的实现 Raft 协议学习笔记 dubbo 源码学习(一)开篇 Redis 命令的执行过程 Redis 中的事件驱动模型 Redis 数据库、键过期的实现 Redis 的基础数据结构(三)对象 Redis 的基础数据结构(二) 整数集合、跳跃表、压缩列表 Redis 的基础数据结构(一) 可变字符串、链表、字典 线程池 execute() 的工作逻辑 JAVA 中的 CAS 徒手撸框架--高并发环境下的请求合并 徒手撸框架--实现Aop 徒手撸框架--实现IoC 2017个人总结 最近遇到的几个问题集合 Redis RedLock 完美的分布式锁么? JAVA 8入门(二)流 JAVA 8入门(一)Lambda表达式 有道 Alfred Workflow 威力加强版 Kafka实现原理笔记 《交易系统:更新与跨越》读后笔记 Netty-Apns接入实现 Future研究 Hystrix入门研究 Redis实现分布式锁
终于有一个 Java 可以用的微信机器人了
Zhengxin Diao · 2020-06-03 · via 犀利豆的博客

终于有一个 Java 版的微信机器人了。

公众号很久没有更新了。主要两个原因,换了工作之后,第一,要花更多的时间去了解和学习新的业务。第二,我最近把几乎所有的业余时间都来写这个 Java 版的微信机器人了。

java-wechaty

Wechaty 是什么

官网的描述是:

  • A Conversational AI RPA SDK for Chatbot

其实就是一个能够快速构建聊天机器人的开源 SDK。最早的时候,Wechaty 只是一个基于服务于微信工具库,现在逐渐的发展到可以对接世面上的主流聊天软件包括不限于:微信,企业微信,钉钉,Line 等。

编程语言也由原来的单一语言(TypeScript) 发展到,Java,Scala,Python,Go 等多语言实现的工具库了,同时社区生态还在不断的壮大。

Github 地址:https://github.com/wechaty/wechaty 目前已经有 7.9k 的 star 了。

与 Wechaty 结缘

之前的工作,老板有一个要求,是就每天下班后,发一封邮件日报简单描述一下今天工作进展。如果忘记发日报,第二天就负责整理 全组人的日报。作为一个健忘的人,忘记发日报简直就是家常便饭。

于是就考虑需要一个机制:

  • 每天提醒我发日报
  • 动作尽可能简单,且自动化。

当时就想能不能在微信上有一个机器人,每天定时提醒我发日报,而且只要回复这个机器人,他就能够把我回复的消息,按照固定模板生成日报并发送给老板。这样既不会忘记,也能简单自动化的完成这个工作。

一顿 Google 还真找到了 Wechaty 这个工具。尝试写了一个日报机器人满足了我的需求。于是再接再厉,又写了一个提醒女朋友吃饭的工具,但是因为不熟悉 TypeScript。写出的机器人没法停止,变成了一个信息轰炸机,差点被拉黑。居然有人能忘记吃饭?写个微信机器人提醒他

就是因为这篇文章,还结识了 Wechaty 的作者李佳芮。现在她的公司已经估值很多个 0 了。

由于我的主要工作语言是 Java ,对 TypeScript 还是了解不多,就暂时放下了。

Java 版的 Wechaty

在 Wechaty 的某个版本后,开始支持 GRPC 作为传输协议。这个时候我觉得多语言开发的环境就比较成熟了。于是我就开始尝试写一个 Java 版的 wechaty。

Java vs Kotlin

Wechaty 使用 TypeScripe 开发,在移植的过程中,发现要实现 TS 版对应的功能,Java 所需要的模板代码就太多了,开发起来效率不够快。于是就考虑可不可以使用 Kotlin 来构建 Java-wechaty sdk。

Kotlin 有以下特性感觉比较适合 Wechaty 的开发:

  • Java 和 Kotlin 之间可以无障碍的互相操作
  • 在 Kotlin 中,函数也是第一公民,可以脱离类的存在,这一点在移植 TS 代码的时候优势就比较明显了。
  • 空指针安全,之前写 Java 的时候,受够了一步一检查。Kotlin 在语言层面就解决了空指针安全的问题。写起来有效的减少心智负担。
  • Kotlin 是务实的,更有表现力的语言。语法更加接近 TS 和 GO,相对 Java 来说更加简洁。

事件驱动

TS 版的 Wechaty 是基于 Nodejs 开发的,一个典型的事件驱动的架构。在开发初期我就自然想到了使用 Vertx 框架来开发。但是开发一段时间后发现,其实 Vertx 是一个事件驱动的网络框架。主要解决的还是网络相关的问题,放到 Java-wechaty 中还是太重了。

于是移除了代码中的 Vertx 框架,自己参考 Nodejs 中的 EventEmitter 实现了 Kotlin 版的事件驱动组件。

整体架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  +--------------------------+ +--------------------------+
| | | |
| Wechaty (TypeScript) | | Wechaty (Java) |
| | | |
+--------------------------+ +--------------------------+

+-------------------------------------------------------+
| Wechaty Puppet Hostie |
| |
| (wechaty-puppet-hostie) |
+-------------------------------------------------------+

+--------------------- @chatie/grpc ----------------------+

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

+--------------------------+ +--------------------------+
| Pad Protocol | | Web Protocol |
| | | |
| wechaty-puppet-padplus | |(wechaty-puppet-puppeteer)|
+--------------------------+ +--------------------------+
+--------------------------+ +--------------------------+
| Windows Protocol | | Mac Protocol |
| | | |
| (wechaty-puppet-windows) | | (wechaty-puppet-macpro) |
+--------------------------+ +--------------------------+

通过这个图可看到,Wechaty 的结构设计还比清晰。利用 Puppet 的架构,将真正的通信协议和具体的 IM 软件进行了隔离。基于这一点不同的语言基于 Puppet 的协议就可以进行多语言开发。

好用么

感谢 Wechaty 前期良好的 API 设计几行代码就可以开发自己聊天机器人:

Demo 1:

1
2
3
4
5
6
7
8
9
class Bot{
public static void main(String args[]){
Wechaty bot = Wechaty.instance()
.onScan((qrcode, statusScanStatus, data) -> System.out.println(QrcodeUtils.getQr(qrcode)))
.onLogin(user -> System.out.println("User logined :" + user))
.onMessage(message -> System.out.println("Message:" + message))
.start(true);
}
}

这个 Demo 6 行代码,就实现了机器人的扫码登录,接受消息的功能。同时现在 Java-wechaty 还支持可插拔的插件。利用插件,可以更简单的构建机器人。

Demo 2:

1
2
3
4
5
6
7
8
9
10
class Bot{
public static void main(String args[]){
Wechaty bot = Wechaty.instance()
.use(
WechatyPlugins.ScanPlugin(),
WechatyPlugins.DingDongPlugin(null)
)
.start(true);
}
}

随着插件的原来越丰富,可能以后,用户只需要组合各种插件,就能达成自己的需求,尽量的做到低代码开发。

现在达到什么程度了

目前 Java-wechaty 已经完成了 TS 版的功能的移植。

实现了基础的的聊天,好友管理,群管理功能。接下来的开发就会集中在 API 的打磨,稳定性的提升。同时也期待你的加入为 Java-wechaty 贡献代码。

从 Java-wechaty 中能得到什么

  1. 真正的参与开源代码的贡献。
  2. 在 Maven 中央库,发布了自己的 Jar 包。
  3. 认识了各种各样小伙伴,包括写了 25 年程序的天使投资人 @Huan。
  4. 在写 Java-wechaty 的时候,不断的参考伙伴们的 TypeScript,Go,Python 代码,从实际的角度去审视各种编程语言的特性。探寻语言各个特性设计的初衷。

期待你的加入

Wechtay 社区加入了由 中科院软件所openEuler 社区 共同举办的一项面向高校学生的暑期活动《开源软件供应链点亮计划-暑期2020》。

详情见: https://github.com/wechaty/summer-of-code

Wechaty 给学生们提供了很多有意思的题目,比如:

  1. 利用 AI 技术,开发一个 AI 斗图机器人
  2. 利用 Wechaty 的插件技术,开发一个“每日一句”插件,替你向妹子嘘寒问暖的”撩妹“机器人
  3. 还有偏向工程的,代码移植工作,让学生真正的参与到开源项目其中

开发语言涉及,TypeScript,Go,Java,Kotlin,Python 甚至还有 Scala,总有一个适合你。

希望看到这里的你,可以把篇文章,转发给学习计算机,或者对编程感兴趣的学生朋友,期待他们加入。

后记

Java-wechaty 项目地址。 加入我们你也可以六行代码写一个微信机器人。