#php #cookies #curl #cookiejar
#php #файлы cookie #curl #cookiejar
Вопрос:
У меня довольно интересная проблема с передачей файлов cookie с использованием curl. У меня есть скрипт, который входит в систему очередей моей компании, а затем получает файлы cookie при успешном входе в систему. Позже скрипт вызовет эти файлы cookie, чтобы запросить систему и проанализировать выходные данные. Скрипт работает безупречно на localhost, но при переносе его на сервер компании этого не происходит. Создается файл cookie, но все размеры файла = 0 байт. Я думаю, что это проблема с разрешениями, но я не понимаю, как (я зашел так далеко, что изменил файлы 777 в chmod). Самое странное, что я могу использовать fwrite () для добавления в любой из файлов. Я не совсем уверен, с чего начать отладку здесь, поэтому я надеюсь, что у кого-то из вас может возникнуть идея. Ниже приведены соответствующие фрагменты кода:
[syntax=php]
main class{
include_once('../shared_data/cquserdata.php');
$ckfile_name = tempnam('temp/', sha1('CqAuth'));
$ckfile = fopen($ckfile_name, 'w') or die('Derp...open...nooooooooo!');
cqUserData::cqLogin($credentials['username'],$credentials['pass'],$ckfile);
(skip a few thousand lines)
$puname = sanitizers::sanitize($_POST['puname']); //sanitize post input
$manager = cqUserData::getManager($puname, $ckfile);
}
cqLogin($username, $pass, $ckfile){
$url = 'URL';
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_USERAGENT => 'uuberness',
CURLOPT_COOKIEJAR => $ckfile,
CURLOPT_POSTFIELDS => "redirect=amp;username=$usernameamp;password=$pass" //derp
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
return true;
}
getManager($user,$ckfile){
$url = "URL"';
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect
CURLOPT_TIMEOUT => 120, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_USERAGENT => 'uuberness',
CURLOPT_COOKIEFILE => $ckfile,
CURLOPT_POSTFIELDS => "username=$useramp;usernamecheck=1" //derp
);
$ch = curl_init( $url );
curl_setopt_array( $ch, $options );
$content = curl_exec( $ch );
$err = curl_errno( $ch );
$errmsg = curl_error( $ch );
$header = curl_getinfo( $ch );
curl_close( $ch );
$header['errno'] = $err;
$header['errmsg'] = $errmsg;
$header['content'] = $content;
$header['data'] = $data;
$doc = new DOMDocument;
$doc->loadHTML($content);
$doc->preserveWhiteSpace = false;
$tables = $doc->getElementsByTagName('table');
foreach($tables as $table){
***Code excluded, loops rows to find correct, then defines manager**
$manager = $manager[1];
}
return $manager;
}
[/syntax]
На данный момент я думаю, что было бы неплохо попытаться просто проанализировать заголовки файлов cookie и поработать с ними …. но это далеко не идеально. Любые предложения приветствуются: D
Спасибо!
Ответ №1:
Приветствую,
Итак, я выяснил, в чем была проблема. Я открывал файл с помощью fopen (), затем передавал обработчик файла в cURL. Что я должен был сделать, так это передать полный путь к файлу имя в cURL. Исправлена часть кода:
$ckfile = dirname(__FILE__) . "/". sha1($username);