今天一頓努力,終於完成了微信發送天氣,當然這要多謝柳峯老師的博客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)
所以要得到得到後兩天的日期和星期.
實現的效果 就是發送三天的天氣預報,點擊就進入中國氣象局網站.