SmaterWeatherApi---签名加密和数据訪问--简单粗暴一步搞定
-----------------------------------------------------更新-2014-07-09------------------------------------------------------
JAVA(Android)版的实现方法。用于android开发在本地实现生成签名。
import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; import android.util.Log; /** *JAVA版。 *调用方法:String apiUrl=SmartWeatherUrlUtil.getInterfaceURL(城市编号,数据类型); */ public class SmartWeatherUrlUtil { private final static String TAG = "WeatherUrlUtil"; private static final String MAC_NAME = "HmacSHA1"; private static final String ENCODING = "UTF-8"; private static final String appid = "你的appid"; private static final String private_key = "你的private_key"; private static final String url_header="http://open.weather.com.cn/data/?"; /** * 使用 HMAC-SHA1 签名方法对对encryptText进行签名 * * @param url * 被签名的字符串 * @param privatekey * 密钥 * @return * @throws Exception */ private static byte[] HmacSHA1Encrypt(String url, String privatekey) throws Exception { byte[] data = privatekey.getBytes(ENCODING); // 依据给定的字节数组构造一个密钥,第二參数指定一个密钥算法的名称 SecretKey secretKey = new SecretKeySpec(data, MAC_NAME); // 生成一个指定 Mac 算法 的 Mac 对象 Mac mac = Mac.getInstance(MAC_NAME); // 用给定密钥初始化 Mac 对象 mac.init(secretKey); byte[] text = url.getBytes(ENCODING); // 完毕 Mac 操作 return mac.doFinal(text); } /** * 获取URL通过privatekey加密后的码 * @param url * @param privatekey * @return * @throws Exception */ private static String getKey(String url, String privatekey) throws Exception { byte[] key_bytes = HmacSHA1Encrypt(url, privatekey); String base64encoderStr = Base64.encodeToString(key_bytes, Base64.NO_WRAP); return URLEncoder.encode(base64encoderStr, ENCODING); } /** * 获得接口的URL地址 * @param areaid * @param type * @param date * @return * @throws Exception */ private static String getInterfaceURL(String areaid,String type,String date) throws Exception{ String keyurl=url_header+"areaid="+areaid+"&type="+type+"&date="+date+"&appid="; String key=getKey(keyurl+appid,private_key); String appid6 = appid.substring(0, 6); return keyurl+appid6+"&key=" + key; } public static String getInterfaceURL(String areaid,String type){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmm"); String date = dateFormat.format(new Date()); //String type="forecast3d";//"index";//"forecast3d";"observe" try { return getInterfaceURL(areaid,type,date); } catch (Exception e) { Log.e(TAG, e.getMessage(),e.fillInStackTrace()); } return null; } }
----------------------------------------2014-07-04------------------------------------------------------------
使用中国天气网接口真是蛋碎一地
有兴趣的能够去了解一下http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml
年初的时候停用了之前的接口,改为申请使用。于是发个了申请邮件,中间各种曲折。
。
。一万字。
。
总算是申请下来了。只是接口文档啊,看的我累觉不爱,文档上仅仅有php版的kay生成方法,我在androi上使用,那些加密方法不知道用java怎样实现
一怒之下,就写个php版的吧,本来是仅仅想写个生成key的接口的,后来想了想 多写了几行 直接来个一步搞定,省去了client上多步网络操作和字符串拼接
叨叨了半天。直接看效果吧
演示样例:
完整代码:
<?php /*----------这个文件须要传到自己的外网空间,没有的话 能够整个免费的云空间 我用的是魔泊网的 --------------*/ /*----------作用:訪问这个文件 仅仅须要传 type和areaid 这两个參数。就能得直接到 天气数据了/ 不用来来回回的签名拼接等等等一大堆麻烦的东西了--------------*/ //中国天气网SmartWeatherAPI签名接口 //签名生成完直接訪问数据 // 參数type:请求数据类型;areaid: 城市ID //appid $app_id='你自己的appid'; //privatekey $privatekey='你自己的privatekey'; if(isset($_REQUEST['type'])&&isset($_REQUEST['areaid'])){ //接收參数 $type=$_REQUEST['type']; $areaid=$_REQUEST['areaid']; //格式化当前时间yyyyMMddHHmm $date=date('YmdHi', time()); //api请求固定部分 $api_head='http://open.weather.com.cn/data/?
areaid='.$areaid.'&type='.$type.'&date='.$date; //拼接publickey $publickey=$api_head.'&appid='.$app_id; //生成key $sign_key=base64_encode(hash_hmac('sha1',$publickey,$privatekey,true)); //截取appid前6位 $api_url_appid=substr($app_id,0,6); //拼接和urlencode处理终于url $api_url=$api_head.'&appid='.$api_url_appid.'&key='.urlencode($sign_key); //省事省究竟。直接运行 生成的url 訪问数据 echo file_get_contents($api_url); }else{ echo 'error'; } ?
>
相关文章
- 美团二面:加密后的数据如何进行模糊查询??被问懵了。。
- 大数据Kudu(六):Kudu Java Api操作
- FreeBuf 周报 | 2亿推特用户数据被公开;去哪儿又利用大数据杀熟?
- 【C 语言】文件操作 ( 文件加密解密 | 加密解密原理 | 对称加密原理 | 非密钥整数倍长度的数据加密处理 )
- solr导入数据库数据-tinyint数据转boolean详解程序员
- Hadoop之MapReduce详解大数据
- Linux实现安全数据加密(linux数据加密)
- Linux 加密解密:安全护航你的数据(linux加密解密)
- securityMySQL的PBSecurity加密提升数据安全性(mysqlpb)
- 拯救被MySQL删帖的希望:如何恢复数据(mysql恢复删除的数据)
- 中的数据MySQL数据库:查找不到数据(看不到mysql库)
- Oracle数据安全:借助包体加密保护数据(oracle包体加密)
- 机制SQL Server加锁机制:保护数据的必不可少的措施(sqlserver加锁)
- MySQL Aes加密:安全保障你的数据(mysqlaes加密)
- 崩溃恢复昨日MySQL数据崩溃灾难(mysql昨天的数据)
- a类型使用 Oracle 的 bytea 类型存储二进制数据(oraclebyte)
- 处理利用MongoDB加速实现大数据处理(mongodb大数据)
- 利用Oracle触发器实现数据操作自动化(oracle触发器类型)
- Oracle 视图加密实现安全的数据访问(oracle视图加密)
- Redis:高性能缓存和数据存储解决方案(redis是用来干嘛的)
- 掌握Oracle数据库命令行,轻松管理数据!(oracle数据库命令行)
- Top 10 Rows from MySQL A Quick Guide to Retrieving Data(mysql前十条数据)
- MySQL Hash函数:加密保护数据的利器(mysqlhash函数)
- SQL Server加密机制:安全保护您的数据(sqlserver 密匙)
- 使用MSSQL快速有效地遍历表数据(mssql 遍历表数据)
- MySQL 中MD5函数 数据加密和验证的利器(mysql 中md5函数)
- 大数据时代开源缓存架构Redis的力量(开源缓存架构redis)
- Base64加密数据在MySQL中的存储(base64存mysql)
- 探索Redis数据库使用Redis查看这里的秘密(查看redis库数据)
- 把微博数据爬取到Redis中,分析显示相关统计信息(爬去微博数据到redis)
- 算法在Oracle中实现md5算法数据加密(Oracle中有md5)
- Redis实现高效安全的数据加密(redis集成加密码)
- 如何利用Redis避免数据丢失(redis 避免丢数据)
- Oracle SHA3安全加密保护你的数据(oracle sha3)
- python数据加密代码