如何自动每天给女友发送天气短信呢

1,540 阅读8分钟

前言

前段时间过节,给女友做了一个小东西———自动发送天气短信

一直没来得及记录这一过程,趁现在有空便做下记录

image-20210317194052168.png

一、获取天气信息

网上有很多免费的天气API,此处选取了腾讯天气API

所处的位置为广州,接口地址如下

wis.qq.com/weather/com…

请求参数具体解析如下

参数含义
source请求来源,pc即来自PC端
province省,比如广东省
city市,比如广州市
country县/区,比如天河区
weather_type天气类型,参数有:observe(观测站数据,例如温度大气压),forecast_1h(按小时预报),forecast_24h(按天预报),index(指数,比如穿衣指数等),alarm(警告),limit,tips(小提示),rise(日出日落,月出月落),air(空气质量)等

返回的结果如下

{
  "data": {
    "alarm": {},
    "forecast_24h": {
      "0": {
        "day_weather": "阴",
        "day_weather_code": "02",
        "day_weather_short": "阴",
        "day_wind_direction": "西南风",
        "day_wind_direction_code": "5",
        "day_wind_power": "3",
        "day_wind_power_code": "0",
        "max_degree": "28",
        "min_degree": "20",
        "night_weather": "多云",
        "night_weather_code": "01",
        "night_weather_short": "多云",
        "night_wind_direction": "微风",
        "night_wind_direction_code": "0",
        "night_wind_power": "3",
        "night_wind_power_code": "0",
        "time": "2021-03-16"
      },
      "1": {
        "day_weather": "多云",
        "day_weather_code": "01",
        "day_weather_short": "多云",
        "day_wind_direction": "微风",
        "day_wind_direction_code": "0",
        "day_wind_power": "3",
        "day_wind_power_code": "0",
        "max_degree": "30",
        "min_degree": "21",
        "night_weather": "多云",
        "night_weather_code": "01",
        "night_weather_short": "多云",
        "night_wind_direction": "微风",
        "night_wind_direction_code": "0",
        "night_wind_power": "3",
        "night_wind_power_code": "0",
        "time": "2021-03-17"
      },
      "2": ...
    },
    "index": {
      "airconditioner": {
        "detail": "天气热,到中午的时候您将会感到有点热,因此建议在午后较热时开启制冷空调。",
        "info": "部分时间开启",
        "name": "空调开启"
      },
      "allergy": {
        "detail": "天气条件易诱发过敏,宜穿长衣长裤并佩戴好眼镜和口罩,外出归来时及时清洁手和口鼻。",
        "info": "易发",
        "name": "过敏"
      },
      "carwash": {
        "detail": "适宜洗车,未来持续两天无雨天气较好,适合擦洗汽车,蓝天白云、风和日丽将伴您的车子连日洁净。",
        "info": "适宜",
        "name": "洗车"
      },
      "chill": {
        "detail": "温度未达到风寒所需的低温,稍作防寒准备即可。",
        "info": "无",
        "name": "风寒"
      },
      "clothes": {
        "detail": "天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。",
        "info": "热",
        "name": "穿衣"
      },
      "cold": {
        "detail": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。",
        "info": "少发",
        "name": "感冒"
      },
      "comfort": {
        "detail": "白天天气晴好,并且空气湿度偏大,在这种天气条件下,您会感到有些闷热,不很舒适。",
        "info": "较不舒适",
        "name": "舒适度"
      },
      "diffusion": {
        "detail": "气象条件对空气污染物稀释、扩散和清除无明显影响。",
        "info": "中",
        "name": "空气污染扩散条件"
      },
      "dry": {
        "detail": "天气较好,路面比较干燥,路况较好。",
        "info": "干燥",
        "name": "路况"
      },
      "drying": {
        "detail": "天气不错,适宜晾晒。赶紧把久未见阳光的衣物搬出来吸收一下太阳的味道吧!",
        "info": "适宜",
        "name": "晾晒"
      },
      "fish": {
        "detail": "较适合垂钓,但风力稍大,会对垂钓产生一定的影响。",
        "info": "较适宜",
        "name": "钓鱼"
      },
      "heatstroke": {
        "detail": "天气舒适,对易中暑人群来说非常友善。",
        "info": "无中暑风险",
        "name": "中暑"
      },
      "makeup": {
        "detail": "天气较热,建议用露质面霜打底,水质无油粉底霜,透明粉饼,粉质胭脂。",
        "info": "去油",
        "name": "化妆"
      },
      "mood": {
        "detail": "天气较好,温度适宜,心情会不错,学习、工作效率较高。",
        "info": "较好",
        "name": "心情"
      },
      "morning": {
        "detail": "天气不错,空气清新。",
        "info": "适宜",
        "name": "晨练"
      },
      "sports": {
        "detail": "天气较好,较适宜进行各种运动,但考虑气温较高且湿度较大,请适当降低运动强度,并及时补充水分。",
        "info": "较适宜",
        "name": "运动"
      },
      "sunglasses": {
        "detail": "白天虽有白云遮挡,但太阳辐射仍很强,建议佩戴透射比2级且标注UV400的遮阳镜",
        "info": "很必要",
        "name": "太阳镜"
      },
      "sunscreen": {
        "detail": "属中等强度紫外辐射天气,注意防护,建议涂擦SPF指数高于15,PA+的防晒护肤品。",
        "info": "中等",
        "name": "防晒"
      },
      "time": "20210317",
      "tourism": {
        "detail": "天气较好,但丝毫不会影响您的心情。微风,虽天气稍热,却仍适宜旅游,不要错过机会呦!",
        "info": "适宜",
        "name": "旅游"
      },
      "traffic": {
        "detail": "天气较好,路面干燥,交通气象条件良好,车辆可以正常行驶。",
        "info": "良好",
        "name": "交通"
      },
      "ultraviolet": {
        "detail": "属中等强度紫外线辐射天气,建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。",
        "info": "中等",
        "name": "紫外线强度"
      },
      "umbrella": {
        "detail": "天气较好,不会降水,因此您可放心出门,无须带雨伞。",
        "info": "不带伞",
        "name": "雨伞"
      }
    },
    "observe": {
      "degree": "27",
      "humidity": "64",
      "precipitation": "0",
      "pressure": "1006",
      "update_time": "202103171650",
      "weather": "多云",
      "weather_code": "01",
      "weather_short": "多云",
      "wind_direction": "4",
      "wind_power": "1"
    },
    "tips": {
      "observe": {
        "0": "光芒透过云缝,洒向大地~",
        "1": "现在的温度比较舒适~"
      }
    }
  },
  "message": "OK",
  "status": 200
}

二、利用腾讯云的短信接口发送短信

  • 使用了腾讯云的短信接口进行短信发送,作为个人开发者,首先要实名认证
  • 买套餐包——我买的是40块钱1千条
  • 进入短信指引页console.cloud.tencent.com/smsv2/guide
    • 创建短信签名
    • 创建短信正文模板
    • 等待审核
    • 发送短信

创建签名

按规定的填写即可,合规即可

签名内容我填的是【姓名+个人测试】,说明按实际填写

image-20210317192202694.png

创建短信模板

此处注意,短信的内容,如果需要填入参数,可使用{1}{2}{3}来动态填入参数

对于个人开发者,字符串的长度是有限制的(12个字符)。

image-20210317192420063.png 填写的短信内容为👇

(๑> ₃ <)xxx ,今天是{1},是我们在一起的第{2}天。今日天气:{3}。每日一句正能量:{4}——来自爱你的bbbb(๑•̀ㅂ•́)و✧

其中

  • {1}填入日期
  • {2}填入今天是在一起的第几天
  • {3}填入的是天气内容
  • {4}填入的是一句话(长度不超过12)

Python SDK的使用

参考官方的写法,填入id和key,还有模板id,再接入自定义的动态数据

try:
    # 必要步骤:
    # 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
    # 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
    # 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
    # CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
    cred = credential.Credential("secretIdxxxx", "secretKeyxxxx")
    # 实例化一个 http 选项,可选,无特殊需求时可以跳过
    httpProfile = HttpProfile()
    httpProfile.reqMethod = "POST"  # POST 请求(默认为 POST 请求)
    httpProfile.reqTimeout = 30  # 请求超时时间,单位为秒(默认60秒)
    httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)
    # 非必要步骤:
    # 实例化一个客户端配置对象,可以指定超时时间等配置
    clientProfile = ClientProfile()
    clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法
    clientProfile.language = "en-US"
    clientProfile.httpProfile = httpProfile
    # 实例化 SMS 的 client 对象
    # 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量
    client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)
    # 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
    # 您可以直接查询 SDK 源码确定 SendSmsRequest 有哪些属性可以设置
    # 属性可能是基本类型,也可能引用了另一个数据结构
    # 推荐使用 IDE 进行开发,可以方便的跳转查阅各个接口和数据结构的文档说明
    req = models.SendSmsRequest()
    # 基本类型的设置:
    # SDK 采用的是指针风格指定参数,即使对于基本类型也需要用指针来对参数赋值
    # SDK 提供对基本类型的指针引用封装函数
    # 帮助链接:
    # 短信控制台:https://console.cloud.tencent.com/smsv2
    # sms helper:https://cloud.tencent.com/document/product/382/3773
    # 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID,例如1400006666
    req.SmsSdkAppid = "IDIDIDIDID"
    # 短信签名内容: 使用 UTF-8 编码,必须填写已审核通过的签名,可登录 [短信控制台] 查看签名信息
    req.Sign = "xxx个人开发测试"
    # 用户的 session 内容: 可以携带用户侧 ID 等上下文信息,server 会原样返回
    # req.SessionContext = "xxx"
    # 下发手机号码,采用 e.164 标准,+[国家或地区码][手机号]
    # 例如+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号
    req.PhoneNumberSet = ["+86xxxxx"]
    # 模板 ID: 必须填写已审核通过的模板 ID,可登录 [短信控制台] 查看模板 ID
    req.TemplateID = "xxxxx"
    # 模板参数: 若无模板参数,则设置为空
    req.TemplateParamSet = [str(time), str(day_span), str(short_weather), observe]
    # 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
    resp = client.SendSms(req)
    # 输出 JSON 格式的字符串回包
    print(resp.to_json_string(indent=2))
except TencentCloudSDKException as err:
    print(err)

每日定时发送天气信息

把python文件上传至服务器后,使用crontab来定时启动

输入命令crontab -e

0 9 * * * python3 /data/msg/main.py

即可每日9点拉取天气信息后发送给女友啦~