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

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

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

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

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

那__VIEWSTATE和__VIEWSTATEGENERATOR又是啥玩意儿?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1
2
3

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

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

先来看看课表~~

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

1
2
3

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

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

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

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

抓取结果如下:

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

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

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

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

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

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

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

    最近形如课程格子与超表课程表应用如雨后春笋般涌现,他们自动获取课程表是怎么实现的呢.于是我用Java实现了一下模拟登陆正方教务系统获取课表的过程. 首先,我们先了解一下网站登录的原理:当我们输入学号, ...

  2. python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单

    学校的教务系统是正方的,在大学期间无论是选课.报名还是查成绩,几乎都要和它打交道,上学期在积累了一定的爬虫和web知识后,我就想着用Python模拟登陆教务系统,实现在命令行里方便地进行成绩或课表的查 ...

  3. php模拟登陆,php实现模拟登陆正方教务系统

    本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法,希望能帮助到大家. 1.保存登陆界面的验证码 ...

  4. php模拟登陆正方教务系统(2018年)

    php模拟登陆正方教务系统(2018年) 本文主要介绍通过php的curl库实现正方教务系统的登陆,由于正方教务系统每年可能会有一些更新,因此本文是针对2018年而言,所介绍一些模拟登陆正方的方法. ...

  5. 使用Httpclient模拟登陆正方软件股份有限公司开发的教务管理系统

    事先声明,我写这篇,只是为了分享一下,登录网站不止有使用cookies这一种方法,还有一种使用随机码的方法,并没有泄露"商业机密"的想法,本人才疏学浅,只是在站在巨人的肩膀上,摘到 ...

  6. (微信开发)PHP curl模拟登陆教务系统查询成绩查询课表实现微信查成绩差课表功能

    </pre><p></p><pre name="code" class="php"></pre> & ...

  7. java模拟登录新版正方_java 模拟登陆正方教务系统

    比较懒,主要说一下思路.. 1.首先正方教务系统的验证码当你不去向服务器申请的时候,可以直接无视它不需要去输入验证码.可以通过浏览器屏蔽学校教务系统的图片就可以直接输入账号密码回车进去.. 2.通过抓 ...

  8. python爬虫学校正方教务系统获取全部成绩

    python爬虫正方教务系统许昌学院 来自许昌学院的大四小菜鸡,疫情封在宿舍,闲来无事在宿舍爬了一下之前没成功的教务系统爬虫,当时觉得挺难的,今天发现这个还是挺简单的,这个程序参考了很多前辈大佬们的程 ...

  9. Android 模拟登陆正方教务系统(一)

    刷推送时看到一篇讲retrofit的,想试试其中的post,post什么呢,首先想到的是正方,于是,,就试试吧.(本人小白,之前没有怎么使用过这些框架,若有错误,请大神们指教(/▽╲)) 一.抓包 我 ...

最新文章

  1. 机器学习中的偏差和方差是什么?
  2. excel两个下拉框相互关联
  3. Redis的安装及使用
  4. iOS开发之图片分辨率与像素对齐
  5. SAP Spartacus 页面标题的更改机制 - 谁动了我的页面标题?
  6. 学姐面了美团阿里京东的面经
  7. QML工作笔记-Key Element的使用
  8. clion windows安装
  9. dh算法 理论依据_DH算法原理
  10. tcpdump捕获流量,并切分多个文件保存
  11. python 清华镜像pip install
  12. SpringMVC开发框架中使用@ResponseBody注解后返回的json字符串中文乱码问题
  13. 虚拟机里linux7关不了,虚拟机上CentOS 7关闭防火墙操作
  14. java例程练习(东软笔试题——n阶平面魔方)
  15. 承接家谱制作-多少代都可以
  16. 如何做一个2D 横版过关类游戏
  17. python爬虫英文单词_非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本...
  18. win电脑主板设置的Bios密码清除方法
  19. protobuf篇:介绍、安装、测试
  20. python_pygame_alpha-beta剪枝算法_玩中国象棋

热门文章

  1. 【车载开发系列】CAN总线通信---PDU相关概念
  2. HYSBZ - 1017 魔兽地图【树形DP依赖性背包】
  3. 正确安装wireshark
  4. CoolShell-第2题
  5. LeetCode 03: T58. 最后一个单词的长度(简单); 剑指 Offer 05. 替换空格(简单); 剑指 Offer 58 - II. 左旋转字符串(简单)
  6. 微信小程序中开发使用腾讯地图定位
  7. 天气预报webservice
  8. 梦想总是要有的 - 工作20年程序员的2021年度总结
  9. 揭开邮局EMS快递单查询原理
  10. (转)流出视频显示iPhone 5耳机采用“泪珠状”设计(图)