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 巧用数组降低程序的时间复杂度
Jan 01 PHP
PHP 防恶意刷新实现代码
May 16 PHP
解析ajax事件的调用顺序
Jun 17 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
php关联数组快速排序的方法
Apr 17 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
PHP Smarty模版简单使用方法
Mar 30 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 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边学边教》(04.编写简易的通讯录――视频教程1)
2006/12/13 PHP
php框架Phpbean说明
2008/01/10 PHP
$_GET['goods_id']+0 的使用详解
2013/06/06 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jquery等待效果示例
2014/05/01 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
[41:52]2018DOTA2亚洲邀请赛3月29日小组赛B组Effect VS Secret
2018/03/30 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
python读取中文txt文本的方法
2018/04/12 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
寒假实习自荐信
2014/01/26 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
品牌服务方案
2014/06/03 职场文书
交通事故和解协议书
2014/09/25 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL