Утилита командной строки curl
Содержание:
- Location header
- Получение и отправка заголовков
- Вирусы
- Certificates
- Cookies
- Опции Править
- Как пользоваться curl?
- Команда curl
- Результат запроса
- Отправка данных методом POST
- Что дает IPv6?
- Отправить GET-запрос из формы
- HTTPS is HTTP secure
- Множественный cURL
- Cookie options
- Часто используемые функции CURL и константы
- Пример работы с библиотекой
- Some login tricks
- Подготовка помещения
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 followheaders 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.
Получение и отправка заголовков
По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:
> 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/
Вирусы
Все описанные решения могут оказаться совершенно недейственными только по причине того, что в системе прочно обосновался какой-то зловредный вирус или вредоносный код, который своими действиями самопроизвольно меняет настройки. В случае когда сбои DNS не связаны ни с одной из вышеописанных причин и не наблюдаются ни со стороны провайдера, ни со стороны ресурса, ни со стороны пользователя, придется произвести полное углубленное сканирование системы.
Штатный антивирус не подойдет, поэтому лучше всего использовать утилиты вроде Kaspersky Rescue Disk, которые осуществляют проверку еще до старта ОС (их нужно записать на съемный носитель и загрузиться именно с него, установив соответствующий приоритет в настройках BIOS).
Certificates
In the HTTPS world, you use certificates to validate that you are the one
you claim to be, as an addition to normal passwords. Curl supports client-
side certificates. All certificates are locked with a pass phrase, which you
need to enter before the certificate can be used by curl. The pass phrase
can be specified on the command line or if not, entered interactively when
curl queries for it. Use a certificate with curl on a HTTPS server like:
curl also tries to verify that the server is who it claims to be, by
verifying the server’s certificate against a locally stored CA cert
bundle. Failing the verification will cause curl to deny the connection. You
must then use
() in case you want to tell curl to ignore that the server can’t be
verified.
More about server certificate verification and ca cert bundles can be read in
the SSLCERTS document.
At times you may end up with your own CA cert store and then you can tell
curl to use that to verify the server’s certificate:
Cookies
С помощью cookies веб-браузеры контролируют состояние на стороне
клиента. Cookie — это имя с присоединенным содержимым. Сервер при
помощи отправки cookies сообщает клиенту путь и имя хоста, по
которому в следующий раз должны быть отправлены cookies, сообщает
время жизни cookies и некоторые другие параметры.
Когда клиент соединяется с сервером по адресу, указанному в
принятом cookie, клиент посылает этот cookie к серверу (если время
жизни не истекло).
Многие приложения и сервера используют этот метод, чтобы
объединить нескольких запросов в одну логическую сессию. Чтобы curl
также мог выполнять такую функцию, мы должны уметь сохранять и
отправлять cookies, как и делают браузеры.
Простейший способ отправить cookie к серверу при получении
страницы с помощью curl, это добавить соответствующий ключ в
командной строке:
# curl -b "name=Daniel" www.cookiesite.com
Cookies отправляются как обычные HTTP-заголовки. Это позволяет curl
сохранять cookies, сохраняя заголовки. Сохранение cookies с помощью
curl выполняется командой:
# curl -D headers_and_cookies www.cookiesite.com
(кстати, для сохранения cookies лучше использовать ключ -c, об этом
ниже).
У curl имеется полнофункциональный обработчик cookies, который
полезен, когда вы хотите соединиться в очередной раз к серверу и
использовать cookies, сохраненные в прошлый раз (либо подработанные
вручную). Для использования cookies, сохраненных в файле, вызовите
curl так:
# curl -b stored_cookies_in_file www.cookiesite.com
«Cookie-движок» curl включается, когда вы указываете ключ
-b. Если вы хотите, чтобы curl лишь воспринимал cookies, используйте
-b с указанием файла, которого не существует. Например, если вы
хотите, чтобы curl принял cookies со страницы, а затем пошел по
перенаправлению (возможно, отдав принятый только что cookie), то
можно вызывать curl так:
# curl -b nada -L www.cookiesite.com
Curl умеет читать и писать cookie-файлы, имеющие формат Netscape и
Mozilla. Это удобный способ обмениваться cookies между браузерами и
автоматическими скриптами. Ключ -b автоматически определяет, является
ли данный файл cookie-файлом указанных браузеров и обрабатывает его
соответствующим образом, а используя ключ -c/—cookie-jar, вы можете
заставить curl записать новый cookie-файл по завершении операции:
# curl -b cookies.txt -c newcookies.txt www.cookiesite.com
Опции Править
Здесь перечислены только самые распространенные параметры, для получения полного списка см. статью curl_easy_setopt параметры.
CURLOPT_URL Править
Тип аргумента: char* строка с терминальным нулем
Определяет URL, с которым будет работать Libcurl. Это единственный параметр, который обязательно должен быть определен перед вызовом curl_easy_perform. Отправляемая в параметр строка должна быть закодирована, следуя.
CURLOPT_VERBOSE Править
Тип аргумента: long
Установите в параметр 1, чтобы позволить библиотеке подробно отображать информацию о ходе работы. Подробные сведения будут отправлены на STDERR, или в поток установленный параметром CURLOPT_STDERR.
Хотя этот параметр вряд ли пригодится в release версии вашего продукта, его можно эффективно использовать при отладке или составлении отчета об ошибке. Еще одна полезная опция для отладки — CURLOPT_DEBUGFUNCTION.
CURLOPT_WRITEFUNCTION Править
Тип аргумента: Указатель на функцию, которая должна соответствовать следующему прототипу: size_t function( void* ptr, size_t size, size_t nmemb, void* userdata);.
Эта функция вызывается в Libcurl, как только есть полученные данные, которые должны быть сохранены. Размер данных, на которую указывает аргумент ptr является size*nmemb. Получаемые данные не имеют терминальный ноль. Задаваемая функция должна возвращать количество обработанных байт. Если эта сумма будет отличаться от суммы, полученной на входе вашей функции, то будет отдан сигнал об ошибке в библиотеке. Это можно использовать для прервания передачи, с возвращемым значениемCURLE_WRITE_ERROR.
Функция может вернуть значение CURL_WRITEFUNC_PAUSE, которое приведет к приостановке записи в этом соединении. См. curl_easy_pause для более подробной информации.
Эта функция может быть вызвана с нулевым размером данных, если получаемые данные отсутствуют.
Установите этот параметр в NULL, чтобы определить встроенную функцию по умолчанию. Эта функция будет записывать данные в FILE* полученный из CURLOPT_WRITEDATA.
Установить значение в userdata можно параметром CURLOPT_WRITEDATA.
В функцию обратного вызова будет передаваться максимально возможное количество данных во всех вызовах, но это количество невозможно узнать заранее. Максимальный объем данных, который может быть передан в функцию записи, определен в заголовочном файле curl.h, как CURL_MAX_WRITE_SIZE.
CURLOPT_WRITEDATA Править
Тип аргумента: указатель void*, определяемый разработчиком, по умолчанию FILE*
Если вы используете параметр CURLOPT_WRITEFUNCTION, то этот указатель вы получите в качестве аргумента в callback функции. Встроенная функция в CURLOPT_WRITEFUNCTION будет записывать данные в поток FILE*, заданный этим параметром, или в stdout, если этот параметр не был установлен.
Если вы используете Libcurl в Win32 DLL, вы обязательно должны переопределить CURLOPT_WRITEFUNCTION, если вы используете этот параметр, иначе Libcurl будет некорректно работать.
Этот параметр также известен под старым названием CURLOPT_FILE.
Как пользоваться curl?
Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.
Загрузка файлов
Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:
Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:
А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:
Если загрузка была неожиданно прервана, вы можете ее возобновить:
Если нужно, одной командой можно скачать несколько файлов:
Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен:
Данная команда скачает файл, только если он был изменен после 21 декабря 2017.
Ограничение скорости
Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:
Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:
Передача файлов
Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:
Или проверим отправку файла по HTTP, для этого существует специальный сервис:
В ответе утилита сообщит где вы можете найти загруженный файл.
Отправка данных POST
Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:
Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:
Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.
Передача и прием куки
Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:
Затем можно отправить cookie curl обратно:
Передача и анализ заголовков
Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:
А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:
Аутентификация curl
Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:
Точно так же будет выполняться аутентификация на серверах HTTP.
Использование прокси
Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:
Команда curl
Команда curl чаще всего используется в Linux для загрузки силами одноименной утилиты различных файлов из сети Интернет. Эта утилита позволяет не только загружать, но и отправлять файлы на серверы, поддерживает огромное количество протоколов, в том числе, HTTP(S) и FTP(S), но, в отличие от популярной утилиты wget, не позволяет загружать данные в рекурсивном режиме.
Базовый синтаксис команды выглядит следующим образом:
Утилита поддерживает огромное количество параметров, но на практике используется лишь малая часть из них. По умолчанию утилита выводит данные загружаемого из сети файла посредством стандартного потока вывода. По этой причине в подавляющем большинстве случаев используется либо перенаправление потока вывода, либо параметр -o, позволяющий указать результирующий файл. Параметр -O позволяет записывать данные в файл с именем из URL. Для корректной обработки перенаправлений URL может использоваться параметр -L. Для продолжения загрузки файла может использоваться параметр -C -. Если же нужно ограничить скорость загрузки, может использоваться параметр —limit-rate. Еще одним полезным параметром является параметр -#, превращающий текстовые отчеты о процессе загрузки в псевдографический индикатор прогресса.
Загрузка файла
Для загрузки файла из Интернет нужно использовать один из способов указания имени результирующего файла.
Это пример перенаправления потока вывода:
Это пример указания имени результирующего файла:
А это — пример сохранения загруженных данных в файле с именем из URL:
Три приведенные выше команды аналогичны — в результате их исполнения загруженные данные будут сохранены в файле с именем alpine-standard-3.8.0-x86.iso.
Продолжение загрузки файла
Для того, чтобы продолжить загрузку файла с того места, на котором была прервана предыдущая операция загрузки, достаточно использовать параметр -C -:
Дефис после параметра -C позволяет автоматически определить размер загруженной части файла. Вместо него может быть указан байтовый сдвиг, после которого следует начать загрузку.
Загрузка файла с ограничением скорости
Для ограничения скорости загрузки файла достаточно использовать параметр —limit-rate и указать максимальную скорость загрузки:
В результате файл будет загружаться с максимальной скоростью в 1024 байта в секунду.
Загрузка нескольких файлов
Для загрузки нескольких файлов следует указать несколько строк URL:
В результате будут загружены файлы, доступные по обоим URL.
Просмотр текстового документа в терминале
Для того, чтобы просмотреть текстовый документ с уделенного ресурса в терминале, достаточно воспользоваться утилитой curl совместно с утилитой more.
Результат запроса
Ну а после того, как 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) «» |
Отправка данных методом POST
Команда ниже отправляет POST запрос на сервер аналогично тому, как пользователь, заполнив HTML форму, нажал бы кнопку «Отправить». Данные будут отправлены в формате .
> curl -d "key1=value1&key2=value2" http://www.example.com
> curl --data "key1=value1&key2=value2" http://www.example.com
Параметр аналогичен , для отправки двоичных данных необходимо использовать параметр . Для URL-кодирования полей формы нужно использовать .
> curl --data-urlencode "name=Василий" --data-urlencode "surname=Пупкин" http://www.example.com
Если значение опции начинается с , то после него должно быть имя файла с данными (или дефис — тогда будут использованы данные из стандартного ввода). Пример получения данных из файла для отправки POST-запроса:
> curl --data @data.txt http://www.example.com
Содержимое файла :
key1=value1&key2=value2
Массив , который будет содержать данные этого запроса:
Array ( => value1 => value2 )
Пример URL-кодирования данных из файла перед отправкой POST-запроса:
> curl --data-urlencode name@username.txt http://www.example.com
Содержимое файла :
Иванов Иван Иванович
Массив , который будет содержать данные этого запроса:
Array ( = Иванов Иван Иванович )
Что дает IPv6?
Документы, определяющие новый интернет-протокол организация Internet Engineering Task Force выпустила еще в середине 90-х, а официальный запуск работы протокола IPv6 на постоянной основе состоялся 6 июня 2012 года. Многие компании начали переходить на него и раньше, например Google — с 2008 г.
Номер «6» протокол получил потому, что имя IPv5 зарезервировали за экспериментальным протоколом реального времени, который так и не вышел «в серию». Но и не пропал совсем — многие заложенные в нем концепции можно найти в протоколе MLPS.
Благодаря 128-битной схеме адресации, заложенной в IPv6, количество доступных в нем сетевых адресов составляет 2 в 128 степени. Столь обширное адресное пространство делает ненужным применение NAT (адресов хватит всем) и упрощает маршрутизацию данных. Например, маршрутизаторы больше не должны фрагментировать пакеты, появилась возможность пересылки больших пакетов, размером до 4 Гбайт. Из IP-заголовка исключена контрольная сумма и т. д., поэтому несмотря на больший по сравнению с IPv4 размер адреса IPv6 (16 байтов вместо 4), заголовок пакета удлинился всего лишь вдвое: с 20 до 40 байт.
Отправить GET-запрос из формы
Форма запроса может использовать метод GET. Например, так:
<form method="GET" action="foo.cgi"> <input type=text name="year"> <input type=submit name=press value="OK"> </form>
Если вы откроете этот код в браузере, то увидите форму с текстовым полем и кнопкой с надписью «OK». Если вы, например, введете в форму ‘1990’ и нажмете «OK», то браузер создаст новый URL, по которому и проследует. Этот URL будет являться строкой, состоящей из предыдущего URL и строки запроса, вроде следующей: . Так, если форма располагалась по адресу (адрес взят «с потолка»!), то при нажатии на кнопку «OK» вы попадете на URL .
Для формирования GET-запроса, введите то, что ожидалось от формы:
$ curl "www.foo.com/foo.cgi?year=1990&press=OK"
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:
Множественный cURL
Одной из самых сильных сторон cURL является возможность создания «множественных» cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.
В классическом варианте cURL запроса выполнение скрипта приостанавливается, и происходит ожидание завершения операции URL запроса, после чего работа скрипта может продолжиться. Если вы намереваетесь взаимодействовать с целым множеством URL, это приведёт к довольно-таки значительным затратам времени, поскольку в классическом варианте вы можете работать только с одним URL за один раз. Однако, мы можем исправить данную ситуацию, воспользовавшись специальными обработчиками.
Давайте рассмотрим пример кода, который я взял с php.net:
// создаём несколько cURL ресурсов $ch1 = curl_init(); $ch2 = curl_init(); // указываем URL и другие параметры curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //создаём множественный cURL обработчик $mh = curl_multi_init(); //добавляем несколько обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //выполнение do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } //закрытие curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.
В этом примере есть два основных цикла. Первый цикл do-while вызывает функцию curl_multi_exec(). Эта функция не блокируемая. Она выполняется с той скоростью, с которой может, и возвращает состояние запроса. Пока возвращенное значение является константой ‘CURLM_CALL_MULTI_PERFORM’, это означает, что работа ещё не завершена (например, в данный момент происходит отправка http заголовков в URL); Именно поэтому мы продолжаем проверять это возвращаемое значение, пока не получим другой результат.
В следующем цикле мы проверяем условие, пока переменная $active = ‘true’. Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно ‘true’, до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение ‘блокируется’, пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.
А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей.
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:
Часто используемые функции CURL и константы
- curl_init — Инициализирует сеанс;
- curl_close — Завершает сеанс;
- curl_exec — Выполняет запрос;
- curl_errno — Возвращает код ошибки;
- curl_setopt — Устанавливает параметр для сеанса, например:
- CURLOPT_HEADER – значение 1 означает, что необходимо вернуть заголовки;
- CURLOPT_INFILESIZE — параметр для указания ожидаемого размера файла;
- CURLOPT_VERBOSE — значение 1 означает что CURL будет выводить подробные сообщения о всех производимых операциях;
- CURLOPT_NOPROGRESS – отключение индикатора прогресса операции, значение 1;
- CURLOPT_NOBODY – если Вам не нужен документ, а нужны только заголовки, то поставьте значение 1;
- CURLOPT_UPLOAD — для закачки файла на сервер;
- CURLOPT_POST – выполнить запрос методом POST;
- CURLOPT_FTPLISTONLY — получение списка файлов в директории FTP сервера, значение 1;
- CURLOPT_PUT — выполнить запрос методом PUT, значение 1;
- CURLOPT_RETURNTRANSFER — возвратить результат, не выводя в браузер, значение 1;
- CURLOPT_TIMEOUT – максимальное время выполнения в секундах;
- CURLOPT_URL – указание адреса для обращения;
- CURLOPT_USERPWD — строка с именем пользователя и паролем в виде :;
- CURLOPT_POSTFIELDS – данные для POST запроса;
- CURLOPT_REFERER — задает значение HTTP заголовка «Referer: »;
- CURLOPT_USERAGENT — задает значение HTTP заголовка «User-Agent: »;
- CURLOPT_COOKIE — содержимое заголовка «Cookie: », который будет отправлен с HTTP запросом;
- CURLOPT_SSLCERT- имя файла с сертификатом в формате PEM;
- CURLOPT_SSL_VERIFYPEER – значение 0, для того чтобы запретить проверку сертификата удаленного сервера (по умолчанию 1);
- CURLOPT_SSLCERTPASSWD — пароль к файлу сертификата.
- curl_getinfo — Возвращает информацию об операции, вторым параметром может выступать константа для указания, что именно нужно показать, например:
- CURLINFO_EFFECTIVE_URL — последний использованный URL;
- CURLINFO_HTTP_CODE — последний полученный код HTTP;
- CURLINFO_FILETIME — дата модификации загруженного документа;
- CURLINFO_TOTAL_TIME — время выполнения операции в секундах;
- CURLINFO_NAMELOOKUP_TIME — время разрешения имени сервера в секундах;
- CURLINFO_CONNECT_TIME — время, затраченное на установку соединения, в секундах;
- CURLINFO_PRETRANSFER_TIME — время, прошедшее от начала операции до готовности к фактической передаче данных, в секундах;
- CURLINFO_STARTTRANSFER_TIME — время, прошедшее от начала операции до момента передачи первого байта данных, в секундах;
- CURLINFO_REDIRECT_TIME — время, затраченное на перенаправление, в секундах;
- CURLINFO_SIZE_UPLOAD — количество байт при закачке;
- CURLINFO_SIZE_DOWNLOAD — количество байт при загрузке;
- CURLINFO_SPEED_DOWNLOAD — средняя скорость закачки;
- CURLINFO_SPEED_UPLOAD — средняя скорость загрузки;
- CURLINFO_HEADER_SIZE — суммарный размер всех полученных заголовков;
- CURLINFO_REQUEST_SIZE — суммарный размер всех отправленных запросов;
- CURLINFO_SSL_VERIFYRESULT — результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER;
- CURLINFO_CONTENT_LENGTH_DOWNLOAD — размер загруженного документа, прочитанный из заголовка Content-Length;
- CURLINFO_CONTENT_LENGTH_UPLOAD — размер закачиваемых данных;
- CURLINFO_CONTENT_TYPE — содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен.
Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP — php.net
На этом все, для начинающих я думаю достаточно Удачи!
Пример работы с библиотекой
Я считаю, что после того, как некоторые общие моменты уже ясны и вроде бы все понятно, то самое время переходить к практике и на примере уже оттачивать свое мастерство. Лично у меня всегда сразу руки чешутся все попробовать на практике 🙂
Раз уж cURL так хорош для парсеров, то рассмотрим функцию получения кода страницы по ее адресу. При этом на выходе получим массив с заголовком, содержимым страницы и даже коды ошибок, если что-то пойдет не так.
Входные параметры:url — адрес страницы или сайта.
Значения выходных параметров (массив с тремя элементами):header — если что-то пошло не так, то тут будет код ошибки.header — здесь при этом будет текст ошибки.header — собственно сама страница\файл\картинка и т.д.
Используем функцию, например, так:
$result = get_web_page( "https://ya.ru" ); if (($result != 0 )||($result != 200)) { echo $result; } else { $page = $result; echo $page; }
Все должно пройти без ошибок и вы получите код страницы в переменной $page. Если же попробовать получить несуществующую страницу , то получим ошибку:
Could not resolve host: yaaaaaaaaaaaa.ru; Host not found
Все обрабатывается корректно и красиво 🙂
Дальше с кодом страницы можно делать все что угодно, например, парсить регулярками. Но это все в следующих уроках, а пока что остановимся на этом.
← PHP — str_replace | | Парсер статистики Liveinternet →
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.
Подготовка помещения
Пожалуй, никто не возьмёт на себя смелость утверждать, что новая мебель хорошо смотрится со старыми обоями. Поэтому, перед тем как спроектировать кухню, необходимо определить, какой ремонт будет произведён, какие материалы при этом будут использованы и какие изменения внесены.
Предполагаемый ремонт можно условно разделить на несколько позиций:
- пол;
- потолок;
- стены (в т. ч. фартук);
- проводка;
- вентиляция и канализация.
Покрытие из плитки и керамогранита холодное и жёсткое, посуда, упавшая на такой пол, разобьётся сразу. Линолеум дешевле, теплее, мягче, однако он не отличается особой долговечностью, к тому же выцветает под действием солнечных лучей. Материалы, используемые при отделке потолка, ничем не отличаются от материалов, применяемых в других комнатах. Используют гипсокартон, краску, натяжные полотна, некоторые до сих пор белят по старинке.
Стены на кухне пачкаются гораздо чаще, чем в других комнатах, ведь брызги жира во время приготовления, всевозможные капли и подтёки постоянно появляются на их поверхности. Поэтому многие отдают предпочтение влагостойким материалам, которые легко очищаются: моющимся обоям, пластиковым панелям, керамической плитке. Между верхними и нижними рядами шкафов гарнитура, в местах максимального загрязнения, обычно прокладывают фартук. Его можно сделать из стекла, из керамической плитки или даже составить из мозаики.
Чтобы оценить, какой из проектов будет смотреться выигрышнее всего, можно создать несколько вариантов оформления помещения в картинках или объёмных 3D моделях. Сразу же на рисунке необходимо отметить места расположения розеток, канализационных труб и вытяжки.