1

如果您注释掉SinceID 或MaxID 子句,则以下查询可以正常工作,但是当两者都包含时,会生成“错误的url”异常。

var maxId = ulong.MaxValue;
var sinceId = (ulong)341350918903701507;

var searchResult =
(
   from search in ctx.Search
      where search.Type == SearchType.Search &&
      search.ResultType == ResultType.Mixed &&
      search.Query == "red wedding" &&
      search.SinceID == sinceId &&
      search.MaxID == maxId &&
      search.IncludeEntities == false &&
      search.Count == 200
    select search).SingleOrDefault();
4

4 回答 4

1

如果您在 Fiddler 中查看查询结果,您会看到响应为:

{"errors":[{"code":195,"message":"Missing or invalid url parameter"}]}

我无法回答为什么 Twitter 不接受同时使用SinceID 和MaxID 的查询。但是,查询是正确形成的,并且没有任何文档描述此特定场景中这两个参数之间关系的约束。MaxID 的目的是成为在下一个查询中返回的最高推文的 id。MaxID 和SinceID 都旨在帮助您对数据进行分页。我写了一篇关于如何做到这一点的博客文章:

使用 LINQ to Twitter 处理时间线

于 2013-06-07T05:00:06.257 回答
1

我似乎和你有同样的问题,所以我唯一的解决方案是手动完成,所以首先我检索了第一个列表,将 sinceId 值设置为我拥有的值:

var searchResult =
            (
                from search in TwitterCtx.Search
                where search.Type == SearchType.Search &&
                      search.Query == query &&
                      search.Count == pageSize &&
                      search.IncludeEntities == true &&
                      search.ResultType == ResultType.Recent &&
                      search.SinceID == sinceId
                select search
            ).SingleOrDefault<Search>();

resultList = searchResult.Statuses;

然后我必须搜索其他推文(新推文计数更多 pageSize 的情况)所以我有一个这样的 while 循环:

ulong minId = ulong.Parse(resultList.Last<Status>().StatusID) - 1;
List<Status> newList = new List<Status>();

 while (minId > sinceId)
 {
    resultList.AddRange(newList);

    searchResult =
        (
            from search in TwitterCtx.Search
            where search.Type == SearchType.Search &&
                search.Query == query &&
                search.Count == pageSize &&
                search.IncludeEntities == true &&
                search.ResultType == ResultType.Recent &&
                search.MaxID == minId &&
                search.SinceID == sinceId
             select search
        ).SingleOrDefault<Search>();

    newList = searchResult.Statuses;
    if (newList.Count == 0)
         break;

    minId = ulong.Parse(newList.Last<Status>().StatusID) - 1;
}

现在由于某种原因,您可以同时使用 sinceId 和 maxId。

于 2013-07-25T07:53:00.363 回答
0

以防万一其他人遇到这个问题,当 MaxId 是无效的推文 ID 时,我遇到了这个问题。

我开始使用零,但 ulong.MaxValue 有同样的问题。使用有效值将其切换出来,它可以正常工作。如果您也没有使用SinceId,它似乎工作正常。

于 2014-04-07T01:03:11.003 回答
0

我曾经收到相同的错误“缺少或无效的 url 参数”,但根据Joe Mayo 的解决方案,我在 do while 循环之前另外添加了 if(sinceID < maxID) 条件,因为只要 maxID 小于 sinceID,查询就会抛出错误,我认为这是不正确的。

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" && 
                   search.Count == count &&
                   search.SinceID == sinceID &&
                   search.MaxID == maxID
                   select search)
              .SingleOrDefaultAsync(); 

              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);
}
于 2015-05-29T17:23:43.633 回答