Как сделать парсер на php с использованием cURL с авторизацией?

Добрый день, второй день мучаюсь с парсером, не могу понять почему не работает.
<?php

$url = 'http://fantasts.ru/forum/index.php';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url); // отправляем на 

curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (бла бла бла..) "); 

curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4

curl_setopt($ch, CURLOPT_REFERER, "http://fantasts.ru/forum/index.php");

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// просто отключаем проверку сертификата 

curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/my_cookies.txt'); // сохранять куки в файл

curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__).'/my_cookies.txt');

curl_setopt($ch, CURLOPT_POST, 1); // использовать данные в post

$login = array(

	'UserName' => 'Тут ваш логин',

	'PassWord' => 'Ваш пароль',

	'x' => 0,

	'y' => 0

curl_setopt(($ch), CURLOPT_POSTFIELDS, $login);

curl_exec($ch); 

if (curl_errno($ch)) 

{

   print curl_error($ch);

   exit;

} 

curl_close($ch);

?>


Как видите, я не отправляю заголовки. В этом случае парсер мне выдает страницу, откуда осуществлялся вход. Куки в файл записывает. Если же я добавляю строчки имметации заголовка браузера, т.е.:
$header  = array
(
	'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.5,en;q=0.3',
	'Accept-Encoding: gzip, deflate',
	'Content-type: application/x-www-form-urlencoded'
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

он мне выдает всякие кракозябры.
Помогите разобрать на примере приведенного выше сайта, чтобы было все понятно.
Есть подозрения, что он пишет не те куки. Сайт отправляет кукис на главное странице для определения последнего входа на сайт.
  • Вопрос задан
  • 17404 просмотра
Решения вопроса 1
FootWork
@FootWork Автор вопроса
Доделал. В результате код авторизации получился такой:
<?php

$url = 'http://fantasts.ru/forum/index.php?act=Login&CODE=01&CookieDate=1';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); // отправляем на 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0"); 
curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвратить то что вернул сервер
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
curl_setopt($ch, CURLOPT_REFERER, "http://fantasts.ru/forum/index.php");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// просто отключаем проверку сертификата 
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/my_cookies.txt'); // сохранять куки в файл
curl_setopt($ch, CURLOPT_COOKIEFILE, '/my_cookies.txt');
curl_setopt($ch, CURLOPT_POST, 1); // использовать данные в post
$login = array(
	'UserName' => 'YourLogin',
	'PassWord' => 'YourPass'
);
curl_setopt(($ch), CURLOPT_POSTFIELDS, $login);
$result1 = curl_exec($ch);
$url2 ='http://fantasts.ru/forum/index.php?';
curl_setopt($ch, CURLOPT_URL, $url2);
curl_setopt($ch, CURLOPT_REFERER, "http://fantasts.ru/forum/index.php?act=Login&CODE=01&CookieDate=1");
curl_setopt($ch, CURLOPT_COOKIEFILE, '/my_cookies.txt');
$result2 = curl_exec($ch);
if (curl_errno($ch)) 
{
   print curl_error($ch);
   exit;
}
else
{
	echo 'LOGIN WAS SUCCESFULL';
	echo $result2;
}
curl_close($ch);

?>


Объясните только, почему когда я ставлю
curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки

Все норм (хотя как он работает без заголовков??)
А если пытаюсь еще больше быть похожим на браузер, т.е. пишу
$header  = array
(
    '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.5,en;q=0.3',
    'Accept-Encoding: gzip, deflate',
    'Content-type: application/x-www-form-urlencoded'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

На выходе получаю кракозябры, которые ни один декодер не понимает
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
EnterSandman
@EnterSandman
Эникей
curl_setopt($ch, CURLOPT_HEADER, 0); // пустые заголовки
^ воу воу. вы хоть почитайте что делает эта опция.

когда не знаете почему не работает - берете Wireshark. Делаете запрос браузером, делаете запрос своим скриптом. Смотрите в чём различие запросов и дописываете свой скрипт до имитации работы браузера.
Как уже сказал Дмитрий - надо обращаться к fantasts.ru/forum/index.php?s=SID&act=Login&CODE=0...
плюс для получения плюшек рекомендуется сначала просто забрать страницу, потом уже делать POST
Ответ написан
Комментировать
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Начнем с того, что форма авторизации ведет на
http://fantasts.ru/forum/index.php?act=Login&amp;CODE=01&amp;CookieDate=1
а не на http://fantasts.ru/forum/index.php как в Вашем коде.
Что за поля x, y - в форме их нет.
Ответ написан
@vkeyster
<?php
$url = 'http://fantasts.ru/forum/index.php?act=Login&CODE=01&CookieDate=1'; //логин по этой ссылке
$ch = curl_init();
$header  = array
(
'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.5,en;q=0.3',
'Accept-Encoding: gzip, deflate', // указиваем серверу, что ответ надо сжимать
'Content-type: application/x-www-form-urlencoded'
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_URL, $url); // отправляем на
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (бла бла бла..) ");
curl_setopt($ch, CURLOPT_HEADER, 0); // не включать заголовк в результат запроса
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // следовать за редиректами
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);// таймаут4
curl_setopt($ch, CURLOPT_REFERER, "http://fantasts.ru/forum/index.php");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// просто отключаем проверку сертификата
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/my_cookies.txt'); // сохранять куки в файл
curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__).'/my_cookies.txt');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate'); // указивает curl что ответ может быть сжат, без этого будут "кракозябры"
curl_setopt($ch, CURLOPT_POST, 1); // использовать данные в post
$login = array(
'UserName' => 'login',
'PassWord' => 'password',
'x' => 0,
'y' => 0);
curl_setopt(($ch), CURLOPT_POSTFIELDS, http_build_query($login)); // для вашей формы надо так
curl_exec($ch);
if (curl_errno($ch))
{
print curl_error($ch);
exit;
}
curl_close($ch);
?>
Ответ написан
Комментировать
Alexufo
@Alexufo
противоречивый, сложный, весь компьютерный.
Блин, ну почему народ такой ленивый читать про инструмент которым пользуется? Вы когда покупаете телефон, бегаете к продавцу за каждым вопросом? Конечно выкинет из авторизации, выже куки не передаете полученные после авторизации дальнейшим запросам. Примеров в сети просто МАССА
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы