天氣預報接口IOS版OC:SmartWeather API中key的計算方法


  最近在做一個天氣預報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
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM