中国气象局面向网络媒体、手机厂商、第三方气象服务机构等用户,通过 web 方式提供数据气象服务的官方载体。

在一周前已经申请到appid,但是苦于没有C#版的key 的算法,一直验证不通过,经过几天查询资料,现在提供一份C#版的HMAC-SHA1的加密算法

比较简单,分项给大家,大家可以参考一下。

 string GetKey(string appid, string privateKey, string areaId, string date, string type)
{
//使用SHA1的HMAC HMAC hmac = HMACSHA1.Create();
var publicKey = "http://webapi.weather.com.cn/data/?areaid={0}&type={1}&date={2}&appid={3}";
var data = System.Text.Encoding.UTF8.GetBytes(string.Format(publicKey, areaId, type, date, appid));
//密钥
var key = System.Text.Encoding.UTF8.GetBytes(privateKey);
hmac.Key = key; //对数据进行签名
var signedData = hmac.ComputeHash(data);
return Convert.ToBase64String(signedData); }

类型和接口已经修改,请看最新的代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
//项目添加System.Runtime.Serialization引用
using System.Runtime.Serialization.Json;
using System.Security.Cryptography;
using System.Web; namespace MvcApplication1
{
public class Weather
{
//天气编码对应表
private Dictionary<string, string> weatherInfo = new Dictionary<string, string>();
//风力编码对应表
private Dictionary<string, string> WindInfo = new Dictionary<string, string>();
//风力方向对应表
private Dictionary<string, string> WindInfoDir = new Dictionary<string, string>(); private DataContractJsonSerializer ser;
private byte[] buff = new byte[ * ]; public Weather()
{
#region 初始化编码表
weatherInfo.Add("", "晴");
weatherInfo.Add("", "多云");
weatherInfo.Add("", "阴");
weatherInfo.Add("", "阵雨");
weatherInfo.Add("", "雷阵雨");
weatherInfo.Add("", "雷阵雨伴有冰雹");
weatherInfo.Add("", "雨夹雪");
weatherInfo.Add("", "小雨");
weatherInfo.Add("", "中雨");
weatherInfo.Add("", "大雨");
weatherInfo.Add("", "暴雨");
weatherInfo.Add("", "大暴雨");
weatherInfo.Add("", "特大暴雨");
weatherInfo.Add("", "阵雪");
weatherInfo.Add("", "小雪");
weatherInfo.Add("", "中雪");
weatherInfo.Add("", "大雪");
weatherInfo.Add("", "暴雪");
weatherInfo.Add("", "雾");
weatherInfo.Add("", "冻雨");
weatherInfo.Add("", "沙尘暴");
weatherInfo.Add("", "小到中雨");
weatherInfo.Add("", "中到大雨");
weatherInfo.Add("", "大到暴雨");
weatherInfo.Add("", "暴雨到大暴雨");
weatherInfo.Add("", "大暴雨到特大暴雨");
weatherInfo.Add("", "小到中雪");
weatherInfo.Add("", "中到大雪");
weatherInfo.Add("", "大到暴雪");
weatherInfo.Add("", "浮尘");
weatherInfo.Add("", "扬沙");
weatherInfo.Add("", "强沙尘暴");
weatherInfo.Add("", "雾霾");
weatherInfo.Add("", "无"); WindInfoDir.Add("", "无持续风向");
WindInfoDir.Add("", "东北风");
WindInfoDir.Add("", "东风");
WindInfoDir.Add("", "东南风");
WindInfoDir.Add("", "南风");
WindInfoDir.Add("", "西南风");
WindInfoDir.Add("", "西风");
WindInfoDir.Add("", "西北风");
WindInfoDir.Add("", "北风");
WindInfoDir.Add("", "旋转风"); WindInfo.Add("", "微风");
WindInfo.Add("", "3-4级");
WindInfo.Add("", "4-5级");
WindInfo.Add("", "5-6级");
WindInfo.Add("", "6-7级");
WindInfo.Add("", "7-8级");
WindInfo.Add("", "8-9级");
WindInfo.Add("", "9-10级");
WindInfo.Add("", "10-11级");
WindInfo.Add("", "11-12级");
#endregion ser = new DataContractJsonSerializer(typeof(WeatherJson));
} public void RefreshWeather()
{
bool update = false;
//string baseurl = "";
string baseurl = "http://open.weather.com.cn/data/?areaid={0}&type={1}&date={2}&appid={3}"; var cityCode = "";
//指数:index_f(基础接口);index_v(常规接口) 3天预报:forecast_f(基础接口);forecast_v(常规接口)
var weatherType = "forecast_f";
var appID = "appID";
var private_key = "private_key"; string url = GetSmartWeatherApi(baseurl, cityCode, weatherType, DateTime.Now.ToString("yyyyMMddHHmm"), appID, private_key);
int l = ;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4";
//从指定的URL中获取天气信息(JSON数据)
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream rs = response.GetResponseStream();
l = rs.Read(buff, , buff.Length);
rs.Close();
}
catch (Exception ex)
{
//网络连接失败;
}
//反序列化为实体
var mStream = new MemoryStream(buff, , l);
WeatherJson w;
try
{
w = (WeatherJson)ser.ReadObject(mStream);
if (w != null)
{
foreach (var item in w.f.f1)
{
item.fa_des = weatherInfo.ContainsKey(item.fa) ? weatherInfo[item.fa] : string.Empty;
item.fb_des = weatherInfo.ContainsKey(item.fb) ? weatherInfo[item.fb] : string.Empty;
item.fe_des = WindInfoDir.ContainsKey(item.fe) ? WindInfoDir[item.fe] : string.Empty;
item.ff_des = WindInfoDir.ContainsKey(item.ff) ? WindInfoDir[item.ff] : string.Empty;
item.fg_des = WindInfo.ContainsKey(item.fg) ? WindInfo[item.fg] : string.Empty;
item.fh_des = WindInfo.ContainsKey(item.fh) ? WindInfo[item.fh] : string.Empty;
}
}
}
catch (System.Runtime.Serialization.SerializationException)
{
//反序列化失败
throw;
} //获取天气预报
foreach (var item in w.f.f1)
{
string weather = (item.fa == item.fb) ? item.fa_des : item.fa_des + "转" + item.fb_des;
string temperature = item.fc + "℃ ~ " + item.fd + "℃";
string wind = item.fg == "" ? item.fg_des : item.fe_des + " " + item.fg_des;
}
} private string GetSmartWeatherApi(string _baseUrl, string _areaId, string _type, string _date, string _appID, string _privateKey)
{
string publicKey = string.Format(_baseUrl, _areaId, _type, _date, _appID);
string fullUrl = string.Format(_baseUrl, _areaId, _type, _date, _appID.Substring(, ));
fullUrl = string.Format("{0}&key={1}", fullUrl, GetSmartWeatherKeyCode(publicKey, _privateKey));
return fullUrl;
}
private string GetSmartWeatherKeyCode(string _publicKey, string _privateKey)
{
//使用SHA1的HMAC
HMAC hmac = HMACSHA1.Create();
Byte[] data = System.Text.Encoding.UTF8.GetBytes(_publicKey);
//密钥
Byte[] key = System.Text.Encoding.UTF8.GetBytes(_privateKey);
hmac.Key = key; //对数据进行签名
var signedData = hmac.ComputeHash(data);
string keyCode = Convert.ToBase64String(signedData);
keyCode = System.Web.HttpUtility.UrlEncode(keyCode);
return keyCode;
} } #region 天气实体类,用于获取气象局json数据反序列化
public class WeatherJson
{
/// <summary>
/// 城市
/// </summary>
public WeatherC c { get; set; }
/// <summary>
/// 预报
/// </summary>
public WeatherF f { get; set; }
/// <summary>
/// 实况
/// </summary>
public WeatherL l { get; set; }
/// <summary>
/// 指数
/// </summary>
public WeatherI i { get; set; }
}
/// <summary>
/// 实况,type=observe
/// 示例:
/// "l":{
/// "l1":8"
/// "l2":"38"
/// "l3":"6"
/// "l4":"3"
/// "l7":"11:00"
/// }
/// </summary>
public class WeatherL
{
/// <summary>
/// 当前温度(摄氏度)
/// </summary>
public string l1 { get; set; }
/// <summary>
/// 当前湿度(单位%)
/// </summary>
public string l2 { get; set; }
/// <summary>
/// 当前风力(单位是级,无需根据风力编码表取值,直接显示即可)
/// </summary>
public string l3 { get; set; }
/// <summary>
/// 当前风向编号
/// </summary>
public string l4 { get; set; }
/// <summary>
/// 实况发布时间
/// </summary>
public string l7 { get; set; }
}
/// <summary>
/// 指数,type=index
/// 示例:
/// "i":[
/// {
/// "i1":"ct",
/// "i2":"穿衣指数",
/// "i3":"" ,
/// "i4":"热”,
/// "i5":"天气热,建议着短裙、短裤、短薄外套、T 恤等夏季服装。"
/// },
/// ]
/// </summary>
public class WeatherI
{
/// <summary>
/// 指数简称
/// </summary>
public string i1 { get; set; }
/// <summary>
/// 指数中文名称
/// </summary>
public string i2 { get; set; }
/// <summary>
/// 指数中文别名
/// </summary>
public string i3 { get; set; }
/// <summary>
/// 指数级别
/// </summary>
public string i4 { get; set; }
/// <summary>
/// 指数内容
/// </summary>
public string i7 { get; set; }
}
/// <summary>
/// 预报,城市信息,type=forecast3d
/// </summary>
public class WeatherC
{
/// <summary>
/// 区域 ID
/// </summary>
public string c1 { get; set; }
/// <summary>
/// 城市英文名
/// </summary>
public string c2 { get; set; }
/// <summary>
/// 城市英文名
/// </summary>
public string c3 { get; set; }
/// <summary>
/// 城市所在市英文名
/// </summary>
public string c4 { get; set; }
/// <summary>
/// 城市所在市中文名
/// </summary>
public string c5 { get; set; }
/// <summary>
/// 城市所在省英文名
/// </summary>
public string c6 { get; set; }
/// <summary>
/// 城市所在省中文名
/// </summary>
public string c7 { get; set; }
/// <summary>
/// 城市所在国家英文名
/// </summary>
public string c8 { get; set; }
/// <summary>
/// 城市所在国家中文名
/// </summary>
public string c9 { get; set; }
/// <summary>
/// 城市级别
/// </summary>
public string c10 { get; set; }
/// <summary>
/// 城市区号
/// </summary>
public string c11 { get; set; }
/// <summary>
/// 城市区号
/// </summary>
public string c12 { get; set; }
/// <summary>
/// 经度
/// </summary>
public string c13 { get; set; }
/// <summary>
/// 纬度
/// </summary>
public string c14 { get; set; }
/// <summary>
/// 海拔
/// </summary>
public string c15 { get; set; }
/// <summary>
/// 雷达站号
/// </summary>
public string c16 { get; set; }
}
/// <summary>
/// 预报,type=forecast3d
/// </summary>
public class WeatherF
{
/// <summary>
/// 预报发布时间
/// </summary>
public string f0 { get; set; }
/// <summary>
/// 3天的天气预报
/// </summary>
public WeatherF1[] f1 { get; set; }
}
public class WeatherF1
{
/// <summary>
/// 白天天气现象编号
/// </summary>
public string fa { get; set; }
public string fa_des { get; set; }
/// <summary>
/// 晚上天气现象编号
/// </summary>
public string fb { get; set; }
public string fb_des { get; set; }
/// <summary>
/// 白天天气温度(摄氏度)
/// </summary>
public string fc { get; set; }
/// <summary>
/// 晚上天气温度(摄氏度)
/// </summary>
public string fd { get; set; }
/// <summary>
/// 白天风向编号
/// </summary>
public string fe { get; set; }
public string fe_des { get; set; }
/// <summary>
/// 晚上风向编号
/// </summary>
public string ff { get; set; }
public string ff_des { get; set; }
/// <summary>
/// 白天风力编号
/// </summary>
public string fg { get; set; }
public string fg_des { get; set; }
/// <summary>
/// 晚上风力编号
/// </summary>
public string fh { get; set; }
public string fh_des { get; set; }
/// <summary>
/// 日出日落时间(中间用|分割)
/// </summary>
public string fi { get; set; }
}
#endregion
}

