Получить удаленный сеанс phpBB

Я хочу получить некоторые данные с форума phpBB, участником которого я являюсь. Но для этого требуется авторизация. Я могу войти в систему с помощью cURL, но если я попытаюсь просканировать данные после входа в систему с помощью cURL, все равно будет показано, что мне нужно войти в систему перед просмотром этой страницы. Можно ли войти в систему с помощью cURL И сохранить этот сеанс для выполнения какой-либо дальнейшей работы?

Другое дело, что этот форум обычно показывает страницу подтверждения после входа в систему, а затем через 5 секунд автоматически перенаправляет на главную страницу. И дело в том, что если я вхожу в систему с помощью cURL, мой скрипт также следует этому местоположению заголовка и показывает мне эту страницу.

Любое обходное решение этого?


person Bibhas Debnath    schedule 05.10.2010    source источник


Ответы (2)


Это то, что обычно работает для меня


$timeout=5;
$file='cookies.jar';
$this->handle=curl_init('');
curl_setopt($this->handle, CURLOPT_COOKIEFILE,  $file);
curl_setopt($this->handle, CURLOPT_COOKIEJAR,   $file);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)");
curl_setopt($this->handle, CURLOPT_TIMEOUT, round($timeout,0));
curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, round($timeout,0));

и я обычно использую это так


$now=grab_first_page();
if(not_logged_in($now)) {
   send_login_info();
}
if(not_logged_in()) { end_of_script_with_error(); }
// rest of script

Таким образом, файлы cookie сохраняются между сеансами, и скрипту не нужно входить в систему каждый раз, когда он что-то делает.

--- объяснение ниже ----

Я использую объект, но вы можете заменить $this->handle простой переменной с именем $mycurl, строки будут такими


$mycurl=curl_init(''
curl_setopt($mycurl, CURLOPT_COOKIEFILE, $file)

Что делает приведенный ниже код: - инициализирует "экземпляр curl" (для простоты) (3-я строка) - 4-я и 5-я строки: сохраняют файлы cookie в файл. Curl работает так же, как браузер, поэтому, когда вы входите на страницу с помощью curl, он сохраняет файлы cookie с данными аутентификации в памяти. Я говорю ему сохранить его в файл, чтобы при втором запуске скрипта у него были те же файлы cookie, и ему не нужно было повторно проходить аутентификацию. Или у вас может быть несколько сценариев, использующих один и тот же файл cookie, и только один для входа в систему, который вы запускаете каждые 24 часа или всякий раз, когда вы выходите из системы... - другие настройки: * followlocation - когда curl получает перенаправление http, он должен возвращать страница, на которую он был перенаправлен, а не код перенаправления * useragent - curl представляет себя как firefox * timeout - сколько времени он должен ждать установления соединения, обычно 5 или 10 более чем достаточно

Я разместил здесь простой класс http://pastebin.com/Rfpc103X.

вы можете использовать это так



// -- initialize curl
$ec=new easyCurl;

// -- set some options
//if the file you are in right now is named file_a.php it will create a file_a.jar cookie file
$ec->start(str_replace('.php','.jar',__FILE__));
$ec->headersPrepare(false);
$ec->prepareTimeOut(20);

$url='http://www.google.com/';

// --- set url
$ec->curlPrepare($url);

// --- get the actual data
$page=$ec->grab();

echo $page;

// to send GET data
$get_data=array('id'=>10);
$ec->curlPrepare($url,$get_data);

// and to post data
$post_data=array('user'=>'blue','password'=>'black');
$ec->curlPrepare($url,array(),$post_data);

Он автоматически обрабатывает настройки POST/GET и другие параметры, с которыми я обычно сталкиваюсь. Надеюсь, приведенные выше примеры будут вам полезны. Удачи.

person vlad b.    schedule 05.10.2010
comment
Спасибо за ответ, но не могли бы вы объяснить их? Что именно вы делаете, используя файл cookies.jar? И я думаю, что вы используете какой-то фреймворк для второго скрипта... не так ли? - person Bibhas Debnath; 05.10.2010
comment
Объяснил некоторую информацию в первом посте, добавил простой в использовании класс. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать. Что обычно помогает, так это каждый раз, когда вы берете файл, сохранять его на жесткий диск в формате txt и смотреть, какой ответ вы получаете. - person vlad b.; 06.10.2010
comment
Большое спасибо за объяснение. Попробую прямо сейчас. :) - person Bibhas Debnath; 06.10.2010
comment
Работает как шарм .. :) Буду публиковать дополнительные запросы, если таковые имеются, позже. :) - person Bibhas Debnath; 06.10.2010
comment
Привет, Влад Б., Я использовал ваш код, чтобы попытаться добиться того, что я делал в [Войти в cpanel из php-скрипта без передачи учетных данных обратно в браузер] [1] и приблизился, но я не совсем там. Используя ваш код, я теперь могу войти в cpanel, но захваченная страница не завершена, а гиперссылки cpanel перепутаны. Есть ли способ войти в cpanel через curl, а затем просто перенаправить на cpanel.myweb.com , в какой момент у меня будет доступ к cpanel без запроса учетных данных? Спасибо [1]: stackoverflow. ком/вопросы/4931226/ - person user607796; 10.02.2011

Да, вы должны сохранить файлы cookie. Для этого вы можете создать файл cookie при входе в систему, который вы будете повторно использовать всякий раз, когда будете заходить на форум позже.

curl --cookie-jar cjar -d "somelogindata" http://example.com/phpbb/login.php

Это создает файл cookie jar cjar, который затем можно повторно использовать в последующих запросах:

curl --cookie-jar cjar --cookie cjar http://example.com/phpbb/viewforum.php?foobar

Параметр --cookie-jar указывает файл, в котором сохраняются файлы cookie; чтобы использовать их, вы используете опцию --cookie. Чтобы обновить файлы cookie, вы также всегда должны указывать опцию --cookie-jar.

person poke    schedule 05.10.2010