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

实现效果

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

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

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

核心逻辑

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

  1. <?php
  2. function main_handler($event, $context) {
  3. // 广东省情况
  4. $curlsz = curl_init();
  5. curl_setopt_array($curlsz, array(
  6. CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/area?latest=0&province=%E5%B9%BF%E4%B8%9C%E7%9C%81",
  7. CURLOPT_RETURNTRANSFER => true,
  8. CURLOPT_ENCODING => "",
  9. CURLOPT_MAXREDIRS => 10,
  10. CURLOPT_TIMEOUT => 3000,
  11. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  12. CURLOPT_CUSTOMREQUEST => "GET",
  13. CURLOPT_HTTPHEADER => array(
  14. "Accept: */*",
  15. "Cache-Control: no-cache",
  16. "Connection: keep-alive",
  17. "Host: lab.isaaclin.cn",
  18. "Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e",
  19. "User-Agent: PostmanRuntime/7.15.0",
  20. "accept-encoding: gzip, deflate",
  21. "cache-control: no-cache"
  22. ),
  23. ));
  24. $responsesz = curl_exec($curlsz);
  25. $echo_responsesz = json_decode($responsesz, true);
  26. $err = curl_error($curlsz);
  27. curl_close($curlsz);
  28. // 湖北省情况
  29. $curlhb = curl_init();
  30. curl_setopt_array($curlhb, array(
  31. CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/area?latest=0&province=%E6%B9%96%E5%8C%97%E7%9C%81",
  32. CURLOPT_RETURNTRANSFER => true,
  33. CURLOPT_ENCODING => "",
  34. CURLOPT_MAXREDIRS => 10,
  35. CURLOPT_TIMEOUT => 3000,
  36. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  37. CURLOPT_CUSTOMREQUEST => "GET",
  38. CURLOPT_HTTPHEADER => array(
  39. "Accept: */*",
  40. "Cache-Control: no-cache",
  41. "Connection: keep-alive",
  42. "Host: lab.isaaclin.cn",
  43. "Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e",
  44. "User-Agent: PostmanRuntime/7.15.0",
  45. "accept-encoding: gzip, deflate",
  46. "cache-control: no-cache"
  47. ),
  48. ));
  49. $responsehb = curl_exec($curlhb);
  50. $echo_responsehb = json_decode($responsehb, true);
  51. $err = curl_error($curlhb);
  52. curl_close($curlhb);
  53. // 全国总体情况
  54. $curlall = curl_init();
  55. curl_setopt_array($curlall, array(
  56. CURLOPT_URL => "https://lab.isaaclin.cn/nCoV/api/overall",
  57. CURLOPT_RETURNTRANSFER => true,
  58. CURLOPT_ENCODING => "",
  59. CURLOPT_MAXREDIRS => 10,
  60. CURLOPT_TIMEOUT => 3000,
  61. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  62. CURLOPT_CUSTOMREQUEST => "GET",
  63. CURLOPT_HTTPHEADER => array(
  64. "Accept: */*",
  65. "Cache-Control: no-cache",
  66. "Connection: keep-alive",
  67. "Host: lab.isaaclin.cn",
  68. "Postman-Token: 680e5ea7-5c2e-4fb6-9295-7e336f2252c6,abd73e01-2a60-42b5-9bbe-92aa83805a7e",
  69. "User-Agent: PostmanRuntime/7.15.0",
  70. "accept-encoding: gzip, deflate",
  71. "cache-control: no-cache"
  72. ),
  73. ));
  74. $responseall = curl_exec($curlall);
  75. $echo_responseall = json_decode($responseall, true);
  76. $err = curl_error($curlall);
  77. curl_close($curlall);
  78. //判断是否为深圳地域(这里逻辑写的比较简单,但是够用了)
  79. if ($echo_responsesz['results'][0]['cities'][0]['cityName'] == '深圳') {
  80. $echo_responseszqz = $echo_responsesz['results'][0]['cities'][0]['confirmedCount'];
  81. $echo_responseszys = $echo_responsesz['results'][0]['cities'][0]['suspectedCount'];
  82. $echo_responseszzy = $echo_responsesz['results'][0]['cities'][0]['curedCount'];
  83. $echo_responseszsw = $echo_responsesz['results'][0]['cities'][0]['deadCount'];
  84. } else {
  85. $echo_responseszqz = $echo_responsesz['results'][0]['cities'][1]['confirmedCount'];
  86. $echo_responseszys = $echo_responsesz['results'][0]['cities'][1]['suspectedCount'];
  87. $echo_responseszzy = $echo_responsesz['results'][0]['cities'][1]['curedCount'];
  88. $echo_responseszsw = $echo_responsesz['results'][0]['cities'][1]['deadCount'];
  89. }
  90. if ($err) {
  91. echo "cURL Error #:" . $err;
  92. } else {
  93. //疫情监控告警机器人
  94. $sc = $sc=" **2019-nCoV 疫情信息同步:** \n
  95. > 全国疫情:
  96. > 确诊人数<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>\n
  97. > 广东省:
  98. > 确诊人数<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>\n
  99. > 湖北省:
  100. > 确诊人数<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>\n
  101. > 深圳市:
  102. > 确诊人数<font color=\"info\">".$echo_responseszqz."</font>,疑似感染人数<font color=\"info\">".$echo_responseszys."</font>,治愈人数<font color=\"info\">".$echo_responseszzy."</font>,死亡人数<font color=\"info\">".$echo_responseszsw."</font>\n
  103. > <font color=\"info\">".$echo_responseall['results'][0]['note1']."</font>
  104. > <font color=\"info\">".$echo_responseall['results'][0]['note2']."</font>
  105. > <font color=\"info\">".$echo_responseall['results'][0]['note3']."</font>
  106. > <font color=\"info\">".$echo_responseall['results'][0]['remark1']."</font>
  107. > <font color=\"info\">".$echo_responseall['results'][0]['remark2']."</font>
  108. > <font color=\"info\"> 信息出处:".$echo_responseall['results'][0]['generalRemark']."</font> \n
  109. >[更多数据请查看](https://news.qq.com/zt2020/page/feiyan.htm) \n
  110. ";
  111. $post = array('msgtype' => 'markdown', 'markdown' => array('content' => $sc));
  112. $curl = curl_init();
  113. curl_setopt_array($curl, array(
  114. CURLOPT_URL => "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", //这里的地址填写为企业微信的HOOK路径,https://work.weixin.qq.com/api/doc/90000/90136/91770
  115. CURLOPT_RETURNTRANSFER => true,
  116. CURLOPT_ENCODING => "",
  117. CURLOPT_MAXREDIRS => 10,
  118. CURLOPT_TIMEOUT => 10,
  119. CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  120. CURLOPT_CUSTOMREQUEST => "POST",
  121. CURLOPT_POSTFIELDS => json_encode($post,JSON_UNESCAPED_UNICODE),
  122. CURLOPT_HTTPHEADER => array(
  123. "Cache-Control: no-cache",
  124. "Postman-Token: ab32082b-ce64-4832-b51f-8f2f1b3e98ef"
  125. ),
  126. ));
  127. $response = curl_exec($curl);
  128. $err = curl_error($curl);
  129. curl_close($curl);
  130. return "运行成功";
  131. }
  132. }
  133. ?>

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

那么我们接下了重点看下如何将我们的业务代码上传到云端呢?

这里的云端我用的是腾讯云 Serverless 服务 SCF云函数 。整个部署,使用过程都是免费的,对于开发者来讲小项目使用的话免费额度是完全够用的。无需担心额外付费。

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

安装 Serverless 框架

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

  1. $ npm install -g serverless

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

  1. $ mkdir nCov-function
  2. $ cd nCov-function

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

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

配置 Yml 文件

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

  1. # serverless.yml
  2. myFunction:
  3. component: "@serverless/tencent-scf" //引用tencent-scf component
  4. inputs:
  5. name: nCoVFunction //函数名称
  6. enableRoleAuth: true
  7. codeUri: ./code //代码本地存放位置
  8. handler: index.main_handler
  9. runtime: Php5
  10. region: ap-shanghai //函数运行地域
  11. description: My Serverless nCoV Function.
  12. memorySize: 128 //运行内存
  13. timeout: 20 //超时时间
  14. exclude:
  15. - .gitignore
  16. - .git/**
  17. - node_modules/**
  18. - .serverless
  19. - .env
  20. include:
  21. - ./nCoVFunction.zip
  22. environment:
  23. variables:
  24. TEST: vale
  25. vpcConfig:
  26. subnetId: ''
  27. vpcId: ''
  28. events:
  29. - timer: // 定时触发器
  30. name: timer
  31. parameters:
  32. cronExpression: '0 0 10,21 * * * *' //明天早上10点,晚上21点
  33. enable: true

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

部署到云端

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

  1. taborchen$ sls --debug
  2. DEBUG Resolving the template's static variables.
  3. DEBUG ─ Collecting components from the template.
  4. DEBUG ─ Downloading any NPM components found in the template.
  5. DEBUG ─ Analyzing the template's components dependencies.
  6. DEBUG Creating the template's components graph.
  7. DEBUG ─ Syncing template state.
  8. DEBUG ─ Executing the template's components graph.
  9. DEBUG Compressing function nCoVFunction file to /Users/taborchen/Desktop/工作/yiqing/.ser
  10. verless/nCoVFunction.zip.
  11. DEBUG Compressed function nCoVFunction file successful
  12. DEBUG Uploading service package to cos[sls-cloudfunction-ap-shanghai-code]. sls-cloudfunc
  13. tion-default-nCoVFunction-1580960644.zip
  14. DEBUG Uploaded package successful /Users/taborchen/Desktop/工作/yiqing/.serverless/nCoVFu
  15. nction.zip
  16. DEBUG Creating function nCoVFunction
  17. DEBUG Created function nCoVFunction successful
  18. DEBUG Setting tags for function nCoVFunction
  19. DEBUG Creating trigger for function nCoVFunction
  20. DEBUG Created timer trigger timer for function nCoVFunction success.
  21. DEBUG Deployed function nCoVFunction successful

运行结果如下:

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


传送门:

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

基于 Serverless +企业微信打造 nCoV 疫情监控小助手的更多相关文章

  1. zabbix企业微信报警实现

    企业微信配置 # 注册 企业微信注册地址:https://work.weixin.qq.com 笔者注册的企业微信名称为 5iik # 配置 # 在主干5iik(企业名称)下添加子部门(监控组),并将 ...

  2. H5与企业微信jssdk集成

    H5与企业微信jssdk集成 一.公众号设置 注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单.可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没 ...

  3. zabbix实现企业微信监控报警

    一.zabbix基本说明 简介:zabbix基于Web界面的分布式系统监控的企业级开源软件.可以监控各种系统与设备,网络参数,保证服务器设备安全运营:提供灵活的通知机制.如果检测到的指标不达标,就实现 ...

  4. 基于小程序云Serverless开发微信小程序

    本文主要以使用小程序云Serverless服务开发一个记事本微信小程序为例介绍如何使用小程序云Serverless开发微信小程序.记事本小程序的开发涉及到云函数调用.云数据库存储.图片存储等功能,较好 ...

  5. 分布式监控系统Zabbix-3.0.3-新版微信报警(企业微信取代企业号)

    一般来说,Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是现在越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人 ...

  6. iMX287A基于嵌入式Qt的新冠肺炎疫情监控平台

    目录 1.前言 2.数据接口的获取 3.Qt界面的实现 4.在开发板上运行Qt程序 5.最终效果 6.代码下载 @ 1.前言 之前我使用在桌面版本Qt实现了肺炎疫情监控平台:基于Qt的新冠肺炎疫情数据 ...

  7. 基于Prometheus和Grafana打造业务监控看板

    前言 业务监控对许许多多的场景都是十分有意义,业务监控看板可以让我们比较直观的看到当前业务的实时情况,然后运营人员可以根据这些情况及时对业务进行调整操作,避免业务出现大问题. 老黄曾经遇到过一次比较尴 ...

  8. 在微信框架模块中,基于Vue&Element前端的微信公众号和企业微信的用户绑定

    在一个和微信相关的业务管理系统,我们有时候需要和用户的微信账号信息进行绑定,如对公众号.企业微信等账号绑定特定的系统用户,可以进行扫码登录.微信信息发送等操作,用户的绑定主要就是记录公众号用户的ope ...

  9. zabbix 监控redis 挂掉自动重启 并发送企业微信

    1.创建redis监控项[配置]-[主机]-[监控项]-创建监控项,监控6379端口(注意关闭防火墙或者开启防火墙端口6379) redis配置文件设置允许任何地址监听: 添加监控项 2.创建redi ...

随机推荐

  1. 20191031-6beta week 1/2 Scrum立会报告+燃尽图 04

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9914 git地址:https://e.coding.net/Eustia/ ...

  2. 洛谷$P5444\ [APIO2019]$奇怪装置 数论

    正解:数论 解题报告: 传送门$QwQ$ 我好像当初考的时候这题爆零了,,,部分分都没想到,,,我真的好菜$kk$ 考虑如果在$t_1,t_2$两个时刻有$x_1=x_2,y_1=y_2$是什么情况$ ...

  3. CF1272E. Nearest Opposite Parity 题解 广度优先搜索

    题目链接:http://codeforces.com/contest/1272/problem/E 题目大意: 有一个长度为n的数组 \(a\) ,数组坐标从 \(1\) 到 \(n\) . 假设你现 ...

  4. 洛谷P1037 产生数 题解 搜索

    题目链接:https://www.luogu.com.cn/problem/P1037 题目描述 给出一个整数 \(n(n<10^{30})\) 和 \(k\) 个变换规则 \((k \le 1 ...

  5. 1042 字符统计 (20 分)C语言

    请编写程序,找出一段给定文字中出现最频繁的那个英文字母. 输入格式: 输入在一行中给出一个长度不超过 1000 的字符串.字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母, ...

  6. 深度学习论文翻译解析(六):MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications

    论文标题:MobileNets:Efficient Convolutional Neural Networks for Mobile Vision Appliications 论文作者:Andrew ...

  7. ACM北大暑期课培训第一天

    今天是ACM北大暑期课开课的第一天,很幸运能参加这次暑期课,接下来的几天我将会每天写博客来总结我每天所学的内容.好吧下面开始进入正题: 今天第一节课,郭炜老师给我们讲了二分分治贪心和动态规划. 1.二 ...

  8. C++中全排列函数next_permutation 用法

    今天蓝桥杯刷题时发现一道字符串排序问题,突然想起next_permutation()函数和prev_permutation()函数. 就想写下next_permutation()的用法 next_pe ...

  9. 趣谈编程史第2期-这个世界缺少对C语言的敬畏,你不了解的C语言科普

    这是我制作的编程语言科普系列视频的第二期,博客根据视频文案整理而成,提供给有需要的朋友阅读或使用. 视频地址:https://www.bilibili.com/video/av83627932/    ...

  10. python继承简介

    继承 是面向对象的三大特性之一 作用: 通过继承可以使一个类获取其它类中的属性和方法 使用方法: 在定义类时,可以在类名后的括号中指定当前类的父类(超类.基类.super) 这样子类(衍生类)就可以直 ...