cURL – перегляд інтернету програмно

Поширте інформацію:

Буває, виникає необхідність програмно опрацювати вміст якоїсь веб-сторінки.
Сторінку можна завантажити функцією file_get_contents().
Але ця функція стара, не підтримується всіма хостингами, і не дає стільки можливостей як чудова потужна бібліотека cURL

Засоби бібліотеки вміють автоматично переходити за редиректами, підтримує протокол https, передає сайтам referer і т.ін.
Використовувати бібліотеку треба так:

$ch = curl_init(); // ініціалізація
curl_setopt($ch, CURLOPT_URL, 'https://site.com/somepage.html'); // адреса сторінки, яку потрібно отримати
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //завантажити вміст сторінки в область пам’яті,
// керовану змінною (див. нижче). Якщо цього не задати, або задати false, вміст сторінки направляється у вихідний потік (виводиться в браузер)
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // переходити за редиректами, які видає сервер при спробі завантажити сторінку
curl_setopt($ch, CURLOPT_AUTOREFERER, true); // підставляти referer. Деякі серевери не хочуть віддавати контент, якщо не отримують referer'а :)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // ігнорувати перевірку придатності SSL-сертифіката сайту  при використанні https
// ! треба мати на увазі, що не можна бути певним в достовірності інформації, отриманої таким способом.
// curl також можна налаштувати таким чином, щоб сертифікати перевірялися
curl_setopt($ch, CURLOPT_POST, true); // передати параметри запиту методом POST
curl_setopt($ch, CURLOPT_POSTFIELDS, array('param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3')); // список POST-параметрів
$result = curl_exec($ch); // виконати запит. Вміст сторінки буде збережено у змінній $result
curl_close($ch); // звільнити пам’ять

Про cURL і SSL-сертифікати дивись цю статтю.
Щоб бути впевненим, що інформація, яку завантажуєш, справді походить з потрібного тобі сайту, треба:
1) зберегти CA-сертифікат сайту (файл *.crt) в місці, доступному для PHP-сценарію;
2) налаштувати cURL таким чином:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . "/CAcerts/public_certificate_of_site.crt");

Параметр CURLOPT_SSL_VERIFYHOST може приймати значення:

  • 0: не перевіряти атрибут сертифікату CN (common name)
  • 1: впевнитися, що атрибут CN принаймні існує
  • 2: впевнитися, що атрибут CN існує і відповідає імені хоста на сервері, до якого ми надсилаємо запит

В нових версіях PHP код можна скоротити, замінивши купу викликів curl_setopt одним викликом curl_setopt_array

$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_URL => 'https://site.com/somepage.html',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_AUTOREFERER => true,
  CURLOPT_SSL_VERIFYPEER => false,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => array(
     'param1' => 'value1',
     'param2' => 'value2',
     'param3' => 'value3'
  )
));
$result = curl_exec($ch);
curl_close($ch);

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.