cURL основы нужно разобраться

guru85

Постоялец
Регистрация
24 Мар 2010
Сообщения
100
Реакции
4
Ну вот подошел черед разобраться что такое cURL. Human Emulator запудрил мне мозги, и я немогу понять физику процесса работы php с ссайтами. допустим на сайте есть форма search, в нее необходимо внести данные и нажать ктнопку пуск, затем получить результат, допустим html код страницы, чтоб потом ее спарсить. в эмуляторе все понятно, а вот без него на чистом пхп пока не очень. Может на пальцах кто обяснит эту задачку, а дальше я уж сам постараюсь. я дела скрипт, из формы передовал данные в скрипт post методом, но тут ведь другая задача, из скрипта передать в поле а потом получит результат, немного запутался.
 
Накатал небольшой скрипт для примера.
Авторизация в меил.ру:
Идем на страницу http://win.mail.ru/cgi-bin/login открываем исходный код и ищем теги "form" и смотрим куда будет отправлятся запрос (http://win.mail.ru/cgi-bin/auth), далее атрибуты "name" у полей которые нам нужны, а именно
поле ввода логина "Login",
поле выбора домена "Domain",
поле ввода пароля "Password",
А дальше собсно забиваем все ето в скрипт:
PHP:
<?php
    // логин
$login = "fdrawut";
    // пароль
$pass = "qwe123";
    // Место хранения куков
$user_cookie_file = $_SERVER['DOCUMENT_ROOT'].'/cookie.txt'; //Полный путь до файла, где будем хранить куки
    // инициализация curl
$ch = curl_init ();
    // адрес страницы куда посылать запрос
curl_setopt ($ch, CURLOPT_URL , "http://win.mail.ru/cgi-bin/auth"); 
    // каким браузером будем прикидываться
curl_setopt ($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU; rv:1.7.12) Gecko/20050919 Firefox/1.0.7");
    // Указываем что нужно вывести загруженную страницу в переменную или (0)-вывести на экран
curl_setopt ($ch, CURLOPT_RETURNTRANSFER , 1 ); 
    // Переходить по редиректам или (0)
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
    // Подставляем куки
curl_setopt ($ch, CURLOPT_COOKIEFILE, $user_cookie_file); //Куки раз
curl_setopt ($ch, CURLOPT_COOKIEJAR, $user_cookie_file); //Куки два
    // елси проверят с какой страницы пришел
curl_setopt ($ch, CURLOPT_REFERER, "http://mail.ru/");
    // не возвращает заголовки
curl_setopt ($ch, CURLOPT_HEADER, 0); 
    // обрабатывает все кодировки          
curl_setopt ($ch, CURLOPT_ENCODING, "");        
    // Включить передачу POST-запроса
curl_setopt ($ch, CURLOPT_POST, 1);
    // Отсылаем пост запрос 
curl_setopt ($ch, CURLOPT_POSTFIELDS, "Login=$login&Domain=mail.ru&Password=$pass");
    // скачиваем страницу в переменную
$parsing = curl_exec($ch); 
    // закрываем соединение
curl_close($ch); 
    // Выводим результат
echo $parsing;
?>
Будут вопросы обращайся.
 
А чем отличаются эти куки?
PHP:
curl_setopt ($ch, CURLOPT_COOKIEFILE, $user_cookie_file); //Куки раз 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $user_cookie_file); //Куки два
 
если установлена опция CURLOPT_COOKIEFILE то при составлении GET/POST запроса данные из этого файла будут подставлены в Cookie:

если установлена опция CURLOPT_COOKIEJAR то при получении ответа сервера данные в хедере Cookie: будут сохранены в указанный файл.

Обычно вам нужно чтобы это был один и тот же файл
гугл говорит
 
guru85, поставь себе сниффер и смотри как браузер данные форм отправляет, курлом потом так же делаешь.
Результатом запроса будет хтмл-код, из которого регэкспами нужные данные выдёргиваешь.
 
... Human Emulator запудрил мне мозги ...

