В рамках моего веб-сервиса я хотел бы, чтобы пользователи могли ссылаться на свои профили в 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
запрос и обработайте результат следующим образом:
Есть ли что-нибудь получше?
API-интерфейсы Instagram не предоставляют сами к этой простой проверочной задаче. Есть ли лучший способ определить, существует ли профиль в Instagram? Я ищу оптимизацию для повышения производительности.