之前自己用的天气通知和每日油价通知,还是挺好用的,后面天气api坏了,就一直没有时间修
今天终于有时间搞一下了,就直接把api改高德的了,自己使用免费次数肯定够用
api注册地址:https://console.amap.com 个人认证免费5000次/月
相关代码
import requests
from bs4 import BeautifulSoup
import time
import notify
from datetime import datetime
# 用户输入的秘钥和城市编码
API_KEY = "9********e" # 高德地图API key
CITY_CODE = "3****3" # 城市编码:地理位置(所属地区身份证前6位)
# 天气状况翻译表(只保留需要翻译的,相同的自动使用原词)
WEATHER_TRANSLATION = {
"晴": "晴天",
"阴": "阴天"
}
def fetch_weather_data(url):
"""从指定 URL 获取天气数据"""
try:
return requests.get(url).json()
except Exception as e:
print(f"抓取天气信息失败: {e}")
return {}
def get_weather_info(api_key, city_code):
"""获取实时和当日天气信息"""
# 实时天气API和预报天气API
urls = [
f"https://restapi.amap.com/v3/weather/weatherInfo?key={api_key}&city={city_code}&extensions=base",
f"https://restapi.amap.com/v3/weather/weatherInfo?key={api_key}&city={city_code}&extensions=all"
]
# 获取实时和预报天气数据
realtime_data, forecast_data = [fetch_weather_data(url) for url in urls]
# 检查API响应是否成功
if realtime_data.get('status') != '1' or forecast_data.get('status') != '1':
return "无法获取天气数据。"
# 提取并解析数据
realtime = realtime_data.get('lives', [{}])[0]
forecast = forecast_data.get('forecasts', [{}])[0]
today = forecast.get('casts', [{}])[0]
if not realtime or not forecast or not today:
return "无法解析天气数据。"
# 构建输出字符串
return (
f"实时天气情况: {WEATHER_TRANSLATION.get(realtime.get('weather', '未知'), realtime.get('weather', '未知'))}\n"
f"实时温度: {realtime.get('temperature', '0')}°C\n"
f"湿度: {realtime.get('humidity', '0')}%\n"
f"风向: {realtime.get('winddirection', '未知')}\n"
f"风力: {realtime.get('windpower', '0')}级\n"
f"数据更新时间: {realtime.get('reporttime', '')}\n"
f"\n当日天气情况: {WEATHER_TRANSLATION.get(today.get('dayweather', '未知'), today.get('dayweather', '未知'))}\n"
f"夜间天气情况: {WEATHER_TRANSLATION.get(today.get('nightweather', '未知'), today.get('nightweather', '未知'))}\n"
f"当日温度: {today.get('nighttemp', '0')}°C ~ {today.get('daytemp', '0')}°C\n"
f"白天风向: {today.get('daywind', '未知')}\n"
f"白天风力: {today.get('daypower', '0')}级\n"
f"夜间风向: {today.get('nightwind', '未知')}\n"
f"夜间风力: {today.get('nightpower', '0')}级\n"
)
def main():
"""主程序入口"""
# 网页 URL
url = "https://www.cngold.org/crude/shandong.html"
# 设置请求头,模拟浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
# 发送 HTTP 请求并解析汽油价格
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table', class_='hq_table1')
if table:
headers = [th.get_text(strip=True) for th in table.find('thead').find_all('th')]
for row in table.find('tbody').find_all('tr'):
cells = [td.get_text(strip=True) for td in row.find_all('td')]
try:
index = headers.index("92#汽油")
oil_price_message = f"92#价格: {cells[index]}\n\n"
break
except ValueError:
oil_price_message = "未找到 92号汽油 列\n"
break
else:
oil_price_message = "未找到表格\n"
else:
oil_price_message = f"请求失败,状态码: {response.status_code}\n"
except Exception as e:
oil_price_message = f"获取汽油价格失败: {e}\n"
# 增加请求间隔
time.sleep(0.5) # 暂停 0.5 秒钟
# 调用天气信息函数并合并消息
weather_msg = f"天气信息:\n{get_weather_info(API_KEY, CITY_CODE)}"
current_date = datetime.now().strftime("%Y-%m-%d")
summary_msg = f"{oil_price_message}{weather_msg}"
notify.send(f"今日资讯 {current_date}", summary_msg)
print(f"通知内容:\n{summary_msg}")
print("通知发送成功")
if __name__ == "__main__":
main()需要修改的地方
第8,9,68行代码,主要是修改api的key,地理位置(你地区身份证前6位)以及油价的省。
会调用青龙的通知,设置每日几点通知一次就行了
评论区