程序员如何利用 Python 解决女朋友不看天气的坏习惯?

通过Python获取天气信息并定制短信提醒,解决女友因不看天气预报而受冻的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 赵昱

责编 | 郭芮

在一个阴雨绵绵的早上,一切都是那么安静祥和。忽然之间,被电话打破了宁静,一看是女朋友的电话,就知道这个小家伙肯定又做了什么傻事......果不其然,16℃的雨天她居然穿着裙子去上班被冻傻了,问她干嘛不看天气预报,居然回复说没有看天气预报的习惯。最终我又从单位赶回到家里来给她拿衣服...... 在回家的途中,了解到她有看短信的习惯,但是不看APP推送的信息。于是,就有了利用Python来获取当天的天气信息并通过短信推送到她手机的想法。
640?wx_fmt=png 基础功能的实现
最初的构想逻辑是,根据城市的名字获取当天的天气信息数据,再根据获取到的天气数据进行短信发送到手机。具体的实现方式如下: 1)天气获取 首先,最基础的一步就是获取当天的天气信息。经过分析,需要获取以下几点关键信息:当天最高气温、当天最低气温、当天天气情况及当下时刻实时气温等信息。 为此,天气数据源就成为了考虑的重点。考虑到天气数据的实时性、稳定性等因素,在经过一番选择之后,最终确定采用某迹天气API提供的数据源。我们需要获取的数据在其中的【15天天气预报】及【实时天气获取】两个API中,最终获取到的示例数据如下:

 
{"data": {"city": {"cityId": 2,"counname": "中国","ianatimezone": "Asia\/Shanghai","name": "北京市","pname": "北京市","secondaryname": "北京市","timezone": "8"},"condition": {"condition": "晴","conditionId": "1","humidity": "48","icon": "0","pressure": "996","realFeel": "33","sunRise": "2019-07-27 05:08:00","sunSet": "2019-07-27 19:34:00","temp": "35",//需要获取的实时温度"tips": "感觉天气燥热,记得补充水分。","updatetime": "2019-07-27 11:55:08","uvi": "10","vis": "8508","windDegrees": "225","windDir": "西南风","windLevel": "3","windSpeed": "3.7"}},}{"data": {"city": {"cityId": 2,"counname": "中国","ianatimezone": "Asia\/Shanghai","name": "北京市","pname": "北京市","secondaryname": "北京市","timezone": "8"},"forecast": [{"conditionDay": "多云",//需要获取的天气情况"conditionIdDay": "1","conditionIdNight": "8","conditionNight": "中雨","humidity": "69","moonphase": "WaningCrescent","moonrise": "2019-07-28 01:12:00","moonset": "2019-07-28 15:51:00","predictDate": "2019-07-28","sunrise": "2019-07-28 05:09:00","sunset": "2019-07-28 19:33:00","tempDay": "34",//需要获取的当天最高温度"tempNight": "25",//需要获取的当天最低温度"updatetime": "2019-07-27 10:05:00","windDegreesDay": "225","windDegreesNight": "225","windDirDay": "西南风","windDirNight": "西南风","windLevelDay": "3","windLevelNight": "3","windSpeedDay": "4.4","windSpeedNight": "4.4"}]},}"data": {
"city": {
"cityId"2,
"counname""中国",
"ianatimezone""Asia\/Shanghai",
"name""北京市",
"pname""北京市",
"secondaryname""北京市",
"timezone""8"
},
"condition": {
"condition""晴",
"conditionId""1",
"humidity""48",
"icon""0",
"pressure""996",
"realFeel""33",
"sunRise""2019-07-27 05:08:00",
"sunSet""2019-07-27 19:34:00",
"temp""35",//需要获取的实时温度
"tips""感觉天气燥热,记得补充水分。",
"updatetime""2019-07-27 11:55:08",
"uvi""10",
"vis""8508",
"windDegrees""225",
"windDir""西南风",
"windLevel""3",
"windSpeed""3.7"
}
},
}
{
"data": {
"city": {
"cityId"2,
"counname""中国",
"ianatimezone""Asia\/Shanghai",
"name""北京市",
"pname""北京市",
"secondaryname""北京市",
"timezone""8"
},
"forecast": [{
"conditionDay""多云",//需要获取的天气情况
"conditionIdDay""1",
"conditionIdNight""8",
"conditionNight""中雨",
"humidity""69",
"moonphase""WaningCrescent",
"moonrise""2019-07-28 01:12:00",
"moonset""2019-07-28 15:51:00",
"predictDate""2019-07-28",
"sunrise""2019-07-28 05:09:00",
"sunset""2019-07-28 19:33:00",
"tempDay""34",//需要获取的当天最高温度
"tempNight""25",//需要获取的当天最低温度
"updatetime""2019-07-27 10:05:00",
"windDegreesDay""225",
"windDegreesNight""225",
"windDirDay""西南风",
"windDirNight""西南风",
"windLevelDay""3",
"windLevelNight""3",
"windSpeedDay""4.4",
"windSpeedNight""4.4"
}]
},
}
2)信息推送 因为APP推送的信息女朋友基本不会看,所以我把目标就锁定在短信推送上。由于最近几年垃圾短信的原因,运营商针对106短信网关平台进行了大量的整顿,短信发送内容的审核监管力度加强。目前市场上短信网关平台绝大部分是做短信验证码服务的居多,而我的需求是能够自行编写短信内容,而这类似的服务审核会更加严格。经过一番的选择之后,找到一家昆明的短信网关平台。 该平台需要将发送的短信内容做成一个短信模板,模板里预先设置好变量参数,最终将此模板上传至平台进行审核。审核通过后,当需要发送短信时,将设置好的模板变量参数及平台返回的模板ID通过调动平台API将相关信息发送至平台进行验证,验证成功后才能进行短信发送。折腾半天之后,最终审核通过的其中一个短信模板如下:

