Что такое curl и как работает эта команда

Результат запроса

Ну а после того, как CURL-запрос был выполнен, неплохо бы было знать, что он вернул:

А вот какие еще даные мы можем получить:

Индекс массива Значение Индекс массива Значение
url string(17) «https://intop24.ru» content_type string(24) «text/html; charset=utf-8»
http_code int(200) header_size int(218)
request_size int(49) filetime int(-1)
ssl_verify_result int(0) redirect_count int(0)
total_time float(0.009419) namelookup_time float(1.3E-5)
connect_time float(1.3E-5) pretransfer_time float(1.4E-5)
size_upload float(0) size_download float(46523)
speed_download float(4939271) speed_upload float(0)
download_content_length float(-1) upload_content_length float(0)
starttransfer_time float(0.009374) redirect_time float(0)
certinfo array(0) { } redirect_url string(0) «»

Строки запроса и параметры

Параметры почтового индекса (), идентификатора приложения () и единиц () были переданы в конечную точку с помощью «строк запроса». Знак добавленный к URL указывает начало строки запроса. Параметры строки запроса — это параметры, которые появляются после знака :

После строки запроса каждый параметр объединяется с другими параметрами через символ амперсанда . Порядок параметров в строке запроса не имеет значения. Порядок имеет значение только в том случае, если параметры находятся слева от строки запроса (и, следовательно, являются частью самого URL-адреса). Любые настраиваемые части конечной точки, которые появляются перед строкой запроса, называются (разберем их позже).

Технология cURL

cURL — это технология, которая предназначена для передачи/получения данных посредстов URL. Технология cURL поддерживает такие распространенные протоколы, как HTTP, FTP, HTTPs и другие. Изначально cURL был инструментом командной строки, однако разработчики PHP не поленились и создали библиотеку в PHP, чем облегчили жизнь миллионам программистам. Давайте попробуем вместе разобраться с технологией cURL на примерах. Советую читать всё и по порядку.

Я знаю достаточно много примеров, где для получения сторонних web-страниц (парсеры) использовались совершенно другие способы, отличные от cURL. Например:

  • file_get_contents(«https://intop24.ru»);
  • file(«https://intop24.ru»);
  • readfile(«https://intop24.ru»);

Почему разработчики использовали их и что в них не так? А потому, что не знали, либо не хотели знать, что такое cURL. А не так в них то, что функционал ограничен: получили страницу и все на этом, в то время, как cURL может отправить форму на странице, получить ответ, обработать ошибку, начать всё заново и т.д.

Отправка cURL запроса PHP

Формирование cURL запроса состоит из четырех этапов:

  1. Инициализация
  2. Указание параметров
  3. Выполнение команды и получение результата
  4. Освобождение памяти

Итак, как это должно выглядеть в коде:

// 1. Инициализация
$ch = curl_init();

// 2. Указание параметров
curl_setopt($ch, CURLOPT_URL, "https://asgeto.ru");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);

// 3. Выполнение команды и получение результата
$output = curl_exec($ch);
// В случае возникновения ошибки выводит её в документ
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch); // можно заменить на логирование в файл при желании
}

// 4. Освобождение памяти
curl_close($ch);

Что такое curl?

На самом деле, curl — это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.

Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl — это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.

Location header

When a resource is requested from a server, the reply from the server may include a hint about where the browser should go next to find this page, or a new page keeping newly generated output. The header that tells the browser to redirect is .

Curl does not follow headers by default, but will simply display such pages in the same manner it displays all HTTP replies. It does however feature an option that will make it attempt to follow the pointers.

To tell curl to follow a Location:

If you use curl to POST to a site that immediately redirects you to another page, you can safely use () and / together. curl will only use POST in the first request, and then revert to GET in the following operations.

Формы

Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.

4.1 GET

GET-форма использует метод GET, например следующим образом:

        <form method="GET" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value="OK">
        </form>

Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».

Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».

Большинство поисковых систем работают таким образом.

Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:

        # curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).

Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.

Форма, генерирующая POST-запрос, похожа на предыдущую:

        <form method="POST" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value=" OK ">
        </form>

Curl может сформировать POST-запрос с теми же данными следующим
образом:

        # curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.

