2015-01-18 6 views
5

나는 특정 계정을 팔로우하는 데 npm-twit을 사용하고 있습니다.Node.js Twitter API 커서

Twitter API는 단일 GET 요청에서 최대 5000 개의 결과를 반환합니다.

내가 쿼리하는 사용자의 팔로어 수가 5000 명이 넘으면 "next_cursor"값이 데이터와 함께 반환됩니다.

다음 5000 개의 결과를 얻으려면 GET 함수를 다시 실행하여 "next_cursor"값을 인수로 전달해야합니다. 나는 그것을하는 방법을 해결할 수없는 것 같습니다. 분명히

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 천재 아니에요, 그래서 어떤 도움이 많이 주시면 감사하겠습니다 :

내가 while 루프를 생각했다,하지만 난 전역 변수를 재설정 할 수 없습니다, 나는 때문에 범위의 생각 .

답변

7

문제는 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); 

    }) 

} 

참고 :

  1. 나는 내부 콜백 함수에 이름을 주었다. 그것은 우리가 내부에서 재귀 적으로 호출 할 수 있도록하기위한 것입니다.
  2. 루프가 재귀 콜백으로 대체되었습니다.
  3. next_cursor 데이터가있는 경우 동일한 함수 getData을 사용하여 T.get을 호출합니다.

(다음 커서 있기 때문에 많은으로) 여기 코드 마십시오 물건이 여러 번 실행된다는 점에 유의해야합니다. 재귀 콜백이므로 주문이 보장됩니다.


당신이 재귀 콜백의 아이디어를 좋아하지 않는 경우에, 당신은에 의해 그것을 피할 수있는 모든 next_cursor 년대 가능하면 사전에 알아내는

  1. 및에 대한 를 사용하여 요청을 생성 고리.
  2. Async과 같은 비동기 도우미 모듈을 사용하십시오 (학습 목적으로 이미 개념에 익숙하지 않은 경우 모듈을 피할 것입니다).
+0

도움을 주셔서 감사합니다. 이것은 나에게 의미가있다.나는 비동기를 조사했지만, 당신이 제안한대로 아마 나 자신보다 앞섰다고 느꼈다. – user1385827

0

이걸로 고생했습니다. 모든 것이 작동하는 것처럼 보였지만, 데이터 [ '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); 

    }) 

} 

매개 변수는 그냥 "커서"이다 "next_cursor"아니다)

1

일부 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 
}))