简洁的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 git@github.com: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.



