python每日天氣播報(bào)

冬天來了,作為特困戶丸升,每天早上起床速度都打敗全國3%的人铆农。
倉促出門,常常不是穿少了就是沒帶傘沒帶口罩狡耻。
于是我就用python寫了個每日天氣播報(bào)跑在樹莓派上墩剖,既可以當(dāng)鬧鐘,又可以預(yù)報(bào)當(dāng)天天氣夷狰。 菜鳥上路岭皂,代碼只求實(shí)現(xiàn)功能,老鳥輕拍沼头。

思路

1.調(diào)用和風(fēng)天氣的API爷绘,獲取天氣數(shù)據(jù)
2.用百度語音API,將天氣數(shù)據(jù)合成語音
3.用樹莓派每天早上定時播報(bào)天氣(定時任務(wù)crontab + Python腳本 + mpg123播放器)

Python知識點(diǎn)

1.使用urllib2庫进倍;
2.Python處理json數(shù)據(jù)土至;
3.linux的定時任務(wù)crontab。

實(shí)現(xiàn)

第一步猾昆、用和風(fēng)天氣API獲取天氣數(shù)據(jù)

城市接口: https://api.heweather.com/x3/weather?cityid=城市ID&key=你的認(rèn)證key

2016-11-08 update 和風(fēng)天氣的API11月初改版了陶因,所以上述接口地址需要更換成新的,看了下就加了個“free-”毡庆,后面代碼加上就好了坑赡。

接口地址變了

首先得注冊登錄和風(fēng)天氣獲得key,在城市代碼里面找到想要查的城市ID,以北京為例:CN101010100

城市ID

先不著急寫碼么抗,我們用API調(diào)試工具試試這個接口,看看返回的是什么數(shù)據(jù)亚铁。
我用的是chrome下postman蝇刀,打開postman,輸入接口鏈接:

https://api.heweather.com/x3/weather?cityid=CN101010100&key=這里填你的key

API調(diào)試工具

返回的是JSON格式的徘溢,現(xiàn)在用Python調(diào)用一下這個接口試試:

# -*- coding: utf-8 -*-
import urllib2
#調(diào)用和風(fēng)天氣的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=你的key'
#用urllib2創(chuàng)建一個請求并得到返回結(jié)果
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()
print resp
python返回的數(shù)據(jù)

這堆亂七八糟的是什么鬼吞琐,沒法看,我們就用postman看看結(jié)構(gòu)就好了然爆。

JSON表示的對象就是標(biāo)準(zhǔn)的JavaScript語言的對象站粟,JSON和Python內(nèi)置的數(shù)據(jù)類型有著對應(yīng)關(guān)系如下:

Python內(nèi)置數(shù)據(jù)類型和JSON的對應(yīng)關(guān)系
對應(yīng)關(guān)系

Python內(nèi)置的json模塊提供了非常完善的Python對象到JSON格式的轉(zhuǎn)換。我們用loads()方法把JSON反序列化為Python對象

#將JSON轉(zhuǎn)化為Python的數(shù)據(jù)結(jié)構(gòu)
json_data = json.loads(resp)
print json_data

結(jié)果發(fā)現(xiàn)數(shù)據(jù)變成了u'XXXXX'的格式曾雕,這是因?yàn)榉葱蛄谢玫降乃凶址畬ο竽J(rèn)都是unicode編碼的奴烙。


結(jié)果

我們此時已經(jīng)將天氣數(shù)據(jù)拿到,并且反序列化為Python對象了,只有提取我們需要的數(shù)據(jù)即可切诀】罚看下天氣API提供哪些數(shù)據(jù)

postman上的JSON結(jié)構(gòu)

我就每天早上聽一下今天的氣溫、風(fēng)力幅虑、pm2.5丰滑、穿衣建議就好了。

現(xiàn)在以獲得pm2.5的值為例倒庵,一層層獲取到pm2.5的值

pm2.5的值

上面說了JSON里面{}對應(yīng)的是Python的dict褒墨,[]對應(yīng)的是Python里的list,上圖中可以比較清楚地知道這個JSON得到的Python數(shù)據(jù)其實(shí)是dict和list的多層嵌套擎宝。這里我們可以類比查《新華字典》貌亭,想要查到“天氣”這個詞,可以找到字母T的頁碼(按A~Z的有序列表)认臊,再找到“tian”所在的位置圃庭,一步步往里找就成找到想要的詞了。

