AICon 上海站|90%日程已就绪,解锁Al未来! 了解详情
写点什么

Serverless 实战:利用触发器定制一个专属的企业微信机器人

  • 2020-06-18
  • 本文字数:9554 字

    阅读完需:约 31 分钟

Serverless实战:利用触发器定制一个专属的企业微信机器人

利用定时触发器可以快速建立一个企业微信机器人,我们可以在这个机器人中实现很多定制化的功能,例如按时提醒我们喝水吃饭、定时推送新闻天气、实现监控告警等等。

使用企业微信机器人

企业微信中可以选择添加机器人:



添加机器人之后,我们可以根据文档进行企业微信机器人的基础功能定制:


以下是用 curl 工具往群组推送文本消息的示例(注意要将 url 替换成你的机器人 webhook 地址,content 必须是 utf8 编码):


curl '企业微信机器人地址' \   -H 'Content-Type: application/json' \   -d '   {        "msgtype": "text",        "text": {            "content": "hello world"        }   }'
复制代码


通过 Python 语言实现:


url = ""data = {    "msgtype": "markdown",    "markdown": {        "content": "hello world",    }}data = json.dumps(data).encode("utf-8")req_attr = urllib.request.Request(url, data)resp_attr = urllib.request.urlopen(req_attr)return_msg = resp_attr.read().decode("utf-8")
复制代码


此时,我们可以通过 Serverless Framework 部署一个机器人的基本功能,并且设置好 API 网关触发器:


index.py文件:


import osimport jsonimport urllib.request
def main_handler(event, context): url = os.environ.get("url") data = { "msgtype": "markdown", "markdown": { "content": "hello world", } } data = json.dumps(data).encode("utf-8") req_attr = urllib.request.Request(url, data) resp_attr = urllib.request.urlopen(req_attr) return resp_attr.read().decode("utf-8")
复制代码


serverless.yaml文件:


MyRobot_Base:  component: '@serverless/tencent-scf'  inputs:    name: MyRobot_Base    runtime: Python3.6    timeout: 3    codeUri: ./base_robot    description: 机器人推送接口    region: ap-guangzhou    environment:      variables:        url: webhook地址    handler: index.main_handler    memorySize: 64    tags:      app: myrobot    events:      - apigw:          name: MyRobot          parameters:            protocols:              - http              - https            description: 机器人推送接口            environment: release            endpoints:              - path: /push                method: ANY

复制代码


部署成功之后,就可以看到系统给我们的地址:



通过浏览器打开这个地址,就可以看到企业微信机器人被触发:



至此,我们完成了一个简单的hello world功能,接下来,就对这个基础函数进行额外的改造:


import osimport jsonimport urllib.request
def main_handler(event, context): url = os.environ.get("url") data = { "msgtype": "markdown", "markdown": { "content": event['body'], } } data = json.dumps(data).encode("utf-8") req_attr = urllib.request.Request(url, data) resp_attr = urllib.request.urlopen(req_attr) return resp_attr.read().decode("utf-8")
复制代码


data中的content字段更改为event['body']之后,其他模块就可以请求该接口,实现机器人推送功能。当然,这个基础函数还是可以继续完善的,例如不仅仅是markdown格式,封装更多支持的格式:


机器人功能拓展

提醒喝水/吃饭功能

通过定时触发器访问云函数实现该功能,例如index.py代码:


import osimport jsonimport urllib.request
def main_handler(event, context): url = os.environ.get("url") data = "每天都要多喝水哦,不要忘记补充水分".encode("utf-8") req_attr = urllib.request.Request(url, data) resp_attr = urllib.request.urlopen(req_attr) return resp_attr.read().decode("utf-8")
复制代码


serverless.yaml文件:


MyRobot_Water:  component: '@serverless/tencent-scf'  inputs:    name: MyRobot_Water    runtime: Python3.6    timeout: 3    codeUri: ./water    description: 提醒喝水的机器人    region: ap-guangzhou    environment:      variables:        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push    handler: index.main_handler    memorySize: 64    tags:      app: myrobot    events:      - timer:          name: timer          parameters:            cronExpression: '0 */30 9-17 * * * *'            enable: true
复制代码


这个函数就是每天上午 9 点到下午 5 点,每 30 分钟提醒我们喝一次水。

天气预报/当地新闻功能

想要实现天气预报/新闻播报的功能,我们可以通过已有的新闻接口来实现。以腾讯云的云市场为例,寻找一个新闻类的 API 接口:



根据 API 文档,可以看到请求地址是:https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search


Get 方法可以携带一个参数:keyword,作为目标的关键词,代码编写:


import ssl, hmac, base64, hashlib, os, jsonfrom datetime import datetime as pydatetimefrom urllib.parse import urlencodefrom urllib.request import Request, urlopen

