python定时天气预报(邮件提醒)(部署到云服务器)
声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关
需求:拿到当天的天气预报信息,并且把天气预报关键信息合成语音,然后将天气预报信息和合成的语音发送到指定邮箱,最后部署程序到云服务器,设置定时任务运行程序。
一、准备工作
- 邮件授权码申请(为了发邮件)
- 和风天气API注册(为了得到天气预报的数据)
- 百度语音合成API申请(为了发送语音的邮箱附件)
- 云服务器申请(为了部署到云服务器,设置定时计划)
- 安装
xshell
(为了操作云服务器)
二、准备工作具体步骤
-
邮件授权码申请
我这里用的是QQ邮箱,所以首先登陆自己的QQ邮箱,然后依次点击设置——账户——开启SMTP服务——生成授权码,具体如下图
-
和风天气API注册
我这里用到的是和风天气的API,打开和风天气网站:https://dev.heweather.com/docs/api/weather点击跳转,直接注册账号就行,然后到控制台创建应用,再添加key搞定,调用API的时候会用到这个key值,要记住。具体步骤如下图
-
百度语音合成API申请
打开百度智能云https://console.bce.baidu.com/点击跳转,如果还没有账号的直接注册就行,具体步骤如下图
-
云服务器申请
我这里用到的是三丰云的云服务器,这个是免费的,而且还有免费的虚拟主机和免备案服务等等,对于我这种学生党还是挺不错的了,还可以学学Linux的知识等等。首先打开三丰云网站https://www.sanfengyun.com点击跳转,直接注册账号就行,然后到控制台那里开通免费的云服务器即可使用。具体步骤如下图
-
安装
xshell
这个大家应该不陌生吧,如果你电脑还没有安装,可以直接百度搜就行了,不大好像就30多MB,安装也容易,我这里就不多说了。
三、开始敲代码
废话不多说,更详细说明请看代码注释
- 导入需要用到的包
import requests
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
from email.mime.multipart import MIMEMultipart
from aip import AipSpeech
import random
- 定义发邮件函数
def send_email(subject,content):
msg = MIMEMultipart()
password = '你自己的邮箱授权码' # 授权码
from_addr = '发邮箱的QQ账号'
smtp_server = 'smtp.qq.com'
to_addr = '接收邮件的邮箱账号' #可以发给自己
server = smtplib.SMTP_SSL(smtp_server, '465') # 开启发信服务,这里用的是加密传输
server.connect(smtp_server, '465') # 服务器连接,服务器地址、接口
server.login(from_addr, password)
msg['Subject'] = subject #邮件主题
msg['From']=formataddr(["今日天气",from_addr]) #修改发件人显示的名称
msg.attach(MIMEText(content.strip(), 'plain', 'utf-8'))
msg_mp3 = MIMEText(open('/home/Juneway/weather.mp3', 'rb').read(), 'base64', 'utf-8')
msg_mp3["Content-Type"] = 'application/octet-stream'
msg_mp3['Content-Disposition'] = f'attachment;filename="weather.mp3"'
msg.attach(msg_mp3)
server.sendmail(from_addr, to_addr, msg.as_string())
print('发送邮件成功')
server.quit() # 关闭服务器
time.sleep(15)
- 定义获取天气预报的函数
def get_weather(city_id):
key='你自己和风天气应用的key'
url='https://free-api.heweather.net/s6/weather/forecast?location={0}&key={1}'.format(city_id,key)
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
r=requests.get(url,headers=headers)
data=r.json()
city=data['HeWeather6'][0]['basic']['location'] #城市
forecast_time=data['HeWeather6'][0]['update']['loc'] #预报时间
date=data['HeWeather6'][0]['daily_forecast'][0]['date'] #日期
day_weather=data['HeWeather6'][0]['daily_forecast'][0]['cond_txt_d'] #白天天气
night_weather=data['HeWeather6'][0]['daily_forecast'][0]['cond_txt_n'] #晚间天气
wind_dir=data['HeWeather6'][0]['daily_forecast'][0]['wind_dir'] #风向
wind_sc=data['HeWeather6'][0]['daily_forecast'][0]['wind_sc'] #风力
wind_spd=data['HeWeather6'][0]['daily_forecast'][0]['wind_spd'] #风速 公里/小时
tmp_min=data['HeWeather6'][0]['daily_forecast'][0]['tmp_min'] #最低气温
tmp_max=data['HeWeather6'][0]['daily_forecast'][0]['tmp_max'] #最高气温
sr=data['HeWeather6'][0]['daily_forecast'][0]['sr'] #日出时间
ss=data['HeWeather6'][0]['daily_forecast'][0]['ss'] #日落时间
mr=data['HeWeather6'][0]['daily_forecast'][0]['mr'] #月出时间
ms=data['HeWeather6'][0]['daily_forecast'][0]['ms'] #月落时间
content='\n日期:{0}\n白天天气:{1} 晚间天气:{2}\n最低气温:{3} 最高气温:{4}\n风向:{5} 风力:{6} 风速:{7}\n日出时间:{8} 日落时间:{9}\n月出时间:{10} 月落时间;{11}\n'.format(date,day_weather,night_weather,tmp_min,tmp_max,wind_dir,wind_sc,wind_spd,sr,ss,mr,ms)
subject='城市:{0} 预报时间:{1}'.format(city,forecast_time)
mp3_content='{0}今天早上{1}。晚上{2}。气温{3}到{4}摄氏度。{5}。风力{6}级。风速{7}公里每小时。{8}日出。{9}日落。{10}月出。{11}月落。'.format(city,day_weather,night_weather,tmp_min,tmp_max,wind_dir,wind_sc,wind_spd,sr,ss,mr,ms)
return subject,content,mp3_content
- 定义合成语音的函数
def download_mp3(mp3_content)
APP_ID = '填你自己的'
API_KEY = '填你自己的'
SECRET_KEY = '填你自己的'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
result = client.synthesis(mp3_content, 'zh', 1, {'vol': 15,'spd':3,'pit':8,'per':random.choice([0,4,5,103,111])})
if not isinstance(result, dict):
with open('/home/Juneway/weather.mp3', 'wb') as f:
f.write(result)
- 程序入口
if __name__ == '__main__':
city_list=['CN101281106','CN101282007','CN101280301','CN101280801'] #台山,茂南,惠州,顺德 你可以填写你想要的城市
for city in city_list:
subject,content,mp3_content=get_weather(city)
download_mp3(mp3_content)
send_email(subject,content)
四、部署到云服务器
五、结果展示
写在最后
这个小项目呢是在微信csdn公众号上看到的,然后就很想自己动手也来尝试一番,这个是我的第一个在服务器上运行的程序,每天收到信息感觉还是挺不错的。
不过呢,邮箱的附件每次都要下载下来才能听,而且现在邮箱也不常用,不方便,有点不够完美,于是乎我无意中看到了一篇关于微信公众号的每日推送《每日一笑》的文章,所以我又搞了一个用微信公众号发天气预报的python程序,邮箱这个我已经停掉了哈哈,详情请看我的下一篇博客。