前言
前段时间过节,给女友做了一个小东西———自动发送天气短信
一直没来得及记录这一过程,趁现在有空便做下记录
一、获取天气信息
网上有很多免费的天气API,此处选取了腾讯天气API
所处的位置为广州,接口地址如下
请求参数具体解析如下
| 参数 | 含义 |
|---|---|
| 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
- 创建短信签名
- 创建短信正文模板
- 等待审核
- 发送短信
创建签名
按规定的填写即可,合规即可
签名内容我填的是【姓名+个人测试】,说明按实际填写
创建短信模板
此处注意,短信的内容,如果需要填入参数,可使用{1}{2}{3}来动态填入参数
对于个人开发者,字符串的长度是有限制的(12个字符)。
填写的短信内容为👇
(๑> ₃ <)xxx ,今天是{1},是我们在一起的第{2}天。今日天气:{3}。每日一句正能量:{4}——来自爱你的bbbb(๑•̀ㅂ•́)و✧
其中
- {1}填入日期
- {2}填入今天是在一起的第几天
- {3}填入的是天气内容
- {4}填入的是一句话(长度不超过12)
Python SDK的使用
- 具体参考链接cloud.tencent.com/document/pr…
- 其中APPID/App Key在此处查找console.cloud.tencent.com/smsv2/app-m…
- 安装
pip install tencentcloud-sdk-python
参考官方的写法,填入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点拉取天气信息后发送给女友啦~