【问题标题】:linq-to-twitter Twitter flood getlinq-to-twitter Twitter 洪水获取
【发布时间】:2020-05-22 06:41:06
【问题描述】:

我尝试了下面的代码,但又不是我想要的。 只有 1 次珍珠洪水即将来临。有90次洪水。 RT 的人不应该来,只能通过电话来淹没。

作为一个例子,我分享了这张照片。在这种情况下我该怎么办。

  const int MaxSearchEntriesToReturn = 100;
        const int SearchRateLimit = 180;

        string searchTerm = "HANEDANLAR MASASININ YER ALTI EGEMENLİĞİ:RİO TİNTO";

        // 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 ctx.Search
             where search.Type == SearchType.Search &&
                   search.Query == searchTerm &&
                   search.Count == MaxSearchEntriesToReturn &&
                   search.SinceID == sinceID &&
                   search.TweetMode == TweetMode.Extended
             select search.Statuses)
            .SingleOrDefaultAsync();

        if (searchResponse != null)
        {
            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 ctx.Search
                     where search.Type == SearchType.Search &&
                           search.Query == searchTerm &&
                           search.Count == MaxSearchEntriesToReturn &&
                           search.MaxID == maxID &&
                           search.SinceID == sinceID &&
                           search.TweetMode == TweetMode.Extended
                     select search.Statuses)
                    .SingleOrDefaultAsync();

                combinedSearchResults.AddRange(searchResponse);
            } while (searchResponse.Any() && combinedSearchResults.Count < SearchRateLimit);


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

                    tweet.User.ScreenNameResponse,
                    tweet.User.UserIDResponse,
                    tweet.Text ?? tweet.FullText)
                );
        }
        else
        {
            Console.WriteLine("No entries found.");
        }

        ViewBag.Twet = combinedSearchResults.ToList();

【问题讨论】:

  • 你能分享一些代码并解释这里到底出了什么问题吗?
  • 我分享了我的代码。
  • 谁能帮帮我??
  • 我不是 C# 专家,但 SingleOrDefaultAsync() 方法仅在 Linq 中返回单个条目,因此您将 tweets 的值显式设置为单个 Tweet 结果。如果您需要推文列表,则需要更改代码以进行迭代。您还应该知道,Twitter 的标准搜索 API 仅涵盖 7 天的历史记录,因此这可以解释为什么您没有更早地收到推文。
  • 是的,我知道我尝试了 ToListAsync() 但没有工作我想做。我的目标是这个链接twitter.com/yazparov/status/1260670500562440194。当我搜索关键字“HANEDANLAR MASASININ YER ALTI EGEMENLİĞİ:”RİO TİNTO”时,所有推文都在 1 到 90 之间。我该怎么做。

标签: asp.net-mvc twitter linq-to-twitter


【解决方案1】:

我拥有 LINQ to Twitter。分页搜索可以返回更多值。这是一个例子:

const int MaxSearchEntriesToReturn = 100;
const int SearchRateLimit = 180;

string searchTerm = "Flood Name";

// 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 &&
           search.TweetMode == TweetMode.Extended
     select search.Statuses)
    .SingleOrDefaultAsync();

if (searchResponse != null)
{
    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 &&
                   search.TweetMode == TweetMode.Extended
             select search.Statuses)
            .SingleOrDefaultAsync();

        combinedSearchResults.AddRange(searchResponse);
    } while (searchResponse.Any() && combinedSearchResults.Count < SearchRateLimit);

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

有几点需要注意:

  • Count 设置为 MaxSearchEntriesToReturn,因为它默认为 15,并且您希望最大限度地减少查询次数。
  • while 循环会检查 SearchRateLimit,因为存在会导致您获得 HTTP 429 的速率限制。App-Only 的速率限制高于我在此处添加的 180。
  • 注意我是如何使用SinceID 和MaxID 对结果进行分页的。请参阅 Twitter API 文档中的 Working with Timelines 以了解它们是什么。
  • 另外,请阅读Search API 文档并注意standard search API is focused on relevance and not completeness

【讨论】:

  • 嗨,我怎样才能在 7 天之前发推文。这个网站有注册。这个网站是怎么做的。你知道下面的网站。 threadreaderapp.com/…
猜你喜欢
  • 2015-01-16
  • 2012-12-07
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多