使用Node.js发送定时天气预报短信 | 青训营笔记

219 阅读4分钟

这是我参与「第四届青训营」笔记创作活动的的第3天

项目目录

Snipaste_2022-08-13_19-43-50.jpg

一、注册腾讯云

  • 创建短信签名
  • 创建短信正文模板
  • 等待审核
  • 发送短信(控制台/调用api)

短信正文模板示例: Snipaste_2022-08-13_19-43-50.jpg

二、nodejs发送请求即可发送短信验证码

  1. 首先引入需要用到的包:
  • npm i qcloudsms_js
  • npm i axios
  1. 新建config.json文件,用来装短信配置信息 config.json:
{
    "appid": "", 
    "appkey": "",
    "smssign": "爱尚姚个人网"//短信签名
}

Snipaste_2022-08-13_19-43-50.jpg 3. 新建sms.js,用来写短信发送工具 sms.js:

//数据读取json
var config = require('./config');

const QcloudSms = require("qcloudsms_js");
//短信发送工具类
module.exports = function (phoneNumber, templateId, params) {
    // 实例化QcloudSms
    var qcloudsms = QcloudSms(config.appid, config.appkey);
    var smsType = 0;
    var ssender = qcloudsms.SmsSingleSender();
    ssender.sendWithParam(86, phoneNumber, templateId, params, config.smssign, "", "", function (err, res, resData) {
        if (err) {
            console.log(err + '发送失败');
        } else {
            //所有短信全部认定发送成功
            console.log(resData);
        }
    });
}
  1. 新建app.js,程序主入口 app.js:
//处理发送短信的配置
const sms = require('./sms')
//网络请求
const axios = require('axios')

//自行添加信息,会被随机放到模板变量温馨提示之后
var Lovewords = [
    
]
//装模板变量
var params = [4];
//发送人称呼
params[0] = ''
//发送人手机号
const phone = ''
//正文模板Id
const templateId = ''

//请求天气数据的函数
function send() {
    //查询天气的地址
    const address = ''//例如:重庆市渝北区
    return new Promise((resolve) => {
        axios
            .get('https://restapi.amap.com/v3/geocode/geo', {
                params: {
                    key: '', //自行申请
                    address,
                },
            })
            .then((resX) => {
                axios
                    .get('https://restapi.amap.com/v3/weather/weatherInfo', {//调用高德天气的api接口
                        params: {
                            key: '', //自行申请
                            city: +resX.data.geocodes[0].adcode,
                            extensions: "all" //base/all可选值,base为实时天气,all为预报天气
                        },
                    })
                    .then((res) => {
                        //天气
                        params[1] = res.data.forecasts[0].casts[0].dayweather
                        //温度
                        params[2] = res.data.forecasts[0].casts[0].nighttemp + '° ~ ' + res.data.forecasts[0].casts[0].daytemp + '°'
                        //随机数
                        let random = parseInt(Math.random() * Lovewords.length)
                        //随机情话
                        params[3] = Lovewords[random]
                        //发送短信
                        sms(phone, templateId, params)
                        console.log(params[1] + ' ' + params[2] + ' ' + params[3]);
                    })
            })
    })
}

//定时处理
function timeoutFunc(config) {
    config.runNow && send()
    const nowTime = new Date().getTime()
    const timePoints = config.time.split(':').map(i => parseInt(i))
    let recent = new Date().setHours(...timePoints)
    recent >= nowTime || (recent += 24 * 3600000)
    setTimeout(() => {
        //调用请求天气数据的函数,请求成功后发送短信
        send()
        setInterval(send, config.interval * 86400000)
    }, recent - nowTime)
}
// 3600000
const config = {//参数的说明
    interval: 1, //间隔天数,间隔为整数
    runNow: false, //是否立即运行
    time: "5:20:00" //执行的时间点 时在0~23之间
}

timeoutFunc(config)

注意,查询天气的接口是用的高德提供的,key需要自行在高德开放平台申请 Snipaste_2022-08-13_19-43-50.jpg

天气查询

天气查询API服务地址:

URLrestapi.amap.com/v3/weather/…
请求方式GET

parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。 

  • 请求参数 参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 | | ---------- | -------- | ---------------------------------------------------------------------------- | ---- | ---- | | key | 请求服务权限标识 | 用户在高德地图官网申请web服务API类型KEY | 必填 | 无 | | city | 城市编码 | 输入城市的adcode,adcode信息可参考城市编码表 | 必填 | 无 | | extensions | 气象类型 | 可选值:base/allbase:返回实况天气all:返回预报天气 | 可选 | 无 | | output | 返回格式 | 可选值:JSON,XML | 可选 | JSON

  • 返回结果参数说明

实况天气每小时更新多次,预报天气每天更新3次,分别在8、11、18点左右更新。由于天气数据的特殊性以及数据更新的持续性,无法确定精确的更新时间,请以接口返回数据的reporttime字段为准。天气结果对照表>>

名称含义规则说明
status返回状态值为0或11:成功;0:失败
count返回结果总数目
info返回的状态信息
infocode返回状态说明,10000代表正确
lives实况天气数据信息
province省份名
city城市名
adcode区域编码
weather天气现象(汉字描述)
temperature实时气温,单位:摄氏度
winddirection风向描述
windpower风力级别,单位:级
humidity空气湿度
reporttime数据发布的时间
forecast预报天气信息数据
city城市名称
adcode城市编码
province省份名称
reporttime预报发布时间
casts预报数据list结构,元素cast,按顺序为当天、第二天、第三天的预报数据
date日期
week星期几
dayweather白天天气现象
nightweather晚上天气现象
daytemp白天温度
nighttemp晚上温度
daywind白天风向
nightwind晚上风向
daypower白天风力
nightpower晚上风力

最终效果会在每天的 5:20 发送天气预报短信

如:

QQ图片20220813210323.jpg

QQ图片20220813210330.jpg