Данные, которые вы отправляете к серверу, должны быть правильно
закодированы
, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.

4.3 Загрузка файлов с помощью POST (File Upload POST)

В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.

Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:

        <form method="POST" enctype='multipart/form-data' action="upload.cgi">
        <input type=file name=upload>
        <input type=submit name=press value="OK">
        </form>

Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.

Чтобы отослать данные в такую форму с помощью curl, введите
команду:

        # curl -F upload=@localfilename -F press=OK 

4.4 Скрытые поля

Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.

Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:

        <form method="POST" action="foobar.cgi">
        <input type=text name="birthyear">
        <input type=hidden name="person" value="daniel">
        <input type=submit name="press" value="OK">
        </form>

Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:

        # curl -d "birthyear=1905&press=OK&person=daniel" 

4.5 Узнать, как выглядит POST-запрос

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

Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).

Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.

What is PHP CURL?

Answer:- The PHP cURL is a library used for making HTTP requests to any web server.

In PHP CURL, There are 4 common steps in every PHP cURL script:

  • Initialize PHP cURL.
  • Set the options, the target URL, POST data and such. There are a ton of possible options.
  • Execute the cURL, handle any PHP CURL errors.
  • Close the PHP cURL connection.

In this example, we post data with PHP CURL. We will convert array data to JSON data using json_encode() method and then we will post data with PHP CURL.

Example 1 – php curl post JSON data

Let’s see the below example to post JSON data with PHP Curl:

<?php

 // A sample PHP Script to POST data using cURL
 
  $data = array(
      'name' => 'tutsmake',
      'email' => '',
      'mobile' => '9898989898',
  );
   
  $post_data = json_encode($data);
   
  // Prepare new cURL resource
  $crl = curl_init('https://example.com/api/user');
  curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($crl, CURLINFO_HEADER_OUT, true);
  curl_setopt($crl, CURLOPT_POST, true);
  curl_setopt($crl, CURLOPT_POSTFIELDS, $post_data);
   
  // Set HTTP Header for POST request 
  curl_setopt($crl, CURLOPT_HTTPHEADER, array(
      'Content-Type: application/json',
      'Content-Length: ' . strlen($payload))
  );
   
  // Submit the POST request
  $result = curl_exec($crl);
   
  // handle curl error
  if ($result === false) {
      // throw new Exception('Curl error: ' . curl_error($crl));
      //print_r('Curl error: ' . curl_error($crl));
      $result_noti = 0; die();
  } else {

      $result_noti = 1; die();
  }
  // Close cURL session handle
  curl_close($crl);
   
?>

If you have any error in calling the PHP Curl, You can use the below code to handle error in PHP CURL:

  if ($result === false) {
      // throw new Exception('Curl error: ' . curl_error($crl));
      //print_r('Curl error: ' . curl_error($crl));
      $result_noti = 0; die();
  } else {

      $result_noti = 1; die();
  }

Example 2 – Send Push Notification using FCM in PHP CURL

If you want to send push notification on the mobile device. You can see the below example for that.

  function send_notification_FCM($notification_id, $title, $message, $id,$type) {
    $accesstoken = 'fcm_key';

    $URL = 'https://fcm.googleapis.com/fcm/send';


        $post_data = '{
            "to" : "' . $notification_id . '",
            "data" : {
              "body" : "",
              "title" : "' . $title . '",
              "type" : "' . $type . '",
              "id" : "' . $id . '",
              "message" : "' . $message . '",
            },
            "notification" : {
                 "body" : "' . $message . '",
                 "title" : "' . $title . '",
                  "type" : "' . $type . '",
                 "id" : "' . $id . '",
                 "message" : "' . $message . '",
                "icon" : "new",
                "sound" : "default"
                },

          }';
        // print_r($post_data);die;

    $crl = curl_init();

    $headr = array();
    $headr[] = 'Content-type: application/json';
    $headr[] = 'Authorization: ' . $accesstoken;
    curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

    curl_setopt($crl, CURLOPT_URL, $URL);
    curl_setopt($crl, CURLOPT_HTTPHEADER, $headr);

    curl_setopt($crl, CURLOPT_POST, true);
    curl_setopt($crl, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($crl, CURLOPT_RETURNTRANSFER, true);

    $rest = curl_exec($crl);

    if ($rest === false) {
        // throw new Exception('Curl error: ' . curl_error($crl));
        //print_r('Curl error: ' . curl_error($crl));
        $result_noti = 0;
    } else {

        $result_noti = 1;
    }

    //curl_close($crl);
    //print_r($result_noti);die;
    return $result_noti;
}

