耀极客论坛

 找回密码
 立即注册
查看: 578|回复: 0

用Node.JS打造一个恶劣天气实时预警系统

[复制链接]

193

主题

176

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2022-5-9 01:34:57 | 显示全部楼层 |阅读模式
  本文将从实战的角度出发,利用NodeJS以及聚合数据的第三方免费接口打造一个完整的天气实时预警项目系统,具有一定的参考价值,感兴趣的可以了解一下

序言:
  这几日,无论是打开电视还是短视频,无不是说河南郑州遭遇这场无法预测的大暴雨,尤其是谁又能想到地铁站被洪水倒灌,被困乘客的情境让人无法想象。听到一些亲历者写的贴子文章,我们听着他们当时死里逃生的情形,可想象,当时的他们面对突如其来的灾难,又无法处理的无助与无奈。
  我们所处的郑州高新区也经历了断水断电的情况,直到发文的现在,广电带宽仍未恢复信号,办公室同事基本还在连接热点办公。
  本文将从实战的角度出发,利用NodeJS以及聚合数据的第三方免费接口打造一个完整的天气实时预警项目系统。本文没有用到特别高深的技术栈,目的旨在抛砖引玉。

第一步:找到免费天气预报接口
  网上很多免费获取天气的API接口,我这里使用的是聚合数据的接口,大厂的相对稳定。
  申请地址:https://www.juhe.cn/docs/api/id/73
  申请成功后,会在个人中心生成一个请求key,这个在发送接口时,要用到。


第二步:使用天气预报接口并生成程序代码
  根据聚合数据的使用说明,我们可以利用接口调试工具调试接口,我们这里利用ApiPost测试。

  可以看到请求成功后的json格式如下:
  1. {
  2.     "reason": "查询成功!",
  3.     "result": {
  4.         "city": "郑州",
  5.         "realtime": {
  6.             "temperature": "24",
  7.             "humidity": "100",
  8.             "info": "小雨",
  9.             "wid": "07",
  10.             "direct": "东北风",
  11.             "power": "2级",
  12.             "aqi": "32"
  13.         },
  14.         "future": [
  15.             {
  16.                 "date": "2021-07-23",
  17.                 "temperature": "23/28℃",
  18.                 "weather": "小雨转阴",
  19.                 "wid": {
  20.                     "day": "07",
  21.                     "night": "02"
  22.                 },
  23.                 "direct": "东风转北风"
  24.             },
  25.             {
  26.                 "date": "2021-07-24",
  27.                 "temperature": "24/31℃",
  28.                 "weather": "小雨转多云",
  29.                 "wid": {
  30.                     "day": "07",
  31.                     "night": "01"
  32.                 },
  33.                 "direct": "东北风转东风"
  34.             },
  35.             {
  36.                 "date": "2021-07-25",
  37.                 "temperature": "23/31℃",
  38.                 "weather": "多云",
  39.                 "wid": {
  40.                     "day": "01",
  41.                     "night": "01"
  42.                 },
  43.                 "direct": "东风转东南风"
  44.             },
  45.             {
  46.                 "date": "2021-07-26",
  47.                 "temperature": "24/31℃",
  48.                 "weather": "小雨",
  49.                 "wid": {
  50.                     "day": "07",
  51.                     "night": "07"
  52.                 },
  53.                 "direct": "东北风"
  54.             },
  55.             {
  56.                 "date": "2021-07-27",
  57.                 "temperature": "23/31℃",
  58.                 "weather": "小雨转晴",
  59.                 "wid": {
  60.                     "day": "07",
  61.                     "night": "00"
  62.                 },
  63.                 "direct": "东北风转南风"
  64.             }
  65.         ]
  66.     },
  67.     "error_code": 0
  68. }
复制代码
  到这一步,我们已经拿到了未来7天的天气数据。

第三步:利用nodemailer在NodeJS中发送邮件
  nodeJS的nodemailer用于发送邮件,很好用。通过以下命令安装即可使用:
  1. npm install nodemailer
