duzejun 3 gadi atpakaļ
vecāks
revīzija
0a09a5f809

+ 10 - 1
pom.xml

@@ -51,6 +51,16 @@
       <artifactId>fastjson</artifactId>
       <version>1.2.79</version>
     </dependency>
+    <dependency>
+      <groupId>org.jsoup</groupId>
+      <artifactId>jsoup</artifactId>
+      <version>1.15.1</version>
+    </dependency>
+    <dependency>
+      <groupId>org.seleniumhq.selenium</groupId>
+      <artifactId>selenium-java</artifactId>
+      <version>3.141.59</version>
+    </dependency>
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
@@ -63,7 +73,6 @@
     <dependency>
       <groupId>org.projectlombok</groupId>
       <artifactId>lombok</artifactId>
-      <version>1.18.12</version>
       <scope>test</scope>
     </dependency>
   </dependencies>

+ 96 - 0
src/main/java/com/mingxue/spider/fliphtml5/QuickUpload.java

@@ -0,0 +1,96 @@
+package com.mingxue.spider.fliphtml5;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.core.lang.Dict;
+import cn.hutool.core.lang.UUID;
+import okhttp3.FormBody;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.MultipartBody.Builder;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+public class QuickUpload {
+    private static String host = "https://fliphtml5.com";
+    private OkHttpClient.Builder builder;
+    private Request.Builder requestBuilder;
+    private OkHttpClient okHttpClient;
+    private User user = new User();
+
+    class User {
+        String mail = "duzejun111@163.com";
+        String pass = "duzejun";
+        String name;
+        String cId;
+        String uId;
+
+    }
+
+    private QuickUpload() {
+        builder = new OkHttpClient.Builder();
+        okHttpClient = builder.build();
+        requestBuilder = new Request.Builder();// 省的每次都new request操作,直接builder出来,随后需要什么往里加,build出来即可
+    }
+
+    public void login() {
+        try {
+            httpGetHtml("/login.php");
+            // umail=duzejun111%40163.com&upass=duzejun&isMobile=0
+            Dict data = Dict.create().set("umail", user.mail).set("upass", user.pass).set("isMobile", 0);
+            String res = httpPost("/userLoad/handle-user-log-in.php", data);
+            // {"status":"1","cId":"3173336","uId":"2953511","uLink":"hsucl","uName":"duzejun111","PrimaryAccountId":"0","uType":"0","mess":""}
+            JSONObject json = JSON.parseObject(res);
+            user.cId = json.getString("cId");
+            user.uId = json.getString("uId");
+            user.name = json.getString("uName");
+        } catch (Exception e) {
+            // TODO: handle exception
+        }
+    }
+
+    public void upload(String path) {
+        try {
+            String url = "https://s3.amazonaws.com/online.fliphtml5.com";
+            Builder builder = new MultipartBody.Builder();
+            File file = new File(path);
+            builder.addFormDataPart("file", file.getName(), MultipartBody.create(MediaType.parse("multipart/form-data"), file));
+            httpPost(url, builder.build());
+        } catch (Exception e) {
+            // TODO: handle exception
+        }
+    }
+
+    public String httpGetHtml(String url) throws IOException {
+        Request request = requestBuilder.url(host + url).build();
+        Response res = okHttpClient.newCall(request).execute();
+        return res.body().string();
+    }
+
+    public String httpPost(String url, Dict data) throws IOException {
+        FormBody.Builder builder = new FormBody.Builder();
+        for (String key : data.keySet()) {
+            builder.add(key, data.getStr(key));
+        }
+        return httpPost(host + url, builder.build());
+    }
+
+    public String httpPost(String url, RequestBody body) throws IOException {
+        Request request = requestBuilder.url(url).method("POST", body).build();
+        Response res = okHttpClient.newCall(request).execute();
+        return res.body().string();
+    }
+
+    public static void main(String[] args) {
+        QuickUpload qu = new QuickUpload();
+        qu.login();
+        qu.upload("e:/temp/Java编码规范.pdf");
+
+    }
+}

