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中使用Oracle数据库(1)
Oct 09 PHP
请php正则走开
Mar 15 PHP
域名和cookie问题(域名后缀)
Oct 10 PHP
ThinkPHP连接数据库的方式汇总
Dec 05 PHP
php使用MySQL保存session会话的方法
Jun 18 PHP
PHP数组去重比较快的实现方式
Jan 19 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP的PDO预处理语句与存储过程
Jan 27 PHP
PHP使用非对称加密算法RSA
Apr 21 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(5) 类和对象
2010/02/16 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
JQuery表格拖动调整列宽效果(自己动手写的)
2014/09/01 Javascript
js防止页面被iframe调用的方法
2014/10/30 Javascript
jQuery操作表单常用控件方法小结
2015/03/23 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
python中的字典详细介绍
2014/09/18 Python
常见python正则用法的简单实例
2016/06/21 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Django中的Model操作表的实现
2018/07/24 Python
python getpass实现密文实例详解
2019/09/24 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
大学生毕业自我评价范文分享
2013/11/07 职场文书
医药个人求职信范文
2014/01/29 职场文书
小小商店教学反思
2014/04/27 职场文书
本科生就业推荐信
2014/05/19 职场文书
暑期教师培训方案
2014/06/07 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
现役军人家属慰问信
2015/03/24 职场文书
如何判断微信付款码和支付宝付款码
2021/04/01 PHP
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Python中的变量与常量
2021/11/11 Python
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python