一到夏天,天气一变,蚊虫问题就跟着来了。“因天气恶劣蚊虫滋生,各位猎人们出门记得防蚊”这句话,看起来像一句随口提醒,但放到常年跑野外、做户外巡检、在公园林地和工地上工作的人身上,它应该被当成一条需要量化执行的防护动作。蚊虫不是随机出现的,温度、湿度、降雨、风速和水源条件会在几天内共同决定蚊虫密度和叮咬强度。与其每天靠体感猜“今天要不要穿长袖、带驱蚊液”,不如把天气数据、蚊虫活跃规则和消息推送串起来,写成一个每天自动运行的防蚊提醒脚本。这篇文章会从一个最小可运行的 Python 项目出发,覆盖环境搭建、天气数据接入、蚊虫活跃指数计算、钉钉和企业微信消息推送、定时任务配置,以及提醒发不出去时怎么排查。
1. 防蚊提醒不能靠感觉,先理解蚊虫活跃度受哪些天气因素影响
1.1 温度、湿度、降雨、风速如何影响蚊虫
蚊虫的繁殖、存活和叮咬行为都依赖天气。蚊虫的一生包含卵、幼虫、蛹和成蚊四个阶段,其中卵、幼虫、蛹三个阶段基本都离不开水。降雨形成积水后,蚊虫会在几天内完成一代繁殖;温度决定发育速度,相对湿度决定成蚊存活时间,风速则直接影响蚊虫飞行和寻找宿主的能力。
一个很常见的误解是“天气越恶劣蚊虫越少”。实际上,风雨交加的当下,蚊虫确实不容易活动,但大雨带来的积水和潮湿环境,会在雨停后制造一个蚊虫爆发窗口。这就意味着,防蚊提醒不能只看“今天是不是晴天”,还要看最近几天有没有明显降水、积水能不能快速消退,以及当前温度和湿度是否适合成蚊活动。
所以做防蚊提醒脚本时,天气数据至少要包含四个字段:
- 温度,用于判断是否处于蚊虫活跃的适宜区间。
- 相对湿度,用于判断成蚊存活率和幼虫孳生环境。
- 降雨量,用于判断积水条件,包括最近 24 小时和最近 3 天的累计降水。
- 风速等级,用于判断蚊虫被人吸引和叮咬的难度。
1.2 为什么雨过天晴后反而更容易出现蚊虫高峰
蚊虫从卵到成蚊通常需要几天时间,具体时长取决于温度。如果近期有降雨,路面积水、树洞积水和容器积水会为幼虫提供生存环境。雨后温度回到 20 到 30 摄氏度,湿度也偏高,幼虫发育速度会明显加快。因此,真正需要提高防蚊等级的时间,往往不是下雨当天,而是雨停后第 2 到第 5 天。
这个“延迟效应”决定了计算逻辑不能写成“下雨就提醒,不下雨就不提醒”。更合理的做法是:
- 如果最近 24 小时有降水,说明水体正在形成或刚形成,可以加一部分风险分。
- 如果最近 3 天累计降水较多,说明积水条件已经存在,风险分继续累加。
- 配合当前温度和湿度做加权,最终得到蚊虫活跃指数。
这样处理之后,即使脚本运行的日子是晴天,只要前几天下过雨,系统仍然能给出较高等级的防蚊提醒。
1.3 把问题拆成数据采集、指数计算、提醒分发三个模块
整个防蚊提醒脚本不需要做成复杂的平台。对于单城市、少数人的使用场景,一个 Python 脚本加定时任务就够。为了后续好维护,项目应该从第一天就拆成三个独立模块。
| 模块 | 职责 | 主要文件 |
|---|---|---|
| 天气数据采集 | 获取温度、湿度、风速、降水数据 | src/weather.py |
| 蚊虫活跃指数计算 | 把天气字段转成分数和等级 | src/index.py |
| 提醒分发 | 把文案推送到钉钉、企业微信或日志 | src/notifier.py |
| 运行入口 | 串联三个模块并处理配置、日志、去重 | main.py |
拆开的好处是,任何一个环节出问题时,不需要从头到尾翻代码。比如推送失败,只需要看notifier.py和通知渠道的返回结果;指数和体感不符,只需要检查index.py的规则参数和天气字段映射。
2. 环境准备:用最小 Python 项目把骨架搭起来
2.1 目录结构和依赖
建议在 Linux 服务器或本地开发机上创建如下目录:
mosquito-alert/ ├── config.yaml ├── requirements.txt ├── main.py ├── src/ │ ├── __init__.py │ ├── weather.py │ ├── index.py │ ├── message.py │ ├── notifier.py │ └── store.py ├── data/ └── logs/src/__init__.py可以是一个空文件,让 Python 把src当成包目录。data/用来放 SQLite 数据库文件,logs/用来放运行日志,这两个目录在首次运行时由代码自动创建。
依赖只保留两个核心库就够了:
requests>=2.28,<3 PyYAML>=6.0,<7安装依赖:
pip install -r requirements.txt如果在一台机器上同时跑多个 Python 项目,建议先用虚拟环境:
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt2.2 配置文件与密钥设计
项目的运行参数建议放在config.yaml里,密钥不要放进去。这样配置可以进版本库,密钥仍然留在服务器环境变量中。
mode: mock city: "示例市" location: longitude: 116.40 latitude: 39.90 api: base_url: "https://your-weather-service.example.com/api/weather" key_env: "WEATHER_API_KEY" rules: temperature_low: 15 temperature_high: 30 humidity_threshold: 60 wind_level_threshold: 3 rain_delay_days: 2 notify: channel: dingtalk min_level: 2 daily_once: true webhook_env: "DINGTALK_WEBHOOK"这里要做几点说明:
mode: mock表示先用本地模拟数据跑通链路,不消耗真实天气接口配额。api.base_url需要替换成你实际申请的天气服务地址。不同服务返回结构差异很大,代码里必须保留一个字段映射层。api.key_env不是密钥本身,而是密钥所在的环境变量名,例如WEATHER_API_KEY。notify.webhook_env同理,值应该是环境变量名,例如DINGTALK_WEBHOOK。
config.yaml中主要参数的含义如下表:
| 配置项 | 含义 | 示例值 | 注意事项 |
|---|---|---|---|
| mode | 数据来源模式 | mock / api | mock 用于本地调试,api 用于真实运行 |
| location.longitude | 经度 | 116.40 |