php通过curl模拟登陆DZ论坛

5年以前  |  阅读数:418 次  |  编程语言:PHP 

libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。


    <?php 
    $discuz_url = 'http://www.jb51.net/';//论坛地址 
    $login_url = $discuz_url .'login.php?action=login';//登录页地址 

    $post_fields = array(); 
    //以下两项不需要修改 
    $post_fields['loginfield'] = 'username'; 
    $post_fields['loginsubmit'] = 'true'; 
    //用户名和密码,必须填写 
    $post_fields['username'] = 'tianxin'; 
    $post_fields['password'] = '111111'; 
    //安全提问 
    $post_fields['questionid'] = 0; 
    $post_fields['answer'] = ''; 
    //@todo验证码 
    $post_fields['seccodeverify'] = ''; 
    //获取表单FORMHASH 
    $ch = curl_init($login_url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $contents = curl_exec($ch); 
    curl_close($ch); 
    preg_match('/<input\s*type="hidden"\s*name="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches); 
    if(!empty($matches)) { 
    $formhash = $matches[1]; 
    } else { 
    die('Not found the forumhash.'); 
    } 

    //POST数据,获取COOKIE,cookie文件放在网站的temp目录下 
    $cookie_file = tempnam('./temp','cookie'); 
    $ch = curl_init($login_url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
    curl_exec($ch); 
    curl_close($ch); 
    //取到了关键的cookie文件就可以带着cookie文件去模拟发帖,fid为论坛的栏目ID 
    $send_url = $discuz_url."post.php?action=newthread&fid;=2"; 

    $ch = curl_init($send_url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
    $contents = curl_exec($ch); 
    curl_close($ch); 
    //这里的hash码和登陆窗口的hash码的正则不太一样,这里的hidden多了一个id属性 
    preg_match('/<input\s*type="hidden"\s*name="formhash"\s*id="formhash"\s*value="(.*?)"\s*\/>/i', $contents, $matches); 
    if(!empty($matches)) { 
    $formhash = $matches[1]; 
    } else { 
    die('Not found the forumhash.'); 
    } 

    $post_data = array(); 
    //帖子标题 
    $post_data['subject'] = 'test2'; 
    //帖子内容 
    $post_data['message'] = 'test2'; 
    $post_data['topicsubmit'] = "yes"; 
    $post_data['extra'] = ''; 
    //帖子标签 
    $post_data['tags'] = 'test'; 
    //帖子的hash码,这个非常关键!假如缺少这个hash码,discuz会警告你来路的页面不正确 
    $post_data['formhash']=$formhash; 

    $ch = curl_init($send_url); 
    curl_setopt($ch, CURLOPT_REFERER, $send_url); //伪装REFERER 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
    $contents = curl_exec($ch); 
    curl_close($ch); 
    //清理cookie文件 
    unlink($cookie_file); 
    ?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例