Java--使用httpClient模拟登陆正方教务系统获取课表

最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢。于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程。


首先,我们先了解一下网站登录的原理:当我们输入学号,密码后点击登录后,浏览器会将我们输入的学号,密码,还有验证码等信息以post的形式发送到网站服务器的一个地址。网站服务器接收到post请求后,就会先验证输入的post过来的验证码是否正确,然后再验证用户名和密码。如果登陆成功,服务器就会生成随机串返回给浏览器,浏览器得到这个串后,就会作为cookies保存在浏览器。然后我们每次访问要获取登录后的数据都会提交这个串来验证是否已经登录。


所以,我们要获取课表信息的话,第一步必须要先登录教务系统,获取cookies。

那么我们怎么知道我要登录教务系统需要提交什么内容的表单呢?很简单,我们可以使用Fiddler来对我们登录教务系统的过程抓包。

下面是我登陆时抓的一些包↓↓↓

post的地址


Java--使用httpClient模拟登陆正方教务系统获取课表_第1张图片账号和密码我当然就涂掉啦。

从抓取的包数据中,我们可以分析出我们要提交的就上面这六个东西

txtUserName是学号,txtBox2是密码,txtSecretCode是验证码,RadioButtonList1是单选按钮(这里显示乱码是因为我没设置fiddler),Button1是登陆按钮,还有一个隐藏的__VIEWSTATE。

通过网页源代码可以查询到这个隐藏的__VIEWSTATE,只需要通过获取登录界面的网页源代码再用正则表达式就可以将这个隐藏的__VIEWSTATE提取出来。

关于验证码,我们直接设置为空字符串就可以了。具体为什么可以看我下面提到的blog,里面有详细介绍。其实即使不设置为空,只需要将验证码的图片弄出来传给用户输入就可以了哦。不过这里设置为空就是钻了一个空子而已。


这样的我们的要提交的东西就全了。然后我们就可以通过httpClient来模拟登陆。在这里我要推荐httpClient要使用4.0以上的版本,因为4.0以上的版本会自动管理cookies。这里我使用的是4.23。

这里是一个登陆的例子,我只贴出了关键的的函数,注意,登陆成功会返回的应该是302跳转,而不是200,如果返回的是200,则表明你没有登陆成功。

/**
	 * 登陆到教务系统
	 * 成功返回true
	 * 失败返回false
	 */
	public boolean ClientEduSystem(){
		HttpClient httpclient = new DefaultHttpClient(new ThreadSafeClientConnManager());
        HttpPost httpost = new HttpPost("http://jwgl.fjnu.edu.cn/default2.aspx");
        /*填充需要提交的表单*/
        List  nvps = new ArrayList ();
        nvps.add(new BasicNameValuePair("__VIEWSTATE", "xxxxxxxxx")); //xxx表示要提交的内容,需要自己获取
        nvps.add(new BasicNameValuePair("txtUserName", "xxxxxxxxx"));
        nvps.add(new BasicNameValuePair("TextBox2","xxxxxxxxx"));
        nvps.add(new BasicNameValuePair("txtSecretCode", ""));
        nvps.add(new BasicNameValuePair("RadioButtonList1", "学生");
        nvps.add(new BasicNameValuePair("Button1", ""));
        /*设置字符*/
        httpost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
        /*尝试登陆*/
        HttpResponse response;
		try {	
			response = httpclient.execute(httpost);
			/*判断是否登陆成功,根据登陆成功后会返回302跳转*/
            String result = response.getStatusLine().toString();
            if(result.equals("HTTP/1.1 302 Found")){
            	return true;
            }else{
            	return false;
            }
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}


登陆成功之后,获取课表就好说了。前面我们说过,我们登录是为了获取cookies,不过上面的代码好像并没有管理cookies啊。其实,httpClient4.x就开始支持自动管理cookies,也就是说,只要我们使用同一个HttpClient实例,那我们就不需要管网站返回过来的cookies了。那样的话,我们只需要再使用登录时使用的HttpClient实例来发送请求到课程表所在的页面就可以跳转到课程表的页面了。

注意:如果登录成功后再跳转到别的页面的时候,返回的是登录界面的源码,建议抓包看看请求头,看看是不是Refer那里需要重新设置一下。


获取课表页面源代码字符串后用httpparser或者jsoup处理就可以得到课程信息啦。具体方法很多就不写下来了。


   最后,感谢这篇博文给了我思路  PHP模拟登陆正方教务系统 特别鸣谢啊嘿嘿。



博客已经移至 我的博客

你可能感兴趣的:(java)