SmartWeatherAPI_Lite_WebAPI C# 获取key加密的更多相关文章

  1. 关于m3u8格式的视频文件ts转mp4下载和key加密问题

    一,利用网站浏览器F12键,利用谷歌浏览器插件找到视频的.m3u8文件,并打开. 二,打开m3u8文件后,里面有很多.ts的链接,和key的链接. 三,保存为html文件,下载ts文件,代码如下:可加 ...

  2. 关于HashMap根据Value获取Key

    关于我对java中集合的总结有如下三篇: 关于JDK中的集合总结(一) 关于JDK中的集合总结(二) 关于JDK中的集合总结(三) 关于数组集合之间的转换 Map中是一个key有且只有一个value. ...

  3. java map遍历、排序,根据value获取key

    Map 四种遍历: Map<String,String> map = new HashMap<String, String>(); map.put("one" ...

  4. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...

  5. php array 根据value获取key,in_array()判断是否在数组内实例

    php array 根据value获取key,in_array()判断是否在数组内实例 <?php header("Content-type: text/html; charset=u ...

  6. Java Map获取key和value 以及String字符串转List方法

    一.问题描述 这里描述两个问题: 1.Java Map获取key和value的方法: 2.String字符串转List的方法: 二.解决方法 1.Java Map获取key和value的方法   2. ...

  7. PHP JSON文件解析并获取key、value,判断key是否存在

    /****************************************************************************** * PHP JSON文件解析并获取key ...

  8. com.alibaba.fastjson和org.json遍历获取key

    推荐都是用fastjson.org.json好像不支持序列化. com.alibaba.fastjson遍历获取key的方法: //fastjson解析方法 for (Map.Entry<Str ...

  9. Map四种获取key和value值的方法,以及对map中的元素排序(转)

    获取map的值主要有四种方法,这四种方法又分为两类,一类是调用map.keySet()方法来获取key和value的值,另一类则是通过map.entrySet()方法来取值,两者的区别在于,前者主要是 ...

随机推荐

  1. CDOJ 1259 昊昊爱运动 II 线段树+bitset

    昊昊爱运动 II 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r ...

  2. java连接access数据库

    完整代码: package odbcj; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prep ...

  3. Java笔记——equals和==的区别

    摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...

  4. wordpress学习二:源码目录结构和启动流程

    wordpress安装后的文件目录如下: 其中的主要目录和文件用途介绍如下: wp-admin:用于进行博客后台设置的功能目录 wp-content: wordpress的 主题,插件和本地化的存储目 ...

  5. jQuery RemoveAttr(checked)之后再Attr(checked)属性无效果的原因分析

    jQuery中attr()和prop()在修改checked属性时的区别 投稿:whsnow 字体:[增加 减小] 类型:转载   使用语句$.attr('checked',true),将复选框的属性 ...

  6. xcode解决问题dyld: Library not loaded

    一.问题 编译通过,联机调试时,应用启动闪退,XCODE的Output出现提示: dyld: Library not loaded: /System/Library/Frameworks/AdSupp ...

  7. dojo 资源库

    文档 :http://wenku.baidu.com/link?url=Nnek_tAjIC-Q3t3e9zHQmsh4LhU3f0ncC1QH8WD_U9-I8-fJ7mMisscFpgfuS8nU ...

  8. Ubuntu下eclipse的Extjs提示插件安装

    使用eclipse编写extjs时,一定会用到spket这个插件,spket可以单独当作ide使用,也可以当作eclipse插件使用,我这里是当作eclipse的插件使用的,下面来一步步图解说明如何配 ...

  9. SpringMVC上传文件以流方式判断类型附常用类型

    // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 package com.tg.common.other; import com.tg.common.tginterface.TG ...

  10. MySQL工具:管理员必备的10款MySQL工具

    MySQL是一个复杂的的系统,需要许多工具来修复,诊断和优化它.幸运的是,对于管理员,MySQL已经吸引了很多软件开发商推出高品质的开源工具来解决MySQL的系统的复杂性,性能和稳定性,其中大部分是免 ...