zoukankan      html  css  js  c++  java
  • 天气预报接口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
     
  • 相关阅读:
    北京燃气IC卡充值笔记
    随机分析、随机控制等科目在量化投资、计算金融方向有哪些应用?
    量化交易平台大全
    Doctor of Philosophy in Computational and Mathematical Engineering
    Institute for Computational and Mathematical Engineering
    Requirements for the Master of Science in Computational and Mathematical Engineering
    MSc in Mathematical and Computational Finance
    万字长文:详解多智能体强化学习的基础和应用
    数据处理思想和程序架构: 使用Mbedtls包中的SSL,和服务器进行网络加密通信
    31-STM32+W5500+AIR202/302基本控制篇-功能优化-W5500移植mbedtls库以SSL方式连接MQTT服务器(单向忽略认证)
  • 原文地址:https://www.cnblogs.com/zyfblog/p/3957687.html
Copyright © 2011-2022 走看看