乐趣区

关于javascript:玩转云函数打通Github到企微的消息通知

Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~


     在昨天 18 号的团队外部常识分享会上共事将近期为团队工程化所做的企微机器人做了具体的分享,次要是每天会有不少的工夫都是在解决 Merge 或在找共事 Merge 的路上,为了优化这块的工夫咱们共事应用 NodeJs 开发服务来连贯外部应用的工蜂平台和企微平台,做到主动发送和揭示对应的共事来做代码评审,当评审通过后被动告诉发起人来实现合并。

那么我想做什么?

     在之前我写了一篇《【Serverless 版】企微群机器人开发》,次要是通过定时被动去拉取申请来解析后再告诉到企微机器人,这次我就想利用腾讯云函数来做服务买通 Github 到企微的音讯告诉,这样就进一步扩大了咱们对云函数的意识,那咱们就做起来吧。

     本次的案例咱们须要筹备创立 GitHub 演示我的项目,腾讯云函数和一个企微机器人,当有用户新增一条评论时能够告诉到企微群的管理人员。

为演示我的项目配置 Webhooks:

演示的 Github 我的项目自行创立不做要求,Webhook 容许在指定的事件产生时向咱们事后配置的 url 接口发送 POST 申请。

  1. 菜单地位:演示我的项目 /Settings/Webhooks;
  2. 点击 Add webhook 开始配置;
  3. 配置信息包含:

    • 申请地址,能够等创立好云函数后再配置;
    • 内容格局:抉择目前最通用的 Json 数据传输;
    • 平安密钥:配置一个随机密钥,能够通过工具生成长度 32 位,云函数对数据验证时会应用;
    • 抉择事件:勾选 Let me select individual events. 抉择Issue comments。
  4. 事件文档:[webhook-events-and-payloads]()

    开发云函数:

    创立云函数:

         这次咱们为了节省时间就基于模板来创立云函数,抉择Express 框架模版,函数名称咱们指定为【github-webhook-issues-comments】来与其已有函数辨别。

检测服务连通性:

     创立后切换到触发治理菜单就能看到服务的拜访门路了,默认的模板提前创立好了默认页面路由,/logo 路由,/user 路由,/user/:id 路由,/404 路由和 /500 路由,咱们都能够拜访试一下成果,咱们除了保留默认路由来查看服务是否失常外其余的路由能够思考删除掉。

     关上首页看到“欢送拜访 Express.js 利用腾讯云 Serverless 为您提供服务”就阐明服务曾经失常启动了。

配置 /Webhook 路由:

  1. 咱们预约路由为/webhook,接管申请的形式为POST,接管的内容格局为JSON,这时候咱们就能够去 GitHub 的 Webhook 去填写信息了。

  1. 通过云端编辑器来新增 /webhook 路由,具体实现临时不做,咱们想通过在 Github 提交一次 Issues 来验证连通性。

    app.post(`/webhook`, (req, res) => {res.send({code: 200});
    });

    在 Github 上查看申请日志:

    实现 /Webhook 路由:

  2. 为了调试(本地)不便,咱们最好是将云端代码下载后在本地的 VSCode 中编写,拉取代码后就能够通过 nodemon ./app.js 启动服务,服务默认端口为 9000 且在云端函数中不容许批改,这个须要特地留神;

  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);
      },
    };

    阐明:

    • 因为很少做加解密所以一开始设置的 16 位秘钥使得两次加密后果不雷同,破费的很长时间,所以留神须要设置起码 32 位秘钥,有理解这块的 XD 能够给解释一下😘。
    • 秘钥倡议是存到服务器的环境变量中,禁止间接存储到代码中。
  2. 通过查阅 Github 文档来确定咱们上面须要拼装信息的字段,我将代码放到下方就不对字段做解释了,更多的字段内容可查问文档:

    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
        `;
    },
  3. 再次革新 /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. 抉择本地代码根文件夹:

  2. 点击部署开始上传:

  3. 代码部署上传中:

  4. 检测到与现部署的不统一须要从新公布:

  5. 在 Github 创立 Issuse 后可通过云端日志查问的到正确反馈:

总结:

     咱们通过在 Github 上配置 WebHook 监听 Issuse 评论的事件,当事件产生后将依照固定格局发送音讯到咱们创立的腾讯云函数中,在验证数据的合法性后解析报文并组装卡片转发到企微机器人。在开发中遇到了很少应用的 Hmac256 加密耽搁的工夫最长,起因是秘钥长度不够导致。不晓得这一篇的云函数开发有没有讲的明确呢?🤔


欢送关注我的公众号“前端小鑫同学”,原创技术文章第一工夫推送。

退出移动版