2017-01-11 4 views
4

Я получаю твиты, используя LINQ to Twitter 4.1.0 с конкретным хэштегом. Но проблема, с которой я столкнулась, заключается в том, что я получаю только 600 твитов. Я хочу получить твиты, которые старше нескольких месяцев. Может ли кто-нибудь мне предложить, как это сделать?Как получить твиты старше нескольких месяцев?

[List<Search> searchResultsList = new List<Search>(); 
     ulong lastId = 0; 
     var context = new TwitterContext(auth); 
     int count = 0; 
     int maxNumberToFind = 1000; 
     var dateFrom = DateTime.Now.AddDays(-20); 

     var searchResults = 
         (from search in context.Search 
          where search.Type == SearchType.Search && 
           search.Query == Query && 
           search.SinceID == 2016-12-11 &&         
           search.Count == 150 && 
           search.ResultType == ResultType.Recent && 
           search.IncludeEntities == true 
          select search).ToList();][1] 
+0

Я понятия не имею, но вы пытались изменить search.SinceID? – hellogoodnight

+0

Вы пытаетесь указать диапазон дат для получения твитов? –

+0

Каково использование переменной dateFrom в вашем коде? – hellogoodnight

ответ

2

Я хотел бы предложить, глядя на documentation Похоже, вы можете указать "до" даты и MaxId:

До: Tweets до этой даты, YYYY-MM-DD. (строка)

MaxID: вернуть твиты до или после этого идентификатора. (ulong)

Я бы запросил дату «до» и получил последний твит, используя «LastOrDefault()» LINQ. Затем выполните другой запрос, используя идентификатор этого объекта в качестве MaxID следующего запроса. Это должно получить все твиты до определенной даты, как вы просили.

Также важно отметить этот параметр:

Count Количество твитов для получения для каждой страницы. Max is 100. (int)

Это может иметь какое-то отношение к ограниченному количеству твитов, которые вы получаете.

EDIT:This post от Joe Mayo (создатель LinqToTwitter) также может быть вам полезен. Вот код (отказ от ответственности: я не проверял это, но вы получите идею):

List<Search> searchResultsList = new List<Search>(); 
    var context = new TwitterContext(auth); 
    var maxCount = 100; 
    var untilDate = new DateTime(2016,12,11); 

    var lastTweetInRange = 
        (from search in context.Search 
         where search.Type == SearchType.Search && 
          search.Query == Query &&        
          search.Count == maxCount && 
          search.Until == untilDate && 
          search.IncludeEntities == true 
         select search).LastOrDefault(); 

    var tweetsInRange = (from search in context.Search 
         where search.Type == SearchType.Search && 
           search.Query == Query &&        
           search.Count == maxCount && 
           search.MaxId == lastTweetInRange.id && 
           search.IncludeEntities == true 
         select search).ToList(); 
+0

Спасибо большое: :) – Ranjana

+0

@Ranjana, я обновил код. Я не тестировал его, но он должен помочь визуализировать то, что я описываю :) –

+0

Спасибо за ваш ответ. Я догадываюсь об ошибке. https://i.stack.imgur.com/NZ6mU.png – Ranjana

1

Вы можете также рассмотреть вопрос о постраничном поиске. Вот демо:

static async Task DoPagedSearchAsync(TwitterContext twitterCtx) 
    { 
     const int MaxSearchEntriesToReturn = 100; 

     string searchTerm = "twitter"; 

     // oldest id you already have for this search term 
     ulong sinceID = 1; 

     // used after the first query to track current session 
     ulong maxID; 

     var combinedSearchResults = new List<Status>(); 

     List<Status> searchResponse = 
      await 
      (from search in twitterCtx.Search 
      where search.Type == SearchType.Search && 
        search.Query == searchTerm && 
        search.Count == MaxSearchEntriesToReturn && 
        search.SinceID == sinceID 
      select search.Statuses) 
      .SingleOrDefaultAsync(); 

     combinedSearchResults.AddRange(searchResponse); 
     ulong previousMaxID = ulong.MaxValue; 
     do 
     { 
      // one less than the newest id you've just queried 
      maxID = searchResponse.Min(status => status.StatusID) - 1; 

      Debug.Assert(maxID < previousMaxID); 
      previousMaxID = maxID; 

      searchResponse = 
       await 
       (from search in twitterCtx.Search 
       where search.Type == SearchType.Search && 
         search.Query == searchTerm && 
         search.Count == MaxSearchEntriesToReturn && 
         search.MaxID == maxID && 
         search.SinceID == sinceID 
       select search.Statuses) 
       .SingleOrDefaultAsync(); 

      combinedSearchResults.AddRange(searchResponse); 
     } while (searchResponse.Any()); 

     combinedSearchResults.ForEach(tweet => 
      Console.WriteLine(
       "\n User: {0} ({1})\n Tweet: {2}", 
       tweet.User.ScreenNameResponse, 
       tweet.User.UserIDResponse, 
       tweet.Text)); 
    } 

Я написал сообщение в блоге некоторое время назад, чтобы объяснить, в общем, как это работает:

Working with Timelines with LINQ to Twitter

Это немного старый и не включает в себя синтаксис асинхронной, но делает объясните SinceID, MaxID и методы. Twitter также имеет хорошую документацию, объясняя, как и почему их стратегии подкачки:

Working with Timelines (Twitter)

С учетом сказанного, Twitter API делает предел, как далеко вы можете пойти с поисками. В разделе The Search API, Best Practices они описывают, что они вернутся только через 6-9 дней.

+0

Yup thnx много .. Но я получаю твиты только за 10 дней .. Не более того .. Coz, этот api не дает гибкости для получения исторических данных. – Ranjana

+1

Чтобы быть ясным - ограничение от API Twitter а не эту или любую другую библиотеку. –

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