PHP模拟登陆正方系统获取课表、成绩

  • 2016-09-12
  • 0
  • 0

最近很多人问我到底怎么模拟登陆正方系统来抓取课表和成绩的,其实如果你知道了浏览器是怎么和服务器交互数据的话,实现起来就很简单了。

当我们输入学号、密码后点击登陆,浏览器会把我们的学号、密码或者验证码,post到服务器的一个地址,服务器接受到POST请求后,首先验证验证码是否正确,然后验证学号、密码是否正确,如果其中有一个不正确的话,直接返回验证码错误或者学号不存在或者密码错误。如果匹配正确,那么服务器会生成随机串(就是SessionId)来表示登陆成功的状态,并返回给浏览器,浏览器得到这个串之后,作为cookies保存在浏览器,每次要获取登陆后里面的数据时都会提交这个串来验证是否已经登陆。好吧,大概的流程差不多就是这样了。所以我们需要做的就是来模拟浏览器的行为,获取登陆成功后的验证串,并通过它来请求成绩、课表的数据。

怎么模拟浏览器的行为?这个我在PHP中使用CURL实现GET和POST请求里面讲的很清楚了,请大家先把这篇博文看完。

好了,我们已经知道怎么去模拟浏览器行为了,那我们就来看看登陆的时候浏览器到底做了些什么?我们使用HTTP抓包工具Fiddler来对登陆的过程进行抓包,当然其他工具也是可以的,像httpclient或者直接使用浏览器的F12开发者工具。下面是我们对登陆抓包的结果:

首先我们看到txtUserName是我们填写的学号、TextBox2是我们填写的密码、txtSecreCode是我们填写的验证码、RadioButtonList1是我们选择的登陆身份。

那__VIEWSTATE和__VIEWSTATEGENERATOR又是啥玩意儿?

既然在这里提交了,那肯定不是凭空产生的,我们来看看登陆界面的源码:

小样,以为隐藏了我就看不到你了?

所以我们要先获取到这两个隐藏表单的值。怎么获取?使用正则表达式匹配即可。在这里我先不对正则表达式进行详细的讲解。

我们把获取这两个值的方法写到一个方法里面:

public function getView(){
     $res;
     $url = 'http://220.168.44.238/default2.aspx';
     $result = $this->curl_request($url);
     $pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is';
     preg_match_all($pattern, $result, $matches);
     $res[0] = $matches[1][0];
      $pattern = '/<input type="hidden" name="__VIEWSTATEGENERATOR" value="(.*?)" \/>/is';
     preg_match_all($pattern, $result, $matches);
     $res[1] = $matches[1][0];
     return $res;
}

好了,我们来看看获取的结果:

好了,这两个值搞定!!!

下面所有的POST数据都准备了,只需要我们POST提交即可!

function login(){
     $url = '登陆页面地址';
     $post['__VIEWSTATE'] = 上面获取结果;
     $post['__VIEWSTATEGENERATOR'] = 上面获取结果;
     $post['txtUserName'] = 学号;
     $post['TextBox2'] = 密码;
     $post['txtSecretCode'] = '';
     $post['lbLanguage'] = '';
     $post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '学生');
     $post['Button1'] = iconv('utf-8', 'gb2312', '登录');
     $result = $this->curl_request($url,$post,'', 1);
     print_r($result);
     return $result;
}

我们来看看登陆结果,这次我们的主要目的就是获取登陆成功后的验证串(也就是cookies),表示我们已经登陆成功了!

然后,记得保存好这个cookies!!!!

哎,,,等一下,别忽悠大家!!!说的验证码怎么是空的???劳资研究了半年怎么获取验证码图片上面的文字,你TM啥都没填就行了?这个。。。我给大家解释一下。

首先验证码是怎么生成的?

当我们去访问登陆界面的时候,页面里会有一个获取验证码的地址,然后浏览器再去服务器请求验证码的图片,服务器收到验证码图片的请求,并在服务器生成一个随机串,然后把这个随机串生成成一张图片,再返回给浏览器,所以就看到了所谓的验证码。。。如果我们不去请求这个生成验证码图片的地址?我们手动来try一try!!!

首先我们找到这个生成验证码图片的地址,然后把这个地址加到屏蔽规则里面,这样浏览器就不会去访问这个地址了。(是不是很机智?哈哈、、、)

我们再来访问登陆界面,,,好了验证码图片不见了,,,,但是是不是真的不用填就能登陆呢?试试不就知道了吗?

再点击登陆呢?真不好意思,我们就这么登进去了。。。。哈哈。。。

为什么会这样?因为你没有去请求验证码图片,服务器也就不会给你生成验证码,所以提交的时候,你提交空的验证码,服务器后台也空的验证码,刚好吻合,我TM太机智了。。。好吧,这只是正方,如果在服务器后台加一个判断,如果验证码为空,直接返回登陆失败了!!!黑线!!!GG 了。。。

好了,扯了这么多我们来看看用代码能不能访问到后台的主页?

$url = '后台主页地址/xs_main.aspx?xh='.$this->studentId;
$result = $this->curl_request($url,'',$this->cookie);  //我们保存的cookies
print_r($result);


登陆进来了!!!这下什么成绩、课表、什么的都不是问题了。。。

先来看看课表~~

我们直接GET获取课表的URL就行了。。。。

$url = "后台主页地址/xskbcx.aspx?xh=".$this->studentId;
$result = $this->curl_request($url,'',$this->cookie);
print_r($result);


至于成绩,我们还得POST几个其他数据,抓包先!!!我们点历年成绩。

上面两个字段和登陆一样,不解释。。。

$url = "后台主页地址/xscjcx.aspx?xh=".$this->studentId;
$post['ddl_kcxz'] = '';
$post['btn_zcj'] = iconv('utf-8', 'gb2312', '历年成绩');
$post['__VIEWSTATE'] = 抓取结果;
$post['__VIEWSTATEGENERATOR'] = 抓取结果;
$result = $this->curl_request($url,$post,$this->cookie);
$result = iconv('gbk', 'utf-8', $result);
print_r($result);

抓取结果如下:

完了。。。。。暴露本学渣智商了。。。。。QAQ~~~

好了,成绩、课表都抓取完了。。。。至于其它的什么信息,原理都是一样的。。。其它网站也是,大家可发挥各自的聪明才智来整出好玩的东西来。。。

评论

还没有任何评论,你来说两句吧

CC共享许可协议:BY-NC-SA 4.0 - 友情链接 - Theme by Qzhai