复制代码
  以下是我写的一个发送邮件的函数,其中邮箱账号和授权码可以在对应的邮箱服务商处获取。
  1. /**
  2. * nodeJS 发送邮件
  3. *
  4. * */
  5. function sendEmail(text){
  6.     let nodemailer = require('nodemailer');
  7.     let transporter = nodemailer.createTransport({
  8.         service:"126",  //  邮箱
  9.         secure:true,    //  安全的发送模式
  10.         auth:{
  11.             user:"be***er@126.com", //  发件人邮箱
  12.             pass:"MLQ***PYU"//  授权码,在邮件服务商处获取,126邮箱的获取地址为:https://help.mail.163.com/faq.do?m=list&categoryID=197
  13.         }
  14.     })
  15.     let mailOptions = {
  16.         from:"be***er@126.com", // 发件人邮箱,同上面的发件人邮箱保持一致就行
  17.         to:"3257132998@qq.com", // 收件人邮箱,也就是实时接收天气预报的邮箱
  18.         subject:"天气实时监控系统", // 邮件主题(标题)
  19.         text:text // 邮件征文
  20.     }
  21.     transporter.sendMail(mailOptions,(err,data) => {
  22.         if(err){
  23.             console.log(err);
  24.             res.json({status:400,msg:"send fail....."})
  25.         }else{
  26.             console.log(data);
  27.             res.json({status:200,msg:"邮件发送成功....."})
  28.         }
  29.     })
  30. }
  31. // 测试发邮件
  32. sendEmail('下雨了')
复制代码

  新建一个weather.js ,内容为以上代码,通过
  1. node weather.js
复制代码
  即可测试邮件发送。

  发送成功,邮件接收成功。

第四步:在nodeJS中定时获取天气并发送到指定邮箱
  点击ApiPost右上角的生成NodeJS(Request)代码,即可生成在nodejs中请求聚合天气接口的程序代码,我们结合setInterval即可实现以上需求。

  全部代码如下:
  1. /**
  2. * nodeJS 发送邮件
  3. *
  4. * */
  5. function sendEmail(text){
  6.     let nodemailer = require('nodemailer');
  7.     let transporter = nodemailer.createTransport({
  8.         service:"126",  //  邮箱
  9.         secure:true,    //  安全的发送模式
  10.         auth:{
  11.             user:"be***er@126.com", //  发件人邮箱
  12.             pass:"MLQ***PYU"//  授权码,在邮件服务商处获取,126邮箱的获取地址为:https://help.mail.163.com/faq.do?m=list&categoryID=197
  13.         }
  14.     })
  15.     let mailOptions = {
  16.         from:"be***er@126.com", // 发件人邮箱,同上面的发件人邮箱保持一致就行
  17.         to:"3257132998@qq.com", // 收件人邮箱,也就是实时接收天气预报的邮箱
  18.         subject:"天气实时监控系统", // 邮件主题(标题)
  19.         text:text // 邮件征文
  20.     }
  21.     transporter.sendMail(mailOptions,(err,data) => {
  22.         if(err){
  23.             console.log(err);
  24.             res.json({status:400,msg:"send fail....."})
  25.         }else{
  26.             console.log(data);
  27.             res.json({status:200,msg:"邮件发送成功....."})
  28.         }
  29.     })
  30. }
  31. setInterval(function(){
  32.     var request = require('request');
  33.     var headers = {
  34.         'User-Agent': 'Apipost client Runtime/+https://www.apipost.cn/'
  35.     };
  36.     var options = {
  37.         url: 'http://apis.juhe.cn/simpleWeather/query?city=%E9%83%91%E5%B7%9E&key=8763efe2a90b025c03e03fef95621cbc',
  38.         headers: headers
  39.     };
  40.     function callback(error, response, body) {
  41.         let json = JSON.parse(body);
  42.         console.log(json.result)
  43.         if (!error && response.statusCode == 200) {
  44.             sendEmail('郑州未来天气' + json.result.future[0].weather)
  45.         }
  46.     }
  47.     request(options, callback);
  48. }, 300000);
复制代码
  至此,系统全部打造完毕。我们只需找个小服务器执行
  1. node weather.js
复制代码
  命令即可每5分钟向指定邮箱发一次天气情况,当然,您也可以根据需要发送。

注意事项:
  由于中文编码可能会在request中出现问题所以城市名称最好encode一下(右键)。

  到此这篇关于用Node.JS打造一个恶劣天气实时预警系统 的文章就介绍到这了,更多相关Node.JS恶劣天气实时预警内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|耀极客论坛 ( 粤ICP备2022052845号-2 )|网站地图

GMT+8, 2022-12-10 02:59 , Processed in 0.066821 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表