1

そのため、node.jsとモジュールinstagram-node-libを使用して、Instagramの投稿のメタデータをダウンロードしています。検索したいハッシュタグがいくつかあり、既存のすべての投稿をダウンロードし(ページ付け中のリクエストの失敗を処理)、すべての新しい投稿を監視したいと思います。

私は最初の部分をクラックすることができました-既存のすべての投稿をダウンロードして失敗を処理する(Instagram APIが失敗することがあることに気付いたので、最後にダウンロードした成功したページを記憶してその時点から再試行するために冗長性を追加しました)。興味のある方のために、ここに私のコードがあります(注:Postgresを使用して投稿を保存し、読みやすく、商業目的でコードの一部を省略/難読化しました)**コードの長さについてお詫びします。しかし、これは誰かに役立つと思います:

var db = new (require('./postgres'))
    ,api = require("instagram-node-lib")
;

var HASHTAGS = ["fluffy", "kittens"] //this is just an example!
    ,CLIENT_ID = "YOUR_CLIENT_ID"
    ,CLIENT_SECRET = "YOUR_CLIENT_SECRET"
    ,HOST = "https://api.instagram.com"
    ,PORT = 443
    ,PATH = "/v1/media/popular?client_id=" + CLIENT_ID
;

var hashtagIndex = 0
    ,settings
;

/**
 * Initialise the module for use
 */
exports.initialise = function(){
    api.set("client_id", CLIENT_ID);
    api.set("client_secret", CLIENT_SECRET);

    if( !settings){
        settings = {
            hashtags: [] 
        }

        for( var i in HASHTAGS){
            settings.hashtags[i] = {
                name: HASHTAGS[i],
                maxTagId: null,
                minTagId: null,
                nextMaxTagId: null,
            }
        }
    }
    // console.log(settings);

    db.initialiseSettings(); //I haven't included the code for this - basically just loads settings from the database, overwriting the defaults above if they exist, otherwise it creates them using the above object. I store the settings as a JSON object in the DB and parse them on load

    execute();    
}

function execute(){
    var params = {
        name: HASHTAGS[hashtagIndex],
        complete: function(data, pagination){
            var hashtag = settings.hashtags[hashtagIndex];

            //from scratch
            if( !hashtag.maxTagId){
                console.log('Downloading old posts from scratch');

                getOldPosts();
            }
            //still loading old (previously failed)
            else if( hashtag.nextMaxTagId){
                console.log('Downloading old posts from last saved position');

                getOldPosts(hashtag.nextMaxTagId);
            }
            //new posts only
            else {
                console.log('Downloading new posts only');

                getNewPosts(hashtag.minTagId);
            }
        },
        error: function(msg, obj, caller){
            apiError(msg, obj, caller);
        }
    }

    api.tags.info(params);    
}

function getOldPosts(maxTagId){
    console.log();

    var params = {
        name: HASHTAGS[hashtagIndex],
        count: 100,
        max_tag_id: maxTagId || undefined,
        complete: function(data, pagination){
            console.log(pagination); 

            var hashtag = settings.hashtags[hashtagIndex];

            //reached the end
            if( pagination.next_max_tag_id == hashtag.maxTagId){
                console.log('Downloaded all posts for #' + HASHTAGS[hashtagIndex]);

                hashtag.nextMaxTagId = null; //reset nextMaxTagId - that way next time we execute the script we know to just look for new posts
                saveSettings(function(){
                    next();
                }); //Another function I haven't include - just saves the settings object, overwriting what is in the database. Once saved, executes the next() function
            }
            else {
                //from scratch
                if( !hashtag.maxTagId){
                    //these values will be saved once all posts in this batch have been saved. We set these only once, meaning that we have a baseline to compare to - enabling us to determine if we have reached the end of pagination
                    hashtag.maxTagId = pagination.next_max_tag_id;
                    hashtag.minTagId = pagination.min_tag_id;                    
                }

                //if there is a failure then we know where to start from - this is only saved to the database once the posts are successfully saved to database
                hashtag.nextMaxTagId = pagination.next_max_tag_id;   

                //again, another function not included. saves the posts to database, then updates the settings. Once they have completed we get the next page of data
                db.savePosts(data, function(){
                    saveSettings(function(){
                        getOldPosts(hashtag.nextMaxTagId);         
                    });
                });
            }                        
        },
        error: function(msg, obj, caller){
            apiError(msg, obj, caller);
            //keep calm and try again - this is our failure redundancy
            execute();    
        }
    }

    var posts = api.tags.recent(params);
}

/**
 * Still to be completed!
 */
function getNewPosts(minTagId){

}

function next(){
    if( hashtagIndex < HASHTAGS.length - 1){
        console.log("Moving onto the next hashtag...");

        hashtagIndex++;

        execute(); 
    }   
    else {
        console.log("All hashtags processed...");
    } 
}

さて、これがパズルの次の部分を解決することについての私のジレンマです-新しい投稿をダウンロードします(言い換えれば、私が最後にすべての投稿をダウンロードしてから存在した新しい投稿だけです)。Instagramサブスクリプションを使用する必要がありますか、それともすでに使用しているものと同様のページングを実装する方法はありますか?前者の解決策を使用した場合、サーバーに問題があり、しばらくの間サーバーがダウンした場合、いくつかの投稿を見逃してしまうのではないかと心配しています。後者のソリューションを使用すると、Instagram APIがバックワードページングではなくフォワードページングを有効にするように設定されているため、レコードをページングできない可能性があるのではないかと心配しています。

Google Instagram API Developers Groupに質問を数回投稿しようとしましたが、フォーラムにメッセージが表示されていないようです。そのため、信頼できるstackoverflowを使用したいと思いました。

4

0 に答える 0