编程语言如何置入天气预报接口api

天气预报预报接口在网页中应用的多,一般在discuz网站打开后台可以添加,然而编程语言如何实现呢?
可以申请到SmartWeatherAPI天气预报接口的使用权限,开始着手我的实时天气预报系统的开发,主要开发的版本使用的是Python脚本,成果将于近期以系列文章与大家见面。今天在这里我和大家探讨一下SmartWeatherAPI中key的计算方法,并提供C++程序源码供大家参考。
SmartWeatherAPI(简称“SWA接口”)是中国气象局面向网络媒体、手机厂商、第三方气象服务机构等用户,通过web方式提供数据气象服务的官方载体。是国内首个面向个人网站、开发爱好者和服务机构的气象服务API数据开发接口(申请地址戳着里)。申请过程需要填写一个表格,发送到官方邮箱,人工审核通过后会回复邮件,随信提供appid和private_key等信息。

回复邮件部分内容如下(appid和private_key为私密信息,故用红色横线代替):

private_key:
接口使用说明请参考《SmartWeatherAPI_Lite_WebAPI 版产品使用说明书》,区域列表:请见附件areaid_list.xlsx。
该鉴权信息仅限您个人或本公司使用,如有泄露我们将撤销您的使用权限,必要时将追究相关责任。
最后,非常感谢您的参与。

接口说明说在上面所提到的API接口申请的网站可以下载到,下面就起说明书中几个要点做以下说明:

  1. 接口说明

请求方式: http get

接口组成: 由固定 URL 加 5 个不同的参数组成,完整URL需客户端经过固定方式加密后使用。

数据返回: json

完整URL: http://webapi.weather.com.cn/data/?=““&=““&=““&=““&=“.urlencode($key)

输入参数:

areaid: 区域id,审核通过后邮件中有个附件,提供的就是现有的所有区域的id号。

type: 数据类型(实况: observe, 指数: index, 常规预报: forecast3d)。

date: 客户端日期,按照格式yyyyMMddHHmm获取客户端当前时间。

appid: 固定分配的型号标识,审核通过后邮件告知(传递参数时:截取 appid 的前 6 位; 生成公钥时:取完整的 appid)。

key: 令牌,有公钥(public_key)和私钥(private_key)通过固定算法加密生成。

  1. 加密方式

加密算法是今天博客的基础,大家仔细阅读。加密算法中涉及到的三个要素分别为:

private_key: 审核通过后,邮件中会提供。private_key仅负责与 public_key 共同合成 key 传参,私钥不可见,客户端与服务端各存储一份;
public_key: 不包含key在类的完整URL的其他部分(此处appid为完整appid);
key的算法: 说明书中提供的是php中的算法代码,如下
= (hash_hmac(‘sha1‘, , , ));
key加密后,通过 urlencode 对其编码后传参。

举例说明,除去key部分的URL如下:

http://webapi.weather.com.cn/data/?areaid=101010100&type=index&date=201211281030&appid=cf2d61521456sads

私钥private_key假设为: private_key

我们使用上述算法首先计算出加密后的key,得到key之后使用urlencode方法处理我们加密得到的key,结果为:

A%2Fp2QJ4R%2FD3FFCr6XwUCyNP56Y0%3D

则我们最后的输入URL为:

http://webapi.weather.com.cn/data/?areaid=101010100&type=index&date=201211281030&appid=cf2d61&key=A%2Fp2QJ4R%2FD3FFCr6XwUCyNP56Y0%3D

  1. 返回数据

输出实例:

      }

其中:

l1: 表示当前温度(摄氏度);

l2: 表示当前湿度(%);

l3: 表示当前风力(级);

l4: 表示当前风向编号(主页有文献可以查到具体的风向);

l7: 表示实况发布时间。

当前不同的type请求结果是大相径庭的,具体的其他2类的我在这里不一一说明,需要参考官方的文档,这里顺便列举一个type=forecast3d的返回结果:

}
二、 加密过程分析

