Утилита командной строки curl. Инструменты командной строки для веб-разработчика
21 ответ
Возможно, у вас уже есть завиток
Возможно, вам не нужно ничего скачивать:
- Если вы используете Windows 10 версии 1803 или выше, ваша ОС поставляется с копией curl , уже настроенной и готовой к использованию.
- Если вы хотите сделать curl своей собственной папкой, подойдут C:\Program Files\curl\ или C:\curl\ .
- Если у вас много свободных исполняемых файлов и вы не хотите добавлять много отдельных папок в PATH , используйте для этой цели одну папку, например C:\Program Files\tools\ или C:\tools\ .
- Щелкните меню "Пуск" Windows 10. Начните вводить "окружение".
- Вы увидите результат поиска. Отредактируйте системные переменные среды . Выбери это.
- Откроется окно "Свойства системы". Нажмите кнопку Переменные среды внизу.
- Выберите переменную "Путь" в разделе "Системные переменные" (нижнее поле). Нажмите кнопку Изменить .
- Нажмите кнопку " Добавить" и вставьте путь к папке, в которой находится curl.exe .
- Нажмите OK, если необходимо. Закройте открытые окна консоли и снова откройте, чтобы они получили новый PATH .
Если у вас есть более эзотерические потребности (например, вам нужны сборки cygwin, сторонние сборки, libcurl, файлы заголовков, исходные коды и т.д.), Используйте мастер загрузки curl. После ответа на пять вопросов вам будет представлен список ссылок для скачивания.
Извлечение и настройка скручивания
Найдите curl.exe в вашем загруженном пакете; это наверное под bin\ .
Выберите место на жестком диске, которое будет служить постоянным домом для завитков:
Поместите curl.exe в папку. И никогда не перемещайте папку или ее содержимое.
Затем вы захотите сделать curl доступным в любом месте командной строки. Для этого добавьте папку в PATH , вот так:
Теперь наслаждайтесь вводом curl в любой командной строке. Время веселиться!
Чтобы запустить завиток из командной строки
a) Щелкните правой кнопкой мыши значок "Мой компьютер"
b) Выберите "Свойства"
d) Перейдите на вкладку [Дополнительно] - кнопка "Переменные среды"
e) В разделе "Системная переменная" выберите "Путь" и "Изменить"
f) Добавьте точку с запятой, а затем путь туда, куда вы поместили свой curl.exe(например, D:\software\curl)
Теперь вы можете запустить из командной строки, набрав:
Curl www.google.com
Начиная с Windows 10 версии 1803 (и более ранних, с инсайдерской сборкой 17063), вы больше не устанавливаете curl . Windows содержит собственный curl.exe (и tar.exe) в C:\Windows\System32\ , к которому вы можете обращаться прямо из обычного CMD .
C:\Users\vonc>C:\Windows\System32\curl.exe --version curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Release-Date: Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL C:\Users\vonc>C:\Windows\System32\tar.exe --version bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.5.f-ipp
Вероятно, стоит отметить, что Powershell v3 и более поздних версий содержит командлет Invoke-WebRequest, который имеет некоторые возможности скручивания. Вероятно, стоит упомянуть и командлеты New-WebServiceProxy и Invoke-RestMethod .
Я не уверен, что они подойдут вам или нет, но, хотя я и не Windows, я должен сказать, что нахожу объектный подход, который использует PS, гораздо проще работать с такими утилитами, как curl, wget и т.д. Они могут стоить взглянуть на
Вы можете создать последнюю версию curl, openssl, libssh2 и zlib в 3 простых шаги, следуя этот учебник.
Curl построен статически, поэтому вам не нужно распространять необходимое динамическое время выполнения.
Вы также можете скачать предварительно созданную версию (x86 и x64) из
Думал, что напишу именно то, что сделал (Windows 10, 64-битная версия):
Выберите исполняемый файл curl.
Выберите Win64.
Выберите универсальный.
Выбирай любой.
curl версия: 7.53.1 - SSL включен SSH включен. Предоставлено: Виктор Шакац. Этот пакет является исполняемым типом curl. По этой ссылке вы получите предварительно скомпилированный двоичный файл curl (или, в некоторых случаях, используя информацию, предоставленную на странице, по которой вас ведет эта ссылка). Вы можете или не можете установить libcurl как общую библиотеку /DLL. Файл упакован с использованием 7zip. 7zip - это формат архивирования файлов.
Нажмите скачать.
У вас должен быть файл curl-7.53.1-win64-mingw.7z в вашей папке загрузок.
Установите 7-Zip, если у вас его нет.
Щелкните правой кнопкой мыши, 7-Zip, Извлечь здесь. Скопируйте и вставьте извлеченный файл куда-нибудь вроде Z:\Tools\
Если вы посмотрите в папку bin, вы увидите curl.exe. Если вы дважды щелкните по нему, окно быстро вспыхнет и исчезнет. Чтобы запустить его, вам нужно использовать командную строку. Перейдите в папку bin и введите curl, а затем свои параметры, чтобы сделать запрос. Вы должны использовать двойные кавычки . Одинарные кавычки не будут работать с curl в Windows.
Теперь вам нужно добавить curl в пользовательскую переменную Path, чтобы вам не пришлось переходить в нужную папку для запуска программы. Перейдите в раздел "Этот ПК", "Компьютер", "Свойства системы", "Дополнительные параметры системы", войдите в систему как администратор (вы не являетесь администратором, верно? Верно?). Переменные среды, системные переменные, посмотрите список и выберите "Путь", затем "Редактировать", затем Новый, то, например,
Z:\Tools\завиток-7.53.1-win64-MinGW\Bin
Вы можете добавить обратную косую черту, если хотите, я не думаю, что это имеет значение. Нажмите кнопку перемещения вверх до тех пор, пока она не окажется вверху списка, и вы сможете легко увидеть ее с предыдущего экрана. Нажмите OK, OK, OK, затем откройте командную строку, и вы можете запустить curl, набрав curl из любой папки, как любой пользователь. Не забывайте свои двойные кавычки.
Это ответ, который я хотел бы получить.
Я искал процесс загрузки Curl и каждый, где они сказали, копирует файл curl.exe в System32 , но они не предоставили прямую ссылку. так что здесь можно наслаждаться curl.exe легко в папке bin просто
разархивируйте его, а затем перейдите в папку bin там, где вы получите exe файл
Этот установщик облегчил мне http://www.confusedbycode.com/curl/
"Вы можете установить cURL для Windows всего за несколько кликов. Просто загрузите и запустите программу установки из приведенной ниже таблицы и нажмите" Установить ". Установка по умолчанию включает в себя.
cURL — инструмент командной строки для получения или отправки данных с использованием синтаксиса URL.
Если вы работаете в службе поддержки, то должны уметь использовать команды cURL для устранения неполадок веб-приложений. cURL
— кроссплатформенная утилита для Windows, MAC и UNIX.
Ниже приведены некоторые часто используемые примеры синтаксиса.
1. Проверка возможности подключения к URL-адресу
Если вы работаете в UNIX-системе и пытаетесь подключиться к внешнему URL-адресу, то сначала проверьте наличие доступа к ресурсу через curl . Для этого используйте следующую команду:
# curl yoururl.com
2. Сохранение вывод URL / URI в файл
# curl yoururl.com > yoururl.html
Например:
# curl 74.125.68.100 >/tmp/google.html
Приведенный выше пример сохранит все содержимое с хоста 74.125.68.100 в файл /tmp/google.html .
3. Показать заголовок запроса и ответа
Если хотите удостовериться, что получаете ожидаемый заголовок запроса и ответа, используйте следующую команду:
# curl -v yoururl.com
например:
# curl -v 74.125.68.100
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
>< HTTP/1.1 200 OK
Если нужно узнать, сколько времени требуется для загрузки с определенной скоростью, то используйте следующую команду: # curl –-limit-rate 2000B например: # curl –-limit-rate 2000B 74.125.68.100 Если необходимо проверить, можно ли использовать прокси-сервер, примените следующий синтаксис: # curl --proxyyourproxy:port http://yoururl.com Для устранения конкретной проблемы можно использовать Curl
, чтобы вставить в header
свои данные. Рассмотрим следующий пример запроса с Content-Type: # curl --header "Content-Type: application/json" http://yoururl.com Мы просим curl
передать Content-Type в качестве application / json
в заголовок запроса. Вы можете добавить заголовок к запросу с помощью синтаксиса — header
. # curl –-header “X-CustomHeader: GeekFlare” http://yoururl.com например: # curl -v --header "X-CustomHeader: GeekFlare" 74.125.68
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
> X-CustomHeader: GeekFlare
>< HTTP/1.1 200 OK
Если вы хотите быстро проверить заголовок ответа, то для этого можно использовать следующий синтаксис. # curl --head http://yoururl.com # curl -I 74.125.68.100
HTTP/1.1 200 OK
Date: Sun, 18 Jan 2015 08:31:22 GMT
Expires: -1
Cache-Control:
private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: NID=67=SpnXKTDUhw7QGakIeLxmDSF;
expires=Mon, 20-Jul-2015 08:31:22 GMT; path=/; domain=.; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for moreinfo."
Server: gws X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic,p=0.02
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding
# Если необходимо получить доступ к https URL-адресу, который выдает ошибку сертификата из-за несоответствия имени хоста, можно использовать следующий синтаксис. curl --insecure https://yoururl.com Чтобы подключиться к URL- адресу только по протоколу SSL V2 / V3
или TLS
,используйте следующий синтаксис. Для подключения с использованием SSLV2: # curl --sslv2 https://yoururl.com Для подключения с использованием SSLV3: # curl --sslv3 https://yoururl.com Для подключения через TLS: # curl --tlsv1 https://yoururl.com С помощью cURL
можно загрузить файл с ftp-сервера
, указав имя пользователя и пароль. # curl -u user:password -O ftp://ftpurl/style.css Всегда можно использовать «-v» с любым синтаксисом для вывода в подробном режиме. Да, это возможно. Вы можете выполнить cURL
удаленно с помощью следующих инструментов. Connect-timeout
--cookie
--data
--header
--head
--location
--max-time
--proxy
--request
--user
--url
--user-agent Пример вывода: В этой статье речь пойдет о таком мощном инструменте как cURL, а также о библиотеке для php, которая предоставляет доступ к этому инструменту — libcurl. Для чего все это нужно? Для связи с сервером по протоколам передачи данных, например, http или ftp. Остальные протоколы нам не особо интересны, если кто-то хочет углубляться в эту тему, то придется уже копать англоязычные ресурсы, а в этой статье будут основы и примеры использования. Итак, библиотека libcurl предоставляет нам возможность передачи данных на сервер, и получения ответов от него. Что нам это дает? Возможность эмуляции поведения пользователя или ! Вы можете получать содержимое страниц для последующего парсинга, можете получать заголовки ответов сервиса и программно авторизироваться на сайтах, делать скрипты постинга сообщений (например, в твиттер или на форумах) или информации. Все ограничивается лишь вашей фантазией! Первое, что мы должны сделать, это установить библиотеку. На локальном компьютере я пользуюсь сборкой Denwer, как и подавляющее большинство начинающих вебмастеров, на которых и рассчитана статья. Опытные пользователи, которые самостоятельно устанавливают связку php+apache+mysql смогут установить и cURL, не мне объяснять им как это делается;) А мы, новички, пользуемся готовыми решениями, чтобы было проще. Поэтому, устанавливаем libcurl следующим образом: и убираем точку с запятой в начале сроки:
;extension=php_curl.dll Готово. Чтобы проверить работоспособность библиотеки можете вызвать функцию phpinfo() и найти там строчку: cURL support enabled. Поздравляю с первой победой. Для началом работы с инструментом, его нужно инициализировать. Делается это следующим образом:
$ch = curl_init();
Мы использовали функцию инициализации сессии cURL. При этом, можно задать URL сразу, вот так:
$ch = curl_init("https://сайт");
А можно сделать это потом, в опциях. Порядок установки опций не имеет значения. Делается это другой функцией: Curl_setopt (resource ch, string option, mixed value)
Первый параметр этой функции, то есть resource ch мы уже создали чуть выше, а вот параметров option и value очень много. Я думаю, что не стоит копипастить сюда их все, а достаточно лишь дать ссылку на подробное описание функции, надеюсь никто не обидится: curl_setopt . Приведу пример установки опций как раз на примере URL:
$url = "https://сайт";
curl_setopt($ch, CURLOPT_URL,$url);
Еще парочка примеров задания опций: давайте получим заголовок ответа сервера, при этом не будем получать саму страницу: Curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
Итак, мы инициализировали сессию, задали нужные нам параметры, теперь выполняем получившийся запрос, закрываем сессию и выводим результат:
$result = curl_exec($ch);
curl_close($ch);
echo $result;
В итоге получаем наш первый полностью рабочий пример использования библиотеки libcurl:
$ch = curl_init();
$url = "https://сайт";
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
$result = curl_exec($ch);
curl_close($ch);
echo $result;
Как оно работает, надеюсь, понятно, ведь мы рассмотрели каждый шаг по отдельности:) В результате мы получаем заголовок HTTP ответа от сервера, который чуть ниже обязательно разберем, чтобы лучше понимать все этапы взаимодействия браузера и сервера: HTTP/1.1 200 OK
Server: nginx/1.2..php 1
Великолепно! Мы получили заголовок ответа от сервера и опробовали библиотеку в действии. Чем это нам полезно? Тем, что теперь вы примерно представляете себе последовательность действий при работе с cURL: Для примера я обратился к странице ya.ru и в просмотрел сформированный запрос браузера и полученный от сервера ответ. Вот и они: Я считаю, что после того, как некоторые общие моменты уже ясны и вроде бы все понятно, то самое время переходить к практике и на примере уже оттачивать свое мастерство. Лично у меня всегда сразу руки чешутся все попробовать на практике:) Раз уж cURL так хорош для парсеров, то рассмотрим функцию получения кода страницы по ее адресу. При этом на выходе получим массив с заголовком, содержимым страницы и даже коды ошибок, если что-то пойдет не так. Function get_web_page($url)
{
$uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает веб-страницу
curl_setopt($ch, CURLOPT_HEADER, 0); // не возвращает заголовки
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходит по редиректам
curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки
curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // таймаут ответа
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header["errno"] = $err;
$header["errmsg"] = $errmsg;
$header["content"] = $content;
return $header;
}
Входные параметры: Используем функцию, например, так:
$result = get_web_page("https://ya.ru");
if (($result["errno"] != 0)||($result["http_code"] != 200))
{
echo $result["errmsg"];
}
else
{
$page = $result["content"];
echo $page;
}
Все должно пройти без ошибок и вы получите код страницы в переменной $page
. Если же попробовать получить несуществующую страницу yaaaaaaaaaaaa.ru, то получим ошибку: Could not resolve host: yaaaaaaaaaaaa.ru; Host not found
Все обрабатывается корректно и красиво:) Эта статья предполагает, что вам известны основы построения сетей и язык HTML. Возможность написания скриптов является существенной при построении хорошей компьютерной системы. Расширяемость возможностей Unix-систем при помощи shell-скриптов и различных программ, выполняющих автоматизированные команды - вот одна из причин того, почему они имеют такой успех. Увеличивающееся число приложений, которые переходят на веб, привело к тому, что тема HTTP-скриптов становится все более востребованной. Важными задачами в этой области являются автоматическое извлечение информации из интернета, отсылание или загрузка данных на web-сервера и т.п. Curl - инструмент командной строки, который позволяет проделывать URL-манипуляции и передачи различного рода. Эта статья сфокусирована на создании простых HTTP-запросов. Предполагается, что вы уже знаете где набирать # curl --help
# curl --manual
для получения информации о curl. Curl не является инструментом, который будет делать все за вас. Он создает запросы, принимает данные и отсылает данные. Возможно, вам потребуется какой-то "клей" для объединения всего, возможно какой-то скриптовый язык (например bash) или несколько ручных вызовов. 1. Протокол HTTP
HTTP - это протокол, используемый при приеме данных от web-серверов. Это очень простой протокол, который построен на TCP/IP. Протокол также позволяет отправлять информацию на сервер от клиента, используя несколько методов, как будет показано далее. HTTP - это строки ASCII-текста, отсылаемые от клиента к серверу для запроса какого-либо действия. При получении запроса сервер отвечает клиенту несколькими служебными текстовыми строками, а затем и собственно контентом. Используя ключ curl -v, вы можете увидеть, какие команды curl отсылает серверу, а также другой информационный текст. Ключ -v - пожалуй, единственная возможность отладить или даже понять особенности взаимодействия curl и веб-сервера. 2. URL
Формат URL (Uniform Resource Locator - универсальный адрес ресурса) задает адрес определенного ресурса в Интернете. Вам это наверняка известно, примеры URL: http://curl.haxx.se или https://yourbank.com. 3. Получить (GET) страницу
Простейший и самый обычный HTTP-запрос - получить содержимое URL. URL может ссылаться на web-страницу, картинку или файл. Клиент отсылает GET-запрос на сервер и получает запрашиваемый документ. Если выполнить команду # curl http://curl.haxx.se
вы получите web-страницу, выведенную в ваше терминальное окно. Полный HTML-документ, который содержится по этому адресу URL. Все HTTP-ответы содержат набор заголовков, которые обычно скрыты. Чтобы их увидеть вместе с самим документом, используйте ключ curl -i. Вы можете также запросить только заголовки при помощи ключа -I (который заставит curl сделать HEAD-запрос). 4. Формы
Формы - основной способ представления web-сайта как HTML-страницы с полями, в которые пользователь вводит данные, и затем нажимает на кнопку "OK" или "Отправить", после чего данные отсылаются на сервер. Затем сервер использует принятые данные и решает, как действовать дальше: искать информацию в базе данных, показать введенный адрес на карте, добавить сообщение об ошибке или использовать информацию для аутентификации пользователя. Разумеется, на стороне сервера имеется какая-то программа, которая принимает ваши данные. 4.1 GET
GET-форма использует метод GET, например следующим образом:
Если вы откроете этот код в вашем браузере, вы увидите форму с текстовым полем и кнопку с надписью "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-запрос, похожа на предыдущую:4. Загрузить с предельной скоростью
5. Использование прокси для подключения
6. Проверка URL-адресас введением заголовка
7. Добавить дополнительный заголовок
8. Открыть только заголовок ответа
9. Подключить HTTPS / SSLURL-адрес и игнорировать любые ошибки SSL -сертификата
10. Подключиться с использованием определенного протокола (SSL / TLS)
11. Загрузить файл с FTP-сервера
Использования cURL онлайн
Online CURL
— компактный инструмент для извлечения URL-адреса онлайн и добавления следующих параметров.
cURL command line builder
–позволяет создать команду cURL, с помощью которой можно ввести информацию в пользовательский интерфейс.
Что вообще такое cURL и libcurl? Общие моменты
Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?
Описание cURL и первые шаги
Структура заголовка HTTP запроса
Запрос
GET / HTTP/1.1
— Пытаемся получить страницу по адресу /, то есть главную, находящуюся в корне папки. Используем протокол версии 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14
— Представляемся серверу, мы — браузер Опера.
Host: ya.ru
— Доменное имя запрашиваемого ресурса.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
— Список допустимых форматов ресурса.
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
— Список поддерживаемых языков.
Accept-Encoding: gzip, deflate
— Поддерживаемые способы кодирования.
Cookie: yandexuid=ХХХХХ
— Куки, при необходимости.
Connection: Keep-Alive
— Просим не разрывать соединение и оставаться на связи.
Ответ
HTTP/1.1 200 Ok
— Получаем ответ с кодом 200, значит все ОК.
Server: nginx
— Сервер представился — это nginx.
Date: Sun, 10 Mar 2013 14:10:50 GMT
— Текущие дата и время на сервере.
Content-Type: text/html; charset=UTF-8
— Тип контента и кодировка.
Connection: close
— Сервер не хочет поддерживать с нами постоянного соединения, поэтому сразу же его закрывает. Для следующего запроса будет установлено новое соединение.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
— Управление кэшированием. В данном случае оно отключено.
Expires: Sun, 10 Mar 2013 14:10:50 GMT
— Дата предполагаемого истечения срока действия сессии. В нашем случае оно совпадает с временем открытия, так как сервер тут же его закрыл, сразу после обработки.
Last-Modified: Sun, 10 Mar 2013 14:10:50 GMT
— Время последней модификации.
Content-Encoding: gzip
— Способ кодирования информации.
Полный список всех параметров, которые можно встретить в заголовке HTTP запроса можно посмотреть на википедии .
Теперь вы примерно представляете как общаются между собой ваш браузер и web-сервер. Это очень полезно знать и понимать, ведь мы будем пытаться эмулировать действия браузера с помощью библиотеки libcurl. Идем дальше.Пример работы с библиотекой
url
— адрес страницы или сайта.
Значения выходных параметров (массив с тремя элементами):
header[‘errno’]
— если что-то пошло не так, то тут будет код ошибки.
header[‘errmsg’]
— здесь при этом будет текст ошибки.
header[‘content’]
— собственно сама страница\файл\картинка и т.д.
Дальше с кодом страницы можно делать все что угодно, например, парсить регулярками. Но это все в следующих уроках, а пока что остановимся на этом.
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 и т.п. Недостаток внимания к этому вопросу - частая ошибка, из-за чего данные передаются не так, как надо.
В далеком 1995 был определен дополнительный способ передавать данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ иногда называют RFC1867-posting.
Этот метод в основном разработан для лучшей поддержки загрузки файлов. Форма, которая позволяет пользователю загрузить файл, выглядит на HTML примерно следующим образом:
Заметьте, что тип содержимого Content-Type установлен в multipart/form-data.
Чтобы отослать данные в такую форму с помощью curl, введите команду:
# curl -F upload=@localfilename -F press=OK
4.4 Скрытые поля
Обычный способ для передачи информации о состоянии в HTML-приложениях - использование скрытых полей в формах. Скрытые поля не заполняются, они невидимы для пользователя и передаются так же, как и обычные поля.
Простой пример формы с одним видимым полем, одним скрытым и кнопкой ОК:
Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о том, скрытое поле или нет. Для curl они все одинаковы:
# curl -d "birthyear=1905&press=OK&person=daniel"
4.5 Узнать, как выглядит POST-запрос
Когда вы хотите заполнить форму и отослать данные на сервер с помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно также, как и выполненный с помощью браузера.
Простой способ увидеть свой POST-запрос, это сохранить HTML-страницу с формой на диск, изменить метод на GET, и нажать кнопку "Отправить" (вы можете также изменить URL, которому будет передаваться данные).
Вы увидите, что данные присоединились к URL, отделенные символами "?", как и предполагается при использовании GET-форм.
5. PUT
Пожалуй, лучший способ загружать данные на HTTP-сервер, это использовать PUT. Опять же, это требует программы (скрипта) на серверной части, которая знает, что делать и как принимать поток HTTP PUT.
Отослать файл на сервер при помощи curl:
# curl -T uploadfile www.uploadhttp.com/receive.cgi
6. Аутентификация
Аутентификация - передача серверу имени пользователя и пароля, после этого он проверяет, имеете ли вы право выполнить требуемый запрос. Аутентификация по методу Basic (которым curl пользуется по умолчанию) основана на открытом тексте, что означает, что имя пользователя и пароль не будут зашифрованы, а лишь слегка "затуманены" по алгоритму Base64, что оставляет возможность узнать эту информацию злоумышленникам на пути между вами и HTTP-сервером.
Указание curl использовать имя пользователя и пароль:
# curl -u name:password www.secrets.com
Сайт может требовать использования другого метода аутентификации (посмотрите, что пишет сервер в заголовках), в этих случаях можно использовать ключи --ntlm, --digest, --negotiate или даже --anyauth. Иногда доступ к внешним HTTP-серверам происходит через прокси, так часто делают в компаниях и фирмах. HTTP-прокси может требовать свои логин и пароль для доступа к Интернету. Соответствующий ключ curl:
# curl -U proxyuser:proxypassword curl.haxx.se
Если прокси требует аутентификации по методу NTLM, укажите --proxy-ntlm, если метод Digest, то --proxy-digest.
Если вы не укажете пароль в ключах -u и -U, то curl спросит его у вас в интерактивном режиме.
Заметьте, что когда curl работает, строка запуска (а вместе с этим и ключи, и пароли) могут быть видны другим пользователям вашей системы в списке задач. Есть способы предотвратить это. Об этом ниже.
7. Referer
HTTP-запрос может включать поле "referer", которое указывает, с какого URL пользователь пришел на данный ресурс. Некоторые программы/скрипты проверяют поле "referer" и не выполняют запрос, если пользователь пришел с неизвестной страницы. Хотя это и глупый способ проверки, тем не менее многие скрипты используют его. С помощью curl вы можете вписать что угодно в поле "referer" и таким образом заставлять выполнять то, что вам нужно.
Это делается следующим образом:
# curl -e http://curl.haxx.se daniel.haxx.se
8. User Agent
Все HTTP-запросы поддерживают поле "User-Agent", в котором указывается клиентское приложение пользователя. Многие web-приложения используют эту информацию, чтобы тем или иным способом отобразить страницу. Web-программисты создают несколько версий страницы для пользователей разных браузеров в целях улучшения внешнего вида, использования различных скриптов javascript, vbscript и т.д.
Иногда вы можете обнаружить, что curl возвращает страницу не такой, какой вы ее видели в своем браузере. В этом случае как раз уместно использовать поле "User Agent", чтобы в очередной раз обмануть сервер.
Замаскировать curl под Internet Explorer на машине с Windows 2000:
# curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
Почему бы не стать Netscape 4.73 на Linux-машине (PIII):
# curl -A "Mozilla/4.73 (X11; U; Linux 2.2.15 i686)"
9. Перенаправления (redirects)
Отвечая на ваш запрос, сервер вместо самой страницы может вернуть указание, куда браузер должен пойти дальше, чтобы попасть на нужную страницу. Заголовок, который указывает браузеру такое перенаправление - это "Location:".
По умолчанию curl не идет по адресу, указанному в "Location:", а просто показывает страницу как обычно. Но можно его направить следующим образом:
# curl -L www.sitethatredirects.com
Если вы используете curl для POST-запросов на сайт, который сразу же перенаправляет на другую страницу, вы можете смело использовать связку -L и -d/-F. Curl сформирует POST-запрос для первой страницы, а затем GET-запрос для последующей.
10. 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
11. HTTPS
Есть несколько способов обезопасить ваши HTTP-передачи. Наиболее известным протоколом, решающим эту задачу, является HTTPS, или HTTP over SSL. SSL зашифровывает все посылаемые и принимаемые по сети данные, что увеличивает вероятность того, что ваша информация останется в тайне.
Curl поддерживает запросы к HTTPS-серверам благодаря свободно распространяемой библиотеке OpenSSL. Запросы происходят обычным способом:
# curl https://that.secure.server.com
11.1 Сертификаты
В мире HTTPS для аутентификации в дополнение к имени пользовавателя и паролю вы используете сертификаты. Curl поддерживает сертификаты на стороне клиента. Все сертификаты заперты ключевой фразой, которую вам нужно ввести прежде чем curl может начать с ними работу. Ключевая фраза может быть указана либо в командной строке, либо введена в интерактивном режиме. Сертификаты в curl используются следующим образом:
# curl -E mycert.pem https://that.secure.server.com
Curl также проверяет сервер на подлинность, сверяя сертификат сервера с локально хранящимся. Обнаружившееся несоответствие приведет к тому, что curl откажется соединяться. Для игнорирования проверки на подлинность используйте ключ -k.
Более подробная информация о сертификатах может быть найдена на странице http://curl.haxx.se/docs/sslcerts.html.
12. Произвольные заголовки запроса
Возможно, вам понадобится изменять или добавлять элементы отдельных запросов curl.
К примеру, вы можете изменить запрос POST на PROPFIND и отправить данные как "Content-Type: text/xml" (вместо обычного Content-Type):
# curl -d "
Вы можете удалить какой-нибудь заголовок, указав его без содержимого. Например, вы можете удалить заголовок "Host:", тем самым сделав запрос "пустым":
# curl -H "Host:" http://mysite.com
Также вы можете добавлять заголовки. Возможно, вашему серверу потребуется заголовок "Destination:":
# curl -H "Destination: http://moo.com/nowhere" http://url.com
13. Отладка
Часто бывает так, что сайт реагирует на запросы curl не так, как на запросы браузера. В этом случае нужно максимально уподобить curl браузеру:
- Используйте ключ --trace-ascii для сохранения подробного отчета запросов, чтобы затем подробно изучить их и разобраться в проблеме.
- Убедитесь, что вы проверяете на cookies и используете их при необходимости (ключ чтения -b и сохранения -c)
- Укажите в поле "user-agent" один из последних популярных браузеров
- Заполните поле "referer" как это делает браузер
- Если вы используете POST-запросы, убедитесь, что все поля передаются в том же порядке, что и браузер (см. выше, пункт 4.5)
Хороший помощник в этом нелегком деле - плагин для Mozilla/Firefox LiveHTTPHeader, который позволяет просматривать все заголовки, которые отправляет и принимает этот браузер (даже при использовании HTTPS).
Более низкоуровневый подход - захват HTTP-траффика в сети с помощью программ, таких как ethereal или tcpdump, с последующим анализом, какие заголовки были получены и отправлены браузером (HTTPS делает этот подход неэффективным).
RFC 2616 обязательно для чтения всем, кто хочет понять протокол HTTP.
RFC 2396 объясняет синтаксис URL.
RFC 2109 определяет работу cookies.
RFC 1867 определяет формат File Upload Post.
http://openssl.planetmirror.com - домашняя страница проекта OpenSSL
http://curl.haxx.se - домашняя страница проекта cURL
Жизнь веб-разработчика омрачена сложностями. Особенно неприятно, когда источник этих сложностей неизвестен. То ли это проблема с отправкой запроса, то ли с ответом, то ли со сторонней библиотекой, то ли внешний API глючит? Существует куча различных прилад, способных упростить нам жизнь. Вот некоторые инструменты командной строки, которые лично я считаю бесценными.
cURL
cURL - программа для передачи данных по различным протоколам, похожая на wget. Основное отличие в том, что по умолчанию wget сохраняет в файл, а cURL выводит в командную строку. Так можно очень просто посмотреть контент веб-сайта. Например, вот как быстро получить свой текущий внешний IP:
$ curl ifconfig.me
93.96.141.93
Параметры -i
(показывать заголовки) и -I
(показывать только заголовки) делают cURL отличным инструментом для дебаггинга HTTP-ответов и анализа того, что конкретно сервер вам отправляет:
$ curl -I habrahabr.ru
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 18 Aug 2011 14:15:36 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Keep-alive: timeout=25
Параметр -L
тоже полезный, он заставляет cURL автоматически следовать по редиректам. cURL поддерживает HTTP-аутентификацию, cookies, туннелирование через HTTP-прокси, ручные настройки в заголовках и многое, многое другое.
Siege
Siege - инструмент для нагрузочного тестирования. Плюс, у него есть удобная опция -g
, которая очень похожа на curl –iL
, но вдобавок показывает вам ещё и заголовки http-запроса. Вот пример с google.com (некоторые заголовки удалены для краткости):
$ siege -g www.google.com
GET / HTTP/1.1
Host: www.google.com
User-Agent: JoeDog/1.00 (X11; I; Siege 2.70)
Connection: close
HTTP/1.1 302 Found
Location: http://www.google.co.uk/
Content-Type: text/html; charset=UTF-8
Server: gws
Content-Length: 221
Connection: close
GET / HTTP/1.1
Host: www.google.co.uk
User-Agent: JoeDog/1.00 (X11; I; Siege 2.70)
Connection: close
HTTP/1.1 200 OK
Content-Type: text/html; charset=ISO-8859-1
X-XSS-Protection: 1; mode=block
Connection: close
Но для чего Siege действительно великолепно подходит, так это для нагрузочного тестирования. Как и апачевский бенчмарк ab
, он может отправить множество параллельных запросов к сайту и посмотреть, как он справляется с трафиком. В следующем примере показано, как мы тестируем Google с помощью 20 запросов в течение 30 секунд, после чего выводится результат:
$ siege -c20 www.google.co.uk -b -t30s
...
Lifting the server siege... done.
Transactions: 1400 hits
Availability: 100.00 %
Elapsed time: 29.22 secs
Data transferred: 13.32 MB
Response time: 0.41 secs
Transaction rate: 47.91 trans/sec
Throughput: 0.46 MB/sec
Concurrency: 19.53
Successful transactions: 1400
Failed transactions: 0
Longest transaction: 4.08
Shortest transaction: 0.08
Одна из самых полезных функций Siege - то, что он может работать не только с одним адресом, но и со списком URL’ов из файла. Это отлично подходит для нагрузочного тестирования, потому что можно моделировать реальный трафик на сайте, а не просто жать один и тот же URL снова и снова. Например, вот как использовать Siege, чтобы нагрузить сервер, используя адреса из вашего лога Apache:
$ cut -d " " -f7 /var/log/apache2/access.log > urls.txt
$ siege -c
Ngrep
Для серьёзного анализа трафика существует Wireshark с тысячами настроек, фильтров и конфигураций. Есть также версия для командной строки tshark
. Но для простых задач функционал Wireshark я считаю избыточным. Так что до тех пор, пока мне не нужно мощное оружие, я использую . Он позволяет делать с сетевыми пакетами то же самое, что grep
делает с файлами.
Для веб-трафика вы почти всегда захотите использовать параметр -W , чтобы сохранить форматирование строк, а также параметр -q , который скрывает избыточную информацию о неподходящих пакетах. Вот пример команды, которая перехватывает все пакеты с командой GET или POST:
Ngrep -q -W byline "^(GET|POST) .*"
Вы можете добавить дополнительный фильтр для пакетов, например, по заданному хосту, IP-адресу или порту. Вот фильтр для всего входящего и исходящего трафика на google.com, порт 80, который содержит слово “search”.
Ngrep -q -W byline "search" host www.google.com and port 80