最近的一些疫情信息很讓人揪心,為了方便大家掌握疫情信息,在空閑之余做了一個關于 nCoV 的疫情監控小助手。主要的功能是通過企業微信的 WebHook 來推送疫情信息。這里將使用 Serverless 的整體代碼思路和架構方式分享給大家。本文作者:tabor
實現效果
我們想要實現的大致的效果是這樣的:
首先,我們需要解決的是數據來源問題,這里我們可以使用 python 爬蟲來做這件事情,但是由于個人比較懶所以直接用的 2019-nCoV-Crawler ,這個項目已經集成了現有的 API,所以我們直接調用即可。當然有能力的同學也可以自己部署 Python,我這邊是自己部署的,但是這不是本次的重點,就不在贅述。
現在,我們有了數據,但是數據怎么打到服務器呢?又該如何觸發?當然使用 CVM 也是可以的,但是似乎太笨拙,并且消耗量很大,需要自己搭好所有環境。所以,這里我們選用 Serverless 方式來部署。
核心邏輯
我們來看看整體業務的代碼部分吧,畢竟這里是整個機器人的核心。我們來看代碼(請求三次接口):
<?phpfunction 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 疫情信息同步:** /n> 全國疫情: > 確診人數<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> 廣東省: > 確診人數<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> 湖北省: > 確診人數<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> 深圳市: > 確診人數<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> <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> /n>[更多數據請查看](https://news.qq.com/zt2020/page/feiyan.htm) /n";$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/91770 CURLOPT_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.ymlmyFunction: component: "@serverless/tencent-scf" //引用tencent-scf component inputs: name: nCoVFunction //函數名稱 enableRoleAuth: true codeUri: ./code //代碼本地存放位置 handler: index.main_handler runtime: Php5 region: ap-shanghai //函數運行地域 description: My Serverless nCoV Function. memorySize: 128 //運行內存 timeout: 20 //超時時間 exclude: - .gitignore - .git/** - node_modules/** - .serverless - .env include: - ./nCoVFunction.zip environment: variables: TEST: vale vpcConfig: subnetId: '' vpcId: '' events: - timer: // 定時觸發器 name: timer parameters: cronExpression: '0 0 10,21 * * * *' //明天早上10點,晚上21點 enable: true
萬事具備,我們就可以直接部署 SLS 了。
部署到云端
通過 sls 命令(serverless 的縮寫)進行部署,并可以添加 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品视频免费| 亚州精品天堂中文字幕| 亚洲天堂色网站| 精品久久久久久久中文字幕| 欧洲成人在线视频| 久久影视电视剧免费网站| 欧美日韩国产色| 久久精品一本久久99精品| 国产一区二区三区视频在线观看| 欧美裸体男粗大视频在线观看| 欧美激情伊人电影| 欧美激情18p| 日韩经典一区二区三区| 日本三级韩国三级久久| 亚洲欧洲一区二区三区在线观看| 亚洲成人在线网| 亚洲欧美国产视频| 国产人妖伪娘一区91| 欧美在线一级va免费观看| 日本成人黄色片| 日韩欧美亚洲综合| 欧美国产日韩一区二区在线观看| 欧美午夜精品久久久久久浪潮| 91国内免费在线视频| 亚洲综合在线做性| 欧美成人在线免费| 国产精品精品久久久久久| 成人午夜两性视频| 中文字幕亚洲一区二区三区五十路| 亚洲国产欧美一区二区三区久久| 中文字幕一区二区三区电影| 不卡av日日日| 国产欧美精品久久久| 日本精品久久久| 久久国产一区二区三区| 亚洲女人初尝黑人巨大| 亚洲精品自拍第一页| 国产精品日日做人人爱| 成人h猎奇视频网站| 成人av在线网址| 成人欧美一区二区三区黑人孕妇| 国产不卡一区二区在线播放| 国产精品视频内| 久久色精品视频| 欧美成人精品h版在线观看| 91久久久国产精品| 欧美二区在线播放| 国产欧美在线播放| 亚洲欧美一区二区精品久久久| 日韩欧美国产骚| 久久精品99久久久香蕉| 欧美壮男野外gaytube| 伊人久久综合97精品| 九九热精品在线| 久久久精品日本| 亚洲最新av在线| 91精品视频大全| 精品中文字幕久久久久久| 亚洲自拍偷拍区| 97国产精品免费视频| 伊人久久大香线蕉av一区二区| 亚洲japanese制服美女| 亚洲成人av在线播放| 色婷婷久久一区二区| 88国产精品欧美一区二区三区| 91久久国产综合久久91精品网站| 久久成年人视频| 69视频在线免费观看| 国产一区二区三区视频在线观看| 欧美精品手机在线| 久久久久久久999精品视频| 综合欧美国产视频二区| 欧美伊久线香蕉线新在线| 亚洲第一福利在线观看| 久久精品一本久久99精品| 国产精品自产拍在线观看| 精品久久久国产| 欧美成人免费播放| 国产日韩欧美在线观看| 欧美日韩黄色大片| 亚洲国产成人在线视频| 亚洲国产精品福利| 国产精品第一第二| 精品国产乱码久久久久酒店| 欧美成人中文字幕在线| 日韩不卡在线观看| 高清日韩电视剧大全免费播放在线观看| 欧美性做爰毛片| 国产欧美最新羞羞视频在线观看| 国产日韩欧美黄色| 久久久久久久电影一区| 久久欧美在线电影| 国产精品久久久久福利| 91中文在线观看| 国产精品久久久久久久一区探花| 91亚洲国产成人久久精品网站| 国产精品美女久久久久av超清| 97久久久免费福利网址| 亚洲三级av在线| 亚洲天堂日韩电影| 久久免费精品日本久久中文字幕| 欧美精品一区二区免费| 成人黄色中文字幕| 国语自产精品视频在线看抢先版图片| 最好看的2019年中文视频| 欧美性在线观看| 日韩欧美中文字幕在线播放| 欧美成年人网站| 亚洲曰本av电影| 国产精品久久久久久久久久久久| 国产欧美在线看| 精品视频—区二区三区免费| 日韩精品极品在线观看播放免费视频| 精品久久久久久久久久ntr影视| 91精品在线观看视频| 欧美猛交免费看| 97成人精品区在线播放| 亚洲精品电影久久久| 欧美在线一区二区三区四| 国产日韩中文在线| 岛国av在线不卡| 国产精品久久二区| 精品久久久久久国产91| 国产美女直播视频一区| 91视频九色网站| 久久99久久亚洲国产| 国产在线观看一区二区三区| 欧美高清激情视频| 欧洲成人在线视频| 免费99精品国产自在在线| 亚洲图片在区色| 国产精品网红福利| 亚洲小视频在线| 欧美成人激情图片网| 91成品人片a无限观看| 性色av一区二区三区红粉影视| 国外成人免费在线播放| 国产视频亚洲视频| 亚洲成成品网站| 国产亚洲视频中文字幕视频| 欧美成人在线影院| 亚洲国产小视频| 懂色av影视一区二区三区| 国产精品入口免费视| 日韩免费观看av| 亚洲欧美精品一区| 色七七影院综合| 亚洲国产精品成人av| 亚洲激情在线视频| 国产精品精品一区二区三区午夜版| 91av网站在线播放| 欧美激情亚洲另类| 国产精品无码专区在线观看| 欧美日韩在线免费观看| 国产精品中文字幕在线观看| 久久99精品国产99久久6尤物| 91精品国产高清久久久久久91| 美女国内精品自产拍在线播放| 亚洲一区999| 在线观看不卡av| 另类图片亚洲另类| 91国内产香蕉| 久久久精品999| 久久99国产精品久久久久久久久|