Curl — Curl не сохраняет cookie


PHP Curl сбрасывает куки и не сохраняет их в cookie Jar

Curl не сохраняет куки в файле jar cookie, как это обычно делается при использовании cookiejar,

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

Чтобы попытаться выяснить причину, я включил и напечатал подробное изгибание в файле, и я заметил следующее сообщение, которое привлекло мое внимание

Я много искал в Google и здесь подобное сообщение, но не повезло, никто не упоминает об этом нигде

Файл cookie успешно генерируется при запуске приведенного ниже кода, но содержит только следующее содержимое

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

Вот полный многословный от завитка

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

Вот результат HTML на странице со всеми var_dump

4 SuperSpy [2012-01-22 15:17:00]

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

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

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


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

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

И что php.ini:

  • Боковой вопрос: Завершает ли curl_close cookie? А если параметр cookiejar не установлен?
  • Основной вопрос: Почему не скручиваешь писать куки файлы, как это должно делать (и делает это на моем внешнем хосте, а не на моем LOCALHOST.

phpinfo()

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

Это моя функция завитка. Он работает на моем локальном компьютере с Windows. Но на сервере он не может сохранить файл cookie (никаких ошибок, просто нет файла cookie, и программа не работает.). Разрешения, похоже, в порядке, так как я могу file_put_contents() в папку, где я пытаюсь сохранить файл cookie. Каковы возможные причины отказа файла cookie от создания? Может ли кто-нибудь их перечислить, чтобы я мог проверять один за другим. или любые другие предложения приветствуются.

Написал функцию для отправления POST форм с помощью CULR:

function sendPostDataCURL ( $url , $postData = «» , $cookiestr = «» , $cookiejar = «» , $cookiefile = «» ) //from http://parsing-and-i.blogspot.com/2009/09/curl-first-steps.html
< $uagent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8" ;

$ch = curl_init ( $url );

curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 ); // возвращает веб-страницу
curl_setopt ( $ch , CURLOPT_HEADER , 1 ); // возвращает заголовки
curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , 1 ); // переходит по редиректам
curl_setopt ( $ch , CURLOPT_ENCODING , «» ); // обрабатывает все кодировки
curl_setopt ( $ch , CURLOPT_USERAGENT , $uagent ); // useragent
curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , 120 ); // таймаут соединения
curl_setopt ( $ch , CURLOPT_TIMEOUT , 120 ); // таймаут ответа
curl_setopt ( $ch , CURLOPT_MAXREDIRS , 10 ); // останавливаться после 10-ого редиректа

$postData = substr_replace ( $str , » , 0 , 1 );

curl_setopt ( $ch , CURLOPT_POST , true );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $postData );
curl_setopt ( $ch , CURLOPT_HTTPHEADER , array( ‘Content-Type: application/x-www-form-urlencoded’ ));


if( strcmp ( $cookiejar , «» )!= 0 ) <
curl_setopt ( $ch , CURLOPT_COOKIEJAR , $cookiejar );
>
if( strcmp ( $cookiefile , «» )!= 0 ) <
curl_setopt ( $ch , CURLOPT_COOKIEFILE , $cookiefile );
>
if( strcmp ( $cookiestr , «» )!= 0 ) <
curl_setopt ( $ch , CURLOPT_COOKIE , $cookiestr );
>

Наверняка, Вы знаете, что контент страницы, отдаваемой сервером, иногда зависит от cookie, присланных клиентом (в частности, браузером). Это аналогично тому, что видит неавторизованный пользователь и авторизованный. Вот в этой статье мы с Вами научимся отправлять cookie через cURL.

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

Теперь создадим скрипт, который будет отправлять cookie через cURL сначала «Администраторские«, а потом другие.

Код здесь достаточно прозрачный, однако, на некоторых моментах, пожалуй, остановлюсь. В частности, обратите внимание, как задаются cookie. То есть формат такой: «name1=value1;name2=value2«. Потому что иногда люди путают и вместо «;» ставят «&«. И, главное, Вы должны усвоить, что один и тот же URL для одного пользователя будет содержать один контент, а для другого совсем другой. И зависит это от заголовков, посланных на сервер, в частности, cookie, которые обычно посылает браузер, но в нашем случае посылается с cURL.

Цукерберг рекомендует:  Нейронные сети технологии будущего

