最近在做一個天氣預報app,看見國家氣象局有api接口提供,但是需要申請,網址 http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml,
審核大概需要一周左右,審核通過后,你會收到一封郵件
您好:
歡迎使用SmartWeatherAPI測試接口
恭喜您的申請已通過審核,以下是為您分配的鑒權信息:
appid:XXXXXXXXXXXXXXXX
private_key:XXXXXXXXXXXXXXXX
接口使用說明請參考《SmartWeatherAPI_Lite_WebAPI 版產品使用說明書》,區域列表:請見附件areaid_list.xlsx。
該鑒權信息僅限您個人或本公司使用,如有泄露我們將撤銷您的使用權限,必要時將追究相關責任。
最后,非常感謝您的參與。
現在你有appid和private_key了,可以開始獲取天氣了。
1. 接口說明
接口的完整URL: http://open.weather.com.cn/data/?areaid=""&type=""&date=""&appid=""&key=".urlencode($key)
輸入參數:
areaid: 區域id,審核通過后郵件中有個附件,提供的就是現有的所有區域的id號。
type: 數據類型(實況: observe, 指數: index, 常規預報: forecast3d)。
date: 客戶端日期,按照格式yyyyMMddHHmm獲取客戶端當前時間。
appid: 固定分配的型號標識,審核通過后郵件告知(傳遞參數時:截取 appid 的前 6 位; 生成公鑰時:取完整的 appid)。
key: 令牌,有公鑰(public_key)和私鑰(private_key)通過固定算法加密生成。
2. 加密方式
private_key: 審核通過后,郵件中會提供。private_key僅負責與 public_key 共同合成 key 傳參,私鑰不可見,客戶端與服務端各存儲一份;
public_key: 不包含key在內的完整URL的其他部分(此處appid為完整appid);
key的算法: 說明書中提供的是php中的算法代碼,如下
-
key = base64_encode(hash_hmac('sha1', $public_key, $private_key, TRUE));
key加密后,通過 urlencode 對其編碼后傳參。
這是官方的文件,加密方式是這個文章要探討的重點,官方提供的是php中key的算法,關於IOS下HMAC_SHA1加密算法的網上找了很多也沒找到,最后在stackoverflow里找到了,
這里共享一下。加密算法見這篇博文 IOS下HMAC_SHA1加密算法。
獲取URL代碼如下:
//獲取當前時間 NSDate * senddate = [NSDate date]; NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; [dateformatter setDateFormat:@"YYYYMMddhhmm"]; NSString * timeStr = [dateformatter stringFromDate:senddate]; //你的appid NSString *appid = @"你的appid"; //你的appid前6位 NSString *shortappid = @"你的appid前6位"; //這里是獲取常規預報 type=forecast3d NSString *base = @"http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date="; //生成公鑰時:取完整的 appid NSString *urlAppid = [NSString stringWithFormat:@"%@%@&appid=%@",base,timeStr,appid]; //傳遞參數時:截取 appid 的前 6 位 NSString *urlShortAppid = [NSString stringWithFormat:@"%@%@&appid=%@",base,timeStr,shortappid]; //你的private_key NSString *privateKey = @"你的private_key"; //得到了key NSString *key = [self hmacsha1:urlAppid key:privateKey ]; //IOS的URL中文以及符號轉碼 key = [Utility encodeToPercentEscapeString:key]; //接口的完整URL NSString *endUrl = [NSString stringWithFormat:@"%@&key=%@",urlShortAppid,key];
[self hmacsha1:urlAppid key:privateKey];
+ (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret;
這方法見 : IOS下HMAC_SHA1加密算法。
[Utility encodeToPercentEscapeString:key];
+ (NSString *)encodeToPercentEscapeString: (NSString *) input;
這方法見 : IOS的URL中文以及符號轉碼。
就這樣的得到了完整URL http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date=201409051055&appid=de76d3&key=S017pH00FeX%2FT658bf3DZPThKtg%3D
3. 返回數據
3.1 常規預報: forecast3d
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=forecast3d&date=201409051055&appid=de76d3&key=S017pH00FeX%2FT658bf3DZPThKtg%3D
輸出實例:
{"c":{"c1":"101010100","c2":"beijing","c3":"北京","c4":"beijing","c5":"北京","c6":"beijing","c7":"北京","c8":"china","c9":"中國","c10":"1","c11":"010","c12":"100000","c13":"116.407526","c14":"39.904030","c15":"33","c16":"AZ9010","c17":"+8"},"f":{"f1":[{"fa":"00","fb":"01","fc":"30","fd":"18","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:45|18:40"},{"fa":"01","fb":"02","fc":"29","fd":"19","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:46|18:38"},{"fa":"02","fb":"00","fc":"29","fd":"20","fe":"0","ff":"0","fg":"0","fh":"0","fi":"05:47|18:37"}],"f0":"201409050800"}}
3.2 實況: observe
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=observe&date=201409051101&appid=de76d3&key=Z10wEjVXiTiZKEslx5WJGXV4B%2F4%3D
輸出實例:
{"l":{"l1":"25","l2":"57","l3":"1","l4":"2","l7":"10:50"}}
3.3 指數: index
完整URL http://open.weather.com.cn/data/?areaid=101010100&type=observe&date=201409051101&appid=de76d3&key=Z10wEjVXiTiZKEslx5WJGXV4B%2F4%3D
輸出實例:
{"i":[{"i1":"ct","i2":"穿衣指數","i3":"","i4":"熱","i5":"天氣熱,建議着短裙、短褲、短薄外套、T恤等夏季服裝。"},{"i1":"zs","i2":"中暑指數","i3":"","i4":"無","i5":"溫度不高,其他各項氣象條件適宜,中暑機率極低。","i6":"無","i7":"溫度不高,其他各項氣象條件適宜,中暑機率極低。","i8":"無","i9":"溫度不高,其他各項氣象條件適宜,中暑機率極低。","i10":""}]}
ps:除了國家氣象局的天氣api接口,還有百度的天氣api挺好用的,假如嫌這個api接口麻煩的話,就用百度的吧,直接申請一個key就可以了,不要加密什么的,而且一申請就可以用了,氣象局的要審核一周左右,廢話少說,上鏈接。
百度ak申請地址:http://lbsyun.baidu.com/apiconsole/key
接口說明:http://developer.baidu.com/map/carapi-7.htm