Есть ли лучший способ определить, существует ли учетная запись Instagram помимо запросов curl HEAD? - PullRequest
0 голосов
/ 29 мая 2020

В рамках моего веб-сервиса я хотел бы, чтобы пользователи могли ссылаться на свои профили в Instagram, если они того пожелают.

Перед добавлением своей учетной записи Instagram в мою базу данных я проверяю, существует ли эта учетная запись используя curl через PHP:

$url = 'https://www.instagram.com/ballastpointbrewing/';

// Initialize Curl
$curl = curl_init();

// URL to Test
curl_setopt($curl, CURLOPT_URL, $url);

// Headers
curl_setopt($curl, CURLOPT_NOBODY, true);
if(preg_match('/^https:\/\//', $url)){
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
}
curl_setopt($curl, CURLOPT_HEADER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'curl/7.53.1');
curl_setopt($curl, CURLOPT_TIMEOUT, 30);

// Send Request, Get Output
$output = curl_exec($curl);

HEAD Requests

Проблема в том, что Instagram не любит запросы HEAD к их поддомену www.

Например, при использовании URL-адреса Instagram Ballast Point, как показано в примере кода выше, этот запрос curl обычно возвращает:

HTTP/1.1 405 Method Not Allowed
Content-Type: text/html; charset=utf-8
Allow: GET
...

Эти ответы обрабатываются примерно за 0,1 секунды

Однако иногда этот же запрос curl вернет:

HTTP/1.1 302 Found
Content-Type: text/html; charset=utf-8
Location: https://www.instagram.com/accounts/login/?next=/ballastpointbrewing/
...

Эти ответы обрабатываются за ~ 0,2 секунды

GET запросы

Удалив curl_setopt($curl, CURLOPT_NOBODY, true); - и повернув завиток запрос из запроса HEAD в запрос GET - обычно я могу получить успешный ответ HTTP/1.1 200 OK. Тем не менее, он имеет гораздо большую полезную нагрузку и занимает значительно больше времени (0,6-0,75 секунды)

Обратите внимание, что иногда с запросом GET я все равно получаю 302 Found перенаправление на страницу входа.

Текущее решение

Поскольку веб-сервис Instagram не всегда обрабатывает HEAD запросов, я реализовал следующее решение.

Отправьте URL-адрес через завиток HEAD запрос и обработайте результат следующим образом:

  • 405 -> Интерпретировать как 200 успех. Сохраните отправленный URL.
  • 301 -> Сохраните URL, возвращенный в заголовке Location:.
  • 302 -> Если заголовок Location: похож на https://www.instagram.com/accounts/login/?next=/ballastpointbrewing/, используйте регулярное выражение для захвата переменной next и создания URL-адреса: https://www.instagram.com{next}.

Есть ли что-нибудь получше?

API-интерфейсы Instagram не предоставляют сами к этой простой проверочной задаче. Есть ли лучший способ определить, существует ли профиль в Instagram? Я ищу оптимизацию для повышения производительности.

...