python定时天气预报(邮件提醒)(部署到云服务器)

python定时天气预报(邮件提醒)(部署到云服务器)

声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关

需求:拿到当天的天气预报信息,并且把天气预报关键信息合成语音,然后将天气预报信息和合成的语音发送到指定邮箱,最后部署程序到云服务器,设置定时任务运行程序。

一、准备工作

  • 邮件授权码申请(为了发邮件)
  • 和风天气API注册(为了得到天气预报的数据)
  • 百度语音合成API申请(为了发送语音的邮箱附件)
  • 云服务器申请(为了部署到云服务器,设置定时计划)
  • 安装xshell(为了操作云服务器)

二、准备工作具体步骤

  1. 邮件授权码申请
    我这里用的是QQ邮箱,所以首先登陆自己的QQ邮箱,然后依次点击设置——账户——开启SMTP服务——生成授权码,具体如下图

  2. 和风天气API注册
    我这里用到的是和风天气的API,打开和风天气网站:https://dev.heweather.com/docs/api/weather点击跳转,直接注册账号就行,然后到控制台创建应用,再添加key搞定,调用API的时候会用到这个key值,要记住。具体步骤如下图

  3. 百度语音合成API申请
    打开百度智能云https://console.bce.baidu.com/点击跳转,如果还没有账号的直接注册就行,具体步骤如下图


  4. 云服务器申请
    我这里用到的是三丰云的云服务器,这个是免费的,而且还有免费的虚拟主机和免备案服务等等,对于我这种学生党还是挺不错的了,还可以学学Linux的知识等等。首先打开三丰云网站https://www.sanfengyun.com点击跳转,直接注册账号就行,然后到控制台那里开通免费的云服务器即可使用。具体步骤如下图

  5. 安装xshell
    这个大家应该不陌生吧,如果你电脑还没有安装,可以直接百度搜就行了,不大好像就30多MB,安装也容易,我这里就不多说了。

三、开始敲代码

废话不多说,更详细说明请看代码注释

  1. 导入需要用到的包
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
  1. 定义发邮件函数
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)
  1. 定义获取天气预报的函数
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
  1. 定义合成语音的函数
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)
  1. 程序入口
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程序,邮箱这个我已经停掉了哈哈,详情请看我的下一篇博客。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值