【问题标题】:Twitter API cursor navigation with Async node.js使用异步 node.js 进行 Twitter API 光标导航
【发布时间】:2020-09-14 16:26:22
【问题描述】:

我正在尝试使用 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();

【问题讨论】:

    标签: javascript node.js twitter async-await


    【解决方案1】:

    使用 main() 中的 .then 语句,您无需等待 client.get() 解析,而是等待 data.next_cursor()。因此,client.get() 的承诺仍然悬而未决。

    相反,在 getFollowers() 中返回 client.get() 的承诺。这将确保当您在 main() 中调用 getFollowers().then() 时,您指的是 client.get。

    编辑:

    按照question 中答案的思路,我修改了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);
    
    };
    

    【讨论】:

    【解决方案2】:

    我放弃了使用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();
    

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 2015-07-02
      • 2014-04-29
      • 2015-03-16
      • 2021-05-11
      • 2016-12-12
      • 2019-01-16
      • 1970-01-01
      • 2014-10-19
      相关资源
      最近更新 更多