【玩转云函数】打通Github到企微的消息通知

简介: 【玩转云函数】打通Github到企微的消息通知

在昨天18号的团队内部知识分享会上同事将近期为团队工程化所做的企微机器人做了详细的分享,主要是每天会有不少的时间都是在处理Merge或在找同事Merge的路上,为了优化这块的时间我们同事使用NodeJs开发服务来连接内部使用的工蜂平台和企微平台,做到自动发送和提醒对应的同事来做代码评审,当评审通过后主动通知发起人来完成合并。


那么我想做什么?


     在之前我写了一篇《【Serverless版】企微群机器人开发》,主要是通过定时主动去拉取请求来解析后再通知到企微机器人,这次我就想利用腾讯云函数来做服务打通Github到企微的消息通知,这样就进一步扩展了我们对云函数的认识,那我们就做起来吧。

     本次的案例我们需要准备创建GitHub演示项目,腾讯云函数和一个企微机器人,当有用户新增一条评论时可以通知到企微群的管理人员。

1.png

为演示项目配置Webhooks:


演示的Github项目自行创建不做要求,Webhook允许在指定的事件发生时向我们预先配置的url接口发送POST请求。

  1. 菜单位置:演示项目/Settings/Webhooks;
  2. 点击Add webhook开始配置;
  3. 配置信息包括:
  • 请求地址,可以等创建好云函数后再配置;
  • 内容格式:选择目前最通用的Json数据传输;
  • 安全密钥:配置一个随机密钥,可以通过工具生成长度32位,云函数对数据验证时会使用;
  • 选择事件:勾选Let me select individual events.选择Issue comments。
  1. 事件文档: webhook-events-and-payloads2.png


开发云函数:



创建云函数:

     这次我们为了节省时间就基于模板来创建云函数,选择Express 框架模版,函数名称我们指定为【github-webhook-issues-comments】来与其已有函数区分。3.png4.png


检测服务连通性:

     创建后切换到触发管理菜单就能看到服务的访问路径了,默认的模板提前创建好了默认页面路由,/logo路由,/user路由,/user/:id路由,/404路由和/500路由,我们都可以访问试一下效果,我们除了保留默认路由来检查服务是否正常外其他的路由可以考虑删除掉。

     打开首页看到“欢迎访问 Express.js 应用腾讯云 Serverless 为您提供服务”就说明服务已经正常启动了。

5.png


配置/Webhook路由:

  1. 我们预定路由为/webhook,接收请求的方式为POST,接收的内容格式为JSON,这时候我们就可以去GitHub的Webhook去填写信息了。

6.png

  1. 通过云端编辑器来新增/webhook路由,具体实现暂时不做,我们想通过在Github提交一次Issues来验证连通性。
app.post(`/webhook`, (req, res) => {
  res.send({code: 200});
});
复制代码
  1. 在Github上查看请求日志:7.png


实现/Webhook路由:

  1. 为了调试(本地)方便,我们最好是将云端代码下载后在本地的VSCode中编写,拉取代码后就可以通过nodemon ./app.js启动服务,服务默认端口为9000且在云端函数中不允许修改,这个需要特别注意;

8.png

  1. 还记得我们在Github配置Webhook配置的安全密钥吗?为了保证数据的安全,我们需要在云函数中使用相同的密钥来验证数据的有效性(GitHub文档)。
app.post(`/webhook`, (req, res) => {
  const signature = req.headers["x-hub-signature-256"];
  if (signature) {
    const payload = req.body;
    const ret = verify(signature, payload);
    // 输出验证结构
    console.log("[ ret ] >", ret);
  }
  res.send({ code: 200 });
});
复制代码
const crypto = require("crypto");
const SECRET_TOKEN = "";
function sign(data) {
  return `sha256=${crypto
    .createHmac("sha256", SECRET_TOKEN)
    .update(JSON.stringify(data))
    .digest("hex")}`;
}
module.exports = {
  verify: (signature, data) => {
    const sig = Buffer.from(signature);
    const signed = Buffer.from(sign(data));
    if (sig.length !== signed.length) {
      return false;
    }
    return crypto.timingSafeEqual(sig, signed);
  },
};
复制代码
  1. 说明:
  • 因为很少做加解密所以一开始设置的16位秘钥使得两次加密结果不相同,花费的很长时间,所以注意需要设置最少32位秘钥,有了解这块的XD可以给解释一下😘。
  • 秘钥建议是存到服务器的环境变量中,禁止直接存储到代码中。
  1. 通过查阅Github文档来确定我们下面需要拼装信息的字段,我将代码放到下方就不对字段做解释了,更多的字段内容可查询文档:
    9.png
packaging: (issue, comment, repository, sender) => {
    return `
**有一条新的评论**:\n
    用户[${sender.login}](${sender.html_url})在【[${issue.title}](${issue.html_url})】主题下新增了一条评论,说[${comment.body}](${comment.html_url}),请注意查看!\n\n
**所属项目**:<font color="info">[${repository.name}](${repository.html_url})</font>\n
**评论时间**:<font color="comment">${comment.updated_at}</font>\n
    `;
},
复制代码
  1. 再次改造/webhook路由,支持向企微机器人发送消息,企微机器人的配置和发送请看上一篇《【Serverless版】企微群机器人开发》,源码丢失了,云端的代码需要的可以留言联系:
