Я не программист, так что сильно не пинайте) Воровать и взламывать я ничего не собираюсь. На работе используем 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"/>
?>
Может есть более просто способ сделать необходимое?