钉钉/企业微信机器人:“Github触发器”与“Issue机器人”

本文涉及的产品
AI 网关免费试用,400元 Serverless
简介: 众所周知,在Serverless领域中,触发器是FaaS必不可少的一部分;一个FaaS平台,他的触发器数量、质量以及类型,很可能会决定这个FaaS平台是否能成为“主流”平台;因为触发器不仅仅是一种功能的体现,更是解决普遍性业务诉求的一个重要途径;目前来看,各个云厂商所提供的触发器基本上都会包括API网关触发器、对象存储触发器、时间触发器等,当然也有厂商提供一定的消息触发器、日志触发器、甚至是一些SQL相关的触发器、CDN触发器等,那么在我们的实际生产生活中,这些表面上看起来“很基础”的触发器,是否可以升级成为一个有趣的“高级触发器”呢?

前言

众所周知,在Serverless领域中,触发器是FaaS必不可少的一部分;一个FaaS平台,他的触发器数量、质量以及类型,很可能会决定这个FaaS平台是否能成为“主流”平台;因为触发器不仅仅是一种功能的体现,更是解决普遍性业务诉求的一个重要途径;目前来看,各个云厂商所提供的触发器基本上都会包括API网关触发器、对象存储触发器、时间触发器等,当然也有厂商提供一定的消息触发器、日志触发器、甚至是一些SQL相关的触发器、CDN触发器等,那么在我们的实际生产生活中,这些表面上看起来“很基础”的触发器,是否可以升级成为一个有趣的“高级触发器”呢?

本文将会通过Github的Webhooks能力与API网关触发器/Http触发器进行结合,抛砖引玉的讲述一下“Github触发器”和“Issue”机器人相关的例子,同时本文将会使用Serverless Devs开发者工具,以阿里云函数计算为事例进行实践。

Github触发器的实现

在使用Github的时候,细心的小伙伴会发现,无论是在某个仓库的设置下,还是某个组织的设置下,Github有一个叫Webhooks的能力:

这个能力其实就是一个非常简单的事件触发配置入口,也就是说,某些操作是可以通过在这里进行配置,然后按照我们的配置,将一些指定事件的结构体传给我们所制定的接口。

创建Http函数

为了验证我们刚才的说法,我们可以先配置一个Http函数:

$ s init python3-http


正在初始化......

 初始化信息:

   包名:python3-http    云厂商:Alibaba

初始化成功

此时此刻,我们可以对配置进行部分修改,例如增加日志配置等,例如在Properties的Service下,增加:

Log: Auto

即可,增加后的配置:

MyFunctionDemo:

 Access: release

 Component: fc

 Provider: alibaba

 Properties:

   Region: cn-hangzhou

   Service:

     Name: ServerlessToolProject

     Description: 欢迎使用ServerlessTool

     Log: Auto

   Function:

     Name: serverless_demo_python3_http

     Description: 这是一个Python3-HTTP的测试案例

     CodeUri: ./

     Handler: index.handler

     MemorySize: 128

     Runtime: python3

     Timeout: 5

     Triggers:

       - Name: TriggerNameHttp

         Type: HTTP

         Parameters:

           AuthType: ANONYMOUS

           Methods:

             - GET

             - POST

             - PUT

           Domains:

             - Domain: Auto

接下来,可以通过:

s deploy

进行部署,选择好密钥等信息之后,稍等片刻即可看到已经完成部署:

......

Trigger: ServerlessToolProject@serverless_demo_python3_http-TriggerNameHttp deploy successfully

......

 

MyFunctionDemo:

 Service: ServerlessToolProject

 Function: serverless_demo_python3_http

 Triggers:

   - Name: TriggerNameHttp

     Type: HTTP

     Domains:

       - 34215716-1295939377467795.test.functioncompute.com

配置Webhook

然后将生成的地址,刚才部署之后生成的地址,放在Github的Webhook中:

完成之后,点击保存(Add webhook)即可,稍等片刻,我们可以看到我们添加的前面,多了一个绿色的对号:

我们此时可以点进去看一下相关的请求记录,包括request和response等相关信息:

至此,我们的一个Github 触发器。