最外層是個dict類型:
dict: {'HeWeather...": [ list]}
往里一層是多個dict失晴,直接通過多層dict['key']['key2']...就能取得PM2.5的值了:
list 只有一個值剧腻,取list[0] (它的值是一個dict),取得天氣只需要

print json_data['HeWeather data service 3.0'][0]['aqi']['city']['pm25']

下面是完整的獲取天氣數(shù)據(jù)的代碼涂屁,這里其實(shí)只是為了實(shí)現(xiàn)功能书在,其實(shí)可以完善的地方很多:

# -*- coding: utf-8 -*-
import sys,urllib2, json

reload(sys) # Python2.5 初始化后會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入
sys.setdefaultencoding('utf-8') #這個是解決合成中文文本的時候拆又,Unicode和utf-8編碼問題的儒旬,可以嘗試注釋掉會不會報(bào)錯

#調(diào)用和風(fēng)天氣的API
url = 'https://api.heweather.com/x3/weather?cityid=CN101010100&key=替換成你的KEY'
req = urllib2.Request(url)
resp = urllib2.urlopen(req).read()

#將JSON轉(zhuǎn)化為Python的數(shù)據(jù)結(jié)構(gòu)
json_data = json.loads(resp)
data = json_data['HeWeather data service 3.0'][0]

#獲取PM2.5的值
pm25 = data['aqi']['city']['pm25']
#獲取空氣質(zhì)量
air_quality = data['aqi']['city']['qlty']

#獲取城市
city = data['basic']['city']

#獲取現(xiàn)在的天氣、溫度帖族、體感溫度栈源、風(fēng)向、風(fēng)力等級
now_weather = data['now']['cond']['txt']
now_tmp = data['now']['tmp']
now_fl = data['now']['fl']
now_wind_dir = data['now']['wind']['dir']
now_wind_sc = data['now']['wind']['sc']

#今天的天氣
today = data['daily_forecast'][0]
weather_day = today['cond']['txt_d']
weather_night = today['cond']['txt_n']
tmp_high = today['tmp']['max']
tmp_low = today['tmp']['min']
wind_dir = today['wind']['dir']
wind_sc = today['wind']['sc']

#天氣建議

#舒適度
comf = data['suggestion']['comf']['brf']
comf_txt = data['suggestion']['comf']['txt']

#流感指數(shù)
flu = data['suggestion']['flu']['brf']
flu_txt = data['suggestion']['flu']['txt']

#穿衣指數(shù)
drsg = data['suggestion']['drsg']['brf']
drsg_txt = data['suggestion']['drsg']['txt']

weather_forcast_txt = "%s今天白天天氣%s,夜間天氣%s,最高氣溫%s攝氏度,最低氣溫%s攝氏度,風(fēng)力%s,風(fēng)向%s,天氣舒適度:%s,%s,流感" \
                      "指數(shù):%s,%s 穿衣指數(shù):%s,%s 現(xiàn)在外面的天氣:%s,當(dāng)前溫度:%s,當(dāng)前風(fēng)力:%s"%(city,weather_day,weather_night,tmp_high,tmp_low,wind_sc,wind_dir,comf,comf_txt,flu,flu_txt,drsg,drsg_txt,now_weather,now_tmp,now_wind_sc)

print weather_forcast_txt
運(yùn)行結(jié)果

第二步竖般、將文字合成語音

我直接用的百度的語音合成API甚垦,調(diào)用方法很簡單(瀏覽器就可以玩)
1、同樣是注冊登錄獲得key涣雕,百度語音
2艰亮、注冊個應(yīng)用,隨便啥應(yīng)用都行挣郭,獲得APPID
這幾步都可以參考官方接入指南
3迄埃、獲得token(一個月有效期,過期再獲取即可)
瀏覽器輸入:

https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的AppID&client_secret=你的AppKey

返回的JSON里面的“access_token”就是調(diào)用百度語音合成API要用的token

4兑障、合成語音 侄非,必填蕉汪、選填參數(shù)可看官方文檔

http://tsn.baidu.com/text2audio?tex=需要合成語音的文本&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token    

5、我們只需要把天氣文本放在第4步的鏈接tex=' '里面就好了

第三步彩库、用樹莓派播放天氣預(yù)報(bào)

樹莓派上安裝linux音頻播放程序 mpg123肤无,執(zhí)行

sudo apt-get install mpg123  

這玩意使用起來異常簡單,試試用命令行 “mpg123 語音url” 來播放在線的音頻

mpg123 http://tsn.baidu.com/text2audio?tex=需要合成語音的文本&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token 

現(xiàn)在只要把第一步獲得的天氣文本用mpg123播放就好了骇钦,在第一步的代碼基礎(chǔ)上加上這些:

url = "http://tsn.baidu.com/text2audio?tex=" + weather_forcast_txt + "&lan=zh&per=0&cuid=設(shè)備mac地址或手機(jī)的IMEI碼&ctp=1&tok=你的token"

os.system('mpg123 "%s"'%(url)) #需要import  os

最后宛渐,定時執(zhí)行天氣播報(bào)腳步就好了

用linux的crontab,可查看crontab定時任務(wù)
在終端執(zhí)行

sudo crontab -e

新增一條

0 8 * * * python /home/pi/...(你的天氣播報(bào)腳本的路徑)  

即每天8點(diǎn)整執(zhí)行語音播報(bào)。

可優(yōu)化的地方

1.用了幾天發(fā)現(xiàn)沒法正常播放音頻了眯搭,原因是百度語音合成的token之前我是獲取了寫死在代碼里的窥翩。重寫了一下調(diào)用百度語音合成的方法。

代碼不完善的地方歡迎留言討論鳞仙,如果您覺得這篇文章對您有幫助請點(diǎn)個贊喲寇蚊。

標(biāo)簽:#Python# #天氣預(yù)報(bào)# #樹莓派#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棍好,隨后出現(xiàn)的幾起案子仗岸,更是在濱河造成了極大的恐慌,老刑警劉巖借笙,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒怖,死亡現(xiàn)場離奇詭異,居然都是意外死亡业稼,警方通過查閱死者的電腦和手機(jī)盗痒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低散,“玉大人俯邓,你說我怎么就攤上這事∪酆牛” “怎么了稽鞭?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跨嘉。 經(jīng)常有香客問我川慌,道長,這世上最難降的妖魔是什么祠乃? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮兑燥,結(jié)果婚禮上亮瓷,老公的妹妹穿的比我還像新娘。我一直安慰自己降瞳,他們只是感情好嘱支,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布蚓胸。 她就那樣靜靜地躺著,像睡著了一般除师。 火紅的嫁衣襯著肌膚如雪沛膳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天汛聚,我揣著相機(jī)與錄音锹安,去河邊找鬼。 笑死倚舀,一個胖子當(dāng)著我的面吹牛叹哭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痕貌,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼风罩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舵稠?” 一聲冷哼從身側(cè)響起超升,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哺徊,沒想到半個月后室琢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唉工,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年研乒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淋硝。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡雹熬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谣膳,到底是詐尸還是另有隱情竿报,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布继谚,位于F島的核電站烈菌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏花履。R本人自食惡果不足惜芽世,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诡壁。 院中可真熱鬧济瓢,春花似錦、人聲如沸妹卿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箕宙,卻和暖如春嚎朽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柬帕。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工哟忍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雕崩。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓魁索,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盼铁。 傳聞我的和親對象是個殘疾皇子粗蔚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件饶火、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,093評論 4 62
  • 1.確認(rèn)wlan0 網(wǎng)卡是否激活, 如果沒有激活,即使配置了wifi也不能連上網(wǎng). 1.1 掃描wifi: sud...
    moodi閱讀 11,494評論 1 7
  • 再聽2016年他在廈大的致畢業(yè)生演講鹏控,漸漸明白:名校是鎮(zhèn)國重器的含義。它永遠(yuǎn)都是一個時代的精神圣地肤寝,一方面它告訴我...
    半夏長安閱讀 1,057評論 0 0
  • 多少年前当辐,周樹人先生可能也走在這片櫻花樹下,多少年之后鲤看,爸爸牽著我的小手走在一樣的樹下缘揪,經(jīng)歷了多少抗?fàn)帲艓е?..
    氣質(zhì)若蘭lily何靖閱讀 346評論 0 0