Информация об ограничении скорости доступа API Instagram с определенным классом PHP

Я использую этот класс PHP для API Instagram: https://github.com/cosenary/Instagram-PHP-API.
Это работает отлично, но я не могу получить доступ к информации об ограничении скорости для каждого звонка, который я делаю.

Внутри класса это метод, который делает вызов:

protected function _makeCall($function, $auth = false, $params = null, $method = 'GET') {
if (false === $auth) {
$authMethod = '?client_id=' . $this->getApiKey();
} else {
if (true === isset($this->_accesstoken)) {
$authMethod = '?access_token=' . $this->getAccessToken();
} else {
throw new \Exception("Error: _makeCall() | $function - This method requires an authenticated users access token.");
}
}

if (isset($params) && is_array($params)) {
$paramString = '&' . http_build_query($params);
} else {
$paramString = null;
}

$apiCall = self::API_URL . $function . $authMethod . (('GET' === $method) ? $paramString : null);

$headerData = array('Accept: application/json');
if (true === $this->_signedheader && 'GET' !== $method) {
$headerData[] = 'X-Insta-Forwarded-For: ' . $this->_signHeader();
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiCall);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

if ('POST' === $method) {
curl_setopt($ch, CURLOPT_POST, count($params));
curl_setopt($ch, CURLOPT_POSTFIELDS, ltrim($paramString, '&'));
} else if ('DELETE' === $method) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
}

$jsonData = curl_exec($ch);

if (false === $jsonData) {
throw new \Exception("Error: _makeCall() - cURL error: " . curl_error($ch));
}

curl_close($ch);
return json_decode($jsonData);
}

Информация, к которой мне нужно получить доступ из API Instagram:

  • X-Limit-ограничения частоты
  • X-ограничение частота-Оставаясь

(http://instagram.com/developer/limits/ для получения дополнительной информации об ограничениях Instagram).

По понятным причинам мне нужно приложение, которое я создаю, чтобы «выключить себя» до того, как ограничение скорости вступит в силу. Получив доступ к информации об ограничении скорости, я смогу достичь этого.

Я нашел Gist, который должен работать с этим классом, но я не могу заставить его работать: https://gist.github.com/cosenary/6af4cf4b509518169b88

Также эта тема здесь, на Stackoverflow, кажется бесполезной:
Ограничения подсчета API Instagram с использованием заголовка HTTP

Если бы кто-нибудь мог помочь мне здесь, это было бы удивительно!

С наилучшими пожеланиями,
Питер де Леув

0

Решение

Я изменил функцию _makeCall, добавив first curl_setopt следующим образом ($ ch, CURLOPT_HEADER, true); и вызывая функцию processHeader () как cosenary предложил по этому вопросу cosenary / ratelimit.php:

protected function _makeCall($function, $auth = false, $params = null, $method = 'GET') {
if (false === $auth) {
// if the call doesn't requires authentication
$authMethod = '?client_id=' . $this->getApiKey();
} else {
// if the call needs an authenticated user
if (true === isset($this->_accesstoken)) {
$authMethod = '?access_token=' . $this->getAccessToken();
} else {
throw new \Exception("Error: _makeCall() | $function - This method requires an authenticated users access token.");
}
}

if (isset($params) && is_array($params)) {
$paramString = '&' . http_build_query($params);
} else {
$paramString = null;
}

$apiCall = self::API_URL . $function . $authMethod . (('GET' === $method) ? $paramString : null);

// signed header of POST/DELETE requests
$headerData = array('Accept: application/json');
if (true === $this->_signedheader && 'GET' !== $method) {
$headerData[] = 'X-Insta-Forwarded-For: ' . $this->_signHeader();
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiCall);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerData);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

if ('POST' === $method) {
curl_setopt($ch, CURLOPT_POST, count($params));
curl_setopt($ch, CURLOPT_POSTFIELDS, ltrim($paramString, '&'));
} else if ('DELETE' === $method) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
}

$jsonData = curl_exec($ch);

// split header from JSON data
// and assign each to a variable
list($headerContent, $jsonData) = explode("\r\n\r\n", $jsonData, 2);

// convert header content into an array
$headers = $this->processHeaders($headerContent);

// get the 'X-Ratelimit-Remaining' header value
$ratelimitRemaining = $headers['X-Ratelimit-Remaining'];

$this->setHeaderLimit($ratelimitRemaining);if (false === $jsonData) {
throw new \Exception("Error: _makeCall() - cURL error: " . curl_error($ch));
}
curl_close($ch);

return json_decode($jsonData);
}

Метод processHeader (), который обрабатывает заголовок и методы set и get для $ rateLimitRemaining, выглядит следующим образом:

private function processHeaders($headerContent){

$headers = array();

foreach (explode("\r\n", $headerContent) as $i => $line) {
if($i===0){
$headers['http_code'] = $line;
}else{
list($key,$value) = explode(':', $line);
$headers[$key] = $value;
}
}
return $headers;
}private function setHeaderLimit($HeaderLimit){

$this->HeaderLimit = $HeaderLimit;
}

public function getHeaderLimit(){

return $this->HeaderLimit;
}

Вы можете получить доступ к X-Ratelimit-Remaining сейчас из другого класса, просто вызвав getHeaderLimit ()

* Не забудьте объявить открытое поле HeaderLimit внутри класса, в котором находится _makeCall (), в данном случае это Instagram.php.

** Я проверил это решение, и оно отлично работает.

Надеюсь, это поможет вам, ребята 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]