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程序,郵箱這個我已經停掉了哈哈,詳情請看我的下一篇博客。