java 模拟登陆(二)

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

需要获取的数据

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

java 模拟登陆(二)_第1张图片

  • 获取xh(学号)

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

  • gnmkdm

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

  • xm(姓名)

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

java 模拟登陆(二)_第2张图片

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

1

2

3

4

5

6

7

8

9

/**

* 登陆

*

* @throws IOException

*/

public void load() throws IOException {

//省略登录代码,在前导篇中有

getNameByUrl(conn.getHeaderField("Location"));

}

访问主页,获取姓名

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

/**

* 获取名字

* @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;

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

/**

* 获取课表

*/

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,然后用浏览器打开,结果截图如下,接下来的就交给正则表达式搞定了,依次提取出需要的信息,这就是超级课程表一类软件的原理,模拟浏览器的行为,获取数据

java 模拟登陆(二)_第3张图片

 

 

转载地址:http://www.27house.cn/archives/181

你可能感兴趣的:(java 模拟登陆(二))