Skip to content

Latest commit

 

History

History

python

HookReposter

简洁的webhook转发设计与实现。

使用方式

        1、修改config.json中的配置项,修改部署IP和端口。

        2、修改repost_rules.json中的配置项,其中一些参数项是必须的,下面对其进行说明:

参考repost_rules.json.tmplt文件:

        "github"表示向部署机器发送请求的标识。这个需要在预留webhook到第三方时设定url参数source的值为这个标识串。举例来说,在GitHubWebhook预留的地址就是http://domain?source=github

        parse表示需要从收到的数据中进行解析的内容。结合github.example.json可知,每个字段表示的具体解析内容。对于每个map的(嵌套)字段,通过.来标识。如果某个字段是一个数组,那么解析得到的内容也将是一个数组。这种情况可以参考其中的commit_modified的解析内容。这部分内容也是核心内容之一,即"如何通过一种简易直观的方式(这里的标识解析字段的串),实现从数据中解析获取特定的内容"

        hosts标识将解析的数据转发的目标,其中必须的字段是urlmethod以及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参数。

Set webhook for GitHub.

        当发生PUSH事件时,GitHub会向webhook发送请求。

GitHub send data to webhook.

        GitHub调用成功后,会显示收到的回包内容。

Recv response after call webhook.

        企业微信机器人收到请求后,会发送相应信息给用户。

Wework bot send message to user when recv webhook call.

后续优化计划

  • 优化发送方式: 目前是阻塞同步调用webhook,当注册的转发host较多时,会较为耗时,进而导致调用方超时。考虑使用异步方式来请求转发webhook,以免阻塞调用方。

  • 支持更加丰富的数据类型: 目前还是更多地以字符串为核心内容,考虑到更加宽泛的应用场景,可能会需要更加丰富的数据类型支持。

声明

        遵从MIT LICENSE协议开源。

        Copyright (c) 2021 ModnarShen.