После этой статьи у Вас открываются фантастические возможности по автоматизации определённых вещей. Простой пример: есть сайт, на котором находится определённая информация, доступная только зарегистрированным пользователям. Эта информация Вам нужна постоянно, но Вам не хочется постоянно заходить на сайт, авторизовываться и искать эту информацию. Вы можете написать простой скрипт, который подключится к нужному URL и передаст нужные cookie, чтобы сервер принял Вас за авторизованного пользователя. Далее сервер вернёт Вам нужную страницу с нужной Вам информацией, которую Вы и выводите. Таким образом, Вам надо будет только обновить страницу со скриптом, чтобы сразу увидеть нужную Вам информацию.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):

  • Комментарии ( 1 ):

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

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

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

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

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

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

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

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

    CURL не сохраняет Cookies (PHP)


    Я боролся с Logging в WordPress на некоторое время теперь с CURL (PHP). Я думаю, что я попробовал все, но мне кажется, что я что-то пропустил. Я не могу получить CURL, чтобы сохранить свои Куки, когда я войти в систему. Странная вещь, что даже если я не могу сохранить кук в файл, все еще работает более или менее, за исключением Обновления Worpdress плагин (это то, что я работаю на данный момент). Я могу войти в WordPress, и я могу даже установить автоматический ugprade preg_matching ссылки и керлинг на нем — WordPress основных обновлений без проблем, но по какой-то причине, когда дело доходит до плагин — я просто не могу это сделать. У меня было много догадок прошлой ночью, где проблема, но ничего не делал. Теперь, когда я решил сравнить печенье я получаю от CURL и в FireFox — получается, что нет куки с CURL.

    Хорошо, так вот я поставил Опции (не против комментируемой вещи, я проверял все комментируют вещи и положить их в . ).

    Так что я сделал поиск, и пытался получить печенье, и не с этим:

    Я также попытался вторя $ cookieFile с file_get_contents () — пустые. Я проверил файл около 15 раз в настоящее время — это 777 записываемый файл. Я пытался писать к нему с file_put_contents () и удалось, так что ошибка в расположении файлов и / или разрешений. Я, очевидно, что-то отсутствует, я просто не могу видеть его.

    Интеграция JavaScript cookies в CURL-запросы

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

    Перейдем к описанию проблемы.
    Мне нужно было написать скрипт бота для одного сайта с целью автоматизации некоторого процесса из нескольких шагов, не считая авторизации. Такова была задача, на первый взгляд, ничего особенного. Впрочем, поначалу так оно и было. Т.к. на сайте применялась авторизация и активно использовались cookies, было решено использовать CURL. Я понемногу сниффил HTTP-запросы к серверу сайта и воспроизводил их у себя в скрипте. Процесс, как говорится, шел…. Неприятности начались на предпоследнем шаге, когда сервер совершенно неожиданно для меня отказался выдавать желаемый результат. Это привело меня в состояние ступора, в котором я пребывал довольно долгое время, продолжая снова и снова сравнивать логи «искусственных» и «естественных» (браузерных) запросов в надежде найти хоть какое-то несовпадение. Прошло несколько часов, прежде чем я понял, что впустую трачу время.

    Цукерберг рекомендует:  Ajax - Как работает AJAX

    И тогда я обратил свое внимание на так называемые JavaScript (или non-HTTP) cookies. Разумеется, CURL не мог отследить их появление и соответственно не мог добавить их в свои запросы. Но зачем серверу проверять JavaScript cookies? Хороший вопрос, в другой раз он бы обязательно меня заинтересовал, но в тот момент у меня были другие заботы.

    Забегая вперед, скажу, что моя догадка оказалась верной. Сервер и в самом деле проверял JS куки, причем только на том злополучном предпоследнем шаге. Я не знаю, с какой целью это было сделано. Тем более я не уверен, что этой целью была защита от ботов. Как говорится, чужая душа (сервер) — потемки.

    Итак, мне предстояло решить следующие две задачи:

    1. найти «значимые» JavaScript cookies, которые влияют на ответ сервера;
    2. найти способ вставить эти куки в запросы CURL.

    Насчет первой задачи мне, в принципе, было все ясно, во всяком случае, я уже представлял себе примерный план действий. Так что я решил сразу начать со второй: найти средство для добавления «своих» куков в CURL-запрос, дополнительно к тем, что появляются там автоматически, из файла, указанного опцией CURLOPT_COOKIEFILE.

    Первым, что пришло мне в голову, была мысль: включить опцию CURLOPT_COOKIE со строкой, составленной из параметров куков. Примерно так:

    Так я и сделал: добавил эту строку в код… и очень скоро убедился, что это не работает. Вернее работает, но совсем не так как мне хотелось. В отправленном HTTP-заголовке были только куки, добавленные этой опцией, а вот куки из файла CURLOPT_COOKIEFILE при этом исчезли (исчезли из заголовка, а не из файла). Т.е. содержимое файла-хранилища куков игнорировалось. Из этого следует простой и бесполезный вывод: опции CURLOPT_COOKIE и CURLOPT_COOKIEFILE/CURLOPT_COOKIEJAR нельзя использовать вместе.

    Короче, решить проблему по-быстрому не получилось. Поиск готовых решений в интернете тоже ничего не дал. Может быть я плохо искал, но все, что мне удалось найти по этой теме, вот этот вопрос, заданный на форуме StackOverflow, и как видно, оставшийся без ответа.

    А тем временем срок сдачи работы подходил к концу, заказчик требовал объяснений, а у меня, как назло, куда-то пропало все мое красноречие. Тут мне почему-то вспомнилась крылатая фраза из одной советской комедии: «Либо я веду ее в загс, либо она ведет меня к прокурору». Ни в загс, ни к прокурору, мне не хотелось. Мне очень хотелось куда-нибудь скрыться и забыться… но пришлось выбирать другой способ устранения проблем.

    К тому времени я уже видел два пути решения:

    1. отказаться от услуг CURL’а в плане автоматической обработки cookies и взять эту «черную» работу себе, т.е. самому парсить куки из заголовков ответа, сохранять их, и передавать вместе с запросами. Звучит немного пугающе, но зато это дает полный контроль над куками.
    2. оставить авто обработку cookies, но добавить возможность вставки в файл куков «своих» (кастомных) параметров. Тоже перспектива не из приятных, поскольку это предполагало ручную правку файла куков.



    После недолгих колебаний был выбран второй вариант, т.к. он показался мне более легким в реализации. К тому же меня давно уже интересовал формат Netscape Cookie File, но не было повода познакомиться с ним поближе. И вот этот повод появился.
    Искать информацию по этому формату долго не пришлось. С первой же страницы выдачи гугла я попал на оф. сайт CURL’а, в архив переписки пользователей с создателем этой библиотеки, где и нашел то, что искал.

    Формат файла оказался довольно простым – 7 полей (атрибутов) в каждой строке, разделенных tab’ами и идущих в таком порядке:

    • domain
    • tailmatch
    • path
    • secure
    • expires
    • name
    • value

    Смысл этих полей имхо вполне очевиден. Отмечу только, что tailmatch – это флаг точного совпадения доменного имени сайта.

    Теперь, когда формат файла был известен, остальное было уже делом техники.
    В итоге мной был написан небольшой класс CookiejarEdit, исходный код которого привожу прямо здесь:

    Методы __clone(), export(), import() были добавлены «чисто для украшения» кода. Честно говоря, я не вижу в них большого смысла, так же как и в дополнительном аргументе $aXtra для метода setPrefix, который я добавил просто на всякий случай (хотя имхо, необходимость в нем не может возникнуть по определению). В любом случае код рабочий и готов к использованию (PHP >= 5.0).
    Я не претендую на оригинальность идеи и не исключаю возможности, что это очередной «велосипед». Возможно, аналогичные и даже более простые решения давно уже существуют. Тем не менее, мне мой «велосипед» помог и я буду рад, если он поможет кому-нибудь еще.

    Цукерберг рекомендует:  Pydev - Как импортировать картинку в eclipse - pydev

    Итак, инструмент для «продвинутой» работы с куками был готов. Но на этом мои приключения не закончились. Предстояло еще отследить те самые «значимые» JS куки, понять какие значения им присваиваются и многое другое. Но это уже другая история. А эту я пожалуй закончу. Спасибо за внимание.

    P.S.:
    Перечитав текст статьи в очередной раз, я понял, что ей все-таки недостает «примера из реальной жизни». Неплохо было бы, подумал я, устроить небольшую демонстрацию на примере какого-нибудь сайта. Использовать тот сайт, с которым я работал, я, по определенным причинам, не мог. Поэтому нужно было найти ему замену: какой-нибудь известный сайт, не требующий авторизации, где хоть как-то используется проверка JavaScript cookies на стороне сервера. К моему удивлению и счастью такой сайт нашелся очень быстро: в моих закладках. Это всем известный Яндекс-Каталог, категория Фриланс (то, что мне ближе всего).

    Сначала эта страница выглядит так:

    Но если перейти к настройкам, выбрать там пункт «стандартное с номерами»:

    и вернуться на страницу каталога, то мы добъемся «чудесного» эффекта: превью со страницы исчезнут и останутся только «сухие» цифры и текст:

    Давайте попробуем написать простейший бот для скачивания первой страницы этого каталога без превьюшек. Я понимаю, как глупо это выглядит со стороны: писать бота только для того чтобы изменить вид страницы. Но не забывайте, что это всего лишь пример. Давайте представим, что получение страницы без превьюшек – наше самое заветное желание).

    Для начала проведем рекогносцировку. Обратим внимание на url страницы каталога после изменения настроек: он не изменился. Правда, к нему добавилась строка «?rnd=xxx», но это, по всей видимости, всего лишь указание браузеру не брать страницу из кэша. Отсюда можно сделать вывод, что настройки передаются и сохраняются, скорее всего, через куки.

    Попробуем разобраться как именно это происходит. В этом нам поможет такой полезный инструмент, как Live HTTP Headers:

    Это расширение Firefox’а позволяет отслеживать весь входящий и исходящий HTTP-траффик в браузере, в том числе и куки, посредством которых и осуществляется запоминание настроек в нашем примере. Происходит это, очевидно, после нажатия кнопки «Сохранить» и перехода к странице каталога.

    Зайдем еще раз на страницу настроек, предварительно включив снифер Live HTTP Headers. Выберем снова пункт «стандартное с номерами» и нажмем кнопку «Сохранить». А теперь посмотрим на наш улов в снифере. Нас интересуют подробности запроса страницы каталога. У меня они имеют такой вид:

    Здесь сразу бросается в глаза фрагмент «yaca_view=num». Скорее всего, это и есть наш искомый cookie-параметр. Но где он устанавливается? Во всяком случае не в заголовках ответа сервера, поскольку там этот параметр не встречается. Тогда логично предположить, что это JavaScript cookie и значит, его установка происходит где-то в яваскриптах страницы настроек («setup.xml»). Попробуем найти его в тексте этой страницы. Так и есть. Вот строка из файла «setup.xml»:


    По всей видимости здесь и происходит установка параметра «yaca_view» со значением, взятым из одноименного элемента формы (в нашем случае это значение ‘num’).

    Итак, мы выяснили, что для того, чтобы увидеть страницу каталога без превьюшек, нужно передать серверу cookie-параметр с именем ‘yaca_view’ и значением ‘num’. Теперь, когда у нас уже есть средство для добавления cookies в CURL-запросы, можно без особого труда написать скрипт бота. Вот его код с небольшими комментариями:

    Result: ‘; if ($cont) < file_put_contents(FN_RESULT, $cont); echo 'OK

    Теперь действительно все. Еще раз спасибо за внимание, особенно тем кто дочитал до конца).

    GhostSt » Сб дек 07, 2013 4:06 pm

    С недавнего времени, curl перестал записывать куки в файл, из-за чего невозможно работать в некоторыми сайтами.
    Что странно, на локальном сервере все нормально работает

    Вот часть кода скрипта:
    Код: выделить все curl = curl_init();
    curl_setopt($this->curl, CURLOPT_URL, $this->url);
    curl_setopt($this->curl, CURLOPT_COOKIEJAR, ‘cookie.txt’);
    curl_setopt($this->curl, CURLOPT_COOKIEFILE, ‘cookie.txt’);
    curl_setopt($this->curl, CURLOPT_USERAGENT, $this->user_agent);
    curl_setopt($this->curl, CURLOPT_FAILONERROR, 1);
    curl_setopt($this->curl, CURLOPT_REFERER, $this->referer);
    curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, $this->curl_timeout);
    curl_setopt($this->curl, CURLOPT_TIMEOUT, $this->curl_timeout);
    curl_setopt($this->curl, CURLOPT_HEADER, 1);
    curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->setHeaders());
    curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1);
    $html = curl_exec($this->curl);
    ?>

    Из-за чего могла возникнуть данная проблема?

    Форум PHP программистов ► PHP практикум ► PHP общие вопросы

    Пейджер выключен!

    Сообщений: 2612
    Пользователь №: 5568
    На форуме:
    Карма: 30

    тестирую на скрипте

    PHP
    $url = «http://mail.ru» ;
    function send_get ( $get_url , $refer )
    <
    $ch = curl_init ();
    curl_setopt ( $ch , CURLOPT_URL , $get_url );
    curl_setopt ( $ch , CURLOPT_HEADER , 1 );
    curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
    curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , false );
    curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST , false );
    curl_setopt ( $ch , CURLOPT_REFERER , $refer );
    curl_setopt ( $ch , CURLOPT_COOKIEJAR , «1.txt» );
    curl_setopt ( $ch , CURLOPT_COOKIEFILE , «1.txt» );
    curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , 30 );
    curl_setopt ( $ch , CURLOPT_USERAGENT , «Mozilla Firefox 3 (compatible; MSIE 6.0; LAS Linux)» );
    curl_setopt ( $ch , CURLOPT_VERBOSE , 1 );
    return $data = curl_exec ( $ch );
    >

    echo send_get ( $url , » );

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

    Понравилась статья? Поделиться с друзьями:
    Все языки программирования для начинающих