基于天气数据的蚊虫活跃指数计算与定时防蚊提醒脚本 一到夏天天气一变蚊虫问题就跟着来了。“因天气恶劣蚊虫滋生各位猎人们出门记得防蚊”这句话看起来像一句随口提醒但放到常年跑野外、做户外巡检、在公园林地和工地上工作的人身上它应该被当成一条需要量化执行的防护动作。蚊虫不是随机出现的温度、湿度、降雨、风速和水源条件会在几天内共同决定蚊虫密度和叮咬强度。与其每天靠体感猜“今天要不要穿长袖、带驱蚊液”不如把天气数据、蚊虫活跃规则和消息推送串起来写成一个每天自动运行的防蚊提醒脚本。这篇文章会从一个最小可运行的 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/用来放运行日志这两个目录在首次运行时由代码自动创建。依赖只保留两个核心库就够了requests2.28,3 PyYAML6.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 / apimock 用于本地调试api 用于真实运行location.longitude经度116.40