OpenWeatherMap是最稳妥的免费天气API选择,因其免费额度大且提供可靠的实时降水状态字段weather.main,可准确判断“正在下雨”。

天气API选哪个?优先考虑免费额度和降水字段
国内能直接用的免费天气接口极少,OpenWeatherMap 是最稳妥的选择:注册后有每分钟1000次、每月100万次的免费调用额度,且返回数据里明确包含 weather.main(如 "Rain")和 weather.description(如 "light rain"),比只靠 rain.1h 数值判断更可靠。避免用「中国天气网」等无公开API的页面——爬虫容易被封IP,且HTML结构常变。
注意:HeWeather(和风天气)虽有中文文档,但免费版需实名+审核,且降水字段藏在 daily_forecast 的未来24小时汇总里,实时性差;QWeather 同理,且部分城市返回 "precipitation" 为 null。
怎么判断“正在下雨”而不是“可能下雨”?
关键不是看预报,而是看当前天气状态。OpenWeatherMap 的 /weather 接口返回的 weather 数组第一个元素的 main 字段,才是当前实况。例如:
{
"weather": [{"main": "Rain", "description": "light rain"}],
"main": {"temp": 22.5}
}
用这个判断比查 rain.1h 更稳——后者在部分城市始终为 0 或缺失,而 main 字段只要在下雨就会是 "Rain"、"Drizzle"、"Thunderstorm" 等。
立即学习“Python免费学习笔记(深入)”;
- 只检查
weather[0]["main"] in ["Rain", "Drizzle", "Thunderstorm"] - 不要依赖
rain字段是否存在,有些响应里它压根不出现 - 加个 5 分钟缓存(比如记录上一次提醒时间),避免同一场雨反复发短信
短信怎么发?别碰运营商接口,用 Twilio 或阿里云短信
个人项目别折腾三大运营商的 SDK——需要企业资质、备案、签名审核。直接用 Twilio(国际号可用)或 aliyun-python-sdk-dysmsapi(国内号首选)。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
Twilio 示例(需环境变量 TWILIO_ACCOUNT_SID、TWILIO_AUTH_TOKEN、TWILIO_FROM、TWILIO_TO):
from twilio.rest import Client
client = Client()
client.messages.create(
body="⚠️ 正在下雨,记得带伞!",
from_=os.getenv("TWILIO_FROM"),
to=os.getenv("TWILIO_TO")
)
阿里云短信要更麻烦点:得先去控制台申请签名和模板(模板内容固定为「您的验证码是:${code}」这种格式不行,必须是通知类,比如「【XX天气提醒】当前正在下雨,请注意携带雨具」),然后用 send_sms 调用,参数名全是大驼峰(PhoneNumbers、SignName),填错一个就报 InvalidParameter。
定时执行用 cron 还是 schedule?选 cron
schedule 库适合跑在常驻进程里,但 Python 脚本一旦异常退出,提醒就停了;而 cron 是系统级守护,哪怕脚本崩了,下个整点照样拉起新进程。
Linux/macOS 下加一行到 crontab:
*/10 * * * * /usr/bin/python3 /path/to/weather_alert.py >> /var/log/weather.log 2>&1
这行表示每 10 分钟执行一次。注意三点:
- 绝对路径写全:
/usr/bin/python3不是python3,/path/to/...不能用~ - 重定向日志很重要,否则出错时你根本不知道哪步挂了
- 如果用虚拟环境,把
/usr/bin/python3换成你的venv/bin/python
真正难的是处理「连续下雨时只提醒一次」——得把上次发送时间记进文件或 SQLite,而不是靠内存变量。这点很多人漏掉,结果一场雨收到十几条短信。

















