• 天气预报接口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
     
  • 相关阅读:
    Educational Codeforces Round 15 C. Cellular Network(二分)
    HDU 1044 Collect More Jewels(BFS+DFS)
    NBOJv2 Problem 1009 蛤玮的魔法(二分)
    HDU 1016 Prime Ring Problem(经典DFS+回溯)
    HDU 2181 哈密顿绕行世界问题(经典DFS+回溯)
    OpenCV学习笔记——滑动条开关
    廖雪峰Java15JDBC编程-3JDBC接口-3JDBC更新
    廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介
    廖雪峰Java15JDBC编程-2SQL入门-2insert/select/update/delete
    廖雪峰Java15JDBC编程-2SQL入门-1SQL介绍
  • 原文地址:https://www.cnblogs.com/zyfblog/p/3957687.html
Copyright © 2020-2023  润新知