用cURL post数据问题

FG2006 2010-11-28 01:26:58
在程序中需要用cURL提交登录信息,可是这个网站登录时还有一个图片形式的验证码,这样还能通过cURL登录吗?
例如要登录www.tongji.baidu.com这个网站
...全文
1020 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qroom 2010-12-13
  • 打赏
  • 举报
回复
http://99juhui.com/php/ref.curl.html

图片识别不太现实
life169 2010-12-12
  • 打赏
  • 举报
回复
5楼的办法是要求手工输入验证码的,并非用php自动识别。

http://www.tongji.baidu.com/ 这个地址已经无法访问了,我不知道他的验证码是什么样的。

如果验证码的 字体 字的颜色 字的宽 字的高 第一个字符的偏移位置 如果这些是固定的,那就可以用php来搞定。 我就是用二值法搞顶bbsxp论坛的验证码的。

如果是用5楼的方法,手公输入验证码的话。
我做过一个远程查询ems单号跟踪查询的程序,跟你的这个在关键部位道理是一样的,也就是远程抓取验证码图片,然后在本地输入验证码,提交,然后登录成功!
http://life169.web-141.com/ems/ems.php 这个是我的那个远程查询ems单号系统。 你可以参考一下。 这个系统在csdn有的下载的。
FG2006 2010-12-09
  • 打赏
  • 举报
回复
我试了,代码也贴出来了,但是不知道那里有问题,总是登录不上呢
[Quote=引用 14 楼 sindel 的回复:]
5L说得很清楚了,方法是可行的,试试吧..以前做过登陆拍拍
[/Quote]
FG2006 2010-12-09
  • 打赏
  • 举报
回复
谢谢你的回答,就这么肯定不能登录吗,我觉得5楼的方式是可行的呀,只是我程序不知道有什么问题
[Quote=引用 13 楼 heyc1998 的回复:]
你别白忙活了!
明确告诉你,除非你能将获取到的验证码图片智能职别,否则无法做到自动登陆!
而且光是用php识别图片的话难度还是很大的!之前有些关于图片识别的方法,但是试用面都比较窄!

如果你是系统的用户的话,还是向baidu要接口去!
[/Quote]
sindel 2010-12-06
  • 打赏
  • 举报
回复
5L说得很清楚了,方法是可行的,试试吧..以前做过登陆拍拍
happy664618843 2010-12-05
  • 打赏
  • 举报
回复
高手 学习!!!!
在-云端 2010-12-05
  • 打赏
  • 举报
回复
你别白忙活了!
明确告诉你,除非你能将获取到的验证码图片智能职别,否则无法做到自动登陆!
而且光是用php识别图片的话难度还是很大的!之前有些关于图片识别的方法,但是试用面都比较窄!

如果你是系统的用户的话,还是向baidu要接口去!
FG2006 2010-11-30
  • 打赏
  • 举报
回复
自己顶一下,还是不知道哪里有问题
FG2006 2010-11-30
  • 打赏
  • 举报
回复
我按你说的试一下,一直没有成功,我把验证码下图片载到本地了,可是输出vget获得的内容,验证码却与下载的图片上的验证码不同,是不是这里的原因呢?
[Quote=引用 5 楼 cncpt01 的回复:]
明确告诉你可以
服务器建立一个请求 抓取要登录的页面 将cookies 保存到 服务器的文件. (CURLOPT_COOKIEJAR)
同时读取页面返回的 图片 将图片保存

将这些返回给用户. 要用户输入用户名 密码 图片数字

再提交给服务器 服务器转发给 被请求的服务器. 验证成功后就可以了.

以前的 sns 网站采用这种方式获取 qq 邮箱用户 我做过 代码自己慢慢……
[/Quote]
FG2006 2010-11-30
  • 打赏
  • 举报
回复

$cookie_file = dirname(__FILE__)."/cookie_".md5(basename(__FILE__)).".txt"; // 设置Cookie文件保存路径及文件名
$img_file = dirname(__FILE__)."/img_".md5(basename(__FILE__)).".png"; //
function vget($url){ // 模拟获取内容函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_HTTPGET, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_COOKIEJAR, $GLOBALS['cookie_file']); // 存放Cookie信息的文件名称
curl_setopt($curl, CURLOPT_COOKIEFILE, $GLOBALS['cookie_file']); // 读取上面所储存的Cookie信息
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);
}
curl_close($curl); // 关闭CURL会话
return $tmpInfo; // 返回数据
}
function vpost($url,$data){ // 模拟提交数据函数
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_COOKIEFILE, $GLOBALS['cookie_file']); // 读取上面所储存的Cookie信息
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
$tmpInfo = curl_exec($curl); // 执行操作
if (curl_errno($curl)) {
echo 'Errno'.curl_error($curl);
}
curl_close($curl); // 关键CURL会话
return $tmpInfo; // 返回数据
}
function delcookie($cookie_file){ // 删除Cookie函数
@unlink($cookie_file); // 执行删除
}

// 使用实例
if(!file_exists($cookie_file)) { // 检测Cookie是否存在
$str = vget('http://tongji.baidu.com/hm-web/welcome/login'); // 获取登录随机值
print_r($str);
preg_match("/<img width=\"48\" height=\"20\" align=\"absmiddle\" src=\"(.*?)\"/is",$str,$hash); // 提取登录随机值
echo $hash[1];
//获得验证码图片
ob_start();
readfile($hash[1]);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img);
$fp2=@fopen($img_file, "a");
fwrite($fp2,$img);
fclose($fp2);
flush();
ob_flush();
}

然后调用 vpost('https://cas.baidu.com/','action=login&UserName=用户名&Password=密码&Valicode=获得的图片上的验证码'); ,但是一直登录不成功,各位帮忙看看哪里出问题了
igaojie 2010-11-29
  • 打赏
  • 举报
回复
这个图片样式的验证码你只能通过其他方式读取到图片上的内容post过去才行!
要不然 你很难绕过这个图片验证!
CNCPT01 2010-11-29
  • 打赏
  • 举报
回复
明确告诉你可以
服务器建立一个请求 抓取要登录的页面 将cookies 保存到 服务器的文件. (CURLOPT_COOKIEJAR)
同时读取页面返回的 图片 将图片保存

将这些返回给用户. 要用户输入用户名 密码 图片数字

再提交给服务器 服务器转发给 被请求的服务器. 验证成功后就可以了.

以前的 sns 网站采用这种方式获取 qq 邮箱用户 我做过 代码自己慢慢研究吧 我一般只说思路.
码农XP 2010-11-29
  • 打赏
  • 举报
回复
就是做个http代理吧。5楼的做法很可行。
FG2006 2010-11-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 amani11 的回复:]
验证码,单靠php很难破解的


可以读出验证码图片,保存cookie,然后带上cookie和验证码+账户、密码提交,模拟登陆
[/Quote]
能给个代码例子吗,有点不大懂呢
amani11 2010-11-28
  • 打赏
  • 举报
回复
验证码,单靠php很难破解的


可以读出验证码图片,保存cookie,然后带上cookie和验证码+账户、密码提交,模拟登陆
xuzuning 2010-11-28
  • 打赏
  • 举报
回复
用 php 实现 OCR 是不现实的。
所以通常是将校验码图片传递给用户,由用户输入校验码后再返还给服务端

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