天气预报接口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
 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。