Instagram实时更新标签-获取空数据,为什么


Instagram Real time updates tag - getting empty data, why?

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":{}}]

我得到了正确的subscription_id,但数据是空的。此外,Acces日志看起来像:

54.209.52.224-【2013年11月25日: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触发被轮询用户的循环,但最新项目不会在$_POST触发器从实时api到达的同时显示在api中。