用python擷取氣象資料開放平台資訊

來源:互聯網
上載者:User
緣由

前端時間在練手做一個Android天氣預報的App,然後就去找現有的公用API,發現找到的大部分的網址都是
失效的,最後發現了 彙總資料 和 氣象資料開放平台,
由於感覺後者的操作優點麻煩,所以選擇了使用前者。
現在呢,就是想試試後者。 介紹

氣象資料平台 是由中國天氣網提供的,需要註冊+實名驗證
才能夠使用,而且好像現在都還是能夠免費購買一年的使用,提供了
* 基礎氣象資料介面: 包含國內369個地級市未來3天常規預報以及三個氣象指數(穿衣指數,舒適度指數,晨練指數)等天氣服務資料。
* 常規氣象資料介面: 包含國內全站2566個縣級以上城市未來3天常規預報以及三個氣象指數(穿衣指數,舒適度指數,晨練指數)等天氣服務資料。

但是調用起來還是比較麻煩的。 使用說明

調用規範 規範用於指導三方夥伴合理調用指數、3天常規預報(24小時)預報服務資料。
請求方式:http get
介面組成:由固定URL加5個不同的參數組成,完整URL需用戶端經過固定方式加密後使用。
資料返回:json
完整的URL: http://open.weather.com.cn/data/?areaid=“”&type=”“&date=”“&appid=”“&key=”.urlencode($key);
固定URL:http://open.weather.com.cn/data/

參數名稱 參數含義 參數範例
Areaid 地區id 單地區:101010100;多地區:101010100|101010200
Type 資料類型 指數:index_f(基礎介面);index_v(常規介面); 3天預報:forecast_f(基礎介面);forecast_v(常規介面);
Date 用戶端日期 按照格式yyyyMMddHHmm擷取用戶端目前時間
Appid 固定分配的型號標識 某某:004906671841487 傳遞參數時:截取appid的前6位 產生公開金鑰時:取完整的appid
Key 令牌 由公開金鑰(public_key)和私密金鑰(private_key)通過固定演算法加密產生

加密方式:
private_key
某某:793ffb_SmartWeatherAPI_662cbc7
private_key僅負責與public_key共同合成key傳參,私密金鑰不可見,用戶端與服務端各儲存一份;
public_key為不包含key在內的完整URL其它部分(此處appid為完整appid)
樣本:
http://open.weather.com.cn/data/?areaid=101010100&type=index_f&date=201410230335&appid=22290667181111
key的演算法
key=base64_encode(hash_hmac(‘sha1’, publickey, public_key,private_key,TRUE));
key加密後通過urlencode對其編碼後傳參
註:每一個產品使用使用者指派一個唯一標識appid,用於統計使用者訪問情況、區分使用者提供差異服務,終端使用者按照終端型號分配,一個型號對應一個標識。 範例程式碼

樣本這裡我只看了php的代碼

:::PHP<!--?phpset_time_limit(0);$private_key = 'xx';$appid='xx';$appid_six=substr($appid,0,6);$areaid = '101010100';  $type='forecast_v';$date=date("YmdHi");$public_key="http://open.weather.com.cn/data/?areaid=".$areaid."&type=".$type."&date=".$date."&appid=".$appid; $key = base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE));$URL="http://open.weather.com.cn/data/?areaid=".$areaid."&type=".$type."&date=".$date."&appid=".$appid_six."&key=".urlencode($key);echo $URL."<br /-->";$string=file_get_contents($URL);echo $string;?>
使用python轉化上訴代碼

其中前面的轉化成python代碼都很容易,遇到困難的是Key加密那裡
$key = base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE));
我尋找了很多資料才知道加密的方法,原因是對加密函數這一塊不是很熟悉。
轉寄的方法為

// PHP版// HMAC-SHA1加密$hmac_sha1_str = base64_encode(hash_hmac("sha1", $string_to_sign, $secret_access_key));# Python版:import hmacimport hashlibimport base64hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()

所以最終的代碼為

import urllibimport datetimeimport base64import hmacimport hashlibprivate_key = 'XXXXXX_SmartWeatherAPI_XXXXXX' #你申請的private_keyappid = 'XXXXXX' # 你申請的appidappid_six = appid[:6]area_id = '101010100' # 地區代碼type_ = 'forecast_v' # 介面類型date = datetime.datetime.now().strftime("%Y%m%d%H%M") # 日期時間public_key = "http://open.weather.com.cn/data/?areaid=" + area_id + "&type=" + type_ +"&date=" + date + "&appid=" + appidkey = urllib.quote(    hmac.new(private_key, public_key, hashlib.sha1).digest().encode('base64').rstrip())url = "http://open.weather.com.cn/data/?areaid=" + area_id + "&type=" + type_ + "&date=" + date + "&appid=" + appid_six + "&key=" + key

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.