做一个类似这样的web 应用。

1,解决掉验证码

其实这是正方的一个小bug,当我们进入登陆界面时,浏览器会去请求服务器,服务器会生成一个验证码图片。如果我们不去请求这个图片,那么正方后台也不会生成相应的 验证码,于是这样我们就有了可乘之机,让我高兴会儿~这时,我们在不填写验证码的情况下,可以很流畅的进入。大家可以在自己的电脑上禁止访问验证码的地址,然后试试这 是不是真的~当然,这只对正方有效。

2,php 的curl 模拟登陆

//模拟登陆
function curl_request($url,$post='',$cookie='', $returnCookie=0){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; windows NT 6.1; Trident/6.0)');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($curl, CURLOPT_REFERER, "这里一定要换成教务系统登陆的url"); //填写教务系统url
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_HEADER, $returnCookie);
curl_setopt($curl, CURLOPT_TIMEOUT, 20);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
if (curl_errno($curl)) {
return curl_error($curl);
}
curl_close($curl);
if($returnCookie){
list($header, $body) = explode("\r\n\r\n", $data, 2);
preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);
$info['cookie'] = substr($matches[1][0], 1);
$info['content'] = $body;
return $info;
}else{
return $data;
}
}

3,教务系统登陆页面的隐藏字段

举个栗子

<input type="hidden" name="__VIEWSTATE" value="dDwyODE2NTM0OTg7Oz61eIbnKVojBioGYtg2vsy2SklwiA==">

这些东西在登陆的时候也是需要带上的,顺便贴出函数,顺便暴漏了博主的学校……皇家种地大学(主要是正则表达式的运用)

//登陆页面的隐藏字段
function getView(){
$url = 'http://jw.hzau.edu.cn/default2.aspx';
$result = curl_request($url);
$pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is';
preg_match_all($pattern, $result, $matches);
$res[0] = $matches[1][0];
return $res[0] ;
}

//返回教室查询页面的隐藏值

private function getViewJs($cookie,$xh){

$url = "http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}";

$result = curl_request($url,'',$cookie);

$pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is';

preg_match_all($pattern, $result, $matches);

$res[0] = $matches[1][0]; return $res[0] ;

}

4,cookie 的获取

function login($xh,$pwd){
$url = 'http://jw.hzau.edu.cn/default2.aspx';
$post['__VIEWSTATE'] = $this->getView(2881064151);
$post['txtUserName'] = $xh; //填写学号
$post['TextBox2'] = $pwd; //填写密码
$post['txtSecretCode'] = '';
$post['lbLanguage'] = '';
$post['hidPdrs'] = '';
$post['hidsc'] = '';
$post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '学生');
$post['Button1'] = iconv('utf-8', 'gb2312', '登录');
$result = curl_request($url,$post,'', 1);
return $result['cookie'];

//返回课表字符串
private function classresult($xh,$pwd){
date_default_timezone_set("PRC"); //时区设置
$classList = "";//声明课表变量
$cookie = $this->login($xh,$pwd);
$view = $this->getViewJs($cookie,$xh);//验证密码是否正确
//如果密码正确
if (!empty($view)) {
$url = "http://jw.hzau.edu.cn/xskbcx.aspx?xh={$xh}";
$result = curl_request($url,'',$cookie); //保存的cookies
preg_match_all('/<table id="Table1"[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out);
$table = $out[0][0]; //获取整个课表
preg_match_all('/<td [\w\W]*?>([\w\W]*?)<\/td>/',$table,$out);
$td = $out[1];
$length = count($td);
//获得课程列表
for ($i=0; $i < $length; $i++) { 
$td[$i] = str_replace("<br>", "", $td[$i]);
$reg = "/{(.*)}/";
if (!preg_match_all($reg, $td[$i], $matches)) {
unset($td[$i]);
}
}
$td = array_values($td); //将课程列表数组重新索引
$tdLength = count($td);
for ($i=0; $i < $tdLength; $i++) { 
$td[$i] = iconv('GB2312','UTF-8',$td[$i]);
}
//将课表转换成数组形式
function converttoTable($table){
$list = array(
'sun' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'mon' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'tues' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'wed' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'thur' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'fri' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
),
'sat' => array(
'1,2' => '',
'3,4' => '',
'5,6' => '',
'7,8' => '',
'9,10' => ''
)
);
$week = array("sun"=>"周日","mon"=>"周一","tues"=>"周二","wed"=>"周三","thur"=>"周四","fri"=>"周五","sat"=>"周六");
$order = array('1,2','3,4','5,6','7,8','9,10');
foreach ($table as $key => $value) {
$class = $value;
foreach ($week as $key => $weekDay) {
$pos = strpos($class,$weekDay);
// echo $pos;
if ($pos) {
$weekArrayDay = $key; //获取list数组中的第一维key 
foreach ($order as $key => $orderClass) {
$pos = strpos($class,$orderClass);
if ($pos) {
$weekArrayOrder = $orderClass; //获取该课程是第几节
break;
}
}
break;
}
}
$list[$weekArrayDay][$weekArrayOrder] = $class;
}
return $list;
}
//调用函数
return converttoTable($td);
}else{
return 0;
}
}

6,再试试查询空教室的功能

