内蒙古大学教务系统工具包

发布于 2017-12-21  69 次阅读


项目源码:https://github.com/likole/NewJwxtTool

请访问新项目https://github.com/likole/JwxtTool_V2


最近学校更换了教务系统,很多漏洞都无法利用了功能更加完善,因此重新写了个工具包.该工具包只是为了通过代码方式使用教务系统,而不是抢课脚本,如不合理使用造成的后果,概不负责~

代码示例

选课(19年教务系统验证码已无法绕过,下面代码需要更改登录部分)

import cn.likole.jwxt.Jwxt;
import cn.likole.jwxt.entity.Exam;

import java.io.IOException;
import java.util.List;

/**
 * Created by likole on 8/27/18.
 * /student/courseSelect/planCourse/index?fajhh=32906
 */
public class SelectCourse {

    public static void main(String[] args) throws InterruptedException, IOException {

        final Jwxt jwxt = new Jwxt();

        String[] baseUrls={"http://jwxt.imu.edu.cn","http://183.175.40.48:7874","http://183.175.40.48:7873","http://183.175.40.48:7872"};
        int index=0;

        //登陆
        while (true) {
            try {
                jwxt.setBaseUrl(baseUrls[index]);
                index=(index+1)%baseUrls.length;
                if (jwxt.login("**********", "*********", "error")) break;
                System.out.println("!!!");
                Thread.sleep(100);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        List<Exam> exams= jwxt.examPlan();
        for (Exam exam:exams){
            System.out.println(exam);
        }


        //监测选课结果
        new Thread(new Runnable() {
            public void run() {
                try {
                    while (true) {
                        System.out.println(jwxt.selectResult());
                        Thread.sleep(500);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        //选课
            jwxt.selectLesson("140440250", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140450360", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140451530", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140451350", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140450370", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140452450", "01", "2018-2019-2-2");
//            jwxt.selectLesson("130410052", "16", "2018-2019-2-2");
//            jwxt.selectLesson("190310020", "25", "2018-2019-2-2");

//            jwxt.selectLesson("140440250", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140450360", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140451350", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140451340", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140452450", "01", "2018-2019-2-2");
//            jwxt.selectLesson("130410052", "16", "2018-2019-2-2");
//            jwxt.selectLesson("190310020", "25", "2018-2019-2-2");

//            jwxt.selectLesson("140441180", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140441230", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140430110", "01", "2018-2019-2-2");
//            jwxt.selectLesson("140451320", "01", "2018-2019-2-2");
//            jwxt.selectLesson("130410040", "12", "2018-2019-2-2");
//            jwxt.selectLesson("120410024", "01", "2018-2019-2-2");

            System.out.println("2");

    }
}

使用教程

实例化对象

一个对象对应着一个session,如果对同一个账号操作,请操作同一个对象

cn.likole.jwxt.Jwxt jwxt=new cn.likole.jwxt.Jwxt();

设置地址

默认地址为"http://jwxt.imu.edu.cn"

jwxt.setBaseUrl("http://jwxt.imu.edu.cn");

获取验证码

将验证码下载到本地,有两种.

jwxt.getCapture();//第一种 默认下载到capture.jpg
jwxt.getCapture("capture.jpg");//第二种 指定文件名(也可为路径)

当函数返回或输出提示"Please input the capture:",表示已下载完成

登录

jwxt.login("**********","******",capture);//用户名,密码,验证码

关于验证码

1.采用手工方式,先下载验证码,再手工填写登陆
示例:

  cn.likole.jwxt.Jwxt jwxt=new cn.likole.jwxt.Jwxt();
  Scanner scanner=new Scanner(System.in);

   //登陆
   while(true){
       jwxt.getCapture();
       String capture=scanner.next();
       if(jwxt.login("**********","******",capture)) break;
   }

2.验证码识别服务

选课

//方案计划号,例如秋季学期"2017-2018-1-2",春季学期"2017-2018-2-2",夏季学期
//第一种 分别为课程号,课序号,方案计划号,课程名
jwxt.selectLesson("110220070","01","2017-2018-2-2","北方民族文物与考古(A模块)")
//第二种 分别为课程id和课程名
jwxt.selectLesson("110220070_01_2017-2018-2-2","北方民族文物与考古(A模块)_01") 
//第二种支持一次多门课程,以逗号分隔
jwxt.selectLesson("110220070_01_2017-2018-2-2,150120060_01_2017-2018-2-2","北方民族文物与考古(A模块)_01,化学视角下的多元世界(D模块)_01") 

注意:函数的返回值只表示选课请求是否发送并成功收到服务器响应,并不代表选课成功

查看选课结果

仅返回最近一次调用selectLesson()进行选课的结果,暂时只支持一次10门以内

jwxt.selectResult(); //返回数据为原始json数据,自行解析

监测选课结果示例

new Thread(new Runnable() {
    public void run() {
        try {
                while (true){
                    System.out.println(jwxt.selectResult());
                    Thread.sleep(200);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    }
}).start();

查询成绩

查询方案成绩:

jwxt.schemeScores();//返回数据为原始json数据,请通过ScoreListParser解析
jwxt.unpassedScores()//返回数据为原始json数据,请通过ScoreListParser解析

查询及格成绩:

jwxt.passedScores()//返回数据为原始json数据,请通过ScoreListParser解析

解析成绩(New)

请通过ScoreListParser来解析

/**
* 解析成绩查询返回的json数据,适用于有多个列表的情况,例如全部及格成绩,课程属性成绩
*
* @param json 返回的原始json数据
* @return
*/
public static List parseAll(String json)
/**
* 解析成绩查询返回的json数据,适用于有只有一个列表的情况,例如方案成绩
*
* @param json 返回的原始json数据
* @return
*/
public static ScoreList parse(String json)

查询课表

本学期课表:

jwxt.Schedule()//返回数据为原始json数据,请通过CourseListParser解析

指定学期课表:

//方案计划号,例如秋季学期"2017-2018-1-2",春季学期"2017-2018-2-2",夏季学期"2017-2018-3-2"
jwxt.Schedule("2017-2018-2-2")//返回数据为原始json数据,请通过CourseListParser解析

解析课表(New)

请通过CourseListParser解析

/**
* 解析
*
* @param json 返回的原始JSON数据
* @return
*/
public static List parse(String json)

查询考试安排

//返回结果为List;,每个数组中三项分别为日期,科目,具体信息
jwxt.examPlan();</code>

查询学籍信息

List infos=new ArrayList();