PHP: Using cURL with Basic HTTP Authentication.

Curl запросы с сохранением и загрузкой cookie из файла

cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.

Давайте рассмотрим такой пример:

Curl запросы через прокси

Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.

Curl: get запрос в формате json

GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');

А в остальном код идентичен предыдущему примеру. Хотя, надо признать, GET запросы с телом – это нонсенс. Обычно для этих целей используется POST, PUT или PATCH, но был у меня один случай… Поэтому вот GET запрос в формате JSON.

Curl: post запрос в формате json

Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode()
И добавляем заголовок Content-Type: application/json

Get запрос при помощи curl

cURL – мощный инструмент для отправки запросов. Только взгляните сколько он всего умеет.

Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.

Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.

Пример простого GET запроса при помощи cURL:

Php curl авторизация

Почему не проходит CURL авторизация на сайте https://kabinet_dot_3ton_dot_eu?

вот такая функция

function login($url,$login,$pass){
   $ch = curl_init();
   if(strtolower((substr($url,0,5))=='https')) { // если соединяемся с https
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
   }
   curl_setopt($ch, CURLOPT_URL, $url);
   // откуда пришли на эту страницу
   curl_setopt($ch, CURLOPT_REFERER, $url);
   // cURL будет выводить подробные сообщения о всех производимых действиях
   curl_setopt($ch, CURLOPT_VERBOSE, 1);
   curl_setopt($ch, CURLOPT_POST, 1);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_POSTFIELDS,"wizard[username]=".$login."&wizard[password]=".$pass);
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (Windows; U; Windows NT 5.0; En; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.4");
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   //сохранять полученные COOKIE в файл
   curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
   $result=curl_exec($ch);

   // Убеждаемся что произошло перенаправление после авторизации
   if(strpos($result,"Location: gsm-platby-sim.html")===false) die('Login incorrect');

   curl_close($ch);

   return $result;
}

$url="https___centrum_dot_3ton_dot_eu";
$login="asd";
$pass="asd";

echo login($url,$login,$pass);

Вместо букв в пароле подставить нужно цифры

Сразу скажу что код невозможно на сайте поменять.

Php авторизация с помощью curl

$ch=curl_init(‘https://site.ru/login.html’);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true);

curl_setopt($ch,CURLOPT_HEADER,true);

curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ch,CURLOPT_USERAGENT,‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36’);

curl_setopt($ch,CURLOPT_POST,true);

curl_setopt($ch,CURLOPT_HTTPHEADER,[

‘X-Requested-With: XMLHttpRequest’,

‘Accept: application/xml, text/xml, */*; q=0.01’,

‘Faces-Request: partial/ajax’,

‘Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7’,

‘Host: site.ru’,

‘Origin: https://site.ru’,

‘Content-Type: application/x-www-form-urlencoded; charset=UTF-8’

]);

curl_setopt($ch,CURLOPT_REFERER,‘https://site/login.html’);

curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query([

‘login:login’=>$login,

‘login:pwd’=>$password,

‘login:token’=>$token,

‘javax.behavior.event’=>‘action’,

‘javax.partial.event’=>‘click’,

‘login:SUBMIT’=>1

])

);

curl_setopt($ch,CURLOPT_COOKIEJAR,$cookiefile);

curl_setopt($ch,CURLOPT_COOKIEFILE,$cookiefile);

curl_setopt($ch,CURLOPT_PROXY,‘127.0.0.1:8080’);

curl_setopt($ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP);

$html=curl_exec($ch);

curl_close($ch);

Post и get запросы без curl

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

Пример:

Авторизация на другом сайте с помощью php curl: как решить проблему с cookie?

Уважаемые коллеги!

Прошу помощи, наверное, я чего-то не понимаю.

Задача: с помощью PHP-скрипта автоматически авторизоваться на другом сайте и перейти на него (в браузере пользователя).

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

Делаю авторизацию при помощи curl.

Проблема: почему-то при выводе результатов в браузер с помощью echo авторизация срабатывает, но “теряется” при последующем переходе на этот сайт с помощью заголовка Refresh или Location

// URL скрипта авторизации на стороннем сайте
        $login_url = 'https://example.com/index.php?action=login2';
  
        // параметры для отправки запроса - логин и пароль
	    $post_data = array(
		    'user' => 'MYUSERNAME',
		    'passwrd' => 'MYPASSWORD',
		    'cookielength' => '-1',
		    'hash_passwrd' => ''
	    );
  
        // создание объекта curl
        $ch = curl_init();
  
        // используем User Agent браузера
        $agent = $_SERVER["HTTP_USER_AGENT"];
        curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  
        // задаем URL
        curl_setopt($ch, CURLOPT_URL, $login_url );
  
        // указываем что это POST запрос
        curl_setopt($ch, CURLOPT_POST, 1 );
  
        // задаем параметры запроса
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  
        // указываем, чтобы нам вернулось содержимое после запроса
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  
        // в случае необходимости, следовать по перенаправлени¤м
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  
        /*
            Задаем параметры сохранени¤ cookie
            как правило Cookie необходимы для дальнейшей работы с авторизацией
        */
  
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');

  
        // выполняем запрос для авторизации
        $postResult = curl_exec($ch);
        
        curl_close($ch);

             // Если выводим результат работы curl на страницу через Echo, 
              // то показывает страницу с авторизованным пользователем (всё работает)
             // echo $postResult;

        // А если перекидываем пользователя на нужную страницу 
        //в браузере пользователя, то авторизация теряется, и мы видим "Привет гость"

        header( 'Refresh: 0; url=https://example.com/index.php' );

Почему авторизация срабатывает при выводе результатов в браузер, но “теряется” при переходе на этот сайт с помощью заголовка Refresh или Location? И как решить эту проблему?

Заранее огромное спасибо!

Авторизация через форму

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

Допустим на сайте есть такая форма:

Другие инструменты для работы с запросами в php

Для работы с запросами есть еще более мощный инструмент: Guzzle

Как получить заголовки ответа

В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:

$ch = curl_init();

$headers = [];

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// ... остальные опции

// this function is called by curl for each header received
curl_setopt($ch, CURLOPT_HEADERFUNCTION,  function($curl, $header) use (&$response_headers)  {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) < 2) { // ignore invalid headers
      return $len;
    }

    $headers[strtolower(trim($header[0]))][] = trim($header[1]);

    return $len;
  }
);

$data = curl_exec($ch);

print_r($response_headers); // выводим заголовки ответа

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

Рассмотрим такой пример:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

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

Как работать с curl гораздо проще

Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:

Лайфхак

В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.

Отправка файлов

Для того, чтобы отправить файлы на сервер, мы просто заполняем поля POST запроса, указывая там специальный класс CURLFile. На сервере вы можете получить отправленные файлы, при помощи суперглобального массива $_FILES.

Параллельные curl запросы в php

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

Похожее:  Броско Фитнес Личный Кабинет Вход — Официальный сайт

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *