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 11 PHP
php设计模式 Observer(观察者模式)
Jun 26 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
反射调用private方法实践(php、java)
Dec 21 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php 的多进程操作实践案例分析
Feb 28 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
Mar 16 PHP
禁止直接访问php文件代码分享
May 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中过滤非法字符的具体实现
2013/10/29 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
JavaScript中instanceof运算符的用法总结
2013/11/19 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
javascript实现动态标签云
2015/10/16 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
ZeroClipboard.js使用一个flash复制多个文本框
2017/06/19 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
vue 中的动态传参和query传参操作
2020/11/09 Javascript
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
如何一键升级Python所有包
2020/11/05 Python
Django url 路由匹配过程详解
2021/01/22 Python
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
大学生求职简历的自我评价
2013/10/21 职场文书
请假条怎么写
2014/04/10 职场文书
母亲节演讲稿
2014/05/27 职场文书
迎国庆演讲稿
2014/09/05 职场文书
2014司机年终工作总结
2014/12/05 职场文书
万里长城导游词
2015/01/30 职场文书
第二次离婚起诉书
2015/05/18 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
Python如何导出导入所有依赖包详解
2021/06/08 Python
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