更新太多了,主要是代码结构的一些调整,一方面是service包下只保留请求部分,解析由调用方自行调用(因为存在部分只需要请求而不需要解析的情况),将本科教学系统的功能api拆分成不同的类,调用者可按需生成实例,api接口异常改用通用的业务异常
parent
3bc1df9836
commit
f3aa0d4be0
@ -1,38 +1,105 @@ |
||||
package cn.linghang.mywust.core.exception; |
||||
|
||||
public class ApiException extends BasicException { |
||||
private final int code; |
||||
private final Code code; |
||||
|
||||
public ApiException(int code) { |
||||
public ApiException(Code code) { |
||||
this.code = code; |
||||
} |
||||
|
||||
public ApiException(int code, String message) { |
||||
public ApiException(Code code, String message) { |
||||
super(message); |
||||
this.code = code; |
||||
} |
||||
|
||||
public int getCode() { |
||||
public Code getCode() { |
||||
return code; |
||||
} |
||||
|
||||
public int getCodeValue() { |
||||
return code.value; |
||||
} |
||||
|
||||
public String getCodeDescribe() { |
||||
return code.describe; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return "接口调用异常: " + code; |
||||
} |
||||
|
||||
public static class ApiExceptionCode { |
||||
// 统一认证的异常
|
||||
public static final int UNI_LOGIN_PASSWORD_WRONG = 100101; |
||||
public static final int UNI_LOGIN_USER_NOT_EXISTS = 100102; |
||||
public static final int UNI_LOGIN_USER_BANNED = 100103; |
||||
public enum Code { |
||||
/** |
||||
* 未知的API异常 |
||||
*/ |
||||
UNKNOWN_EXCEPTION(-1, "未知错误(开发又有活干啦)"), |
||||
|
||||
// --------------------------------
|
||||
// 统一认证的异常(本科生、图书馆)
|
||||
|
||||
/** |
||||
* 密码错误 |
||||
*/ |
||||
UNI_LOGIN_PASSWORD_WRONG(100100, "统一认证登录: 密码错误"), |
||||
|
||||
/** |
||||
* 用户不存在 |
||||
*/ |
||||
UNI_LOGIN_USER_NOT_EXISTS(100101, "统一认证登录: 用户不存在"), |
||||
|
||||
/** |
||||
* 用户登录被封禁 |
||||
*/ |
||||
UNI_LOGIN_USER_BANNED(100102, "统一认证登录: 用户被封禁"), |
||||
|
||||
// --------------------------------
|
||||
// 共有异常码:cookie无效
|
||||
// 放一起了
|
||||
public static final int BKJX_COOKIE_INVALID = 110101; |
||||
public static final int LIBRARY_COOKIE_INVALID = 12101; |
||||
public static final int PHYSICS_COOKIE_INVALID = 130101; |
||||
public static final int GRADE_COOKIE_INVALID = 140101; |
||||
|
||||
/** |
||||
* Cookie无效 |
||||
*/ |
||||
COOKIE_INVALID(100101, "Cookie无效"), |
||||
|
||||
// --------------------------------
|
||||
// 本科生API异常代码
|
||||
|
||||
/** |
||||
* 需要评教 |
||||
*/ |
||||
BKJX_COURSE_NEED_EVALUATE(110102, "需要评教"), |
||||
|
||||
// --------------------------------
|
||||
// 物理实验系统API异常代码
|
||||
|
||||
/** |
||||
* 物理实验系统密码错误 |
||||
*/ |
||||
PHYSICS_PASSWORD_WRONG(130100, "物理实验系统登录: 密码错误"), |
||||
|
||||
// --------------------------------
|
||||
// 研究生API异常代码
|
||||
|
||||
/** |
||||
* 研究生密码错误 |
||||
*/ |
||||
GRADUATE_PASSWORD_WRONG(140100, "研究生登录: 密码错误"), |
||||
; |
||||
|
||||
// --------------------------------
|
||||
// 图书馆API异常代码
|
||||
|
||||
private final int value; |
||||
private final String describe; |
||||
|
||||
Code(int value, String describe) { |
||||
this.value = value; |
||||
this.describe = describe; |
||||
} |
||||
|
||||
@Override |
||||
public String toString() { |
||||
return String.format("%s(%d)", describe, value); |
||||
} |
||||
} |
||||
} |
@ -1,14 +0,0 @@ |
||||
package cn.linghang.mywust.core.exception; |
||||
|
||||
public class CookieInvalidException extends BasicException { |
||||
public CookieInvalidException() { |
||||
} |
||||
|
||||
public CookieInvalidException(String message) { |
||||
super(message); |
||||
} |
||||
|
||||
public CookieInvalidException(String message, Throwable cause) { |
||||
super(message, cause); |
||||
} |
||||
} |
@ -1,14 +0,0 @@ |
||||
package cn.linghang.mywust.core.exception; |
||||
|
||||
public class PasswordWornException extends BasicException { |
||||
public PasswordWornException() { |
||||
} |
||||
|
||||
public PasswordWornException(String message) { |
||||
super(message); |
||||
} |
||||
|
||||
public PasswordWornException(String message, Throwable cause) { |
||||
super(message, cause); |
||||
} |
||||
} |
@ -1,4 +1,4 @@ |
||||
package cn.linghang.mywust.core.parser.postgraduate; |
||||
package cn.linghang.mywust.core.parser.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
||||
package cn.linghang.mywust.core.parser.postgraduate; |
||||
package cn.linghang.mywust.core.parser.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
||||
package cn.linghang.mywust.core.parser.postgraduate; |
||||
package cn.linghang.mywust.core.parser.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.Parser; |
@ -1,4 +1,4 @@ |
||||
package cn.linghang.mywust.core.parser.postgraduate; |
||||
package cn.linghang.mywust.core.parser.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.Parser; |
@ -1,13 +0,0 @@ |
||||
package cn.linghang.mywust.core.parser.physics.xpath; |
||||
|
||||
public class PhysicsCourseXpath { |
||||
/** |
||||
* 用于获取表格中所有行的xpath |
||||
* */ |
||||
public static final String COURSE_ROWS_XPATH = "//*[@id=\"ID_PEE110301_gvpee120101\"]/tbody/tr"; |
||||
|
||||
public static final String COURSE_ROW_NAME_XPATH = ""; |
||||
public static final String COURSE_ROW_TEACHER_XPATH = ""; |
||||
public static final String COURSE_ROW_TIME_XPATH = ""; |
||||
public static final String COURSE_ROW_CLASSROOM_XPATH = ""; |
||||
} |
@ -1,5 +0,0 @@ |
||||
package cn.linghang.mywust.core.parser.physics.xpath; |
||||
|
||||
public class PhysicsIndexXpath { |
||||
public static final String PHYSICS_LINK_XPATH = "//*[@id=\"rolemenu\"]/tbody/tr[1]/td[1]/a[2]"; |
||||
} |
@ -1,5 +0,0 @@ |
||||
package cn.linghang.mywust.core.parser.undergraduate.xpath; |
||||
|
||||
public class ExamInfoXpath { |
||||
public static final String EXAM_INFO_ROWS_XPATH = "//*[@id=\"dataList\"]/tbody/tr"; |
||||
} |
@ -1,31 +0,0 @@ |
||||
package cn.linghang.mywust.core.parser.undergraduate.xpath; |
||||
|
||||
/** |
||||
* <p>本科生学生信息接口用到的xpath</p> |
||||
* <p>看着挺唬人的,其实直接浏览器选择元素复制xpath就行了</p> |
||||
* <p>这里的xpath只要网站UI不整什么花活就不会出问题</p> |
||||
* |
||||
* @author lensfrex |
||||
* @create 2022-10-22 22:16 |
||||
*/ |
||||
public class StudentInfoXpath { |
||||
public static final String STUDENT_NUMBER = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[5]"; |
||||
|
||||
public static final String COLLEGE = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[1]"; |
||||
|
||||
public static final String MAJOR = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[2]"; |
||||
|
||||
public static final String CLASS = "//*[@id=\"xjkpTable\"]/tbody/tr[3]/td[4]"; |
||||
|
||||
public static final String NAME = "//*[@id=\"xjkpTable\"]/tbody/tr[4]/td[2]"; |
||||
|
||||
public static final String SEX = "//*[@id=\"xjkpTable\"]/tbody/tr[4]/td[4]"; |
||||
|
||||
public static final String BIRTHDAY = "//*[@id=\"xjkpTable\"]/tbody/tr[5]/td[2]"; |
||||
|
||||
public static final String HOMETOWN = "//*[@id=\"xjkpTable\"]/tbody/tr[7]/td[2]"; |
||||
|
||||
public static final String NATIONALITY = "//*[@id=\"xjkpTable\"]/tbody/tr[8]/td[4]"; |
||||
|
||||
public static final String ID_NUMBER = "//*[@id=\"xjkpTable\"]/tbody/tr[50]/td[4]"; |
||||
} |
@ -0,0 +1,30 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class BaseInfo { |
||||
|
||||
@JsonProperty("map") |
||||
private Map map; |
||||
|
||||
@JsonProperty("empty") |
||||
private boolean empty; |
||||
|
||||
public void setMap(Map map) { |
||||
this.map = map; |
||||
} |
||||
|
||||
public Map getMap() { |
||||
return map; |
||||
} |
||||
|
||||
public void setEmpty(boolean empty) { |
||||
this.empty = empty; |
||||
} |
||||
|
||||
public boolean isEmpty() { |
||||
return empty; |
||||
} |
||||
} |
@ -0,0 +1,30 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class DetailInfo { |
||||
|
||||
@JsonProperty("map") |
||||
private Map map; |
||||
|
||||
@JsonProperty("empty") |
||||
private boolean empty; |
||||
|
||||
public void setMap(Map map) { |
||||
this.map = map; |
||||
} |
||||
|
||||
public Map getMap() { |
||||
return map; |
||||
} |
||||
|
||||
public void setEmpty(boolean empty) { |
||||
this.empty = empty; |
||||
} |
||||
|
||||
public boolean isEmpty() { |
||||
return empty; |
||||
} |
||||
} |
@ -0,0 +1,30 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class ExtraInfo { |
||||
|
||||
@JsonProperty("map") |
||||
private Map map; |
||||
|
||||
@JsonProperty("empty") |
||||
private boolean empty; |
||||
|
||||
public void setMap(Map map) { |
||||
this.map = map; |
||||
} |
||||
|
||||
public Map getMap() { |
||||
return map; |
||||
} |
||||
|
||||
public void setEmpty(boolean empty) { |
||||
this.empty = empty; |
||||
} |
||||
|
||||
public boolean isEmpty() { |
||||
return empty; |
||||
} |
||||
} |
@ -0,0 +1,49 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class LoanResultItem { |
||||
@JsonProperty("bibId") |
||||
private String bookId; |
||||
|
||||
@JsonProperty("bibAttrs") |
||||
private BookAttribute bookAttribute; |
||||
|
||||
@JsonProperty("returnDate") |
||||
private String returnDate; |
||||
|
||||
@JsonProperty("loanDate") |
||||
private String loanDate; |
||||
|
||||
@JsonProperty("location") |
||||
private String location; |
||||
|
||||
@JsonProperty("barCode") |
||||
private String barCode; |
||||
|
||||
@Data |
||||
public static class BookAttribute { |
||||
@JsonProperty("pub_year") |
||||
private String publishYear; |
||||
|
||||
@JsonProperty("author") |
||||
private String author; |
||||
|
||||
@JsonProperty("callno") |
||||
private String callNumber; |
||||
|
||||
@JsonProperty("isbn") |
||||
private String isbn; |
||||
|
||||
@JsonProperty("classno") |
||||
private String classNumber; |
||||
|
||||
@JsonProperty("publisher") |
||||
private String publisher; |
||||
|
||||
@JsonProperty("title") |
||||
private String title; |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class Map { |
||||
@JsonProperty("baseInfo") |
||||
private BaseInfo baseInfo; |
||||
|
||||
@JsonProperty("detailInfo") |
||||
private DetailInfo detailInfo; |
||||
|
||||
@JsonProperty("extraInfo") |
||||
private ExtraInfo extraInfo; |
||||
|
||||
@JsonProperty("score") |
||||
private int score; |
||||
|
||||
@JsonProperty("_clickCount") |
||||
private int clickCount; |
||||
|
||||
@JsonProperty("collected") |
||||
private boolean collected; |
||||
|
||||
@JsonProperty("出版发行项") |
||||
private String publisher; |
||||
|
||||
@JsonProperty("个人责任者") |
||||
private String author; |
||||
|
||||
@JsonProperty("提要文摘附注") |
||||
private String describe; |
||||
|
||||
@JsonProperty("ISBN及定价") |
||||
private String isbn; |
||||
|
||||
@JsonProperty("载体形态项") |
||||
private String size; |
||||
|
||||
@JsonProperty("学科主题") |
||||
private String category; |
||||
|
||||
@JsonProperty("使用对象附注") |
||||
private String reader; |
||||
|
||||
@JsonProperty("责任者附注") |
||||
private String authorDescribe; |
||||
|
||||
@JsonProperty("中图法分类号") |
||||
private String clcNumber; |
||||
|
||||
@JsonProperty("著录信息附注") |
||||
private String publishNotes; |
||||
|
||||
@JsonProperty("丛编项") |
||||
private String series; |
||||
|
||||
@JsonProperty("题名/责任者") |
||||
private String fullTitle; |
||||
|
||||
@JsonProperty("title") |
||||
private String title; |
||||
} |
@ -0,0 +1,17 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
|
||||
public class Response{ |
||||
|
||||
@JsonProperty("map") |
||||
private Map map; |
||||
|
||||
public void setMap(Map map){ |
||||
this.map = map; |
||||
} |
||||
|
||||
public Map getMap(){ |
||||
return map; |
||||
} |
||||
} |
@ -0,0 +1,150 @@ |
||||
package cn.linghang.mywust.core.request.library.response; |
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty; |
||||
import lombok.Data; |
||||
|
||||
import java.util.List; |
||||
|
||||
@Data |
||||
public class SearchResultItem { |
||||
/** |
||||
* 图书id |
||||
*/ |
||||
@JsonProperty("bibId") |
||||
private String bookId; |
||||
|
||||
/** |
||||
* 作者 |
||||
*/ |
||||
@JsonProperty("author") |
||||
private String author; |
||||
|
||||
/** |
||||
* 索书号 |
||||
*/ |
||||
@JsonProperty("callno") |
||||
private List<String> callNumber; |
||||
|
||||
/** |
||||
* doc类型 |
||||
*/ |
||||
@JsonProperty("docType") |
||||
private String docType; |
||||
|
||||
/** |
||||
* 分组id |
||||
*/ |
||||
@JsonProperty("groupId") |
||||
private String groupId; |
||||
|
||||
/** |
||||
* ISBN号 |
||||
*/ |
||||
@JsonProperty("isbn") |
||||
private String isbn; |
||||
|
||||
@JsonProperty("bibNo") |
||||
private String bibNo; |
||||
|
||||
/** |
||||
* 标题 |
||||
*/ |
||||
@JsonProperty("title") |
||||
private String title; |
||||
|
||||
/** |
||||
* 图书总数 |
||||
*/ |
||||
@JsonProperty("itemCount") |
||||
private int itemCount; |
||||
|
||||
/** |
||||
* 可借数 |
||||
*/ |
||||
@JsonProperty("circCount") |
||||
private int circCount; |
||||
|
||||
/** |
||||
* 出版年 |
||||
*/ |
||||
@JsonProperty("pub_year") |
||||
private String publishYear; |
||||
|
||||
/** |
||||
* 分类号 |
||||
*/ |
||||
@JsonProperty("classno") |
||||
private String classNumber; |
||||
|
||||
/** |
||||
* 出版商 |
||||
*/ |
||||
@JsonProperty("publisher") |
||||
private String publisher; |
||||
|
||||
/** |
||||
* 馆藏信息,原始数据为json字符串 |
||||
*/ |
||||
@JsonProperty("holdings") |
||||
private String collectionInfo; |
||||
|
||||
/** |
||||
* 馆藏信息 |
||||
*/ |
||||
@Data |
||||
public static class CollectionInfo { |
||||
/** |
||||
* 索书号 |
||||
*/ |
||||
@JsonProperty("callNo") |
||||
private String callNumber; |
||||
|
||||
/** |
||||
* 馆藏总数 |
||||
*/ |
||||
@JsonProperty("itemsCount") |
||||
private int itemsCount; |
||||
|
||||
/** |
||||
* 图书条码 |
||||
*/ |
||||
@JsonProperty("barCode") |
||||
private String barCode; |
||||
|
||||
/** |
||||
* 可借状态 |
||||
*/ |
||||
@JsonProperty("circStatus") |
||||
private int circStatus; |
||||
|
||||
/** |
||||
* 书籍分卷信息 |
||||
*/ |
||||
@JsonProperty("vol") |
||||
private String vol; |
||||
|
||||
/** |
||||
* 图书可借状态 |
||||
*/ |
||||
@JsonProperty("itemsAvailable") |
||||
private int itemsAvailable; |
||||
|
||||
/** |
||||
* 所属馆藏地 |
||||
*/ |
||||
@JsonProperty("location") |
||||
private String location; |
||||
|
||||
/** |
||||
* 捐赠者id |
||||
*/ |
||||
@JsonProperty("donatorId") |
||||
private Object donatorId; |
||||
|
||||
/** |
||||
* 状态信息 |
||||
*/ |
||||
@JsonProperty("status") |
||||
private String status; |
||||
} |
||||
} |
@ -0,0 +1,36 @@ |
||||
package cn.linghang.mywust.core.service.graduate; |
||||
|
||||
import cn.linghang.mywust.core.api.Graduate; |
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.RequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class GraduateApiService { |
||||
protected final Requester requester; |
||||
|
||||
public GraduateApiService(Requester requester) { |
||||
this.requester = requester; |
||||
} |
||||
|
||||
public void checkResponse(HttpResponse response) throws ApiException { |
||||
// 检查响应是否正确
|
||||
if (response.getBody() == null || |
||||
response.getStatusCode() != HttpResponse.HTTP_OK || |
||||
new String(response.getBody()).contains("name=\"_ctl0:txtpassword\"")) { |
||||
|
||||
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||
} |
||||
} |
||||
|
||||
public void checkCookies(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||
HttpRequest request = RequestFactory.makeHttpRequest(Graduate.GRADUATE_INDEX_TEST_API, null, cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
|
||||
this.checkResponse(response); |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
package cn.linghang.mywust.core.service.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class GraduateCourseTableApiService extends GraduateApiService{ |
||||
|
||||
public GraduateCourseTableApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||
HttpRequest request = GraduateRequestFactory.courseTableRequest(cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
package cn.linghang.mywust.core.service.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class GraduateScoreApiService extends GraduateApiService{ |
||||
|
||||
public GraduateScoreApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||
HttpRequest request = GraduateRequestFactory.examScoreInfoRequest(cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
package cn.linghang.mywust.core.service.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class GraduateStudentInfoApiService extends GraduateApiService { |
||||
|
||||
public GraduateStudentInfoApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getStudentInfoPage(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||
HttpRequest request = GraduateRequestFactory.studentInfoRequest(cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
package cn.linghang.mywust.core.service.graduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.graduate.GraduateRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class GraduateTrainingPlanApiService extends GraduateApiService{ |
||||
|
||||
public GraduateTrainingPlanApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getCourseTablePage(String cookie, RequestClientOption option) throws IOException, ApiException { |
||||
HttpRequest request = GraduateRequestFactory.trainingPlanPageRequest(cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -1,4 +1,4 @@ |
||||
package cn.linghang.mywust.core.service.library; |
||||
|
||||
public class LibraryService { |
||||
public class LibraryApiService { |
||||
} |
@ -0,0 +1,31 @@ |
||||
package cn.linghang.mywust.core.service.physics; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.physics.PhysicsSystemRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class PhysicsApiService { |
||||
private final Requester requester; |
||||
|
||||
public PhysicsApiService(Requester requester) { |
||||
this.requester = requester; |
||||
} |
||||
|
||||
public String getCoursePage(String cookie, RequestClientOption requestClientOption) throws IOException, ApiException { |
||||
requestClientOption.setFallowUrlRedirect(false); |
||||
|
||||
// 请求真正的课表页
|
||||
HttpRequest coursePageRequest = PhysicsSystemRequestFactory.physicsCourseRequest(cookie); |
||||
HttpResponse courseResponse = requester.get(coursePageRequest, requestClientOption); |
||||
if (courseResponse.getStatusCode() != HttpResponse.HTTP_OK) { |
||||
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||
} |
||||
|
||||
return new String(courseResponse.getBody()); |
||||
} |
||||
} |
@ -1,38 +0,0 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.undergraduate.StudentInfoPageParser; |
||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||
import cn.linghang.mywust.model.global.StudentInfo; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class StudentInfoApi extends UndergraduateApi { |
||||
private final Requester requester; |
||||
|
||||
private static final StudentInfoPageParser parser = new StudentInfoPageParser(); |
||||
|
||||
public StudentInfoApi(Requester requester) { |
||||
this.requester = requester; |
||||
} |
||||
|
||||
public String getStudentInfoPage(String cookies, RequestClientOption requestOption) throws IOException, CookieInvalidException { |
||||
HttpRequest request = BkjxRequestFactory.studentInfoRequest(cookies); |
||||
HttpResponse response = requester.get(request, requestOption); |
||||
|
||||
checkResponse(response, cookies); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
|
||||
public StudentInfo getStudentInfo(String cookies, RequestClientOption requestOption) throws IOException, CookieInvalidException, ParseException { |
||||
String studentInfoPage = this.getStudentInfoPage(cookies, requestOption); |
||||
|
||||
return parser.parse(studentInfoPage); |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class StudentInfoApiService extends UndergraduateApiService { |
||||
|
||||
public StudentInfoApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getStudentInfoPage(String cookies, RequestClientOption requestOption) throws IOException, ApiException { |
||||
HttpRequest request = BkjxRequestFactory.studentInfoRequest(cookies); |
||||
HttpResponse response = requester.get(request, requestOption); |
||||
|
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -1,36 +0,0 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
||||
import cn.linghang.mywust.core.exception.ParseException; |
||||
import cn.linghang.mywust.core.parser.undergraduate.TrainingPlanPageParser; |
||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class TrainingPlanApi extends UndergraduateApi { |
||||
private final Requester requester; |
||||
|
||||
private static final TrainingPlanPageParser parser = new TrainingPlanPageParser(); |
||||
|
||||
public TrainingPlanApi(Requester requester) { |
||||
this.requester = requester; |
||||
} |
||||
|
||||
public String getTrainingPlanPage(String cookies, RequestClientOption requestClientOption) throws CookieInvalidException, IOException { |
||||
HttpRequest request = BkjxRequestFactory.trainingPlanPageRequest(cookies); |
||||
HttpResponse response = requester.get(request, requestClientOption); |
||||
|
||||
checkResponse(response, cookies); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
|
||||
public String getPrueSchemePage(String cookies, RequestClientOption requestClientOption) throws IOException, CookieInvalidException, ParseException { |
||||
String fullPage = this.getTrainingPlanPage(cookies, requestClientOption); |
||||
return parser.parse(fullPage); |
||||
} |
||||
} |
@ -0,0 +1,26 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class TrainingPlanApiService extends UndergraduateApiService { |
||||
|
||||
public TrainingPlanApiService(Requester requester) { |
||||
super(requester); |
||||
} |
||||
|
||||
public String getTrainingPlanPage(String cookies, RequestClientOption requestClientOption) throws IOException, ApiException { |
||||
HttpRequest request = BkjxRequestFactory.trainingPlanPageRequest(cookies); |
||||
HttpResponse response = requester.get(request, requestClientOption); |
||||
|
||||
super.checkResponse(response); |
||||
|
||||
return new String(response.getBody()); |
||||
} |
||||
} |
@ -1,17 +0,0 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.exception.CookieInvalidException; |
||||
import cn.linghang.mywust.core.util.BkjxUtil; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
public class UndergraduateApi { |
||||
public void checkResponse(HttpResponse response, String cookies) throws CookieInvalidException { |
||||
// 检查响应是否正确
|
||||
if (response.getBody() == null || |
||||
response.getStatusCode() != HttpResponse.HTTP_OK || |
||||
BkjxUtil.checkLoginFinger(response.getBody())) { |
||||
|
||||
throw new CookieInvalidException("响应无效,cookie可能过期:" + cookies); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,38 @@ |
||||
package cn.linghang.mywust.core.service.undergraduate; |
||||
|
||||
import cn.linghang.mywust.core.api.Bkjx; |
||||
import cn.linghang.mywust.core.exception.ApiException; |
||||
import cn.linghang.mywust.core.request.RequestFactory; |
||||
import cn.linghang.mywust.core.request.undergrade.BkjxRequestFactory; |
||||
import cn.linghang.mywust.core.util.BkjxUtil; |
||||
import cn.linghang.mywust.network.RequestClientOption; |
||||
import cn.linghang.mywust.network.Requester; |
||||
import cn.linghang.mywust.network.entitys.HttpRequest; |
||||
import cn.linghang.mywust.network.entitys.HttpResponse; |
||||
|
||||
import java.io.IOException; |
||||
|
||||
public class UndergraduateApiService { |
||||
protected final Requester requester; |
||||
|
||||
public UndergraduateApiService(Requester requester) { |
||||
this.requester = requester; |
||||
} |
||||
|
||||
public void checkResponse(HttpResponse response) throws ApiException { |
||||
// 检查响应是否正确
|
||||
if (response.getBody() == null || |
||||
response.getStatusCode() != HttpResponse.HTTP_OK || |
||||
BkjxUtil.checkLoginFinger(response.getBody())) { |
||||
|
||||
throw new ApiException(ApiException.Code.COOKIE_INVALID); |
||||
} |
||||
} |
||||
|
||||
public void checkCookies(String cookie, RequestClientOption option) throws ApiException, IOException { |
||||
HttpRequest request = RequestFactory.makeHttpRequest(Bkjx.BKJX_TEST_API, null, cookie); |
||||
HttpResponse response = requester.get(request, option); |
||||
|
||||
this.checkResponse(response); |
||||
} |
||||
} |
@ -0,0 +1,27 @@ |
||||
package cn.linghang.mywust.core.util; |
||||
|
||||
import org.jsoup.Jsoup; |
||||
import org.jsoup.nodes.Document; |
||||
import org.jsoup.nodes.Element; |
||||
import org.jsoup.select.Elements; |
||||
|
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* html页面表单参数提取,用于简化部分繁琐的表单数据生成,模拟网页表单数据的请求参数 |
||||
*/ |
||||
public class PageFormExtractor { |
||||
public static void extractToMap(String html, String formId, Map<String, String> targetMap) { |
||||
Document page = Jsoup.parse(html); |
||||
Element form = page.getElementById(formId); |
||||
if (form == null) { |
||||
throw new NullPointerException("The Form Doesn't exist."); |
||||
} |
||||
|
||||
Elements formElements = form.getElementsByAttribute("name"); |
||||
|
||||
for (Element element : formElements) { |
||||
targetMap.put(element.attr("name"), element.attr("value")); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,2 @@ |
||||
public class UnderGraduateTest { |
||||
} |
Loading…
Reference in new issue