【问题标题】:How to get tweets older than few months?如何获取超过几个月的推文?
【发布时间】:2017-05-26 09:08:58
【问题描述】:

我正在使用带有特定主题标签的 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]

【问题讨论】:

  • 我不知道,但是您尝试过更改 search.SinceID 吗?
  • 您是否尝试指定获取推文的日期范围?
  • 你的代码中变量 dateFrom 的用途是什么?
  • @big_water:其实我对日期范围一无所知。但我试图做到这一点,直到。但这对我不起作用。 :(
  • @hellogoodnight: dateFrom 在我的代码中是额外的。并且通过更改 search.SinceID ,它也无法正常工作。

标签: c# twitter linq-to-twitter


【解决方案1】:

我建议查看documentation 看起来您可以指定“Until”日期和 MaxId:

直到:截至该日期的推文,YYYY-MM-DD。 (字符串)

MaxID:返回该 ID 之前或等于该 ID 的推文。 (乌龙)

我会查询“Until”日期并使用 LINQ 的“LastOrDefault()”获取最后一条推文。然后使用来自该对象的 ID 作为下一个查询的 MaxID 执行另一个查询。这应该会在您要求的某个日期之前为您提供所有推文。

注意这个参数也很重要:

Count 为每个页面检索的推文数。最大值为 100。(整数)

这可能与您收到的推文数量有限有关。

编辑: 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();

【讨论】:

  • @Ranjana,我已经更新了一些代码。我尚未对其进行测试,但它应该有助于可视化我所描述的内容:)
  • 感谢您的回复。我在直到出现错误。 i.stack.imgur.com/NZ6mU.png
  • @Ranjana,你试过像 YYYY-MM-DD 这样格式化吗?
  • @Ranjana,你能用运行时错误的消息和堆栈跟踪更新你的问题吗?
  • @big_water:它对我有用。但我得到的数据只有 10 天前。
【解决方案2】:

您可能还想考虑分页搜索。这是一个演示:

    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

它有点旧,不包括异步语法,但确实解释了SinceIDMaxID 和技术。 Twitter 也有很好的文档,解释了他们的分页策略的方式和原因:

Working with Timelines (Twitter)

话虽如此,Twitter API 确实限制了您可以搜索多远。在The Search API, Best Practices 部分,他们描述了他们只返回 6 到 9 天。

【讨论】:

  • 是的 thnx 很多.. 但我只收到 10 天前的推文.. 仅此而已.. 因为这个 api 不能灵活地获取历史数据..
  • 要明确 - 限制来自 Twitter API,而不是这个库或任何其他库。
猜你喜欢
  • 2019-03-14
  • 2022-01-14
  • 1970-01-01
  • 2019-06-01
  • 2015-10-21
  • 2018-05-23
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多