1.前言
在日常生活中,天气信息对我们的出行、工作和生活规划至关重要。为了更方便地获取天气信息,我们可以通过微信推送的方式,将实时天气信息发送到手机上。本文将介绍如何使用Python实现一个简单的微信天气信息推送功能。
2.实现思路
- 获取天气数据:通过调用天气API,获取指定城市的实时天气信息。
- 格式化天气信息:将获取到的天气数据格式化为HTML字符串,方便在微信中展示。
- 推送消息到微信:使用PushPlus服务将格式化后的天气信息推送到微信。
3.具体步骤
1.获取天气数据
我们使用聚合数据(Juhe)提供的天气API来获取天气信息。首先需要注册并获取一个API密钥(Key),然后通过HTTP请求获取天气数据。
import urllib.request
import urllib.parse
import json
def get_weather(city):
"""
获取指定城市的天气信息
:param city: 城市名称
:return: 返回格式化后的天气信息HTML字符串,或错误信息
"""
url = 'http://apis.juhe.cn/simpleWeather/query' # 天气API的URL
params = {
"city": city,
"key": "your key", # 替换为你的实际API密钥
}
# 将参数编码为URL查询字符串
query_string = urllib.parse.urlencode(params).encode('utf-8')
try:
# 创建请求对象
request = urllib.request.Request(url, data=query_string)
# 发送请求并获取响应
response = urllib.request.urlopen(request)
# 读取响应内容
content = response.read()
if content:
try:
# 将响应内容解析为JSON
result = json.loads(content.decode('utf-8'))
error_code = result['error_code']
if error_code == 0:
# 提取天气信息
temperature = result['result']['realtime']['temperature']
humidity = result['result']['realtime']['humidity']
info = result['result']['realtime']['info']
wid = result['result']['realtime']['wid']
direct = result['result']['realtime']['direct']
power = result['result']['realtime']['power']
aqi = result['result']['realtime']['aqi']
# 返回格式化后的天气信息HTML字符串
return f"""
<div class="container mt-4">
<div class="row">
<div class="col-md-6 mb-3">
<div class="card bg-light border-primary">
<div class="card-header bg-primary text-white">
<h5 class="card-title">城市:{city}</h5>
</div>
<div class="card-body">
<p class="card-text">温度:{temperature}℃</p>
<p class="card-text">湿度:{humidity}%</p>
</div>
</div>
</div>
<div class="col-md-6 mb-3">
<div class="card bg-light border-success">
<div class="card-header bg-success text-white">
<h5 class="card-title">天气信息</h5>
</div>
<div class="card-body">
<p class="card-text">天气:{info}</p>
<p class="card-text">天气标识:{wid}</p>
<p class="card-text">风向:{direct}</p>
<p class="card-text">风力:{power}</p>
<p class="card-text">空气质量:{aqi}</p>
</div>
</div>
</div>
</div>
<div class="text-center">
<a href='https://www.weaoo.com/guangzhou-181278.html' class='btn btn-primary' role='button'>点击查看广州天气网</a>
</div>
</div>
"""
else:
# 返回错误信息
return f"请求失败: {result['error_code']} {result['reason']}"
except Exception as e:
# 返回解析异常信息
return f"解析结果异常:{e}"
else:
# 返回请求异常信息
return "请求异常"
except Exception as e:
# 返回请求异常信息
return f"An error occurred: {e}"
2. 推送消息到微信
我们使用PushPlus服务将天气信息推送到微信。PushPlus是一个消息推送平台,支持通过API将消息推送到微信、钉钉等平台。
import requests
def send_pushplus_msg(content):
"""
使用PushPlus发送消息
:param content: 要发送的消息内容
"""
token = 'pushplus token' # 替换为你的实际PushPlus Token
title = '广州天气推送'
template = 'html'
# 构建PushPlus请求URL
url = f"http://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}&topic="
# 发送请求并打印响应
r = requests.get(url)
print(r.text)
4.完整代码
import urllib.request
import urllib.parse
import json
import requestsdef get_weather(city):
url = 'http://apis.juhe.cn/simpleWeather/query'params = {
"city": city,
"key": "api key", # Replace with your actual API key
}query_string = urllib.parse.urlencode(params).encode('utf-8')
try:
request = urllib.request.Request(url, data=query_string)
response = urllib.request.urlopen(request)
content = response.read()if content:
try:
result = json.loads(content.decode('utf-8'))
error_code = result['error_code']
if error_code == 0:
temperature = result['result']['realtime']['temperature']
humidity = result['result']['realtime']['humidity']
info = result['result']['realtime']['info']
wid = result['result']['realtime']['wid']
direct = result['result']['realtime']['direct']
power = result['result']['realtime']['power']
aqi = result['result']['realtime']['aqi']
return f"""
<div class="container mt-4">
<div class="row">
<div class="col-md-6 mb-3">
<div class="card bg-light border-primary">
<div class="card-header bg-primary text-white">
<h5 class="card-title">城市:{city}</h5>
</div>
<div class="card-body">
<p class="card-text">温度:{temperature}℃</p>
<p class="card-text">湿度:{humidity}%</p>
</div>
</div>
</div>
<div class="col-md-6 mb-3">
<div class="card bg-light border-success">
<div class="card-header bg-success text-white">
<h5 class="card-title">天气信息</h5>
</div>
<div class="card-body">
<p class="card-text">天气:{info}</p>
<p class="card-text">天气标识:{wid}</p>
<p class="card-text">风向:{direct}</p>
<p class="card-text">风力:{power}</p>
<p class="card-text">空气质量:{aqi}</p>
</div>
</div>
</div>
</div>
<div class="text-center">
<a href='https://www.weaoo.com/guangzhou-181278.html' class='btn btn-primary' role='button'>点击查看广州天气网</a>
</div>
</div>
"""
else:
return f"请求失败: {result['error_code']} {result['reason']}"
except Exception as e:
return f"解析结果异常:{e}"
else:
return "请求异常"
except Exception as e:
return f"An error occurred: {e}"
def send_pushplus_msg(content):
token = 'pushplus token' # Replace with your actual PushPlus Token
title = '广州天气推送'
template = 'html'url = f"http://www.pushplus.plus/send?token={token}&title={title}&content={content}&template={template}&topic="
r = requests.get(url)
print(r.text)if __name__ == '__main__':
city = "广州" # 你想要获取天气的城市
weather_info = get_weather(city)
if "请求失败" in weather_info or "请求异常" in weather_info:
print(weather_info)
else:
send_pushplus_msg(weather_info)
5.运行效果
6.附接口地址
[聚合数据天气API]https://www.juhe.cn/docs/api/id/73
[PushPlus消息推送平台]http://www.pushplus.plus/