Search code examples
c#twitterlinq-to-twitter

How to get more tweet from a user using LINQ to Twitter


It clearly state that it allows to get up to 3200 tweets per person (see documentation). But using this code:

var statusTweets =
      from tweet in twitterCtx.Status
      where tweet.Type == StatusType.User
      && tweet.ScreenName == "JoeMayo"
      select tweet;

statusTweets.ToList().ForEach(
      tweet => Console.WriteLine(
      "Name: {0}, Tweet: {1}\n",
      tweet.User.Name, tweet.Text));

it gives me the first 20 tweets only, also you can't apply cursor movement using this code. Does anyone have a LINQ To Twitter code that allows me to fetch as many tweets as possible?


Solution

  • To fetch tweets from Twitter we can get by 2 ways:

    using Hastag and ScreenName

    I created one custom method where you can get 3200 tweets in one request.

    public void GetTwitterFeeds(dynamic settings, bool ishashtag, DateTime startDate, DateTime endDate)
            {
                string screenname = settings.socialFetchTerm.ToString();
                var auth = new SingleUserAuthorizer
                {
                    Credentials = new InMemoryCredentials
                    {
                        ConsumerKey = AppSettings.ConsumerKey,
                        ConsumerSecret = AppSettings.ConsumerSecret,
                        OAuthToken = AppSettings.AccessToken,
                        AccessToken = AppSettings.AccessTokenSecret
                    }
                };
                var twitterCtx = new TwitterContext(auth);
    
                var ownTweets = new List<Status>();
                ulong sinceId = 0;
                ulong maxID = 0;
                int lastStatusCount = 0;
                bool flag = true;
                var statusResponse = new List<Status>();
                if (!ishashtag)
                {
    
                    statusResponse = (from tweet in twitterCtx.Status
                                      where tweet.Type == StatusType.User
                                            && tweet.ScreenName == screenname
                                            && tweet.Count == 200
                                            && (tweet.CreatedAt >= startDate && tweet.CreatedAt <= endDate)
                                      select tweet).ToList();
                }
                else
                {
                    statusResponse = (from search in twitterCtx.Search
                                      where search.Type == SearchType.Search &&
                                            search.Query == screenname
                                            && search.Count == 200
                                      from Status status in search.Statuses
                                      where (status.CreatedAt >= startDate && status.CreatedAt <= endDate)
                                      select status
                        ).ToList();
                }
                if (statusResponse.Count > 0)
                {
                    maxID = ulong.Parse(statusResponse.First().StatusID);
                    ownTweets.AddRange(statusResponse);
                }
                do
                {
                    int rateLimitStatus = twitterCtx.RateLimitRemaining;
    
                    if (rateLimitStatus != 0)
                    {
                        if (ishashtag)
                        {
    
                                statusResponse = (from search in twitterCtx.Search
                                                  where search.Type == SearchType.Search &&
                                                        search.Query == screenname
                                                        && search.Count ==200
                                                  from Status status in search.Statuses
                                                  where
                                                      (status.CreatedAt >= startDate && status.CreatedAt <= endDate) &&
                                                      status.SinceID == sinceId && status.MaxID == maxID
                                                  select status
                                    ).ToList();
    
    
    
                                lastStatusCount = statusResponse.Count;
    
                                if (lastStatusCount != 0)
                                {
                                    maxID = ulong.Parse(statusResponse.Last().StatusID) - 1;
    
                                    ownTweets.AddRange(statusResponse);
                                }
                                else
                                {
                                    flag = false;
                                }
                        }
    
                        else
                        {
    
                                statusResponse = (from tweet in twitterCtx.Status
                                                  where tweet.Type == StatusType.User
                                                        && tweet.ScreenName == screenname
                                                        && tweet.SinceID == sinceId && tweet.MaxID == maxID
                                                        && tweet.Count == 200 
                                                        && (tweet.CreatedAt >= startDate && tweet.CreatedAt <= endDate)
                                                  select tweet).ToList();
    
    
                                lastStatusCount = statusResponse.Count;
    
                                if (lastStatusCount != 0)
                                {
                                    maxID = ulong.Parse(statusResponse.Last().StatusID) - 1;
    
                                    ownTweets.AddRange(statusResponse);
                                }
                                else
                                {
                                    flag = false;
                                }
                            }
                    }
                    else
                    {
                        flag = false;
                    }
    
                } while (flag);
    
                foreach (var tweetStatus in ownTweets)
                {
                    if (tweetStatus != null)
                    {
                        var socialSiteData = new SocialSitesData
                        {
                            //  SocialType = SocialType.Twitter,
    
                            SocialType = settings.socialType,
                            SocialSubType = settings.socialSubType,
                            SocialFetchTerm = settings.socialFetchTerm,
                            PostId = tweetStatus.StatusID,
                            Post = tweetStatus.Text,
                            PostUrl = "https://twitter.com/" + tweetStatus.ScreenName + "/status/" + tweetStatus.StatusID,
                            ImageSource =
                                tweetStatus.Entities.MediaEntities.Count > 0
                                    ? tweetStatus.Entities.MediaEntities[0].MediaUrl
                                    : "",
                            VideoSource =
                                tweetStatus.Entities.UrlEntities.Count > 0
                                    ? tweetStatus.Entities.UrlEntities[0].ExpandedUrl
                                    : "",
                            PostTime = tweetStatus.CreatedAt,
                        };
                        if (!_socialHubCrudDal.IsSocialSiteDataExists(tweetStatus.StatusID))
                            _socialHubCrudDal.AddSocialSiteData(socialSiteData);
                    }
                }
            }