Авторизация Curl на конкретном примере

Тема в разделе "PHP", создана пользователем sonya2003, 9 авг 2016.

Модераторы: latteo
  1. sonya2003

    sonya2003 Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    25
    Симпатии:
    2
    Необходимо авторизоваться на сайте, для дальнейшего парсинга прайса товаров. После выполнения скрипта файл с куками содержит
    xamillion.com FALSE / FALSE 0 PHPSESSID b6ea0t74ju45suk73f14l87j43, т.е как я поняла куки не передались. Произошла ли авторизация также под вопросом, так как выводит кракозябры. Помогите разобраться, пожалуйста!!!
    PHP:
    <?php

    function curl_get($url$referer='http://www.google.com'$post$headers) {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$url);
        
    curl_setopt($chCURLOPT_HEADER0);
        
    curl_setopt($chCURLOPT_USERAGENT"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)");
        
    curl_setopt($chCURLOPT_REFERER$referer);
        
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
        
    curl_setopt($chCURLOPT_POSTtrue);
        
    curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($post));
        
    curl_setopt($chCURLOPT_COOKIESESSIONtrue);
        
    curl_setopt($chCURLOPT_COOKIEJAR$_SERVER['DOCUMENT_ROOT'].'/parse/cooks.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/parse/cooks.txt');
        
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
         
    $data curl_exec($ch);
        
    curl_close($ch);
        return 
    $data;
    }

        
    $post = [
            
    'login' => 'mail@mail.ru',
            
    'password' => 'qwerty',
            
    'log' => ''
            
    ];

        
    $headers = [
    'Host: site.com',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:47.0) Gecko/20100101 Firefox/47.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: ru,en-US;q=0.7,en;q=0.3',
    'Content-Type: application/x-www-form-urlencoded',
    'Connection: keep-alive'
            
    ];

    $html curl_get('http://site.com/login/''http://site.com/catalog/'$post$headers);

    echo 
    '<pre>';
    print_r($html);
    echo 
    '</pre>';
     
    ?>
     
    Последнее редактирование: 30 дек 2016
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.386
    Симпатии:
    2.357
    Соня (судя по нику, тебя так зовут :) ), ты не с той стороны заходишь...

    Для начала - никогда не публикуй логины/пароли! Без комментариев...

    Во-вторых, ты заходишь не с той стороны. Открой отладку браузера и посмотри - а что мы передаём сайту и что он передаёт нам в ответ?
    К примеру DLE достаточно передать md5 пароля и user_id в куке.

    Теперь о кодировках... Прости, а что ты хотела увидеть, добавив вот такой параметр:
    'Accept-Encoding: gzip, deflate',
    Конечно тебе всё в gzip и приходит... Убирай - увидишь красивую картинку
     
    sonya2003 и borodatych нравится это.
  3. sonya2003

    sonya2003 Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    25
    Симпатии:
    2
    Спасибо за ответ. Логин и пароль опубликованы целенаправлено для конкретики разбора, аккаунт не настоящий, для экспериментов. Accept-Encoding убрала, страница стала отображаться, но происходит редирект на страницу с неавторизованным каталогом. Через отладку посмотрела: форма на странице login посылает post-запрос с логином и паролем, возвращается 302 редирект на страницу с каталогом.
    Вопрос: почему не возвращаются куки и не происходит авторизация...
     
  4. gerrove

    gerrove Писатель

    Регистр.:
    21 июн 2016
    Сообщения:
    6
    Симпатии:
    2
    в заголовки попробуй "Content-Type: application/x-www-form-urlencoded"
    в данный момент негде протестировать сам код и сырой ответ.

    Server: nginx/1.9.12Date: Tue, 09 Aug 2016 10:28:37 GMTContent-Type: text/htmlTransfer-Encoding: chunkedConnection: keep-aliveKeep-Alive: timeout=10Vary: Accept-EncodingX-Powered-By: PHP/5.2.17-pl0-gentooSet-Cookie: PHPSESSID=3u7grl5a1n76smhgvli9oogei7; path=/Expires: Thu, 19 Nov 1981 08:52:00 GMTCache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0Pragma: no-cache
     
  5. sonya2003

    sonya2003 Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    25
    Симпатии:
    2
    Добавила в заголовки Content-Type: application/x-www-form-urlencoded, без изменений... :confused:
     
  6. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.386
    Симпатии:
    2.357
    Опять не туда смотришь в отладке.

    У тебя создаются куки и тебе надо посмотреть как. Если куки создаются вида user_id, который не меняется и хеш пароля - не надо вообще заморачиваться с авторизацией - отправляйте готовые куки.
    Я очень сомневаюсь что сайт такого уровня будет заморачиваться шифрованием сессий.
     
  7. gerrove

    gerrove Писатель

    Регистр.:
    21 июн 2016
    Сообщения:
    6
    Симпатии:
    2
    так и есть у него есть session id и видимо где-то в базе он хранит привязку пользователь-сессия
    но авторизация не происходит если через курл и редирект у меня например, либо где-то я туплю
    Expires: Thu, 19 Nov 1981 08:52:00 GMT


    Код:
    HTTP/1.1 100 Continue
    
    HTTP/1.1 200 OK
    Server: nginx/1.9.12
    Date: Tue, 09 Aug 2016 13:34:37 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked
    Connection: keep-alive
    Keep-Alive: timeout=10
    Vary: Accept-Encoding
    X-Powered-By: PHP/5.2.17-pl0-gentoo
    Set-Cookie: PHPSESSID=i8unjea0im3qqdut291dr6prm4; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    
    удалось)) сейчас доеду до дома с работы и отпишу код когда причешу его
    [​IMG]
     
    Последнее редактирование модератором: 9 авг 2016
  8. sonya2003

    sonya2003 Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    25
    Симпатии:
    2
    А я хотела, чтобы куки не я выковыривала, а их сохранил curl, и подгружал их в дальнейшем при парсинге, ведь я прописала это ему, почему он не сохраняет их, на других сайта все получалось, почему проблемы на этом. Если конечно невозможно их достать курлом, придётся как-то самой, но в чем причина, не пойму.

    Т.е. курлом авторизоваться не получиться :conf:
     
    Последнее редактирование модератором: 9 авг 2016
  9. gerrove

    gerrove Писатель

    Регистр.:
    21 июн 2016
    Сообщения:
    6
    Симпатии:
    2
    уже получилось смотри мой скрин под спойлером
    Сейчас причешу код и пришлю

    поправьте путь к кукам и проверяйте

    PHP:
    <?php

    $useragent
    ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36';
    $login_url='http://xamillion.com/login/';
    $headers=array(
    'Host: xamillion.com',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language:     ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
    //'Accept-Encoding: gzip, deflate',
    'Connection: keep-alive',
    //'Content-Type: application/x-www-form-urlencoded'
    );

    function 
    curl_login($login_url,$post,$headers,$useragent,$referer='http://www.google.com'){
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$login_url);
        
    curl_setopt($chCURLOPT_HEADER0);
        
    curl_setopt($chCURLOPT_USERAGENT$useragent);
        
    curl_setopt($chCURLOPT_REFERER$referer);
        
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
        
    curl_setopt($chCURLOPT_HTTPHEADER$headers);
        
    curl_setopt($chCURLOPT_POSTtrue);
        
    curl_setopt($chCURLOPT_POSTFIELDS$post);
        
    // curl_setopt($ch, CURLOPT_COOKIESESSION, true);
        
    curl_setopt($chCURLOPT_COOKIEJAR'/var/www/gerrove/data/www/gerrove.ru/test/cook.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILE'/var/www/gerrove/data/www/gerrove.ru/test/cook.txt');
        
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        
    $data curl_exec($ch);
       
        return 
    $ch;
    }

    $post = array(
    'login' => 'buhelp@mail.ru',
    'password' => 'qwerty',
    'log' => ''
    );


    function 
    curl_get($url,$headers,$ch,$referer='http://www.google.com') {
    curl_setopt($chCURLOPT_URL'http://xamillion.com/catalog/');
    curl_setopt($chCURLOPT_POSTfalse);
    //curl_setopt($ch, CURLOPT_COOKIESESSION, false);
    curl_setopt($chCURLOPT_POSTFIELDS"");
    curl_setopt($chCURLOPT_COOKIEJAR'/somepath/cook.txt');
    curl_setopt($chCURLOPT_COOKIEFILE'/somepath/cook.txt');
    $answer curl_exec($ch);
    print 
    $answer;
    curl_close($ch);
    }

    $ch2=curl_login($login_url,$post,$headers,$useragent);
    curl_get($headers,$headers,$ch2);


    exit;
     
    Последнее редактирование модератором: 9 авг 2016
  10. sonya2003

    sonya2003 Создатель

    Регистр.:
    6 окт 2007
    Сообщения:
    25
    Симпатии:
    2
    Работает!!! Завтра буду разбирать код, на первый взгляд ошибка была в том, что выводили через curl_exec страницу с формой авторизации, она редиректилась и авторизация слетала. Но куки в файл по-прежнему не выгружаются, поэтому как я понимаю нужно будет проводить авторизацию через curl перед открытием каждой парсингуемой страницы.