緣由
前端時間在練手做一個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