Heloo,
Я работаю над одним проектом, и мне нужны обновления в реальном времени из Instagram для определенного тега.
Это мой код для создания подписки
<?php $client_id = 'MOJID'; $client_secret = 'MOJIDSECRET'; $redirect_uri = 'http://example.net/instagram/callback.php'; $apiData = array( 'client_id' => $client_id, 'client_secret' => $client_secret, 'redirect_uri' => $redirect_uri, 'aspect' => "media", 'object' => "tag", 'object_id' => "winter", 'callback_url' => $redirect_uri ); $apiHost = 'https://api.instagram.com/v1/subscriptions/'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiHost); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($apiData)); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $jsonData = curl_exec($ch); curl_close($ch); var_dump($jsonData); ?>
И выход:
[meta] => stdClass Object ( [code] => 200 ) [data] => stdClass Object ( [object] => tag [object_id] => winter [aspect] => media [callback_url] => http://example.net/instagram/callback.php [type] => subscription [id] => 3932963 ) )
Это код для callback.php:
<?php if (isset ($_GET['hub_challenge'])){ echo $_GET['hub_challenge']; } else{ $myString = file_get_contents('php://input'); $ALL = $myString."\r\n"; file_put_contents('activity.log', $ALL, FILE_APPEND | LOCK_EX); } ?>
И строка из activity.log:
[{«changed_aspect»: «media», «object»: «tag», «object_id»: «winter», «time»: 1385411793, «subscription_id»: 3932963, «data»: {}}]
Я получаю правильную подписку, но данные пустые. Также журнал Acces выглядит так:
54.209.52.224 – – [25 / Ноябрь / 2013: 20: 59: 20 +0100] "POST /instagram/callback.php HTTP / 1.0" 200 231 "-" "Python-httplib2 / 0.7.4 (gzip)"
И это хорошо, код состояния 200, но еще раз данные пустые. Instagram «отправляется» в мой файл обратного вызова, но данные пустые.
Что я делаю не так?
Подписка на Instagram Realtime API сообщит вам только о том, когда было обновлено ваше подписное устройство, а не обновление. Как только вы получите уведомление, вам необходимо обратиться к API (в вашем случае, вероятно, https://api.instagram.com/v1/tags/winter/media/recent
) и посмотреть, что нового контента является.
В зависимости от объема изменений вы, вероятно, захотите выполнить эти вызовы с определенными временными интервалами, но нижеследующее должно быть хорошим началом. Вероятно, вы также захотите получить только те элементы, которые вы еще не получили.
<?php if (isset ($_GET['hub_challenge'])){ echo $_GET['hub_challenge']; } else{ $myString = file_get_contents('php://input'); $sub_update = json_decode($myString); $access_token = '{ previously saved, get this from DB or flatfile }'; foreach($sub_update as $k => $v) // can be multiple updates per call { $recent_data = file_get_contents('https://api.instagram.com/v1/tags/'.$sub_update->object_id.'/media/recent?access_token='.$access_token); file_put_contents('activity.log', serialize($recent_data->data), FILE_APPEND | LOCK_EX); } } ?>
Я получаю $ _POST, чтобы сказать, что есть обновление от одного из пользователей, прошедших проверку подлинности, проблема в том, что 153 из них подписаны на канал. Единственный способ проверить, есть ли у пользователя обновление, чтобы получить их последние.
Я также могу опубликовать фотографию на IG. Получается $ _POST, вызывая цикл опроса пользователей, но самый новый элемент не будет отображаться в api одновременно с запуском триггера $ _POST из API в реальном времени.