[www.avtt2014.info-03-24 03:48:23.017] DebugFlymeWeather : loadCurrentWeatherInfo cityNam

您正在使用IE低版浏览器,为了您的IThao123账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自/yank/p/3409308.html
微信公众账号开发教程(三) 实例入门:机器人(附源码) ——转自/yank/p/3409308.html
一、功能介绍
通过微信公众平台实现在线客服机器人功能。主要的功能包括:简单对话、查询天气等服务。
这里只是提供比较简单的功能,重在通过此实例来说明公众平台的具体研发过程。只是一个简单DEMO,如果需要的话可以在此基础上进行扩展。
当然后续我们还会推出比较复杂的应用实例。&
二、具体实现
1、提供访问接口
这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建/yank/p/3392394.html
2、签名认证和分发请求
这里不再赘述,参照上一章,微信公众账号开发教程(二) 基础框架搭建/yank/p/3392394.html
3、处理请求,并响应
当微信用户关注公众账号时,可以给其适当的提示。可以是欢迎词,可以是帮助提示。
直接上代码:
class EventHandler : IHandler
/// &summary&
/// 请求的xml
/// &/summary&
private string RequestXml { get; set; }
/// &summary&
/// 构造函数
/// &/summary&
/// &param name="requestXml"&&/param&
public EventHandler(string requestXml)
this.RequestXml = requestX
/// &summary&
/// 处理请求
/// &/summary&
/// &returns&&/returns&
public string HandleRequest()
string response = string.E
EventMessage em = EventMessage.LoadFromXml(RequestXml);
if (em.Event.Equals("subscribe",StringComparison.OrdinalIgnoreCase))
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!nn";
response = tm.GenerateContent();
简单的交流问候,比如你好、帮助等等,跟我们使用微信聊天一样,不过回应是由我们的程序响应。具体功能,可以根据自己的需要进行添加。微信本来就是沟通的平台。这个案例,可以用于在线服务机器人,类似于淘宝的客服机器人,可是我们这个是微信版的。呵呵其实,很简单,获取请求消息,根据关键字来匹配回应。当然这里可能要做的工作很多,如何支持智能匹配,如何支持模糊匹配等。
代码如下:
/// &summary&
/// 文本信息处理类
/// &/summary&
public class TextHandler : IHandler
/// &summary&
/// 请求的XML
/// &/summary&
private string RequestXml { get; set; }
/// &summary&
/// 构造函数
/// &/summary&
/// &param name="requestXml"&请求的xml&/param&
public TextHandler(string requestXml)
this.RequestXml = requestX
/// &summary&
/// 处理请求
/// &/summary&
/// &returns&&/returns&
public string HandleRequest()
string response = string.E
TextMessage tm = TextMessage.LoadFromXml(RequestXml);
string content = tm.Content.Trim();
if (string.IsNullOrEmpty(content))
response = "您什么都没输入,没法帮您啊,%&_&%。";
if (content.StartsWith("tq", StringComparison.OrdinalIgnoreCase))
string cityName = content.Substring(2).Trim();
response = WeatherHelper.GetWeather(cityName);
response = HandleOther(content);
tm.Content =
//进行发送者、接收者转换
string temp = tm.ToUserN
tm.ToUserName = tm.FromUserN
tm.FromUserName =
response = tm.GenerateContent();
/// &summary&
/// 处理其他消息
/// &/summary&
/// &param name="tm"&&/param&
/// &returns&&/returns&
private string HandleOther(string requestContent)
string response = string.E
if (requestContent.Contains("你好") || requestContent.Contains("您好"))
response = "您也好~";
else if (requestContent.Contains("傻"))
response = "我不傻!哼~ ";
else if (requestContent.Contains("逼") || requestContent.Contains("操"))
response = "哼,你说脏话! ";
else if (requestContent.Contains("是谁"))
response = "我是大哥大,有什么能帮您的吗?~";
else if (requestContent.Contains("再见"))
response = "再见!";
else if (requestContent.Contains("bye"))
response = "Bye!";
else if (requestContent.Contains("谢谢"))
response = "不客气!嘿嘿";
else if (requestContent == "h" || requestContent == "H" || requestContent.Contains("帮助"))
response = @"查询天气,输入tq 城市名称拼音首字母";
response = "您说的,可惜,我没明白啊,试试其他关键字吧。";
3)查询天气
这个功能需要请求实时查询的,请求官方的天气发布网站,然后解析其返回值,按照我们需要的格式,组织天气信息,最后发送给微信客户。采用文本消息方式处理。用户请求,只需输入:tq 城市名称/拼音/首字母,即可获取消息。
回复的消息:(以北京为例)
今天:(17℃~4℃)晴北风4-5级转3-4级4-5级转3-4级
24小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
明天:(14℃~3℃)晴转多云微风小于3级
48小时穿衣指数:天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。
来看源码吧:
class WeatherHelper
/// &summary&
/// 城市集合字段
/// &/summary&
private static Dictionary&string, City& mC
/// &summary&
/// 城市集合
/// &/summary&
public static Dictionary&string, City& Cities
if (mCities == null)
LoadCities();
/// &summary&
/// 加载城市
/// &/summary&
private static void LoadCities()
mCities = new Dictionary&string, City&();
mCities.Clear();
mCities.Add("", new City() { Code = "", Name = "北京", PinYin = "beijing", FristLetter = "bj" });
mCities.Add("", new City() { Code = "", Name = "上海", PinYin = "shanghai", FristLetter = "sh" });
mCities.Add("", new City() { Code = "", Name = "武汉", PinYin = "wuhai", FristLetter = "wh" });
/// &summary&
/// 获取城市的天气
/// &/summary&
/// &param name="name"&城市名称、拼音或首字母&/param&
/// &returns&&/returns&
public static string GetWeather(string name)
string result = string.E
string cityCode = string.E
//获取城市编码
IEnumerable&string& codes = from item in Cities
where item.Value != null
&& (item.Value.Name.Equals(name, StringComparison.OrdinalIgnoreCase)
|| item.Value.PinYin.Equals(name, StringComparison.OrdinalIgnoreCase)
|| item.Value.FristLetter.Equals(name, StringComparison.OrdinalIgnoreCase))
select item.Value.C
if (codes != null && codes.Count() & 0)
cityCode = codes.First&string&();
//http请求,获取天气
if (!string.IsNullOrEmpty(cityCode))
string url = ".cn/data/{0}.html";
url = string.Format(url, cityCode);
WebRequest request = HttpWebRequest.Create(url);
//超时时间为:2秒
request.Timeout = 2000;
request.Credentials = CredentialCache.DefaultC
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string weahterInfo = reader.ReadToEnd();
if (string.IsNullOrEmpty(weahterInfo))
result = "暂时没有取到天气数据,请稍后再试";
XmlDocument doc = JsonConvert.DeserializeXmlNode(weahterInfo);
if (doc != null)
XmlNode node = doc.DocumentE
if (node != null)
StringBuilder builder = new StringBuilder();
builder.Append(node["city"].InnerText).Append("n");
builder.Append(node["date_y"].InnerText).Append(" ").Append(node["week"].InnerText).Append("n");
builder.Append("今天:").Append("(").Append(node["temp1"].InnerText).Append(")").Append(node["weather1"].InnerText).Append(node["wind1"].InnerText).Append(node["fl1"].InnerText).Append("n");
builder.Append("24小时穿衣指数:").Append(node["index_d"].InnerText).Append("n");
builder.Append("明天:").Append("(").Append(node["temp2"].InnerText).Append(")").Append(node["weather2"].InnerText).Append(node["wind2"].InnerText).Append(node["fl2"].InnerText).Append("n");
builder.Append("48小时穿衣指数:").Append(node["index48_d"].InnerText).Append("n");
result = builder.ToString();
#region 天气json数据格式
"weatherinfo": {
"city": "北京",
"city_en": "beijing",
"date_y": "日",
"date": "",
"week": "星期一",
"fchh": "11",
"cityid": "",
"temp1": "17℃~5℃",
"temp2": "16℃~5℃",
"temp3": "18℃~4℃",
"temp4": "17℃~5℃",
"temp5": "14℃~6℃",
"temp6": "14℃~2℃",
"tempF1": "62.6℉~41℉",
"tempF2": "60.8℉~41℉",
"tempF3": "64.4℉~39.2℉",
"tempF4": "62.6℉~41℉",
"tempF5": "57.2℉~42.8℉",
"tempF6": "57.2℉~35.6℉",
"weather1": "晴转多云",
"weather2": "多云",
"weather3": "多云转晴",
"weather4": "晴转多云",
"weather5": "多云转阴",
"weather6": "阴转晴",
"img1": "0",
"img2": "1",
"img3": "1",
"img4": "99",
"img5": "1",
"img6": "0",
"img7": "0",
"img8": "1",
"img9": "1",
"img10": "2",
"img11": "2",
"img12": "0",
"img_single": "0",
"img_title1": "晴",
"img_title2": "多云",
"img_title3": "多云",
"img_title4": "多云",
"img_title5": "多云",
"img_title6": "晴",
"img_title7": "晴",
"img_title8": "多云",
"img_title9": "多云",
"img_title10": "阴",
"img_title11": "阴",
"img_title12": "晴",
"img_title_single": "晴",
"wind1": "微风",
"wind2": "微风",
"wind3": "微风",
"wind4": "微风",
"wind5": "微风",
"wind6": "北风4-5级",
"fx1": "微风",
"fx2": "微风",
"fl1": "小于3级",
"fl2": "小于3级",
"fl3": "小于3级",
"fl4": "小于3级",
"fl5": "小于3级",
"fl6": "4-5级",
"index": "较冷",
"index_d": "建议着大衣、呢外套加毛衣、卫衣等服装。体弱者宜着厚外套、厚毛衣。因昼夜温差较大,注意增减衣服。",
"index48": "冷",
"index48_d": "天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。",
"index_uv": "中等",
"index48_uv": "弱",
"index_xc": "适宜",
"index_tr": "适宜",
"index_co": "舒适",
"st1": "17",
"st2": "5",
"st3": "17",
"st4": "5",
"st5": "18",
"st6": "6",
"index_cl": "适宜",
"index_ls": "适宜",
"index_ag": "极不易发"
#endregion
result = "没有获取到该城市的天气,请确定输入了正确的城市名称,如'北京'或者'beijing'或者'bj'";
/// &summary&
/// 内部类:城市
/// &/summary&
internal class City
/// &summary&
/// &/summary&
public string Code { get; set; }
/// &summary&
/// &/summary&
public string Name { get; set; }
/// &summary&
/// &/summary&
public string PinYin { get; set; }
/// &summary&
/// 拼音首字母
/// &/summary&
public string FristLetter { get; set; }
这里可是可执行的代码哦。应大家的需求,这里提供全部的源代码。
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊您正在使用IE低版浏览器,为了您的IThao123账号安全和更好的产品体验,强烈建议使用更快更安全的浏览器
iOS三种Json方法解析国家气象局API
iOS三种Json方法解析国家气象局API
国家气象局提供的天气预报接口
接口地址有三个:
http://.cn/data/sk/.html
http://.cn/data/cityinfo/.html
http://.cn/data/.html
第三接口信息较为详细,提供的是6天的天气,关于API所返回的信息请见开源免费天气预报接口API以及全国所有地区代码!!(国家气象局提供),全国各城市对应这一个id号,根据改变id好我们就可以解析出来各个城市对应天气;
Json以其轻巧简单成为较为流行文件格式,在手机上传输比XML快,iOS5以前苹果公司并没有对Json解析提供库文件支持,但是好在有一些大牛们专门为Objective-c只做了能够解析Json文件的库,iOS苹果公司提供了对json的原生支持类NSJSONSerialization;本文将介绍TouchJson
SBJson 和iOS5所支持的原生的json方法,解析国家气象局API,TouchJson和SBJson需要下载他们的库&
TouchJson &http://download.csdn.net/detail/duxinfeng
SBJson& & &http://download.csdn.net/detail/duxinfeng
1.创建一个新工程叫JsonThreeDemo; File-&New-&Project
-&single View Application -& next,注意不使用ARC,不要勾选Use Automatic Refrence Counting,否则运行时候库文件中会报错
650) this.width=650;" src="/uploads/u/ab/c7/abc7a8b0ff9554474fcf6f9.png" alt="\">
2.使用TouchJson库需要添加头文件&#import&&CJSONDeserializer.h&,使用SBJson需要添加头文件&#import&&SBJson.h&然后打开XIB添加三个button,让添加三个方法
650) this.width=650;" src="/uploads/u/75/36/bcf52647bbcf6e12656b.png" alt="\">
- (IBAction)buttonPressedone:(id)
- (IBAction)buttonPressedtwo:(id)
- (IBAction)buttonPressedthree:(id)
3.三个解析方法都类似
TouchJson库解析北京天气
- (IBAction)buttonPressedone:(id)sender { //
获取API接口
NSURL *url = [NSURL URLWithString:@&.cn/data/.html&]; //
定义一个NSError对象,用于捕获错误信息
NSError * //
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
NSLog(@&jsonstring---&%@&,jsonString); //
将解析得到的内容存放字典中,编码格式UTF8,防止取值时候发生乱码
NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error]; //
因为返回的Json文件有两层,去第二层类容放到字典中去0
NSDictionary *weatherInfo = [rootDic objectForKey:@&weatherinfo&]; //
NSLog(@&今天是 %@ %@ %@ 的天气状况是:%@ %@&,[weatherInfo objectForKey:@&date_y&],[weatherInfo objectForKey:@&week&],[weatherInfo objectForKey:@&city&],[weatherInfo objectForKey:@&weather1&],[weatherInfo objectForKey:@&temp1&]);
SBJson库,解析南阳天气,换一下城市的id号就可以了
- (IBAction)buttonPressedtwo:(id)sender {
NSURL *url = [NSURL URLWithString:@&.cn/data/.html&];
NSError *error=
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
SBJsonParser *parser = [[SBJsonParser alloc]init];
NSDictionary *rootDic = [parser objectWithString:jsonString error:&error];
NSDictionary *weatherInfo = [rootDic objectForKey:@&weatherinfo&];
NSLog(@&今天是 %@ %@ %@ 的天气状况是:%@ %@&,[weatherInfo objectForKey:@&date_y&],[weatherInfo objectForKey:@&week&],[weatherInfo objectForKey:@&city&],[weatherInfo objectForKey:@&weather1&],[weatherInfo objectForKey:@&temp1&]);
iOS5所支持的原生json解析,信阳市天气
- (IBAction)buttonPressedthree:(id)sender {
NSError * //
加载一个NSURL对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@&.cn/data/.html&]]; //
将请求的url数据放到NSData对象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; //
iOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; //
weatherDic字典中存放的数据也是字典型,从它里面通过键值取值
NSDictionary *weatherInfo = [weatherDic objectForKey:@&weatherinfo&];
NSLog(@&今天是 %@ %@ %@ 的天气状况是:%@ %@&,[weatherInfo objectForKey:@&date_y&],[weatherInfo objectForKey:@&week&],[weatherInfo objectForKey:@&city&],[weatherInfo objectForKey:@&weather1&],[weatherInfo objectForKey:@&temp1&]); //
打印出weatherInfo字典所存储数据
NSLog(@&weatherInfo字典里面的内容是---&%@&,[weatherInfo description]); }
如果我们像获取更多信息,直接从字典中取值
我们用到了这样一个类方法
+ (NSData
*)sendSynchronousRequest:(NSURLRequest
*)request returningResponse:(NSURLResponse
**)response error:(NSError
request 要装载的URL请求. 这个request 对象 作为初始化进程的一部分,被深度复制(deep-copied). 在这个方法返回之后, 再修改request, 将不会影响用在装载的过程中的requestreponse 输出参数, 由服务器返回的URL响应error&& 输出参数, 如果在处理请求的过程中发生错误,就会使用.& 无错误,就为NULL
它返回的是一个下载的url请求,如果连接失败或者创建失败失败返回nil
4.运行结果(如果想知道每次字符串和字典间取值情况,只需NSLog打印输出就行):
650) this.width=650;" src="/uploads/u/d6/66/d6665aeafeacb8d3c9971f5.png" alt="\">
5.再解析取值的时候花费了一些时间,取值时发生应用程序崩溃,获取值不正确
有时我们从字典中获取了这样的数据,感觉比较郁闷,并未显示中文,这种情况是我们把数据放到字典中,编码方式是UTF8,取值打印出来的时候就成中文了
650) this.width=650;" src="/uploads/u/98/57/bf.png" alt="\">
在解析出来数据后我想这样取值,
NSDictionary *weatherInfo = [rootDicobjectForKey:@&weatherinfo&];
& & NSArray *weatherArray = [rootDicobjectForKey:@&weatherinfo&];
& & for (NSDictionary *dicin weatherArray) {
& & & & NSLog(@&-----&%@&,dic);
打印出来的dic数据是这样的
650) this.width=650;" src="/uploads/u/07/08/aa9ecfa0ab4cfc1f413fc94a.png" alt="\">
这是我们json文件的第二层数据取出放到了一个数组中,然后定义了一个字典对象在数组中遍历取出存放的数据,于是就想用
NSLog(@&-----&%@&,[dicobjectForKey:@&city&]);来取出city的值,但是应用程序崩溃
650) this.width=650;" src="/uploads/u/63/a4/63a42b1fda76ed8a0d423.png" alt="\">
出现这种情况是因为在对解析出数据存值和取值发生问题,说明这种方式是取值是不正确的;
源代码:http://download.csdn.net/detail/duxinfeng
本文出自 “新风作浪” 博客,请务必保留此出处http://duxinfeng./8785
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊

我要回帖

更多关于 caoliu2014.info 的文章

 

随机推荐