Java登录方正教务管理系统并获取课程表

/ 1评 / 13

前导篇: Java登录方正教务系统

Java登录方正教务系统中,已经知道了如何登录到方正教务系统,以及在于服务器交互的过程中,Cookie的作用,还有隐藏字段_VIEWSTATE的作用,还处理了乱码问题,现在我们登录以后获取对应的课程表

需要获取的数据

通过火狐自带的抓包工具可以看到,点击信息查询->学生课表以后,浏览器通过GET方式提交xh(学号),xm(姓名),gnmkdm(固定值)等三个数据给服务器,下面我们来分别获取这三个数据

6

学号在前导篇里面属于登录时,用户输入的数据,所以这里不用获取,在登录时保存在成员变量中即可

对于获取课表来说,这个参数为N121603

我们在浏览器里面可以很容易看到,页面的右上角有 欢迎您:XX同学 的提示文字,在前导篇里面,我们说了,返回码302代表着登录成功,302代表着服务器要求浏览器跳转到一个指定网址,也就是登录成功后看到的主页,所以我们可以在登录的时候,将服务器要求我们跳转的网址保存下来,访问这个网址,也就是主页,然后通过正则表达式或者String.find()方法,提取出姓名

7

我们在前导篇登录的函数中获取返回码以后,顺带获取这个字段

/**
 * 登陆
 * 
 * @throws IOException
 */
public void load() throws IOException {
	//省略登录代码,在前导篇中有
	getNameByUrl(conn.getHeaderField("Location"));
}

访问主页,获取姓名

/**
 * 获取名字
 * @param url
 * @return
 */
public String getNameByUrl(String url) {

	url = "http://218.197.80.27/" + url;
	try {
		URL Url = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) Url.openConnection();

		conn.setRequestMethod("GET");
		conn.setReadTimeout(2000);
		conn.setRequestProperty("Cookie", cookie);

		BufferedReader read = new BufferedReader(new InputStreamReader(
				conn.getInputStream()));

		StringBuffer sb = new StringBuffer();
		String temp;
		while ((temp = read.readLine()) != null) {
			sb.append(temp);
		}

		Pattern pattern = Pattern.compile("xm=..");
		Matcher matcher = pattern.matcher(sb.toString());

		matcher.find();

		this.name = sb.substring(matcher.start() + 3, matcher.end());
		System.out.println(name);

	} catch (MalformedURLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	return null;
}

所有数据都获取完了,接下来就是获取课表信息了

/**
 * 获取课表
 */
public void getKB() throws UnsupportedEncodingException {
	System.out.println("读取课表");
	String url = "http://218.197.80.10/xskbcx.aspx?xh=" + id + "&xm="
			+ URLEncoder.encode(this.name, "GB2312") + "&gnmkdm=N121603";

	System.out.println("获取课表的参数: " + url);
	URL Url;
	try {
		Url = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) Url.openConnection();

		conn.setRequestMethod("GET");
		conn.setReadTimeout(2000);
		conn.setRequestProperty("Cookie", cookie);
		conn.setRequestProperty("Referer",
				"http://218.197.80.10/xs_main.aspx?xh=13150227");
		conn.setInstanceFollowRedirects(false);
		conn.setDoOutput(true);
		BufferedReader read = new BufferedReader(new InputStreamReader(
				conn.getInputStream()));

		StringBuffer sb = new StringBuffer();
		String temp;
		while ((temp = read.readLine()) != null) {
			sb.append(temp);
		}
		//打印出含有课表的网页源码
		System.out.println(sb);

	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (ProtocolException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

 

由于在控制台,输出只有一行,不便于查看,所以我复制到输出到记事本中,将后缀改名为.html,然后用浏览器打开,结果截图如下,接下来的就交给正则表达式搞定了,依次提取出需要的信息,这就是超级课程表一类软件的原理,模拟浏览器的行为,获取数据

8

 

 

 

 

  1. 999说道:

    666666

发表回复

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