python!!每日早上八点自动向QQ邮箱发送天气预报邮件

拜拜、爱过 提交于 2019-11-28 22:41:31

前言:近来天气转凉,我是每日起床都会查一下当天的天气情况。但我又觉得查天气麻烦,于是乎产生了一个每日定时自动获取天气预报并且发送到个人邮箱的想法。

如果你也觉得查天气麻烦,那看这篇文章就对了。
而这篇文章!!将详细讲解如何实现每日早上八点将最近7天的天气状况发送到你的个人邮箱。
自动将天气状况发送到你的个人邮箱共有以下四个步骤。

1.注册免费天气API

1.1打开和风天气注册账号

1.下图是和风天气:https://dev.heweather.com/的首页,打开注册即可。
在这里插入图片描述
2.账号注册成功后点击 新建应用 ,创建一个Key,这个Key是用来进行和风天气API调用的。
可以看到新建成功后的Key是一串长长的字符串,这个就是获取天气信息需要用到的密钥啦。
在这里插入图片描述

1.2打开天气API接口说明,看看和风天气的开发文档。

API开发文档,点击即可跳转。
在这里插入图片描述
从上图中可以看到(有商业版与免费版我这里使用的是免费版),有多种weather-type,这里我们使用forecast,这个是获取3-10天预报

根据上图的请求URL示例可知,我们需要调用的url为

https://free-api.heweather.net/s6/weather/forecast?location=城市代码&key=自己创建的Key

2.编写获取天气代码

城市可以填写中文,也可以填写城市代码城市代码查询

2.1获取天气预报情况

import requests

url = 'https://free-api.heweather.net/s6/weather/forecast?location=广州&key=xxxxxxxxx'
res = requests.get(url)
print(res.text)

返回的是json格式的文件,可以看到返回了从查询当天的起始的7天天气预报信息。
在这里插入图片描述
接下的任务就是解析这一堆json格式的数据啦。

2.2所在城市经纬度等信息查询

import json
import requests

url = 'https://free-api.heweather.net/s6/weather/forecast?location=广州&key=xxxxxxxxx'
res = requests.get(url)
res = json.loads(res.text)	# 转换json数据为字典
result = res['HeWeather6'][0]['basic']
print(result)
# 这是所查询城市的经纬度,时区等等信息。
## {'cid': 'CN101280101', 'location': '广州', 'parent_city': '广州', 'admin_area': '广东', 'cnty': '中国', 'lat': '23.12517738', 'lon': '113.28063965', 'tz': '+8.00'}

2.3查询所在城市未来7天信息

import json
import requests

url = 'https://free-api.heweather.net/s6/weather/forecast?location=广州&key=xxxxxxxxx'
res = requests.get(url)
res = json.loads(res.text)	# 转换json数据为字典
result = res['HeWeather6'][0]['daily_forecast']
print(result)

因为这里调用的API会返回7天的数据,所以会返回7组下图的数据。

        {
          "cond_code_d": "100",		# 白天天气状况 100为晴 101为多云 104为阴 等
          "cond_code_n": "100",		# 夜间天气状况 
          "cond_txt_d": "晴",		# 白天天气状况描述
          "cond_txt_n": "晴",		# 晚间天气状况描述
          "date": "2019-11-10",		# 预报日期
          "hum": "50",				# 相对湿度
          "mr": "16:33",			# 月升时间
          "ms": "04:21",			# 月落时间
          "pcpn": "0.0",			# 降水量
          "pop": "0",				# 降水概率
          "pres": "1013",			# 大气压强
          "sr": "06:37",			# 日出时间
          "ss": "17:43",			# 日落时间
          "tmp_max": "27",			# 最高温度
          "tmp_min": "16",			# 最低温度
          "uv_index": "7",			# 紫外线强度指数
          "vis": "25",				# 能见度,单位:公里
          "wind_deg": "-1",			# 风向360角度
          "wind_dir": "无持续风向",	# 风向
          "wind_sc": "1-2",			# 风力
          "wind_spd": "6"			# 风速,公里/小时
        }
       	......

2.4 获取自己所需要的天气信息

import csv
import json
import requests

url = 'https://free-api.heweather.net/s6/weather/forecast?location=广州&key=xxxxxx'
res = requests.get(url)
res = json.loads(res.text)
result = res['HeWeather6'][0]['daily_forecast']
city = location['parent_city']+location['location']
names = ['城市','时间','天气状况','最高温','最低温','日出','日落']
for data in result:
    date = data['date']
    cond = data['cond_txt_d']
    max = data['tmp_max']
    min = data['tmp_min']
    sr = data['sr']
    ss = data['ss']
    print(city,date,cond,max,min,sr,ss)
## 返回的数据
广州广州 2019-11-1027 16 06:37 17:43
广州广州 2019-11-1128 18 06:38 17:43
广州广州 2019-11-1229 18 06:39 17:42
广州广州 2019-11-13 多云 28 17 06:39 17:42
广州广州 2019-11-1425 15 06:40 17:42
广州广州 2019-11-1526 15 06:40 17:42
广州广州 2019-11-1627 16 06:41 17:41

3.编写发送邮件代码

这里参考菜鸟教程的Python SMTP发送邮件
1.首先去QQ邮箱
打开 设置-账户-开启服务-开启POP3/SMTP服务,然后点击生成授权码,python发送邮件要用。
在这里插入图片描述
直接上代码,不解释。

# 简单邮件传输协议
import smtplib
import email
import time
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