if (verify(signature, payload)) {
  const { action, issue, comment, repository, sender } = payload;
  if (action === "created") {
    const content = packaging(issue, comment, repository, sender);
    notice.requestMDNotice(config.ENTERPRISE_WECHAT_ROBOT_WEB_HOOK, {
      content,
    });
  }
}
复制代码
  1. 我们在企微中就可以收到下面的卡片信息了:10.png


同步本地代码到云端步骤:


  1. 选择本地代码根文件夹:
    11.png
  2. 点击部署开始上传:
    12.png
  3. 代码部署上传中:
    13.png
  4. 检测到与现部署的不一致需要重新发布:
    14.png
  5. 在Github创建Issuse后可通过云端日志查询的到正确反馈:
    15.png


总结:


     我们通过在Github上配置WebHook监听Issuse评论的事件,当事件发生后将按照固定格式发送消息到我们创建的腾讯云函数中,在验证数据的合法性后解析报文并组装卡片转发到企微机器人。在开发中遇到了很少使用的Hmac256加密耽误的时间最长,原因是秘钥长度不够导致。不知道这一篇的云函数开发有没有讲的明白呢?🤔



相关文章
|
安全 Serverless API
一次协作多端同步,打通看云、github互相同步(serverless实践)
一次协作多端同步,打通看云、github互相同步(serverless实践)
一次协作多端同步,打通看云、github互相同步(serverless实践)
|
29天前
|
JSON Kubernetes 安全
找到啦,我们已上车,Github 27000+ star,研发团队必备开源工具项目,真丝滑!!!
Trivy 是一款高效灵活的开源安全扫描工具,支持容器镜像、文件系统、Kubernetes 等多目标扫描,具备快速、易用、集成性强等特点,适用于 DevSecOps 全流程安全检测。
|
14天前
|
人工智能 编解码 JSON
不看后悔!GitHub 开源 MultiTalk .8k star 强大的人语音+图像绑定项目
MultiTalk 是 GitHub 上的开源项目,具备音频驱动、多人对话视频生成功能。支持多路音频与图像绑定,实现高同步唇动与角色互动,适用于教学、虚拟人及短视频创作,已获 8k 星标。
|
14天前
|
安全 数据可视化 项目管理
精品,Github 5000+ star,小型研发团队必备商业开源项目
DooTask 是一款开源在线项目任务管理工具,具备文档协作、流程图、任务分发、IM沟通等功能,支持私有部署与数据加密,已在 GitHub 获得 5000+ 星标,适合中小团队提升协作效率。
|
14天前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
101 0
|
7月前
|
开发工具 git C++
【够用就好002】外行第一次发布github项目仓库
#deepseek#自学 记录外行学习代码的历程 今天是上传自己的工具代码到github仓库,一直以来是伸手党克隆别人的项目,今天在deepseek的辅导下上传自己的内容。
|
29天前
|
数据采集 人工智能 搜索推荐
完蛋啦,爆火Github项目,用微信聊天记录打造专属AI数字分身,我都不敢相信!!
WeClone 是一个基于微信或 Telegram 聊天记录微调大语言模型的开源项目,可打造专属 AI 数字分身。支持文本、图片等多模态数据,具备语言风格迁移和语音克隆功能,实现“说话像你”的AI角色。项目提供完整训练流程,支持本地部署,保护隐私,适用于个人数字分身、纪念机器人、客服助手等场景。
163 0
|
29天前
|
存储 人工智能 自然语言处理
让你拥有一个AI大脑,这个32.1k Github项目是你不错的选择,支持PDF、Markdown、代码、视频成为你的知识内容
Quivr 是开源全栈 RAG 平台,助你打造“第二大脑”,支持多文档类型与多种 LLM,实现智能搜索与聊天。具备语义检索、本地部署、隐私保护等功能,适用于个人知识管理与企业知识库,界面简洁易用,是高效智能问答的理想选择。
|
1月前
|
人工智能 数据可视化 开发者
惊艳!GitHub 开发者一键接入!4.2k star 项目 Champ,用一张照片秒变动画
“Champ” 致力于从一张静态人物图生成流畅连续的人体动画,支撑精准姿态控制与形状一致性,其核心思路是将 3D 参数化人体模型(SMPL)引入扩散模型:
|
人工智能 数据安全/隐私保护 计算机视觉
GitHub爆款神器 | IOPaint:21.7k star 开源AI图像修复项目,竟能秒删水印、拓展画幅!
IOPaint 是一款由 Sanster 团队开发的开源图像处理工具,集成多种 SOTA AI 模型,支持图像擦除、对象替换、文本绘制和图像外扩等功能。它操作简便,一键安装,适用于 Windows、macOS、Linux 和 Apple Silicon 系统,适合摄影爱好者、电商从业者及内容创作者使用,大幅提升图像处理效率。

热门文章

最新文章