2015-01-18 8 views
5

मैं एक विशिष्ट खाते के अनुयायियों को प्राप्त करने के लिए npm-twit का उपयोग कर रहा हूं।Node.js ट्विटर एपीआई कर्सर

ट्विटर एपीआई एक जीईटी अनुरोध से 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"]; 

    }) 

} 

जाहिर है मैं एक जे एस प्रतिभाशाली नहीं हूँ, इसलिए किसी भी मदद की बहुत सराहना की जाएगी ।

उत्तर

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. यदि कोई अगला_cursor डेटा है, तो हम उसी कार्य getData का उपयोग करके T.get पर कॉल करते हैं।

ध्यान रखें कि Do यहाँ कोड सामान कई बार (के रूप में वहाँ अगले कर्सर हैं कई के रूप में) निष्पादित किया जाएगा। चूंकि यह रिकर्सिव कॉलबैक है - ऑर्डर की गारंटी है।


आप पुनरावर्ती कॉलबैक का विचार पसंद नहीं है, तो आप से यह बच सकते हैं: पहले से पता लगाना सभी 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 
})) 
संबंधित मुद्दे