今天在钉钉的群组里面加了一个 Coding.net 的机器人,但是按照官方给出的设置方法不能实现代码 commit 的消息提醒,于是尝试了使用自定义机器人进行配置,顺便了解了一下什么是 webhook

什么是 webhook

网络钩子是“用户定义的HTTP回调”。网络钩子通常被某些事件激活,比如将代码推送到源或评论博客。当此事件发生时,原网站将向为网络钩子配置的URL发送HTTP请求。用户可配置它们引发网页上的事件以调用另一个网站的行为。此操作可为任何事件。

这是来自维基百科的定义,webhook 的中文直译叫做“网络钩子”,“网络钩子通常被某些事件激活,比如将代码推送到源或评论博客”。我觉得这句话很好的概括了 webhook 是什么和适用场景。

webhook 与 API 的区别

API 是如何工作的

API 的工作方式就像上中画的这样,每次都是由客户端发送一个请求,然后服务端返回数据给客户端

webhook 是如何工作的

而 webhook 不太一样,服务端会主动给客户端发送数据,然后客户端返回一些状态码给服务端。

还是不太了解 webhook 能干什么?没关系,接下来会从 webhook 适用的两个场景来了解一下。

webhook 适用的场景

消息订阅 subscribe

用过团队协作工具的人一定不会陌生,比如钉钉、Slack、Telegram中都会有一些消息订阅的机器人,比如有人在 Github 的某个仓库做了一次提交,就可以通过这些机器人获取到消息。这中间必不可少的就是 webhook。

钉钉 + Coding.net 自定义机器人实践

一开始使用的钉钉自带的 Coding.net 机器人,结果消息发不出来,会报错。但是我们依然可以来借鉴一下中间的原理。

这个 Coding.net 机器人会有一个 webhook 链接,按照官方给出的指示,把这个链接直接填到 Coding.net 仓库的 webhook url 中。中间实现的逻辑我猜测应该就是:当有一个 push 发生时,会给这个 url 对应的服务发送一条消息,而这个 url 又恰恰是机器人的 webhook,也就是相当于直接打通,一有 push,这个机器人就会发消息。

但后来这一招没有成功,只能来换一招。创建了一个自定义机器人,同样给了一个 webhook,首先我通过钉钉的机器人接口用 curl 命令直接让机器人发一条消息,这一部分完成了。然后转到 Coding.net 上,查看 webhook 设置出的测试,大概就是当一些命令发生时,比如 push ,会给这个对应的 webhook 发送一段 json,中间的信息就是这次命令的信息。然后我就想,要不写一个 web 服务,相当于一个中间商,当 Coding.net 发送消息给我的服务器时,对这个数据进行解析,当符合我的条件时,再通过服务器给机器人发消息,大致就是这么个流程,还是非常简单的。

自动化部署

在实现了上面这个消息订阅的功能之后,我想到了之前搭建博客的时候有过这样的经验:用 Github 管理我的 hexo 博客内容,但是不使用 Github Pages 服务,而是部署在自己的服务器上。这样就会有个问题,每次在本地写完 Markdown,提交代码,又要到服务器上拉去代码,是一个很烦的过程,但是有了 webhook 就方便多了,一旦检测到 push 命令,就在服务器端拉取代码,节省了我人工去拉取代码的成本。