接下来,我们就可以有针对性的做一些有趣的事情了,例如没有人提Issue可以得到一个推送等。

Github Issue的识别

为了获取到用户提的Issue内容,我们可以先对Webhook内容进行设置:

我们可以将刚才的设置"Just the push event"更改为“Let me select individual events”,并且选择Issues,保存之后,我们提交一个Issue,并且在进行request的查看:


可以看到,我们刚才的Issue已经被发送到了函数内,我们接下来,对函数代码进行升级,看看是否可以捕捉到action为opened的issue详情:

# -*- coding: utf-8 -*-


import json

import uuid



# Response

class Response:

   def __init__(self, start_response, response, errorCode=None):

       self.start = start_response

       responseBody = {

           'Error': {"Code": errorCode, "Message": response},

       } if errorCode else {

           'Response': response

       }

       # 默认增加uuid,便于后期定位

       responseBody['ResponseId'] = str(uuid.uuid1())

       print("Response: ", json.dumps(responseBody))

       self.response = json.dumps(responseBody)


   def __iter__(self):

       status = '200'

       response_headers = [('Content-type', 'application/json; charset=UTF-8')]

       self.start(status, response_headers)

       yield self.response.encode("utf-8")



def handler(environ, start_response):

   try:

       request_body_size = int(environ.get('CONTENT_LENGTH', 0))

   except (ValueError):

       request_body_size = 0

   requestBody = json.loads(environ['wsgi.input'].read(request_body_size).decode("utf-8"))


   responseData = "not issue opened"


   if requestBody['action'] == 'opened':

       print("title: ", requestBody['issue']['title'])

       print("url  : ", requestBody['issue']['url'])

       print("body : ", requestBody['issue']['body'])

       responseData = "issue opened"


   return Response(start_response, {"result": responseData})



由于我们只更新了项目代码,所以我们可以直接部署代码:

s deploy function --code

当然,如果继续使用:

s deploy

进行项目部署,也是可以的,部署完成:

Waiting for function serverless_demo_python3_http to be deployed...

Only deploy function code.

Packing ...

file .s is ignored.

Package complete.

Function: ServerlessToolProject@serverless_demo_python3_http updating ...

Deploy function serverless_demo_python3_http successfully

function serverless_demo_python3_http deploy success


......

 

MyFunctionDemo:

 Function: serverless_demo_python3_http

我们可以在命令行进行日志查看:

s logs -t

然后我们在页面进行Issue的创建:

创建完成,即可在我们的日志上看到:

至此,我们完成了一个Github Issue监控的小功能。

钉钉机器人/企业微信机器人的实现

其实,无论是钉钉机器人,还是企业微信机器人,都是一个Webhook的地址,我们按照要求传入参数即可。此时,我们可以创建一个钉钉机器人:

创建之后,可以获得Hook地址,我们将Hook地址保存,并且通过以下代码发起请求即可:

# -*- coding: utf-8 -*-

import urllib.request


url = "https://"

headers = {

   "Content-Type": "application/json"

}

urllib.request.urlopen(urllib.request.Request(url, json.dumps({

   "msgtype": "text",

   "text": {

       "content": "body"

   }

}).encode("utf-8"), headers=headers))


这里要注意,针对不同类型的消息,所传输的消息类型是不同的,这一部分是可以参考开发文档来进行:

例如钉钉的Text格式:

{

   "msgtype": "text",

   "text": {

       "content": "我就是我, 是不一样的烟火@156xxxx8827"

   },

   "at": {

       "atMobiles": [

           "156xxxx8827",

           "189xxxx8325"

       ],

       "isAtAll": false

   }

}

Markdown格式:

{

    "msgtype": "markdown",

    "markdown": {

        "title":"杭州天气",

        "text": "#### 杭州天气 @156xxxx8827\n" +

                "> 9度,西北风1级,空气良89,相对温度73%\n\n" +

                "> ![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)\n"  +

                "> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n"

    },

   "at": {

       "atMobiles": [

           "156xxxx8827",

           "189xxxx8325"

       ],

       "isAtAll": false

   }

}

在企业微信机器人中的Markdown格式:

