用Node.JS打造一個(gè)惡劣天氣實(shí)時(shí)預(yù)警系統(tǒng)
序言:
這幾日,無(wú)論是打開(kāi)電視還是短視頻,無(wú)不是說(shuō)河南鄭州遭遇這場(chǎng)無(wú)法預(yù)測(cè)的大暴雨,尤其是誰(shuí)又能想到地鐵站被洪水倒灌,被困乘客的情境讓人無(wú)法想象。聽(tīng)到一些親歷者寫(xiě)的貼子文章,我們聽(tīng)著他們當(dāng)時(shí)死里逃生的情形,可想象,當(dāng)時(shí)的他們面對(duì)突如其來(lái)的災(zāi)難,又無(wú)法處理的無(wú)助與無(wú)奈。
我們所處的鄭州高新區(qū)也經(jīng)歷了斷水?dāng)嚯姷那闆r,直到發(fā)文的現(xiàn)在,廣電帶寬仍未恢復(fù)信號(hào),辦公室同事基本還在連接熱點(diǎn)辦公。
本文將從實(shí)戰(zhàn)的角度出發(fā),利用NodeJS以及聚合數(shù)據(jù)的第三方免費(fèi)接口打造一個(gè)完整的天氣實(shí)時(shí)預(yù)警項(xiàng)目系統(tǒng)。本文沒(méi)有用到特別高深的技術(shù)棧,目的旨在拋磚引玉。
第一步:找到免費(fèi)天氣預(yù)報(bào)接口
網(wǎng)上很多免費(fèi)獲取天氣的API接口,我這里使用的是聚合數(shù)據(jù)的接口,大廠的相對(duì)穩(wěn)定。
申請(qǐng)地址:https://www.juhe.cn/docs/api/id/73
申請(qǐng)成功后,會(huì)在個(gè)人中心生成一個(gè)請(qǐng)求key,這個(gè)在發(fā)送接口時(shí),要用到。
第二步:使用天氣預(yù)報(bào)接口并生成程序代碼
根據(jù)聚合數(shù)據(jù)的使用說(shuō)明,我們可以利用接口調(diào)試工具調(diào)試接口,我們這里利用ApiPost測(cè)試。
可以看到請(qǐng)求成功后的json格式如下:
{ "reason": "查詢成功!", "result": { "city": "鄭州", "realtime": { "temperature": "24", "humidity": "100", "info": "小雨", "wid": "07", "direct": "東北風(fēng)", "power": "2級(jí)", "aqi": "32" }, "future": [ { "date": "2021-07-23", "temperature": "23/28℃", "weather": "小雨轉(zhuǎn)陰", "wid": { "day": "07", "night": "02" }, "direct": "東風(fēng)轉(zhuǎn)北風(fēng)" }, { "date": "2021-07-24", "temperature": "24/31℃", "weather": "小雨轉(zhuǎn)多云", "wid": { "day": "07", "night": "01" }, "direct": "東北風(fēng)轉(zhuǎn)東風(fēng)" }, { "date": "2021-07-25", "temperature": "23/31℃", "weather": "多云", "wid": { "day": "01", "night": "01" }, "direct": "東風(fēng)轉(zhuǎn)東南風(fēng)" }, { "date": "2021-07-26", "temperature": "24/31℃", "weather": "小雨", "wid": { "day": "07", "night": "07" }, "direct": "東北風(fēng)" }, { "date": "2021-07-27", "temperature": "23/31℃", "weather": "小雨轉(zhuǎn)晴", "wid": { "day": "07", "night": "00" }, "direct": "東北風(fēng)轉(zhuǎn)南風(fēng)" } ] }, "error_code": 0 }
到這一步,我們已經(jīng)拿到了未來(lái)7天的天氣數(shù)據(jù)。
第三步:利用nodemailer在NodeJS中發(fā)送郵件
nodeJS的nodemailer用于發(fā)送郵件,很好用。通過(guò)以下命令安裝即可使用:
npm install nodemailer
以下是我寫(xiě)的一個(gè)發(fā)送郵件的函數(shù),其中郵箱賬號(hào)和授權(quán)碼可以在對(duì)應(yīng)的郵箱服務(wù)商處獲取。
/** * nodeJS 發(fā)送郵件 * * */ function sendEmail(text){ let nodemailer = require('nodemailer'); let transporter = nodemailer.createTransport({ service:"126", // 郵箱 secure:true, // 安全的發(fā)送模式 auth:{ user:"be***er@126.com", // 發(fā)件人郵箱 pass:"MLQ***PYU"http:// 授權(quán)碼,在郵件服務(wù)商處獲取,126郵箱的獲取地址為:https://help.mail.163.com/faq.do?m=list&categoryID=197 } }) let mailOptions = { from:"be***er@126.com", // 發(fā)件人郵箱,同上面的發(fā)件人郵箱保持一致就行 to:"3257132998@qq.com", // 收件人郵箱,也就是實(shí)時(shí)接收天氣預(yù)報(bào)的郵箱 subject:"天氣實(shí)時(shí)監(jiān)控系統(tǒng)", // 郵件主題(標(biāo)題) text:text // 郵件征文 } transporter.sendMail(mailOptions,(err,data) => { if(err){ console.log(err); res.json({status:400,msg:"send fail....."}) }else{ console.log(data); res.json({status:200,msg:"郵件發(fā)送成功....."}) } }) } // 測(cè)試發(fā)郵件 sendEmail('下雨了')
新建一個(gè)weather.js ,內(nèi)容為以上代碼,通過(guò)
node weather.js
即可測(cè)試郵件發(fā)送。
發(fā)送成功,郵件接收成功。
第四步:在nodeJS中定時(shí)獲取天氣并發(fā)送到指定郵箱
點(diǎn)擊ApiPost右上角的生成NodeJS(Request)代碼,即可生成在nodejs中請(qǐng)求聚合天氣接口的程序代碼,我們結(jié)合setInterval即可實(shí)現(xiàn)以上需求。
全部代碼如下:
/** * nodeJS 發(fā)送郵件 * * */ function sendEmail(text){ let nodemailer = require('nodemailer'); let transporter = nodemailer.createTransport({ service:"126", // 郵箱 secure:true, // 安全的發(fā)送模式 auth:{ user:"be***er@126.com", // 發(fā)件人郵箱 pass:"MLQ***PYU"http:// 授權(quán)碼,在郵件服務(wù)商處獲取,126郵箱的獲取地址為:https://help.mail.163.com/faq.do?m=list&categoryID=197 } }) let mailOptions = { from:"be***er@126.com", // 發(fā)件人郵箱,同上面的發(fā)件人郵箱保持一致就行 to:"3257132998@qq.com", // 收件人郵箱,也就是實(shí)時(shí)接收天氣預(yù)報(bào)的郵箱 subject:"天氣實(shí)時(shí)監(jiān)控系統(tǒng)", // 郵件主題(標(biāo)題) text:text // 郵件征文 } transporter.sendMail(mailOptions,(err,data) => { if(err){ console.log(err); res.json({status:400,msg:"send fail....."}) }else{ console.log(data); res.json({status:200,msg:"郵件發(fā)送成功....."}) } }) } setInterval(function(){ var request = require('request'); var headers = { 'User-Agent': 'Apipost client Runtime/+https://www.apipost.cn/' }; var options = { url: 'http://apis.juhe.cn/simpleWeather/query?city=%E9%83%91%E5%B7%9E&key=8763efe2a90b025c03e03fef95621cbc', headers: headers }; function callback(error, response, body) { let json = JSON.parse(body); console.log(json.result) if (!error && response.statusCode == 200) { sendEmail('鄭州未來(lái)天氣' + json.result.future[0].weather) } } request(options, callback); }, 300000);
至此,系統(tǒng)全部打造完畢。我們只需找個(gè)小服務(wù)器執(zhí)行
node weather.js
命令即可每5分鐘向指定郵箱發(fā)一次天氣情況,當(dāng)然,您也可以根據(jù)需要發(fā)送。
注意事項(xiàng):
由于中文編碼可能會(huì)在request中出現(xiàn)問(wèn)題所以城市名稱最好encode一下(右鍵)。
到此這篇關(guān)于用Node.JS打造一個(gè)惡劣天氣實(shí)時(shí)預(yù)警系統(tǒng) 的文章就介紹到這了,更多相關(guān)Node.JS惡劣天氣實(shí)時(shí)預(yù)警內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用npm install時(shí)報(bào)錯(cuò)node-sass npm ERR command
在用npm install時(shí)報(bào)錯(cuò)npm ERR! path D:…\node-sass和npm ERR! command failed 問(wèn)題,本文給大家介紹了如何解決這個(gè)問(wèn)題,文中通過(guò)圖文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-03-03Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié)
本文主要介紹了Node.js發(fā)起HTTP請(qǐng)求的6種不同方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Node.js?搭建后端服務(wù)器內(nèi)置模塊(?http+url+querystring?的使用)
這篇文章主要介紹了Node.js搭建后端服務(wù)器內(nèi)置模塊(http+url+querystring的使用),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09Node連接mysql數(shù)據(jù)庫(kù)方法介紹
本篇文章主要介紹了Node連接mysql數(shù)據(jù)庫(kù)方法介紹。詳細(xì)的介紹了怎樣連接和操作數(shù)據(jù)庫(kù),并舉例說(shuō)明,有興趣的可以了解一下。2017-02-02Nodejs實(shí)現(xiàn)爬蟲(chóng)抓取數(shù)據(jù)實(shí)例解析
這篇文章主要介紹了Nodejs實(shí)現(xiàn)爬蟲(chóng)抓取數(shù)據(jù)實(shí)例解析,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07Node.js中npx命令的使用方法及場(chǎng)景分析
NPM(Node Package Manager) 是Node.js提供的一個(gè)包管理器, 可以使用 NPM 來(lái)安裝 node.js 包 ,npm 是從5.2版開(kāi)始, 增加(自帶)了 npx 命令,本文給大家分享Node.js npx命令使用,需要的朋友一起看看吧2021-08-08使用Node.js實(shí)現(xiàn)HTTP 206內(nèi)容分片的教程
這篇文章主要介紹了使用Node.js實(shí)現(xiàn)HTTP 206內(nèi)容分片的教程,Node.js是一款用于服務(wù)器端的JavaScript框架,需要的朋友可以參考下2015-06-06