@ko1hoz

Почему не получается авторизоваться через curl?

Я не программист, так что сильно не пинайте) Воровать и взламывать я ничего не собираюсь. На работе используем redmine, хочу написать небольшой парсер для получения определенных полей со странички задачи для автоматизации отсчетов. Но авторизоваться никак не получается, пробую на публичном demo redmine.

<?php
 
 $url = 'http://demo.redmine.org/login';
 $urlTo = '<?php
 
 $url = 'http://demo.redmine.org/login';
 $urlTo = 'http://demo.redmine.org/issues/80823';
 $login = 'xxx';
 $pass = 'xxx';
 $y = '';
 $post = 'utf8=' . $y . '&authenticity_token=&back_url=' . $urlTo . '&username=' . $login . '&password=' . $pass; 
 
 $ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Делаем так, чтобы страница не выдавалась сразу в поток, а можно было ее записать в переменную
$html = curl_exec($ch);                         // Имитируем заход на сайт

//            22222222222222222222222222

include_once('simple_html_dom.php');
$html = str_get_html($html);
$inputs = $html->find('head meta');            // Нашел все теги meta
$input = $inputs[4];                                    // опытным путем определил, что токен в пятом :)
$word = explode('"', $input);                      // поделил строку на слова                         
$token = $word[1];
echo $token;                                               //вывел токен, реально совпадает)

$post2 = 'authenticity_token=' . $token . '&back_url=' . $urlTo . '&username=' . $login . '&password=' . $pass . '&l'; 

$ch = curl_init();                              // Инициализируем сеанс CURL
curl_setopt($ch, CURLOPT_URL, $url);            // Заходим на сайт
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 
//$html = curl_exec($ch);                         // Имитируем заход на сайт

curl_setopt($ch, CURLOPT_URL, $url);              // Устанавливаем адрес куда будем слать POST данные
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/40.0.2214.111 Chrome/40.0.2214.111 Safari/537.36");
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');  // Записываем cookies в файл, чтобы потом можно было их считать
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); // Теперь читаем cookies с файла
curl_setopt($ch, CURLOPT_POST, true);               // Говорим, что информация будет отправляться методом POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $post2);        // Передаем POST данные

$html = curl_exec($ch); // Записываем пришедшие данные в переменную    
curl_close($ch);        // Закрываем сеанс работы CURL
 
echo $html;             // Вывожу страницу, вижу "Invalid form authenticity token.".
Мой запрос c php:
<img src="//habrastorage.org/files/902/c0c/b22/902c0cb229fa459a8a03b6552c632b4d.png" alt="image"/>
Запрос с браузера:
<img src="//habrastorage.org/files/c93/337/184/c9333718403049e9ad3177e5bc26552d.png" alt="image"/>
?>


Может есть более просто способ сделать необходимое?
  • Вопрос задан
  • 2776 просмотров
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Редмайн хранит данные в БД.
Это какой же надо иметь вывих мозга, чтобы пытаться получить доступ к этим данным через парсинг ХТМЛ и фейковую авторизацию? Вместо пары строк SQL?
Вот буквально - удаление гланд через *опу автогеном. Кто читал форумы по пхп, над анекдотами не смеется.
Ответ написан
Ваш ответ на вопрос

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

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