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 相关文章推荐
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
解决phpmyadmin中缺少mysqli扩展问题的方法
May 06 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 PHP
PHP URL参数获取方式的四种例子
Feb 28 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
php实现文章置顶功能的方法
Oct 20 PHP
PHP设置images目录不充许http访问的方法
Nov 01 PHP
浅析PHP7的多进程及实例源码
Apr 14 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
PHP fopen中文文件名乱码问题解决方案
Oct 28 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 只允许指定IP访问(允许*号通配符过滤IP)
2014/07/08 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
php日期操作技巧小结
2016/06/25 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
调试Javascript代码(浏览器F12及VS中debugger关键字)
2013/01/25 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
Jquery插件分享之气泡形提示控件grumble.js
2014/05/20 Javascript
js实现文字滚动效果
2016/03/03 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
protractor的安装与基本使用教程
2017/07/07 Javascript
JS设计模式之策略模式概念与用法分析
2018/02/05 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Python数组并集交集补集代码实例
2020/02/18 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
给排水工程师岗位职责
2013/11/21 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
党员批评与自我批评发言稿
2014/10/14 职场文书
设备技术员岗位职责
2015/04/11 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
普希金的诗歌赏析(3首)
2019/08/20 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫
Android在Sqlite3中的应用及多线程使用数据库的建议
2022/04/24 Java/Android
Promise静态四兄弟实现示例详解
2022/07/07 Javascript