Curl у прикладах на PHP

Блог Фрилансера 9 хвилин 24 секунд 24 лют. 2019
 Curl у прикладах на PHP

 

GET запит

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html; // Виведе код сторінки vk.com

або

 

echo file_get_contents('https://example.com');

 

POST запит

$array = array(
    'login' => 'admin',
    'password' => '1234'
);

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

// Або зрадити масив рядком:
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));

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

echo $html;

file_get_contents так само вміє надсилати запити POST:

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

echo file_get_contents('https://example.com', false, $headers);

 

PUT запит

$ch = curl_init('https:/example.com/v1/disk/');
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

 

DELETE запит

HTTP метод DELETE використовується в REST API для видалення об'єктів.

$ch = curl_init('http://site.com/delete/999');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

Надсилання файлів на інший сервер

Відправлення файлів здійснюється методом POST:

$ch = curl_init('https://example.com');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@' . __DIR__ . '/image.png');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

З PHP 5.5 такий метод завантаження файлів викликає помилку, тому слід застосовувати  CURLFile.

$curl_file = curl_file_create(__DIR__ . '/image.png', 'mimetype' , 'image.png');

$ch = curl_init('https://example.com');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $curl_file));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch); 

Також через curl можна надіслати одразу кілька файлів:

$curl_files = array(
    'photo[0]' => curl_file_create(__DIR__ . '/image.png', 'mimetype' , 'image.png'),
    'photo[1]' => curl_file_create(__DIR__ . '/image-2.png', 'mimetype' , 'image-2.png')
);

$ch = curl_init('https://example.com');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_files);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

Ще файли можна надіслати методом PUT

$file = __DIR__ . '/image.jpg';
$ fp = fopen ($ file, 'r');

$ch = curl_init('https://example.com/v1/disk/');
curl_setopt($ch, CURLOPT_PUT, true);
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

 

Звантаження файлів

Curl дозволяє зберегти результат відразу у файл, вказавши вказівник на відкритий файл у параметрі CURLOPT_FILE.

$file_name = __DIR__ . '/file.html';
$file = @fopen($file_name, 'w');

$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_FILE, $file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
curl_close($ch);

fclose($file);

Другий варіант:

$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

file_put_contents(__DIR__ . '/file.html', $html);

 

Надіслати та отримати cookie

Щоб CURL зберігав куки у файлі, достатньо прописати його шлях у параметрах CURLOPT_COOKIEFILE і CURLOPT_COOKIEJAR.

$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

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

Передати значення кук можна примусово через параметр CURLOPT_COOKIE.

$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=61445603b6a0809b061080ed4bb93da3');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);

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

 

Імітація браузера

На багатьох сайтах є захист від парсингу. Вона заснована на тому, що браузер передає серверу user agent, referer, & cookie. Сервер перевіряє ці дані та повертає нормальну сторінку. При підключенні через curl ці дані не передаються і сервер дає помилку 404 або 500. Щоб імітувати браузер, потрібно додати заголовки:

 
$ch = curl_init('http://example.com');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_REFERER, 'http://yandex.ru');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, як Gecko) Chrome/61.0.3163.100 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;
 

HTTP авторизація

Якщо на сервері налаштована HTTP авторизація, наприклад за допомогою  .htpasswd, підключитися до нього можна за допомогою параметра CURLOPT_USERPWD.

$ch = curl_init('http://site.com');
curl_setopt($ch, CURLOPT_USERPWD, 'login:password');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

 

Отримати HTTP код відповіді сервера

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

echo $http_code; // Виведе: 200

Підключення через Proxy

 $ch = curl_init('https://site.com');
      curl_setopt($ch, CURLOPT_PUT, true);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
      curl_setopt ($ch, CURLOPT_PROXY, "213.234.31.127:8080");
      curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_HEADER, false);
      $html = curl_exec($ch);
      curl_close($ch);