PHP模拟登陆正方系统获取课表、成绩(一看就懂!!!)

本文详细介绍了如何利用PHP和CURL模拟浏览器行为,实现登陆正方系统并抓取课表和成绩数据。通过解析网页源码,获取必要的隐藏表单值,构造POST请求数据,最终实现自动登陆与数据抓取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

image

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

那__VIEWSTATE和__VIEWSTATEGENERATOR又是啥玩意儿?

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

image

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

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12

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;
}

 

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

image

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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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),表示我们已经登陆成功了!

image

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

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

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

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

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

image

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

image

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

image

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

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

 

1
2
3

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

 

image

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

先来看看课表~~

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

 

1
2
3

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

 

image

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

image

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

 

1
2
3
4
5
6
7
8

$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);

 

抓取结果如下:

image

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

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

下面是我以前做的一个微信平台成绩、课表的查询示意图。。。因为快要找工作了,这个平台也没怎么管理了,哎~~~到时让学弟学妹来管理吧。

1212

 

本文链接:http://www.blogfshare.com/php-curl-zhengfang.html

转载提示:除非注明,AloneMonkey的文章均为原创,转载请以链接形式注明作者和出处。谢谢合作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值