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程序?
Dec 08 PHP
PHP iconv 函数转gb2312的bug解决方法
Oct 11 PHP
php设计模式 FlyWeight (享元模式)
Jun 26 PHP
一些需要禁用的PHP危险函数(disable_functions)
Feb 23 PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 PHP
无需重新编译php加入ftp扩展的解决方法
Feb 07 PHP
基于session_unset与session_destroy的区别详解
Jun 03 PHP
header与缓冲区之间的深层次分析
Jul 30 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
PHP设计模式之状态模式定义与用法详解
Apr 02 PHP
PHP fclose函数用法总结
Feb 15 PHP
Laravel开启跨域请求的方法
Oct 13 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会员权限控制实现原理分析
2011/05/29 PHP
CodeIgniter使用smtp服务发送html邮件的方法
2015/06/10 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
2016/03/17 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
jquery animate图片模向滑动示例代码
2011/01/26 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
Vue.JS入门教程之处理表单
2016/12/01 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
Vue的属性、方法、生命周期实例代码详解
2019/09/17 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
pytorch forward两个参数实例
2020/01/17 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
生产主管岗位职责
2013/11/10 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
写给女生的道歉信
2014/01/14 职场文书
中学政教处工作总结
2015/08/13 职场文书
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python