微信公眾平臺之超簡單實用的天氣預報后臺實現
來源:程序員人生 發布時間:2014-12-18 09:00:06 閱讀次數:3943次
微信公眾平臺之超簡單實用的天氣預報后臺實現
概述,前段時間我在開發1個自己的微信公眾平臺,需要實現天氣預報功能,在網上度娘了下,實現天氣預報的接口API還蠻多的,有:中國氣象局、雅虎和新浪等,中國天氣預報接口需要全國的編碼,雅虎的有時候訪問不了,研究了下還是新浪提供的接口比較簡單實用。新浪天氣預報API的URL是http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0。其中,city后的城市轉碼。Password固定,Day為0表示當每天氣,1表示第2天的天氣,2表示第3天的天氣,以此類推,最大為4。返回的XML,說明以下:
<Profiles>
<Weather>
<city>廣州</city>
<status1>晴</status1>
<status2>晴</status2>
<figure1>qing</figure1>
<figure2>qing</figure2>
<direction1>無延續風向</direction1>
<direction2>無延續風向</direction2>
<power1>≤3</power1>
<power2>≤3</power2>
<temperature1>7</temperature1>
<temperature2>⑸</temperature2>
<ssd>0</ssd>
<tgd1>7</tgd1>
<tgd2>7</tgd2>
<zwx>2</zwx>
<ktk>7</ktk>
<pollution>3</pollution>
<xcz></xcz>
<zho></zho>
<diy></diy>
<fas></fas>
<chy>6</chy>
<zho_shuoming>暫無</zho_shuoming>
<diy_shuoming>暫無</diy_shuoming>
<fas_shuoming>暫無</fas_shuoming>
<chy_shuoming>棉衣、冬大衣、皮茄克、內著襯衫或羊毛褻服、毛衣、外罩大衣</chy_shuoming>
<pollution_l>1般</pollution_l>
<zwx_l>弱</zwx_l>
<ssd_l>較涼</ssd_l>
<fas_l>暫無</fas_l>
<zho_l>暫無</zho_l>
<chy_l>薄冬衣</chy_l>
<ktk_l>建議開啟(制熱)</ktk_l>
<xcz_l>暫無</xcz_l>
<diy_l>暫無</diy_l>
<pollution_s>對空氣污染物分散無明顯影響</pollution_s>
<zwx_s>紫外線弱</zwx_s>
<ssd_s>老年、幼兒、體弱者外出需要帶上薄圍巾、薄手套。</ssd_s>
<ktk_s>建議開啟空調</ktk_s>
<xcz_s>暫無</xcz_s>
<gm>2</gm>
<gm_l>易發期</gm_l>
<gm_s>天氣很涼,季節轉換的氣候,慎重增加衣服;較易引發感冒;</gm_s>
<yd>5</yd>
<yd_l>不適合</yd_l>
<yd_s>雖然晴空萬里,但是戶外運動時會感到很涼;</yd_s>
<savedate_weather>2013-03-01</savedate_weather>
<savedate_life>2013-03-01</savedate_life>
<savedate_zhishu>2013-03-01</savedate_zhishu>
</Weather>
</Profiles>
標簽中1表示白天,2表示夜間
|
|
<status>
< figure>
<direction>
<power>
<temperature>
<ssd>
<ssd_l>
<ssd_s>
<tgd>
<zwx>
<zwx_l>
<zwx_s>
<ktk>
<ktk_l>
<ktk_s>
<pollution>
<pollution_l>
<pollution_s>
<xcz>
<xcz_l>
<xcz_s>
<chy>
<chy_l>
<chy_shuoming>
<gm>
<gm_l>
<gm_s>
<yd>
<yd_l>
<yd_s>
<zho>
<zho_l>
<zho_shuoming>
<diy>
<diy_l>
<diy_shuoming>
<fas>
<fas_l>
<fas_shuoming>
<savedate_weather>
<savedate_life>
<savedate_zhishu>
|
天氣情況中文
天氣情況拼音
風向
風級
溫度
體感指數數值
體感度指數
體感度指數說明
體感溫度
紫外線指數數值
紫外線指數
紫外線指數說明
空調指數數值
空調指數
空調指數說明
污染指數數值
污染物分散條件
污染指數說明
洗車指數數值
洗車指數
洗車指數說明
穿衣指數數值
穿衣指數
穿衣說明
感冒指數數值
感冒指數
感冒指數說明
運動指數數值
運動指數
運動指數說明
天氣預報日期
生活日期
指很多天期
|
實現,下面就貼出我具體實現的代碼,雖然返回的是XML,但是我沒有使用DOM4J或XStream進行解析,完全使用簡單的正則表達式就弄定了,空話少說,看具體代碼:
1、weather服務類
package com.mghs.service;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.mghs.util.GetAppConfUtil;
import com.mghs.util.HttpRequestUtil;
/**
* 天氣預報服務
* @author lanp
* @since 2014⑺⑵9 20:56:16
* @version v1.0.1
*/
public class WeatherService {
/**
* GBK編碼
* @param source
* @return
*/
public static String urlEncodeGBK(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 獲得天氣預報XML信息并返回
* @param source
* @return
*/
public static String getWeatherXml(String source,int day) {
String dst = null;
// 組裝查詢地址
String requestUrl = "http://php.weather.sina.com.cn/xml.php?city={keyWord}&password=DJOYnieT8234jlsK&day="+day;
// 對參數q的值進行urlEncode utf⑻編碼
requestUrl = requestUrl.replace("{keyWord}", HttpRequestUtil.urlEncode(source, "GBK"));
dst = HttpRequestUtil.httpRequest(requestUrl);
return dst;
}
/**
* 獲得今天、明天和后天的天氣預報信息并返回
* @param source
* @return
*/
public static String getWeatherInfo(String source) {
StringBuffer buffer = new StringBuffer();
buffer.append(source).append(" 今明后3每天氣情況以下:
");
for(int i=0;i<3;i++) {
String weatherXml = getWeatherXml(source,i);
if(null==weatherXml || "".equals(weatherXml))
return "";
String status1 = "";
String direction1 = "";
String temperature1 = "";
String temperature2 = "";
String savedate_weather = "";
String ssd_l = "";
String yd_s = "";
Pattern p = Pattern.compile("(.*)(<status1>)(.*?)(</status1>)(.*)");
Matcher m = p.matcher(weatherXml);
if(m.matches())
status1 = m.group(3);
if(null==status1 || "".endsWith(status1))
return "";
p = Pattern.compile("(.*)(<direction1>)(.*?)(</direction1>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
direction1 = m.group(3);
p = Pattern.compile("(.*)(<temperature1>)(.*?)(</temperature1>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
temperature1 = m.group(3);
p = Pattern.compile("(.*)(<temperature2>)(.*?)(</temperature2>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
temperature2 = m.group(3);
p = Pattern.compile("(.*)(<savedate_weather>)(.*?)(</savedate_weather>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
savedate_weather = m.group(3);
p = Pattern.compile("(.*)(<ssd_l>)(.*?)(</ssd_l>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
ssd_l = m.group(3);
p = Pattern.compile("(.*)(<yd_s>)(.*?)(</yd_s>)(.*)");
m = p.matcher(weatherXml);
if(m.matches())
yd_s = m.group(3);
buffer.append(savedate_weather).append("
").append(status1).append(" ").append(direction1).append(" ").append(temperature2)
.append("°-").append(temperature1).append("° ").append(ssd_l).append("
").append("溫馨提示:").append(yd_s).append("
");
}
return (null==buffer?"":buffer.toString());
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(getWeatherInfo("廣州"));
}
}
2、http工具類
package com.mghs.util;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Http要求工具類
* @author lanp
* @since 2014⑻⑵4 13:30:56
* @version v1.0.1
*/
public class HttpRequestUtil {
/**
* 編碼
* @param source
* @return
*/
public static String urlEncode(String source,String encode) {
String result = source;
try {
result = java.net.URLEncoder.encode(source,encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return "0";
}
return result;
}
/**
* 發起http要求獲得返回結果
* @param requestUrl 要求地址
* @return
*/
public static String httpRequest(String requestUrl) {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoOutput(false);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 將返回的輸入流轉換成字符串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf⑻");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 釋放資源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
return buffer.toString();
}
/**
* 發送http要求獲得返回的輸入流
* @param requestUrl 要求地址
* @return InputStream
*/
public static InputStream httpRequestIO(String requestUrl) {
InputStream inputStream = null;
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoInput(true);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 取得返回的輸入流
inputStream = httpUrlConn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
}
歡迎大家關注小編的微信公眾平臺:MyGoodHelper,是您出行、生活、學習和文娛的得力助手,我們1起進步。OK,TKS!
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