在动手实现加密方法之前,我在想,首先我应该知道正确的加密结果撒,让我看到正确的返回数据之后再去做这件事情不是更有意义。看官方提供的是php的方法,那我就先用php试一下呗,可我没有安装php阿,总不能因为做个小测试还整个php环境吧,麻烦!幸好有php online帮到我http://writecodeonline.com/php/:

上面实例中的结果就是这么来的:

((hash_hmac(‘sha1‘, “http://webapi.weather.com.cn/data/?areaid=101010100&type=index&date=201211281030&appid=cf2d61521456sads”, “private_key”, )));
当然,实例中的URL是不会返回正确数据的,因为我们用的appid和private_key都是假造的,我在测试的过程使用的是我申请到的相关信息。

结果返回成功了,我们开始分析如何使用C++去实现这个加密过程吧!

  1. 肢解加密过程

一口吃不成一个胖子,我们一步一步来,从最内层开始,从hash_hmac入手,说白了不就是hash过程了,这时候我想到了openssl,是的,就是他了!首先我们在php环境中求出我们这一步的结果再说:

hash_hmac(‘sha1‘, “http://webapi.weather.com.cn/data/?areaid=101010100&type=index&date=201211281030&appid=cf2d61521456sads”, “private_key”, );
结果如下:

[email protected]??=?*?_?????
使用openssl之前,让我们分析以下php中的hash_hmac函数中的几个参数,前三个估计一目了然,最后一个是什么意思呢?函数原型如下:

hash_hmac ( , , [, bool = ] )
最后一个参数raw_output解释为: When set to TRUE, outputs raw binary data. FALSE outputs lowercase hexits.

好了,我们开始用openssl试试,先不着急用C++,先在bash下用command试试:

-n | openssl dgst -sha1 -binary -hmac
看到这里的-binary参数没有,这就是我之前为什么为专门分析hash_hmac最后一个参数的原因,因为我当时就在这里少了-binary参数,导致出来的结果老是对不上。好了,结果表明,和php的结果一致。

继续肢解,开始第二步,base64_encode函数的分析,同样, 先在php中来过:

(hash_hmac(‘sha1‘, “http://webapi.weather.com.cn/data/?areaid=101010100&type=index&date=201211281030&appid=cf2d61521456sads”, “private_key”, ));
结果如下:

A/p2QJ4R/D3FFCr6XwUCyNP56Y0=
我们来看看base64_encode函数的原型:

( )
这个函数,见名知意,就是对数据进行base64编码。在linux下有现成的工具,即base64:

-n | openssl dgst -sha1 -binary -hmac | base64
测试通过,我们开始最后一步,urlencode函数做什么,这个问题在之前一篇文章:http://www.cnblogs.com/berlin-sun/p/translateonline.html 中提到过,其实就是对url重新进行编码,Returns a string in which all non-alphanumeric characters except -_. have been replaced with a percent (%) sign followed by two hex digits and spaces encoded as plus (+) signs.

  1. 具体实现

hmac过程:

include

unsigned * digest = HMAC(EVP_sha1(), key, strlen(key), (unsigned *)weather_api, strlen(weather_api), NULL, NULL);
base64过程:

include

include

base64( unsigned * input, BIO bmem, * BUF_MEM *

 b64 =     bmem =     b64 =       BIO_get_mem_ptr(b64, &
  *buff = ( *)malloc(bptr->     memcpy(buff, bptr->data, bptr->length-     buff[bptr->length-] =

base64Digest = base64(digest, strlen(( )digest));
urlencode过程:

inlcude “curl/

CURL * curl =
*encode_key = curl_easy_escape(curl, base64Digest, );
目前,C++程序就完成了这些,结果已经成功返回,如下图:

感受一下编程世界吧

时间: 2024-12-09 14:13:40

编程语言如何置入天气预报接口api的相关文章

天气预报接口api(中国天气网)

中国天气weather.comhttp://m.weather.com.cn/data/101110101.html(六天预报) http://www.weather.com.cn/data/sk/101110101.html(实时天气信息) 其中101110101是城市的代码,获得城市代码进入 http://www.weather.com.cn在搜索框上输入你要需要获得天气的城市,点击查询,即可在地址栏获得相应城市编号,然后替换http://m.weather.com.cn/data/1011

开源免费天气预报接口API以及全国全部地区代码!!(国家气象局提供)

国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.html http://m.weather.com.cn/data/101010100.html 对于第三个接口,返回信息比較全面,也是以json格式提供,格式例如以下 {"weatherinfo": { //基本信息; "city&quo

开源免费的天气预报接口API以及全国所有地区代码(国家气象局提供)

天气预报一直是各大网站的一个基本功能,最近小编也想在网站上弄一个,得瑟一下,在网络搜索了很久,终于找到了开源免费的天气预报接口API以及全国所有地区代码(国家气象局提供),具体如下: 国家气象局提供的天气预报接口 http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.html http://m.weather.com.cn/data/101010100.

开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供) 【转】

国家气象局提供的天气预报接口 接口地址: http://www.weather.com.cn/data/sk/101010100.html http://www.weather.com.cn/data/cityinfo/101010100.html http://m.weather.com.cn/data/101010100.html 对于第三个接口,返回信息比较全面,也是以json格式提供,格式如下 {"weatherinfo": { //基本信息; "city"

中国天气网-天气预报接口api

中国天气网地址:http://www.weather.com.cn 请求服务 : 查询实时天气信息 http://www.weather.com.cn/data/sk/101110101.html 在浏览器中输入请求地址,获得西安的天气. 其中101110101是城市的代码,如果要查询其他城市的天气,只需要修改城市的代码即可,在中国天气网中城市代码如下: 101010100=北京101010200=海淀101010300=朝阳101010400=顺义101010500=怀柔101010600=通

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx

Atitit 图像处理之编程之类库调用的接口api cli gui ws rest  attilax大总结.docx 1. 为什么需要接口调用??1 1.1. 为了方便集成复用模块类库1 1.2. 嫁接不同的语言与类库,以及嵌入dsl1 1.3. 方便跨机器,跨开发板,跨硬件,跨运行环境的代码复用2 2. 接口api的历史2 2.1. 发展历程2 2.2. API 这个类库默认提供的接口,要求同语言调用一般2 2.3. Cli接口 命令行接口.单机跨语言接口(推荐比较常用)3 2.4. 图形用户

微信开发-微信内置浏览器的Javascript API

源代码来自 http://www.baidufe.com/ /**! * 微信内置浏览器的Javascript API,功能包括: * * 1.分享到微信朋友圈 * 2.分享给微信好友 * 3.分享到腾讯微博 * 4.隐藏/显示右上角的菜单入口 * 5.隐藏/显示底部浏览器工具栏 * 6.获取当前的网络状态 * 7.调起微信客户端的图片播放组件 * 8.关闭公众平台Web页面 * 9.判断当前网页是否在微信内置浏览器中打开 * 10.支持WeixinApi的错误监控 * 11.发送电子邮件 *

C#调用国家气象局天气预报接口

原文:C#调用国家气象局天气预报接口 一.需求 最近,刚好项目中有天气预报查询功能的需求,要求录入城市名称,获取该城市今日天气信息及相关气象生活辅助信息等. 例如:查询北京市天气 结果为: 今日北京天气:15℃~5℃ 阵雨转阴,北风3-4级,天气冷,建议着棉服.羽绒服.皮夹克加羊毛衫等冬季服装.年老体弱者宜着厚棉衣.冬大衣 或厚羽绒服. 洗车指数:不宜.紫外线指数:最弱.晨练指数:较不宜.舒适指数:较舒适. 还好,国家气象局提供相关接口,再此表示感谢,虽然个人觉得该api设计思路有待提高,但是相

微信内置浏览器的Javascript API

/**! * 微信内置浏览器的Javascript API,功能包括: * * 1.分享到微信朋友圈 * 2.分享给微信好友 * 3.分享到腾讯微博 * 4.隐藏/显示右上角的菜单入口 * 5.隐藏/显示底部浏览器工具栏 * 6.获取当前的网络状态 * 7.调起微信客户端的图片播放组件 *   */ var WeixinApi = (function () { /* 这里省略了一堆代码……下面直接看调用接口 */ return { ready           :wxJsBridgeReady