背景介绍
在日常生活中,天气变化对我们的出行、穿衣和活动安排有着重要影响。手动查询天气信息不仅费时费力,还容易遗漏关键信息。为了提升效率,我们可以使用Python开发一个本地天气提醒小工具,它能够根据用户设定的城市和时间,定时获取天气信息,并通过本地通知或邮件提醒用户是否需要带伞、穿衣建议等。
这个项目属于系统工具或实用脚本领域,使用Python语言实现,涉及网络请求与接口调用、定时任务和本地通知/邮件发送等核心技术点。适合中级以下开发者在1~3天内完成,具备较高的学习价值和实用性。
思路分析
项目目标
开发一个可以:
- 接收用户输入的城市名称;
- 设置提醒时间(如每天上午8点);
- 定时调用天气API获取天气信息;
- 根据天气情况生成提醒内容;
- 通过本地通知或邮件发送提醒。
技术选型
- 网络请求:使用
requests库调用天气API(如OpenWeatherMap); - 定时任务:使用
schedule库实现定时执行; - 本地通知:使用
plyer库实现跨平台通知; - 邮件提醒:使用
smtplib和email库发送邮件; - 配置管理:使用
.env文件管理API密钥,避免硬编码。
功能模块划分
- 输入处理模块:接收用户输入的城市和提醒时间;
- 天气查询模块:调用天气API获取天气数据;
- 提醒生成模块:根据天气数据生成提醒内容;
- 定时任务模块:设置定时任务,定期执行天气查询;
- 提醒发送模块:通过通知或邮件发送提醒信息。
代码实现
1. 安装依赖
首先,确保安装以下Python库:
pip install requests schedule plyer python-dotenv
2. 创建 .env 文件
在项目根目录下创建 .env 文件,用于存储OpenWeatherMap的API密钥:
OPENWEATHER_API_KEY=your_api_key_here
3. 完整代码实现
# weather_reminder.py
import os
import time
import schedule
import requests
from dotenv import load_dotenv
from plyer import notification
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# 加载环境变量
load_dotenv()
# 从环境变量中获取API密钥
API_KEY = os.getenv("OPENWEATHER_API_KEY")
if not API_KEY:
raise ValueError("请在.env文件中设置OPENWEATHER_API_KEY")
# 天气API的基础URL
BASE_URL = "http://api.openweathermap.org/data/2.5/weather"
# 本地通知函数
def send_local_notification(title, message):
notification.notify(
title=title,
message=message,
app_name="天气提醒小工具",
timeout=10
)
# 邮件发送函数
def send_email_notification(subject, body, to_email):
from_email = "your_email@example.com" # 替换为你的邮箱
password = "your_email_password" # 替换为你的邮箱密码
msg = MIMEMultipart()
msg['From'] = from_email
msg['To'] = to_email
msg['Subject'] = subject
msg.attach(MIMEText(body, 'plain'))
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(from_email, password)
text = msg.as_string()
server.sendmail(from_email, to_email, text)
server.quit()
print("邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
# 获取天气信息
def get_weather(city):
params = {
'q': city,
'appid': API_KEY,
'units': 'metric'
}
response = requests.get(BASE_URL, params=params)
data = response.json()
if response.status_code == 200:
return data
else:
print(f"获取天气失败: {data.get('message', '未知错误')}")
return None
# 生成提醒内容
def generate_reminder_message(data):
city = data['name']
weather = data['weather'][0]['description']
temp = data['main']['temp']
feels_like = data['main']['feels_like']
humidity = data['main']['humidity']
wind_speed = data['wind']['speed']
# 根据天气情况生成提醒
if "rain" in weather.lower():
message = f"{city}今天有雨,建议带伞。"
elif "cloud" in weather.lower():
message = f"{city}多云,适合外出。"
elif "clear" in weather.lower():
message = f"{city}天气晴朗,适合户外活动。"
else:
message = f"{city}天气{weather},温度{temp}℃。"
# 返回详细信息
return f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {message}"
# 主函数:执行天气查询并发送提醒
def job():
city = input("请输入城市名称(例如:上海): ").strip()
if not city:
print("城市名称不能为空!")
return
weather_data = get_weather(city)
if not weather_data:
return
message = generate_reminder_message(weather_data)
print(message)
# 本地通知
send_local_notification("天气提醒", message)
# 邮件提醒(可选)
# send_email_notification("天气提醒 - " + city, message, "recipient@example.com")
# 定时任务设置
def setup_scheduler():
# 设置每天上午8点执行
schedule.every().day.at("08:00").do(job)
# 启动定时器
while True:
schedule.run_pending()
time.sleep(1)
# 启动程序
if __name__ == "__main__":
print("天气提醒小工具已启动,每天上午8:00将自动获取天气并发送提醒。")
setup_scheduler()
示例运行
输入示例:
请输入城市名称(例如:上海): 上海
输出示例(模拟):
[2025-12-17 08:00:00] 上海今天有雨,建议带伞。
[2025-12-18 08:00:00] 上海天气晴朗,适合外出。
邮件提醒示例:
主题:天气提醒 - 上海
内容:
2025-12-17 上海天气:小雨,温度 12℃,建议带伞。
项目亮点
- 实用性强:贴近日常生活,帮助用户及时获取天气信息;
- 技术全面:涵盖网络请求、定时任务、通知/邮件发送等实用技术;
- 可扩展性强:未来可增加多城市提醒、天气预警、语音播报等功能;
- 跨平台支持:使用
plyer实现跨平台本地通知,支持Windows、Mac、Linux; - 配置灵活:使用
.env文件管理API密钥,方便维护和部署。
总结
通过这个本地天气提醒小工具的开发,我们不仅掌握了Python中网络请求、定时任务和本地通知/邮件发送的实现方式,还提升了实际问题解决能力。该项目结构清晰、代码规范、功能明确,非常适合中级以下开发者进行练习和拓展。
如果你对邮件提醒部分感兴趣,可以进一步扩展,比如使用SMTP服务(如Gmail、QQ邮箱)进行自动化邮件发送,甚至结合邮件模板生成更丰富的提醒内容。
希望这篇文章能帮助你理解如何用Python构建一个实用的小工具,提升你的编程能力和项目实战经验!