8 примеров использования curl вместе с php
Содержание:
- Some debug tricks
- Cookies
- Пару слов о других полезных опциях cURL
- Метод POST
- Как пользоваться curl?
- Forms explained
- Cookie options
- Запросы и ответы содержат заголовки
- Вирусы
- Скрытые поля формы
- Строки запроса и параметры
- Отправка данных методом POST
- Location header
- User Agent
- Получение информации
- 5 последних уроков рубрики «PHP»
- 13. Отладка
- Отправить GET-запрос из формы
- Библиотеки
- Some login tricks
- Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?
Some debug tricks
Many times when you run curl on a site, you’ll notice that the site doesn’t
seem to respond the same way to your curl requests as it does to your
browser’s.
Then you need to start making your curl requests more similar to your
browser’s requests:
-
Use the option to store fully detailed logs of the requests
for easier analyzing and better understanding -
Make sure you check for and use cookies when needed (both reading with
and writing with ) -
Set user-agent (with ) to
one like a recent popular browser does -
Set referer (with ) like
it is set by the browser -
If you use POST, make sure you send all the fields and in the same order as
the browser does it.
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
HTTP Аутентификация
Если на URL адресе есть HTTP аутентификация, то вы без труда можете воспользоваться следующим скриптом:
$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // то сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);
FTP загрузка
В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:
// открываем файл $file = fopen("/path/to/file", "r"); // в url должно быть следующее содержание $url = "ftp://username:password@mydomain.com:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // указывам ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch);
Используем Прокси
Вы можете выполнить свой URL запрос через прокси:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://www.example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем адрес curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080'); // если необходимо предоставить имя пользователя и пароль curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass'); $output = curl_exec($ch); curl_close ($ch);
Функции обратного вызова
Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com'); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close ($ch); function progress_function($ch,$str) { echo $str; return strlen($str); }
Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.
Метод POST
Метод GET приводит к тому, что вся введенная информация отображается в адресной строке браузера. Очевидно, что это не самый лучший способ в тех случаях, когда нужно отправить конфиденциальные данные или когда объем введенной информации очень велик. Для решения этой проблемы протокол HTTP предоставляет пользователю еще один метод — POST. С его помощью клиент отправляет данные отдельно от URL, и поэтому в адресной строке браузера вы их не увидите.
Форма, генерирующая POST-запрос, отличается от предыдущей лишь методом отправки:
<form method="POST" action="foo.cgi"> <input type=text name="year"> <input type=submit name=press value=" OK "> </form>
curl сформирует POST-запрос с теми же данными следующим образом:
$ curl -d "year=1990&press=%20OK%20" www.foo.com/foo.cgi
Обратите внимание на то, что данные, которые вы отправляете серверу, должны быть правильно закодированы. curl не сделает этого за вас
К примеру, если вы хотите, чтобы данные содержали пробел, то вам нужно заменить этот пробел на и т. п. Это одна из самых распространенных ошибок, в результате чего данные передаются не так, как нужно.
Как пользоваться 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:
Forms explained
Forms are the general way a website can present a HTML page with fields for
the user to enter data in, and then press some kind of ‘OK’ or ‘Submit’
button to get that data sent to the server. The server then typically uses
the posted data to decide how to act. Like using the entered words to search
in a database, or to add the info in a bug tracking system, display the
entered address on a map or using the info as a login-prompt verifying that
the user is allowed to see what it is about to see.
Of course there has to be some kind of program on the server end to receive
the data you send. You cannot just invent something out of the air.
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, добавим ключ :
Заголовок будет включен над телом ответа:
Чтобы в ответе получить только заголовок, используем ключ
Заголовок содержит метаданные ответа. Вся эта информация передается в браузер при запросе URL в нашем браузере (например, при просмотре веб-страницы в Интернете), но браузер не отображает эту информацию. Можно просмотреть информацию заголовка с помощью консоли Chrome Developer Tools, перейдя на вкладку .
Теперь давайте уточним метод. Метод GET (чтение) подразумевается по умолчанию, когда не указан другой метод, но мы сделаем это здесь явно с параметром -X:
При посещении веб-сайта мы отправляем запрос, используя метод GET. Существуют и другие методы HTTP, которые можно использовать при взаимодействии с REST API. Вот общие методы, используемые при работе с конечными точками REST:
HTTP метод | Описание |
---|---|
POST | Создание ресурса |
GET | Чтение (получение) ресурса |
PUT | Обновление ресурса |
DELETE | Удаление ресурса |
Note: Метод GET используется по умолчанию в запросах curl. При использовании curl для выполнения запросов HTTP, отличных от GET, необходимо указывать нужный метод HTTP.
Вирусы
Все описанные решения могут оказаться совершенно недейственными только по причине того, что в системе прочно обосновался какой-то зловредный вирус или вредоносный код, который своими действиями самопроизвольно меняет настройки. В случае когда сбои DNS не связаны ни с одной из вышеописанных причин и не наблюдаются ни со стороны провайдера, ни со стороны ресурса, ни со стороны пользователя, придется произвести полное углубленное сканирование системы.
Штатный антивирус не подойдет, поэтому лучше всего использовать утилиты вроде Kaspersky Rescue Disk, которые осуществляют проверку еще до старта ОС (их нужно записать на съемный носитель и загрузиться именно с него, установив соответствующий приоритет в настройках BIOS).
Скрытые поля формы
Скрытые поля в формах являются одним из наиболее распространенных способов передачи информации о состоянии HTML-приложения. Такие поля не заполняются, они невидимы для пользователя, но передаются так же, как и обычные поля.
Пример формы с одним видимым и одним скрытым полями:
<form method="POST" action="foo.cgi"> <input type=text name="year"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно задумываться о том, скрыто поле или нет — для curl все поля одинаковы:
$ curl -d "year=1990&press=OK&person=daniel" URL
Строки запроса и параметры
Параметры почтового индекса (), идентификатора приложения () и единиц () были переданы в конечную точку с помощью «строк запроса». Знак добавленный к URL указывает начало строки запроса. Параметры строки запроса — это параметры, которые появляются после знака :
После строки запроса каждый параметр объединяется с другими параметрами через символ амперсанда . Порядок параметров в строке запроса не имеет значения. Порядок имеет значение только в том случае, если параметры находятся слева от строки запроса (и, следовательно, являются частью самого URL-адреса). Любые настраиваемые части конечной точки, которые появляются перед строкой запроса, называются (разберем их позже).
Отправка данных методом 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 ( = Иванов Иван Иванович )
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.
User Agent
Very similar to the referer field, all HTTP requests may set the User-Agent
field. It names what user agent (client) that is being used. Many
applications use this information to decide how to display pages. Silly web
programmers try to make different pages for users of different browsers to
make them look the best possible for their particular browsers. They usually
also do different kinds of javascript, vbscript etc.
At times, you will see that getting a page with curl will not return the same
page that you see when getting the page with your browser. Then you know it
is time to set the User Agent field to fool the server into thinking you’re
one of those browsers.
To make curl look like Internet Explorer 5 on a Windows 2000 box:
Or why not look like you’re using Netscape 4.73 on an old Linux box:
Получение информации
Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.
// ... curl_exec($ch); $info = curl_getinfo($ch); echo 'Took ' . $info . ' seconds for url ' . $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”
5 последних уроков рубрики «PHP»
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак
В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение
В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
13. Отладка
Часто бывает так, что сайт реагирует на запросы curl не так, как
на запросы браузера. В этом случае нужно максимально уподобить curl
браузеру:
-
Используйте ключ —trace-ascii для
сохранения подробного отчета запросов, чтобы затем подробно изучить
их и разобраться в проблеме. -
Убедитесь, что вы проверяете на
cookies и используете их при необходимости (ключ чтения -b и
сохранения -c) -
Укажите в поле ‘user-agent’ один
из последних популярных браузеров -
Заполните поле ‘referer’ как это
делает браузер - Если вы используете POST-запросы, убедитесь, что все поля
передаются в том же порядке, что и браузер (см. выше, пункт 4.5)
Хороший помощник в этом нелегком деле — плагин для Mozilla/Firefox
,
который позволяет просматривать все заголовки, которые отправляет и
принимает этот браузер (даже при использовании HTTPS).
Более низкоуровневый подход — захват HTTP-траффика в сети с
помощью программ, таких как ethereal или tcpdump, с последующим
анализом, какие заголовки были получены и отправлены браузером (HTTPS
делает этот подход неэффективным).
Отправить 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"
Библиотеки
Чтобы не создавать новый велосипед, лучше всего воспользоваться готовым решением в виде Guzzle.
Я вкратце опишу что это и с чем его едят:
Guzzle был создан для того, чтобы упростить процесс отправки HTTP запросов. Зачастую используется для отправки запросов к API и чему угодно в целом.
Реальный пример:
Вы можете спросить: Зачем это нужно, если уже существует куча библиотек?
Guzzle собрал все самое лучшее в себе, сделать это еще лучше и теперь это самая популярная PHP библиотека для работы с HTTP запросами. Она и вправду крутая, посмотрите только на простоту запроса:
// Создается клиент с базовой URI $client = new GuzzleHttp\Client(['base_uri' => 'http://bologer.ru/']); // Теперь вы можете отправить запрос на http://bologe.ru/about-blog, информацю о моем блоге :) $response = $client->request('GET', 'about-blog'); // Также можно отправить на http://bologer.ru/about, чтобы прочитать обо мне. Guzzle запоминает базовую ссылку и теперь вы можете указывать лишь последующие страницы для удобства $response = $client->request('GET', 'about');
Круто? Мне очень нравится.
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 на Denwer (Денвер). Как начать пользоваться libcurl?
Первое, что мы должны сделать, это установить библиотеку. На локальном компьютере я пользуюсь сборкой Denwer, как и подавляющее большинство начинающих вебмастеров, на которых и рассчитана статья. Опытные пользователи, которые самостоятельно устанавливают связку php+apache+mysql смогут установить и cURL, не мне объяснять им как это делается 😉 А мы, новички, пользуемся готовыми решениями, чтобы было проще. Поэтому, устанавливаем libcurl следующим образом:
- Соответственно, устанавливаем его. Ничего сложного, согласитесь 🙂
- Открываем в блокноте (я всегда рекомендую Notepad++) файл:
X:/webservers/usr/local/php5/php.ini //где X - ваш диск, куда установлен вебсервер
и убираем точку с запятой в начале сроки:
;extension=php_curl.dll
- Делаем рестарт сервера Денвер.
Готово. Чтобы проверить работоспособность библиотеки можете вызвать функцию phpinfo() и найти там строчку: cURL support enabled. Поздравляю с первой победой.