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

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($ch, CURLOPT_URL, 'http://www.elec.ru');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
$result = curl_exec($ch);
 
curl_setopt($ch, CURLOPT_URL, $page_auth);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $loginpass);
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
echo $result = curl_exec($ch);
 
curl_close($ch);

Результат работы:
"Ваш броузер не поддерживает cookies. Включите cookies в Вашем броузере"
...беда)
 
Приветствую коллеги!
"Ваш броузер не поддерживает cookies. Включите cookies в Вашем броузере"
...беда)
Беда так беда. Там страница через JavaScript устанавливает куки и проверяет наличие кук при отправке формы. То есть, вам необходимо включить обработчик js после загрузки страницы. На php+cURL такое не реализовать.


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



Рекомендую попробывать первый. Имеет самый простой API.
 
Не верьте людям, которые говорят "не реализовать" :)
PHP:
<?php
    $page_auth = 'http://www.elec.ru/users/login/';
    $loginpass='next=&email=pierre@mail.ru&password=qwerty12345';
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $page_auth);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    $result = curl_exec($ch);
    curl_close($ch);
 
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $page_auth);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $loginpass);
    curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    echo $result = curl_exec($ch);
    curl_close($ch);
?>

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

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

Я считаю, что давно пора переходить на что-то схожее.
 
К сожалению, все не совсем так гладко как на бумаге. Все надставки над webkit в десятки раз тяжеловесней curl, требуют установки на сервер довольно-таки нетривиальных модулей, не особо дружат с соксами/авторизациями соксов и так далее. Плюсы - значительное упрощение скрипта автоматизации.
В общем для мало/одно-поточного парсинга - действительно может быть преимущество, а для промышленного использования - к сожалению пока не готово.
recasher2k12 - попробуй запусти в 500 потоков решение на curl и на эмуляторах для сравнения :)
 
recasher2k12 - попробуй запусти в 500 потоков решение на curl и на эмуляторах для сравнения :)
Я довольно успешно использую nodejs + cheerio (непосредственно для парсинга). Единственное, что требовалось бы установить, сам nodejs. Никаких нетривиальных модулей не требуется. Устанавливается на всех ОС в одну команду. А все нужные для моего приложения модули в виде исходных кодов в папке с приложением.

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

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

Для просмотра ссылки Войди или Зарегистрируйся

Может и пару лет назад я использовал php для парсинга, но его производительность, настройка приносит долю геморра. Постоянно думать о платформе, на которой работает скрипт. В конце концов, писать тонны кода вместо лаконичных решений.
 
ооох, ну что за категоричность?
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 и при незначительной смене верстки есть больше шансов что скрипт будет по-прежнему работать правильно). И куча минусов.
Просто надо смотреть что куда лучше применять. Для автоматизации в промышленных масштбах еще раз - не подходит пока :)
 
Да, в самом деле логинится, Прогресс?! +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($ch, CURLOPT_URL, $page_auth);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $loginpass);
    curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    $result = curl_exec($ch);
 
 
    curl_setopt($ch, CURLOPT_URL, $page_add);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
    echo $result = curl_exec($ch);
 
curl_close($ch);
}
 
?>

Есть ли мысли, почему же все-таки при переходе на страницу добавления я получаю "Ошибка 403. Доступ запрещен!"
 
Назад
Сверху