python实现自动发送天气预报到邮箱

author:Jarrett
初稿时间:2020年10月8日

前言

假如有个私人助理每天向我报告我所关心信息,比如我想知道今天的热点新闻,知乎、微博的热点内容,某个技术有了什么新的突破等等信息。
但是,没有真人的“私人助理”但是可以有一个程序来帮我做到以上的事情。一个运行在服务端的程序,每天抓取我想要的信息,再定时地发送我的邮箱,这不就让梦想更进一步了。那就先来完成一个自动发送天气预报的程序,再将这个程序部署在树莓派上,设置为每天早上和下午定时发送到邮箱。

天气数据的获取

api提供商和风天气
和风天气的开发者文档地址为:
https://dev.heweather.com/docs/api/weather

和风天气支持提供某个地区的天气预报和实况天气信息。其城市级天气预报API,包括全球15万个城市或地区的1-15天天气预报、实况天气、逐小时天气预报以及日出日落、月升月落等数据。
和风天气提供的API包括商业版和开发版。

如需要查看更早期的版本的开发文档请访问 S6版本,S6版本的技术支持截止于2020年6月1日。

3天预报 HTTP GET

商业版 https://api.heweather.net/v7/weather/3d?{请求参数}
开发版 https://devapi.heweather.net/v7/weather/3d?{请求参数}

python链接和风天气

url = APIURL + '?location= ' + CITY + '&key=' + KEY
res = requests.get(url)
res = json.loads(res.text)  # Change the response to json.

和风天气的返回数据如下所示。

{"HeWeather6":
[{"basic":
{"cid":"CN101271503","location":"彭山","parent_city":"眉山","admin_area":"四川省","cnty":"中国","lat":"30.19229889","lon":"103.87010193","tz":"+8.00"},
"update": {"loc":"2020-10-08 20:40","utc":"2020-10-08 12:40"},
"status":"ok",
"daily_forecast":
[{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-08","hum":"85","mr":"22:51","ms":"12:27","pcpn":"1.4","pop":"58","pres":"967","sr":"07:03","ss":"18:39","tmp_max":"19","tmp_min":"16","uv_index":"2","vis":"25","wind_deg":"59","wind_dir":"东北风","wind_sc":"1-2","wind_spd":"3"},
{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-09","hum":"87","mr":"23:43","ms":"13:23","pcpn":"1.0","pop":"55","pres":"963","sr":"07:03","ss":"18:38","tmp_max":"20","tmp_min":"16","uv_index":"2","vis":"25","wind_deg":"0","wind_dir":"北风","wind_sc":"1-2","wind_spd":"3"},
{"cond_code_d":"305","cond_code_n":"305","cond_txt_d":"小雨","cond_txt_n":"小雨","date":"2020-10-10","hum":"88","mr":"00:00","ms":"14:15","pcpn":"1.0","pop":"55","pres":"961","sr":"07:04","ss":"18:37","tmp_max":"20","tmp_min":"17","uv_index":"2","vis":"25","wind_deg":"0","wind_dir":"北风","wind_sc":"1-2","wind_spd":"3"}
]}]}
格式整理

使用开发版的API只能提供三天的天气预报数据。从获取的信息中提取到天气描述、最高温度、最低温度、湿度、风向、风级、风速等信息。

forecast = res['HeWeather6'][0]['daily_forecast']
for data in forecast:
    cond_txt_d = data['cond_txt_d']  # weather 天气描述
    tmp_max = data['tmp_max']  # max temperature.
    tmp_min = data['tmp_min']  # min tempereture.
    hum = data['hum']  # humanity
    wind_dir = data['wind_dir']  # wind direction.
    wind_sc = data['wind_sc']  # wind degree.
    wind_spd = data['wind_spd']  # wind speed.
发送邮件

邮件发送模块采用菜鸟教程的demo即可完成。
发送的邮箱可以选择国内的163邮箱,QQ邮箱。需要注意的是发送邮箱的token是需要到邮箱的设置页设置的,而不是常用的登录邮箱。
这里建议将发件人姓名(username)发件人的邮箱地址,收件人的姓名、收件人的邮箱地址,全部放到配置文件中。这样做的目的是方便以后扩展和修改,避免修改程序;另一方面将其加入到gitingore文件中,就不会被同步。

数据 -> 格式 -> 邮件发送

通过将获取的天气预报数据整理格式,就可以发送天气预报到邮箱了。

邮箱里接收到的信息

单纯的文字看上去就很“朴素”,为了增强用户的友好度,我们采用HTML美化。
美化的方法是首先用html设计一个网页,然后再将需要显示的数据给替换为查询的天气信息。


天气预报

界面的美化是因人而异,直接copy了和风天气的UI。

结论
  • 用最简单的方式爬取和风天气的API。仅用几行代码就可以获取到天气信息,这也是很多爬虫程序的第一步。
  • 邮件发送的模块是可以完全复用的。邮件发送的内容可以是普通的文本,html,图片,以及附件等。
  • 这里是实现了发送邮件的内容,下一步需要将其部署在树莓派中,且设置为定时任务。
参考

菜鸟教程:Python SMTP发送邮件
https://github.com/Jarrettluo/Weather_Forecast

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351