β

PHP模拟登录WHU和WUST教务部源代码

大超超在思考 712 阅读

不知不觉博客的文章 《PHP+snoopy模拟登录武大教务管理系统》 已经有好几k的点击量,看来大家对模拟登录这块还是蛮感兴趣的。

昨天有童鞋问我关于武科大教务系统登录的问题,我当时挺忙,回复的不是很勤,他也忙活了好几天还是搞不定。凌晨我花了几个小时把以前的代码找出来,再分析了 WUST 教务系统的登录流程,把模拟登录代码完成,发给他了。

之前模拟登录 WHU 的教务系统时,使用的是 snoopy 实现的,那是使用 curl 一直不能实现才退而求其次的方法。睡觉前我又试了试使用 curl 方法,还是不能成功。我想了很久,还是不知道为什么,猜测是 cookie 或者 header 相关的问题。睡觉后我拿手机去官网查了查 curl_setopt 相关的用法,看到了下面这段话:

curl_setopt() 来说,传递一个数组到 CURLOPT_POST 将会把数据以 multipart/form-data 的方式编码,然而传递一个 URL-encoded 字符串将会以 application/x-www-form-urlencoded 的方式对数据进行编码。

这下明白了,原来是我一直把 CURLOPT_POST 设置成数组,这时 post 编码是 multipart/form-data (一般使用表单上传文件时使用这种),按照登录流程中 post 的数据以及编码方式,发现是按照 application/x-www-form-urlencoded 方式,当时就想从床上下来试试能不能成功,但是忍住了,还是先睡觉……

刚才一尝试把 post 数据由数组转成 URL-encoded 串,用 curl 也能成功了。真是这个原因。

高兴之余,把两个代码打包共享出来(不确定哪天对方系统改版就用不了了哦):

PHP模拟登录武汉大学教务部源代码.zip

PHP模拟登录武汉科技大学教务部源代码.zip

顺便贴一下模拟登录WHU教务部的源代码,方便直(S)接(E)复(O)制:

<?php
               
$login_url  = "http://210.42.121.241/servlet/Login";
$pic_url    = "http://210.42.121.241/servlet/CaptchaServlet?action=g";
$main_url   = "http://210.42.121.241/stu/stu_index.jsp";
               
               
if( !empty($_GET['action']) && $_GET['action']=='getimg' ){
    // 获取cookie
    $curl_option = array(
        CURLOPT_HEADER          => 1,
        CURLOPT_RETURNTRANSFER  => TRUE,
    );
    $curl = curl_init($pic_url);
    curl_setopt_array($curl, $curl_option);
    $result = curl_exec($curl);
    curl_close($curl);
    preg_match('/JSESSIONID=(.*?);/m', $result, $m);
    setcookie('local_tmp_id', $m[1], '0', '/');
               
    // 生成验证码
    header("Content-type: image/jpeg");
    echo end(explode("\r\n\r\n", $result, 2));
    exit();
} elseif( !empty($_GET['code']) ){
    $post_arr = array(
        'id' => "账号",
        'pwd' => "密码",
        'xdvfb' => $_GET['code'],
    );
    // 登录
    $login_type = 'curl';
    if( $login_type=='curl' ){
        $cookie = 'JSESSIONID='.$_COOKIE['local_tmp_id'];
        $post_data = compose_get_string($post_arr);
        curl($login_url, $cookie, $post_data, TRUE);
    } elseif( $login_type=='snoopy' ){
        require_once 'snoopy.cls.php';
        $snoopy = new Snoopy;
        $snoopy->maxredirs = 3;
        $snoopy->offsiteok = FALSE;
        $snoopy->expandlinks = FALSE;
        $snoopy->cookies["JSESSIONID"] = $_COOKIE['local_tmp_id'];
        $snoopy->submit($login_url, $post_arr);
               
        $output = iconv('gb2312', 'utf-8', trim($snoopy->results));
        echo '<pre>'.htmlentities($output).'</pre>';
    }
               
    exit();
}
               
               
function curl($url, $cookie, $post_data=NULL, $debug=FALSE){
    if( !function_exists('curl_init') ){
        return '未开启curl扩展。';
    }
    $curl = curl_init();
    $header = array();
    $host = reset(explode('/', end(explode('://', $url, 2))));
    $header[] = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1736.2 Safari/537.36';
    $header[] = 'Cache-Control: max-age=0';
    $header[] = 'Connection: keep-alive';
    $header[] = 'Cookie: '.$cookie;
    $header[] = 'Host: '.$host;
    $header[] = 'Origin: http://'.$host;
    if( !empty($post_data) ){
        // $header[] = 'Content-type: application/x-www-form-urlencoded';
        $header[] = 'Expect: ';// 强制让客户端不要发送Expect,不要http 1.1/ 100
    }
               
    //$Ref = "http://www.thinkful.cn";
    $curl_option = array(
        CURLOPT_HTTPHEADER      => $header,
        CURLOPT_URL             => $url,
        CURLOPT_RETURNTRANSFER  => TRUE,
        CURLOPT_FOLLOWLOCATION  => TRUE,
        // CURLOPT_REFERER          => $_SESSION['curl_referer'],
        CURLOPT_CONNECTTIMEOUT  => 10
    );
    if( !empty($post_data) ){
        $curl_option[CURLOPT_POST] = TRUE;
        $curl_option[CURLOPT_POSTFIELDS] = $post_data;
    }
    if( $debug ){
        $curl_option[CURLOPT_HEADER] = TRUE;
    }
    // print_r($curl_option);exit();
    if( $debug ){
        echo '<pre>发送参数'.str_repeat('=', 60)."\n";
        print_r($curl_option);
        echo "\n\n\n".'</pre>';
    }
    curl_setopt_array($curl, $curl_option);
    $result = curl_exec($curl);
    $contents = trim($result);
    if( $debug ){
        echo '<pre>传输结果'.str_repeat('=', 60)."\n";
        // print_r(curl_getinfo($curl));
        echo htmlentities(iconv('gbk', 'utf-8', $contents));
        echo "\n\n\n".'</pre>';
    }
               
    curl_close($curl);
    return $contents;
}
               
function compose_get_string($arr){
    $final = '';
    foreach ($arr as $k=>$v) {
        $final .= '&'.$k.'='.$v;
    }
    $final = substr($final, 1);
    return $final;
}
               
?><html>
               
    <body>
        <img src="http://www.thinkful.cn/archives/558.html?action=getimg&t=<?=rand(10000, 99999)?>" alt="">
        <form action="">
            <input type="text" name="code">
            <input type="submit">
        </form>
    </body>
</html>

文章同步在微信订阅号,欢迎关注:

声明: 本文采用 BY-NC-SA 协议进行授权 | 大超超在思考
转载请注明转自《 PHP模拟登录WHU和WUST教务部源代码

作者:大超超在思考
欢迎来到大大超的小小家,他正在思考,不要打扰他哦! - 共享、创意、思想
原文地址:PHP模拟登录WHU和WUST教务部源代码, 感谢原作者分享。

发表评论