Авторизация с использованием CURL

Тема в разделе "Как сделать...", создана пользователем pierrevk, 7 фев 2013.

  1. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Приветствую коллеги!
    При авторизации с CURL не могу скормить куки. В чем загвоздка? Привожу полный листинг с паролями для опробования!:

    PHP:
    $page_auth 'http://www.elec.ru/users/login/';
    $loginpass='next=&email=pierre@mail.ru&password=qwerty12345';
     
    $ch curl_init();
    curl_setopt($chCURLOPT_URL'http://www.elec.ru');
    curl_setopt($chCURLOPT_HEADER1);
    curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    $result curl_exec($ch);
     
    curl_setopt($chCURLOPT_URL$page_auth);
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
    curl_setopt($chCURLOPT_POST1);
    curl_setopt($chCURLOPT_POSTFIELDS$loginpass);
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    echo 
    $result curl_exec($ch);
     
    curl_close($ch);
    Результат работы:
    "Ваш броузер не поддерживает cookies. Включите cookies в Вашем броузере"
    ...беда)
     
  2. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Беда так беда. Там страница через JavaScript устанавливает куки и проверяет наличие кук при отправке формы. То есть, вам необходимо включить обработчик js после загрузки страницы. На php+cURL такое не реализовать.


    Я уже писал на форуме где-то. Тут вам могут помочь только консольные браузеры:



    Рекомендую попробывать первый. Имеет самый простой API.
     
  3. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    Не верьте людям, которые говорят "не реализовать" :)
    PHP:
    <?php
        $page_auth 
    'http://www.elec.ru/users/login/';
        
    $loginpass='next=&email=pierre@mail.ru&password=qwerty12345';
     
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$page_auth);
        
    curl_setopt($chCURLOPT_HEADER1);
        
    curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        
    $result curl_exec($ch);
        
    curl_close($ch);
     
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$page_auth);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_POSTFIELDS$loginpass);
        
    curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        echo 
    $result curl_exec($ch);
        
    curl_close($ch);
    ?>
    Все прекрасно работет, логинится в Перейти по ссылке
     
    pierrevk нравится это.
  4. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    recasher2k12, спасибо, технологии о которых вы говорите мне не по зубам!
    По логике, если у меня отключен JS то я не смогу авторизоваться? - но авторизация проходит при отключенном джаваскрипте, потому вывод - есть резервный метод или догадки ложные?!
     
  5. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Да, извиняюсь, меня смутил файл jquery.cookie.js, подключенный на странице.
    Но, на самом деле, в первом предложенном варианте браузера нет никаких сложностей. Попробуйте разобраться с примером.
    там 1) заходят на главную страницу google; 2) пишут поисковой запрос, сохраняют результаты в массив; 3) пишут второй запрос, также сохраняют результаты. 4) выводят результаты.
    Этот браузер имеет самый простой API. Основан на движке Google V8 (такой же как у Chrome). При парсинге страниц кушает меньше памяти, чем regexp. Результат будет работать независимо от изменений в верстке. Стабильность решения зашкаливает по сравнению с php.

    Например, в моем парсере доски вконтакте чтобы получить следующую порцию элементов, нужно выполнить всего лишь:
    PHP:
    $.scrollTop(100000);
    чтобы загруженная страница проскролилась до конца и новые элементы доски подгрузятся сами собой.

    Я считаю, что давно пора переходить на что-то схожее.
     
  6. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    К сожалению, все не совсем так гладко как на бумаге. Все надставки над webkit в десятки раз тяжеловесней curl, требуют установки на сервер довольно-таки нетривиальных модулей, не особо дружат с соксами/авторизациями соксов и так далее. Плюсы - значительное упрощение скрипта автоматизации.
    В общем для мало/одно-поточного парсинга - действительно может быть преимущество, а для промышленного использования - к сожалению пока не готово.
    recasher2k12 - попробуй запусти в 500 потоков решение на curl и на эмуляторах для сравнения :)
     
  7. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Я довольно успешно использую nodejs + cheerio (непосредственно для парсинга). Единственное, что требовалось бы установить, сам nodejs. Никаких нетривиальных модулей не требуется. Устанавливается на всех ОС в одну команду. А все нужные для моего приложения модули в виде исходных кодов в папке с приложением.

    Если честно, лучшего средства по производительности я не нашел. В парсинге cheerio только на несколько процентов проигрывает lxml у python. Зато в других моментах nodejs выигрывает у python в разы. Язык Javascript асинхронен, там сложнее сделать приложение работающее в один поток, чем в 500. Легко сделать также приложение работающее в несколько процессов, которые работают в несколько потоков.

    Отдельным плюсом V8 является non-blocking I/O model (без перевода выглядит понятнее). Неблокирующая модель ввода-вывода. То есть nodejs сначала получает команду, например, чтения файла или запрос в БД; не дожидаясь получения результата выполняет следующие действия. А результат уже обработается когда придет.

    Перейти по ссылке

    Может и пару лет назад я использовал php для парсинга, но его производительность, настройка приносит долю геморра. Постоянно думать о платформе, на которой работает скрипт. В конце концов, писать тонны кода вместо лаконичных решений.
     
    jabbaxatt нравится это.
  8. SolutionFix

    SolutionFix 17 лет програмлю ;)

    Регистр.:
    20 ноя 2006
    Сообщения:
    272
    Симпатии:
    318
    ооох, ну что за категоричность?
    1. Под Debian в stable сборке нет установочного пакета, рекомендуют "For Debian Squeeze, your best bet is to compile node by yourself (as root)". С установкой bild-essentials, python g++, не удивлюсь если потянет и pyqt в зависимостях. И еще - разве оно работает без иксов? Стало быть иксы тоже надо ставить, хотя бы xvfb
    2. Вопрос не в том легко или нет сделать 500 потоков. Вопрос в том что они положат сервер, о чем кстати и говорится в приведенной статье на хабре. Потому как каждый раз, ВНЕ зависимости надо это или нет разбирается полный DOM документа. Естественно что сравнивать с lxml можно по нагрузке, а вот в задаче ТС (где например нужно узнать if(strpos($result, '/logout')) {успешно залогинились}) - быстродействие в десятки раз улучшится без использования эмулятров. Туда же и по занимаемой памяти.
    3. Извечный вопрос прокси/соксы, честно говоря не изучал что там с их поддержкой именно в nodejs, так как подобные задачи решаю на python/webkit.
    4. Я 100% согласен, что код самого скрипта обработки красивее и элегантней, во много раз. Но это по факту один из двух плюсов (второй - то что можно привязаться к css selectors и при незначительной смене верстки есть больше шансов что скрипт будет по-прежнему работать правильно). И куча минусов.
    Просто надо смотреть что куда лучше применять. Для автоматизации в промышленных масштбах еще раз - не подходит пока :)
     
  9. pierrevk

    pierrevk Постоялец

    Регистр.:
    22 сен 2009
    Сообщения:
    59
    Симпатии:
    5
    Да, в самом деле логинится, Прогресс?! +1 автору.
    НО - дальше не пускает, на следующую страницу после прохождения авторизации перейти не могу!
    Работаю с кодом:
    PHP:
    <?php 
     
    $page_auth 
    'http://www.elec.ru/users/login/';
    $loginpass='email=pierre@mail.ru&password=qwerty12345';
    $page_add 'http://www.elec.ru/users/market/category/053623/add';
    $name='AL 118 10111800/1001000010 Световые технологии ';
    $art='10111800';
    $shd='Цельнометаллический сварной корпус из листовой стали, покрытый белой порошковой краской';
    $price='582';
    $masv_url='http://mail.ru';
    $text='Светильники для реечного потолка<br>AL 118*, 1001000010, 1x18Вт, Световые технологии. (10111800 AL 118 б/реш.)<br>ЦЕНА В РОЗНИЦУ С НДС: 582,08 руб. <br>Характеристики серии AL 118* 10111800Номинальное напряжениеЗнак заземления (класс защиты 1 от поражения электрическим током)Степень защиты светильникаЗнак соответствия европейским нормам электромагнитной совместимостиТрубчатая лампа диаметр 26ммБлок аварийного питанияСветильники, предназначенные для установки непосредственно на поверхности из нормально-воспламеняемых материаловКлиматическая зонаУСТАНОВКА AL 118* <br>1001000010 - :  Встраивается в реечные потолки &laquo;итальянского&raquo; дизайна.  &nbsp;  КОНСТРУКЦИЯ AL 118* <br>1001000010 - :  Цельнометаллический сварной корпус из листовой стали, покрытый белой порошковой краской. Внутри корпуса установлена пускорегулирующая аппаратура.  &nbsp;  ОПТИЧЕСКАЯ ЧАСТЬ AL 118* <br>1001000010 - :  Зеркальный отражатель из анодированного алюминия и решетка из алюминиевой рейки.  &nbsp; Замечания по продукту:* светильник не комплектуется блоком аварийного питанияЗаказывается отдельно:INVERLUXЦЕНА С НДС:582,08руб. <br><br>';
    $param='keyword=светильник&title='.$name.'&artno='.$art.'&tizer='.$shd.'&price='.$price.'&quantity=0&picture=&pictureurl='.$image.'&url='.$masv_url.'&text='.$text.'<br> Сайт: masv.ru<br>';
     
     
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL$page_auth);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_POSTFIELDS$loginpass);
        
    curl_setopt($chCURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        
    $result curl_exec($ch);
     
     
        
    curl_setopt($chCURLOPT_URL$page_add);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,1);
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_POSTFIELDS$param);
        
    curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
        echo 
    $result curl_exec($ch);
     
    curl_close($ch);
    }
     
    ?>
    Есть ли мысли, почему же все-таки при переходе на страницу добавления я получаю "Ошибка 403. Доступ запрещен!"