Przeglądaj źródła

天气、宜忌接口

詹子聪 5 lat temu
rodzic
commit
5c76f1eeef

BIN
libs/jsoup-1.13.1.jar


+ 148 - 146
pom.xml

@@ -1,148 +1,150 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>com.cenyol</groupId>
-  <artifactId>shibei</artifactId>
-  <packaging>war</packaging>
-  <version>1.0-SNAPSHOT</version>
-  <name>example Maven Webapp</name>
-  <url>http://maven.apache.org</url>
-
-  <properties>
-    <spring.version>4.2.5.RELEASE</spring.version>
-    <spring-data.version>1.2.0.RELEASE</spring-data.version>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.12</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-core</artifactId>
-      <version>${spring.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-web</artifactId>
-      <version>${spring.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <version>2.5</version>
-    </dependency>
-
-    <dependency>
-      <groupId>javax.servlet.jsp</groupId>
-      <artifactId>jsp-api</artifactId>
-      <version>2.1</version>
-      <scope>provided</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-webmvc</artifactId>
-      <version>${spring.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-test</artifactId>
-      <version>${spring.version}</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>jstl</groupId>
-      <artifactId>jstl</artifactId>
-      <version>1.2</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework.data</groupId>
-      <artifactId>spring-data-jpa</artifactId>
-      <version>${spring-data.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.hibernate.javax.persistence</groupId>
-      <artifactId>hibernate-jpa-2.0-api</artifactId>
-      <version>1.0.0.Final</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.hibernate</groupId>
-      <artifactId>hibernate-entitymanager</artifactId>
-      <version>3.6.10.Final</version>
-    </dependency>
-
-    <dependency>
-      <groupId>mysql</groupId>
-      <artifactId>mysql-connector-java</artifactId>
-      <version>5.1.34</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.json</groupId>
-      <artifactId>json</artifactId>
-      <version>20080701</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-nop</artifactId>
-      <version>1.8.0-alpha2</version>
-    </dependency>
-
-    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
-    <dependency>
-      <groupId>com.alibaba</groupId>
-      <artifactId>fastjson</artifactId>
-      <version>1.2.48</version>
-    </dependency>
-
-    <!--发邮件-->
-    <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
-    <!--<dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>javax.mail-api</artifactId>
-      <version>1.5.0</version>
-    </dependency>-->
-
-    <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
-    <dependency>
-      <groupId>commons-fileupload</groupId>
-      <artifactId>commons-fileupload</artifactId>
-      <version>1.3.3</version>
-    </dependency>
-
-
-    <!--解析接收到的json-->
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-      <version>2.1.4</version>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <finalName>shibei</finalName>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-compiler-plugin</artifactId>
-        <configuration>
-          <source>6</source>
-          <target>6</target>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>com.cenyol</groupId>
+    <artifactId>shibei</artifactId>
+    <packaging>war</packaging>
+    <version>1.0-SNAPSHOT</version>
+    <name>example Maven Webapp</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <spring.version>4.2.5.RELEASE</spring.version>
+        <spring-data.version>1.2.0.RELEASE</spring-data.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.12</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet</groupId>
+            <artifactId>servlet-api</artifactId>
+            <version>2.5</version>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.servlet.jsp</groupId>
+            <artifactId>jsp-api</artifactId>
+            <version>2.1</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+            <version>${spring.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>${spring.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>jstl</groupId>
+            <artifactId>jstl</artifactId>
+            <version>1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+            <version>${spring-data.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.0-api</artifactId>
+            <version>1.0.0.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hibernate</groupId>
+            <artifactId>hibernate-entitymanager</artifactId>
+            <version>3.6.10.Final</version>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.34</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.json</groupId>
+            <artifactId>json</artifactId>
+            <version>20080701</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-nop</artifactId>
+            <version>1.8.0-alpha2</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.48</version>
+        </dependency>
+
+        <!--发邮件-->
+        <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
+        <!--<dependency>
+          <groupId>javax.mail</groupId>
+          <artifactId>javax.mail-api</artifactId>
+          <version>1.5.0</version>
+        </dependency>-->
+
+        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
+        <dependency>
+            <groupId>commons-fileupload</groupId>
+            <artifactId>commons-fileupload</artifactId>
+            <version>1.3.3</version>
+        </dependency>
+
+
+        <!--解析接收到的json-->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.1.4</version>
+        </dependency>
+
+
+    </dependencies>
+
+    <build>
+        <finalName>shibei</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>6</source>
+                    <target>6</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 </project>

+ 16 - 0
src/main/java/com/miekir/shibei/bean/WeatherBean.java

@@ -0,0 +1,16 @@
+package com.miekir.shibei.bean;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/14 20:44
+ * Description: 天气实体
+ */
+public class WeatherBean {
+    public String temperatureRange;
+    public String temperatureNow;
+    public String wind;
+    public String air;
+    public String desc;
+}

+ 16 - 0
src/main/java/com/miekir/shibei/bean/YijiBean.java

@@ -0,0 +1,16 @@
+package com.miekir.shibei.bean;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/14 22:16
+ * Description: 宜忌实体
+ */
+public class YijiBean {
+    public String newDate;
+    public String oldDate;
+    public String hsDate;
+    public String yi;
+    public String ji;
+}

+ 68 - 0
src/main/java/com/miekir/shibei/controller/api/JsonController.java

@@ -4,8 +4,10 @@ import com.alibaba.fastjson.JSON;
 import com.miekir.shibei.bean.*;
 import com.miekir.shibei.repository.JsonRepository;
 import com.miekir.shibei.repository.UserRepository;
+import com.miekir.shibei.tool.DateTool;
 import com.miekir.shibei.tool.RequestTool;
 import com.miekir.shibei.tool.TextUtils;
+import com.miekir.shibei.tool.WebTool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Sort;
@@ -24,6 +26,72 @@ public class JsonController {
     @Autowired
     private UserRepository userRepository;
 
+    private String mLastWeatherDate = "";
+    private WeatherBean mWeatherBean;
+    private String mLastYijiDate = "";
+    private YijiBean mYijiBean;
+
+    /**
+     * 获取天气信息
+     */
+    @RequestMapping(value = "/api/getWeather", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
+    @ResponseBody
+    public String getWeather(@RequestHeader HttpHeaders header, @RequestBody JsonBean jsonBean) {
+        String email = header.getFirst("email");
+        String token = header.getFirst("token");
+        // 根据email查找用户,查询用户的token是否相同
+        User dbUserBean;
+        try {
+            dbUserBean = userRepository.findUserByEmail(email);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "请求无效";
+        }
+
+        // 用户token不一致
+        if (dbUserBean == null || !TextUtils.equals(token, dbUserBean.getToken())) {
+            return "请求无效";
+        }
+
+
+        String currentDate = DateTool.getCurrentDate();
+        if (!TextUtils.equals(mLastWeatherDate, currentDate) || TextUtils.isEmpty(mWeatherBean.temperatureRange)) {
+            mWeatherBean = WebTool.getWeatherInfo();
+            mLastWeatherDate = currentDate;
+        }
+        return JSON.toJSONString(mWeatherBean);
+    }
+
+    /**
+     * 获取天气信息
+     */
+    @RequestMapping(value = "/api/getYiji", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
+    @ResponseBody
+    public String getYiji(@RequestHeader HttpHeaders header, @RequestBody JsonBean jsonBean) {
+        String email = header.getFirst("email");
+        String token = header.getFirst("token");
+        // 根据email查找用户,查询用户的token是否相同
+        User dbUserBean;
+        try {
+            dbUserBean = userRepository.findUserByEmail(email);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return "请求无效";
+        }
+
+        // 用户token不一致
+        if (dbUserBean == null || !TextUtils.equals(token, dbUserBean.getToken())) {
+            return "请求无效";
+        }
+
+        String currentDate = DateTool.getCurrentDate();
+        if (!TextUtils.equals(mLastYijiDate, currentDate) || TextUtils.isEmpty(mYijiBean.newDate)) {
+            mYijiBean = WebTool.getYijiInfo();
+            mLastYijiDate = currentDate;
+        }
+        return JSON.toJSONString(mYijiBean);
+    }
+
     /**
      * 新增和更新优惠券
      */

+ 14 - 0
src/main/java/com/miekir/shibei/tool/DateTool.java

@@ -0,0 +1,14 @@
+package com.miekir.shibei.tool;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class DateTool {
+    private static final String FORMAT = "yyyyMMdd";
+    private DateTool() {}
+
+    public static String getCurrentDate() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FORMAT);
+        return simpleDateFormat.format(new Date());
+    }
+}

+ 245 - 0
src/main/java/com/miekir/shibei/tool/WebTool.java

@@ -0,0 +1,245 @@
+package com.miekir.shibei.tool;
+
+import java.net.HttpURLConnection;
+import java.net.ProtocolException;
+import java.net.URL;
+
+import com.miekir.shibei.bean.WeatherBean;
+import com.miekir.shibei.bean.YijiBean;
+import org.jsoup.Connection;
+import org.jsoup.Jsoup;
+import org.jsoup.helper.HttpConnection;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.zip.GZIPInputStream;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.X509TrustManager;
+public class WebTool {
+    private WebTool(){}
+
+
+    private static HttpURLConnection setHeader(HttpURLConnection connection) throws ProtocolException {
+        connection.setRequestMethod("GET");
+
+        connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows 7)");
+        connection.setRequestProperty("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*");
+        connection.setRequestProperty("Accept-Language", "zh-cn");
+        connection.setRequestProperty("UA-CPU", "x86");
+        //为什么没有deflate呢
+        connection.setRequestProperty("Accept-Encoding", "gzip");
+        connection.setRequestProperty("Content-type", "text/html");
+        //keep-Alive,有什么用呢,你不是在访问网站,你是在采集。嘿嘿。减轻别人的压力,也是减轻自己。
+        connection.setRequestProperty("Connection", "close");
+        //不要用cache,用了也没有什么用,因为我们不会经常对一个链接频繁访问。(针对程序)
+        connection.setUseCaches(false);
+        connection.setConnectTimeout(6 * 1000);
+        connection.setReadTimeout(6 * 1000);
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+        connection.setRequestProperty("Charset", "utf-8");
+        return connection;
+    }
+
+    /**
+     * 获取网页源码
+     * @return
+     */
+    private static String getHtmlString(String targetUrl) {
+        String content = null;
+
+        HttpURLConnection connection = null;
+        try {
+            URL url = new URL(targetUrl);
+            connection = (HttpURLConnection) url.openConnection();
+            connection = setHeader(connection);
+            connection.connect();
+
+            // 得到重定向之后的网址,重新请求
+            if (302 == connection.getResponseCode()) {
+                String url302 = connection.getHeaderField("Location");
+                if (url302 == null || url302.equals("")) {
+                    // 临时重定向和永久重定向location的大小写有区分
+                    url302 = connection.getHeaderField("location");
+                }
+                //某些时候会省略host,只返回后面的path,所以需要补全url
+                if (!(url302.startsWith("http://") || url302.startsWith("https://"))) {
+                    URL originalUrl = new URL(targetUrl);
+                    url302 = originalUrl.getProtocol() + "://" + originalUrl.getHost() + ":" + originalUrl.getPort() + url302;
+                }
+
+                return getHtmlString(url302);
+            } else  if (200 == connection.getResponseCode()) {
+                InputStream inputStream = null;
+                if (connection.getContentEncoding() != null && !connection.getContentEncoding().equals("")) {
+                    String encode = connection.getContentEncoding().toLowerCase();
+                    if (encode != null && !encode.equals("") && encode.indexOf("gzip") >= 0) {
+                        inputStream = new GZIPInputStream(connection.getInputStream());
+                    }
+                }
+
+                if (null == inputStream) {
+                    inputStream = connection.getInputStream();
+                }
+
+                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
+                StringBuilder builder = new StringBuilder();
+                String line = null;
+                while ((line = reader.readLine()) != null) {
+                    builder.append(line).append("\n");
+                }
+                content = builder.toString();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (connection != null) {
+                connection.disconnect();
+            }
+        }
+
+        return content;
+    }
+
+    public static WeatherBean getWeatherInfo() {
+        WeatherBean weatherBean = new WeatherBean();
+        Document document;
+        //百度搜索结果每页大小为10,pn参数代表的不是页数,而是返回结果的开始数
+        //如获取第一页则pn=0,第二页则pn=10,第三页则pn=20,以此类推,抽象出模式:(page-1)*pageSize
+        int page = 1;
+        int pageSize = 10;
+        String keyword = "天气";
+        String url = "http://www.baidu.com/s?pn="+(page-1)*pageSize+"&wd="+keyword;
+        try {
+            // 直接使用Jsoup爬会被百度拦截,需要安全验证,所以用普通方法爬
+            String content = getHtmlString(url);
+
+            document = Jsoup.parse(content);
+            if (document == null) {
+                return weatherBean;
+            }
+
+            // 当前温度
+            Elements currentTempElementList = document.getElementsByClass("op_weather4_twoicon_shishi_title");
+            if (currentTempElementList != null && currentTempElementList.size() > 0) {
+                Element element = currentTempElementList.get(0);
+                weatherBean.temperatureNow = element.text();
+            }
+
+            // 温度范围
+            Elements tempRangeElementList = document.getElementsByClass("op_weather4_twoicon_temp");
+            if (tempRangeElementList != null && tempRangeElementList.size() > 0) {
+                Element element = tempRangeElementList.get(0);
+                weatherBean.temperatureRange = element.text();
+            }
+
+            // 风
+            Elements windElementList = document.getElementsByClass("op_weather4_twoicon_wind");
+            if (windElementList != null && windElementList.size() > 0) {
+                Element element = windElementList.get(0);
+                weatherBean.wind = element.text();
+            }
+
+
+            // 空气质量
+            Elements airElementList = document.getElementsByClass("op_weather4_twoicon_aqi_text_today");
+            if (airElementList != null && airElementList.size() > 0) {
+                Element element = airElementList.get(0);
+                weatherBean.air = element.text();
+            }
+
+            // 描述
+            Elements descElementList = document.getElementsByClass("op_weather4_twoicon_weath");
+            if (descElementList != null && descElementList.size() > 0) {
+                Element element = descElementList.get(0);
+                String text = element.text();
+                if (text != null) {
+                    weatherBean.desc = text.replaceAll(" ", "");
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return weatherBean;
+    }
+
+    public static YijiBean getYijiInfo() {
+        YijiBean yijiBean = new YijiBean();
+        Document document;
+        String url = "https://mnongli.911cha.com/";
+        try {
+            // 直接使用Jsoup爬会被百度拦截,需要安全验证,所以用普通方法爬
+            String content = getHtmlString(url);
+            document = Jsoup.parse(content);
+            if (document == null) {
+                return yijiBean;
+            }
+
+            // 当前公历年月日
+            Elements newDateElementList = document.getElementsByTag("h2");
+            if (newDateElementList != null && newDateElementList.size() > 0) {
+                Element element = newDateElementList.get(0);
+                yijiBean.newDate = element.text();
+            }
+
+            // 当前农历年月日
+            Elements oldDateElementList = document.getElementsByTag("p");
+            if (oldDateElementList != null && oldDateElementList.size() > 0) {
+                Element element = oldDateElementList.get(0);
+                yijiBean.oldDate = element.text();
+            }
+
+            // 天干地支
+            Elements contentElementList = document.getElementsByClass("hl_riliTop");
+            if (contentElementList != null && contentElementList.size() > 0) {
+                Elements hsElementList = contentElementList.get(0).getElementsByTag("div");
+                if (hsElementList != null && hsElementList.size() > 1) {
+                    yijiBean.hsDate = hsElementList.get(1).text();
+                }
+            }
+
+            Elements yijiElementList = document.getElementsByClass("hl_riliCon_rItem");
+            if (yijiElementList != null && yijiElementList.size() >= 2) {
+                // 宜
+                Element yiElement = yijiElementList.get(0);
+                StringBuilder yiBuilder = new StringBuilder();
+                Elements yiElementItemList = yiElement.getElementsByTag("a");
+                if (yiElementItemList != null && yiElementItemList.size() > 0) {
+                    for (Element element : yiElementItemList) {
+                        yiBuilder.append(element.text()).append("、");
+                    }
+                    yiBuilder.deleteCharAt(yiBuilder.length()-1);
+                    yijiBean.yi = yiBuilder.toString();
+                }
+
+                // 忌
+                Element jiElement = yijiElementList.get(1);
+                StringBuilder jiBuilder = new StringBuilder();
+                Elements jiElementItemList = jiElement.getElementsByTag("a");
+                if (jiElementItemList != null && jiElementItemList.size() > 0) {
+                    for (Element element : jiElementItemList) {
+                        jiBuilder.append(element.text()).append("、");
+                    }
+                    jiBuilder.deleteCharAt(jiBuilder.length()-1);
+                    yijiBean.ji = jiBuilder.toString();
+                }
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return yijiBean;
+    }
+}