《奇巧淫技》系列-python!!每天早上八點自動傳送天氣預報郵件到QQ郵箱

SunriseCai發表於2020-01-22

此部落格僅為我業餘記錄文章所用,釋出到此,僅供網友閱讀參考,如有侵權,請通知我,我會刪掉。

有不少讀者留言說本文章沒有用,因為天氣預報直接開啟手機就可以收到了,為何要多此一舉傳送到QQ郵箱呢!!!
仔細想想確實是這麼回事,但是,換一個場景或許就派得上用場了呢。。


前言:

近來天氣轉涼,我是每日起床都會查一下當天的天氣情況。但我又覺得查天氣麻煩,於是乎產生了一個每日定時自動獲取天氣預報並且傳送到個人郵箱的想法。

如果你也覺得查天氣麻煩,那看這篇文章就對了。
而這篇文章!!將詳細講解如何實現每日早上八點將最近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檔案的路徑即可。
在這裡插入圖片描述
既然你學會了傳送天氣預報,那再加上每天傳送一句語音或短視訊如何? ,用定製的蘿莉音,御姐音給對方傳送天氣預報資訊的語音或者附加一段短視訊,豈不美哉??點選下方文章連結跳轉,學習diy語音以及獲取短視訊的方式吧。

  • diy定製自己的文字轉語音
  • 獲取抖音短視訊

點選直達:《奇巧淫技》系列-Python實現 語音轉文字??非也!!是文字轉語音,DIY你想要的蘿莉音!!!
點選直達:《超簡單!!!利用python下載無水印某音視訊》

以上,動手操作一番即可,就可以每天8點準時收到最新的天氣預報資訊了。
如果你懶得動手,可以嘗試在留言裡動手留下你的郵箱+城市反正我也不會給你弄
這次的分享就到這裡。如果有什麼疑問可以在下方留言哦。

相關文章