def main_handler(event, context): source = "market"
datetime = pydatetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT') signStr = "x-date: %s\nx-source: %s" % (datetime, source) sign = base64.b64encode(hmac.new(os.environ.get('secretKey').encode('utf-8'), signStr.encode('utf-8'), hashlib.sha1).digest()) auth = 'hmac id="%s", algorithm="hmac-sha1", headers="x-date x-source", signature="%s"' % (os.environ.get("secretId"), sign.decode('utf-8'))
headers = { 'X-Source': source, 'X-Date': datetime, 'Authorization': auth, } queryParams = {'keyword': '科技新闻'} url = 'https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search' if len(queryParams.keys()) > 0: url = url + '?' + urlencode(queryParams)
content = "" for eve in json.loads(urlopen(Request(url, headers=headers)).read().decode("utf-8"))["result"]["list"][0:5]: content = content + "* [](%s) \n"%(eve['title'], eve['url'])
if content: urlopen(Request(os.environ.get('url'), content.encode("utf-8")))
复制代码


serverless.yaml文件:


MyRobot_News:  component: '@serverless/tencent-scf'  inputs:    name: MyRobot_News    runtime: Python3.6    timeout: 3    codeUri: ./news    description: 新闻推送    region: ap-guangzhou    environment:      variables:        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push        secretId: 云市场密钥信息        secretKey: 云市场密钥信息    handler: index.main_handler    memorySize: 64    tags:      app: myrobot    events:      - timer:          name: timer          parameters:            cronExpression: '0 0 */8 * * * *'            enable: true
复制代码


运行效果:每天早晨 8 点为我们推送当日科技新闻:



点击新闻就可以进入到对应的新闻页面。

监控告警功能

除了上面的能力,企业微信机器人还可以被赋予监控告警的能力:


index.py文件:


import osimport urllib.request
def getStatusCode(url): return urllib.request.urlopen(url).getcode()
def main_handler(event, context): url = "http://www.anycodes.cn" if getStatusCode(url) == 200: print("您的网站%s可以访问!" % (url)) else: urllib.request.urlopen(urllib.request.Request(os.environ.get('url'), ("您的网站%s 不可以访问!" % (url)).encode("utf-8"))) return None
复制代码


serverless.yaml文件:


MyRobot_Monitor:  component: '@serverless/tencent-scf'  inputs:    name: MyRobot_Monitor    runtime: Python3.6    timeout: 3    codeUri: ./monitor    description: 网站监控    region: ap-guangzhou    environment:      variables:        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push    handler: index.main_handler    memorySize: 64    tags:      app: myrobot    events:      - timer:          name: timer          parameters:            cronExpression: '0 */30 * * * * *'            enable: true
复制代码


部署完成之后,网站监控脚本就启动了,每 30 分钟检查一次网站是否可用,如果不可用,则会发送告警:


思路发散

通过 Serverless 架构,企业微信机器人可以被赋予更多更有趣的功能,那么我们身边还有那些产品可以和 Serverless 架构结合,被我们赋予有趣的功能呢?


随着网络技术的不断发展,IoT 技术也逐渐走进了千家万户,例如扫地机器人、智能窗帘等智能家居,智能音箱等娱乐设施,Serverless 和智能设备能碰撞出什么样的火花?


以智能音箱为例,我们可以利用 Serverless 架构快速开发小爱同学的专属新功能。


首先,我们需要在小爱同学的开放平台注册一个账号,并提交认证:



完成之后,我们开始对小爱同学的定制化功能进行研究。如图所示,在开发文档中,小爱同学开发者平台为我们提供了相关的能力信息,同样我们也可以查看到 request 以及 response 的详细信息:



了解了小爱同学的开发者规范之后,我们就可以开始对项目进行设计。我们的目标是:当我们对小爱同学说出“进入云+社区”关键词,就可以得到腾讯云云+社区的最新热门文章的题目和简介。整个流程如图所示:



函数代码编写:


# -*- coding: utf8 -*-import jsonimport loggingimport urllib.requestimport urllib.parse
logging.basicConfig(level=logging.NOTSET)

def main_handler(event, context): host = "https://cloud.tencent.com/" path = "developer/services/ajax/column/article?action=FetchColumnHomeArticleList" json_data = { "action": "FetchColumnHomeArticleList", "payload": { "pageNumber": 1, "pageSize": 20, "version": 1 } } data = json.dumps(json_data).encode("utf-8") request_attr = urllib.request.Request(url=host + path, data=data) response_attr = urllib.request.urlopen(request_attr).read().decode("utf-8") json_resp = json.loads(response_attr) logging.debug(json_resp) temp_str = "文章题目为%s,主要内容是%s" list_data = json_resp["data"]["list"][0:5] art_list = [temp_str % (eve["title"], eve["abstract"]) for eve in list_data] news_str = '''今日腾讯云加社区热门文章如下:%s''' % ("、".join(art_list)) logging.debug(news_str)
xiaoai_response = {"version": "1.0", "response": { "open_mic": False, "to_speak": { "type": 0, "text": news_str } }, "is_session_end": False } return xiaoai_response

