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中实现进程间通讯
Oct 09 PHP
怎样在UNIX系统下安装php3
Oct 09 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
理解php原理的opcodes(操作码)
Oct 26 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
php实现处理输入转义字符的代码
Nov 08 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
Centos6.5和Centos7 php环境搭建方法
May 27 PHP
php获取远程图片并下载保存到本地的方法分析
Oct 08 PHP
PHP编程中的Session阻塞问题与解决方法分析
Aug 07 PHP
PHP数组常用函数实例小结
Aug 20 PHP
Laravel ORM 数据model操作教程
Oct 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安装全攻略:APACHE
2006/10/09 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
PHP版网站缓存加快打开速度的方法分享
2012/06/03 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
php实现两个数组相加的方法
2015/02/17 PHP
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
2013/01/07 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
Angular2库初探
2017/03/01 Javascript
node使用UEditor富文本编辑器的方法实例
2017/07/11 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
jQuery实现的隔行变色功能【案例】
2019/02/18 jQuery
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
2020/02/28 Python
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
高中生毕业自我鉴定范文
2013/12/22 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
农村党员一句话承诺
2014/05/30 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
Jackson 反序列化时实现大小写不敏感设置
2021/06/29 Java/Android
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
Tomcat starup.bat 脚本实现开机自启动
2022/04/20 Servers
MYSQL常用函数介绍
2022/05/05 MySQL