Я имею в виду, получить ВСЁ содержимое страницы не в html-коде, а в виде бинарных данных, чтобы даже картинки (точнее, их содержимое в виде кодированных данных) были затёсаны в это бинарное месиво?
Вырвать картинку капчи, запихнуть ее в файл, отправить курлом на сервис, получить ответ, начать авторизацию... Могу предоставить код, посмотрите... Просто после того, как я делаю в самом начале 1 запрос на captcha.php, я получаю код картинки, он сохраняется в файл. Этот файл отправляется, получаю адекватный ответ. Начинаю авторизацию - ошибка: неверно введена капча... Либо проблема в том, что file_get_contents(http://site.com/captcha.php) не создает сессию, либо запрос на login.php с пост-данными генерит капчу уже следующую, а не ту, которую я отправлял Добавлено спустя 52 секунды: а причем тут это?
Вот можете подсказать, каким образом? Я просто могу владеть не всей терминологией, но суть-то уловили?
несколько лет назад было очень популярно регистрировать хренову тучу почтовых ящиков (для рассылок спама). при это если почтовый сервис имел капча валидацию - бот принимал нужные заголовки, считывал картинку, показывал ее в форме на другом [партнерском] ресурсе (чаще порносайте) где человеки спокойно вводили правильные последовательности думая что это [партнерский] сайт от них что-то хочет. но данные формы отправлялись обратно боту, а бот - почтовому серверу успешно достигая своей цели. хттп это протокол без состояния. это значит что между двумя запросами клиент и сервер не знают друг о друге. да и два запроса трактуются как разные. одинаковость реализуется уже более высоким уровнем - через заголовки запроса и ответа. соответственно ничего не запрещает нам запросить капчу "как браузер", потом показать ее на другой странице, принять форму, отправить эту форму "как браузер" обратно валидирующему сайту. что именно нужно подержать у себя пока гоняем данные между сервером и реальным клиентом - будет уже от конкретного сервиса зависеть.
Думаю с твоими знаниями лучше воспользоваться программой на подобии Human Emulator, там на php можно получить картинку со страницы и отправить куда нужно.
На словах: ваша страница показывает некоторое изображение через пхп и Форму с полем ввода Строки. с этим справитесь? в процессе рендера страницы браузер Клиента делает гет-запрос к Скрипту изображения. Скрипт делает запрос к Сервису авторизации, записывает заголовки и байпасит Изображение (теперь с большой буквы) (то есть читает его с Сервиса и отправляет на свой эстэдэаут то есть Клиенту). тут курл в помощь. алгоритм зависит от конкретного Сервиса но в целом не сложно и легко собирается из отрывков в мануале. главное транслировать Идентификацию от Сервиса к Клиенту но так чтоб случайно не перемешать с Идентификацией принятой на нашем сайте. увидев Изображение радостный Клиент вводит увиденное в Форму и жмакает "отправить". принимающий Форму Сценарий видит не только Строку но и Идентификацию. извлекает из последней то что не относится к нашему сайту и формирует запрос на "отправку формы" на Сервис. после отправки формы внимательно смотрит на ответ от Сервиса и решает успех или провал. Итого. страница с Формой, скрипт изображения (считыватель с Сервиса), сценарий-таргет Формы (отправлятель на Сервис). 3 файлика.
Суть в том, что есть сервис antigate, позволяющий определять капчу. Я создал код, который позволяет: 1) Единожды зайти на domen/captcha.php, получить содержимое сгенерированной капчи, сохранить его в виде картинки 2) Отправляет картинку на сервис antigate, получая корректную расшифровку данной капчи 3) Затем, делая post-запрос через curl на файл domen/login.php, отправляет поля login, pass, hidden-поле formName и переменную captchaz, в которой содержится наша- расшифрованная капча Когда я получаю в ответ страницу, там высвечивается "Неверно введена капча". Я подозреваю, что запрос domen/captcha.php, который по идее должен в $_SESSION сохранять проверочный номер капчи, просто не сохраняет эту сессию и поэтому получаю "Неверно введенную капчу". Поэтому я думаю, что надо получить прям не html-код, а грубо говоря его бинарное содержимое, в который будет вшито не <img src='/capcha.php'>, а сама картинка, которую надо будет выдернуть, отправить на антигейт, вернуть ответ и отправить курл-авторизацию. Вот что я пытаюсь сказать.
глупость какая-то. похоже вы не понимаете как хттп работает. как по вашему работает капча? просто на примере "мой сайт защищается от ботов капчей". какой алгоритм? по пунктам.
нет никакого бинарного содержимого для html. разметка это одно, картинки это другое. они подгружаются отдельным запросом.
Поставьте прокси и посмотрите как идёт обмен данными при запросе страницы с картинкой чтобы понимать суть происходящего. Вы увидите что картинки запрашиваются отдельно от прочего контента страницы. В ответе на такие запросые сервер передаёт заголовки, свидетельствующие о передаче изображения, и, собственно, само изображение, разумеется, в двоичном формате. ... Content-Type: image/jpeg /пустая строка/ /двоичное содержимое фотографии/ Соответственно, задача сводится к запросу страницы с каптчей с получением SID и урла картинки, и запросу к скрипту-генератору каптчи за картинкой с этим же SID.
Твой CURL не подхватывает куки очевидно. Чтобы куки надежно сохранялись, надо задать имя файла для сохранения кукис. Еще вариант, идентификатор сессии передается в URL (?PHPSESSID=.... или своя переменная), в такой ситуации его надо распарсить и добавлять ко всем запросам. Задача стара как мир =)
Так, ладно. Предоставляю все необходимые ресурсы чтобы Вы их осмотрели, так сказать. Итак, главный файл (index.php): Код (PHP): require_once "antigate.php"; function login($url,$POST_FIELDS){ $ch = curl_init(); if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } curl_setopt($ch, CURLOPT_URL, $url); // откуда пришли на эту страницу curl_setopt($ch, CURLOPT_REFERER, $url); // cURL будет выводить подробные сообщения о всех производимых действиях curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_FIELDS); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4"); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //сохранять полученные COOKIE в файл curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); $result=curl_exec($ch); // Убеждаемся что произошло перенаправление после авторизации if(strpos($result,"Location: /user/user.php")===false) { $status = "Can't log in"; } else { $status = "Log in!"; } curl_close($ch); return array($result,$status); } function Read($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); // откуда пришли на эту страницу curl_setopt($ch, CURLOPT_REFERER, $url); //запрещаем делать запрос с помощью POST и соответственно разрешаем с помощью GET curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //отсылаем серверу COOKIE полученные от него при авторизации curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4"); $result = curl_exec($ch); curl_close($ch); return $result; } $data = file_get_contents("http://panteon-finance.com/captcha.php"); $img = "captcha.jpg"; $fp = fopen($img,"w+"); $fw = fwrite($fp,$data); fclose($fp); $CAPTCHA = recognize("captcha.jpg", // filename "fbc9986d3ad5beef3ee7bd32e0173bb6", // apikey false, // verbose "antigate.com", // domain 1, // rtime 20, // mtime 0, // phrase 0, // regsense 1, // numeric 0, // minlen 0, // maxlen 0); // russian echo "<img src='captcha.jpg'><hr/>"; echo "$CAPTCHA<hr/>"; $URL = "https://panteon-finance.com/login.php"; $LOGIN = "xxxxx"; $PASSWORD = "xxx"; $formName = base64_encode("membersLoginForm"); $POST_FIELDS = "formName=".$formName."&login=".$LOGIN."&pass=".$PASSWORD."&captchaz=".$CAPTCHA; echo "$POST_FIELDS<hr/>"; $result = login($URL,$POST_FIELDS); $RESULT = $result[0]; $STATUS = $result[1]; echo "$STATUS<hr/>"; echo $RESULT; Подключаемый файл antigate.php: Код (PHP): function recognize( $filename, $apikey, $is_verbose = true, $domain="antigate.com", $rtimeout = 5, $mtimeout = 120, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0, $is_russian = 0 ) { if (!file_exists($filename)) { if ($is_verbose) echo "file $filename not found\n"; return false; } $postdata = array( 'method' => 'post', 'key' => $apikey, 'file' => '@'.$filename, 'phrase' => $is_phrase, 'regsense' => $is_regsense, 'numeric' => $is_numeric, 'min_len' => $min_len, 'max_len' => $max_len, 'is_russian' => $is_russian ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://$domain/in.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($ch); if (curl_errno($ch)) { if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n"; return false; } curl_close($ch); if (strpos($result, "ERROR")!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } else { $ex = explode("|", $result); $captcha_id = $ex[1]; if ($is_verbose) echo "captcha sent, got captcha ID $captcha_id\n"; $waittime = 0; if ($is_verbose) echo "waiting for $rtimeout seconds\n"; sleep($rtimeout); while(true) { $result = file_get_contents("http://$domain/res.php?key=".$apikey.'&action=get&id='.$captcha_id); if (strpos($result, 'ERROR')!==false) { if ($is_verbose) echo "server returned error: $result\n"; return false; } if ($result=="CAPCHA_NOT_READY") { if ($is_verbose) echo "captcha is not ready yet\n"; $waittime += $rtimeout; if ($waittime>$mtimeout) { if ($is_verbose) echo "timelimit ($mtimeout) hit\n"; break; } if ($is_verbose) echo "waiting for $rtimeout seconds\n"; sleep($rtimeout); } else { $ex = explode('|', $result); if (trim($ex[0])=='OK') return trim($ex[1]); } } return false; } } скрипт капчи "http://panteon-finance.com/captcha.php" страница залогинивания = "https://panteon-finance.com/login.php" Все инструменты есть. Нужно просто обойти капчу и отобразить страницу https://panteon-finance.com/user/user.php