За последние 24 часа нас посетили 52649 программистов и 1473 робота. Сейчас ищут 1226 программистов ...

Возможно ли считать страницу сайта БИНАРНО?

Тема в разделе "PHP для новичков", создана пользователем EndoCrinolog, 25 окт 2014.

  1. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Я имею в виду, получить ВСЁ содержимое страницы не в html-коде, а в виде бинарных данных, чтобы даже картинки (точнее, их содержимое в виде кодированных данных) были затёсаны в это бинарное месиво?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Можно, но написать самому надо будет :)
     
  3. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
  4. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Вырвать картинку капчи, запихнуть ее в файл, отправить курлом на сервис, получить ответ, начать авторизацию... Могу предоставить код, посмотрите... Просто после того, как я делаю в самом начале 1 запрос на captcha.php, я получаю код картинки, он сохраняется в файл. Этот файл отправляется, получаю адекватный ответ. Начинаю авторизацию - ошибка: неверно введена капча...
    Либо проблема в том, что file_get_contents(http://site.com/captcha.php) не создает сессию, либо запрос на login.php с пост-данными генерит капчу уже следующую, а не ту, которую я отправлял

    Добавлено спустя 52 секунды:
    а причем тут это?
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    При том что твой вопрос сформулирован в корне неверно. Но да - можно.
     
  6. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Вот можете подсказать, каким образом? Я просто могу владеть не всей терминологией, но суть-то уловили?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    "снимок" страницы можно сделать, но каптчу это тебе не поможет решить никак.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    несколько лет назад было очень популярно регистрировать хренову тучу почтовых ящиков (для рассылок спама). при это если почтовый сервис имел капча валидацию - бот принимал нужные заголовки, считывал картинку, показывал ее в форме на другом [партнерском] ресурсе (чаще порносайте) где человеки спокойно вводили правильные последовательности думая что это [партнерский] сайт от них что-то хочет. но данные формы отправлялись обратно боту, а бот - почтовому серверу успешно достигая своей цели.

    хттп это протокол без состояния. это значит что между двумя запросами клиент и сервер не знают друг о друге. да и два запроса трактуются как разные. одинаковость реализуется уже более высоким уровнем - через заголовки запроса и ответа. соответственно ничего не запрещает нам запросить капчу "как браузер", потом показать ее на другой странице, принять форму, отправить эту форму "как браузер" обратно валидирующему сайту. что именно нужно подержать у себя пока гоняем данные между сервером и реальным клиентом - будет уже от конкретного сервиса зависеть.
     
  9. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    А Вы можете хотя бы примерно показать, как можно получить страницу таким вот образом?
     
  10. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Думаю с твоими знаниями лучше воспользоваться программой на подобии Human Emulator, там на php можно получить картинку со страницы и отправить куда нужно.
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    На словах: ваша страница показывает некоторое изображение через пхп и Форму с полем ввода Строки.
    с этим справитесь?

    в процессе рендера страницы браузер Клиента делает гет-запрос к Скрипту изображения. Скрипт делает запрос к Сервису авторизации, записывает заголовки и байпасит Изображение (теперь с большой буквы) (то есть читает его с Сервиса и отправляет на свой эстэдэаут то есть Клиенту).
    тут курл в помощь. алгоритм зависит от конкретного Сервиса но в целом не сложно и легко собирается из отрывков в мануале. главное транслировать Идентификацию от Сервиса к Клиенту но так чтоб случайно не перемешать с Идентификацией принятой на нашем сайте.

    увидев Изображение радостный Клиент вводит увиденное в Форму и жмакает "отправить". принимающий Форму Сценарий видит не только Строку но и Идентификацию. извлекает из последней то что не относится к нашему сайту и формирует запрос на "отправку формы" на Сервис. после отправки формы внимательно смотрит на ответ от Сервиса и решает успех или провал.

    Итого. страница с Формой, скрипт изображения (считыватель с Сервиса), сценарий-таргет Формы (отправлятель на Сервис). 3 файлика.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Какую задачу ты пытаешься решить?
     
  13. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Суть в том, что есть сервис 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'>, а сама картинка, которую надо будет выдернуть, отправить на антигейт, вернуть ответ и отправить курл-авторизацию. Вот что я пытаюсь сказать.
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    глупость какая-то. похоже вы не понимаете как хттп работает.
    как по вашему работает капча? просто на примере "мой сайт защищается от ботов капчей". какой алгоритм? по пунктам.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Просто нужно добыть урл картинки.
     
  16. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    нет никакого бинарного содержимого для html. разметка это одно, картинки это другое. они подгружаются отдельным запросом.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не говори так! =(
     
  18. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Поставьте прокси и посмотрите как идёт обмен данными при запросе страницы с картинкой чтобы понимать суть происходящего.
    Вы увидите что картинки запрашиваются отдельно от прочего контента страницы. В ответе на такие запросые сервер передаёт заголовки, свидетельствующие о передаче изображения, и, собственно, само изображение, разумеется, в двоичном формате.
    ...
    Content-Type: image/jpeg
    /пустая строка/
    /двоичное содержимое фотографии/

    Соответственно, задача сводится к запросу страницы с каптчей с получением SID и урла картинки, и запросу к скрипту-генератору каптчи за картинкой с этим же SID.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можно просто тыкнуть inspect element и вкладка network
     
  20. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Твой CURL не подхватывает куки очевидно. Чтобы куки надежно сохранялись, надо задать имя файла для сохранения кукис.
    Еще вариант, идентификатор сессии передается в URL (?PHPSESSID=.... или своя переменная), в такой ситуации его надо распарсить и добавлять ко всем запросам.
    Задача стара как мир =)
     
  21. EndoCrinolog

    EndoCrinolog Активный пользователь

    С нами с:
    4 фев 2012
    Сообщения:
    205
    Симпатии:
    1
    Адрес:
    Тольятти
    Так, ладно. Предоставляю все необходимые ресурсы чтобы Вы их осмотрели, так сказать.
    Итак, главный файл (index.php):
    Код (PHP):
    1.     require_once "antigate.php";
    2.     
    3.     function login($url,$POST_FIELDS){
    4.         $ch = curl_init();
    5.         if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https
    6.             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    7.             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    8.         }
    9.         curl_setopt($ch, CURLOPT_URL, $url);
    10.         // откуда пришли на эту страницу
    11.         curl_setopt($ch, CURLOPT_REFERER, $url);
    12.         // cURL будет выводить подробные сообщения о всех производимых действиях
    13.         curl_setopt($ch, CURLOPT_VERBOSE, 1);
    14.         curl_setopt($ch, CURLOPT_POST, 1);
    15.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    16.         curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_FIELDS);
    17.         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");
    18.         curl_setopt($ch, CURLOPT_HEADER, 1);
    19.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    20.         //сохранять полученные COOKIE в файл
    21.         curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
    22.         $result=curl_exec($ch);
    23.  
    24.         // Убеждаемся что произошло перенаправление после авторизации
    25.         if(strpos($result,"Location: /user/user.php")===false)
    26.         {
    27.             $status = "Can't log in";
    28.         } else
    29.         {
    30.             $status = "Log in!";
    31.         }
    32.  
    33.         curl_close($ch);
    34.  
    35.         return array($result,$status);
    36.     }
    37.     
    38.     function Read($url){
    39.         $ch = curl_init();
    40.         curl_setopt($ch, CURLOPT_URL, $url);
    41.         // откуда пришли на эту страницу
    42.         curl_setopt($ch, CURLOPT_REFERER, $url);
    43.         //запрещаем делать запрос с помощью POST и соответственно разрешаем с помощью GET
    44.         curl_setopt($ch, CURLOPT_POST, 0);
    45.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    46.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    47.         //отсылаем серверу COOKIE полученные от него при авторизации
    48.         curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
    49.         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");
    50.  
    51.         $result = curl_exec($ch);
    52.  
    53.         curl_close($ch);
    54.  
    55.         return $result;
    56.     }
    57.     
    58.     $data = file_get_contents("http://panteon-finance.com/captcha.php");
    59.  
    60.     $img = "captcha.jpg";
    61.     $fp = fopen($img,"w+");
    62.     $fw = fwrite($fp,$data);
    63.     fclose($fp);
    64.     
    65.     $CAPTCHA = recognize("captcha.jpg", // filename
    66.                     "fbc9986d3ad5beef3ee7bd32e0173bb6", // apikey
    67.                     false, // verbose
    68.                     "antigate.com", // domain
    69.                     1, // rtime
    70.                     20, // mtime
    71.                     0, // phrase
    72.                     0, // regsense
    73.                     1, // numeric
    74.                     0, // minlen
    75.                     0, // maxlen
    76.                     0); // russian
    77.     
    78.     echo "<img src='captcha.jpg'><hr/>";
    79.  
    80.     echo "$CAPTCHA<hr/>";
    81.     
    82.     $URL = "https://panteon-finance.com/login.php";
    83.     $LOGIN = "xxxxx";
    84.     $PASSWORD = "xxx";
    85.     $formName = base64_encode("membersLoginForm");
    86.     $POST_FIELDS = "formName=".$formName."&login=".$LOGIN."&pass=".$PASSWORD."&captchaz=".$CAPTCHA;
    87.     
    88.     echo "$POST_FIELDS<hr/>";
    89.     
    90.     $result = login($URL,$POST_FIELDS);
    91.     
    92.     $RESULT = $result[0];
    93.     $STATUS = $result[1];
    94.     
    95.     echo "$STATUS<hr/>";
    96.     
    97.     echo $RESULT; 
    Подключаемый файл antigate.php:
    Код (PHP):
    1. function recognize(
    2.             $filename,
    3.             $apikey,
    4.             $is_verbose = true,
    5.             $domain="antigate.com",
    6.             $rtimeout = 5,
    7.             $mtimeout = 120,
    8.             $is_phrase = 0,
    9.             $is_regsense = 0,
    10.             $is_numeric = 0,
    11.             $min_len = 0,
    12.             $max_len = 0,
    13.             $is_russian = 0
    14.             )
    15. {
    16.     if (!file_exists($filename))
    17.     {
    18.         if ($is_verbose) echo "file $filename not found\n";
    19.         return false;
    20.     }
    21.     $postdata = array(
    22.         'method'    => 'post', 
    23.         'key'       => $apikey, 
    24.         'file'      => '@'.$filename,
    25.         'phrase'    => $is_phrase,
    26.         'regsense'    => $is_regsense,
    27.         'numeric'    => $is_numeric,
    28.         'min_len'    => $min_len,
    29.         'max_len'    => $max_len,
    30.     'is_russian'    => $is_russian
    31.         
    32.     );
    33.     $ch = curl_init();
    34.     curl_setopt($ch, CURLOPT_URL,             "http://$domain/in.php");
    35.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,     1);
    36.     curl_setopt($ch, CURLOPT_TIMEOUT,             60);
    37.     curl_setopt($ch, CURLOPT_POST,                 1);
    38.     curl_setopt($ch, CURLOPT_POSTFIELDS,         $postdata);
    39.     $result = curl_exec($ch);
    40.     if (curl_errno($ch)) 
    41.     {
    42.         if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n";
    43.         return false;
    44.     }
    45.     curl_close($ch);
    46.     if (strpos($result, "ERROR")!==false)
    47.     {
    48.         if ($is_verbose) echo "server returned error: $result\n";
    49.         return false;
    50.     }
    51.     else
    52.     {
    53.         $ex = explode("|", $result);
    54.         $captcha_id = $ex[1];
    55.         if ($is_verbose) echo "captcha sent, got captcha ID $captcha_id\n";
    56.         $waittime = 0;
    57.         if ($is_verbose) echo "waiting for $rtimeout seconds\n";
    58.         sleep($rtimeout);
    59.         while(true)
    60.         {
    61.             $result = file_get_contents("http://$domain/res.php?key=".$apikey.'&action=get&id='.$captcha_id);
    62.             if (strpos($result, 'ERROR')!==false)
    63.             {
    64.                 if ($is_verbose) echo "server returned error: $result\n";
    65.                 return false;
    66.             }
    67.             if ($result=="CAPCHA_NOT_READY")
    68.             {
    69.                 if ($is_verbose) echo "captcha is not ready yet\n";
    70.                 $waittime += $rtimeout;
    71.                 if ($waittime>$mtimeout) 
    72.                 {
    73.                     if ($is_verbose) echo "timelimit ($mtimeout) hit\n";
    74.                     break;
    75.                 }
    76.                 if ($is_verbose) echo "waiting for $rtimeout seconds\n";
    77.                 sleep($rtimeout);
    78.             }
    79.             else
    80.             {
    81.                 $ex = explode('|', $result);
    82.                 if (trim($ex[0])=='OK') return trim($ex[1]);
    83.             }
    84.         }
    85.         
    86.         return false;
    87.     }
    88. } 
    скрипт капчи "http://panteon-finance.com/captcha.php"
    страница залогинивания = "https://panteon-finance.com/login.php"

    Все инструменты есть. Нужно просто обойти капчу и отобразить страницу https://panteon-finance.com/user/user.php
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768