您的位置:首页 > 编程语言 > Python开发

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

2019-08-06 18:34 543 查看

作者 | 赵昱责编 | 郭芮

在一个阴雨绵绵的早上,一切都是那么安静祥和。忽然之间,被电话打破了宁静,一看是女朋友的电话,就知道这个小家伙肯定又做了什么傻事......果不其然,16℃的雨天她居然穿着裙子去上班被冻傻了,问她干嘛不看天气预报,居然回复说没有看天气预报的习惯。最终我又从单位赶回到家里来给她拿衣服......在回家的途中,了解到她有看短信的习惯,但是不看APP推送的信息。于是,就有了利用Python来获取当天的天气信息并通过短信推送到她手机的想法。
基础功能的实现
最初的构想逻辑是,根据城市的名字获取当天的天气信息数据,再根据获取到的天气数据进行短信发送到手机。具体的实现方式如下: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]度,美好的一天与你共享!

短信推送效果截图如下:


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

同行外出时推送的提醒信息:


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

写在最后



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

被罚 50 亿后,Google 不再强制绑定 Android 默认引擎!
不可不知的 5 种 JavaScript 代码编辑器☞北上深人均月薪超 2 万元,清华近三成毕业生年入 50 万+,5G 人才月薪超 4 万吴军:站在浪潮之巅,5G 和 IoT 才是未来 10 年的浪潮 | 人物志入门必备 | 盘点11个常用的区块链开发工具,年薪百万的工程师都是从玩转它们开始的如何从零开始设计一颗芯片?200行代码解读Github冠军项目背后的定时器自然语言处理十问!独家福利为什么雷军说“华为不懂研发”?

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