复制代码


完成之后,通过 Serverless Framework 进行部署,并绑定 API 网关触发器,然后通过请求地址就可以看到测试结果:



这时,我们已经获得了目标数据,在小爱同学官网创建技能开发,填写好和保存好基本信息之后,就可以选择配置服务,在配置信息处填写 HTTPS 中的测试环境地址:



配置完成之后,就可以进入到测试页面开始测试。如下图所示,当我们输入预定的命令“打开云加社区”,系统会正确去到结果信息,并返回结果:



这样,我们就通过 Serverless 架构为小爱同学成功开发了一项新功能,如果想让其它用户也能享受此功能,可以继续发布、审核、上线。

总结

通过 Serverless 架构,我们可以快速为产品增加一些新的功能,赋予新的生机。本文仅仅是抛砖引玉,通过企业微信机器人与 Serverless 架构的结合,使用若干代码实现了提醒吃饭/喝水功能、新闻/天气功能以及业务的监控告警功能,同时发散思维到小爱同学等设备上,通过 Serverless 架构为其赋予新的能力。


2020-06-18 11:392612

评论 2 条评论

发布
用户头像
setverless让用户更关注业务函数的实现,不用考虑其他的了,哈哈
2020-06-21 00:20
回复
这是一个目标,现在是做不到的,例如各大厂商宣传的无需资源评估,但是实际上目前来看,就目前的Serverless还是要的,毕竟愿景和现实有一定差距
2020-08-14 21:32
回复
没有更多了
发现更多内容

调试理解 NodeJS 模块机制sh

yuanyxh

node.js js Node

逻辑删除用户账号合规吗?

江南一点雨

Java 后端

垃圾去无踪,生活更轻松 - StarRocks 如何清理对象存储垃圾数据

Ding_Kai

数据库 StarRocks 湖仓一体

喜讯!云起无垠创始人沈凯文博士荣列科学家创业先锋榜

云起无垠

Web Components 使用体验

yuanyxh

WebComponent webComponents

Michael Rey谈质押的未来:“节点切片是流动性的关键”

股市老人

一文揭秘:火山引擎云基础设施如何支撑大模型应用落地

极客天地

妙用 Batch,StarRocks 存算分离实时性能起飞

Ding_Kai

数据仓库 数据湖 StarRocks

Go 程序如何实现优雅退出?来看看 K8s 是怎么做的——上篇

江湖十年

k8s k8s知识 Go web #k8s Go 面试题 面经 后端 大厂

Microsoft Teams电话

cts喜友科技

通信 通讯 云通讯

资源加载失败重载与前端升级检测方案

yuanyxh

前端 js

豆瓣评分9.4!最适合Python入门后进阶的Python食谱!

我再BUG界嘎嘎乱杀

Python 编程 后端 开发语言

2025年中国(成都)国际航空航天及无人机展会

秋硕展览

怎么制作韦恩图?用这款在线白板绘制简单又漂亮!

职场工具箱

效率工具 职场 在线白板 办公软件 绘图工具

2024第35届中国(广州)国际大健康产业博览会

秋硕展览

API集成的未来:行业级解决方案的发展趋势

幂简集成

API API集成

探索商品详情API中的重量与体积信息:解锁精准物流管理与用户购物体验的秘密

代码忍者

API 测试 API 策略

Python进行Socket接口测试的实现

我再BUG界嘎嘎乱杀

Python 编程 后端 socket 接口测试

Match与RFG:颠覆传统社交,开启价值社交新时代

股市老人

活动报名:从手搓 AI bot 到多模态 AI agent+TEN 框架丨 RTE Meetup,上海,8.31

声网

【KDD2024】面向集群整体作业运行变慢的异常检测

阿里云大数据AI技术

人工智能 数据挖掘 阿里云 异常检测 论文

我对管理的理解

老张

团队管理 管理者 人员招聘

Monorepo:让你的项目脱胎换骨,既能代码复用,又能独立部署!

OpenTiny社区

开源 前端 组件库 OpenTiny

“智启新机 云驱增长”——2024腾讯全球数字生态大会

ToB行业头条

Serverless实战:利用触发器定制一个专属的企业微信机器人_服务革新_刘宇_InfoQ精选文章