php中通过curl模拟登陆discuz论坛的实现代码


Posted in PHP onFebruary 16, 2012

libcurl同时也支持HTTPS认证、HTTP POST、HTTP PUT、 FTP 上传(这个也能通过PHP的FTP扩展完成)、HTTP 基于表单的上传、代理、cookies和用户名+密码的认证。
php的curl真的是相当好用,网上一搜索相关文章都是关于curl模拟登陆的,很少人提供模拟discuz发贴的源码。

<?php 
$discuz_url = 'http://127.0.0.1/discuz/';//论坛地址 
$login_url = $discuz_url .'logging.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 相关文章推荐
在字符串中把网址改成超级链接
Oct 09 PHP
一个简单的域名注册情况查询程序
Oct 09 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
19个超实用的PHP代码片段
Mar 14 PHP
在SAE上搭建最新wordpress的方法
Dec 21 PHP
php+mysqli使用面向对象方式更新数据库实例
Jan 29 PHP
10款实用的PHP开源工具
Oct 23 PHP
php修改数组键名的方法示例
Apr 15 PHP
php实现留言板功能(会话控制)
May 23 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 PHP
初品cakephp 入门基础
Feb 16 #PHP
php线性表顺序存储实现代码(增删查改)
Feb 16 #PHP
用PHP实现Ftp用户的在线管理
Feb 16 #PHP
PHP排序算法的复习和总结
Feb 15 #PHP
php网上商城购物车设计代码分享
Feb 15 #PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 #PHP
php _autoload自动加载类与机制分析
Feb 10 #PHP
You might like
php 保留小数点
2009/04/21 PHP
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
python实现ip查询示例
2014/03/26 Python
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
pandas.dataframe按行索引表达式选取方法
2018/10/30 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
开办化妆品公司创业计划书
2013/12/26 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
《花木兰》教学反思
2014/04/09 职场文书
赡养老人协议书
2014/04/21 职场文书
七夕活动策划方案
2014/08/16 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
nginx常用配置conf的示例代码详解
2022/03/21 Servers
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android