開(kāi)發(fā)天氣情況采集程序

開(kāi)發(fā)天氣情況采集程序

天氣情況采集程序

每天都要記錄時(shí)間日志使碾,從最初的九宮格到目前的 UniLog 底洗,已經(jīng)經(jīng)歷了好多個(gè)版本。其中天氣的情況記錄十分有用,但是獲取天氣的信息是個(gè)比較麻煩的事情腾么,作為一個(gè) IT 工作者奈梳,怎能被這種問(wèn)題所耽擱?

背景

每天都要記錄時(shí)間日志解虱,從最初的九宮格到目前的 UniLog 攘须,已經(jīng)經(jīng)歷了好多個(gè)版本。

九宮格中的天氣情況我覺(jué)得很有用殴泰,有時(shí)候都可以借此回顧當(dāng)天的具體情形于宙。

這樣的好天氣,怎么能沒(méi)有你悍汛?

——韋禮安《好天氣》

自然捞魁,在 UniLog 中,也繼承了天氣的填寫(xiě)离咐,信息更全:

?谱俭,26 ~ 32℃,??東北風(fēng)3-4級(jí)宵蛀,??97%昆著,??32

是不是看起來(lái)很不錯(cuò)?

但是處理很費(fèi)時(shí)間术陶,打開(kāi)網(wǎng)頁(yè)或手機(jī)凑懂,到處找這些信息……

一個(gè)搞 IT 的怎么能讓這種問(wèn)題難倒?

需求

寫(xiě)個(gè)腳本什么的瞳别,一鍵復(fù)制就好了征候。

分析

數(shù)據(jù)源

自然是天氣預(yù)報(bào)了,仔細(xì)看了下祟敛,墨跡天氣會(huì)比較好些疤坝。具體用網(wǎng)頁(yè)還是API呢?默認(rèn)API馆铁,為什么我就不說(shuō)了跑揉,感覺(jué)API會(huì)比較穩(wěn)定些。

阿里云市場(chǎng)中有墨跡的API提供埠巨,使用免費(fèi)版本即可:

https://market.aliyun.com/products/57096001/cmapi023656.html

對(duì)應(yīng)接口主要有:

  • 精簡(jiǎn)預(yù)報(bào)3天历谍;全天預(yù)報(bào),比較穩(wěn)定辣垒,但是沒(méi)有濕度和AQI信息望侈;
  • 精簡(jiǎn)預(yù)報(bào)實(shí)況:實(shí)時(shí)信息;
  • 精簡(jiǎn)AQI:只有空氣質(zhì)量信息勋桶;

從不同的API取對(duì)應(yīng)的信息即可脱衙,好煩……??

數(shù)據(jù)處理

獲取了數(shù)據(jù)侥猬,就很好辦了:

  1. 處理原始文本,替換圖標(biāo)或者增加圖標(biāo)捐韩;
  2. 拼接成最終結(jié)果退唠;

其他

有幾個(gè)額外的需求:

  1. 沒(méi)空看結(jié)果如何,所以最好語(yǔ)音提示荤胁,用say命令就好了瞧预;
  2. 保存到剪貼板中;
  3. 不要給我彈出對(duì)話框:那就用Automator來(lái)生成app就好了仅政。

解決方案

代碼放在了Github中:getWeather垢油。

將下述內(nèi)容保存為`getMojiWeather.py'

#!/bin/env python
# -*- coding=utf-8 -*-

__author__ = u'Rex Kang'
__description__ = u'根據(jù)需求,調(diào)用墨跡API生成一句話簡(jiǎn)介已旧。'
__license__ = u'GPL - http://www.fsf.org/licenses/gpl.txt';
__history__ = {
    u'1.0': [u'2017/05/19', u'調(diào)用墨跡API秸苗,完成基本功能'],
    u'1.1': [u'2017/06/08', u'調(diào)用墨跡API,完成基本功能']
}
import urllib, urllib2, sys, json


def mojiAPI(apiDict, cityID, appCode):
    method = 'POST'
    querys = ''
    bodys = {}
    url = apiDict['host'] + apiDict['path']

    # CityID來(lái)自于https://github.com/IceblueSakura/GetWeather/blob/master/Cityid.xml
    bodys['cityId'] = cityID
    bodys['token'] = apiDict['token']
    post_data = urllib.urlencode(bodys)
    request = urllib2.Request(url, post_data)
    request.add_header('Authorization', 'APPCODE ' + appCode)
    # 根據(jù)API的要求运褪,定義相對(duì)應(yīng)的Content-Type
    request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
    response = urllib2.urlopen(request)
    content = response.read()
    if (content):
        contentDict = {}
        try:
            contentDict = json.loads(content)
        except Exception, err:
            pass
        finally:
            return contentDict

def getCityID(city=u'壕ィ口市'):
    cities = {
        u'海口市': '1020',
        u'三亞市': '1022',
        u'烏魯木齊市': '2505',
        u'西安市': '2182',
    }
    return cities.get(city, '航斩铮口市')

# v1.1 Modified Start
def getWetaherIcon(w=u'晴'):
    weatherIcon = {
        u'晴': u'??',
        u'陰': u'??',
        u'多云': u'?',
        u'陣雨': u'??',
        u'雨': u'??',
        u'中雨': u'?',
    }
    return weatherIcon.get(w, '??')

def getAOIIcon(aqi=40):
    icon = u'??'
    if int(aqi) > 150:
        icon = u'??'
    elif int(aqi) > 75:
        icon =  u'??'
    return icon
# v1.1 Modified end

def main():
    API = {
        'BriefForecast': {
            'name': u'精簡(jiǎn)預(yù)報(bào)3天',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefforecast3days',
            'token': '677282c2f1b3d718152c4e25ed434bc4'
        },
        'BriefCondition': {
            'name': u'精簡(jiǎn)預(yù)報(bào)實(shí)況',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefcondition',
            'token': '46e13b7aab9bb77ee3358c3b672a2ae4'
        },
        'AQI': {
            'name': u'精簡(jiǎn)AQI',
            'host': 'http://freecityid.market.alicloudapi.com',
            'path': '/whapi/json/alicityweather/briefaqi',
            'token': '4dc41ae4c14189b47b2dc00c85b9d124'
        }
    }

    city = u'YourCity'
    appCode = 'YourAppCode'
    resultOfCondition = mojiAPI(API['BriefCondition'], getCityID(city), appCode)
    resultOfForecast = mojiAPI(API['BriefForecast'], getCityID(city), appCode)
    resultOfAQI = mojiAPI(API['AQI'], getCityID(city), appCode)

    strList = ['']*8

    try:
        if resultOfCondition and 'data' in resultOfCondition:
            cond = resultOfCondition['data']['condition']
            strList[0] = getWetaherIcon(cond['condition']) # v1.1 Modified
            strList[5] = cond['humidity']

        if resultOfForecast and 'data' in resultOfForecast:
            fore = resultOfForecast['data']['forecast'][1]
            strList[1] = fore['tempNight']
            strList[2] = fore['tempDay']
            strList[3] = fore['windDirDay']
            strList[4] = fore['windLevelDay']

        if resultOfAQI and 'data' in resultOfAQI:
            strList[7] = resultOfAQI['data']['aqi']['value']
            strList[6] = getAOIIcon(strList[7]) # v1.1 Modified
    except Exception, err:
        print Exception,err
    finally:
        str = u'%s檀咙,%s ~ %s℃,%s%s級(jí)璃诀,濕度%s%%弧可,%s%s' % tuple(strList)
        print str.encode('utf-8')

將下述內(nèi)容在 Automator保存為getWeather.app

cd ScriptDir
python MojiWeatherFromAPI.py
[ $? -eq 0 ] && say 'Weather copied.' && exit
say 'Error occurred.' && exit 1

其他

CityID

CityID可以用下述方式獲取,將毫踊叮口換成對(duì)應(yīng)的城市:

  1. 訪問(wèn)鏈接地址:http://tianqi.moji.com/api/citysearch/鹤厮校口
  2. 第一個(gè)cityid就是了凿将,盒L祝口為1020
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牧抵,一起剝皮案震驚了整個(gè)濱河市笛匙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犀变,老刑警劉巖妹孙,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異获枝,居然都是意外死亡蠢正,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)省店,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚣崭,“玉大人蜘拉,你說(shuō)我怎么就攤上這事∮新梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵谎脯,是天一觀的道長(zhǎng)葱跋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)源梭,這世上最難降的妖魔是什么娱俺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮废麻,結(jié)果婚禮上荠卷,老公的妹妹穿的比我還像新娘。我一直安慰自己烛愧,他們只是感情好油宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怜姿,像睡著了一般慎冤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沧卢,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天蚁堤,我揣著相機(jī)與錄音,去河邊找鬼但狭。 笑死披诗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立磁。 我是一名探鬼主播呈队,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼息罗!你這毒婦竟也來(lái)了掂咒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤迈喉,失蹤者是張志新(化名)和其女友劉穎绍刮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挨摸,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孩革,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了得运。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膝蜈。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出饱搏,到底是詐尸還是另有隱情非剃,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布推沸,位于F島的核電站备绽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鬓催。R本人自食惡果不足惜肺素,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宇驾。 院中可真熱鬧倍靡,春花似錦、人聲如沸课舍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筝尾。三九已至雨让,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忿等,已是汗流浹背栖忠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贸街,地道東北人庵寞。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薛匪,于是被迫代替她去往敵國(guó)和親捐川。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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