sansui-Weather v2.0
介绍:
在寒冷的冬日给你爱的人暖暖的提示
(可增加情话api,每天推送情话及其他定制化的推送)
Python脚本实现天气查询应用,提醒她注意保暖!
功能介绍:
- 天气信息获取推送
- 当天天气信息提示推送
- 第二天天气信息提示推送
- 网易云热评信息获取推送
- 舔狗日记信息获取推送
- 疫情信息数据获取推送
- 可根据个人需要,添加定制的信息提示
使用说明:
以下信息换为自己的,具体根据API地址申请key后进行替换
SendKey server酱
Weather_key 和风天气API
Tianapi_key 网易云热评API
Storeapi_key 疫情数据API
ApiKey 疫情数据API
userid 接收消息的用户,存在多个以 | 隔开
adminUserId 管理员用户,错误信息要推送的用户
下载地址:
https://wwb.lanzouw.com/iwk7vzmd75c
密码:d0bz
云函数搭建教程:
https://support.qq.com/products/130099/blog/546919
代码修改教程:
https://wwb.lanzoub.com/iKLJG017swba
密码:4bpo
代码:
[url=home.php?mod=space&uid=238618]@Time[/url] : 2021/7/19 13:16
[url=home.php?mod=space&uid=686208]@AuThor[/url] : Sansui
@FileName: index.py
@Software: PyCharm
@Blog :https://www.cnblogs.com/sansui6/
import requests
import datetime
import time
import json
import pytz
import ssl,hashlib,string
from urllib import request,parse,error;
from urllib.parse import quote
SendKey = '';#pushplus申请的KEY或者server酱的KEY,这里我自己改了
Weather_key = ''
Tianapi_key = ''
Storeapi_key = ''
ApiKey = ''
# 接收消息的用户,存在多个以 | 隔开
userid = ''
adminUserId = '';
def get_time():
nowTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()); # 获取当前时间
# 由于腾讯云时间不准确,暂时使用年月日
nowTime_1 = time.strftime("%Y-%m-%d", time.localtime()); # 获取当前时间
# print(nowTime_1)
return nowTime_1;
#获取网易云评论
def get_wyy():
list = [] ## 空列表
wyy_url = "http://api.tianapi.com/txapi/hotreview/index?key=" + Tianapi_key + "";
wyy_json = requests.post(wyy_url).json();
wyy_code = wyy_json["code"]
if wyy_code.eq(200):
#获取评论内容
wyy_content = wyy_json["newslist"][0]["content"]
#获取歌名
wyy_source = wyy_json["newslist"][0]["source"]
#把评论、歌名放进数组
list.append(wyy_content)
list.append(wyy_source)
return list;
else:
list.append('获取失败!')
return list;
#2021/8/4 因疫情较为严重,新增加疫情提示
def ncov():
api_url = 'https://yupn.api.storeapi.net/api/94/221';
appid = 13948;
secret = Storeapi_key;
data = {
'appid': appid,
'city_name': '苏州',
'format': 'json',
'time': '1644207719',
};
data['appid'] = appid;
data['time'] = round(time.time()); # 当前服务器时间
keysArr = list(data.keys()) # 取出字典key
keysArr.sort() # 对字典key进行排序
md5String = '';
params = []
for key in keysArr:
if data[key]:
val = str(data[key])
md5String += key + val
params.append(key + "=" + val)
md5String += secret;
m = hashlib.md5()
b = md5String.encode(encoding='utf-8')
m.update(b)
sign = m.hexdigest()
params.append(</span><span>'</span><span>sign=</span><span>'</span> + sign) <span>#</span><span> 加入计算后的sign值去请求</span>
params = <span>'</span><span>&</span><span>'</span>.join(tuple(params)); <span>#</span><span> 把列表转成元组后用&分隔,最终转换成字符串 a=b&c=d&e=f</span>
ssl._create_default_https_context = ssl._create_unverified_context
url = api_url + '?' + params;
url = quote(url, safe=string.printable)
req = requests.get(url).json()
#city 所选城市
#confirm 确诊病例数量
#curConfirm 当前确诊数量
#died 死亡数量
#heal 治愈数量
#asymptomatic 无症状感染数量
#print(req["retdata"])
return req["retdata"]
#获取实时疫情资讯,如分风险地区、疫情概况、疫情新闻等
def nCoV_news(num):
url="http://api.tianapi.com/txapi/ncov/index?key="+Tianapi_key;
nCoV_news_json = requests.get(url).json()
nCoV_news_code = nCoV_news_json["code"]
print(nCoV_news_json)
nCoV_news_newslist = nCoV_news_json["newslist"]
i=0;
if(nCoV_news_code.eq(200)):
if (num.eq(1)):
# 获取当前数据信息
return nCoV_news_newslist[0]["desc"]
elif(num.eq(2)):
#返回全国风险地区,high高风险、mid中风险
riskarea_high_text = "| ——– | 高风险地区 | ——–: |";
for riskarea_high in nCoV_news_newslist[0]["riskarea"]["high"]:
if("江苏省" in riskarea_high):
# 因为高风险地区逐渐增多,消息已经存放不下,现调整通知格式为具体数量,不再是具体地区。
i=i+1;
return "\n江苏省高风险地区共:" + str(i) + "个。\n"
elif(num.eq(0)):
riskarea_mid_text = "| ——– | 中风险地区 | ——–: |";
for riskarea_mid in nCoV_news_newslist[0]["riskarea"]["mid"]:
# print(riskarea_high)
if ("江苏省" in riskarea_mid):
#因为中风险地区逐渐增多,消息已经存放不下,现调整通知格式为具体数量,不再是具体地区。
#riskarea_mid_text +="\n" + riskarea_mid;
# riskarea_high_text=riskarea_high;
i=i+1;
# return nCoV_news_newslist[0]["riskarea"]
#print(riskarea_mid_text)
#return riskarea_mid_text;
return "\n江苏省中风险地区共:"+str(i)+"个。"
#获取当天天气,不过没有最高温度,最低温度
def get_Weather():
city_id = get_location();
Weather_url = f'https://devapi.qweather.com/v7/weather/now?key={Weather_key}&location={city_id}'
Weather_json = requests.get(Weather_url).json()
#print(Weather_url)
Weather_code = Weather_json["code"]
Weather_now = Weather_json["now"]
if(Weather_code.eq("200")):
#print(Weather_now)
return Weather_now;
#获取包括今天在内的未来三天天气
def get_3d_Weather(num):
date = get_time();
date_tomorrow = (datetime.datetime.now()+datetime.timedelta(days=1)).strftime("%Y-%m-%d");
city_id = get_location();
Weather_url = f'https://devapi.qweather.com/v7/weather/3d?key={Weather_key}&location={city_id}';
#print(Weather_url)
Weather_json = requests.get(Weather_url).json();
Weather_3d = Weather_json["daily"]
for weather in Weather_3d:
#print("6666666"+weather)
if(num.eq(1)):
if(weather["fxDate"].eq(date)):
#print("当天天气获取成功")
return weather;
else:
print("查询的不是今天日期的天气")
return "查询的不是今天日期的天气"
break;
elif(num.eq(0)):
if (weather["fxDate"].eq(date_tomorrow)):
#print(weather);
return weather;
else:
print("非法参数!")
return "非法参数!"
#获取当前天气地区id
def get_location():
# 调整所在的区域
location='苏州'
Weather_city_url = f'https://geoapi.qweather.com/v2/city/lookup?key={Weather_key}&location={location}'
city_json =requests.get(Weather_city_url).json();
city_code = city_json["code"]
if city_code.eq("200"):
#print(Weather_city_url)
for Weather_city in city_json["location"]:
Weather_city_name = Weather_city["name"]
if Weather_city_name.eq("苏州"):
#print(Weather_city)
city_id = Weather_city["id"]
#print(city_id)
return city_id;
</span><span>else</span><span>:
</span><span>print</span>(<span>"</span><span>访问获取地区接口失败!</span><span>"</span><span>)
</span><span>return</span> <span>"</span><span>访问获取地区接口失败!</span><span>"</span><span>;
def get_tiangou():
url="http://api.tianapi.com/tiangou/index?key="+Tianapi_key;
tiangou_json = requests.get(url).json()
tiangou = tiangou_json["newslist"][0]["content"]
return tiangou
#拼接消息
def get_desp():
wyy_content </span>= get_wyy()[0]; <span>#</span><span> 评论内容</span>
wyy_source = get_wyy()[1]; <span>#</span><span> 歌名</span>
date_tomorrow = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime(<span>"</span><span>%Y-%m-%d</span><span>"</span><span>);
Weather </span>= get_Weather() <span>#</span><span>获取当天天气信息</span>
Weather_text = Weather[<span>"</span><span>text</span><span>"</span>] <span>#</span><span>获取当天天气文字</span>
Weather_temp = Weather[<span>"</span><span>temp</span><span>"</span>] <span>#</span><span>实时获取当前温度</span>
Weather_feelsLike = Weather[<span>"</span><span>feelsLike</span><span>"</span>] <span>#</span><span>获取当前体感温度</span>
Weather_3d_day = get_3d_Weather(1) # 获取当天的预报天气
Weather_3d_day_tempMax = Weather_3d_day["tempMax"] #获取当天预报最高温度
Weather_3d_day_tempMin = Weather_3d_day["tempMin"] #获取当天预报最低温度
Weather_3d_day_uvIndex = Weather_3d_day["uvIndex"] #获取当天紫外线强度
Weather_3d_tomorrow = get_3d_Weather(0) # 获取明天天气
Weather_3d_tomorrow_textDay = Weather_3d_day["textDay"] # 获取第二天天气文字
Weather_3d_tomorrow_tempMax = Weather_3d_day["tempMax"] # 获取第二天预报最高温度
Weather_3d_tomorrow_tempMin = Weather_3d_day["tempMin"] # 获取第二天预报最低温度
Weather_3d_tomorrow_uvIndex = Weather_3d_day["uvIndex"] # 获取第二天紫外线强度
# 获取舔狗日记
tiangou = get_tiangou();
cur_time </span>=<span> time.time()
</span><span>#</span><span>print(cur_time)</span>
local_tz = pytz.timezone(<span>"</span><span>Asia/Shanghai</span><span>"</span><span>)
local_time </span>= datetime.datetime.fromtimestamp(cur_time, tz=<span>local_tz).hour
</span><span>#</span><span> print(local_time)</span>
Ncov_zz = ncov();
Ncov_city = Ncov_zz["city"];
# confirm 确诊病例数量
Ncov_confirm = Ncov_zz["confirm"];
# curConfirm 当前确诊数量
Ncov_curConfirm = Ncov_zz["curConfirm"];
# died 死亡数量
# heal 治愈数量
Ncov_heal = Ncov_zz["heal"];
# asymptomatic 无症状感染数量
# nCoV_news_mid = nCoV_news(0); # 获取疫情中风险地区
# time.sleep(1000)
nCoV_news_num = nCoV_news(1);#获取全国疫情数据
# time.sleep(1000)
# nCoV_news_high = nCoV_news(2); # 获取疫情高风险地区
currentConfirmedCount = nCoV_news_num["currentConfirmedCount"]#现存确诊人数
seriousCount = nCoV_news_num["seriousCount"] #现存无症状
beijing_Time = datetime.datetime.fromtimestamp(cur_time, tz=local_tz).strftime("%Y-%m-%d %H:%M:%S");
Ncov_desp </span>= (<span>"</span><span>\n| -------- |全国疫情实时播报|----------------: |\n</span><span>"</span>+
<span>"</span><span>截至北京时间 </span><span>"</span>+beijing_Time+<span>"</span><span>\n</span><span>"</span>+
<span>"</span><span>全国现存确诊病例:</span><span>"</span> + str(currentConfirmedCount)+<span>"</span><span>\n</span><span>"</span>+
<span>"</span><span>全国现存无症状病例:</span><span>"</span> + str(seriousCount) + <span>"</span><span>\n</span><span>"</span> +<span>
Ncov_city </span>+<span>"</span><span>现存确诊病例:</span><span>"</span> + str(Ncov_curConfirm) + <span>""</span><span>
)
desp_Weather_temp_text </span>= <span>""</span><span>;
desp_Weather_text </span>= <span>""</span><span>;
desp_Weather_3d_tomorrow_textDay_text </span>= <span>""</span><span>;
desp_Weather_3d_day_tempMax_text </span>= <span>""</span><span>;
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>""</span><span>;
desp_day </span>= <span>""</span><span>;
desp_tomorrow </span>= <span>""</span><span>;
desp_Weather_3d_day_uvIndex </span>= <span>""</span><span>;
</span><span>#</span><span> 晚上八点 查询第二天天气情况,然后根据当前时间,定制化推送当前提醒</span>
<span>if</span> (local_time >= 20 <span>and</span> local_time <=>):
<span>#</span><span> 如果有雨,不校验最高温度</span>
<span>#</span><span> 判断天气</span>
<span>if</span> (<span>"</span><span>雨</span><span>"</span> <span>in</span><span> Weather_3d_tomorrow_textDay):
</span><span>if</span> Weather_3d_tomorrow_textDay.<span>__eq__</span>(<span>"</span><span>大雨</span><span>"</span><span>):
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_Weather_3d_tomorrow_textDay_text </span>= <span>"</span><span>\n明天</span><span>"</span>+ Weather_3d_tomorrow_textDay + <span>"</span><span>,傻瓜,记得带伞,记得早点出门,晚上早点睡\n</span><span>"</span>
<span>elif</span> Weather_3d_tomorrow_textDay.<span>__eq__</span>(<span>"</span><span>中雨</span><span>"</span><span>):
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_Weather_3d_tomorrow_textDay_text </span>= <span>"</span><span>\n明天</span><span>"</span> + Weather_3d_tomorrow_textDay + <span>"</span><span>,傻瓜,记得带伞,记得早点出门,晚上早点睡\n</span><span>"</span>
<span>elif</span> Weather_3d_tomorrow_textDay.<span>__eq__</span>(<span>"</span><span>雷阵雨</span><span>"</span><span>):
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_Weather_3d_tomorrow_textDay_text </span>= <span>"</span><span>\n明天</span><span>"</span> + Weather_3d_tomorrow_textDay + <span>"</span><span>,小心打雷,抱抱傻瓜,不怕不怕\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_Weather_3d_tomorrow_textDay_text </span>= <span>"</span><span>\n明天</span><span>"</span> + Weather_3d_tomorrow_textDay + <span>"</span><span>,记得带伞,请注意天气\n</span><span>"</span>
<span>#</span><span> 没雨的情况下,根据温度提醒明天天气</span>
<span>else</span><span>:
desp_Weather_3d_tomorrow_textDay_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
</span><span>if</span> (int(Weather_3d_tomorrow_tempMax) >= 33<span>):
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n明天天气较热,注意防晒!\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_3d_tomorrow_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_tomorrow </span>=<span> (
</span><span>"</span><span>明天 </span><span>"</span> + date_tomorrow + <span>"</span><span>\n天气:</span><span>"</span> + Weather_3d_tomorrow_textDay + desp_Weather_3d_tomorrow_textDay_text +
<span>"</span><span>明天最高温度:</span><span>"</span> + Weather_3d_tomorrow_tempMax + <span>"</span><span>℃。</span><span>"</span> + desp_Weather_3d_tomorrow_tempMax_text +
<span>"</span><span>明天最低温度:</span><span>"</span> + Weather_3d_tomorrow_tempMin + <span>"</span><span>℃。</span><span>"</span><span>
);
</span><span>elif</span> (local_time >= 0 <span>and</span> local_time < 20<span>):
</span><span>#</span><span> desp_Weather_3d_tomorrow_textDay_text = "\n";</span>
<span>#</span><span> desp_Weather_3d_tomorrow_tempMax_text = "\n";</span>
<span>#</span><span> 判断当前温度</span>
<span>if</span> (int(Weather_temp) >= 33<span>):
</span><span>if</span> (8 < local_time < 16<span>):
desp_Weather_temp_text </span>= <span>"</span><span>,天气有点热喔!\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_temp_text </span>= <span>"</span><span>。\n</span><span>"</span><span>;
</span><span>else</span><span>:
desp_Weather_temp_text </span>= <span>"</span><span>。\n</span><span>"</span><span>;
</span><span>#</span><span> 判断紫外线等级</span>
<span>if</span> (8 <=>):
<span>if</span> (4 < int(Weather_3d_day_uvIndex) <=>):
desp_Weather_3d_day_uvIndex = <span>"</span><span>\n今天紫外线等级</span><span>"</span> + Weather_3d_day_uvIndex + <span>"</span><span>,适合户外运动。\n</span><span>"</span>
<span>elif</span> (6 < int(Weather_3d_day_uvIndex) <=>):
desp_Weather_3d_day_uvIndex = <span>"</span><span>\n今天紫外线等级</span><span>"</span> + Weather_3d_day_uvIndex + <span>"</span><span>,请注意防晒。\n</span><span>"</span>
<span>elif</span> (9 <<span> int(Weather_3d_day_uvIndex)):
desp_Weather_3d_day_uvIndex </span>= <span>"</span><span>\n今天紫外线等级</span><span>"</span> + Weather_3d_day_uvIndex + <span>"</span><span>,宝,外边太晒了,能不出去就不要出去了。\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_3d_day_uvIndex </span>= <span>"</span><span>\n</span><span>"</span><span>;
</span><span>else</span><span>:
desp_Weather_3d_day_uvIndex </span>= <span>"</span><span>\n</span><span>"</span><span>;
</span><span>#</span><span> 判断当天是否有雨,有雨不判断当天最高温度</span>
Weather_text = <span>"</span><span>晴</span><span>"</span>
<span>if</span> (<span>"</span><span>雨</span><span>"</span> <span>in</span><span> Weather_text):
</span><span>if</span> Weather_text.<span>__eq__</span>(<span>"</span><span>大雨</span><span>"</span><span>):
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_Weather_text </span>= <span>"</span><span>\n当前有</span><span>"</span> + Weather_text + <span>"</span><span>,傻瓜,赶紧避雨,不要再外出啦\n</span><span>"</span>
<span>elif</span> Weather_text.<span>__eq__</span>(<span>"</span><span>中雨</span><span>"</span><span>):
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>
desp_Weather_text </span>= <span>"</span><span>\n当前有</span><span>"</span> + Weather_text + <span>"</span><span>,傻瓜,赶紧避雨,不要再外出啦\n</span><span>"</span>
<span>elif</span> Weather_text.<span>__eq__</span>(<span>"</span><span>雷阵雨</span><span>"</span><span>):
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>
desp_Weather_text </span>= <span>"</span><span>\n当前有</span><span>"</span> + Weather_text + <span>"</span><span>,小心打雷,抱抱傻瓜,不怕不怕\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>
desp_Weather_text </span>= <span>"</span><span>\n当前有</span><span>"</span> + Weather_text + <span>"</span><span>,请注意天气\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
</span><span>#</span><span> 判断当天最高温度</span>
<span>if</span> (int(Weather_3d_day_tempMax) >= 33<span>):
</span><span>#</span><span> 下午16点以后不用提示</span>
<span>if</span> (local_time > 16<span>):
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
</span><span>else</span><span>:
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n今天天气较热,注意防晒!\n</span><span>"</span>
<span>else</span><span>:
desp_Weather_3d_day_tempMax_text </span>= <span>"</span><span>\n</span><span>"</span><span>;
desp_day </span>=<span> (
</span><span>"</span><span>当前天气:</span><span>"</span> + Weather_text + desp_Weather_text +
<span>"</span><span>当前温度:</span><span>"</span> + Weather_temp + <span>"</span><span>℃</span><span>"</span> + desp_Weather_temp_text +
<span>"</span><span>今天最高温度:</span><span>"</span> + Weather_3d_day_tempMax + <span>"</span><span>℃。</span><span>"</span> + desp_Weather_3d_day_tempMax_text +
<span>"</span><span>最低温度:</span><span>"</span> + Weather_3d_day_tempMin + <span>"</span><span>℃。</span><span>"</span> + desp_Weather_3d_day_uvIndex <span>#</span><span> 紫外线 16点后不提示</span>
+ <span>"</span><span>\n</span><span>"</span> +wyy_content + <span>"</span><span>\n来自:网易云音乐《</span><span>"</span> + wyy_source + <span>"</span><span>》</span><span>"</span> +
<span>"</span><span>\n| -----------------舔狗日记-----------------: |\n</span><span>"</span> +<span>
tiangou </span>+ <span>"</span><span>\n来自:舔狗日记\n</span><span>"</span><span>
);
</span><span>#</span><span>#以下是通知内容!</span>
desp = <span>"</span><span>苏州\n</span><span>"</span> + desp_day + desp_tomorrow +<span> Ncov_desp;
</span><span>return</span><span> desp;
# 程序入口,消息推送
def main():
title = '每日推送';
desp = get_desp();
#url = f"https://sctapi.ftqq.com/{SendKey}.send?title={title}&desp={desp}&openid={userid}";
token = SendKey #在pushpush网站中可以找到
content = desp #改成你要的正文内容
pushurl = 'http://www.pushplus.plus/send'
data = {
"token":token,
"title":title,
"content":content
}
body=json.dumps(data).encode(encoding='utf-8')
headers = {'Content-Type':'application/json'}
requests.post(pushurl,data=body,headers=headers)
res = requests.post(pushurl);
if res.status_code == 200:
print("成功!")
else:
title = "天气推送失败!"
##desp = "尊敬的管理员,消息推送失败\n推送日志"+res.json();
print(res.status_code)
#url = f"https://sctapi.ftqq.com/{SendKey}.send?title={title}&desp={desp}&openid={adminUserId}";
#res = requests.post(url);
print("错误日志推送成功 !")
def main_handler(event, context):
main()
if name == 'main':
main()详细代码
Original: https://www.cnblogs.com/52DSG/p/15984951.html
Author: 止于言情
Title: 定制云函数天气推送
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644041/
转载文章受原作者版权保护。转载请注明原作者出处!