从企业微信机器人到小爱同学,用 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 os import json import 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 os import json import 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 os import json import 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, json from datetime import datetime as pydatetime from urllib.parse import urlencode from 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: %snx-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](%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 os import 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 技术也逐渐走进了千家万户,无论是扫地机器人、智能窗帘等智能家居,还是智能音箱等娱乐设施,IoT 技术都变得可见可及。
小爱同学,也能通过 Serverless 架构,快速开发出专属新功能。
首先我们去「小爱同学」的开放平台注册账号,并且提交认证:
接下来对小爱同学的定制化功能进行研究。如图所示,在开发文档中,我们可以看到小爱同学开发者平台为我们提供的能力信息,同样我们也可以查看到 request 以及 response 的详细信息:
继续进行项目设计。本文的目标是通过对小爱同学说出「进入云+社区」等关键词,为用户返回腾讯云+社区的最新热门文章的题目和简介。
整个流程如图所示:
函数代码编写:
# -*- coding: utf8 -*- import json import logging import urllib.request import 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 Framework 30 天试用计划
我们诚邀您来体验最便捷的 Serverless 开发和部署方式。在试用期内,相关联的产品及服务均提供免费资源和专业的技术支持,帮助您的业务快速、便捷地实现 Serverless!
One More Thing
3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用?
复制链接至 PC 浏览器访问:https://serverless.cloud.tencent.com/deploy/express
3 秒极速部署,立即体验史上最快的 Serverless HTTP 实战开发!
传送门:
- GitHub: github.com/serverless
- 官网:serverless.com
欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
智能小程序新增Page.onInit功能,有效提升性能
为进一步帮助您提升小程序性能,缩短小程序页面渲染时间,智能小程序上线了一个新的生命周期 Page.onInit,您可在3.160.12 及以上的基础库版本中使用。 更多内容查看开发者社区/更多招聘信息 有效提升性能 以百度知道小程序为例,使用 Page.onInit 进行优化后,上屏时长约提升了 210ms。 以下是百度知道、百度百科和宝宝知道使用Page.onInit后的收益: 小程序 收益(单位 ms) 百度知道 210 百度百科 100 宝宝知道 150 什么是Page.onInit Page.onInit 是百度智能小程序提供一种页面级别的生命周期。该生命周期函数执行时机远早于页面中的其他生命周期。 如果您在Page.onInit中去发起网络请求,会提前获取页面数据。因此会缩短页面的渲染时间,极大提升小程序的用户体验。 如果您对小程序启动原理感兴趣,可参考下图小程序的启动流程,Page.onInit是在收集initData发送setInitData后立即执行。由此可见,页面主数据的请求放在 onInit 中,将快于页面的其他生命周期。 如果您想了解Page.onInit的细节原...
- 下一篇
国内IT社区网站的比较和选择
IT社区网站的比较 CSDN 北京的公司,网站功能涵盖面很广,大而全但分类混乱,缺乏主次,主打的博客强项,但博客内容质量参差不齐,标题党太多,竟然还推荐到首页,不知道什么逻辑。类微博功能Blink竟然只能手机APP能用,WEB版压根看不倒,可见内部多分裂。人气高没错,但像踏实看点东西,你得多淘淘,不要被带歪了。 51CTO 北京的公司,表面功夫不错,猛一看能把人唬住,但设计细节太差,主打行业资讯新闻,交流比较弱,博客昵称竟然不能修改,差评。 SegmentFaut思否,杭州的公司,启用了新域名sifou.net,总算好记了一些,网站功能紧凑友好,小而美;有文章和笔记功能,但不叫博客,审查比较严格,内容有保证,就是人气差点。 简书,各类水文集中地,压根就算不上IT社区,直接忽视吧。 掘金,跟简书网站风格比较像,首页往下永远拉不到头,想看下备案信息做梦去吧,就像个灌水社区,不知道为什么知乎总是推荐这个。 博客园,开博客还要申请,内容管控严格,这样可能保证了内容质量,但网站颜值实在接受不了,UI依然坚持10年前的样子,与当下的扁平风有点格格不入。 知乎,等你哪天混的功德圆满,无欲无求了,就想...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 设置Eclipse缩进为4个空格,增强代码规范
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装