关于java:拉仇恨webhook-企业微信给同事做了个代码提交监听工具

30次阅读

共计 3843 个字符,预计需要花费 10 分钟才能阅读完成。

本文案例收录在 https://github.com/chengxy-nd…

大家好,我是小富~

最近接个工作,用 webhook 做了个代码提交监听性能,就是有人向近程仓库提交代码后,会在企业微信群内发送一条音讯,相似 @XXX 在 XXX 工夫,向 XXX 我的项目提交 XXXX 代码 这样的文案。

至于为啥要做这么个工具,没方法官大一级压死人,其实我心田是回绝的,总像是被监督一样感觉怪怪的。难不成是发现了我平时偷偷提代码,悄无声息的修 Bug?

webhook

webhook也就是咱们常常说的 钩子 ,如果对钩子不相熟,没关系那咱们换一个概念,回调URL 应该据说过吧,例如:微信领取这类的三方平台都反对配置回调 URL,告诉领取状态。

当一些事件触发,例如:”push代码到近程仓库 ”,或者 ” 提一个 issue“ 等,源网站能够发动一个HTTP 申请到 webhook 配置的 URL。

下图是这个工具的工作流程,开发者向 GitHub 我的项目提交代码,会触发 GitHub 的 pull event,紧接着向 GitHub webhook 中配置的三方 URL 发送一个POST 申请,这个三方平台能够是钉钉、飞书、企业微信这类平台。

上面咱们以 GitHub + 企业微信 来实现代码提交监听,主动向企业微信群组推送音讯。

配置 GitHub webhook

首先进入 GitHub 对应我的项目的 Settings,做 webhook 的根底配置。

次要配置四局部:

Payload URL 回调服务的地址;

Content type 回调申请头,倡议 JSON 格局;

Secret 为了做平安校验,设置后会在申请 header 中减少如下两个属性,用来辨别申请的起源,防止裸露的申请被歹意拜访;

X-Hub-Signature: sha1=2478e400758f6114aa18abc4380ef8fad0b16fb9
X-Hub-Signature-256: sha256=68bde5bee18bc36fd95c9b71b4a89f238cb01ab3bf92fd67de3a1de12b4f5c72

最初咱们抉择由哪些事件来触发 webhook 回调,push event(代码推送事件)、everything(所有事件)、某些特定事件三种。

咱们能够在 Recent Deliveries 查看 webhook 回调记录,以及残缺的申请和参数数据,还能够 redelivery 模仿发送申请。

配置企业微信

企业微信的配置其实更简略,咱们先创立一个群组,在群组右键有个 增加机器人 选项,增加胜利后会生成 webhook 地址。咱们只有向这个地址发送 POST 申请,群组内就会收到推送音讯。

音讯内容反对文本(text)、markdown(markdown)、图片(image)、图文(news)四种音讯类型,而且还反对在群内 @群成员,下边以文本格式做示范。

   curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=145a516a-dd15-421f-97a3-ba3bf1479369' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype":"text","text": {"content":" 你好,我是程序员内点事 "}
   }'

间接申请 url 发现音讯推送胜利,阐明配置的没问题。

然而到这大家发现一个问题没,GitHub 企业微信 一个只管往登程申请,一个只管承受固定数据格式的申请,两个接口的数据根本无法兼容啊?

申请转发

既然他们之间不兼容,没方法,那就只能咱们本人在两头做一层适配,谁让两边都惹不起呢!

转发的逻辑也比较简单,只需承受 GitHub 回调过去的申请数据,稍加批改组装成企业微信要求的数据格式,间接发送就能够了。

GitHub推送过去的数据包含,仓库、作者、提交者、提交内容等信息,基本上够用。

代码实现比拟毛糙,将就看下吧

@Slf4j
@RestController
public class WebhookController {

    private static String WECHAT_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=145a516a-dd15-421f-97a3-ba3bf1479369";

    private static String GITHUB_API = "https://api.github.com/users/";

    /**
     * @param webhook webhook
     * @author 程序员内点事
     * @Description: github 回调
     * @date 2021/05/19
     */
    @PostMapping("/webhook")
    public String webhookGithub(@RequestBody GithubWebhookPullVo webhook) {log.info("webhook 入参接管 weChatWebhook {}", JSON.toJSONString(webhook));
        // 仓库名
        String name = webhook.getRepository().getName();
        SimpleDateFormat simpleFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String now = simpleFormatter.format(new Date());
        String content = null;
        if (webhook.getCommits().size() > 0) {GithubWebhookPullVo.CommitsDTO commitsDTO = webhook.getCommits().get(0);

            content = "[" + commitsDTO.getCommitter().getName() + "]" +
                    "于:" + now + "," +
                    "向作者:[" + commitsDTO.getAuthor().getName() + "]的,近程仓库" + name + "推送代码" +
                    "详情:";

            List<String> addeds = commitsDTO.getAdded();
            if (addeds.size() > 0) {
                content += "增加文件:";
                for (int i = 0; i < addeds.size(); i++) {content = (i + 1) + content + addeds.get(i);
                }
            }
            List<String> modifieds = commitsDTO.getModified();
            if (modifieds.size() > 0) {
                content += "批改文件:";
                for (int i = 0; i < modifieds.size(); i++) {content = (i + 1) + content + modifieds.get(i);
                }
            }
            List<String> removeds = commitsDTO.getRemoved();
            if (removeds.size() > 0) {
                content += "删除文件:";
                for (int i = 0; i < removeds.size(); i++) {content = (i + 1) + content + removeds.get(i);
                }
            }
        }
        log.info(content);

        WeChatWebhook weChatWebhook = new WeChatWebhook();
        weChatWebhook.setMsgtype("text");
        WeChatWebhook.TextDTO textDTO = new WeChatWebhook.TextDTO();
        textDTO.setContent(content);
        textDTO.setMentionedList(Arrays.asList("@all"));
        textDTO.setMentionedMobileList(Arrays.asList("@all"));
        weChatWebhook.setText(textDTO);

        /**
         * 组装参数后向企业微信发送 webhook 申请
         */
        log.info("企业微信发送参数 {}", JSON.toJSONString(weChatWebhook));
        String post = HttpUtil.sendPostJsonBody(WECHAT_URL, JSON.toJSONString(weChatWebhook));
        log.info("企业微信发送后果 post {}", post);
        return JSON.toJSONString(post);
    }
}

这里要揭示一下,GitHub webhook 回调过去的数据有些并不能间接拿来用,某些场景还是要调用 GitHub API 来换取一些数据的。

文档地址:https://docs.github.com/en/rest/reference

上边的配置工作实现,再将转发的代码部署到服务器,测试下整个链路看看成果,成心批改 pom.xml 文件提交,发现提交代码后胜利向企业微信发送了音讯,和咱们预期的成果统一。

源码地址:https://github.com/chengxy-nds/Springboot-Notebook/

这个工程蕴含我过往文章里所有的案例,比方:抖音去水印工具源码 人脸识别我的项目源码 、以及redisSeataMQ 等中间件的各种问题解决案例,感兴趣的同学能够 Star 个,理论开发肯定会用失去。

正文完
 0