基于 Serverless + 企业微信打造 nCoV 疫情监控小助手

作者:Tabor 最近的一些疫情信息很让人揪心,为了方便大家掌握疫情信息,在空闲之余做了一个关于 nCoV 的疫情监控小助手。主要的功能是通过企业微信的 WebHook 来推送疫情信息。这里将使用 Serverless 的整体代码思路和架构方式分享给大家。

实现效果

我们想要实现的大致的效果是这样的:

首先,我们需要解决的是数据来源问题,这里我们可以使用python爬虫来做这件事情,但是由于个人比较懒所以直接用的 2019-nCoV-Crawler  ,这个项目已经集成了现有的API,所以我们直接调用即可。当然有能力的同学也可以自己部署Python,我这边是自己部署的,但是这不是本次的重点,就不再赘述。

现在,我们有了数据,但是数据怎么打到服务器呢?又该如何触发?当然使用CVM也是可以的,但是似乎太笨拙,并且消耗量很大,需要自己搭好所有环境。所以,这里我们选用Serverless方式来部署。

核心逻辑

我们来看看整体业务的代码部分吧,毕竟这里是整个机器人的核心。我们来看代码(请求三次接口):

复制代码

<?php
function main_handler($event, $context) {
// 广东省情况
$curlsz = curl_init();
curl_setopt_array($curlsz, array(CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/area?latest=0&province=%E5%B9%BF%E4%B8%9C%E7%9C%81",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 3000,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "GET",CURLOPT_HTTPHEADER => array("Accept: */*","Cache-Control: no-cache","Connection: keep-alive","Host: lab.isaaclin.cn","Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e","User-Agent: PostmanRuntime/7.15.0","accept-encoding: gzip, deflate","cache-control: no-cache"),
));$responsesz = curl_exec($curlsz);
$echo_responsesz = json_decode($responsesz, true);
$err = curl_error($curlsz);
curl_close($curlsz);// 湖北省情况
$curlhb = curl_init();
curl_setopt_array($curlhb, array(CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/area?latest=0&province=%E6%B9%96%E5%8C%97%E7%9C%81",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 3000,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "GET",CURLOPT_HTTPHEADER => array("Accept: */*","Cache-Control: no-cache","Connection: keep-alive","Host: lab.isaaclin.cn","Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e","User-Agent: PostmanRuntime/7.15.0","accept-encoding: gzip, deflate","cache-control: no-cache"),
));$responsehb = curl_exec($curlhb);
$echo_responsehb = json_decode($responsehb, true);
$err = curl_error($curlhb);
curl_close($curlhb);// 全国总体情况
$curlall = curl_init();
curl_setopt_array($curlall, array(CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/overall",CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 3000,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "GET",CURLOPT_HTTPHEADER => array("Accept: */*","Cache-Control: no-cache","Connection: keep-alive","Host: lab.isaaclin.cn","Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e","User-Agent: PostmanRuntime/7.15.0","accept-encoding: gzip, deflate","cache-control: no-cache"),
));$responseall = curl_exec($curlall);
$echo_responseall = json_decode($responseall, true);
$err = curl_error($curlall);
curl_close($curlall);//判断是否为深圳地域(这里逻辑写的比较简单,但是够用了)
if ($echo_responsesz['results'][0]['cities'][0]['cityName'] == '深圳') {$echo_responseszqz = $echo_responsesz['results'][0]['cities'][0]['confirmedCount'];$echo_responseszys = $echo_responsesz['results'][0]['cities'][0]['suspectedCount'];$echo_responseszzy = $echo_responsesz['results'][0]['cities'][0]['curedCount'];$echo_responseszsw = $echo_responsesz['results'][0]['cities'][0]['deadCount'];
} else {$echo_responseszqz = $echo_responsesz['results'][0]['cities'][1]['confirmedCount'];$echo_responseszys = $echo_responsesz['results'][0]['cities'][1]['suspectedCount'];$echo_responseszzy = $echo_responsesz['results'][0]['cities'][1]['curedCount'];$echo_responseszsw = $echo_responsesz['results'][0]['cities'][1]['deadCount'];
}if ($err) {echo "cURL Error #:" . $err;
} else {
//疫情监控告警机器人
$sc = $sc=" **2019-nCoV 疫情信息同步:** > 全国疫情:
> 确诊人数<font color="info">".$echo_responseall['results'][0]['confirmedCount']."</font>,疑似感染人数<font color="info">".$echo_responseall['results'][0]['suspectedCount']."</font>,治愈人数<font color="info">".$echo_responseall['results'][0]['curedCount']."</font>,死亡人数<font color="info">".$echo_responseall['results'][0]['deadCount']."</font>> 广东省:
> 确诊人数<font color="info">".$echo_responsesz['results'][0]['confirmedCount']."</font>,疑似感染人数<font color="info">".$echo_responsesz['results'][0]['suspectedCount']."</font>,治愈人数<font color="info">".$echo_responsesz['results'][0]['curedCount']."</font>,死亡人数<font color="info">".$echo_responsesz['results'][0]['deadCount']."</font>> 湖北省:
> 确诊人数<font color="info">".$echo_responsehb['results'][0]['confirmedCount']."</font>,疑似感染人数<font color="info">".$echo_responsehb['results'][0]['suspectedCount']."</font>,治愈人数<font color="info">".$echo_responsehb['results'][0]['curedCount']."</font>,死亡人数<font color="info">".$echo_responsehb['results'][0]['deadCount']."</font>> 深圳市:
> 确诊人数<font color="info">".$echo_responseszqz."</font>,疑似感染人数<font color="info">".$echo_responseszys."</font>,治愈人数<font color="info">".$echo_responseszzy."</font>,死亡人数<font color="info">".$echo_responseszsw."</font>> <font color="info">".$echo_responseall['results'][0]['note1']."</font>
> <font color="info">".$echo_responseall['results'][0]['note2']."</font>
> <font color="info">".$echo_responseall['results'][0]['note3']."</font>
> <font color="info">".$echo_responseall['results'][0]['remark1']."</font>
> <font color="info">".$echo_responseall['results'][0]['remark2']."</font>
> <font color="info"> 信息出处:".$echo_responseall['results'][0]['generalRemark']."</font> >[更多数据请查看](https://news.qq.com/zt2020/page/feiyan.htm) ";
$post = array('msgtype' => 'markdown', 'markdown' => array('content' => $sc));
$curl = curl_init();
curl_setopt_array($curl, array(CURLOPT_URL => "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=",  //这里的地址填写为企业微信的HOOK路径,https://work.weixin.qq.com/api/doc/90000/90136/91770CURLOPT_RETURNTRANSFER => true,CURLOPT_ENCODING => "",CURLOPT_MAXREDIRS => 10,CURLOPT_TIMEOUT => 10,CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,CURLOPT_CUSTOMREQUEST => "POST",CURLOPT_POSTFIELDS => json_encode($post,JSON_UNESCAPED_UNICODE),CURLOPT_HTTPHEADER => array("Cache-Control: no-cache","Postman-Token: ab32082b-ce64-4832-b51f-8f2f1b3e98ef"),
));$response = curl_exec($curl);
$err = curl_error($curl);curl_close($curl);return "运行成功";
}}?>

是不是很简单呢?请求数据,发送数据。

那么我们接下了重点看下如何将我们的业务代码上传到云端呢? 这里的云端我用的是腾讯云Serverless服务 SCF云函数 。整个部署,使用过程都是免费的,对于开发者来讲小项目使用的话免费额度是完全够用的。无需担心额外付费。

Serverless部署,选用的是比较流行的 Serverless Framework,使用和部署也是完全免费的,那么下面我就来介绍下具体的部署过程吧。

安装 Serverless 框架

首先,第一步,我们来安装一个Serverless framework的开发框架:

复制代码
$ npm install -g serverless

然后,我们创建一个函数目录:

复制代码
$ mkdir nCov-function
$ cd nCov-function

相关函数目录的内容如下:

复制代码
|- code|- index.php  // 这里就是上面的业务代码存放位置
|- serverless.yml //serverless 配置文件

配置Yml文件

接下来,是我们的重头戏,配置函数yml文件:

复制代码

# serverless.yml
myFunction:component: "@serverless/tencent-scf"  //引用tencent-scf componentinputs:name: nCoVFunction   //函数名称enableRoleAuth: truecodeUri: ./code  //代码本地存放位置handler: index.main_handlerruntime: Php5region: ap-shanghai //函数运行地域description: My Serverless nCoV Function.memorySize: 128  //运行内存timeout: 20  //超时时间exclude:- .gitignore- .git/**- node_modules/**- .serverless- .envinclude:- ./nCoVFunction.zipenvironment:variables:TEST: valevpcConfig:subnetId: ''vpcId: ''events:- timer:  // 定时触发器name: timerparameters:cronExpression: '0 0 10,21 * * * *'  //明天早上10点,晚上21点enable: true

万事具备,我们就可以直接部署 SLS 了。

部署到云端

通过sls命令(serverless的缩写)进行部署,并可以添加–debug参数查看部署过程中的信息:

复制代码

taborchen$ sls --debugDEBUG ─ Resolving the template's static variables.DEBUG ─ Collecting components from the template.DEBUG ─ Downloading any NPM components found in the template.DEBUG ─ Analyzing the template's components dependencies.DEBUG ─ Creating the template's components graph.DEBUG ─ Syncing template state.DEBUG ─ Executing the template's components graph.DEBUG ─ Compressing function nCoVFunction file to /Users/taborchen/Desktop/工作/yiqing/.ser
verless/nCoVFunction.zip.DEBUG ─ Compressed function nCoVFunction file successfulDEBUG ─ Uploading service package to cos[sls-cloudfunction-ap-shanghai-code]. sls-cloudfunc
tion-default-nCoVFunction-1580960644.zipDEBUG ─ Uploaded package successful /Users/taborchen/Desktop/工作/yiqing/.serverless/nCoVFu
nction.zipDEBUG ─ Creating function nCoVFunctionDEBUG ─ Created function nCoVFunction successfulDEBUG ─ Setting tags for function nCoVFunctionDEBUG ─ Creating trigger for function nCoVFunctionDEBUG ─ Created timer trigger timer for function nCoVFunction success.DEBUG ─ Deployed function nCoVFunction successful

运行结果如下:

这样,我们就完成了一个 nCoV 的在线触发函数机器人~是不是很简单呢?快来开始动手吧~

传送门:

  • GitHub: github.com/serverless
  • 官网:serverless.com

欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!

Serverless 实战 —— 基于 Serverless + 企业微信打造 nCoV 疫情监控小助手相关推荐

  1. 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ

    文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...

  2. Serverless 实战 —— 基于 Serverless 的 VuePress 极简静态网站

    基于 Serverless 的 VuePress 极简静态网站 作者: Aceyclee 之前用过 Docsify + Serverless Framework 快速创建个人博客系统,虽然 docsi ...

  3. 线下迁移线上,如何使用企业微信打造数字化企业?

    导读 | 特殊时期,很多企业都在思考一个问题--如何将线下迁移线上?而微信发布的全新企业微信3.0,提出对内让信息流转高效,对外连接11亿微信用户.那么,如何在企业微信上创建一个连接客户的应用,将小程 ...

  4. Serverless实战 —— ​​​​​​​Laravel + Serverless Framework 快速创建 CMS 内容管理系统

    Serverless实战 -- Laravel + Serverless Framework 快速创建 CMS 内容管理系统 作者: Tabor 今天,为大家带来一篇 Laravel + Server ...

  5. 前端基于vue企业微信JS-SDK语音识别功能开发(同公众号)

    前端基于vue企业微信JS-SDK语音识别功能开发(同公众号) 微信JS-SDK 1.前期准备 前端代码撰写 微信JS-SDK 前端需要实现一个功能,如录音,拍照,分享,地理位置等,前端想要实现这些功 ...

  6. 实战 | 基于 Serverless 技术的视频截帧架构如何实现?

    前言 视频直播是一种创新的在线娱乐形式,具有多人实时交互特性,在电商.游戏.在线教育.娱乐等多个行业都有着非常广泛的应用.随着网络基础设施的不断改善以及社交娱乐需求的不断增长,视频直播在持续渗透进大家 ...

  7. 小程序毕业设计 基于java后台微信电影院选座购票小程序毕业设计参考

    效果图

  8. 企业微信开源系统,让开发者快速搭建基于企业微信的私域流量运营系统

    "经过行业的实战应用,企业微信已经成为"私域流量"运营的主要工具" 尽管现在基于企业微信开发的第三方产品处于一个百家争鸣的时代,但仍旧未能看到一个开源的.真正为 ...

  9. MoChat企业微信开源系统,让开发者快速搭建基于企业微信的私域流量运营系统

    "经过行业的实战应用,企业微信已经成为"私域流量"运营的主要工具" 尽管现在基于企业微信开发的第三方产品处于一个百家争鸣的时代,但仍旧未能看到一个开源的.真正为 ...

最新文章

  1. 传统jdbc存在的问题总结
  2. C++:类-多态的学习和使用
  3. CentOS7入门_安装并配置mysql5.7.18
  4. Simulink框图和S-函数
  5. 源码学习-String类
  6. Something about WMI
  7. Linux基本命令总结(初学者可以借鉴学习)
  8. 【缺陷检测】基于matlab GUI形态学PCB电路板缺陷检测【含Matlab源码 821期】
  9. mysql的lpad函数
  10. SQL SERVER “指定的网络名不再可用”
  11. 谷歌个性化地图瓦片_对Google广告个性化的调查
  12. win10系统word2019如何去掉文字背景颜色方法
  13. 高登复习笔记之Http网络协议和Servlet
  14. Tenorshare UltData(苹果数据恢复软件)v8.5.3官方版
  15. ISCC 2022 wp
  16. 【ML】第六章 决策树
  17. Cisco 路由器与ASA防火墙 Site-to-Site IPsec
  18. Creative的迷失与重生之路
  19. 关闭windows安全中心报警
  20. 什么是wiki?WikiWikiWeb 中文介绍

热门文章

  1. 自适应网页设计(Responsive Web Design)响应式设计
  2. UITableView 系列四 :项目中行的操作 (添加移动和删除)(实例)
  3. 开源php ajax 图片编辑器 Open source PHP-based Ajax image editor
  4. Bootstrap 聚合
  5. redis——redis主从复制
  6. 如何获取 docker 容器(container)的 ip 地址
  7. IDEA中Alt + Insert快捷键定制生成类方法
  8. HTML——初识html,元素 属性 段落 文本格式化 链接 头部入门
  9. 【Transformer】视觉Transformer最新进展——持续更新
  10. 【今日CV 计算机视觉论文速览 第137期】Fri, 28 Jun 2019