In the above example, we have created function name send_notification_FCM() with following parameter $notification_id, $title, $message, $id,$type. When you want to send push notification to the mobile device, that time you need to call the send_notification_FCM() with specified parameters.

Cookie Basics

The way the web browsers do «client side state control» is by using cookies. Cookies are just names with associated contents. The cookies are sent to the client by the server. The server tells the client for what path and host name it wants the cookie sent back, and it also sends an expiration date and a few more properties.

When a client communicates with a server with a name and path as previously specified in a received cookie, the client sends back the cookies and their contents to the server, unless of course they are expired.

Many applications and servers use this method to connect a series of requests into a single logical session. To be able to use curl in such occasions, we must be able to record and send back cookies the way the web application expects them. The same way browsers deal with them.

Произвольные заголовки запроса

Возможно, вам понадобится изменять или добавлять элементы
отдельных запросов curl.

К примеру, вы можете изменить запрос POST на PROPFIND и отправить
данные как «Content-Type: text/xml» (вместо обычного
Content-Type):

        # curl -d "<xml>" -H "Content-Type: text/xml" -X PROPFIND url.com

Вы можете удалить какой-нибудь заголовок, указав его без содержимого.
Например, вы можете удалить заголовок ‘Host:’, тем самым сделав
запрос «пустым»:

        # curl -H "Host:" http://mysite.com

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

        # curl -H "Destination: http://moo.com/nowhere" http://url.com

Отправить и получить cookie

Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$html = curl_exec($ch);
curl_close($ch);

Параметр CURLOPT_COOKIE используется для принудительной передачи значения куки:

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=61445603b6a0809b061080ed4bb93da3');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

$html = curl_exec($ch);
curl_close($ch);

Следовать за редиректами

Сервер Google сообщил нам, что страница перемещена (301 Moved Permanently), и теперь надо запрашивать страницу . С помощью опции укажем CURL следовать редиректам:

> curl -L google.com
<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru">
<head>
<meta content="Поиск информации в интернете: веб страницы, картинки, видео и многое другое." name="description">
<meta content="noodp" name="robots">
<meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image">
<meta content="origin" name="referrer">
<title>Google</title>
..........

Получить HTTP код ответа сервера

Если требуется прощупать доступность сайта или его отдельной страницы, то можно воспользоваться функцией curl_getinfo с параметром CURLINFO_HTTP_CODE:

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $http_code; // Выведет: 200

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

Предыдущая запись Передача метрики на другой аккаунт при смене владельца сайта

POST запрос¶

Примечание

httpbin — сервис для отладки HTTP запросов и
ответов

Пример POST запроса к сервису httpbin.

POST запрос на сайт https://httpbin.org/post

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL);

  /* get a curl handle */
  curl = curl_easy_init();
  if(curl) {
    /* First set the URL that is about to receive our POST. This URL can
       just as well be a https:// URL if that is what should receive the
       data. */
    curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/post");
    /* Now specify the POST data */
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=UrFU&project=lectures.www");

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  curl_global_cleanup();
  return ;
}

Ответ в формате JSON

{
  "args" {},
  "data" "",
  "files" {},
  "form" {
    "name" "UrFU",
    "project" "lectures.www"
  },
  "headers" {
    "Accept" "*/*",
    "Content-Length" "30",
    "Content-Type" "application/x-www-form-urlencoded",
    "Host" "httpbin.org"
  },
  "json" null,
  "url" "https://httpbin.org/post"
}

HTTP аутентификация с помощью CURL

Довольно полезная штука.

$url = «https://www.site.com/»; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, «krutovgerman2007@yandex.ru:mypassword»); // Если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // То сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

  • https://info-comp.ru/obucheniest/450-php-curl.html
  • https://losst.ru/kak-polzovatsya-curl
  • https://www.hostinger.ru/rukovodstva/chto-takoe-curl/
  • https://ITProffi.ru/komanda-curl-sintaksis-primery-ispolzovaniya/
  • https://intop24.ru/article_20.php

