php curl cookie авторизация
Автоматическая авторизация на сайте с помощью CURL
Парсинг сайтов
Сейчас мы с вами научимся работать с сессиями и куками, а также выполнять автоматическую авторизацию на сайтах.
Перед изучением данного урока изучите работу с сессиями и куками в PHP.
Отправка куки на сервер
Предположим у вас уже есть название куки и ее значение. В этом случае ее можно отправить на сервер с помощью опции CURLOPT_COOKIE.
Давайте установим куку с именем name и значением ‘Дима’:
Несколько куки разделяются точкой с запятой с последующим пробелом, например, ‘name=Дима; login=admin’.
Автоматическая запись и получение кук
Уже имеющиеся куки, это хорошо, но бывает очень редко. Чаще всего нам нужно автоматически принимать и отправлять куки. Это делается с помощью двух опций: CURLOPT_COOKIEFILE командует принимать и сохранять куки в файл, а CURLOPT_COOKIEJAR командует отправлять сохраненные куки на сервер:
Параметром эти опции принимают путь к файлу в который будут писаться куки.
Учтите нюанс: автоматическая отправка куки CURLOPT_COOKIEJAR работает только при включенной опции CURLOPT_COOKIEFILE.
Работа с сессией
Зачем нам нужно уметь работать с сессиями через CURL? Затем, что авторизация на сайтах реализуется с помощью сессий. Соответственно, умея работать с сессиями, можно реализовать автоматическую авторизацию и парсить контент, доступный только авторизованному пользователю.
Сессии в PHP работают на основе кук. При старте сессии в куку пишется переменная sessionid, которая будет иметь что-то вроде такого значения 27za9c2lel3tk4zhhm7lmtzt6bbm3atj. Поэтому, для работы сессий всего лишь необходимо получать и отправлять куки на сайт, что мы и разобрали чуть выше.
Автоматическая авторизация
Допустим, вы хотите парсить страницы, доступные только авторизованному пользователю.
В этом случае алгоритм действий такой: первый запрос отправляется на страницу авторизации сразу с POST данными, при этом автоматически сессионные куки пишутся в файл, а все остальные запросы отправляются на страницы, которые вы хотите парсить.
Учтите только, что сессия живет около 20 минут, если не обращаться к сайту. То есть, если после последнего обращения к сайту пройдет больше времени, то нужно авторизовываться заново.
Работа с заголовками
CURLOPT_REFERER //curl_setopt($curl, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)’);//представляемся CURLOPT_HTTPHEADER Массив устанавливаемых HTTP-заголовков, в формате [‘Content-type: text/plain’, ‘Content-length: 100’]
Что вам делать дальше:
Приступайте к решению задач по следующей ссылке: задачи к уроку.
Впечатления
Свежие впечатления от фильмов, от программ, от работы, от учебы и от жизни.
19.07.2008
Curl. POST-запросы из PHP с учетом cookies
34 комментария:
Чтобы уж совсем автоматизировать процесс, можно было отказаться от файла cookie.txt и перехватывать заголовки от сервера, например, так:
curl_setopt($ch, CURLOPT_HEADERFUNCTION, ‘setCookies’), а в setCookies обрабатывать строки с «Set-Cookie:».
Мне нужно брать кукисы из Firefox-a, чтобы каждый раз не вводить их вручную, у него они вроде хранятся в Sql-lite базе, но мне пока было лень разбираться.
Надеюсь, что правильно понял и ответил на вопрос. Брать куки из базы Firefox (или где он их будет хранить) не нужно, они уже есть в приходящих хедерах.
Залогинится через форму тоже можно, только опять же нужно устанавливать возвращенные куки.
ну вот залогиниться по форме, а конкретнее на torrents.ru у меня не получилось, поэтому приходиться извращаться с куками из файрфокса
Все это радостно работает если установлена библиотека curl в php. а если нет?
Ну мне это актуально для автоматизации своих действий, а никакой проблемы дома поставить curl нет
Curl штука хорошая, но я так и не смог пройти авторизацию на майспейсе 🙁
Антиспам?
да я и на torrents.ru не смог. Видимо там что-то хитрое антиспамовое действительно..
Pilot34, Стучи в аську 55552552, скажу как авторизовываться.
Capcha, спасибо. Со второго победил авторизацию сам. Правда на Питоне, но это не суть важно. Одного поля в пост запросе не хватало для авторизации.
У твиттера в документации к АПИ указано, что для использования методов поддерживается базовая HTTP-авторизация. Чтобы узнать, что это такое, там даже ссылка на википедию есть. Так что дерзайте.
З.Ы. В последнем примере в CURLOPT_POSTDATA:
login_password=#pass#&
login_username=#login#&
cookie_test=1315534629&
redirect=index.php
З.З.Ы. Когда отправялется POST’ом, в хедерах есть «Cookie: bb_test=1315534629»
Вам же это наверняка для брутфорса паролей, так что не скажу 🙂
2 Pilot34. Спешите с выводами 🙂 Я подсказал брату спросить совета в этой ленте, т.к. видел, что здесь люди справились с авторизацией на torrents. Брутфорсить он не собирается. Помогите ему, пожалуйста, если знаете, как решить проблему.
О дааа! Спасибо 🙂 Расширение помогло:) Оказалось, дело в одном поле 🙂 А в FireBug это поле не показывалось:)
Pilot34 можете помочь с torrents.ru авторизацией на питоне?
Зайдите в icq пжалуйста
@strm icq давно нет. Про авторизацию см предыдущий коммент
в брутфорсе паролей, да и вообще в краже аккаунтов не вижу смысла. если уж и есть проблемы с ratio то решаются они на много проще.
мне это нужно для автоматизации скачивания торрентов
@strm я про вот этот коммент http://www.pilot34.com/2008/07/curl-post-php-cookies.html?showComment=1236893880000#c4154227152783803225
В Питоне все то же самое
ОТ Yandex не хочет принимать куки. Странно
вот нагуглил http://www.sitepoint.com/forums/showthread.php?590248-Getting-response-header-in-PHP-cURL-request, это не оно?
блядь, ну вы и лошары!
отсылайте POST запросом логин и пароль, и сохраняйте куки в файл.
При последующих запросах юзайте его.
Каие поля заполнять, можно фаербагом посмотреть
Помогите, кто-нибудь, пожалуйста, доделать!
нужно авторизоваться на сайте, заполнить форму и вывести данные. нужно заполнить поле «SessionKey». если подставляю вручную, все работает!
Авторизация на сайте при помощи curl php
Продолжая цикл статей посвященный парсерам и всем, что с ними связано. В этой статье расскажу про то, как легко можно авторизоваться на любом сайте при помощи библиотеку cUrl php. Для примера я взял один Украинский портал, к которому я собственно и буду подбирать ключики. Для работы нам также понадобится библиотека simple_html_dom
Для начала зарегистрируйтесь на сайте, чтобы иметь тестовые логин-пароль для входа на сайт.
На сайте мы видим ничем не примечательную форму авторизации.
«Внутренности» у нее тоже ничем не примечательны
Итак смотрим, что форма авторизации отправляет при аутентификации. Для этого возпользуемся Google Chrome, открываем в нем сайт, затем Инструменты->Инструменты разработчика. Далее переходим на вкладку Network. Для браузера Opera Меню->Страница->Средства Разработки->Open Opera DragOnFly и вкладка Сеть. Хоть я и фанат Оперы, но на мой взгляд продукт от компании Google немного удобнее. Я конечно не про браузер =)
Теперь авторизуемся на сайте, смотрим, что посылает форма при сабмите.
Видим, что форма посылает следующие параметры
Попробуем решить задачу в лоб и отправить эти данные простым массивом. Сразу учтем, что данные отправляются на защищенный ssl url, по протоколу https. Это следует учитывать при отправке данных в cUrl. Рассказывать, как работает SSL в рамках данной статьи я не стану, скажу лишь, что сертификаты, которыми обмениваются две стороны, сами по себе ничего не говорят о его обладателе. Они нужны лишь для того, чтобы передать открытый ключ, обеих сторон и служат для шифрования канала связи. Т.е. мы можем проверять наличие ssl, и подключать сертификат в cUrl, но это будет служить пользу только нам, сервер не может узнать пользуемся ли мы сертификатом, или используем незащищенный канал связи.
cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью
В этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами.
GET запрос при помощи cURL
Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.
Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.
Пример простого GET запроса при помощи cURL:
Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.
С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.
POST запрос при помощи cURL
Теперь давайте отправим post запрос на адрес https://httpbin.org/anything
Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.
Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON
cURL: POST запрос в формате JSON
Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json
cURL: GET запрос в формате JSON
GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’
cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.
Стоп, Дмитрий, прекрати выдумывать виды запросов!
Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.
Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:
Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.
Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST
Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:
Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.
Как получить заголовки ответа
В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:
Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях.
Рассмотрим такой пример:
Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.
Скачивание больших файлов с помощью cURL
Для того, чтобы скачать большой файл пригодится этот способ:
Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:
Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу.
Параллельные cURL запросы в PHP
Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:
И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.
Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_
Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.
Такие параллельные запросы выполняются значительно быстрее чем поочередные.
cURL запросы с сохранением и загрузкой cookie из файла
cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.
Давайте рассмотрим такой пример:
Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.
Передача cookie без файлов
Иммитация браузера с помощью cURL
Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.
В данном примере установлены заголовки, которые посылает Chrome.
В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.
Не используйте эти знания в противоправных целях.
cURL запросы через прокси
Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.
Отправка файлов
Авторизация с помощью cURL
HTTP Авторизация
Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.
OAuth авторизация
Авторизация через форму
Давайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое.
Допустим на сайте есть такая форма:
Тогда наш cURL запрос должен быть сформирован так:
Автоматическое построение запросов
Перевод консольной команды curl в PHP
И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/
Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.
Лайфхак
В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.
Как работать с cURL гораздо проще
Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:
К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class
Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.
POST и GET запросы без cURL
С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.
При помощи file_get_contents мы также можем отправить POST запрос.
Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php
Другие инструменты для работы с запросами в PHP
Для работы с запросами есть еще более мощный инструмент: Guzzle
Несколько примеров на Guzzle
GET запросы на Guzzle
Разные типы запросов на Guzzle
Асинхронные запросы на Guzzle
Если интересно, то читайте: Guzzle Quick Start
Пишите комментарии, если что-то осталось не понятно.
Почему не происходит авторизации через cURL PHP?
string(1250) «HTTP/1.1 100 Continue
HTTP/1.1 302 Found
Cache-Control: private, no-cache, no-store, must-revalidate, post-check=0, pre-check=0
Content-Type: text/plain; charset=utf-8
Date: Mon, 25 Sep 2017 07:56:52 GMT
Location: https://peek-cloppenburg.at/myaccount/
Set-Cookie: did=s%3ASPbkJ0vYD54giVFaO4BJ3V2MlVEweFN4.3GdSOWSBy8lgNi%2F86fp1LsDFVZ1RdIIrEKP2HvBtrMM; Max-Age=94608000; Domain=.peek-cloppenburg.at; Path=/; Expires=Thu, 24 Sep 2020 07:56:52 GMT; Secure
Vary: User-Agent, Accept, Accept-Encoding
X-Content-Type-Options: nosniff
x-request-id: e6c38de3-6bdd-45cd-bcd5-dcec76e50f2e
X-XSS-Protection: 1; mode=block
Content-Length: 60
Connection: keep-alive
Set-Cookie: visid_incap_753894=BrccN5aESViJiMVck3oh+MK2yFkAAAAAQUIPAAAAAAAmF6l21PqCtLNLV7Zh3EXC; expires=Mon, 24 Sep 2018 14:48:23 GMT; path=/; Domain=.peek-cloppenburg.at
Set-Cookie: nlbi_753894=4MCJRROblklNOncEtErIoQAAAAAXTJ6UfLbgFycyWeuQ0jpS; path=/; Domain=.peek-cloppenburg.at
Set-Cookie: incap_ses_800_753894=ZuNdQsceikE6xTlGxSsaC8O2yFkAAAAAT4xzB85uMYfe3HxbOLKgJw==; path=/; Domain=.peek-cloppenburg.at
X-Iinfo: 9-11749772-11749775 NNNN CT(70 145 0) RT(1506326211175 57) q(0 0 2 0) r(3 3) U6
X-CDN: Incapsula
Что вроде кажется все впорядке, я могу зайти на страницу, скажем, личного кабинета. Итак, код:
HTTP/1.1 301 Moved Permanently
Location: https://www.peek-cloppenburg.at/myaccount/
Content-Length: 0
Connection: close
Что означает. что все прошло неуспешно, он редиректит меня на страницу авторизации.
Мне не понятно, почему так просиходит и что я делаю не так.
Также я пробовала все заголовки поделить на массив кук и массив всего остального и отправить таким образом. Но ничего не работает.
Пожалуйста, объясните мне что не так. Что я не правильно делаю?
Как авторизоваться и выполнять действия в личном кабинете сата через cURL?