Это то, что обычно работает для меня
$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