2017-02-14 15 views
1

Я создаю приложение для загрузки определенного количества твитов. Я использую node.js и express() в server.js.Как выполнить итерацию client.get из API Twitter с помощью node.js и express

Я создал маршрут app.get('/api/tweets'...), чтобы сохранить данные из API Twitter. Мой код работает хорошо, если я верну 200 твитов. Однако, если мне нужно больше 300 или около того, res.send(data) возвращает только несколько.

Я создал свой код, основанный на моем коде, написанном в Python, который возвращает все твиты разрешенные Twitter API (3.200):

allTweets = [] 
statuses = t.statuses.user_timeline(screen_name = 'user', count=100, include_rts=False) 
allTweets.extend(statuses) 
oldest = allTweets[-1]['id'] - 1 

while len(statuses) > 0: 
    statuses = t.statuses.user_timeline(screen_name = 'user', count=100, max_id=oldest, include_rts=False) 
    allTweets.extend(statuses) 
    oldest = allTweets[-1]['id'] - 1 

Основываясь на этой линии, я писал в JavaScript этот код в server.js :

app.get('/api/tweets', function (req, res) { 
    var standardCount = 200; 
    var params = { 
     screen_name: 'user', 
     count: standardCount, 
     include_rts: false 
    }; 
    var statuses = client.get('statuses/user_timeline', params, function getTweets(error, data) { 
     if (error) { 
      console.log(error) 
     } 
     var tweets = data; 
     var oldest = parseInt((tweets.slice(-1)[0].id_str) - 1); 

     // This attempt works fine using if 
     if (0 < data.length) { 
      params = { 
       screen_name: 'user', 
       count: standardCount, 
       max_id: oldest, 
       include_rts: false 
      } 
      client.get('statuses/user_timeline', params, function getTweets(error, data) { 
       if (error) { 
        console.log(error); 
       } 
       tweets = tweets.concat(data); 
       oldest = parseInt((tweets.slice(-1)[0].id_str) - 1); 
       return res.send(tweets.slice(0, 500))); 
      }); 
     } 
    }); 
}); 

Моя первая попытка была while (0 < data.length), но не вернулся ничего. Я изменил его на if (0 < data.length), однако он возвращает только несколько твитов. Я пробовал:

do { 
    // download tweets 
} 
while (0 < data.length) 

... с неудобством.

Каков наилучший способ итерации client.get с использованием API Twitter для загрузки более 200 твитов?

+0

Я не вижу, где вы можете обновить 'standardCount' быть ничем иным, чем 200. –

+0

@ExplosionPills' параметра count' в 'client.get (статусы/user_timeline) 'задает количество твитов, которые нужно попытаться получить, и не более 200 на отдельный запрос. – estebanpdl

ответ

1

Похоже, вы хотите рекурсивную функцию, чтобы получить набор данных:

function obtainTweets (params, number, offsetId, dataset, callback) { 
    dataset = dataset || [] 
    if (number < 0) return callback(null, dataset) 
    // ... update params 
    return client.get('...', params, (error, data) => { 
    if (error) return callback(error) 
    // .. logic to get new offsetId 
    dataset = dataset.concat(data) 
    return obtainTweets(params, number-200, offsetId, dataset, callback) 
    }) 
} 

Здесь мы определили метод obtainTweets, который принимает params объект, то number твитов вы хотели бы получить, offsetId она должна существовать, то текущий dataset и callback, чтобы разрешить возврат вашего набора данных после завершения итераций.

Каждый раз, когда итерация завершена, мы вычитаем максимальное 200 из числа данного, пока мы не достигнем 0 и callback вызываются, если не возникает ошибка.

Он будет использоваться как так:

obtainTweets({ user: 'some_user' }, 600, null, null, (error, data) => { 
    console.log(error, data) 
}) 
+1

Я сократил и удалил пример обещаний, я хотел бы призвать вас взглянуть на обещания, так как они могут помешать вам запутаться в переполнение стека из большого количества твитов, которые вы хотели бы получить, вы также можете использовать 'nextTick', однако это больше взлома, чем решение. – Nijikokun

+0

Thnaks. Я проверю вашу рекомендацию. Мне нужно выполнить ваш ответ. Лучший. – estebanpdl

 Смежные вопросы

  • Нет связанных вопросов^_^