【天气预报来了】宝贝:今天是周[day],气温[low]至[high]度,现在[city]实时温度为[temp]度,美好的一天与你共享!

短信推送效果截图如下:

640?wx_fmt=png


640?wx_fmt=png 功能完善
在折腾了一阵子之后,基础的天气预报推送功能已经完成了。但是,新的问题又来了...... 女朋友家和单位并不在同一个区域,目前推送的天气信息只是其单位所属地区的天气,当出现节假日休息或者旅行出差等特殊情况时就不能正常推送。能否自动判断节假日及出差行程时设置目的地从而自动推送目的地的天气信息呢? 于是,下一步的完善工作开始了。 1)节假日的判断 程序默认每次执行时,会自动判断当前时间是否为工作日,若为工作日则推送女朋友工作单位所属区域天气信息,若为周末时,则推送女朋友家所属区域天气信息。 这只是最简单的处理逻辑,当遇到节假日的时候,此默认逻辑便不再适用。所以需要进行假节日的判断。具体的判断思路为:后台存入以年为单位的JSON文件,把相应当年节假日的日期存入该文件,当程序执行完默认工作日判断之后,将执行当日时间在该JSON文件中查找,如果找得到信息,则说明为假节日;否则,按照默认逻辑执行。 经过新增这样的判断,能够实现所属区域天气信息的精准推送,避免出现女朋友人在家但却推送工作所属区域天气的尴尬情况。 2)旅行等特殊提醒 当女朋友离开本地,外出旅行或者出差的时候,那么以上的原则又被再次打破了,所以针对此类场景,我把它称作特殊提醒。 由于她经常丢三落四,所以我希望除了每天正常天气推送之外,能够在她出发前一天晚上和回程的前一天晚上推送去程和回程当地的天气信息,并在短信内容中增加诸如“带好行李”之类似的提醒。 同时,她外出旅行或者出差又存在我与她同行和不同行的两种情况,所以,最终的短信提醒需要重新向短信网关申请4个提醒模板来实现此功能,具体包含:a)单独去程时提醒模板;b)单独回程时提醒模板;c)同行去程时提醒模板;d)同行回程时提醒模板。 最终行程的短信推送效果如下: 单独外出时推送的提醒信息:

640?wx_fmt=png

640?wx_fmt=png 同行外出时推送的提醒信息:

640?wx_fmt=png

640?wx_fmt=png


640?wx_fmt=png 掌握每日天气推送情况
虽然程序中有日志输出信息,但是为了监控网络或者程序出错等因素导致短信提醒无法推送的情况,更快捷地掌握每日短信推送情况,目前的处理思路是:通过短信平台获取每日短信推送记录,然后利用Python发送邮件的方式,将相关信息发送至邮箱(我在这里选择了139邮箱,它的邮件到达短信提醒功能比较方便及时查看邮件,了解每日短信的推送情况)。 最终实现的效果如下: 640?wx_fmt=png 640?wx_fmt=png

640?wx_fmt=png

写在最后



从天气数据源的获取、短信网关平台的模板申请、节假日判断及特殊时间的提醒,经过这一系列的折腾,我捣鼓完了这个属于女朋友的专属提醒服务。最终,在一个阴雨绵绵的雨天,她终于没有穿着裙子来上班了~~ 作者:赵昱,90后,现居地贵州贵阳。目前工作单位为贵州广电网络,主要从事网络运维方面工作,拥有PMP、网络规划设计师等资格认证。 声明:本文为作者投稿,未经允许请勿转载。 【End】 640?wx_fmt=jpeg

被罚 50 亿后,Google 不再强制绑定 Android 默认引擎!

不可不知的 5 种 JavaScript 代码编辑器

☞北上深人均月薪超 2 万元,清华近三成毕业生年入 50 万+,5G 人才月薪超 4 万

吴军:站在浪潮之巅,5G 和 IoT 才是未来 10 年的浪潮 | 人物志

入门必备 | 盘点11个常用的区块链开发工具,年薪百万的工程师都是从玩转它们开始的

如何从零开始设计一颗芯片?

200行代码解读Github冠军项目背后的定时器

自然语言处理十问!独家福利

为什么雷军说“华为不懂研发”?

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 优快云 文章。

640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优快云资讯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值