您的位置:首页 > 编程语言 > Python开发

用python获取气象数据开放平台信息

2015-10-24 11:45 633 查看

缘由

前端时间在练手做一个Android天气预报的App,然后就去找现有的公共API,发现找到的大部分的网址都是

失效的,最后发现了 聚合数据气象数据开放平台

由于感觉后者的操作优点麻烦,所以选择了使用前者。

现在呢,就是想试试后者。

介绍

气象数据平台 是由中国天气网提供的,需要注册+实名验证

才能够使用,而且好像现在都还是能够免费购买一年的使用,提供了

* 基础气象数据接口: 包含国内369个地级市未来3天常规预报以及三个气象指数(穿衣指数,舒适度指数,晨练指数)等天气服务数据。

* 常规气象数据接口: 包含国内全站2566个县级以上城市未来3天常规预报以及三个气象指数(穿衣指数,舒适度指数,晨练指数)等天气服务数据。

但是调用起来还是比较麻烦的。

使用说明

调用规范 规范用于指导三方合作伙伴合理调用指数、3天常规预报(24小时)预报服务数据。

请求方式:http get

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

数据返回:json

完整的URL: http://open.weather.com.cn/data/?areaid=“”&type=”“&date=”“&appid=”“&key=”.urlencode($key);

固定URL:http://open.weather.com.cn/data/

参数名称参数含义参数样例
Areaid区域id单区域:101010100;多区域:101010100|101010200
Type数据类型指数:index_f(基础接口);index_v(常规接口); 3天预报:forecast_f(基础接口);forecast_v(常规接口);
Date客户端日期按照格式yyyyMMddHHmm获取客户端当前时间
Appid固定分配的型号标识某某:004906671841487 传递参数时:截取appid的前6位 生成公钥时:取完整的appid
Key令牌由公钥(public_key)和私钥(private_key)通过固定算法加密生成
加密方式:

private_key

某某:793ffb_SmartWeatherAPI_662cbc7

private_key仅负责与public_key共同合成key传参,私钥不可见,客户端与服务端各存储一份;

public_key为不包含key在内的完整URL其它部分(此处appid为完整appid)

示例:

http://open.weather.com.cn/data/?areaid=101010100&type=index_f&date=201410230335&appid=22290667181111

key的算法

key=base64_encode(hash_hmac(‘sha1’,publickey,private_key,TRUE));

key加密后通过urlencode对其编码后传参

注:每一个产品使用用户分配一个唯一标识appid,用于统计用户访问情况、区分用户提供差异服务,终端用户按照终端型号分配,一个型号对应一个标识。

示例代码

示例这里我只看了php的代码

:::PHP
<!--?php
set_time_limit(0);
$private_key = 'xx';
$appid='xx';
$appid_six=substr($appid,0,6);
$areaid = '101010100';
$type='forecast_v';
$date=date("YmdHi");
$public_key="http://open.weather.com.cn/data/?areaid=".$areaid."&type=".$type."&date=".$date."&appid=".$appid;
$key = base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE));

$URL="http://open.weather.com.cn/data/?areaid=".$areaid."&type=".$type."&date=".$date."&appid=".$appid_six."&key=".urlencode($key);
echo $URL."<br /-->";

$string=file_get_contents($URL);

echo $string;

?>


使用python转化上诉代码

其中前面的转化成python代码都很容易,遇到困难的是Key加密那里

$key = base64_encode(hash_hmac('sha1',$public_key,$private_key,TRUE));


我查找了很多资料才知道加密的方法,原因是对加密函数这一块不是很熟悉。

转发的方法为

// PHP版
// HMAC-SHA1加密
$hmac_sha1_str = base64_encode(hash_hmac("sha1", $string_to_sign, $secret_access_key));

# Python版:
import hmac
import hashlib
import base64
hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()


所以最终的代码为

import urllib
import datetime
import base64
import hmac
import hashlib

private_key = 'XXXXXX_SmartWeatherAPI_XXXXXX' #你申请的private_key
appid = 'XXXXXX' # 你申请的appid
appid_six = appid[:6]
area_id = '101010100' # 区域代码
type_ = 'forecast_v' # 接口类型
date = datetime.datetime.now().strftime("%Y%m%d%H%M") # 日期时间
public_key = "http://open.weather.com.cn/data/?areaid=" + area_id + "&type=" + type_ +"&date=" + date + "&appid=" + appid
key = urllib.quote(
hmac.new(private_key, public_key, hashlib.sha1).digest().encode('base64').rstrip()
)
url = "http://open.weather.com.cn/data/?areaid=" + area_id + "&type=" + type_ + "&date=" + date + "&appid=" + appid_six + "&key=" + key
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息