А все почему?, а потому что не с XHE начинать надо а с PHP. Как только дело доходит до момента интересной (сложной) обработки в регерах под XHE, то все счастливые пользователи лицензий XHE приходят в ступор а как же это сделать и выясняется что с XHE то не все так гладко и необходимых функций нет или как правило чаще всего они не работают;)

И тут то начинается поиск кодера который за пять минут натыкает макрос и сделает цикл, за 10$ так как делов то там на пять минут ... Ну да ладно чего то мы от темы отвлеклись.


По теме:
1) Читай маны по cURL, их не так много как кажется.
2) Используй поиск по форуму в частности в раздели PHP для начинающих, до тебя уже все не раз пережёвывали в той или иной форме.

Теперь алгоритм отправки и получения данных:
1) Проверяешь снифером в комплексе с браузером, чего и куда у тебя отправляет необходимая форма, в частности тебе необходимо узнать адрес удаленного скрипта обработчика и какие данные ему отправляются.
2) Формируешь пост данные и конфигурируеш cURL перед запросом. Дальше делаешь запрос и отправляешь данные.
3) Получаешь ответ от сервера на твой запрос, и разбираешь полученные данные.

Это конечно все при хорошем раскладе, но как правило не все так гладко в этом мире и подводных камней тут куча. И придется не мало попрыгать с бубном бессонными ночами над стопками мануалов, причем не только для cURL и PHP.
 
ну вот, немного разобрался, накидал несколько топорных скриптов. Появились вопросы. Имеем
PHP:
<INPUT TYPE="radio" NAME="linkingtype" VALUE="abclinking" onClick="abcSwitchControl(f2,'abclinking')">
суть такая, когда в браузере я выбираю этот чек бокс то некий скрипт генерирует данные в форме
PHP:
<textarea wrap="off" name="rlvl" cols="40" rows="50" style=" width: 650px; height: 200px" readonly="yes">
но когда я передаю курлом post запрос вида linkingtype=abclinking то чек бокс выбирается а вот данных не появляется, кажется загвозка с onClick. Второе есть еще одна трудность при нажатии на кнопку сабит вот html
PHP:
<input type="Submit" name="addblog" value="Add Blog" style="width: 150px; height: 20px" onclick="return confirm('Have you put text?\n\nClick OK if you have and we will \nIf not, just click CANCEL and try again after you add them')"></td>
выскакивает окно с вопросом и там надо нажать ок в эмуляторе с этим прекрасно справлялся
PHP:
$browser->enable_browser_message_boxes(false,$default_answer="OK");
как реализовать тут?
 
но когда я передаю курлом post запрос вида linkingtype=abclinking то чек бокс выбирается а вот данных не появляется, кажется загвозка с onClick.

после клика на чекбоксе JavaScript вставляет в ДУМ новый HTML-элемент <textarea wrap="off" name="rlvl" ....
значит после после нажатия кнопки данное поле также передастся на сервак. ( если только его перед отправкой повторно не удалит тот-же ДжаваСкрипт )

Следовательно когда курлом передаешь linkingtype=abclinking
то и одновременное передавай и rlvl=VALUE
Только проверь снифером действительно ли оно передается, а то в нем стоит признак "только для чтнения" readonly="yes" и потом как-то странно ...

Второе есть еще одна трудность при нажатии на кнопку сабит вот html ... выскакивает окно с вопросом и там надо нажать ок в эмуляторе с этим прекрасно справлялся

В курле ниче нажимать ненужно ...
это окно с сообщением аля "Вы уверены? " .. оно не играет никакой роли
 
да действительно необходимо было отправить rlvl=VALUE но опять проблема, этот VALUE при отправке снифер показывает что отправляет то что получается при выборе чекбокса, я выбираю чек бокс в форме получается некий скрипт формирует данные, вот их и отправляет параметр rlvl=тут текст который должен получится при выборе чекбокса. Так вот как же мне эти данные перехватить? мне этот текст и дальше нужен, мне бы его в переменную превратить. там три таких чекбокса и при выборе другого формируется другой текст. даже спарсить его неполучается его просто нет в html коде. может я чего не догоняю и VALUE и есть этот текст, но как мне его тогда посмотреть, после обработке он пишет спасибо за отправку и слово VALUE а должны быть данные из формы.
 
Назад
Сверху