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 相关文章推荐
php 进度条实现代码
Mar 10 PHP
php下将XML转换为数组
Jan 01 PHP
PHP企业级应用之常见缓存技术篇
Jan 27 PHP
PHP内核探索:变量概述
Jan 30 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
PHP微信开发之模板消息回复
Jun 24 PHP
如何使用php等比例缩放图片
Oct 12 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 PHP
thinkPHP框架实现的无限回复评论功能示例
Jun 09 PHP
在TP5数据库中四个字段实现无限分类的示例
Oct 18 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操作excel文件 基于phpexcel
2010/07/02 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
yii上传文件或图片实例
2014/04/01 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
php类的定义与继承用法实例
2015/07/07 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)
2017/05/30 PHP
js工具方法弹出蒙版
2013/05/08 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
Bootstrap Paginator分页插件与ajax相结合实现动态无刷新分页效果
2016/05/27 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
python解析xml模块封装代码
2014/02/07 Python
零基础写python爬虫之抓取糗事百科代码分享
2014/11/06 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
详解python中递归函数
2019/04/16 Python
20行python代码实现人脸识别
2019/05/05 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
Python 使用指定的网卡发送HTTP请求的实例
2019/08/21 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
网络专业学生个人的自我评价
2013/12/16 职场文书
求职自我推荐信
2014/06/25 职场文书
大学课外活动总结
2014/07/09 职场文书
2014年底工作总结
2014/12/15 职场文书
小区环境卫生倡议书
2015/04/29 职场文书