private static IList<Status> Load(IQueryBuilder queryBuilder, ulong maxId, int count = 2000) { var statuses = new List<Status>(); //todo limit exception System.AggregateException, message: Rate limit exceeded - Please visit the LINQ to Twitter FAQ (at the HelpLink) for help on resolving this error. var tweetQuery = queryBuilder.BuildTaskByMinId(maxId + 1).ToList(); statuses.AddRange(tweetQuery); if (statuses.Count < 150) { return statuses; } while (statuses.Count < count) { tweetQuery = queryBuilder.BuildTaskByMinIdAndMaxId(maxId + 1, statuses[statuses.Count - 1].StatusID - 1).ToList(); statuses.AddRange(tweetQuery); if (tweetQuery.Count < 150) { break; } } return statuses; }
public static async Task<List<User>> ShowFriends(IAuthorizer auth, string login) { var users = new List<User>(); var twitterCtx = new TwitterContext(auth); Friendship friendship; long cursor = -1; do { friendship = await twitterCtx.Friendship.Where(x => x.Type == FriendshipType.FriendsList && x.ScreenName == login && x.Cursor == cursor && x.Count == 200 && x.IncludeUserEntities == false) .SingleOrDefaultAsync(); if (friendship != null && friendship.Users != null && friendship.CursorMovement != null) { cursor = friendship.CursorMovement.Next; users.AddRange(friendship.Users); } } while (cursor != 0); return users; }
public static List<string> GetTopTags(List<ListRank> llr) { //so in here we choose which results to return based ontheir rank and number // faster to return them before going though every search but can build in the skip later. List<string> r = new List<string>(); foreach (ListRank lr in llr) { // logic goes in here once we have it. r.AddRange(lr.result); } return r; }
/// <summary> /// shows how to query all followers /// </summary> /// <remarks> /// uses the Page property because Twitter doesn't /// return all followers in a single call; you /// must page through results until you get all /// </remarks> /// <param name="twitterCtx">TwitterContext</param> private static void GetAllFollowersQueryDemo(TwitterContext twitterCtx) { // // Paging has been deprecated for Friends and Followers // Please use cursors instead // var followerList = new List<User>(); List<User> followers = new List<User>(); int pageNumber = 1; do { followers.Clear(); followers = (from follower in twitterCtx.User where follower.Type == UserType.Followers && follower.ScreenName == "JoeMayo" && follower.Page == pageNumber select follower) .ToList(); pageNumber++; followerList.AddRange(followers); } while (followers.Count > 0); Console.WriteLine("\nFollowers: \n"); foreach (var user in followerList) { var status = user.Protected || user.Status == null ? "Status Unavailable" : user.Status.Text; Console.WriteLine( "Name: {0}, Last Tweet: {1}\n", user.Name, status); } Console.WriteLine("\nFollower Count: {0}\n", followerList.Count); }
public TwitterModule() : base("/infoscreen/tweets") { Get["/{q}"] = args => { string query = args.q.HasValue ? args.q : "#sølvberget"; var auth = new SingleUserAuthorizer { Credentials = new InMemoryCredentials { ConsumerKey = "a8SsPWed3GyxkFjnUh8vMA", ConsumerSecret = "oN5p9jfXzVKVl107Txb2miOCebmX9pcERLssmxjM", AccessToken = "4utDqnqoIBXIPi0TAtud1648QF2uC3hV5VRs6mNfYCyPT", // access token secret OAuthToken = "14460916-ENyyzjPyZF4RfrtV3GK2Z44w9AE5ttLKWQs582SS1" // access token } }; var twitter = new TwitterContext(auth); var searchResponse = (from search in twitter.Search where search.Type == SearchType.Search && search.Query == query select search).FirstOrDefault(); var tweets = new List<TweetDto>(); if (searchResponse != null) { tweets.AddRange(searchResponse.Statuses.Where(t => !t.PossiblySensitive).Select(tweet => new TweetDto { Text = tweet.Text, Username = tweet.User.Name, UserProfileImageUrl = tweet.User.ProfileImageUrl, MediaUrl = tweet.Entities.MediaEntities.Count > 0 ? tweet.Entities.MediaEntities.First().MediaUrl + ":large" : null })); } return Response.AsJson(tweets); }; }
//Gets tweets asynchronously public static async Task GetSearchTweetsAsync(string twitterAccountToDisplay, ulong sinceID) { try { var twitterCtx = GetContext(); //string twitterAccountToDisplay = "Linq2Twitr"; int count = 5; int maxStatuses = 30; int lastStatusCount = 0; //last tweet processed on previous query set //ulong sinceID = 544516702412723892; ulong maxID; var statusList = new List<Status>(); //only count var searchResponse = await (from search in twitterCtx.Search where search.Type == SearchType.Search && search.Query == "from:@" + twitterAccountToDisplay + " -retweets" && // -filter:retweets // -RT until:2012-10-26 search.Count == count select search) .SingleOrDefaultAsync(); if (searchResponse != null && searchResponse.Statuses != null) { List<Status> newStatuses = searchResponse.Statuses; // first tweet processed on current query maxID = newStatuses.Min(status => status.StatusID) - 1; statusList.AddRange(newStatuses); //adding if condition to fix Error : LinqToTwitter.TwitterQueryException: Missing or invalid url parameter //as SinceID is greater than MaxID, which is wrong according to the query. if (sinceID < maxID) { do { // now add sinceID and maxID searchResponse = await (from search in twitterCtx.Search where search.Type == SearchType.Search && search.Query == "from:@" + twitterAccountToDisplay + " -retweets" && // -filter:retweets // -RT search.Count == count && //search.Until == new DateTime(2014,12,1) && search.SinceID == sinceID && search.MaxID == maxID select search) .SingleOrDefaultAsync(); //.ToList(); if (searchResponse == null) break; if (searchResponse.Count > 0 && searchResponse.Statuses.Count > 0) { newStatuses = searchResponse.Statuses; // first tweet processed on current query maxID = newStatuses.Min(status => status.StatusID) - 1; statusList.AddRange(newStatuses); lastStatusCount = newStatuses.Count; } if (searchResponse.Count > 0 && searchResponse.Statuses.Count == 0) { lastStatusCount = 0; } } while (lastStatusCount != 0 && statusList.Count < maxStatuses); //(searchResponse.Count != 0 && statusList.Count < 30); } //searchResponse.Statuses.ForEach(tweet => Console.WriteLine( "User: {0}, Tweet: {1}", tweet.User.ScreenNameResponse, tweet.Text)); var tweetsOnlyList = from status in statusList //searchResponse.Statuses //Exclude replies and retweets where status.InReplyToScreenName == null && status.IncludeMyRetweet == false select new Status() { Text = status.Text, ScreenName = status.User.ScreenNameResponse, StatusID = status.StatusID, CreatedAt = status.CreatedAt //ProfileImageUrlHttps = status.ProfileImageUrlHttps }; //To display Tweets //foreach (var tweet in tweetsOnlyList) //{ // Console.WriteLine("User: {0},\n Tweet: {1},\n maxID: {2},\n CreatedAt: {3}\n", // tweet.ScreenNameResponse, // tweet.Text, // tweet.StatusID, // tweet.CreatedAt); //} //Set Tweets to Database SetTweetsOnly(tweetsOnlyList); } } catch (Exception ex) { Console.WriteLine("Error : " + ex); } }
public static List<Tweet> Get(string screenname, ulong maxStatusID) { int fetchMultiplier = int.Parse( !string.IsNullOrEmpty(ConfigurationManager.AppSettings["FetchMultiplier"]) ? ConfigurationManager.AppSettings["FetchMultiplier"] : "10"); List<string> screenNames = new List<string>(); screenNames.AddRange(TwitterModel.Instance.GetRelevantScreenNames(screenname)); List<Tweet> tweets = new List<Tweet>(); screenNames.ForEach(name => { var t = Repository<Tweet>.Instance.Query(name + TwitterModel.TWEETS); if (t != null) tweets.AddRange(t); }); if (tweets != null) tweets = tweets.OrderByDescending(t => t.Status.CreatedAt).ToList(); if (tweets == null || tweets.Count() < 5 || !tweets.Select(t => t.Status.CreatedAt).IsWithinAverageRecurrenceInterval(multiplier: fetchMultiplier)) { var lastStatusID = (tweets != null && tweets.Count() > 0) ? ulong.Parse(tweets.First().Status.StatusID) : 0; var user = UsersCollection.Single(screenname) ?? UsersCollection.PrimaryUser(); if (user.CanAuthorize) { try { Expression<Func<Status, bool>> where; if (maxStatusID > 0 && lastStatusID > 0) where = (s => s.MaxID == maxStatusID && s.SinceID == lastStatusID && s.ScreenName == screenname && s.IncludeEntities == true && s.Type == StatusType.User && s.Count == 50); else if (lastStatusID > 0) where = (s => s.SinceID == lastStatusID && s.ScreenName == screenname && s.IncludeEntities == true && s.Type == StatusType.Home && s.Count == 200); else where = (s => s.ScreenName == screenname && s.IncludeEntities == true && s.Type == StatusType.Home && s.Count == 200); var statuses = TwitterModel.Instance.GetAuthorizedTwitterContext(user.TwitterScreenName) .Status .Where(where) .ToList(); List<Tweet> results; if (statuses != null && statuses.Count > 0) results = statuses.Select(s => new Tweet(s)).ToList(); else results = null; return results; } catch { return null; } } } return null; }
private List<Status> GetAllTweets(ulong sinceId = 0) { var allTweets = new List<Status>(); using (var twitter = new TwitterContext(Auth)) { foreach (var u in Users) { ulong localSince = sinceId; int lastCount = 199; var oldestId = ulong.MaxValue; while (lastCount > 1) { IQueryable<Status> statusTweets = twitter.Status.Where(tweet => tweet.Type == StatusType.User && tweet.ScreenName == u && tweet.IncludeMyRetweet == true && tweet.ExcludeReplies == false && tweet.Count == 199); if (oldestId != ulong.MaxValue && sinceId == 0) statusTweets = statusTweets.Where(t => t.MaxID == oldestId); if (sinceId != 0) statusTweets = statusTweets.Where(t => t.SinceID == localSince); if (statusTweets != null) { var returned = statusTweets.ToList(); if (!returned.Any()) break; lastCount = returned.Count(); localSince = returned.Max(t => ulong.Parse(t.StatusID)); oldestId = returned.Min(t => ulong.Parse(t.StatusID)); returned.RemoveAt(returned.Count - 1); allTweets.AddRange(returned); } else { lastCount = 0; } } } } return allTweets.Where(t => t.CreatedAt > new DateTime(2015,01,01)).OrderByDescending(s =>s.StatusID).ToList(); }
static async Task ShowFavoritesAsync(TwitterContext twitterCtx) { const int PerQueryFavCount = 200; // set from a value that you previously saved ulong sinceID = 1; var favsResponse = await (from fav in twitterCtx.Favorites where fav.Type == FavoritesType.Favorites && fav.Count == PerQueryFavCount select fav) .ToListAsync(); if (favsResponse == null) { Console.WriteLine("No favorites returned from Twitter."); return; } var favList = new List<Favorites>(favsResponse); // first tweet processed on current query ulong maxID = favList.Min(fav => fav.StatusID) - 1; do { favsResponse = await (from fav in twitterCtx.Favorites where fav.Type == FavoritesType.Favorites && fav.Count == PerQueryFavCount && fav.SinceID == sinceID && fav.MaxID == maxID select fav) .ToListAsync(); if (favsResponse == null || favsResponse.Count == 0) break; // reset first tweet to avoid re-querying the // same list you just received maxID = favsResponse.Min(fav => fav.StatusID) - 1; favList.AddRange(favsResponse); } while (favsResponse.Count > 0); favList.ForEach(fav => { if (fav != null && fav.User != null) Console.WriteLine( "Name: {0}, Tweet: {1}", fav.User.ScreenNameResponse, fav.Text); }); // save this in your db for this user so you can set // sinceID accurately the next time you do a query // and avoid querying the same tweets again. ulong newSinceID = favList.Max(fav => fav.SinceID); }
public static void UpdateStatus() { Login(); OnStatusUpdating(EventArgs.Empty); var status = new List<DGStatus>(); IOrderedEnumerable<DGStatus> newStatus = null; try { for (int i = 0; i < Contexts.Count; i++) { var query = from t in Contexts[i].Status where t.Type == StatusType.Home && t.CreatedAt >= s_lastStatusUpdating select new DGStatus(t, Accounts[i]); status.AddRange(query); } newStatus = status.Distinct(new StatusEqualityComparer()).OrderBy(s => s.CreatedAt); } catch (Exception ex) { OnStatusUpdateFailed(new StatusUpdateFailedEventArgs(ex)); return; } s_lastStatusUpdating = DateTime.UtcNow; foreach (var s in newStatus) { OnStatusReceived(new StatusEventArgs(s)); } OnStatusUpdated(new StatusUpdatedEventArgs(newStatus.ToArray())); }
static async Task GetListStatusesAsync(TwitterContext twitterCtx) { string ownerScreenName = "Linq2Twitr"; string slug = "linq"; int maxStatuses = 30; int lastStatusCount = 0; // last tweet processed on previous query ulong sinceID = 204251866668871681; ulong maxID; int count = 10; var statusList = new List<Status>(); // only count var listResponse = await (from list in twitterCtx.List where list.Type == ListType.Statuses && list.OwnerScreenName == ownerScreenName && list.Slug == slug && list.Count == count select list) .SingleOrDefaultAsync(); if (listResponse != null && listResponse.Statuses != null) { List<Status> newStatuses = listResponse.Statuses; // first tweet processed on current query maxID = newStatuses.Min(status => status.StatusID) - 1; statusList.AddRange(newStatuses); do { // now add sinceID and maxID listResponse = await (from list in twitterCtx.List where list.Type == ListType.Statuses && list.OwnerScreenName == ownerScreenName && list.Slug == slug && list.Count == count && list.SinceID == sinceID && list.MaxID == maxID select list) .SingleOrDefaultAsync(); if (listResponse == null) break; newStatuses = listResponse.Statuses; // first tweet processed on current query maxID = newStatuses.Min(status => status.StatusID) - 1; statusList.AddRange(newStatuses); lastStatusCount = newStatuses.Count; } while (lastStatusCount != 0 && statusList.Count < maxStatuses); for (int i = 0; i < statusList.Count; i++) { Status status = statusList[i]; Console.WriteLine("{0, 4}. [{1}] User: {2}\nStatus: {3}", i + 1, status.StatusID, status.User.Name, status.Text); } } }
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)); }
public List<Status> UserTweets(string inUserName_) { List<Status> statusList = new List<Status>(from tweet in _twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == inUserName_ && tweet.Count == AMT_TWEET_QUERY && tweet.RetweetedStatus.StatusID == 0 select tweet); ulong maxID = statusList[statusList.Count - 1].StatusID; int prevCount = statusList.Count; while (prevCount > 1) { if (statusList.Count > AMT_MAX_TWEETS) break; List<Status> tmp = (from tweet in _twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == inUserName_ && tweet.Count == AMT_TWEET_QUERY && tweet.RetweetedStatus.StatusID == 0 && tweet.MaxID == maxID select tweet).ToList(); if (tmp.Count == 1) break; statusList.AddRange(tmp); maxID = tmp[tmp.Count - 1].StatusID; } return statusList; }
private List<Status> GetAllTweets(ulong sinceId = 0) { var allTweets = new List<Status>(); using (var twitter = new TwitterContext(Auth)) { int lastCount = 199; var oldestId = ulong.MaxValue; while (lastCount > 1) { IQueryable<Status> statusTweets = twitter.Status.Where(tweet => tweet.Type == StatusType.User && tweet.ScreenName == UserName && tweet.IncludeMyRetweet == true && tweet.ExcludeReplies == false && tweet.Count == 199); if (oldestId != ulong.MaxValue) statusTweets = statusTweets.Where(t => t.MaxID == oldestId); if (sinceId != 0) statusTweets = statusTweets.Where(t => t.SinceID == sinceId); if (statusTweets != null) { var returned = statusTweets.ToList(); if (!returned.Any()) break; lastCount = returned.Count(); oldestId = returned.Min(t => ulong.Parse(t.StatusID)); returned.RemoveAt(returned.Count - 1); allTweets.AddRange(returned); } else { lastCount = 0; } } } return allTweets.Distinct().ToList(); }
public List<string> GetRelevantScreenNames(string screenname) { var screenNames = new List<string> { screenname.ToLower() }; if (UsersCollection.Single(screenname) != null && UsersCollection.Single(screenname).IncludeFriends) screenNames.AddRange((Friends(screenname) ?? new List<Tweep>()).Where(f => f.Type != Tweep.TweepType.Follower).Select(f => f.User.Identifier.ScreenName.ToLower())); return screenNames; }
protected void Button1_Click(object sender, EventArgs e) { var auth = new WebAuthorizer { Credentials = new SessionStateCredentials() }; var twitterCtx = new TwitterContext(auth); ///////////////////////////////// ///// get this user's tweets //// string name = TextBoxUser.Text; //twt.getScreenName(); //"mishari11"; ///////////////////////////////// ///////////////////////////////// ////// show token and secret and Screen Name in page Label1.Text = twt.getToken(); Label2.Text = twt.getTokenSecret(); Label4.Text = twt.getTwitterID(); //// 111111111111111111111111111111111111111111111111111111111 /// first API requst before the while loop to get the "maxID" var statusTweets = from tweet in twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == name /// get this user's tweets && tweet.Count == 200 /// number of tweets to retrieve in single requst // max is 200 && tweet.ExcludeReplies == true /// do not show replies && tweet.IncludeMyRetweet == false /// do not show my retweet && tweet.IncludeRetweets == false /// do not show other pepole retweet select tweet; ////// (ahmed) this is for the userID for each tweet i do not if you need it or not (you wrote it) //var test3 = statusTweets.Select(tweet => tweet.UserID).ToArray(); //List<String> test10 = new List<string>(); //test10.AddRange(test3); ////// store tweets and RTConut in var var tmepTweet = statusTweets.Select(tweet => tweet.Text).ToArray(); var tempRetweetCount = statusTweets.Select(tweet => tweet.RetweetCount).ToArray(); ///// add tweet and RTCount to temp lists List<String> lstTempTweet = new List<string>(); lstTempTweet.AddRange(tmepTweet); List<int> lstTempRTCount = new List<int>(); lstTempRTCount.AddRange(tempRetweetCount); //// to store the Status that retrieve each time from the API (Status conteant evry thing about the tweet "text" "RTCount" etc..) var statusList = new List<Status>(); ; //// 22222222222222222222222222222222222222222222222222222 //// the rest of APT requsts (up to 3200 tweets including replies and retweets) int intcall = 1; // counter for number of requst to twitter API while (statusTweets.Count() != 0) { //// get the ID of last tweet retrieved -1 ulong maxID = statusTweets.Min(status => ulong.Parse(status.StatusID)) - 1; statusTweets = from tweet in twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == name /// get this user's tweets && tweet.Count == 200 /// number of tweets to retrieve in single requst // max is 200 && tweet.ExcludeReplies == true /// do not show replies && tweet.IncludeMyRetweet == false /// do not show my retweet && tweet.IncludeRetweets == false /// do not show other pepole retweet && tweet.MaxID == maxID /// retrieve before this ID select tweet; //// store the Status and add 1 to requst counter statusList.AddRange(statusTweets); intcall++; } /// end while loop ////// store tweets and RTConut in var tmepTweet = statusList.Select(tweet => tweet.Text).ToArray(); tempRetweetCount = statusList.Select(tweet => tweet.RetweetCount).ToArray(); ///// add tweet and RTCount to temp lists lstTempTweet.AddRange(tmepTweet); lstTempRTCount.AddRange(tempRetweetCount); //// add tweet and RTCount twtUser object "twt" twt.setLstTwts(lstTempTweet); twt.setLstTwtsRT(lstTempRTCount); ///////////// print all tweets /////////////////////////////// List<String> tempTWT = new List<string>(); tempTWT = twt.getarrTwts(); List<int> tempRT = new List<int>(); tempRT = twt.getarrTwtsRT(); for (int k = 0; k < tempTWT.Count; k++) { classes.DBConnection NewConnection = new classes.DBConnection(); NewConnection.AddTweetInDB(tempTWT[k], " ", TextBoxUser.Text, " "); TextBox3.Text += tempTWT[k] + "\n\n" + "#RT: " + tempRT[k] + "\n\n-----------------------------------------------------\n"; } Label3.Text = tempTWT.Count.ToString(); Label11.Text = intcall.ToString(); var lists = (from list in twitterCtx.List where list.Type == ListType.Lists && list.ScreenName == twt.getScreenName() select list) .ToList(); TextBox1.Text = ""; TextBox2.Text = ""; foreach (var list in lists) { TextBox1.Text = TextBox1.Text + " " +list.ListIDResult+" - " + list.SlugResult + " - " + list.Description + "\n"; } //--------------------------------- foreach (var Mylists in lists) { var lists1 = (from list in twitterCtx.List where list.Type == ListType.Members && //list.ListID == "88244464" list.ListID == Mylists.ListIDResult select list).First(); TextBox2.Text = TextBox2.Text + "\n" + Mylists.SlugResult + "( " + Mylists.Description + " ) " + " : " + "\n"; //TextBox2.Text = lists1.Users.First().Name.ToString();//(i).Users.ToList(); foreach (var UsersOfList in lists1.Users) { TextBox2.Text = TextBox2.Text + UsersOfList.Identifier.ID + " - " + UsersOfList.Name.ToString() + "\n"; } } //----------------------------------- end }
protected IList<Status> LoadStatuses(IQueryBuilder queryBuilder, ulong maxId, int count = 3200) { try { var statuses = new List<Status>(); var tweetQuery = queryBuilder.BuildTaskByMaxId(maxId).ToList(); statuses.AddRange(tweetQuery); while (statuses.Count < count) { tweetQuery = queryBuilder.BuildTaskByMaxId(statuses[statuses.Count - 1].StatusID - 1).ToList(); statuses.AddRange(tweetQuery); if (tweetQuery.Count == 0) { break; } } return statuses; } catch (Exception) { //todo concrete exception return new List<Status>(); } }
public async Task<IEnumerable<string>> GetTweetsAsync(string searchQuery, int limit) { var windowInMinutes = 15; var requestsLimitInWindow = 450; var tweetsReceived = 0; var numberOfRequests = 0; var startTime = DateTime.Now; var result = new List<string>(); if (Context == null) { await InitializeTwitterContextAsync(); } while (tweetsReceived < limit) { if (numberOfRequests < requestsLimitInWindow) { try { ulong maxId = ulong.MinValue; var searchResponse = await Context.Search.Where( s => s.Type == SearchType.Search && s.Count == 100 && s.SearchLanguage == "es" && s.MaxID == maxId && s.Query == searchQuery).SingleOrDefaultAsync().ConfigureAwait(false); numberOfRequests++; if (searchResponse != null && searchResponse.Statuses != null) { if (searchResponse.SearchMetaData == null || searchResponse.SearchMetaData.NextResults == null) { var nextMaxId = searchResponse.SearchMetaData.NextResults.Split(new string[] { "max_id=" }, StringSplitOptions.RemoveEmptyEntries)[1].Split('&')[0]; maxId = Convert.ToUInt64(nextMaxId); } var tweets = searchResponse.Statuses.Select(t => t.Text); tweetsReceived += tweets.Count(); result.AddRange(tweets); } } catch (Exception e) { if (e.InnerException != null && e.InnerException.Message.Contains("Rate limit exceeded")) { numberOfRequests = requestsLimitInWindow; } else { // Swallow exception and continue //throw; } } } else { // Wait 15 minutes and reset requests limits var minutesToWait = windowInMinutes - (DateTime.Now - startTime).Minutes; Console.WriteLine("Made {0} requests. Stopping for {1} minutes", numberOfRequests, minutesToWait); Task.Delay(TimeSpan.FromMinutes(minutesToWait)).Wait(); numberOfRequests = 0; startTime = DateTime.Now; } } return result; }
protected IList<string> Followers(TwitterContext twitterCtx, string user) { var result = new List<string>(); long cursor = -1; do { var friendship = (from friend in twitterCtx.Friendship where friend.Type == FriendshipType.FriendsList && friend.ScreenName == user && friend.Cursor == cursor select friend) .SingleOrDefaultAsync().Result; if (friendship != null && friendship.Users != null && friendship.CursorMovement != null) { cursor = friendship.CursorMovement.Next; } if (friendship != null && friendship.Users != null) result.AddRange(friendship.Users.Select(x => x.UserIDResponse)); } while (cursor != 0); return result; }
/// <summary> /// Gets a list of statuses for specified list /// </summary> /// <param name="twitterCtx">TwitterContext</param> private static void GetListStatusesDemo(TwitterContext twitterCtx) { string ownerScreenName = "Linq2Tweeter"; string slug = "linq"; int maxStatuses = 30; int lastStatusCount = 0; ulong sinceID = 204251866668871681; // last tweet processed on previous query ulong maxID; int count = 10; var statusList = new List<Status>(); // only count var listResponse = (from list in twitterCtx.List where list.Type == ListType.Statuses && list.OwnerScreenName == ownerScreenName && list.Slug == slug && list.Count == count select list) .First(); List<Status> newStatuses = listResponse.Statuses; maxID = newStatuses.Min(status => ulong.Parse(status.StatusID)) - 1; // first tweet processed on current query statusList.AddRange(newStatuses); do { // now add sinceID and maxID listResponse = (from list in twitterCtx.List where list.Type == ListType.Statuses && list.OwnerScreenName == ownerScreenName && list.Slug == slug && list.Count == count && list.SinceID == sinceID && list.MaxID == maxID select list) .First(); newStatuses = listResponse.Statuses; maxID = newStatuses.Min(status => ulong.Parse(status.StatusID)) - 1; // first tweet processed on current query statusList.AddRange(newStatuses); lastStatusCount = newStatuses.Count; } while (lastStatusCount != 0 && statusList.Count < maxStatuses); for (int i = 0; i < statusList.Count; i++) { Status status = statusList[i]; Console.WriteLine("{0, 4}. [{1}] User: {2}\nStatus: {3}", i + 1, status.StatusID, status.User.Name, status.Text); } }
/// <summary> /// shows how to query user status /// </summary> /// <param name="twitterCtx">TwitterContext</param> private static void UserStatusQueryDemo(TwitterContext twitterCtx) { // last tweet processed on previous query set ulong sinceID = 210024053698867204; ulong maxID; const int Count = 10; var statusList = new List<Status>(); var userStatusResponse = (from tweet in twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == "JoeMayo" && tweet.SinceID == sinceID && tweet.Count == Count select tweet) .ToList(); statusList.AddRange(userStatusResponse); // first tweet processed on current query maxID = userStatusResponse.Min( status => ulong.Parse(status.StatusID)) - 1; do { // now add sinceID and maxID userStatusResponse = (from tweet in twitterCtx.Status where tweet.Type == StatusType.User && tweet.ScreenName == "JoeMayo" && tweet.Count == Count && tweet.SinceID == sinceID && tweet.MaxID == maxID select tweet) .ToList(); if (userStatusResponse.Count > 0) { // first tweet processed on current query maxID = userStatusResponse.Min( status => ulong.Parse(status.StatusID)) - 1; statusList.AddRange(userStatusResponse); } } while (userStatusResponse.Count != 0 && statusList.Count < 30); for (int i = 0; i < statusList.Count; i++) { Status status = statusList[i]; Console.WriteLine("{0, 4}. [{1}] User: {2}\nStatus: {3}", i + 1, status.StatusID, status.User.Name, status.Text); } }
private List<Domain.Model.Account> QueryAccounts(TwitterContext twitterctx, List<string> Ids) { List<Domain.Model.Account> response = new List<Domain.Model.Account>(); foreach (var batch in Ids.Batch(100)) { var lookupQuery = string.Join(",", batch); var relationships = (from friendship in twitterctx.Friendship where friendship.Type == FriendshipType.Lookup && friendship.UserID == lookupQuery select friendship).SingleOrDefault().Relationships; var users = (from user in twitterctx.User where user.Type == UserType.Lookup && user.UserID == lookupQuery select user).ToList(); var joinedUserData = (from user in users join rel in relationships on user.Identifier.ID equals rel.ID select new Domain.Model.Account() { AccountId = ulong.Parse(user.Identifier.ID), AccountName = user.Identifier.ScreenName, AccountDescription = user.Description, IsFollower = rel.Connections.Contains("followed_by"), IFollow = rel.Connections.Contains("following"), ProfileImage = new Uri(user.ProfileImageUrl ?? "http://127.0.0.1") }).ToList(); response.AddRange(joinedUserData); } return response; }
static void Main(string[] args) { if (!EnsureSingleLoad()) { Console.WriteLine("{0}: Another Instance Currently Runing", DateTime.Now); return; } TweetProcessor tp; List<Tweet> tweets; var start = DateTime.Now; Console.WriteLine("{0}: Started", start); var primaryUser = UsersCollection.PrimaryUser(); Console.WriteLine("{0}: Getting Friends for {1}", DateTime.Now, primaryUser.TwitterScreenName); Postworthy.Models.Twitter.TwitterModel.Instance.UpdateFriendsForPrimaryUser(); Console.WriteLine("{0}: Getting Tweets for {1}", DateTime.Now, primaryUser.TwitterScreenName); tweets = StatusTimeline.Get(); if (tweets != null) { Console.WriteLine("{0}: Processing {1} Tweets", DateTime.Now, tweets.Count); tp = new TweetProcessor(tweets); tp.Start(); Console.WriteLine("{0}: Saving Tweets", DateTime.Now); tweets .GroupBy(t => t.User.Identifier.ScreenName) .ToList() .ForEach(g => { Repository<Tweet>.Instance.Save(g.Key + TwitterModel.TWEETS, g.Select(x => x).ToList()); Console.WriteLine("{0}: {1} Tweets Saved for {2}", DateTime.Now, g.Count(), g.Key); }); Repository<Tweet>.Instance.FlushChanges(); } else tweets = new List<Tweet>(); List<string> screenNames = new List<string>(); screenNames.AddRange(TwitterModel.Instance.GetRelevantScreenNames(primaryUser.TwitterScreenName)); Console.WriteLine("{0}: Update Retweet Counts", DateTime.Now); List<Tweet> updateTweets = new List<Tweet>(); foreach (var screenName in screenNames) { var tweetsToUpdate = Repository<Tweet>.Instance.Query(screenName + TwitterModel.TWEETS, where: t => t.CreatedAt > DateTime.Now.AddHours(-48)); if (tweetsToUpdate != null && tweetsToUpdate.Count > 1) { tweetsToUpdate = tweetsToUpdate.Except(tweets).OrderByDescending(t => t.Status.CreatedAt).ToList(); if (tweetsToUpdate != null && tweetsToUpdate.Count > 1) { Console.WriteLine("{0}: Updating Retweet Counts for {1}", DateTime.Now, screenName); var updatedStatuses = StatusTimeline.Get(screenName, tweetsToUpdate.First().StatusID); if (updatedStatuses != null && updatedStatuses.Count > 0) { int tweetsAdded = 0; foreach (var s in updatedStatuses) { var t = tweetsToUpdate.SingleOrDefault(x => x.StatusID == s.StatusID); if (t != null && t.RetweetCount != s.RetweetCount) { t.Status.RetweetCount = s.RetweetCount; updateTweets.Add(t); tweetsAdded++; } } if (tweetsAdded > 0) Console.WriteLine("{0}: {1} Retweet Counts Updated for {2}", DateTime.Now, tweetsAdded, screenName); } } } } if (updateTweets.Count > 0) { Console.WriteLine("{0}: Processing {1} Tweets with New Retweet Counts", DateTime.Now, updateTweets.Count); tp = new TweetProcessor(updateTweets); tp.Start(); Repository<Tweet>.Instance.FlushChanges(); } var end = DateTime.Now; Console.WriteLine("{0}: Finished in {1} minutes", end, (end - start).TotalMinutes); }