HTTPS is HTTP secure

There are a few ways to do secure HTTP transfers. By far the most common protocol for doing this is what is generally known as HTTPS, HTTP over SSL. SSL encrypts all the data that is sent and received over the network and thus makes it harder for attackers to spy on sensitive information.

SSL (or TLS as the latest version of the standard is called) offers a truckload of advanced features to allow all those encryptions and key infrastructure mechanisms encrypted HTTP requires.

Curl supports encrypted fetches when built to use a TLS library and it can be built to use one out of a fairly large set of libraries — will show which one your curl was built to use (if any!). To get a page from a HTTPS server, simply run curl like:

POST запросы cUrl в PHP

$array = array(
'login' => 'user',
'password' => '123'
);

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);

// Или предать массив строкой:
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:

$headers = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL,
'content' => 'login=user&password=123',
),
));

echo file_get_contents('https://asgeto.ru', false, $headers);

Some login tricks

While not strictly just HTTP related, it still causes a lot of people problems so here’s the executive run-down of how the vast majority of all login forms work and how to login to them using curl.

It can also be noted that to do this properly in an automated fashion, you will most certainly need to script things and do multiple curl invokes etc.

First, servers mostly use cookies to track the logged-in status of the client, so you will need to capture the cookies you receive in the responses. Then, many sites also set a special cookie on the login page (to make sure you got there through their login page) so you should make a habit of first getting the login-form page to capture the cookies set there.

Some web-based login systems feature various amounts of javascript, and sometimes they use such code to set or modify cookie contents. Possibly they do that to prevent programmed logins, like this manual describes how to… Anyway, if reading the code isn’t enough to let you repeat the behavior manually, capturing the HTTP requests done by your browsers and analyzing the sent cookies is usually a working method to work out how to shortcut the javascript need.

In the actual tag for the login, lots of sites fill-in random/session or otherwise secretly generated hidden tags and you may need to first capture the HTML code for the login form and extract all the hidden fields to be able to do a proper login POST. Remember that the contents need to be URL encoded when sent in a normal POST.

curl examples to simulate HTTP methods

curl can also be useful for testing HTTP methods. The following is a list of that can be used by running a curl command.

13. method

The method is used to retrieve resources from a particular URL. The simple command will use as the default HTTP method, however it can also be specified using or .

14. method

15. method

16. method

The method creates or replaces a resource based on the data the client submits to the web server. (e.g creating a new web page or updating an existing one). This can be specified using or .

17. Making curl requests with data

You can make requests using certain HTTP methods and also send along data via the or option. The example below uses a request which sends login data to a login page of a particular website.

Получение и отправка заголовков

По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:

> curl -i google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=utf-8
Date: Sun, 16 Sep 2018 08:28:18 GMT
Expires: Tue, 16 Oct 2018 08:28:18 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен запрос):

> curl -I http://www.example.com/
HTTP/1.1 200 OK
Date: Sun, 16 Sep 2018 08:20:52 GMT
Server: Apache/2.4.34 (Win64) mod_fcgid/2.3.9
X-Powered-By: PHP/7.1.10
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/
Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/
Set-Cookie: lastvisit=1537086053; path=/
Content-Length: 132217
Content-Type: text/html; charset=utf-8

Посмотреть, какие заголовки отправляет CURL при запросе, можно с помощью опции , которая выводит более подробную информацию:

> curl -v google.com
  • Строка, начинающаяся с означает заголовок, отправленный серверу
  • Строка, начинающаяся с означает заголовок, полученный от сервера
  • Строка, начинающаяся с означает дополнительные данные от CURL
