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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章