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

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

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


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

验证码有一阵子可以直接绕过,后来又不行了

验证码识别,可以参考我的验证码识别项目:https://github.com/likole/jwxt_captcha_recognize

警告:选课功能比较危险,在非选课阶段有几率选择成功,而本工具包没有退课工具.非选课阶段是无法退课的!

使用方法

  • 下载源码(注:maven项目)
  • 编写主函数
  • 运行

代码示例

查询绩点

import cn.likole.jwxt.Jwxt;

import java.io.IOException;

/**
 * Created by likole on 1/2/19.
 */
public class JD {
    private static Jwxt jwxt = new Jwxt();

    public static void main(String[] args) throws IOException {
        jwxt.login("**********", "******", "error");
        System.out.println(jwxt.schemeScores());
    }
}

选课

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();

[学号:××××××××××, 姓名:××, 姓名拼音:, 英文姓名:×××××, 曾用名:, 身份证号:xxxxx, 年级:2016级, 院系:××××××, 专业:××××××××, 专业方向:, 班级:×××××××××, 校区:北校区, 辅修专业:, 第二学位专业:, 是否有学籍:是, 是否有国家学籍:是, 学生类别:, 学籍状态:, 学科门类号:, 特殊学生类型:, 收费类别:, 分流方向:, 培养方式:, 入学日期:, 因材施教:, 培养层次:本科生, 异动否:, 是否离校:, 是否应届毕业:是, 入学年级:2016级, 学制类型:, 学生证号:, 学生类型:, 是否留学生:, 性别:×, 民族:汉族, 政治面貌:共青团员, 国籍:, 授课语种:, 出生日期:xxxxxx, 籍贯:××, 外语语种:英语, 乘车区间:, 考生特征:, 定向委培单位:, 通讯地址:xxxxxx, 考区:××, 高考考生号:xxxxxx, 高考总分:×××, 毕业中学:×××××××××, 入学考试语种:, 录取号:xxxxxx, 录取年份:, 学习形式:, 录取类型:, 学位:, 学位证书编号:, 毕业类型:, 毕业日期:, 预设毕业日期:, 毕业证书编号:, 离校日期:, 授予学位时间:, 电子受理号:, 第二学位:, 第二学位证书编号:, 辅修证书编号:]

常用下标:学号0 姓名1 身份证号5 接下来的自己去数吧

  点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注