download:Java全栈工程师【已完结】

package com.ican.yueban.jwgl;

import java.io.IOException;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import com.ican.yueban.utils.DateUtils;
import com.ican.yueban.utils.GlobalConstant;
import com.ican.yueban.utils.IOUtils;
import com.ican.yueban.utils.ParseUtils;

public class Jwgl {

private static String stuNumber = "";private static String stuName = "";private static String Cookie = "";private String indexUrl = GlobalConstant.INDEX_URL;private String secretCodeUrl = GlobalConstant.SECRETCODE_URL;private String loginUrl = GlobalConstant.LOGIN_URL;private String mainUrl = GlobalConstant.MAIN_URL;private String queryClassroomUrl = GlobalConstant.QUERY_CLASSROOM_URL;private String queryClassroomGnmkdm = GlobalConstant.QUERY_CLASSROOM_GNMKDM;private String queryStuGradeUrl = GlobalConstant.QUERY_STU_GRADE_URL;private String queryStuGradeGnmkd = GlobalConstant.QUERY_STU_GRADE_GNMKDM;private String queryStuCourseUrl = GlobalConstant.QUERY_STU_COURSE_URL;private String queryStuCourseGnmkd = GlobalConstant.QUERY_STU_COURSE_GNMKDM;private String xixiaoqu = GlobalConstant.XIXIAOQU;private String identityStu = GlobalConstant.IDENTITY_STU;/** * 登录性能 *  * @param stuNumber * @param password * @return * @throws Exception * @throws UnsupportedOperationException */public boolean login(String stuNumber, String password)        throws UnsupportedOperationException, Exception {    this.stuNumber = stuNumber;    // 获取验证码    HttpGet secretCodeGet = new HttpGet(secretCodeUrl);    CloseableHttpClient client = HttpClients.createDefault();    CloseableHttpResponse responseSecret = client.execute(secretCodeGet);    // 获取返回的Cookie    Cookie = responseSecret.getFirstHeader("Set-Cookie").getValue();    String viewState = IOUtils.getViewState(indexUrl, "", "");    // 将验证码下载到C盘    IOUtils.getSecret(responseSecret.getEntity().getContent(),            "secretCode.png", "c://");    Scanner sc = new Scanner(System.in);    System.out.println("请输出验证码:");    // 手动填充方才获取的验证码的值    String secret = sc.next().trim();    HttpPost loginPost = new HttpPost(loginUrl);// 创立登录的Post申请    loginPost.setHeader("Cookie", Cookie);// 带上第一次申请的Cookie    List<NameValuePair> nameValuePairLogin = new ArrayList<NameValuePair>();// 封装Post提交参数    nameValuePairLogin            .add(new BasicNameValuePair("__VIEWSTATE", viewState));// 暗藏表单值    nameValuePairLogin            .add(new BasicNameValuePair("txtUserName", stuNumber));// 学号    nameValuePairLogin.add(new BasicNameValuePair("TextBox2", password));// 明码    nameValuePairLogin.add(new BasicNameValuePair("txtSecretCode", secret));// 验证码    nameValuePairLogin.add(new BasicNameValuePair("RadioButtonList1",            identityStu));// 身份,默认学生    nameValuePairLogin.add(new BasicNameValuePair("Button1", ""));    nameValuePairLogin.add(new BasicNameValuePair("lbLanguage", ""));    nameValuePairLogin.add(new BasicNameValuePair("hidPdrs", ""));    nameValuePairLogin.add(new BasicNameValuePair("hidsc", ""));    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(            nameValuePairLogin, "GB2312");    loginPost.setEntity(entity);    HttpResponse responseLogin = client.execute(loginPost);    // client1.close();    // 第三步:判断提交数据是否胜利,胜利返回302    if (responseLogin.getStatusLine().getStatusCode() == 302) {        // 如果提交胜利,带着Cookie申请重定向的main页面,并获取学生姓名        HttpGet mainGet = new HttpGet(mainUrl + stuNumber);        mainGet.setHeader("Cookie", Cookie);        mainGet.setHeader("Referer", loginUrl);        HttpResponse responseMain = client.execute(mainGet);        InputStream is = responseMain.getEntity().getContent();        String html = "";        try {            html = IOUtils.getHtml(is, "GB2312");        } catch (Exception e) {            System.out.println("解析html失败!");            e.printStackTrace();        }        stuName = Jsoup.parse(html).getElementById("xhxm").text();        System.out.println("登录胜利!欢迎您:" + stuName);        client.close();        return true;    } else {        System.out.println("登录失败!");        client.close();        return false;    }}/** * 查问空教室 *  * @throws Exception *  * @throws Exception */public void queryClassroom(String xiaoqu, String xqj, String sjd)        throws Exception {    CloseableHttpClient client = HttpClients.createDefault();    String newQueryClassrommUrl = queryClassroomUrl + stuNumber + "&xm="            + stuName + queryClassroomGnmkdm;// 拼接申请的Url    String parseSjd = ParseUtils.parseWeek(sjd);// 解析以后节次对应的字符串    String nowWeek = DateUtils.getWeek() + "";// 获取以后工夫是第几周    String viewState = IOUtils.getViewState(newQueryClassrommUrl, Cookie,            mainUrl + stuNumber);    // 封装查问空教室申请参数    List<NameValuePair> queryClassroomPair = new ArrayList<NameValuePair>();    queryClassroomPair.add(new BasicNameValuePair("__EVENTTARGET", ""));    queryClassroomPair.add(new BasicNameValuePair("__EVENTARGUMENT", ""));    queryClassroomPair            .add(new BasicNameValuePair("__VIEWSTATE", viewState));    queryClassroomPair.add(new BasicNameValuePair("xiaoq", xiaoqu));// 校区类型,默认西校区    queryClassroomPair.add(new BasicNameValuePair("jslb", ""));// 教室类别,默认为空    queryClassroomPair.add(new BasicNameValuePair("min_zws", "0"));// 最小座位数,默认为0    queryClassroomPair.add(new BasicNameValuePair("max_zws", ""));// 最大座位数,默认为空    queryClassroomPair.add(new BasicNameValuePair("ddlKsz", nowWeek));// 起始周,默认以后周    queryClassroomPair.add(new BasicNameValuePair("ddlJsz", nowWeek));// 完结周,默认以后周    queryClassroomPair.add(new BasicNameValuePair("xqj", xqj));// 星期几,默认当天    queryClassroomPair.add(new BasicNameValuePair("ddlDsz", ""));// 单双周,默认    queryClassroomPair.add(new BasicNameValuePair("sjd", parseSjd));// 第几节    queryClassroomPair.add(new BasicNameValuePair("Button2", "空教室查问"));    queryClassroomPair.add(new BasicNameValuePair("xn", "2015-2016"));    queryClassroomPair.add(new BasicNameValuePair("xq", "2"));    queryClassroomPair.add(new BasicNameValuePair("ddlSyXn", "2015-2016"));    queryClassroomPair.add(new BasicNameValuePair("ddlSyxq", "2"));    UrlEncodedFormEntity entityClassroom = new UrlEncodedFormEntity(            queryClassroomPair);    HttpPost queryClassroomPost = new HttpPost(newQueryClassrommUrl);    // newQueryClassrommUrl示例:http://jwgl2.ujn.edu.cn/xxjsjy.aspx?xh=20121214104&xm=XXX&gnmkdm=N121611    queryClassroomPost.setEntity(entityClassroom);    queryClassroomPost.setHeader("Referer", mainUrl + stuNumber);// 设置头信息    queryClassroomPost.setHeader("Cookie", Cookie);    HttpResponse responseClassroom = client.execute(queryClassroomPost);    InputStream is = responseClassroom.getEntity().getContent();    String html = IOUtils.getHtml(is, "GB2312");    Document doc = Jsoup.parse(html);    Elements eleClassroom = doc.select("td");    Elements eleInfo = doc.select("#lblbt");    System.out.println(eleInfo.get(0).text());    for (int i = 0; i < eleClassroom.size(); i++) {        // 只打印教室名称        if (i % 8 == 1) {            System.out.println(eleClassroom.get(i).text());        }    }    client.close();}/** * 重载查问空教室办法,默认工夫,课程节次的无参数查询方法 *  * @throws IOException * @throws ClientProtocolException */public void queryClassroom() throws ClientProtocolException, IOException,        Exception {    String weekDay = DateUtils.getWeekDay() + "";// 获取以后工夫是星期几    String sdj = DateUtils.getNowCourse() + "";// 获取以后工夫是第几节课    new Jwgl().queryClassroom(xixiaoqu, weekDay, sdj);}/** * 查问集体问题办法 *  * @throws ClientProtocolException * @throws IOException */public void queryStuGrade(String xn, String xq)        throws ClientProtocolException, IOException {    CloseableHttpClient client = HttpClients.createDefault();    String newQueryStuGradeUrl = queryStuGradeUrl + stuNumber + "&xm="            + stuName + queryStuGradeGnmkd;    HttpPost queryGradePost = new HttpPost(newQueryStuGradeUrl);    String viewState = IOUtils.getViewState(newQueryStuGradeUrl, Cookie,            mainUrl + stuNumber);    // 封装申请参数    List<NameValuePair> queryGradePair = new ArrayList<NameValuePair>();    queryGradePair.add(new BasicNameValuePair("__EVENTTARGET", ""));    queryGradePair.add(new BasicNameValuePair("__EVENTARGUMENT", ""));    queryGradePair.add(new BasicNameValuePair("__VIEWSTATE", viewState));    queryGradePair.add(new BasicNameValuePair("hidLanguage", ""));    queryGradePair.add(new BasicNameValuePair("ddlXN", xn));// 学年    queryGradePair.add(new BasicNameValuePair("ddlXQ", xq));// 学期    queryGradePair.add(new BasicNameValuePair("ddl_kcxz", ""));    queryGradePair.add(new BasicNameValuePair("btn_xq", "学期成绩"));    queryGradePost.setHeader("Cookie", Cookie);    queryGradePost.setHeader("Referer", mainUrl + stuNumber);    UrlEncodedFormEntity entityGrade = new UrlEncodedFormEntity(            queryGradePair);    queryGradePost.setEntity(entityGrade);    HttpResponse responQueryGradePost = client.execute(queryGradePost);    String gradeHtml = IOUtils.getHtml(responQueryGradePost.getEntity()            .getContent(), "GB2312");    // System.out.println(gradeHtml);    Document gradeDoc = Jsoup.parse(gradeHtml);    Elements eleGrade = gradeDoc.select("td");    // 按需要解析html<td>标签内容并输入    for (int i = 0; i < 7; i++) {        System.out.println(eleGrade.get(i).text());    }    for (int i = 11; i < eleGrade.size(); i = i + 10) {        if (i + 15 < eleGrade.size()) {            System.out.print(eleGrade.get(i).text() + "             ");            i = i + 5;            System.out.print(eleGrade.get(i).text());            System.out.println();        }        client.close();    }}/** * 查问集体课表办法 *  * @param xnd * @param xqd * @throws ClientProtocolException * @throws IOException */public void queryStuCourse(String xnd, String xqd)        throws ClientProtocolException, IOException {    CloseableHttpClient client = HttpClients.createDefault();    String newQueryStuCourseUrl = queryStuCourseUrl + stuNumber + "&xm="            + stuName + queryStuCourseGnmkd;    String viewState = IOUtils.getViewState(newQueryStuCourseUrl, Cookie,            mainUrl + stuNumber);    HttpPost queryStuCoursePost = new HttpPost(newQueryStuCourseUrl);    List<NameValuePair> stuCoursePair = new ArrayList<NameValuePair>();    stuCoursePair.add(new BasicNameValuePair("__EVENTTARGET", "xqd"));    stuCoursePair.add(new BasicNameValuePair("__EVENTARGUMENT", ""));    stuCoursePair.add(new BasicNameValuePair("__VIEWSTATE", viewState));    stuCoursePair.add(new BasicNameValuePair("xnd", xnd));    stuCoursePair.add(new BasicNameValuePair("xqd", xqd));    UrlEncodedFormEntity entitySource = new UrlEncodedFormEntity(            stuCoursePair);    queryStuCoursePost.setEntity(entitySource);    queryStuCoursePost.setHeader("Cookie", Cookie);    queryStuCoursePost.setHeader("Referer", mainUrl + stuNumber);    HttpResponse responseStuCourse = client.execute(queryStuCoursePost);    String html = IOUtils.getHtml(responseStuCourse.getEntity()            .getContent(), "GB2312");    Document docCourse = Jsoup.parse(html);    Elements eleCourse = docCourse.select("td");    for (int i = 2; i < eleCourse.size(); i++) {        System.out.print(eleCourse.get(i).text() + "    ");        if (i % 9 == 0) {            System.out.println();        }    }}public static void main(String[] args) {    Jwgl jw = new Jwgl();    try {        jw.login("这里是学号", "这里是明码");        System.out.println("查问问题测试-------");        jw.queryStuGrade("2015-2016", "1");        // 查问西校区,周一,第12节空教室测试。        // jw.queryClassroom("1", "1", "2");        System.out.println("查问空教室测试------"); 

package com.ican.yueban.utils;

import java.text.ParseException;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils {

private static String startDay = GlobalConstant.START_DAY;// 开学日期private static String endDay = GlobalConstant.END_DAY;// 放假日期/** * 获取以后工夫是第几节课,只限8-16点之间,其余工夫默认1,2节课。 *  * @return */public static int getNowCourse() {    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");// 设置日期格局    String nowDate = df.format(new Date());    if (nowDate.startsWith("08") || nowDate.startsWith("09")) {        return 1;// 12节课。    } else if (nowDate.startsWith("10") || nowDate.startsWith("11")) {        return 2;// 34节课,以此类推。    } else if (nowDate.startsWith("12") || nowDate.startsWith("13")            || nowDate.startsWith("14")) {        return 3;    } else if (nowDate.startsWith("15") || nowDate.startsWith("16")) {        return 4;    } else {        return 1;    }}/** * 获取以后工夫是第几周 *  * @return */public static int getWeek() {    int days = 0;    int nowWeek = 0;    try {        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");// 设置日期格局        String nowDate = df.format(new Date());        int nowDaysBetween = daysBetween(startDay, nowDate) + 1;        days = daysBetween(startDay, endDay);        int x = nowDaysBetween % 7;        if (x == 0) {            nowWeek = nowDaysBetween / 7;        } else {            nowWeek = nowDaysBetween / 7 + 1;        }    } catch (ParseException e) {        System.out.println("输出的日期不非法,解析日期失败");        e.printStackTrace();    }    return nowWeek;}/** * 获取以后工夫是星期几 *  * @return */public static int getWeekDay() {    Calendar cal = Calendar.getInstance();    cal.setTime(new Date());    if (cal.get(Calendar.DAY_OF_WEEK) - 1 == 0) {        return 7;    }    return cal.get(Calendar.DAY_OF_WEEK) - 1;}/** * 计算两个String类型日期之间的天数 *  * @param startDay * @param endDay * @return *

package com.ican.yueban.utils;

/**

  • 本零碎所有常量定义
  • @author 宋开宗
  • */

public interface GlobalConstant {

public static final String START_DAY = "2016-02-29";public static final String END_DAY = "2016-07-10";public static final String INDEX_URL = "http://jwgl2.ujn.edu.cn";// 济大教务零碎首页public static final String SECRETCODE_URL = "http://jwgl2.ujn.edu.cn/CheckCode.aspx";// 验证码页面public static final String LOGIN_URL = "http://jwgl2.ujn.edu.cn/default2.aspx";// 济大教务零碎登录页public static final String MAIN_URL = "http://jwgl2.ujn.edu.cn/xs_main.aspx?xh=";// 济大教务零碎主页,菜单页面public static final String QUERY_CLASSROOM_URL = "http://jwgl2.ujn.edu.cn/xxjsjy.aspx?xh=";// 济大查问空教室链接public static final String QUERY_CLASSROOM_GNMKDM = "&gnmkdm=N121611";// 济大查问空教室gnmkdmpublic static final String QUERY_STU_COURSE_URL = "http://jwgl2.ujn.edu.cn/xskbcx.aspx?xh=";// 济大查问集体课表链接public static final String QUERY_STU_COURSE_GNMKDM = "&gnmkdm=N121603";// 济大查问集体课表gnmkdmpublic static final String QUERY_STU_GRADE_URL = "http://jwgl2.ujn.edu.cn/xscjcx.aspx?xh=";// 济大查问集体问题链接public static final String QUERY_STU_GRADE_GNMKDM = "&gnmkdm=N121605";// 济大查问集体问题gnmkdmpublic static final String IDENTITY_STU = "学生";// 身份:学生public static final String XIXIAOQU = "1";// 济大西校区标记public static final String DONGXIAOQU = "2";// 济大东校区标记public static final String ZHANGQIUXIAOQU = "3";// 济大章丘校区标记public static final String CLASS1 = "'1'|'1','0','0','0','0','0','0','0','0'";// 1,2节public static final String CLASS2 = "'2'|'0','3','0','0','0','0','0','0','0'";// 3,4节public static final String CLASS3 = "'3'|'0','0','5','0','0','0','0','0','0'";// 5,6节public static final String CLASS4 = "'4'|'0','0','0','7','0','0','0','0','0'";// 7,8节public static final String CLASS5 = "'5'|'0','0','0','0','9','0','0','0','0'";// 8,10节public static final String CLASS6 = "'6'|'0','0','0','0','0','11','0','0','0'";// 11,12节public static final String CLASS7 = "'7'|'1','3','0','0','0','0','0','0','0'";// 上午public static final String CLASS8 = "'8'|'0','0','5','7','0','0','0','0','0'";// 下午public static final String CLASS9 = "'9'|'1','3','5','7','0','0','0','0','0'";// 白天public static final String CLASS10 = "'10'|'0','0','0','0','9','11','0','0','0'";// 早晨public static final String CLASS11 = "'11'|'1','3','5','7','9','11','0','0','0'";// 全天

package com.ican.yueban.utils;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;

public class IOUtils {

/** * 指定编码格局 ,把输出流转化为字符串 *  * @param is * @return * @throws IOException */public static String getHtml(InputStream is, String encoding)        throws IOException {    ByteArrayOutputStream bos = new ByteArrayOutputStream();    byte[] buffer = new byte[1024];    int len = 0;    while ((len = is.read(buffer)) != -1) {        bos.write(buffer, 0, len);    }    is.close();    return new String(bos.toByteArray(), encoding);}/** * 下载图片 *  * @param urlString * @param filename * @param savePath * @throws Exception */public static void download(String urlString, String filename,        String savePath) throws Exception {    // 结构URL    URL url = new URL(urlString);    // 关上连贯    URLConnection con = url.openConnection();    // 设置申请超时为5s    con.setConnectTimeout(5 * 1000);    // 输出流    InputStream is = con.getInputStream();    // 1K的数据缓冲    byte[] bs = new byte[1024];    // 读取到的数据长度    int len;    // 输入的文件流    File sf = new File(savePath);    if (!sf.exists()) {        sf.mkdirs();    }    OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);    // 开始读取    while ((len = is.read(bs)) != -1) {        os.write(bs, 0, len);    }    // 结束,敞开所有链接    os.close();    is.close();}/** * 图片裁剪工具类 *  * @param src * @param dest * @param x * @param y * @param w * @param h * @throws IOException */public static void cutImage(String src, String dest, int x, int y, int w,        int h) throws IOException {    Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");    ImageReader reader = (ImageReader) iterator.next();    InputStream in = new FileInputStream(src);    ImageInputStream iis = ImageIO.createImageInputStream(in);    reader.setInput(iis, true);    ImageReadParam param = reader.getDefaultReadParam();    Rectangle rect = new Rectangle(x, y, w, h);    param.setSourceRegion(rect);    BufferedImage bi = reader.read(0, param);    ImageIO.write(bi, "jpg", new File(dest));    in.close();}/** * 判断字符编码集 *  * @param str * @return */public static String getEncoding(String str) {    String encode = "GB2312";    try {        if (str.equals(new String(str.getBytes(encode), encode))) {            String s = encode;            return s;        }    } catch (Exception exception) {    }    encode = "ISO-8859-1";    try {        if (str.equals(new String(str.getBytes(encode), encode))) {            String s1 = encode;            return s1;        }    } catch (Exception exception1) {    }    encode = "UTF-8";    try {        if (str.equals(new String(str.getBytes(encode), encode))) {            String s2 = encode;            return s2;        }    } catch (Exception exception2) {    }    encode = "GBK";    try {        if (str.equals(new String(str.getBytes(encode), encode))) {            String s3 = encode;            return s3;        }    } catch (Exception exception3) {    }    return "未知";}/** * 把输出流转换成图片---》获取验证码 *  * @param is * @param filename * @param savePath * @throws Exception */public static void getSecret(InputStream is, String filename,        String savePath) throws Exception {    // 1K的数据缓冲    byte[] bs = new byte[1024];    // 读取到的数据长度    int len;    // 输入的文件流    File sf = new File(savePath);    if (!sf.exists()) {        sf.mkdirs();    }    OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename);    // 开始读取    while ((len = is.read(bs)) != -1) {        os.write(bs, 0, len); 

package com.ican.yueban.utils;

public class ParseUtils {

/** * 获取课程节次对应的字符串 * @param course * @return */public static String parseWeek(String course) {    String sjd="";    int nowCourse = Integer.parseInt(course);    switch (nowCourse) {    case 1:        sjd=GlobalConstant.CLASS1;        break;    case 2:        sjd=GlobalConstant.CLASS2;        break;    case 3:        sjd=GlobalConstant.CLASS3;        break;    case 4:        sjd=GlobalConstant.CLASS4;        break;    case 5:        sjd=GlobalConstant.CLASS5;        break;    case 6:        sjd=GlobalConstant.CLASS6;        break;    case 7:        sjd=GlobalConstant.CLASS7;        break;    case 8:        sjd=GlobalConstant.CLASS8;        break;    case 9:        sjd=GlobalConstant.CLASS9;        break;    case 10:        sjd=GlobalConstant.CLASS10;        break;    case 11:        sjd=GlobalConstant.CLASS11;        break;    default:        sjd=GlobalConstant.CLASS1;        break;    }    return sjd;}

}