拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

2023-11-21 20:50

本文主要是介绍拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook

大家好,我是小富~

最近接个任务,用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个,实际开发一定会用得到。

整理了几百本各类技术电子书,有需要的同学自取。技术群快满了,想进的同学可以加我好友,和大佬们一起吹吹技术。

电子书地址

这篇关于拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/405010

相关文章

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指