定時(shí)發(fā)送天氣郵件小工具

疫情如此嚴(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)求配額足夠日常使用审胸。

image
image

輸入手機(jī)獲取驗(yàn)證碼,即可注冊(cè)完成卸勺。認(rèn)證個(gè)人開(kāi)發(fā)者還可以提升配額砂沛,流程也不復(fù)雜,上傳身份證信息和照片就可以了曙求。

注冊(cè)完成了就在控制臺(tái)->應(yīng)用管理->我的應(yīng)用中創(chuàng)建一個(gè)應(yīng)用

image

然后添加一個(gè)key碍庵,這個(gè)key就相當(dāng)于你向高德數(shù)據(jù)方請(qǐng)求天氣數(shù)據(jù)的鑰匙映企,在后面寫(xiě)腳本要用到。

image

這里建議選擇web服務(wù)静浴,因?yàn)槠涔δ鼙容^多堰氓,而且符合我們的需求。IP白名單可以填可以不填苹享,如果你擔(dān)心自己的key泄露了双絮,被別人用了的話可以將自己的ip和云服務(wù)器的ip添加進(jìn)去,這樣即使key泄露了得问,別人也不能使用你的key囤攀。創(chuàng)建完成了就會(huì)給定一個(gè)key,可以設(shè)置宫纬,查看配額和刪除焚挠。

image

這是我的key名稱,這個(gè)隨便取就行哪怔。如果你還想做其他的事情而又沒(méi)有頭緒,可以在設(shè)置里向抢,點(diǎn)擊可用的服務(wù)查看API實(shí)例认境。比如天氣查詢:

image
image
image

在官方的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í)缴啡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓷们,隨后出現(xiàn)的幾起案子业栅,更是在濱河造成了極大的恐慌,老刑警劉巖谬晕,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘裕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡攒钳,警方通過(guò)查閱死者的電腦和手機(jī)帮孔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)不撑,“玉大人文兢,你說(shuō)我怎么就攤上這事』烂剩” “怎么了姆坚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)实愚。 經(jīng)常有香客問(wèn)我旷偿,道長(zhǎng),這世上最難降的妖魔是什么爆侣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任萍程,我火速辦了婚禮,結(jié)果婚禮上兔仰,老公的妹妹穿的比我還像新娘茫负。我一直安慰自己,他們只是感情好乎赴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布忍法。 她就那樣靜靜地躺著潮尝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饿序。 梳的紋絲不亂的頭發(fā)上勉失,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音原探,去河邊找鬼乱凿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咽弦,可吹牛的內(nèi)容都是我干的徒蟆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼型型,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼段审!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闹蒜,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寺枉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后绷落,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姥闪,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嘱函,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甘畅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埂蕊。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡往弓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蓄氧,到底是詐尸還是另有隱情函似,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布喉童,位于F島的核電站撇寞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堂氯。R本人自食惡果不足惜蔑担,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咽白。 院中可真熱鬧啤握,春花似錦、人聲如沸晶框。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蹲蒲,卻和暖如春番甩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背届搁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工缘薛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咖祭。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓掩宜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親么翰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子牺汤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容