今天一顿努力,终于完成了微信发送天气,当然这要多谢柳峰老师的博客http://blog.csdn.net/lyq8479/article/details/9141467对我有很大的帮助.别的不多说 就说一下我实现的过程,主要思路就是发送天气,首先要根据城市的名称得到城市的查询天气的编码,然后拼接成url访问中国气象局提供的返回数据的页面,我的博客中有提到的.下面就直接上代码了
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.json.JSONException;
import org.json.JSONObject;
public class WeatherSearch {
private static LogMessage log =LogMessage.getInstance();
/**
* @param url
* @return 得到访问页面的返回的数据
*/
public static String AccesPage(String url){
String info = null;
if(url != null&& !url.equals("")){
try{
HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);
client.getHttpConnectionManager().closeIdleConnections(1);
int statusCode = client.executeMethod(method);
//用的http
info = method.getResponseBodyAsString();
} catch(Exception e){
log.error("accesPage error:"+e.getLocalizedMessage());
}
}
return info;
}
/**
* @param xml
* @return 解析json得到想要的数据
*/
public static String getReturnInfo(String xml){
StringBuffer bf = new StringBuffer();
try {
JSONObject json = new JSONObject(xml).getJSONObject("weatherinfo");
bf.append(json.get("date_y").toString());
bf.append(" "+json.get("week").toString());
bf.append(" "+json.get("temp1").toString());
bf.append(" "+json.get("weather1").toString());
bf.append(" "+json.get("wind1").toString());
bf.append("\n");
bf.append(getDateAddOne(json.get("date_y").toString()));
bf.append(" "+getWeekAddOne(json.get("week").toString()));
bf.append(" "+json.get("temp2"));
bf.append(" "+json.get("weather2"));
bf.append(" "+json.get("wind2"));
bf.append("\n");
bf.append(getDateAddOne(getDateAddOne(json.get("date_y").toString())));
bf.append(" "+getWeekAddOne(getWeekAddOne(json.get("week").toString())));
bf.append(" "+json.get("temp3"));
bf.append(" "+json.get("weather3"));
bf.append(" "+json.get("wind3"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bf.toString();
}
/**
* @param date
* @return 日期加一
*/
public static String getDateAddOne(String datest){
SimpleDateFormat ft = new SimpleDateFormat("yyyy年MM月dd日");
Date date=new Date();
try {
date = ft.parse(datest);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendar.DAY_OF_MONTH,1);
date=calendar.getTime();
return ft.format(date);
}
public static String getWeekAddOne(String week){
Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1, "星期一");
map.put(2, "星期二");
map.put(3, "星期三");
map.put(4, "星期四");
map.put(5, "星期五");
map.put(6, "星期六");
map.put(7, "星期日");
String weekNow =null;
for (Map.Entry<Integer, String> MapString : map.entrySet()) {
Integer key=MapString.getKey();//次方法获取键值对的名称
String value=MapString.getValue();//次方法获取键值对的值
if(value.equals(week)){
if(key==7){
weekNow = map.get(1);
}else{
weekNow =map.get(key+1);
}
break;
}
}
return weekNow;
}
/**
* @param cityName
* @return
*/
public static String getCityCode(String cityName){
String requestUrl = "http://someapi.sinaapp.com/citycode/?city={CITY}";
requestUrl = requestUrl.replace("{CITY}", urlEncodeUTF8(cityName));
// 处理空格
requestUrl = requestUrl.replaceAll("\\+", "%20");
String cityCode = AccesPage(requestUrl);
return cityCode;
}
/**
* UTF-8编码
*
* @param source
* @return
*/
private static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
//传人citycode 得到 weather json
public static String getWeatherByCity(String cityCode){
String url="http://m.weather.com.cn/data/"+cityCode.trim()+".html";
return AccesPage(url);
}
//整合一下
public static String getIntegration(String cityName){
return getReturnInfo(getWeatherByCity(getCityCode(cityName)));
}
}
其中的 getWeekAddOne(String week)和 getDateAddOne(String datest)方法是因为中国气象局提供的接口返回的json中只有当天的日期和星期,但是有六天的天气情况(http://m.weather.com.cn/data/101010100.html)
所以要得到得到后两天的日期和星期.
实现的效果 就是发送三天的天气预报,点击就进入中国气象局网站.