微信公众号查询天气(Java)

天气预报接口

http://api.map.baidu.com/telematics/v3/weather?

传递的参数

这里写图片描述

返回的消息类型

这里写图片描述
json格式:

{
    "error": 0,
    "status": "success",
    "date": "2014-05-03",
    "results": [
        {
            "currentCity": "北京",
            "weather_data": [
                {
                    "date": "周六(今天, 实时:22℃)",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/leizhenyu.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/duoyun.png",
                    "weather": "雷阵雨转多云",
                    "wind": "北风5-6级",
                    "temperature": "24 ~ 11℃"
                },
                {
                    "date": "周日",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/duoyun.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png",
                    "weather": "多云转晴",
                    "wind": "北风4-5级",
                    "temperature": "19 ~ 8℃"
                },
                {
                    "date": "周一",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/qing.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png",
                    "weather": "晴",
                    "wind": "微风",
                    "temperature": "21 ~ 9℃"
                },
                {
                    "date": "周二",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/duoyun.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png",
                    "weather": "多云转晴",
                    "wind": "微风",
                    "temperature": "21 ~ 10℃"
                }
            ]
        }
    ]
}

xml格式:

<?xml version="1.0" encoding="utf-8" ?> 
<CityWeatherResponse>
    <status>success</status>
    <date>2014-05-03</date>
    <results> 

        <currentCity>北京</currentCity>
        <weather_data>
                            <date>周六(今天, 实时:22℃)</date>
                <dayPictureUrl>http://api.map.baidu.com/images/weather/day/leizhenyu.png</dayPictureUrl>
                <nightPictureUrl>http://api.map.baidu.com/images/weather/night/duoyun.png</nightPictureUrl>
                <weather>雷阵雨转多云</weather>
                <wind>北风5-6级</wind>
                <temperature>24 ~ 11℃</temperature>
                            <date>周日</date>
                <dayPictureUrl>http://api.map.baidu.com/images/weather/day/duoyun.png</dayPictureUrl>
                <nightPictureUrl>http://api.map.baidu.com/images/weather/night/qing.png</nightPictureUrl>
                <weather>多云转晴</weather>
                <wind>北风4-5级</wind>
                <temperature>19 ~ 8℃</temperature>
                            <date>周一</date>
                <dayPictureUrl>http://api.map.baidu.com/images/weather/day/qing.png</dayPictureUrl>
                <nightPictureUrl>http://api.map.baidu.com/images/weather/night/qing.png</nightPictureUrl>
                <weather></weather>
                <wind>微风</wind>
                <temperature>21 ~ 9℃</temperature>
                            <date>周二</date>
                <dayPictureUrl>http://api.map.baidu.com/images/weather/day/duoyun.png</dayPictureUrl>
                <nightPictureUrl>http://api.map.baidu.com/images/weather/night/qing.png</nightPictureUrl>
                <weather>多云转晴</weather>
                <wind>微风</wind>
                <temperature>21 ~ 10℃</temperature>
                    </weather_data>
        </results>
</CityWeatherResponse>

测试账号url:

这里写图片描述

效果图:

这里写图片描述

完整代码如下:

这里写图片描述

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app
        version="3.0"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">


     <servlet>
       <servlet-name>bb</servlet-name>
       <servlet-class>yiche.com.servlet.WeiXinServlet</servlet-class>
     </servlet>
    <servlet-mapping>
      <servlet-name>bb</servlet-name>
      <url-pattern>/ok.do</url-pattern>
    </servlet-mapping>
</web-app>

pom.xml

 <dependencies>


    <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.6</version>
    </dependency>

    <dependency>
      <groupId>com.thoughtworks.xstream</groupId>
      <artifactId>xstream</artifactId>
      <version>1.4</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>

    </dependency>


    <!-- 格式化对象,方便输出日志 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.7</version>
    </dependency>

    <dependency>
      <groupId>org.json</groupId>
      <artifactId>json</artifactId>
      <version>20131018</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.github.iweinzierl/jsonformat -->
    <dependency>
      <groupId>com.github.iweinzierl</groupId>
      <artifactId>jsonformat</artifactId>
      <version>1.0</version>
    </dependency>



    <!--创建Servlet-->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>


    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
      <!--//<scope>provided</scope>-->
    </dependency>

  </dependencies>

封装的天气消息类

public class Weather {

    private String date;
    private String dayPictureUrl;
    private String nightPictureUrl;
    private String weather;
    private String wind;
    private String temperature;
    }



public class Results {


    private String currentCity;
    private List<Weather> weather_data;

    }

public class Status {


    private String error;
    private String status;
    private String date;
    private List<Results> results;
}

文本消息实体类:


public class Message {


    private String ToUserName;

    private String FromUserName;

    private Long CreateTime;

    private String MsgType;

    private String Content;

    private String MsgId;
    }

Servlet方法:

    */
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {

    req.setCharacterEncoding("UTF-8");
    resp.setCharacterEncoding("UTF-8");
    PrintWriter out = resp.getWriter();
    try {
        Map<String,String> map = MessgaeUtils.xmlToMap(req);
        String toUserName = map.get("ToUserName");
        String fromUserName = map.get("FromUserName");
        String msgType = map.get("MsgType");
        String content = map.get("Content");

        String message = null;
        //MessageUtil.MESSAGE_TEXT就是 text
        if(MessgaeUtils.MESSAGE_TEXT.equals(msgType)){
            if(content.endsWith("天气")){
                String keyWord = content.replaceAll("天气", "").trim();

                message = MessgaeUtils.initText(toUserName, fromUserName, BaiDuWeather.getSend(keyWord));
            }
        }
        out.print(message);
    }catch (Exception e) {
        // TODO: handle exception,
        e.printStackTrace();
        out.close();
    }
}

访问天气接口



public class BaiDuWeather {
    private static String api = "http://api.map.baidu.com/telematics/v3/weather?";
    private static String output = "json";
    //你前面百度地图API上申请的key"
    private static String ak ="81218080E79C9685b35e757566d8cbe5";

    public static String getSend(String str) {
        // 将传进来的城市转码
        try {
            str = URLEncoder.encode(str, "utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 拼接url
        StringBuffer buf = new StringBuffer();
        buf.append("location=");
        buf.append(str);
        buf.append("&output=");
        buf.append(output);
        buf.append("&ak=");
        buf.append(ak);
        String param = buf.toString();
        // 这是接收百度API返回的内容
        String result = "";
        String urlName = api + param;
        URL realUrl;
        try {
            realUrl = new URL(urlName);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
           // conn.setDoInput(true);
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    conn.getInputStream(),"UTF-8"));

            String line = br.readLine();
            while (line != null) {
                result += line;
                line = br.readLine();
            }
            br.close();
            Gson gson = new Gson();
            Status status = gson.fromJson(result, Status.class);
            List<Results> results=status.getResults();
            StringBuffer bf=new StringBuffer();
            for(int i=0;i<results.size();i++){
                Results res=results.get(i);
                List<Weather> weather_data=res.getWeather_data();
                for(int j=0;j<weather_data.size();j++){
                    Weather weather=weather_data.get(j);
                    String date=weather.getDate();
                    String weath=weather.getWeather();
                    String temp=weather.getTemperature();
                    bf.append(date+" ");
                    bf.append(weath+" ");
                    bf.append(temp+" ");
                    bf.append("\n");
                }
            }
            return bf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String[] args) {
        String json=getSend("湘西");
        System.out.println(json);
    }
}

消息转化转换Utils


public class MessgaeUtils {


    public static final String MESSAGE_TEXT = "text";

    public static final String MESSAGE_IMAGE = "image";

    public static final String MESSAGE_VOICE = "voice";

    public static final String MESSAGE_VIDEO = "video";

    public static final String MESSAGE_SHORTVIDEO = "shortvideo";

    public static final String MESSAGE_LINK = "link";

    public static final String MESSAGE_LOCATION = "location";

    public static final String MESSAGE_EVENT = "event";

    public static final String MESSAGE_SUBSCRIBE = "subscribe";

    public static final String MESSAGE_UNSUBSCRIBE = "unsubscribe";

    public static final String MESSAGE_CLICK = "CLICK";

    public static final String MESSAGE_VIEW = "VIEW";

    public static final String MESSAGE_SCAN = "SCAN";


       //关注初始化消息内容
      public static String menuText(){
          StringBuffer b=new StringBuffer();
          b.append("欢饮来到我的微信公众号,请选择\n\n");
          b.append("1、我很帅。\n\n");
          b.append("2、我贼鸡儿帅。\n\n");
          b.append("回复、主菜单。\n\n");
          return b.toString();
      }

      public static String initText(String toUserName,String fromUserName,String content){
           Message message=new Message();
           message.setToUserName(fromUserName);
           message.setFromUserName(toUserName);
           message.setMsgType(MESSAGE_TEXT);
           message.setContent(content);
           message.setCreateTime(new Date().getTime());
           return  objectToXml(message);
      }
       /*将xml格式转化为map*/
        public static Map<String,String> xmlToMap(HttpServletRequest request) throws Exception{
           Map<String,String> map=new HashMap<>();

            SAXReader reader=new SAXReader();
            InputStream inputStream=request.getInputStream();
            Document doc=reader.read(inputStream);
            Element root=doc.getRootElement();//得到根节点
            List<Element> list=root.elements();//根节点下的所有的节点
            for(Element e:list){
                map.put(e.getName(),e.getText());
            }

            inputStream.close();
            return  map;
        }

        /*将我们的消息内容转变为xml*/

        public static String objectToXml(Message message){
            XStream xStream=new XStream();
            xStream.alias("xml", message.getClass());
            return xStream.toXML(message);
        }
}

猜你喜欢

转载自blog.csdn.net/didi7696/article/details/80404518