Команда curl в linux с примерами
Содержание:
PROTOCOLS
curl supports numerous protocols, or put in URL terms: schemes. Your particular build may not support them all.
DICT
Lets you lookup words using online dictionaries.
FILE
Read or write local files. curl does not support accessing file:// URL remotely, but when running on Microsoft Windows using the native UNC approach will work.
FTP(S)
curl supports the File Transfer Protocol with a lot of tweaks and levers. With or without using TLS.
GOPHER
Retrieve files.
HTTP(S)
curl supports HTTP with numerous options and variations. It can speak HTTP version 0.9, 1.0, 1.1, 2 and 3 depending on build options and the correct command line options.
IMAP(S)
LDAP(S)
curl can do directory lookups for you, with or without TLS.
MQTT
curl supports MQTT version 3. Downloading over MQTT equals «subscribe» to a topic while uploading/posting equals «publish» on a topic. MQTT support is experimental and TLS based MQTT is not supported (yet).
POP3(S)
Downloading from a pop3 server means getting a mail. With or without using TLS.
RTMP(S)
The Realtime Messaging Protocol is primarily used to server streaming media and curl can download it.
RTSP
curl supports RTSP 1.0 downloads.
SCP
curl supports SSH version 2 scp transfers.
SFTP
curl supports SFTP (draft 5) done over SSH version 2.
SMB(S)
curl supports SMB version 1 for upload and download.
SMTP(S)
TELNET
Telling curl to fetch a telnet URL starts an interactive session where it sends what it reads on stdin and outputs what the server sends it.
TFTP
curl can do TFTP downloads and uploads.
Отправка данных методом 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 ( = Иванов Иван Иванович )
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
Progress Meter
The progress meter exists to show a user that something actually is happening. The different fields in the output have the following meaning:
From left-to-right:
- % — percentage completed of the whole transfer
- Total — total size of the whole expected transfer
- % — percentage completed of the download
- Received — currently downloaded amount of bytes
- % — percentage completed of the upload
- Xferd — currently uploaded amount of bytes
- Average Speed Dload — the average transfer speed of the download
- Average Speed Upload — the average transfer speed of the upload
- Time Total — expected time to complete the operation
- Time Current — time passed since the invoke
- Time Left — expected time left to completion
- Curr.Speed — the average transfer speed the last 5 seconds (the first 5 seconds of a transfer is based on less time of course.)
The option will display a totally different progress bar that doesn’t need much explanation!
Использование cURL для создания GET запроса
$ch = curl_init(); // GET запрос указывается в строке URL curl_setopt($ch, CURLOPT_URL, 'http://server.com/?s=CURL'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://mysite.ru)'); $data = curl_exec($ch); curl_close($ch);
Отправка GET запроса ничем не отличается от получения страницы
Важно заметить, что строка запроса формируется следующим образом:
http://server.com/index.php?name1=value1&name2=value2&name3=value3
где
http://server.com/index.php
— адрес страницы, nameX — название переменной, valueX — значение переменной.
Следовать за редиректами
Сервер Google сообщил нам, что страница перемещена (301 Moved Permanently), и теперь надо запрашивать страницу . С помощью опции укажем CURL следовать редиректам:
> curl -L google.com <!doctype html> <html itemscope="" itemtype="http://schema.org/WebPage" lang="ru"> <head> <meta content="Поиск информации в интернете: веб страницы, картинки, видео и многое другое." name="description"> <meta content="noodp" name="robots"> <meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"> <meta content="origin" name="referrer"> <title>Google</title> ..........
Формы
Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.
4.1 GET
GET-форма использует метод GET, например следующим образом:
<form method="GET" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value="OK"> </form>
Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».
Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».
Большинство поисковых систем работают таким образом.
Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:
# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"
4.2 POST
Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).
Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.
Форма, генерирующая POST-запрос, похожа на предыдущую:
<form method="POST" action="junk.cgi"> <input type=text name="birthyear"> <input type=submit name=press value=" OK "> </form>
Curl может сформировать POST-запрос с теми же данными следующим
образом:
# curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi
Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.
Данные, которые вы отправляете к серверу, должны быть правильно
закодированы, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.
4.3 Загрузка файлов с помощью POST (File Upload POST)
В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.
Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:
<form method="POST" enctype='multipart/form-data' action="upload.cgi"> <input type=file name=upload> <input type=submit name=press value="OK"> </form>
Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.
Чтобы отослать данные в такую форму с помощью curl, введите
команду:
# curl -F upload=@localfilename -F press=OK
4.4 Скрытые поля
Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.
Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:
<form method="POST" action="foobar.cgi"> <input type=text name="birthyear"> <input type=hidden name="person" value="daniel"> <input type=submit name="press" value="OK"> </form>
Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:
# curl -d "birthyear=1905&press=OK&person=daniel"
4.5 Узнать, как выглядит POST-запрос
Когда вы хотите заполнить форму и отослать данные на сервер с
помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно
также, как и выполненный с помощью браузера.
Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).
Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.
Cookies
Cookies are generally used by web servers to keep state information at the client’s side. The server sets cookies by sending a response line in the headers that looks like where the data part then typically contains a set of pairs (separated by semicolons like ). The server can also specify for what path the «cookie» should be used for (by specifying ), when the cookie should expire (), for what domain to use it () and if it should be used on secure connections only ().
If you’ve received a page from a server that contains a header like:
it means the server wants that first pair passed on when we get anything in a path beginning with «/foo».
Example, get a page that wants my name passed in a cookie:
Curl also has the ability to use previously received cookies in following sessions. If you get cookies from a server and store them in a file in a manner similar to:
… you can then in a second connect to that (or another) site, use the cookies from the ‘headers’ file like:
While saving headers to a file is a working way to store cookies, it is however error-prone and not the preferred way to do this. Instead, make curl save the incoming cookies using the well-known netscape cookie format like this:
Note that by specifying you enable the «cookie awareness» and with you can make curl follow a location: (which often is used in combination with cookies). So that if a site sends cookies and a location, you can use a non-existing file to trigger the cookie awareness like:
The file to read cookies from must be formatted using plain HTTP headers OR as netscape’s cookie file. Curl will determine what kind it is based on the file contents. In the above command, curl will parse the header and store the cookies received from www.example.com. curl will send to the server the stored cookies which match the request as it follows the location. The file «empty.txt» may be a nonexistent file.
To read and write cookies from a netscape cookie file, you can set both and to use the same file:
Мульти запросы cURL в PHP
Обычно в скрипте PHP выполнение запросов cUrl производится последовательно, то есть друг за другом. Пока не вернется результат предыдущего запроса, новый не выполнится.
Например, если нужно собрать независимые друг от друга данные с разных сайтов, то можно организовать их параллельный сбор. Можно также произвести несвязанные вычисления или обработку данных через асинхронные запросы к скриптам в отдельных файлах.
// создание обработчиков $ch1 = curl_init(); $ch2 = curl_init(); // установка опций curl_setopt($ch1, CURLOPT_URL, "https://site1.ru"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.site2.ru"); curl_setopt($ch2, CURLOPT_HEADER, 0); // создание управляющего объекта $mh = curl_multi_init(); // добавление обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $running = null; // запуск выполнения запросов в асинхронном режиме do { curl_multi_exec($mh, $running); } while ($running > 0); // освобождение ресурсов curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);
Функция curl_multi_exec() многократно вызывается в цикле с постусловием, где параметр $running имеет значение количества активных соединений.
Чем больше обработчиков в параллельной работе, тем больше сокращается время выполнения скрипта, поэтому нелишним будет внедрить привычку использовать эту возможность cURL в своих скриптах.
Simple Usage
Get the main page from a web-server:
Get the README file the user’s home directory at funet’s ftp-server:
Get a web page from a server using port 8000:
Get a directory listing of an FTP site:
Get the definition of curl from a dictionary:
Fetch two documents at once:
Get a file off an FTPS server:
or use the more appropriate FTPS way to get the same file:
Get a file from an SSH server using SFTP:
Get a file from an SSH server using SCP using a private key (not password-protected) to authenticate:
Get a file from an SSH server using SCP using a private key (password-protected) to authenticate:
Get the main page from an IPv6 web server:
Get a file from an SMB server:
URL
The URL syntax
is protocol-dependent. You’ll find a detailed
description in RFC 3986.
You can specify
multiple URLs or parts of URLs by writing part sets within
braces and quoting the URL as in:
«http://site.{one,two,three}.com»
or you can get
sequences of alphanumeric series by using [] as in:
«ftp://ftp.example.com/file.txt»
«ftp://ftp.example.com/file.txt»
(with leading zeros)
«ftp://ftp.example.com/file.txt»
Nested
sequences are not supported, but you can use several ones
next to each other:
«http://example.com/archive/vol/part{a,b,c}.html»
You can specify
any amount of URLs on the command line. They will be fetched
in a sequential manner in the specified order. You can
specify command line options and URLs mixed and in any order
on the command line.
You can specify
a step counter for the ranges to get every Nth number or
letter:
«http://example.com/file.txt»
«http://example.com/file.txt»
When using []
or {} sequences when invoked from a command line prompt, you
probably have to put the full URL within double quotes to
avoid the shell from interfering with it. This also goes for
other characters treated special, like for example
’&’, ’?’ and
’*’.
Provide the
IPv6 zone index in the URL with an escaped percentage sign
and the interface name. Like in
«http:///»
If you specify
URL without protocol:// prefix, curl will attempt to guess
what protocol you might want. It will then default to HTTP
but try other protocols based on often-used host name
prefixes. For example, for host names starting with
«ftp.» curl will assume you want to speak FTP.
curl will do
its best to use what you pass to it as a URL. It is not
trying to validate it as a syntactically correct URL by any
means but is instead very liberal with what it
accepts.
curl will
attempt to re-use connections for multiple file transfers,
so that getting many files from the same server will not do
multiple connects / handshakes. This improves speed. Of
course this is only done on files specified on a single
command line and cannot be used between separate curl
invokes.
Step 3 — Following Redirects
Thus far all of the examples have included fully qualified URLs that include the protocol. If you happened to try to fetch the file and only specified , you would not see any output, because DigitalOcean redirects requests from to :
You can verify this by using the flag, which displays the request headers rather than the contents of the file:
The output shows that the URL was redirected. The first line of the output tells you that it was moved, and the line tells you where:
You could use to make another request manually, or you can use the or argument which tells to redo the request to the new location whenever it encounters a redirect. Give it a try:
This time you see the output, as followed the redirect:
You can combine the argument with some of the aforementioned arguments to download the file to your local system:
Warning: Many resources online will ask you to use to download scripts and execute them. Before you run any scripts you have downloaded, it’s good practice to check their contents before making them executable and running them. Use the command to review the code to ensure it’s something you want to run.
Как пользоваться curl?
Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.
Загрузка файлов
Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:
curl https://raw.githubusercontent.com/curl/curl/master/README.md
Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:
curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md
А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md
Если загрузка была неожиданно прервана, вы можете ее возобновить:
curl -# -C — -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Если нужно, одной командой можно скачать несколько файлов:
curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Еще одна вещь, которая может быть полезной администратору — это загрузка файла, только если он был изменен:
curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README
Данная команда скачает файл, только если он был изменен после 21 декабря 2017.
Ограничение скорости
Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:
curl —limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz
Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:
curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md
Передача файлов
Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:
curl -T login.txt ftp://speedtest.tele2.net/upload/
Или проверим отправку файла по HTTP, для этого существует специальный сервис:
curl -T ~/login.txt http://posttestserver.com/post.php
В ответе утилита сообщит где вы можете найти загруженный файл.
Отправка данных POST
Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:
curl -d «field1=val&fileld2=val1″http://posttestserver.com/post.php
Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:
curl -F «password=@pass;type=text/plain» http://posttestserver.com/post.php
Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.
Передача и прием куки
Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:
curl -c cookie.txt http://posttestserver.com/post.php
Затем можно отправить cookie curl обратно:
curl -b cookie.txt http://posttestserver.com/post.php
Передача и анализ заголовков
Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:
curl -I https://losst.ru
А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:
curl -I —хедер ‘If-Modified-Since: Mon, 26 Dec 2016 18:13:12 GMT’ https://losst.ru
Аутентификация curl
Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:
curl -u ftpuser:ftppass -T — ftp://ftp.testserver.com/myfile_1.txt
Точно так же будет выполняться аутентификация на серверах HTTP.
Использование прокси
Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:
curl -x proxysever.test.com:3128 http://google.co.in
3: Поддержка перенаправлений
Пока что все примеры использовали полностью определенные URL-адреса, которые включают протокол https://. Если бы вы попытались получить файл robots.txt и указали бы только домен, вы не увидели бы никаких результатов, потому что сайт может перенаправлять запросы с http:// на https://.
Вы можете проверить это с помощью флага -I, который отображает заголовки запроса, а не содержимое файла:
Выходные данные показывают, что URL-адрес был перенаправлен. Первая строка вывода сообщает, что он был перемещен, а строка Location сообщает, куда именно:
Вы можете использовать curl и отправить другой запрос вручную. Также вы можете использовать аргумент –location (или –L), который позволит утилите curl отправить запрос в новое место, если она встречает перенаправление. Попробуйте сделать это:
На этот раз вы увидите ожидаемый результат, поскольку curl поддерживает перенаправление:
Вы можете комбинировать аргумент -L с некоторыми из вышеупомянутых аргументов, чтобы загрузить файл в вашу локальную систему:
Важно! Многие онлайн-ресурсы предлагают использовать curl для загрузки скриптов и их выполнения. Однако прежде чем делать исполняемыми и запускать какие-либо загруженные скрипты, вы должны проверить их содержимое
Используйте команду less, чтобы проверить код и убедиться, что он не причинит вреда вашей системе.
Time Conditions
HTTP allows a client to specify a time condition for the document it requests. It is or . curl allows you to specify them with the / flag.
For example, you can easily make a download that only gets performed if the remote file is newer than a local copy. It would be made like:
Or you can download a file only if the local file is newer than the remote one. Do this by prepending the date string with a , as in:
You can specify a «free text» date as condition. Tell curl to only download the file if it was updated since January 12, 2012:
Curl will then accept a wide range of date formats. You always make the date check the other way around by prepending it with a dash ().
Типсы и триксы cURL
cURL и получение кукиз помимо CURLOPT_COOKIEJAR
Думаю, уже стало понятно, что cURL правильно обрабатывает куки — сохраняет их, использует, когда сервер запрашивает, и т. д. Но иногда куки нужно сохранить. Для этого есть опция CURLOPT_COOKIEJAR, но воспользоваться ей можно не всегда. Этому и посвящён наш первый трюк.
Иногда из-за особенностей настройки PHP на сервере, нам недоступны такие опции как CURLOPT_COOKIEJAR (позволяет сохранить полученные куки в файл) и CURLOPT_COOKIEFILE (позволяет использовать куки из файла). Т.к. они говорят, что используя эти опции мы сможем стянуть любой файл с их сервера. Вот решение этой проблемы:
1) Не используем CURLOPT_FOLLOWLOCATION
2) Используем curl_setopt($ch, CURLOPT_HEADER, 1)
3) Собираем кукизы из заголовка header примерно так:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results); $cookies = implode(';', $results);
4) Задаём их используя curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пожалуйста, все, перестаньте устанавливать настройку CURLOPT_SSL_VERIFYPEER на false или 0. Если ваша установка PHP не имеет актуального комплекта корневых сертификатов CA, загрузите один на веб-сайте curl и сохраните его на ваш сервер:
Затем задайте путь в вашем файле php.ini file, например, на Windows:
curl.cainfo=c:phpcacert.pem
Отключение CURLOPT_SSL_VERIFYPEER позволяет осуществить атаку человек-по-середине (MITM), а это нам не надо!