{

   "msgtype": "markdown",

   "markdown": {

       "content": "实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n

        >类型:<font color=\"comment\">用户反馈</font> \n

        >普通用户反馈:<font color=\"comment\">117例</font> \n

        >VIP用户反馈:<font color=\"comment\">15例</font>"

   }

}

所以,这里具体使用什么格式,可以根据个人需求而定。当然,企业微信机器人与钉钉机器人一样,都是要获得一个Webhook地址,然后发送请求即可。

Issue机器人的实现

我们将上面两部份代码整合,可以得到相对完整的代码:

import json

import uuid

import urllib.request


# Response

class Response:

   def __init__(self, start_response, response, errorCode=None):

       self.start = start_response

       responseBody = {

           'Error': {"Code": errorCode, "Message": response},

       } if errorCode else {

           'Response': response

       }

       # 默认增加uuid,便于后期定位

       responseBody['ResponseId'] = str(uuid.uuid1())

       print("Response: ", json.dumps(responseBody))

       self.response = json.dumps(responseBody)


   def __iter__(self):

       status = '200'

       response_headers = [('Content-type', 'application/json; charset=UTF-8')]

       self.start(status, response_headers)

       yield self.response.encode("utf-8")



def handler(environ, start_response):

   try:

       request_body_size = int(environ.get('CONTENT_LENGTH', 0))

   except (ValueError):

       request_body_size = 0

   requestBody = json.loads(environ['wsgi.input'].read(request_body_size).decode("utf-8"))


   responseData = "not issue opened"


   if requestBody['action'] == 'opened':

       print("title: ", requestBody['issue']['title'])

       print("url  : ", requestBody['issue']['url'])

       print("body : ", requestBody['issue']['body'])


       url = "https://"

       headers = {

         "Content-Type": "application/json"

       }

       urllib.request.urlopen(urllib.request.Request(url, json.dumps({

           "msgtype": "text",

           "text": {

               "content": "body"

           }

       }).encode("utf-8"), headers=headers))


       responseData = "issue opened"


   return Response(start_response, {"result": responseData})


这其中:

url = "https://"

是我们的钉钉群机器人或者企业微信机器人的Webhook地址。结构:

{

 "msgtype": "text",

 "text": {

   "content": "body"

 }

}

是我们根据钉钉群机器人或者企业微信机器人所提供的文旦,针对不同类型的消息所要求的数据结构。例如我此时要用钉钉群机器人,所以我设置的结果为:

tempText = 'Issue:    \nUser: %s   \nMessage: %s     \n[链接地址](%s)'%(jsonData['sender']['login'], jsonData['issue']['body'] ,jsonData['issue']['html_url'])

data = {

 "msgtype": "markdown",

 "markdown": {

   "title": "Github Issue提醒",

   "text": tempText

 }

}

最终表现形式为,当有人在Github上提出Issue之后,我的群会进行这样的提示:

至此,我们完成一个Issue机器人。

总结

这篇文章是比较简单和有趣的,通过本文你可以简单地知道如何更加灵活的使用Http触发器/API网关触发器,也可以知道Github的Webhooks和函数计算的一个有趣的结合,也可以知道钉钉机器人和企业微信机器人的制作方法。同时,通过本文,还可以进行一个比较完整的实践:通过Github Webhooks + 钉钉群机器人/企业微信机器人 + 函数计算 + Http触发器/API网关触发器,实现一个Github Issue机器人。

当然,本文也是抛砖引玉,在实际操作过程中,可以有更多的思路融入其中,例如通过Webhook与Serverless实现一个CI/CD的小工具 .......其实Serverless可以做的事情有很多,主要在于,我们是否能够“大开脑洞”去创造,去发现更多的玩法

