Instagram实时API重复请求

时间:2015-01-17 16:09:13

标签: real-time instagram endpoints instagram-api

我有一个问题,当我创建实时订阅时,我会收到来自不同Instagram IP地址的重复通知。我进行了设置,以便在收到通知时,使用min_tag_id设置发送最新更新请求。我将它存储在我的数据库中以用于下一个请求。我不总是得到重复,但是当我这样做时,关于通知的一切都是相同的(时间,对象,changed_aspect),除了我可以告诉它们与我的调试输出不同,后者列出了两个几乎相同的请求......唯一不同的信息是不同的IP地址,REQUEST_TIME_FLOAT的差异大约是1/10秒。它们甚至具有相同的HTTP_X_HUB_SIGNATURE值。

我的一般算法是:

process_subscription_update($data){
    # get old min_id
    $min_tag_id = mysqli_fetch_object(mysqli_query($dbconnecti,sprintf("SELECT instagram_min_id+0 as instaid FROM xxxx WHERE xxxx=%d",$_GET['xxxx'])));
    $min_id = $min_tag_id->instaid;
    # make api call
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL, 'https://api.instagram.com/v1/tags/'.$_GET['tag'].'/media/recent?client_id=xxxx&min_tag_id='.$min_id.($min_id==0?'&count=1':''));
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    $result = curl_exec($ch);
    curl_close($ch);
    $i = json_decode($result);
    if ($min_id == $i->pagination->min_tag_id) { exit; }
    # write new min_id to db
    record_min_id($i->pagination->min_tag_id);
    $data2 = $i->data;
    foreach($data2 as $d) {
        process_instagram($d);
    }
    // debugging output: ****************
    $file = file_get_contents($_SERVER['DOCUMENT_ROOT'].'instagram/updates.txt');
    $foo = "\n";
    foreach($_SERVER as $key_name => $key_value) {
        $foo .= $key_name . " = " . $key_value . "\n";
    }
    $fulldata = $file . "\n\n\n" .  $result . "\n min_id = " . $min_id . $foo;
    $fulldata .= "\nTIME:".$data[0]->time;
    $fulldata .= "\nOBJECT:".$data[0]->object;
    $fulldata .= "\nCHANGED_ASPECT:".$data[0]->changed_aspect;
    file_put_contents($_SERVER['DOCUMENT_ROOT'].'instagram/updates.txt', $fulldata);    
    // end debugging output *************

}

我想避免在process_instagram函数中检查我的数据库中是否已经存在instagram消息ID,并且重复项仅相隔1/10秒,我不知道是否无论如何都会工作。

是否有其他人遇到此问题和/或有解决方案?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我不认为我可以做任何关于接收重复通知的事情。因此,在将Instagram写入我的数据库时,我有一个Instagram id的字段,并对该字段设置了一个独特的约束。在执行mysqli INSERT之后,我检查errno是否为1062,如果是,我退出。

mysqli_query($dbconnecti,"INSERT INTO xxx (foo, etc, instagram_id ...")
if ($dbconnecti->errno==1062) { exit; }
...
// more script runs here if we don't have a duplicate.