cURL больше не устанавливает cookie, но почему? - PullRequest
4 голосов
/ 22 января 2012

Мой сценарий cURL больше не работает (имейте в виду, что он раньше работал) на моем localhost (поэтому он работает на моем внешнем хосте, следовательно: он может быть настройки сервера):

Этот скрипт хорошо работал раньше на моем локальном хосте (он все еще работает на моем хосте). Ничего не изменилось.

  • Может быть, полезно знать тот факт, что я запускал этот скрипт более 3000 раз на моем локальном хосте.
  • Я работаю на Windows 7, используя WampServer для настройки хоста.
  • Возможно, я изменил настройку, которая влияет на запись файлов cookie. Но какой?

РЕАЛЬНАЯ ПРОБЛЕМА : cURL не устанавливает cookie! Какие модули apache должны быть включены для записи файлов cookie (в файле .txt)? Я использую Wampserver.

Обратите внимание, что я уже использую:

    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');

И это php.ini:

extension=php_curl.dll is uncommented
  • Дополнительный вопрос: Разве curl_close сбрасывает cookie? А если опция cookiejar не установлена?
  • Основной вопрос: Почему curl не пишет cookie так, как должен (и делает это на моем внешнем хосте, а НЕ на моем LOCALHOST.

Другая информация:

phpinfo ()

curl
cURL support        enabled
cURL Information    7.21.7
Age                 3
Features
AsynchDNS           Yes
Debug               No
GSS-Negotiate       Yes
IDN                 No
IPv6                Yes
Largefile           Yes
NTLM                Yes
SPNEGO              No
SSL                 Yes
SSPI                Yes
krb4                No
libz                Yes
CharConv            No
Protocols           dict, file, ftp, ftps, gopher, 
                    http, https, imap, imaps, ldap, pop3,
                    pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host                i386-pc-win32
SSL Version         OpenSSL/0.9.8r
ZLib Version        1.2.5
libSSH Version      libssh2/1.2.7 

В настоящее время используется:

preg_match('/name="csrf" value="(.*?)"/', $getTokenCurlData, $token);

$postFields = array(
    'user'     => $userNum,
    'paswoord' => $userPass,
    'login'    => 'loginform',
    'csrf'     => $token[1]);

// 'user='.$userNum.'&paswoord='.$userPass.'&login=loginform&csrf='.$token[1]

$postData = http_build_query($postFields);

    $curlTable = curl_init();
    curl_setopt($curlTable, CURLOPT_URL, 'link');
    curl_setopt($curlTable, CURLOPT_COOKIEJAR, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_COOKIEFILE, 'cookie.txt');
    curl_setopt($curlTable, CURLOPT_ENCODING, 'gzip');
    curl_setopt($curlTable, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curlTable, CURLOPT_POST, true);
    $tableData = curl_exec($curlTable);
    if (!$tableData) echo 'post problem?'.$tableData;
    if ($tableData == false)
{
    echo 'Curl error: ' . curl_error($curlTable);
}

    curl_close($curlTable);
// Here I further process my data.

Ответы [ 4 ]

10 голосов
/ 10 декабря 2012

Хотя этот вопрос несколько устарел, сегодня я получил ту же проблему и не решил ее ни с одним из предложенных здесь предложений.Причиной того, что куки не были сохранены, был просто отсутствующий вызов

curl_close()

Если curl_close не вызывается после запроса скручивания куки НЕ сохраняются.

Взял меняоколо часа, чтобы узнать .... возможно сэкономит ваше время: -)

7 голосов
/ 22 января 2012

Возможно, вас забанили при входе в систему. Это даст вам больше информации о проблеме:

// change 
// if (!$siteSource) echo 'Help!';
// to
if ($siteSource === false)
{
    echo 'Curl error: ' . curl_error($curl);
}

РЕДАКТИРОВАТЬ: некоторые другие варианты, которые вы можете попробовать (связанные с SSL решили мои проблемы более чем один раз):

curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_VERBOSE, 1);

// following is very important
// TRUE to follow any "Location: " header that the server sends
// as part of the HTTP header (note this is recursive, PHP will follow
// as many "Location: " headers that it is sent, unless CURLOPT_MAXREDIRS is set).
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

РЕДАКТИРОВАТЬ 2: После выбора опции вы получите возвращенные заголовки (используйте только для отладки). Кроме того, убедитесь, что cookie.txt используется правильно (доступен для записи и записи).

curl_setopt($curl, CURLOPT_HEADER, true);

Это все, что я могу сделать на моей стороне. Теперь ланч!


РЕДАКТИРОВАТЬ 3: Связанные файлы cookie:

$cookie_file = PATH_TO_YOUR_COOKIE_FILE . '/cookie.txt';

if (! file_exists($cookie_file) || ! is_writable($cookie_file))
{
    echo 'Cookie file missing or not writable.';
    exit;
}

// you already added the following, I put it again just to remark their utility
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_file);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_file);

РЕДАКТИРОВАТЬ 4: Всегда проверяйте это в начале:

if ( ! extension_loaded('curl'))
{
    echo "You need to load/activate the curl extension.";
}

Если вы получили эту ошибку, активируйте curl в php.ini, раскомментировав / удалив переднюю ;

windows:
;extension=php_curl.dll // or curl.dll
linux:
;extension=php_curl.so // or curl.so

и перезапустите веб-сервер. Если вы не нашли эту строку, вам нужно установить curl:

// ubuntu
sudo apt-get install php5-curl

// centos
sudo yum install php5-curl

Для окон или вашего сервера вам тоже должно быть легко.

1 голос
/ 22 января 2012

Я вижу, что с этим кодом неправильно две вещи:

Вы переключаете имена переменных между созданием ресурса и его выполнением:

$curl = curl_init();                 // $curl
$siteSource = curl_exec($curlTable); // $curlTable

Вы сделали запрос на публикацию, ноне задан тип контента, вы должны сделать это:

$postFields = array(
  'user' => $userNum,
  'paswoord' => $userPass,
  'login' => 'loginform'
);
// This ensures all strings are properly encoded
$postData = http_build_query($postFields);

// ...

// curl *should* do this by itself, but best to do it explicitly
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
  'Content-Type: application/x-www-form-urlencoded',
  'Content-Length: '.strlen($postData),
  'Connection: close'
));
0 голосов
/ 28 июня 2016

В моей ситуации было две проблемы: 1) Сервер не принял cookie без значения 2) Я не использовал опцию CURLOPT_COOKIEFILE

Каждая проблема решается путем деления ее на отдельные части и решения каждой из них самостоятельно.

Поэтому я рекомендую вам разделить вашу проблему: 1) Проверьте, является ли это проблемой COOKIEFILE или веб-сайтом - отправьте значение cookie напрямую без файла - может быть, есть проблема с сервером 2) Если все будет в порядке - проверьте содержимое файламожет быть что-то не так (как в моей ситуации)

...