Node.js Twitter API 游标
Node.js Twitter API cursors
我正在使用 npm-twit 获取特定帐户的关注者。
Twitter API returns 单个 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);
})
}
请注意:
- 我给内部回调函数起了个名字。这样我们就可以从内部递归调用它了。
- 循环替换为递归回调。
- 如果有next_cursor个数据,那么我们用同样的函数调用
T.get
getData
。
请注意,Do stuff here 代码将被执行多次(与下一个游标一样多)。既然是递归回调,顺序是有保证的。
如果您不喜欢递归回调的想法,您可以通过以下方式避免它:
- 尽可能预先找出所有next_cursor,并使用for循环生成请求。
- 或者,使用像 Async 这样的异步辅助模块(尽管出于学习目的,我会避免使用模块,除非你已经精通这个概念)。
在这个问题上苦苦挣扎..一切似乎都正常,但数据['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",它只是 "cursor" ;)
考虑使用一些 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
}))
我正在使用 npm-twit 获取特定帐户的关注者。
Twitter API returns 单个 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);
})
}
请注意:
- 我给内部回调函数起了个名字。这样我们就可以从内部递归调用它了。
- 循环替换为递归回调。
- 如果有next_cursor个数据,那么我们用同样的函数调用
T.get
getData
。
请注意,Do stuff here 代码将被执行多次(与下一个游标一样多)。既然是递归回调,顺序是有保证的。
如果您不喜欢递归回调的想法,您可以通过以下方式避免它:
- 尽可能预先找出所有next_cursor,并使用for循环生成请求。
- 或者,使用像 Async 这样的异步辅助模块(尽管出于学习目的,我会避免使用模块,除非你已经精通这个概念)。
在这个问题上苦苦挣扎..一切似乎都正常,但数据['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",它只是 "cursor" ;)
考虑使用一些 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
}))