[用Python打造本地天气提醒小工具:定时获取天气并发送提醒]



背景介绍

在日常生活中,天气变化对我们的出行、穿衣和活动安排有着重要影响。手动查询天气信息不仅费时费力,还容易遗漏关键信息。为了提升效率,我们可以使用Python开发一个本地天气提醒小工具,它能够根据用户设定的城市和时间,定时获取天气信息,并通过本地通知或邮件提醒用户是否需要带伞、穿衣建议等。

这个项目属于系统工具或实用脚本领域,使用Python语言实现,涉及网络请求与接口调用定时任务本地通知/邮件发送等核心技术点。适合中级以下开发者在1~3天内完成,具备较高的学习价值和实用性。


思路分析

项目目标

开发一个可以:

  • 接收用户输入的城市名称;
  • 设置提醒时间(如每天上午8点);
  • 定时调用天气API获取天气信息;
  • 根据天气情况生成提醒内容;
  • 通过本地通知或邮件发送提醒。

技术选型

  • 网络请求:使用 requests 库调用天气API(如OpenWeatherMap);
  • 定时任务:使用 schedule 库实现定时执行;
  • 本地通知:使用 plyer 库实现跨平台通知;
  • 邮件提醒:使用 smtplibemail 库发送邮件;
  • 配置管理:使用 .env 文件管理API密钥,避免硬编码。

功能模块划分

  1. 输入处理模块:接收用户输入的城市和提醒时间;
  2. 天气查询模块:调用天气API获取天气数据;
  3. 提醒生成模块:根据天气数据生成提醒内容;
  4. 定时任务模块:设置定时任务,定期执行天气查询;
  5. 提醒发送模块:通过通知或邮件发送提醒信息。

代码实现

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构建一个实用的小工具,提升你的编程能力和项目实战经验!


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注