[英]Node.js Twitter API cursors
我正在使用npm-twit来获取特定帐户的关注者。
Twitter API从单个GET请求返回最多5000个结果。
如果我查询的用户有超过5000个关注者,则返回带有数据的“next_cursor”值。
为了获得接下来的5000个结果,我需要重新运行GET函数,并将“next_cursor”值作为参数传递给它。 我似乎无法弄清楚如何做到这一点。
我在想一个while循环,但是我无法重置全局变量,我认为是因为范围:
var cursor = -1
while ( cursor != 0 ) {
T.get('followers/ids', { screen_name: 'twitter' }, function (err, data, response) {
// Do stuff here to write data to a file
cursor = data["next_cursor"];
})
}
显然我不是JS的天才,所以任何帮助都会非常感激。
您遇到的问题是由于Node.js是异步的 。
T.get('followers/ids', { screen_name: 'twitter' }, function getData(err, data, response) {
// Do stuff here to write data to a file
if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', next_cursor: data['next_cursor'] }, getData);
})
}
请注意:
getData
调用T.get
。 请注意, Do stuff here代码将被执行多次(与下一个游标一样多)。 由于它是递归回调 - 订单是有保证的。
如果你不喜欢递归回调的想法,你可以通过以下方式避免它:
考虑使用一些5K +帐户进行测试。
const T = new Twit(tokens)
function getFollowers (screenName, followers = [], cur = -1) {
return new Promise((resolve, reject) => {
T.get('followers/ids', { screen_name: screenName, cursor: cur, count: 5000 }, (err, data, response) => {
if (err) {
cur = -1
reject(err)
} else {
cur = data.next_cursor
followers.push(data.ids)
if (cur > 0) {
return resolve(getFollowers(screenName, followers, cur))
} else {
return resolve([].concat(...followers))
}
}
})
})
}
async function getXaqron () {
let result = await getFollowers('xaqron')
return result
}
console.log(getXaqron().catch((err) => {
console.log(err) // Rate limit exceeded
}))
挣扎着这一个..一切似乎都有效,但数据['next_cursor']没有改变,永远!
代码应该是这样的:
T.get('followers/ids', { screen_name: 'twitter' }, function getData(err, data, response) {
// Do stuff here to write data to a file
if(data['next_cursor'] > 0) T.get('followers/ids', { screen_name: 'twitter', cursor: data['next_cursor'] }, getData);
})
}
Twit的参数不是“next_cursor”,它只是“光标”;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.