+ 84 - 0
src/main/java/com/mingxue/spider/fliphtml5/QuickUpload2.java

@@ -0,0 +1,84 @@
+package com.mingxue.spider.fliphtml5;
+
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+
+public class QuickUpload2 {
+    private static String host = "https://fliphtml5.com";
+    private User user = new User();
+    ChromeDriver driver;
+
+    class User {
+        String mail = "duzejun111@163.com";
+        String pass = "duzejun";
+        String name;
+        String cId;
+        String uId;
+    }
+
+    private QuickUpload2() {
+        // 配置浏览器驱动地址
+        System.setProperty("webdriver.chrome.driver", "e:/temp/chromedriver.exe");
+        ChromeOptions option = new ChromeOptions();
+        option.addArguments("no-sandbox");// 禁用沙盒
+        // 通过ChromeOptions的setExperimentalOption方法,传下面两个参数来禁止掉谷歌受自动化控制的信息栏
+        option.setExperimentalOption("useAutomationExtension", false);
+        option.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
+        driver = new ChromeDriver(option);
+
+    }
+
+    public void login() {
+        try {
+            driver.get(host + "/login.php");
+            driver.findElement(By.id("loginEmail")).sendKeys(user.mail);
+            TimeUnit.SECONDS.sleep(1);
+            driver.findElement(By.id("loginPassword")).sendKeys(user.pass);
+            TimeUnit.SECONDS.sleep(1);
+            WebElement btn = driver.findElement(By.id("loginButton"));
+            btn.click();
+            TimeUnit.SECONDS.sleep(2);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void upload(String path) {
+        try {
+            TimeUnit.SECONDS.sleep(4);
+            driver.get(host + "/quick-upload/");
+            TimeUnit.SECONDS.sleep(2);
+            WebElement frm = driver.findElement(By.className("upload-pdf-form"));
+            driver.executeScript("arguments[0].style=\"display: block !important;\"", frm  );
+            TimeUnit.SECONDS.sleep(2);
+            WebElement inputFile = driver.findElement(By.id("upload-pdf-input"));
+            inputFile.sendKeys(path);
+            TimeUnit.SECONDS.sleep(2);
+            driver.executeScript("$(arguments[0]).fileupload()",inputFile);
+            TimeUnit.SECONDS.sleep(1000);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void close() {
+        driver.quit();
+        driver = null;
+
+    }
+
+    public static void main(String[] args) {
+        QuickUpload2 qu = new QuickUpload2();
+        qu.login();
+        qu.upload("e:/temp/Java编码规范.pdf");
+        qu.close();
+
+    }
+
+}

+ 58 - 0
src/main/java/com/mingxue/spider/jlzy/Abstractservice.java

@@ -0,0 +1,58 @@
+package com.mingxue.spider.jlzy;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.mingxue.spider.helper.StringUtils;
+
+@SuppressWarnings("serial")
+public class Abstractservice {
+    protected Logger log = LoggerFactory.getLogger(getClass());
+    protected static String host = "https://apiv4.diyigaokao.com";
+    // 字体编码
+    static Map<Integer, String> fontMap = new HashMap<Integer, String>() {
+        {
+            put(1, "0923546781");
+            put(2, "0329547681");
+            put(3, "0359247681");
+            put(4, "0351426789");
+        }
+    };
+
+    /**
+     * 数据解密
+     * 
+     * @param row
+     * @param thData
+     */
+    protected void decrypt(JSONObject row, Integer fontId, JSONArray thData) {
+        // 解密错位数据
+        for (int i = 0; i < thData.size(); i++) {
+            JSONObject th = thData.getJSONObject(i);
+            if (th.getInteger("encryption") == 1) {
+                String prop = th.getString("prop");
+                String originalValue = row.getString(prop);
+                if (StringUtils.isNotBlank(originalValue)) {
+                    String realValue = getRealData(fontId, originalValue);
+                    row.put(prop, realValue);
+                }
+            }
+        }
+    }
+
+    protected String getRealData(Integer fontId, String data) {
+        if (StringUtils.isBlank(data)) {
+            return data;
+        }
+        StringBuilder result = new StringBuilder();
+        for (char index : data.toCharArray()) {
+            result.append(fontMap.get(fontId).toCharArray()[Integer.parseInt(String.valueOf(index))]);
+        }
+        return result.toString();
+    }
+}

+ 112 - 0
src/main/java/com/mingxue/spider/jlzy/CollegeService.java

@@ -0,0 +1,112 @@
+package com.mingxue.spider.jlzy;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.mingxue.spider.utils.ApiUtil;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.db.DbUtil;
+import cn.hutool.db.Entity;
+
+public class CollegeService extends Abstractservice {
+
+    /**
+     * 获取学校信息
+     */
+    public void list() {
+
+    }
+
+    /**
+     * 院校录取数据 2021
+     */
+
+    /**
+     * 专业录取数据 2021
+     */
+
+    /**
+     * 招生计划数据 2022
+     * 
+     * @param collegeId
+     * @param Location
+     * @param ProvinceId
+     * @throws SQLException
+     */
+    public void plan() throws SQLException {
+        List<Entity> list = DbUtil.use().find(Arrays.asList("id", "collegeCodeGb", "provinceId"), Entity.create());
+        ApiUtil.getInstance().login();
+        for (Entity row : list) {
+            Integer collegeId = row.getInt("id");
+            plan(collegeId);
+        }
+
+    }
+
+    private void plan(Integer collegeId) {
+        long start = System.currentTimeMillis();
+        ThreadUtil.safeSleep(2 * 1000);
+        Integer year = 2022;
+        final String tableName = "sy_colledge_recruit_data_" + year;
+        try {
+            // 科类: 1理科(物理),0文科(历史)
+            List<Integer> liberalScienceList = Arrays.asList(0, 1);
+            List<Entity> entityList = new ArrayList<>();
+            for (Integer liberalScience : liberalScienceList) {
+                try {
+                    StringBuilder sb = new StringBuilder(host);
+                    sb.append("/query/majorPlan/byCollege");
+                    sb.append("?collegeId=").append(collegeId);
+                    sb.append("&liberalScience=").append(liberalScience);
+                    sb.append("&year=").append(year);
+                    sb.append("&pageIndex=").append(1);
+                    sb.append("&pageSize=").append(100);
+                    JSONObject res = ApiUtil.getInstance().httpSyncGet(sb.toString());
+                    if (res.getInteger("error") == 0) {
+                        JSONObject data = res.getJSONObject("data");
+                        JSONArray tdData = data.getJSONArray("tdData");
+                        JSONArray thData = data.getJSONArray("thData");
+                        // font
+                        Integer fontId = res.getJSONObject("font").getInteger("id");
+                        String fontValue = fontMap.get(fontId);
+                        for (int i = 0; i < tdData.size(); i++) {
+                            JSONObject row = tdData.getJSONObject(i);
+                            decrypt(row, fontId, thData);
+                            row.put("Location", "湖南");// 湖南
+                            row.put("font_id", fontId);
+                            row.put("font_value", fontValue);
+                            row.put("update_time", new Date());
+                            Entity entity = Entity.create(tableName);
+                            entity.putAll(row);
+                            entityList.add(entity);
+                        }
+                    }
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                }
+                if (CollectionUtil.isNotEmpty(entityList)) {
+                    DbUtil.use().del(Entity.create(tableName).set("CollegeID", collegeId).set("Year", year));
+                    DbUtil.use().insert(entityList);
+                }
+            }
+        } catch (SQLException e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            log.info("获取{},{}年招生计划数用时:{}", collegeId, year, DateUtil.formatBetween(System.currentTimeMillis() - start));
+        }
+    }
+
+    public static void main(String[] args) {
+        ApiUtil.getInstance().login();
+        new CollegeService().plan(1526);
+    }
+
+}

+ 7 - 0
src/main/java/com/mingxue/spider/jlzy/DataTransfer.java

@@ -0,0 +1,7 @@
+package com.mingxue.spider.jlzy;
+
+public class DataTransfer {
+ 
+    
+    
+}

+ 6 - 0
src/main/java/com/mingxue/spider/jlzy/UserService.java

@@ -0,0 +1,6 @@
+package com.mingxue.spider.jlzy;
+
+public class UserService extends Abstractservice {
+
+  
+}

+ 14 - 8
src/main/java/com/mingxue/spider/utils/HttpUtils.java

@@ -42,38 +42,44 @@ import com.alibaba.fastjson.JSON;
 public class HttpUtils {
     private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
 
-    public static String postBody(String postUrl, String body,String uSign) {
+    public static String postBody(String postUrl, String body, String uSign, String accessToken) {
         try {
             CloseableHttpClient httpClient = HttpClients.createDefault();
             HttpPost httpPost = new HttpPost(postUrl);
             httpPost.setEntity(new StringEntity(body, ContentType.APPLICATION_JSON));
-
-            if(StringUtils.isNotEmpty(uSign)){
+            if (StringUtils.isNotEmpty(uSign)) {
                 httpPost.setHeader("u-sign", uSign);
             }
+            if (StringUtils.isNotBlank(accessToken)) {
+                httpPost.setHeader("u-token", accessToken);
+            }
             httpPost.setHeader("Content-Type", "application/json");
             CloseableHttpResponse response = httpClient.execute(httpPost);
             String result = "";
             int statusCode = response.getStatusLine().getStatusCode();
             if (statusCode == 200 && response != null) {
                 HttpEntity httpEntity = response.getEntity();
-
                 // 如果返回的内容不为空
                 if (httpEntity != null) {
                     result = EntityUtils.toString(httpEntity);
                 }
+            }else {
+                
             }
-
             return result;
         } catch (Exception e) {
-            log.error("postUrl is {}",postUrl);
+            log.error("postUrl is {}", postUrl);
             log.error(e.getMessage(), e);
         }
-
         return "";
     }
+
+    public static String postBody(String postUrl, String body, String uSign) {
+        return postBody(postUrl, body, uSign, null);
+    }
+
     public static String postBody(String postUrl, String body) {
-        return postBody(postUrl,body,null);
+        return postBody(postUrl, body, null, null);
     }
 
     /**

+ 51 - 48
src/main/java/com/mingxue/spider/utils/UsignUtils.java

@@ -1,16 +1,16 @@
 package com.mingxue.spider.utils;
 
-import com.alibaba.fastjson.JSONObject;
-import com.mingxue.spider.helper.StringUtils;
-import jdk.nashorn.api.scripting.NashornScriptEngine;
-import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
-
 import java.io.FileReader;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.alibaba.fastjson.JSONObject;
+
+import jdk.nashorn.api.scripting.NashornScriptEngine;
+import jdk.nashorn.api.scripting.NashornScriptEngineFactory;
+
 public class UsignUtils {
-    public static String getUsign(String jsParam,String jsonParam){
+    public static String getUsign(String jsParam, String jsonParam) {
         String[] options = new String[] {"--language=es6"};
         NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
 
@@ -18,10 +18,10 @@ public class UsignUtils {
             NashornScriptEngine engine = getEngine();
             JSONObject jsonObject = JSONObject.parseObject(jsonParam);
 
-            String aaaa= "u_sign('"+jsParam+"',"+jsonObject+")";
+            String aaaa = "u_sign('" + jsParam + "'," + jsonObject + ")";
 
-            Object o = engine.eval("u_sign('"+jsParam+"',"+jsonParam+")");
-//            System.out.println("value : "+o);
+            Object o = engine.eval("u_sign('" + jsParam + "'," + jsonParam + ")");
+            // System.out.println("value : "+o);
             return o.toString();
         } catch (Exception e) {
             e.printStackTrace();
@@ -29,15 +29,15 @@ public class UsignUtils {
         }
     }
 
-    public static String getUsign(String jsParam){
+    public static String getUsign(String jsParam) {
         String[] options = new String[] {"--language=es6"};
         NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
 
         try {
             NashornScriptEngine engine = getEngine();
 
-            Object o = engine.eval("u_sign('"+jsParam+"')");
-//            System.out.println("value : "+o);
+            Object o = engine.eval("u_sign('" + jsParam + "')");
+            // System.out.println("value : "+o);
             return o.toString();
         } catch (Exception e) {
             e.printStackTrace();
@@ -45,23 +45,23 @@ public class UsignUtils {
         }
     }
 
-    public static NashornScriptEngine getEngine(){
+    public static NashornScriptEngine getEngine() {
         /* 1.首先引入js引擎 */
-//		ScriptEngineManager manager = new ScriptEngineManager();
-        //引擎名称传入JavaScript、js、javascript、nashorn、Nashorn 均可等价
-//		ScriptEngine engine = manager.getEngineByName("nashorn");
+        // ScriptEngineManager manager = new ScriptEngineManager();
+        // 引擎名称传入JavaScript、js、javascript、nashorn、Nashorn 均可等价
+        // ScriptEngine engine = manager.getEngineByName("nashorn");
 
         String[] options = new String[] {"--language=es6"};
         NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
-        NashornScriptEngine engine = (NashornScriptEngine) factory.getScriptEngine(options);
+        NashornScriptEngine engine = (NashornScriptEngine)factory.getScriptEngine(options);
 
         try {
-			/* 2.然后读取js文件 */
+            /* 2.然后读取js文件 */
             String path = Thread.currentThread().getContextClassLoader().getResource("").getPath(); // 获取targe路径
 
-//            String requestPath = "/youzy.dms.basiclib.api.career.job.hits.inc";
-//            String jobCode="02030502";
-//            params =requestPath+"?jobCode="+jobCode;
+            // String requestPath = "/youzy.dms.basiclib.api.career.job.hits.inc";
+            // String jobCode="02030502";
+            // params =requestPath+"?jobCode="+jobCode;
 
             engine.eval(new FileReader(path + "js/usign.js"));
 
@@ -72,46 +72,49 @@ public class UsignUtils {
         }
     }
 
-    public static String getRequestPathAndParam(String requestPath,Map<String,Object> paramMap){
-        StringBuilder parameter= new StringBuilder();
-        int i=0;
-        for(Map.Entry<String,Object> entry:paramMap.entrySet()){
-            if(i==0){
-                parameter.append("?");
-            }else {
-                parameter.append("&");
+    public static String getRequestPathAndParam(String api, Map<String, Object> params) {
+        if (null != params) {
+            StringBuilder parameter = new StringBuilder();
+            int i = 0;
+            for (Map.Entry<String, Object> entry : params.entrySet()) {
+                if (i == 0) {
+                    parameter.append("?");
+                } else {
+                    parameter.append("&");
+                }
+                parameter.append(entry.getKey()).append("=").append(entry.getValue());
+                i++;
             }
-            parameter.append(entry.getKey()).append("=").append(entry.getValue());
-            i++;
+            return api + parameter.toString();
+        } else {
+            return api;
         }
-        String jsParam = requestPath+parameter.toString();
-        return jsParam;
     }
 
-
     public static void main(String[] args) {
         String requestPath = "/youzy.dms.basiclib.api.career.job.hits.inc";
         String jobCode = "02030502";
-        Map<String,Object> paramMap =new HashMap<>();
-        paramMap.put("jobCode",jobCode);
-        System.out.println(getUsign(getRequestPathAndParam(requestPath,paramMap)));
+        Map<String, Object> paramMap = new HashMap<>();
+        paramMap.put("jobCode", jobCode);
+        System.out.println(getUsign(getRequestPathAndParam(requestPath, paramMap)));
 
         requestPath = "/youzy.dms.basiclib.api.major.tree.query";
         String eduLevel = "ben";
-        paramMap =new HashMap<>();
-        paramMap.put("eduLevel",eduLevel);
-        System.out.println(getUsign(getRequestPathAndParam(requestPath,paramMap)));
+        paramMap = new HashMap<>();
+        paramMap.put("eduLevel", eduLevel);
+        System.out.println(getUsign(getRequestPathAndParam(requestPath, paramMap)));
 
         requestPath = "/youzy.dms.basiclib.api.major.tree.query";
-        String jsonParam="{\"count\":5,\"rankType\":1,\"eduLevel\":\"ben\"}";
-        paramMap =new HashMap<>();
-        System.out.println(getUsign(getRequestPathAndParam(requestPath,paramMap),jsonParam));
+        String jsonParam = "{\"count\":5,\"rankType\":1,\"eduLevel\":\"ben\"}";
+        paramMap = new HashMap<>();
+        System.out.println(getUsign(getRequestPathAndParam(requestPath, paramMap), jsonParam));
 
-        //u-sign: f6a8052b16fbe01064e4c4e86441a642
+        // u-sign: f6a8052b16fbe01064e4c4e86441a642
         requestPath = "/youzy.dms.basiclib.api.college.query";
-        jsonParam="{\"keyword\":\"\",\"provinceNames\":[],\"natureTypes\":[],\"eduLevel\":\"\",\"categories\":[],\"features\":[],\"pageIndex\":%s,\"pageSize\":20,\"sort\":11}";
-        jsonParam = String.format(jsonParam,2);
-        paramMap =new HashMap<>();
-        System.out.println(getUsign(getRequestPathAndParam(requestPath,paramMap),jsonParam));
+        jsonParam =
+            "{\"keyword\":\"\",\"provinceNames\":[],\"natureTypes\":[],\"eduLevel\":\"\",\"categories\":[],\"features\":[],\"pageIndex\":%s,\"pageSize\":20,\"sort\":11}";
+        jsonParam = String.format(jsonParam, 2);
+        paramMap = new HashMap<>();
+        System.out.println(getUsign(getRequestPathAndParam(requestPath, paramMap), jsonParam));
     }
 }

+ 5 - 0
src/main/java/com/mingxue/spider/utils/WoffUtil.java

@@ -0,0 +1,5 @@
+package com.mingxue.spider.utils;
+
+public class WoffUtil {
+
+}

+ 73 - 0
src/main/java/com/mingxue/spider/youzy/AbstractService.java

@@ -0,0 +1,73 @@
+package com.mingxue.spider.youzy;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.mingxue.spider.helper.StringUtils;
+import com.mingxue.spider.utils.HttpUtils;
+import com.mingxue.spider.utils.UsignUtils;
+
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.lang.Dict;
+import cn.hutool.core.util.StrUtil;
+
+public class AbstractService {
+    protected Logger logger=LoggerFactory.getLogger(getClass());
+    private static String host = "https://uwf7de983aad7a717eb.youzy.cn";
+    private static String accessToken;
+
+    protected String getAccessToken() {
+        return accessToken;
+    }
+
+    protected void setAccessToken(String accessToken) {
+        AbstractService.accessToken = accessToken;
+    }
+
+    protected Object postBody(String api) {
+        return postBody(api, null);
+    }
+
+    protected Map<String, String> buildProvinceMap() {
+        List<String> lines = new ArrayList<>();
+        IoUtil.readUtf8Lines(getClass().getResourceAsStream("/yzy_province.txt"), lines);
+        Map<String, String> map = new LinkedHashMap<>(lines.size());
+        for (int i = 1; i < lines.size(); i++) {
+            String line = lines.get(i);
+            if (StringUtils.isNotBlank(line)) {
+                List<String> sub = StrUtil.splitTrim(line, ",");
+                map.put(sub.get(2), sub.get(1));
+            }
+        }
+        return map;
+    }
+
+    protected Object postBody(String api, Dict body) {
+        String requestPath = UsignUtils.getRequestPathAndParam(api, body);
+        String jsonBody = JSON.toJSONString(body);
+        String usign = StringUtils.EMPTY;
+        if (StringUtils.isBlank(jsonBody)) {
+            usign = UsignUtils.getUsign(requestPath);
+        } else {
+            usign = UsignUtils.getUsign(requestPath, jsonBody);
+        }
+        String url = host + requestPath;
+        String res = HttpUtils.postBody(url, jsonBody, usign, accessToken);
+        JSONObject json = JSONObject.parseObject(res);
+        if (json.getBooleanValue("isSuccess")) {
+            return json.get("result");
+        }
+        return json;
+    }
+
+    protected String decode(String encStr) {
+        return UsignUtils.getUsign(encStr);
+    }
+}

+ 72 - 0
src/main/java/com/mingxue/spider/youzy/PclService.java

@@ -0,0 +1,72 @@
+package com.mingxue.spider.youzy;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Dict;
+import cn.hutool.db.DbUtil;
+import cn.hutool.db.Entity;
+
+/**
+ * 批次线
+ * 
+ * @author Duzj
+ *
+ */
+public class PclService extends AbstractService {
+    private String api = "/youzy.dms.datalib.api.enrolldata.pcl.query";
+    private String tableName = "yzy_pcl";
+
+    public void getAll() {
+        long start = System.currentTimeMillis();
+        Map<String, String> pros = buildProvinceMap();
+        for (Entry<String, String> item : pros.entrySet()) {
+            getByProvince(item.getKey(), item.getValue(), 0);
+        }
+        logger.info("获取全国批次线数据用时:{}", DateUtil.formatBetween(System.currentTimeMillis() - start));
+    }
+
+    private void getByProvince(String code, String name, Integer yyyy) {
+        long start = System.currentTimeMillis();
+        Dict body = Dict.create().set("provinceCode", code).set("year", yyyy);
+        Object res = postBody(api, body);
+        JSONArray arr = (JSONArray)res;
+        for (int i = 0; i < arr.size(); i++) {
+            JSONObject item = arr.getJSONObject(i);
+            Integer year = item.getInteger("year");
+            JSONArray sub = item.getJSONArray("batches");
+            List<Entity> records = new ArrayList<>();;
+            for (int j = 0; j < sub.size(); j++) {
+                JSONObject row = sub.getJSONObject(j);
+                Entity entity = Entity.create(tableName);
+                entity.set("province_code", code).set("province_name", name);
+                entity.set("year", year).set("batch", row.getString("batch"));
+                entity.set("course", row.getString("course"));
+                entity.set("score", row.getDouble("score"));
+                entity.set("pressure_score", row.getDouble("pressureScore"));
+                entity.set("pressure_range", row.getString("pressureRange"));
+                records.add(entity);
+            }
+            try {
+                DbUtil.use().del(Entity.create(tableName).set("province_code", code).set("year", year));
+                DbUtil.use().insert(records);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        logger.info("获取[{}]省市批次线数据用时:{}", name, DateUtil.formatBetween(System.currentTimeMillis() - start));
+    }
+
+    public static void main(String[] args) {
+        // new PclService().getByProvince("51", "四川", 0);
+        long start = System.currentTimeMillis();
+        new PclService().getAll();
+        System.out.println(DateUtil.formatBetween(System.currentTimeMillis() - start));
+    }
+}

+ 54 - 0
src/main/java/com/mingxue/spider/youzy/ScoreService.java

@@ -0,0 +1,54 @@
+package com.mingxue.spider.youzy;
+
+import java.util.List;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.core.lang.Dict;
+
+/**
+ * 分数相当服务
+ * 
+ * @author Duzj
+ *
+ */
+public class ScoreService extends AbstractService {
+
+    /**
+     * @param provinceCode
+     * @return
+     */
+    public JSONObject planConfig(Integer provinceCode) {
+        String api = "/youzy.dms.datalib.api.enrolldata.plan.config.get?provinceCode=" + provinceCode;
+        JSONObject res = (JSONObject)postBody(api);
+        JSONArray arr = res.getJSONArray("years");
+        return null != arr && arr.size() > 0 ? arr.getJSONObject(0) : null;
+    }
+
+    public void plan(Integer provinceCode, String collegeCode, Integer year) {
+        JSONObject config = planConfig(provinceCode);
+        if (null == config || !year.equals(config.getInteger("year"))) {
+            return;
+        }
+        String api = "/youzy.dms.datalib.api.enrolldata.plan.encrypted.v2.query";
+        List<String> courses = config.getJSONArray("course").toJavaList(String.class);
+        List<String> batchs = config.getJSONArray("batch").toJavaList(String.class);
+        for (String course : courses) {
+            for (String batch : batchs) {
+                Dict body = Dict.create().set("collegeCode", collegeCode).set("year", year);
+                body.set("provinceCode", provinceCode).set("course", course).set("batch", batch);
+                JSONObject res = (JSONObject)postBody(api, body);
+                JSONArray rows = res.getJSONArray("uCodes");
+                if (null == rows || rows.size() == 0) {
+                    continue;
+                }
+                rows = JSON.parseArray(decode(rows.toJSONString()));
+                System.out.println(rows);
+            }
+        }
+
+    }
+
+}

+ 27 - 0
src/main/java/com/mingxue/spider/youzy/UserService.java

@@ -0,0 +1,27 @@
+package com.mingxue.spider.youzy;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.core.lang.Dict;
+
+public class UserService extends AbstractService {
+
+    public void validate(String mobile, String password) {
+        if (StringUtils.isNotBlank(getAccessToken())) {
+            return;
+        }
+        String api = "/tocusers/youzy.toc.user.login.validate";
+        Dict body = Dict.create();
+        body.set("username", mobile).set("password", password);
+        JSONObject res = (JSONObject)postBody(api, body);
+        if (res.containsKey("validateUserOutput")) {
+            JSONObject user = res.getJSONObject("validateUserOutput");
+            JSONObject token = user.getJSONObject("userToken");
+            setAccessToken(token.getString("accessToken"));
+        } else {
+            System.out.println(res);
+        }
+    }
+}

+ 13 - 0
src/main/java/com/mingxue/spider/youzy/YouZyServer.java

@@ -0,0 +1,13 @@
+package com.mingxue.spider.youzy;
+
+public class YouZyServer {
+
+    private static UserService userService = new UserService();
+
+    private static ScoreService scoreService = new ScoreService();
+
+    public static void main(String[] args) {
+        userService.validate("17307497333", "Xj123456");
+        scoreService.plan(43, "10013", 2021);
+    }
+}

BIN
src/main/resources/templates/fonts/yfe2.ttf


BIN
src/main/resources/templates/fonts/yfe2.woff2


+ 31 - 0
src/main/resources/yzy_province.txt

@@ -0,0 +1,31 @@
+id,name,code
+844,安徽,34 
+834,北京,11 
+854,重庆,50 
+845,福建,35 
+851,广东,44 
+852,广西,45 
+860,甘肃,62 
+856,贵州,52 
+1128,河北,13
+848,河南,41 
+853,海南,46 
+849,湖北,42 
+850,湖南,43 
+841,黑龙江,23
+840,吉林,22 
+1,江苏,32
+846,江西,36 
+839,辽宁,21 
+838,内蒙古,15
+862,宁夏,64 
+861,青海,63 
+842,上海,31 
+855,四川,51 
+847,山东,37 
+837,山西,14 
+859,陕西,61 
+835,天津,12 
+1120,新疆,65
+857,云南,53 
+843,浙江,33