CURL 如何使用验证码和会话登录
Posted
技术标签:
【中文标题】CURL 如何使用验证码和会话登录【英文标题】:How CURL Login with Captcha and Session 【发布时间】:2011-08-13 15:24:50 【问题描述】: 定义('COOKIE','./cookie.txt'); 定义('MYURL', 'https://register.pandi.or.id/main'); 函数 getUrl($url, $method='', $vars='', $open=false) $agents = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (Khtml, like Gecko) Chrome/10.0.648.204 Safari/534.16'; $header_array = 数组( "通过: 1.1 register.pandi.or.id", “保持活动状态:超时=15,最大=100”, ); 静态 $cookie = 假; 如果(!$cookie) $cookie = session_name() 。 '=' 。时间(); $referer = 'https://register.pandi.or.id/main'; $ch = curl_init(); if ($method == 'post') curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "$vars"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header_array); curl_setopt($ch, CURLOPT_USERAGENT, $agents); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 5); curl_setopt($ch, CURLOPT_MAXREDIRS, 10); curl_setopt($ch, CURLOPT_REFERER, $referer); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE); curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); $buffer = curl_exec($ch); if (curl_errno($ch)) 回声“错误”。 curl_error($ch); 死; curl_close($ch); 返回$缓冲区; 函数保存验证码($ch) $agents = 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16'; $url = "https://register.pandi.or.id/jcaptcha"; 静态 $cookie = 假; 如果(!$cookie) $cookie = session_name() 。 '=' 。时间(); $ch = curl_init(); // 初始化一个 CURL 会话。 curl_setopt($ch, CURLOPT_URL, $url); // 传递 URL 作为参数。 curl_setopt($ch, CURLOPT_USERAGENT, $agents); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIE, $cookie); curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE); curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回流内容。 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); // 我们将返回这个 $data = curl_exec($ch); // // 抓取 jpg 并将内容保存在 curl_close($ch); // 关闭 curl 资源,释放系统资源。 $captcha_tmpfile = './captcha/captcha-' 。兰德(1000, 10000)。 '.jpg'; $fp = fopen($tmpdir . $captcha_tmpfile, 'w'); fwrite($fp, $data); fclose($fp); 返回 $captcha_tmpfile; if (isset($_POST['captcha'])) $id = "yudohartono"; $pw = "我的密码"; $postfields = "navigation=authenticate&login-type=registrant&username=" . $id 。 “&密码=”。 $pw 。 “&captcha_response=”。 $_POST['验证码'] 。 “按=登录”; $url = "https://register.pandi.or.id/main"; $result = getUrl($url, 'post', $postfields); 回显$结果; 别的 $open = getUrl('https://register.pandi.or.id/main', '', '', true); $captcha = save_captcha($ch); $fp = fopen($tmpdir . "/cookie12.txt", 'r'); $a = fread($fp, filesize($tmpdir . "/cookie12.txt")); fclose($fp); <form action='' method='POST'>
<img src='<?php echo $captcha ?>' />
<input type='text' name='captcha' value=''>
<input type='submit' value='proses'>
</form>";
if (!is_readable('cookie.txt') && !is_writable('cookie.txt'))
echo "cookie 读取失败";
chmod('../pandi/', '777');
这个 cookie.txt
# 网景 HTTP Cookie 文件 # http://curl.haxx.se/rfc/cookie_spec.html # 这个文件是由 libcurl 生成的!编辑风险自负。 register.pandi.or.id FALSE / FALSE 0 JSESSIONID 05CA8241C5B76F70F364CA244E4D1DF4提交表单后显示
HTTP/1.1 200 OK 日期:2011 年 4 月 27 日星期三 07:38:08 GMT 服务器:Apache-Coyote/1.1 X-Powered-By:Servlet 2.4; Tomcat-5.0.28/JBoss-4.0.0 (build: CVSTag=JBoss_4_0_0 date=200409200418) Content-Length: 0 Via: 1.1 register.pandi.or.id Content-Type: text/plain X-Pad: 避免浏览器错误如果不是错误“验证码无效” 总是无法登录 pandi 我的脚本有什么问题? 我不想破坏验证码,但我想从我的网页显示验证码和用户输入验证码,以便用户可以从我的网络自动注册域 dotID
【问题讨论】:
【参考方案1】:用PHP我不知道怎么做,你必须得到验证码并找到解决它的方法。它有很多算法可以为你做这件事,但如果你想使用 java,我已经从this link 破解了源代码来获取解决验证码的代码,它适用于很多验证码系统。
因此,您可以尝试实现自己的验证码求解器,这将花费大量时间,尝试找到 PHP 的现有实现,或者恕我直言,最好的选择是使用 JDownloader 代码库。
【讨论】:
【参考方案2】:这是因为,
您从第一个 getURL (ie first curl_exec)
获取您的验证码图像并处理了验证码,但要提交您的验证码,您需要 getURL (ie again curl_exec)
这意味着再次使用新验证码进入一个新页面。
因此,您将旧验证码放入新验证码中。我遇到了同样的问题并解决了。
【讨论】:
【参考方案3】:是的,安德罗·塞尔瓦是对的。在第二个请求中,它提供了新的验证码。一旦它使用 getUrl 函数加载验证码,第二次加载来自 save_captcha 函数,所以这是两个不同的图像。
它必须这样做: 在关闭 curl 之前和发布之前下载验证码图像,并告诉脚本等到您提供验证码答案 - 我将使用 preg_match。它还需要一些 javascript。
如果验证码图像是从 javascript 生成的,则需要使用相同的 cookie 或令牌执行此 javascript。在这种情况下,更简单的解决方案是使用例如记录标题。 mozila ffox 的 livehttpheaders 插件。
【讨论】:
【参考方案4】:使用无头浏览解决方案是可能的。即:Node.js 上的zombie.js coffee.js。也可以从验证码中提取“图像”,并使用图像识别“读取”图像并将其转换为文本,然后将其与表单一起发布.
截至今天,“欺骗”验证码的唯一可靠方法是使用无头浏览。
【讨论】:
【参考方案5】:验证码旨在区分人类和机器人(程序)。好像您正在尝试使用程序登录。验证码似乎完成了它的工作:)。
我没有看到合法的方法。
【讨论】:
我同意@bazmegakapa - 但你可能想阅读这个cs.sfu.ca/~mori/research/gimpy 我得到验证码并显示用户输入而不是登录,我这样做是因为我希望我的客户可以将域自动注册到 pandi.or.id 并从我的网页管理他们的域,因为 pandi.or .id 没有像其他域名注册商那样的 API 你联系过PANDI吗?应该从那开始。 我联系了 PANDI,他们说他们没有 API 或经销商计划,所以我们必须为我们的客户手动注册域 不能抓图让我们手动输入验证码吗?【参考方案6】:Captcha 是您点击页面时服务器创建的动态图像。它会不断变化,您必须从页面中提取验证码,然后对其进行解析,然后提交您的页面以进行登录。当页面被触发加载时,验证码会不断变化!
【讨论】:
以上是关于CURL 如何使用验证码和会话登录的主要内容,如果未能解决你的问题,请参考以下文章
PHP cURL 没有存储会话 cookie...如何解决这个问题?
如何使用 MongoDB + NodeJS Express 向 ReactJS React Router 和 Redux 添加登录身份验证和会话?