龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

用php_curl对discuzx 2.5模拟登陆,保存cookie,并进行

时间:2014-07-22 14:50来源: 作者: 点击:
分享到:
需要安装curl扩展
需要安装curl扩展
<?php
/* 
*  
* 作者:大水车
* 类用途: 实现discuz2.5登陆发帖 
*/
class  discuz_post{
        var $login_url;
        var $post_login_array=array(        );
        var $post_url;
        var $cookie_file;
        public function get_formhash($login_url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $login_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $contents = curl_exec($ch);//print_r($contents);die;
                curl_close($ch);
                //正常发布的版本用如下方法可以获得登陆部分的formhash
                preg_match('/<input type="hidden" name="formhash" value="(.*)" \/>/isU', $contents, $matches);
                //echo "<pre>";
                //print_r($matches);die;
                if(!empty($matches)) {
                        $formhash = $matches[1];
                } else {
                //        die('Not found the forumhash.');
                }
                return $formhash;
        }
        
        public function getcookie($login_url,$post){
                $cookie_file = tempnam('./temp','cookie');
                //print_r($cookie_file);die;
                $ch = curl_init($login_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
                curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
                curl_exec($ch);
                curl_close($ch);
                $this->cookie_file=$cookie_file;
                return $cookie_file;
                
        }
        
        public function use_cookie($send_url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $send_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
                $contents = curl_exec($ch);
                curl_close($ch);
                //获得发帖页面的fromhash
                preg_match_all('/<input type="hidden" name="formhash" id="formhash" value="(.*)" \/>/isU',$contents,$matches);
                if(!empty($matches)){
                        $formhash = $matches[1][0];
                }else {
                        $formhash='';//没有
                }
                return $formhash;
                
        }
        
        public function post_newthread($send_url,$thread_data){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $send_url);
                curl_setopt($ch, CURLOPT_REFERER, $send_url);//伪装REFERER
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $thread_data);
                $contents = curl_exec($ch);
                curl_close($ch);
                return 1;
                
        }

}

//下面是代码例子*******************************************************************************
$rc= new discuz_post();
//登陆的地址
$login_url='http://bbs.phpchina.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes';

$theformhash= $rc->get_formhash($login_url);
//登陆部分需要发送的数据,这里处理没有验证码的
$login_array=array(
                                        'username'=>'用户名',
                                        'password'=>'密码',
                                        'referer'=>'http://bbs.phpchina.com/',
                                        'questionid'=>0,
                                        'answer'=>'',
                                        'seccodeverify'=>'',
                                        'formhash'=>$theformhash,//这个貌似没有也可以发帖滴
                   );
//获得cookie文件
$the_cookie_file= $rc->getcookie($login_url,$login_array);
$send_url ='http://bbs.phpchina.com/forum.php?mod=post&action=newthread&fid=2&infloat=yes';
$thesendformhash= $rc->use_cookie($send_url);//利用cookie文件的
$post_array=array(
             'subject' => "发帖,发帖测试",//标题
                         'message' =>" 内容噢噢噢噢噢噢噢噢",//要超过10个字,奶奶的
                         'topicsubmit' => "yes",
                         'extra' => '',
                         'tags' => 'Curl',//帖子标签
                         'formhash'=>$thesendformhash,                         
                        );
$rc->post_newthread($send_url,$post_array);//发了一贴
echo "<pre>";
print_r($rc);
echo $theformhash;
echo $the_cookie_file;
echo $thesendformhash;
unlink($rc->cookie_file);//删除cookie文件,也可以不删除
echo "ok!";
?>

2. [代码][PHP]代码     跳至 [1] [2] [全屏预览]

<?php
/* 
*  
* 作者:大水车
* 类用途: 实现discuz2.5登陆发帖 
*/
class  discuz_post{
        var $login_url;
        var $post_login_array=array(        );
        var $post_url;
        var $cookie_file;
        public function get_formhash($login_url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $login_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                $contents = curl_exec($ch);//print_r($contents);die;
                curl_close($ch);
                //正常发布的版本用如下方法可以获得登陆部分的formhash
                preg_match('/<input type="hidden" name="formhash" value="(.*)" \/>/isU', $contents, $matches);
                //echo "<pre>";
                //print_r($matches);die;
                if(!empty($matches)) {
                        $formhash = $matches[1];
                } else {
                //        die('Not found the forumhash.');
                }
                return $formhash;
        }
        
        public function getcookie($login_url,$post){
                $cookie_file = tempnam('./temp','cookie');
                //print_r($cookie_file);die;
                $ch = curl_init($login_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
                curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
                curl_exec($ch);
                curl_close($ch);
                $this->cookie_file=$cookie_file;
                return $cookie_file;
                
        }
        
        public function use_cookie($send_url){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $send_url);
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
                $contents = curl_exec($ch);
                curl_close($ch);
                //获得发帖页面的fromhash
                preg_match_all('/<input type="hidden" name="formhash" id="formhash" value="(.*)" \/>/isU',$contents,$matches);
                if(!empty($matches)){
                        $formhash = $matches[1][0];
                }else {
                        $formhash='';//没有
                }
                return $formhash;
                
        }
        
        public function post_newthread($send_url,$thread_data){
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_URL, $send_url);
                curl_setopt($ch, CURLOPT_REFERER, $send_url);//伪装REFERER
                curl_setopt($ch, CURLOPT_HEADER, false);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookie_file);
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $thread_data);
                $contents = curl_exec($ch);
                curl_close($ch);
                return 1;
                
        }

}

//下面是代码例子*******************************************************************************
$rc= new discuz_post();
//登陆的地址
$login_url='http://bbs.phpchina.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes';

$theformhash= $rc->get_formhash($login_url);
//登陆部分需要发送的数据,这里处理没有验证码的
$login_array=array(
                                        'username'=>'用户名',
                                        'password'=>'密码',
                                        'referer'=>'http://bbs.phpchina.com/',
                                        'questionid'=>0,
                                        'answer'=>'',
                                        'seccodeverify'=>'',
                                        'formhash'=>$theformhash,//这个貌似没有也可以发帖滴
                   );
//获得cookie文件
$the_cookie_file= $rc->getcookie($login_url,$login_array);
$send_url ='http://bbs.phpchina.com/forum.php?mod=post&action=newthread&fid=2&infloat=yes';
$thesendformhash= $rc->use_cookie($send_url);//利用cookie文件的
$post_array=array(
             'subject' => "发帖,发帖测试",//标题
                         'message' =>" 内容噢噢噢噢噢噢噢噢",//要超过10个字,奶奶的
                         'topicsubmit' => "yes",
                         'extra' => '',
                         'tags' => 'Curl',//帖子标签
                         'formhash'=>$thesendformhash,                         
                        );
$rc->post_newthread($send_url,$post_array);//发了一贴
echo "<pre>";
print_r($rc);
echo $theformhash;
echo $the_cookie_file;
echo $thesendformhash;
unlink($rc->cookie_file);//删除cookie文件,也可以不删除
echo "ok!";
?>
精彩图集

赞助商链接