目录
相关文章
|
弹性计算 机器人 应用服务中间件
一键部署开源Qwen3并集成到钉钉、企业微信
Qwen3系列模型现已正式发布并开源,包含8款“混合推理模型”,其中涵盖两款MoE模型(Qwen3-235B-A22B与Qwen3-30B-A3B)及六个Dense模型。阿里云计算巢已支持Qwen3-235B-A22B和Qwen3-32B的私有化部署,用户可通过计算巢轻松完成部署,并借助AppFlow集成至钉钉机器人或企业微信。文档详细介绍了从模型部署、创建应用到配置机器人的全流程,帮助用户快速实现智能助手的接入与使用。
1267 19
一键部署开源Qwen3并集成到钉钉、企业微信
|
人工智能 数据可视化 API
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
10 分钟构建 AI 客服并应用到网站、钉钉或微信中测试评
426 2
|
人工智能
10 分钟构建 AI 客服并应用到网站、钉钉或微信中简说
10 分钟构建 AI 客服并应用到网站、钉钉或微信
GitHub-cli应用:使用GH命令行在本地提交issue、PR并合并PR。
使用GitHub CLI,你可以更专注于编写和阅读代码,而不需要为了简单的操作反复跳转页面。在这个充满终端、代码和开源的世界中,让GitHub CLI被你牢牢掌握,在你的掌中,它将会是一个强大的工具。
543 19
|
机器学习/深度学习 人工智能 自然语言处理
PeterCat:一键创建开源项目 AI 问答机器人,自动抓取 GitHub 仓库信息、文档和 issue 等构建知识库
PeterCat 是一款开源的智能答疑机器人,能够自动抓取 GitHub 上的文档和 issue 构建知识库,提供对话式答疑服务,帮助开发者和社区维护者高效解决技术问题。
1115 7
PeterCat:一键创建开源项目 AI 问答机器人,自动抓取 GitHub 仓库信息、文档和 issue 等构建知识库
|
运维 网络安全 数据安全/隐私保护
Nextcloud一键部署:快速搭建如企业钉钉或飞书的团队协作平台
Nextcloud Hub 是一款来自德国的完全开源的云上托管内容协作平台。团队内成员可以通过移动、桌面和 Web 界面访问、共享和编辑文档,聊天和参与视频通话以及管理邮件、日历和项目。目前,Nextcloud的产品定位是在保障数据安全下的完整协作平台,功能类似国内的企业钉钉或飞书。Nextcloud官网:[https://nextcloud.com/](https://nextcloud.com/) 。
Nextcloud一键部署:快速搭建如企业钉钉或飞书的团队协作平台
|
人工智能 自然语言处理 运维
钉钉x昇腾:用AI一体机撬动企业数字资产智能化
大模型在过去两年迅速崛起,正加速应用于各行各业。尤其在办公领域,其主要模态——文字和图片,成为了数字化办公的基础内容,催生了公文写作、表格生成、文本翻译等多种应用场景,显著提升了工作效率。然而,AI引入办公场景也带来了数据安全与成本等问题。为此,钉钉与昇腾联合推出的“钉钉专属AI一体机解决方案”,通过本地化部署解决了数据安全、成本高昂及落地难等痛点,实现了从硬件到软件的深度协同优化,为企业提供了开箱即用的AI服务,推动了办公场景的智能化升级。
755 11
|
人工智能 自然语言处理 搜索推荐
评测:AI客服接入钉钉与微信的对比分析
【8月更文第22天】随着人工智能技术的发展,越来越多的企业开始尝试将AI客服集成到自己的业务流程中。本文将基于《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案,详细评测AI客服在钉钉和微信中的接入流程及实际应用效果,并结合个人体验分享一些心得。
10827 10
|
人工智能 移动开发 IDE
安利几款与钉钉平台无缝集成打通账号认证的企业文档管理系统
钉钉是很多中小企业都爱用的产品,开通账号就能直接使用了,应用生态非常丰富,尤其是AI技术的应用,走在行业前列。但仍有很多企业对于全面拥抱SaaS服务充满了顾虑,尤其在内部资料的管理这块,即使钉钉在线文档已经提供了非常优秀的协作体验,不少客户仍更偏爱私有部署在局域网里面的企业文档管理系统。那么能将企业内部部署的文档管理系统集成到钉钉平台上面,和钉钉文档并行使用呢?市面上又有哪些企业文档管理系统软件支持与钉钉的集成呢?这也是很多企业客户的疑问。
安利几款与钉钉平台无缝集成打通账号认证的企业文档管理系统
|
Linux 网络安全 API
企业微信自定义应用 企业可信IP配置 企业可信ip怎么设置
企业微信自定义应用 企业可信IP配置 企业可信ip怎么设置