* Rebuilt URL to: http://google.com/
*   Trying 173.194.32.206...
* TCP_NODELAY set
* Connected to google.com (173.194.32.206) port 80 (#0)
> GET / HTTP/1.1
> Host: google.com
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=utf-8
< Date: Mon, 17 Sep 2018 15:11:49 GMT
< Expires: Wed, 17 Oct 2018 15:11:49 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact

Если этой информации недостаточно, можно использовать опции или .

А вот так можно отправить свой заголовок:

> curl -H "User-Agent: Mozilla/5.0" http://www.example.com/

DESCRIPTION

curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.

curl offers a busload of useful tricks like proxy support, user authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer resume, Metalink, and more. As you will see below, the number of features will make your head spin!

curl is powered by libcurl for all transfer-related features. See libcurl(3) for details.

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

Загрузка файлов

Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

curl https://raw.githubusercontent.com/curl/curl/master/README.md

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

curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

Если загрузка была неожиданно прервана, вы можете ее возобновить:

curl -# -C — -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Если нужно, одной командой можно скачать несколько файлов:

curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен:

curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

curl —limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

Передача файлов

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

curl -T login.txt ftp://speedtest.tele2.net/upload/

Или проверим отправку файла по HTTP, для этого существует специальный сервис:

curl -T ~/login.txt http://posttestserver.com/post.php

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

curl -d «field1=val&fileld2=val1″http://posttestserver.com/post.php

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

curl -F «password=@pass;type=text/plain» http://posttestserver.com/post.php

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

curl -c cookie.txt http://posttestserver.com/post.php

Затем можно отправить cookie curl обратно:

curl -b cookie.txt http://posttestserver.com/post.php

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

curl -I https://losst.ru

А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

curl -I —хедер ‘If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT’ https://losst.ru

Аутентификация curl

Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

curl -u ftpuser:ftppass -T — ftp://ftp.testserver.com/myfile_1.txt

Точно так же будет выполняться аутентификация на серверах HTTP.

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

curl -x proxysever.test.com:3128 http://google.co.in

Получение информации о запросе cUrl

Чтобы получить исчерпывающую информацию о самом запросе используется функция curl_getinfo(). Главным образом эта информация полезна для отладки работы скрипта, в котором выполняются cURL запросы.

curl_exec($ch);
$info = curl_getinfo($ch);
echo 'Запрос для url ' . $info . ' занял ' . $info . ' секунд ';

Функция возвращает данные в виде массива со следующими ключами:

  • url
  • content_type
  • http_code
  • header_size
  • request_size
  • filetime
  • ssl_verify_result
  • redirect_count
  • total_time
  • namelookup_time
  • connect_time
  • pretransfer_time
  • size_upload
  • size_download
  • speed_download
  • speed_upload
  • download_content_length
  • upload_content_length
  • starttransfer_time
  • redirect_time

Cookie options

The simplest way to send a few cookies to the server when getting a page with curl is to add them on the command line like:

Cookies are sent as common HTTP headers. This is practical as it allows curl to record cookies simply by recording headers. Record cookies with curl by using the () option like:

(Take note that the option described below is a better way to store cookies.)

Curl has a full blown cookie parsing engine built-in that comes in use if you want to reconnect to a server and use cookies that were stored from a previous connection (or hand-crafted manually to fool the server into believing you had a previous connection). To use previously stored cookies, you run curl like:

Curl’s «cookie engine» gets enabled when you use the option. If you only want curl to understand received cookies, use with a file that doesn’t exist. Example, if you want to let curl understand cookies from a page and follow a location (and thus possibly send back cookies it received), you can invoke it like:

Curl has the ability to read and write cookie files that use the same file format that Netscape and Mozilla once used. It is a convenient way to share cookies between scripts or invokes. The () switch automatically detects if a given file is such a cookie file and parses it, and by using the () option you’ll make curl write a new cookie file at the end of an operation:

Сохранить вывод в файл

Чтобы сохранить вывод в файл, надо использовать опции или :

  • ( нижнего регистра) — результат будет сохранён в файле, заданном в командной строке;
  • ( верхнего регистра) — имя файла будет взято из URL и будет использовано для сохранения полученных данных.

Сохраняем страницу Google в файл :

> curl -L -o google.html google.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   219  100   219    0     0   2329      0 --:--:-- --:--:-- --:--:--  2329
100 14206    0 14206    0     0  69980      0 --:--:-- --:--:-- --:--:-- 69980

Сохраняем документ в файл :

> curl -O http://www.gnu.org/software/gettext/manual/gettext.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1375k  100 1375k    0     0   800k      0  0:00:01  0:00:01 --:--:--  800k
Добавить комментарий

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

Adblock
detector