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

2014-11-25 5,754 1 技术 大超超。

不知不觉博客的文章《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="?action=getimg&t=<?=rand(10000, 99999)?>" alt="">
        <form action="">
            <input type="text" name="code">
            <input type="submit">
        </form>
    </body>
</html>


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

 



声明: 本文由大超超。原创编译,转载请保留链接: http://www.thinkful.cn/archives/558.html