如何使用 LinqToTwitter 获取标签上的所有推文
How To Get All Tweets on Hashtag using LinqToTwitter
我正在尝试让所有推文(计算推文总数)都属于主题标签。我的功能在这里,如何使用 maxID 和 sinceID 获取所有推文。代替 "count" 的是什么?我不知道。
if (maxid != null)
{
var searchResponse =
await
(from search in ctx.Search
where search.Type == SearchType.Search &&
search.Query == "#karne" &&
search.Count == Convert.ToInt32(count)
select search)
.SingleOrDefaultAsync();
maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);
foreach (var tweet in searchResponse.Statuses)
{
try
{
ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
tweetcount++;
}
catch {}
}
while (maxid != null && tweetcount < Convert.ToInt32(count))
{
maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);
searchResponse =
await
(from search in ctx.Search
where search.Type == SearchType.Search &&
search.Query == "#karne" &&
search.Count == Convert.ToInt32(count) &&
search.MaxID == Convert.ToUInt64(maxid)
select search)
.SingleOrDefaultAsync();
foreach (var tweet in searchResponse.Statuses)
{
try
{
ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
tweetcount++;
}
catch { }
}
}
}
只是想说,使用 Tweetinvi 会很简单:
// If you want to handle RateLimits
RateLimit.RateLimitTrackerOption = RateLimitTrackerOptions.TrackAndAwait;
var tweets = Search.SearchTweets(new TweetSearchParameters("#karne")
{
MaximumNumberOfResults = 10000
MaxId = 243982 // If you want to start at a specific point
});
这是一个例子。请记住,MaxID
用于当前会话,并阻止 re-reading 您已经在当前会话中处理的推文。 SinceID
是您针对此搜索词收到的最早的推文,可帮助您避免 re-reading 条您在之前的会话中已针对此搜索词处理过的推文。本质上,您正在创建一个 window,其中 MaxID
是下一条要获取的最新推文,而 SinceID
是您不想阅读过去的最旧推文。在给定搜索词的第一个会话中,您可以将 SinceID
设置为 1
,因为您还没有最旧的推文。会话结束后,保存 SinceID
以免您不小心 re-read 推文。
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));
}
这种方法看起来代码很多,但实际上可以让您更好地控制搜索。例如您可以检查推文并根据推文的内容(如 CreatedAt
)确定查询次数。您可以将查询包装在 try/catch
块中,以便在您超出速率限制或 Twitter 出现问题时监视 HTTP 429,从而让您记住自己的位置并继续。您还可以监视 twitterContext
RateLimit
属性以查看您是否接近并提前避免 HTTP 429 异常。盲目阅读 N 条推文的任何其他技术都可能迫使您浪费 rate-limit 并降低您的应用程序的可扩展性。
- 提示:记得为给定的搜索词保存
SinceID
,如果您
保存推文,避免下次 re-reading 相同的推文
您使用该搜索词进行搜索。
有关此机制的更多信息,请阅读 Twitter 文档中的 Working with Timelines。
TweetInvi 现在更简单了。您需要做的就是:
var matchingTweets = Search.SearchTweets("#AutismAwareness");
我正在尝试让所有推文(计算推文总数)都属于主题标签。我的功能在这里,如何使用 maxID 和 sinceID 获取所有推文。代替 "count" 的是什么?我不知道。
if (maxid != null)
{
var searchResponse =
await
(from search in ctx.Search
where search.Type == SearchType.Search &&
search.Query == "#karne" &&
search.Count == Convert.ToInt32(count)
select search)
.SingleOrDefaultAsync();
maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);
foreach (var tweet in searchResponse.Statuses)
{
try
{
ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
tweetcount++;
}
catch {}
}
while (maxid != null && tweetcount < Convert.ToInt32(count))
{
maxid = Convert.ToString(searchResponse.SearchMetaData.MaxID);
searchResponse =
await
(from search in ctx.Search
where search.Type == SearchType.Search &&
search.Query == "#karne" &&
search.Count == Convert.ToInt32(count) &&
search.MaxID == Convert.ToUInt64(maxid)
select search)
.SingleOrDefaultAsync();
foreach (var tweet in searchResponse.Statuses)
{
try
{
ResultSearch.Add(new KeyValuePair<String, String>(tweet.ID.ToString(), tweet.Text));
tweetcount++;
}
catch { }
}
}
}
只是想说,使用 Tweetinvi 会很简单:
// If you want to handle RateLimits
RateLimit.RateLimitTrackerOption = RateLimitTrackerOptions.TrackAndAwait;
var tweets = Search.SearchTweets(new TweetSearchParameters("#karne")
{
MaximumNumberOfResults = 10000
MaxId = 243982 // If you want to start at a specific point
});
这是一个例子。请记住,MaxID
用于当前会话,并阻止 re-reading 您已经在当前会话中处理的推文。 SinceID
是您针对此搜索词收到的最早的推文,可帮助您避免 re-reading 条您在之前的会话中已针对此搜索词处理过的推文。本质上,您正在创建一个 window,其中 MaxID
是下一条要获取的最新推文,而 SinceID
是您不想阅读过去的最旧推文。在给定搜索词的第一个会话中,您可以将 SinceID
设置为 1
,因为您还没有最旧的推文。会话结束后,保存 SinceID
以免您不小心 re-read 推文。
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));
}
这种方法看起来代码很多,但实际上可以让您更好地控制搜索。例如您可以检查推文并根据推文的内容(如 CreatedAt
)确定查询次数。您可以将查询包装在 try/catch
块中,以便在您超出速率限制或 Twitter 出现问题时监视 HTTP 429,从而让您记住自己的位置并继续。您还可以监视 twitterContext
RateLimit
属性以查看您是否接近并提前避免 HTTP 429 异常。盲目阅读 N 条推文的任何其他技术都可能迫使您浪费 rate-limit 并降低您的应用程序的可扩展性。
- 提示:记得为给定的搜索词保存
SinceID
,如果您 保存推文,避免下次 re-reading 相同的推文 您使用该搜索词进行搜索。
有关此机制的更多信息,请阅读 Twitter 文档中的 Working with Timelines。
TweetInvi 现在更简单了。您需要做的就是:
var matchingTweets = Search.SearchTweets("#AutismAwareness");