簡體   English   中英

使用 Async node.js 進行 Twitter API 光標導航

[英]Twitter API cursor navigation with Async node.js

我正在嘗試使用 async/await(我承認我是新手)將 Twitter 的 API 與 node.js 一起使用,但我正在努力獲得下一個光標值。

為什么我的getFollowers函數總是在await塊之前返回?

require('dotenv').config();

const Twitter = require('twitter');
 
const client = new Twitter({
  consumer_key: process.env.API_KEY,
  consumer_secret: process.env.API_KEY_SECRET,
  access_token_key: process.env.ACCESS_TOKEN,
  access_token_secret: process.env.ACCESS_TOKEN_SECRET
});
 
const getFollowers = async (screen_name, count, cursor) => {
    console.log("Cursor: " + cursor);
    const params = {
        screen_name: screen_name,
        count: count,
        cursor: cursor
    };

    const promise = await client.get('followers/list', params)
        .then(data => {
            console.log("This promise is never executed...");
            return data.next_cursor;
        })
        .catch(err => console.error(err));

    return promise;
}

const main = async () => {
    let cursor = -1;
    while (cursor != 0) {
        getFollowers(process.env.SCREEN_NAME, 200, cursor)
            .then(next_cursor => {
                cursor = next_cursor;
                console.log("This promise is never executed either... " + cursor);
            });
    }
}

main();

使用 main() 中的 .then 語句,您不是在等待 client.get() 解析,而是等待 data.next_cursor()。 因此,client.get() 的承諾仍然懸而未決。

相反,將 client.get() 的承諾作為 getFollowers() 中的 a 返回。 這將確保當您在 main() 中調用 getFollowers().then() 時,您指的是 client.get。

編輯:

按照這個問題的答案中的思路,我修改了 getFollowers()。 它現在包含一個承諾,當光標命中值 0 時,該承諾將被解析。每隔一個值,就會發出一個請求。

但我對請求的速率限制感到擔憂,該限制設置為每 15 分鍾 15 個。 由於對每個非 0 next_cursor 值都會發出一個新請求,因此對於擁有許多關注者的帳戶,您很快就會達到此限制。

另請注意,檢索到的數據將存儲在數組中。 我不確定您的用例到底是什么。

const Twitter = require('twitter');

const client = new Twitter({
    consumer_key: '',
    consumer_secret: '',
    bearer_token: ''
});

let output = [];

const getFollowers = (screen_name, count) => {
    let cursor = -1;

    const params = {
        screen_name: screen_name,
        count: count,
        cursor: cursor
    };

    return new Promise((resolve, reject) => {
        client.get('followers/list', params, function getData(err, data, response) {
            if (err) reject(response.body);
            output.push(data);
            cursor = data.next_cursor;
            
            if (cursor > 0) {
                client.get('followers/list', params, getData);
            }
            if (cursor = 0) {
                resolve('done');
            }
        });    
    });
};

const main = async () => {
   await getFollowers('MozDevNet', 200);
   console.log(output);

};

我放棄了使用Twitter包的實現,轉而使用axios

require('dotenv').config();

const axios = require('axios');

const credentials = {
    consumer_key: process.env.API_KEY,
    consumer_secret: process.env.API_KEY_SECRET,
    access_token_key: process.env.ACCESS_TOKEN,
    access_token_secret: process.env.ACCESS_TOKEN_SECRET
};

const FOLLOWERS_LIST_ENDPOINT = "https://api.twitter.com/1.1/followers/list.json";

//documentation: https://developer.twitter.com/en/docs/authentication/oauth-2-0/application-only
const generateToken = async () => {
    return process.env.BEARER_TOKEN;
}

//documentation: https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-followers-list
const getFollowers = async (screen_name, count, cursor) => {
    let token = await generateToken();
    let requestConfig = {
        params: {
            screen_name: screen_name,
            count: count,
            cursor: cursor,
            include_user_entities: false
        },
        headers: { 
            Authorization: `Bearer ${token}` 
        }
    };
    let response = await axios.get(FOLLOWERS_LIST_ENDPOINT, requestConfig);
    let users = response.data.users;
    processUsers(users);
    return response.data.next_cursor;
};

const processUsers = (users) => {
    users.map(user => {
        console.log(user.screen_name);
    });
}
const main = async () => {
    let cursor = -1;
    while (cursor != 0) {
        cursor = await getFollowers(process.env.SCREEN_NAME, 200, cursor);
    }
}

main();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM