简洁的webhook转发设计与实现。
1、修改config.json
中的配置项,修改部署IP和端口。
2、修改repost_rules.json
中的配置项,其中一些参数项是必须的,下面对其进行说明:
参考repost_rules.json.tmplt
文件:
"github"
表示向部署机器发送请求的标识。这个需要在预留webhook
到第三方时设定url
参数source
的值为这个标识串。举例来说,在GitHub
的Webhook
预留的地址就是http://domain?source=github
。
parse
表示需要从收到的数据中进行解析的内容。结合github.example.json
可知,每个字段表示的具体解析内容。对于每个map
的(嵌套)字段,通过.
来标识。如果某个字段是一个数组,那么解析得到的内容也将是一个数组。这种情况可以参考其中的commit_modified
的解析内容。这部分内容也是核心内容之一,即"如何通过一种简易直观的方式(这里的标识解析字段的串),实现从数据中解析获取特定的内容"。
hosts
标识将解析的数据转发的目标,其中必须的字段是url
、method
以及data
。下面逐个说明相应字段的含义:
url
就是需要转发到的地址,通常是另一个webhook
。
method
就是请求的方式,暂未支持GET
方式。且目前的测试场景均为POST
+json
的方式。
data
就是要转发的数据,这里定义转发的数据格式。很多情况下的数据都是一个json对象
,所以这里就直接将data
设定为一个此类型。对于这个数据内的每个字段(无论是否层级嵌套),都会尝试进行解析替换。如果某个字段值的类型为字符串
类型,那么就会尝试匹配其中的内容是否已经出现在parse
中已解析得到的结果,发现已有解析内容,则直接进行字面值替换。
这里对替换的标识格式有限制,如果是一个普通字段值,需要用${
+}
来界定;如果是一个数组,则需要用$[
+]
来界定。对于数组内容,可能数组内的元素是一个“结构体”,那么会将每个出现在解析值前的字符串常量作为其名称,拼接到每个元素值上。这里可以参考示例中的data.markdown.content
字段的解析替换结果。
git clone [email protected]:Modnars/ModTools.git
cd ModTools/HookReposter/python
cp config.json.tmplt config.json
cp repost_rules.json.tmplt repost_rules.json
vim config.json repost_rules.json # 按照需求自定义设置
python3 reposter.py # or nohup python3 reposter.py &
应用场景: 监听GitHub的PUSH事件,当有人向指定仓库PUSH代码时,接收来自GitHub的请求,解析数据,转发指定内容给企业微信机器人webhook。
GitHub
设置webhook
地址: 注意需要填充source
参数。
当发生PUSH
事件时,GitHub
会向webhook发送请求。
GitHub
调用成功后,会显示收到的回包内容。
企业微信机器人收到请求后,会发送相应信息给用户。
-
优化发送方式: 目前是阻塞同步调用webhook,当注册的转发host较多时,会较为耗时,进而导致调用方超时。考虑使用异步方式来请求转发webhook,以免阻塞调用方。
-
支持更加丰富的数据类型: 目前还是更多地以字符串为核心内容,考虑到更加宽泛的应用场景,可能会需要更加丰富的数据类型支持。
遵从MIT LICENSE
协议开源。
Copyright (c) 2021 ModnarShen.