//空教室查询结果
public function roomresult(){
$xh = ""; //设置学号
$pwd = ""; //学号对应的密码
$cookie = $this->login($xh,$pwd);
$url = "http://jw.hzau.edu.cn/xs_main.aspx?xh={$xh}";
$result = curl_request($url,'',$cookie); //保存的cookies
$url="http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}";
$post['Button2'] = iconv('utf-8', 'gb2312', '空教室查询');
$post['__EVENTARGUMENT']='';
$post['__EVENTTARGET']='';
$post['__VIEWSTATE'] = $this->getViewJs($cookie,$xh);
$post['ddlDsz'] = iconv('utf-8', 'gb2312', '单');
$post['ddlSyXn'] = '2014-2015'; //学年
$post['ddlSyxq'] = '1'; 
$post['jslb'] = '';
$post['xiaoq'] = '';
$post['kssj']=$_GET['start']; //提交的开始查询时间 
$post['sjd']=$_GET['class'];//提交的课程节次
$post['xn']='2014-2015';//所在学年
$post['xq']='2';//所在学期
$post['xqj']='6';//当天星期几
$post['dpDataGrid1:txtPageSize']=90;//每页显示条数
$result = curl_request($url,$post,$cookie,0);
preg_match_all('/<span[^>]+>[^>]+span>/',$result,$out);
$tip = iconv('gb2312', 'utf-8', $out[0][3]);//获取页面前部的提示内容
preg_match_all('/<table[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out);
$table = iconv('gb2312', 'utf-8', $out[0][0]); //获取查询列表
$this->load->view("classroom",array('tip'=>$tip,'table'=>$table));
}

php 的curl 模拟登陆的更多相关文章

  1. PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤 2.tempnam 创建一个临时文件 3.使用CURL模拟登陆到PHP100论坛 <?php $cookie_file = tempnam('./temp',' ...

  2. 【转】PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤2.tempnam 创建一个临时文件3.使用CURL模拟登陆到PHP100论坛 <?php$cookie_file = tempnam('./temp','coo ...

  3. CURL模拟登陆

    index.html <a href="http://adtuu-server.com/login/login.php?auth_username=admin&auth_pas ...

  4. PHP curl 模拟登陆

    一个比较好的类: $cookie_file=tempnam("C:/users","tmp");生成以以tmp为前缀的文件. <?php define ( ...

  5. Shell 利用 curl 模拟登陆

    -b 参数 指定使用cookie文件 -c是往cookie文件中写cookie -d 是指定此次登录所需的参数,通过httpfox查看 -L 指定页面自动跳转 #curl -c ck.txt --us ...

  6. php curl模拟登陆抓取数据

    http://www.cnblogs.com/zengguowang/p/6814474.html

  7. php模拟登陆的两种实现方法分析

    php模拟登陆的实现方法分析 本文实例分析了php模拟登陆的实现方法.分享给大家供大家参考.具体分析如下: php模拟登陆的实现方法,这里分别列举两种方法实现模拟登陆人人网.具体实例代码如下: 1)使 ...

  8. 以正方教务系统为例,用php模拟登陆抓取课表、空教室

    课程格子和超级课程表这两个应用,想必大学生都很熟悉,使用自己的学号和教务系统的密码,就可以将自己的课表导入,随时随地都可以在手机上查看. 其实稍微了解一点php的话,我们也可以做一个类似这样的web ...

  9. curl模拟自动登陆&采集网页数据

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

随机推荐

  1. Windows下使用命令行设置ip地址的DNS服务器

    使用命令行或者编写bat批处理设置网络连接的IP地址以及DNS服务器地址有时候会比手动更加方便,IP地址和DNS的设置一般是配合的,常用到的几个状态是: 1.IP地址动态获取,DNS也动态 2.IP地 ...

  2. Java for LeetCode 069 Sqrt(x)

    Implement int sqrt(int x). Compute and return the square root of x. 解题思路一: public int mySqrt(int x) ...

  3. BestCoder17 1002.Select(hdu 5101) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目意思:给出 n 个 classes 和 Dudu 的 IQ(为k),每个classes 都有 ...

  4. HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)

    Fibonacci again and again Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & ...

  5. How to Optimize Battery Health?

    1. click on the battery icon from taskbar next to the date and time. 2. click "More power optio ...

  6. Tomcat 解决The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit

    解法: 修改tomcat下的web.xml,     搜索:JspServlet, 增加: <init-param> <param-name>mappedfile</pa ...

  7. hdu 1012:u Calculate e(数学题,水题)

    u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. ThinkPHP的增、删、改、查

    一.创建操作 在ThinkPHP使用add方法新增数据到数据库. 使用方法如下: $User = M()->; $data[););')->delete();

  9. Visual Studio 2015和ASP.NET 5中可用的前端开发工具集

    最近微软发布了一本白皮书,谈到了一些可以和Visual Studio 2015和ASP.NET 5配合使用的JS/前端Web开发工具(比如:函数库.任务执行器.框架等). 由于现在前端开发的生态系统在 ...

  10. 使用pm2常见问题

    一.日志 1.pm2 的log怎么查看?(安装pm2后默认日志的路径为~/.pm2/),可以通过pm2 show (name)来查看某个进程下的日志地址 2.修改日志的输出路径,通过写一个程序启动的配 ...