更多教程請移步至:洛涼博客
求助請移步至:Python自學技術(shù)交流
一:介紹
本代碼在Python3環(huán)境下編寫坞古,使用(requests,json,time,email)模塊,不保證其他環(huán)境可用弥雹,如果到問題請自行解決或進群求助蚓让。
1儡司、反正我手上的iOS里面的自帶天氣APP刷新太慢,每天早上趕著上班想看看天氣都不行邦危,簡直急死人洋侨。
然后網(wǎng)上搜了一下天氣API,很多免費的API倦蚪,我這里選的是墨跡天氣API希坚,免費,一年內(nèi)可以調(diào)用2000次/每個賬號陵且。好了裁僧,不瞎扯了,直接開擼慕购。
2聊疲、由于墨跡天氣API是用過地區(qū)經(jīng)緯度查詢天氣情況,第一個問題就要解決通過實際的地理位置獲取到經(jīng)緯度沪悲,大家不用擔心获洲,很easy的事,也是直接調(diào)用第三方API就行了(這里調(diào)用騰訊的API)可训。
3昌妹、本人代碼寫好直接放在Linux系統(tǒng)通過執(zhí)行定時任務自動執(zhí)行。(每天早上7:20通過郵箱發(fā)送至指定郵箱)
然后每天早上打開手機郵箱就能很直觀的獲取到近三日天氣情況握截。
有興趣的同學可以自行搜索Linux定時任務機制及簡單使用方法飞崖。
二:通過地理位置獲取經(jīng)緯度
直接貼代碼吧,不是很難得事谨胞,大家遵循騰訊API傳參規(guī)范就行了固歪。
不過大家要去注冊一個騰訊開發(fā)者賬號,獲取開發(fā)者密鑰胯努。
傳送門:騰訊位置服務
以下代碼文件名命名為:loala.py
import requests
import json
from time import sleep
def getlalo():
result = False
while result == False:
address = input('\n請輸入您所在的城市(注:地址中請包含城市名稱):')
url = 'http://apis.map.qq.com/ws/geocoder/v1/?address={}&key='這里請輸入你自己的開發(fā)者密鑰'.format(
address)
r = requests.get(url=url)
d = json.loads(r.text)
if d.get('message') == 'query ok':
return d.get('result').get('location')
elif address == 'q':
print('\n您已選擇退出牢裳,感謝您的使用,再見叶沛!(五秒后自動關(guān)閉)')
sleep(5)
break
elif d.get('message') == '查詢無結(jié)果':
print('\n您輸入的地址有誤蒲讯,請重新輸入:')
continue
if __name__ == "__main__":
ll = getlalo()
三:墨跡天氣API解析
現(xiàn)在開放的API一般result都是以json形式返回。第一步就是通過上面獲取到的經(jīng)緯度去查詢天氣灰署,第二步就是解析JSON判帮。
有興趣的同學可以去阿里云市場搜索天氣API,由于免費的API調(diào)用一般都要傳遞key溉箕。SO大家還是要注冊一個阿里云賬號晦墙,然后購買墨跡免費天氣API,會生成key值肴茄。
下面代碼中還存在郵箱發(fā)送模塊晌畅,有興趣的同學可以自己搜索學習,我這里就是調(diào)用簡單的發(fā)送模塊寡痰。
import requests
import json
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
from time import sleep
def getweather(url,lat,lon,appcode):
'''獲取近三天天氣情況'''
try:
headers = {
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Authorization':'APPCODE '+appcode
}
bodys = {
'lat' : lat,
'lon' : lon,
'token' : '''443847fa1ffd4e69d929807d42c2db1b'''
}
html = requests.post(url,data=bodys,headers=headers)
html.encoding = html.apparent_encoding
html = json.loads(html.text)
weather = html.get('data').get('forecast')
city = str(html.get('data').get('city').get('counname')) + str(html.get('data').get('city').get('pname')) + str(html.get('data').get('city').get('name'))
weathers = []
for a in weather:
ygrq = "預告日期:{}".format(a.get('predictDate'))
btqk = "日間天氣情況:{}".format(a.get('conditionDay'))
wsqk = "晚間天氣情況:{}".format(a.get('conditionNight'))
zdwd = "當天最低溫度:{}度".format(a.get('tempNight'))
zgwd = "當天最高溫度:{}度".format(a.get('tempDay'))
btfx = "日間風向:{}抗楔,級數(shù):{}級".format(a.get("windDirDay"),a.get('windLevelDay'))
wsfx = "晚間風向:{}棋凳,級數(shù):{}級".format(a.get("windDirNight"), a.get('windLevelNight'))
weathers.append(ygrq)
weathers.append(btqk)
weathers.append(wsqk)
weathers.append(zdwd)
weathers.append(zgwd)
weathers.append(btfx)
weathers.append(wsfx)
return weathers,city
except BaseException as f:
return "獲取近三天天氣情況失敗,錯誤信息為:{}".format(f)
def sendmail(weathers,receiver):
# qq郵箱smtp服務器
host_server = 'smtp.qq.com'
# sender_qq為發(fā)件人的qq號碼
sender_qq = '輸入發(fā)送郵件的郵箱地址'
# pwd為qq郵箱的授權(quán)碼
pwd = '輸入發(fā)送郵件的郵箱密碼谓谦,如果是QQ郵箱傳入授權(quán)碼'
# 發(fā)件人的郵箱
sender_qq_mail = '3301885103@qq.com'
# 收件人郵箱
receiver = receiver
hh = '贫橙,'
try:
# 郵件的正文內(nèi)容
today = ''
tomorrow = ''
dftomorrow = ''
for a in weathers[0][0:7]:
b = a + hh
today +=b
for a in weathers[0][7:14]:
b = a + hh
tomorrow +=b
for a in weathers[0][14:21]:
b = a + hh
dftomorrow +=b
mail_content = today + '\n\n' + tomorrow + '\n\n' + dftomorrow
# 郵件標題
mail_title = weathers[1] + "近三日天氣情況"
# ssl登錄
smtp = SMTP_SSL(host_server)
# set_debuglevel()是用來調(diào)試的。參數(shù)值為1表示開啟調(diào)試模式反粥,參數(shù)值為0關(guān)閉調(diào)試模式
smtp.set_debuglevel(0)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = receiver
print('\n您當前查詢的地區(qū)近三日天氣情況如下:')
print('\n' + mail_content)
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()
except:
mail_title = '內(nèi)容出錯了'
mail_content = weathers
# ssl登錄
smtp = SMTP_SSL(host_server)
# set_debuglevel()是用來調(diào)試的卢肃。參數(shù)值為1表示開啟調(diào)試模式,參數(shù)值為0關(guān)閉調(diào)試模式
smtp.set_debuglevel(0)
smtp.ehlo(host_server)
smtp.login(sender_qq, pwd)
msg = MIMEText(mail_content, "plain", 'utf-8')
msg["Subject"] = Header(mail_title, 'utf-8')
msg["From"] = sender_qq_mail
msg["To"] = receiver
smtp.sendmail(sender_qq_mail, receiver, msg.as_string())
smtp.quit()
if __name__ == "__main__":
url = 'http://apifreelat.market.alicloudapi.com/whapi/json/aliweather/briefforecast3days'
appcode = '這里傳入自己的阿里云賬號key'
# 可在http://api.map.baidu.com/lbsapi/getpoint/index.html手動獲取某地經(jīng)緯度
from loala import getlalo
lat = ll.get('lat') #緯度
lon = ll.get('lng') #經(jīng)度
weather = getweather(url,lat,lon,appcode)
receiver = input('\n請輸入需要接收天氣的電子郵箱地址:') #郵件人郵箱地址
sendmail(weather,receiver)
print('\n發(fā)送成功才顿,請查收郵箱莫湘,謝謝!程序5秒后自動關(guān)閉VF幅垮!')
sleep(5)
四:總結(jié)
其實個人使用不用這么復雜,直接使用下面的代碼就夠用了尾组,直接通過百度地圖API服務獲取自己長住地經(jīng)緯度忙芒,然后寫死在代碼里面。
這里用Linux定時任務每天自動運行文件比較方便讳侨,然后通過配置的默認郵箱發(fā)送至指定郵箱呵萨。
有需要的可以進群獲取打包好的EXE可執(zhí)行文件。