# 设置邮箱的域名
HOST = 'smtp.qq.com'
# 设置邮件标题
SUBJECT = '今日份天气预报到了哟,主子'
# 设置发件人邮箱
FROM = 'xxx@qq.com'
# 设置收件人邮箱
TO = 'xxx@163.com,xxx@qq.com'	# 可以填写多个邮箱,用逗号分隔,后面会用split做逗号分割
message = MIMEMultipart('related')
# --------------------------------------发送文本-----------------
# 发送邮件正文到对方的邮箱中
message_html = MIMEText("主子你的邮件到了\n\nThis is test", 'plain', 'utf-8')	# \n为换行
message.attach(message_html)

# -------------------------------------添加文件---------------------
# 要确定当前目录有test.csv这个文件
message_xlsx = MIMEText(open('test.csv', 'rb').read(), 'base64', 'utf-8')
# 设置文件在附件当中的名字
message_xlsx['Content-Disposition'] = 'attachment;filename="test01.csv"'
message.attach(message_xlsx)

# 设置邮件发件人
message['From'] = FROM
# 设置邮件收件人
message['To'] = TO
# 设置邮件标题
message['Subject'] = SUBJECT

# 获取简单邮件传输协议的证书
email_client = smtplib.SMTP_SSL()
# 设置发件人邮箱的域名和端口,端口为465
email_client.connect(HOST, '465')
# ---------------------------邮箱授权码------------------------------
result = email_client.login(FROM, '你的授权码')
print('登录结果', result)
email_client.sendmail(from_addr=FROM, to_addrs=TO.split(','), msg=message.as_string())
# 关闭邮件发送客户端
email_client.close()

4.完整代码

# coding=gbk		## 注:linux服务器上不需要这一行,window需要
import csv
import time
import json
import requests
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

url = r'https://free-api.heweather.net/s6/weather/forecast?location=广州&key=xxxxxx'
# 获取当日时间	2019-11-10
today_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))

def get_weather_data():
    res = requests.get(url)
    res.encoding = 'utf-8'
    res = json.loads(res.text)
    result = res['HeWeather6'][0]['daily_forecast']
    location = res['HeWeather6'][0]['basic']
    city = location['parent_city'] + location['location']
    names = ['城市', '时间', '天气状况', '最高温', '最低温', '日出', '日落']
    with open('today_weather.csv', 'w', newline='')as f:
        writer = csv.writer(f)
        writer.writerow(names)
        for data in result:
            date = data['date']
            cond = data['cond_txt_d']
            max = data['tmp_max']
            min = data['tmp_min']
            sr = data['sr']
            ss = data['ss']
            writer.writerows([(city, date, cond, max, min, sr, ss)])
    send_email()

def send_email():
    # 设置邮箱的域名
    HOST = 'smtp.qq.com'
    # 设置邮件标题
    SUBJECT = '%s日份天气预报信息,请查收'%today_time
    # 设置发件人邮箱
    FROM = 'xxx@qq.com'
    # 设置收件人邮箱
    TO = 'xxx@163.com,xxx@qq.com'		# 可以同时发送到多个邮箱
    message = MIMEMultipart('related')
    # --------------------------------------发送文本-----------------
	# 发送邮件正文到对方的邮箱中
    message_html = MIMEText("%s日份天气预报到账啦,请查收" % today_time, 'plain', 'utf-8')
    message.attach(message_html)

    # -------------------------------------添加文件---------------------
    # today_weather.csv这个文件
    message_xlsx = MIMEText(open('today_weather.csv', 'rb').read(), 'base64', 'utf-8')
    # 设置文件在附件当中的名字
    message_xlsx['Content-Disposition'] = 'attachment;filename="today_weather.csv"'
    message.attach(message_xlsx)

    # 设置邮件发件人
    message['From'] = FROM
    # 设置邮件收件人
    message['To'] = TO
    # 设置邮件标题
    message['Subject'] = SUBJECT

    # 获取简单邮件传输协议的证书
    email_client = smtplib.SMTP_SSL()
    # 设置发件人邮箱的域名和端口,端口为465
    email_client.connect(HOST, '465')
    # ---------------------------邮箱授权码------------------------------
    result = email_client.login(FROM, '你的授权码')
    print('登录结果', result)
    email_client.sendmail(from_addr=FROM, to_addrs=TO.split(','), msg=message.as_string())
    # 关闭邮件发送客户端
    email_client.close()

get_weather_data()

5.部署代码到服务器,以便每日准时运行代码

说的好听就叫代码部署,换句话说就是将代码拷贝到服务器,然后让代码运行。
这里会用到一丢丢linux的知识,

5.1 首先拷贝文件到服务器

这一步很简单,直接复制黏贴即可。

5.2 无

创建一个和 python文件在同一个文件夹的 startup.sh文件(命名随意),然后在 startup.sh文件的里面填写

python3 ./python文件名称 # 记得 / 前面有个小点 .

在这里插入图片描述
然后再 /etc/crontab 里面填写 stratup.sh文件的路径即可。
在这里插入图片描述
既然你学会了发送天气预报,那再加上每天发送一句语音如何? ,用定制的萝莉音,御姐音给对方发送天气预报信息的语音。点击下方文章链接跳转,get文字转换语音的方式吧。

肥宅福利!!python。文字转语音,你想要御姐音还是萌妹音?
https://blog.csdn.net/weixin_45081575/article/details/103043870

以上,动手操作一番即可,就可以每天8点准时收到最新的天气预报信息了。
如果你懒得动手,可以尝试在留言里动手留下你的邮箱+城市反正我也不会给你弄
这次的分享就到这里。如果有什么疑问可以在下方留言哦。

对于没有服务器的小伙伴在这里推荐一个免费的云服务器: 三丰云免费服务器:https://www.sanfengyun.com/freeServer/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!