疫情如此嚴(yán)重,出門(mén)是必不可能出門(mén)了酿秸,不如來(lái)一起學(xué)習(xí)Python吧灭翔,門(mén)檻低,簡(jiǎn)單辣苏,功能強(qiáng)大肝箱,不用繁雜的知識(shí),只做最有趣稀蟋,最有用的事情狭园。
比如,想每天都定時(shí)收到郵件提醒你今天的天氣嗎糊治?不用自己查詢唱矛,看郵件就行了,僅僅需要一個(gè)云服務(wù)器,阿里云绎谦、百度云管闷、騰訊云都行。你要做的就是寫(xiě)好一個(gè)Python腳本窃肠,然后用云服務(wù)器定時(shí)執(zhí)行就好了。天氣數(shù)據(jù)從哪來(lái)冤留?碧囊?糯而?在此推薦高德開(kāi)放平臺(tái)泊窘,個(gè)人賬號(hào)即可申請(qǐng)開(kāi)發(fā)者烘豹,每天都有一定的配額瓜贾,相當(dāng)足夠携悯,只需要用python做post請(qǐng)求即可侮叮。具體過(guò)程如下:
首先避矢,要注冊(cè)高德開(kāi)放平臺(tái)的賬號(hào),注冊(cè)個(gè)人開(kāi)發(fā)者即可囊榜,其請(qǐng)求配額足夠日常使用审胸。
輸入手機(jī)獲取驗(yàn)證碼,即可注冊(cè)完成卸勺。認(rèn)證個(gè)人開(kāi)發(fā)者還可以提升配額砂沛,流程也不復(fù)雜,上傳身份證信息和照片就可以了曙求。
注冊(cè)完成了就在控制臺(tái)->應(yīng)用管理->我的應(yīng)用中創(chuàng)建一個(gè)應(yīng)用
然后添加一個(gè)key碍庵,這個(gè)key就相當(dāng)于你向高德數(shù)據(jù)方請(qǐng)求天氣數(shù)據(jù)的鑰匙映企,在后面寫(xiě)腳本要用到。
這里建議選擇web服務(wù)静浴,因?yàn)槠涔δ鼙容^多堰氓,而且符合我們的需求。IP白名單可以填可以不填苹享,如果你擔(dān)心自己的key泄露了双絮,被別人用了的話可以將自己的ip和云服務(wù)器的ip添加進(jìn)去,這樣即使key泄露了得问,別人也不能使用你的key囤攀。創(chuàng)建完成了就會(huì)給定一個(gè)key,可以設(shè)置宫纬,查看配額和刪除焚挠。
這是我的key名稱,這個(gè)隨便取就行哪怔。如果你還想做其他的事情而又沒(méi)有頭緒,可以在設(shè)置里向抢,點(diǎn)擊可用的服務(wù)查看API實(shí)例认境。比如天氣查詢:
在官方的API文檔中有明確的請(qǐng)求接口和參數(shù)說(shuō)明,返回的數(shù)據(jù)也可以選擇挟鸠,一般選擇JSON格式叉信。
數(shù)據(jù)來(lái)源解決了,還有一個(gè)問(wèn)題就是云服務(wù)器怎么玩兒艘希。具體可以參考我另一篇文章
蘇伏:小白怎么玩(白嫖一個(gè)月)阿里云ESC?zhuanlan.zhihu.com
現(xiàn)在假設(shè)你已經(jīng)擁有了云服務(wù)器硼身,然后安裝python3,Centos7是自帶python2的覆享,但是我們要安裝python3佳遂,具體怎么安裝且不沖突可以百度。接著pip3安裝好所需要的庫(kù)撒顿,這樣環(huán)境就基本搭建完成了丑罪。在windows環(huán)境下寫(xiě)好代碼保存成.py腳本,然后在云服務(wù)器中運(yùn)行一個(gè)shell腳本凤壁,即可將此腳本定時(shí)運(yùn)行吩屹,讓其自動(dòng)獲取天氣信息,然后給指定的人發(fā)郵件拧抖。具體怎么寫(xiě)定時(shí)shell腳本可以百度煤搜,網(wǎng)上有很多教程。于是乎唧席,一個(gè)天氣定時(shí)郵件通知的小工具就完成了擦盾。代碼我會(huì)附在文后嘲驾。
import pymysql
import requests
import json
import sys
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def search(searchname):
mysqlurl = "120.77.***.***"
username = "root"
passwd = "************"
database_name = "citycode"
sheet_name = "citycode"
sql = "select * from {} where name like '{}%'".format(sheet_name, searchname)
try:
connect = pymysql.connect(host=mysqlurl, user=username, password=passwd, database=database_name, charset="utf8")
cursor = connect.cursor()
cursor.execute(sql)
results = cursor.fetchall()
return results[0][1]
except Exception as e:
print(e.args)
sys.exit()
def dealdata(day):
return ("時(shí)間:{}\n白天:{}\n溫度:{}°C:\n風(fēng)向:{}風(fēng)\n風(fēng)力:{}級(jí)\n晚上:{}\n溫度:{}°C\n風(fēng)向:{}風(fēng)\n風(fēng)力:{}級(jí)\n"
.format(day["date"], day['dayweather'], day['daytemp'],day['daywind'],
day['daypower'], day["nightweather"], day["nighttemp"],
day["nightwind"], day["nightpower"]))
def getweatherinf(city, extensions):
citycode=search(city)
params={
"key":"9253128227b0efacb3e7fad06c994da1",
"city":citycode,
"extensions":extensions,#base 實(shí)時(shí)天氣 all預(yù)告天氣
"output":"JSON"
}
re = requests.get("https://restapi.amap.com/v3/weather/weatherInfo?parameters", params)
data = json.loads(re.text)
inf = {}
if(extensions=="all"):
inf = data["forecasts"][0]
tomorrow = inf["casts"][0]
inf.update({"dayweather":tomorrow["dayweather"],"nightweather":tomorrow["nightweather"]})
tatomorrow = inf["casts"][1]
third = inf["casts"][2]
fourth = inf["casts"][3]
inf.update({"inf":("明天:\n{}\n后天:\n{}\n{}\n{}"
.format(dealdata(tomorrow), dealdata(tatomorrow), dealdata(third), dealdata(fourth)))})
return inf
else:
re = data["lives"][0]
inf.update(("城市:{}/{}\n天氣:{}\n溫度:{}°C\n風(fēng)向:{}\n風(fēng)力:{}\n濕度:{}\n報(bào)告時(shí)間:{}"
.format(re["city"], re["province"], re["weather"], re["temperature"], re["winddirection"],
re["windpower"], re["humidity"], re["reporttime"])))
return inf
def mailto(sender, text):
my_sender = '528179780@2018.cqut.edu.cn' # 發(fā)件人郵箱賬號(hào)
my_pass = 'Zz15023445281' # 發(fā)件人郵箱密碼
my_user = sender # 收件人郵箱賬號(hào)
ret = True
try:
msg = MIMEText(text, 'plain', 'utf-8')
msg['From'] = formataddr(["蘇伏", my_sender]) # 括號(hào)里的對(duì)應(yīng)發(fā)件人郵箱昵稱、發(fā)件人郵箱賬號(hào)
msg['To'] = formataddr(["蘇伏", my_user]) # 括號(hào)里的對(duì)應(yīng)收件人郵箱昵稱厌衙、收件人郵箱賬號(hào)
msg['Subject'] = "天氣" # 郵件的主題距淫,也可以說(shuō)是標(biāo)題
server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 發(fā)件人郵箱中的SMTP服務(wù)器,端口是25
server.login(my_sender, my_pass) # 括號(hào)中對(duì)應(yīng)的是發(fā)件人郵箱賬號(hào)婶希、郵箱密碼
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括號(hào)中對(duì)應(yīng)的是發(fā)件人郵箱賬號(hào)榕暇、收件人郵箱賬號(hào)、發(fā)送郵件
server.quit() # 關(guān)閉連接
except Exception: # 如果 try 中的語(yǔ)句沒(méi)有執(zhí)行喻杈,則會(huì)執(zhí)行下面的 ret=False
ret = False
return ret
massage = getweatherinf("重慶", "all")
print(massage)
"""
ret = mailto("domain@qq.com", massage)
if ret:
print("郵件發(fā)送成功")
else:
print("郵件發(fā)送失敗")
"""
注意:在此代碼中我是用了本地的數(shù)據(jù)庫(kù)保存了城市代碼的彤枢,如果不用的話,也可以用高德的城市代碼查詢API筒饰,需要讀者自行學(xué)習(xí)缴啡。