搜索失败,maxid(ulong.max)和sinceid集,但单独它的工作原理(search fa

2019-10-18 05:10发布

如果您注释掉无论是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();

Answer 1:

如果你看一下查询结果的提琴手,你会看到响应是:

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

我不能,为什么Twitter的不会与这两个SinceID和MaxID接受查询作出响应。 但是,查询被正确地形成,并且没有描述关于此特定情形这两个参数之间的关系的约束的任何文档。 该MaxID的目的是为最高的tweet的ID在一个查询返回。 无论MaxID和SinceID旨在通过数据来帮助你的页面。 我写了一篇关于如何做到这一点博客文章:

使用时间轴与LINQ到Twitter



Answer 2:

我似乎有同样的问题,因为你,所以我唯一的解决办法是做手工,所以首先我检索到的第一个列表中的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;

然后,我必须寻找其他的tweets(该情况下,当新的鸣叫计数更多的是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。



Answer 3:

万一别人遇到这个问题,我遇到过这个问题,当MaxId是一个无效的资料Tweet标识。

我开始用零,但ulong.MaxValue有同样的问题。 一个有效的值切换出来,它工作正常。 如果你不使用SinceId以及它似乎很好地工作。



Answer 4:

我用得到同样的错误“缺少或无效的URL参数”,但按照乔·梅奥的解决方案 ,我还添加如果做while循环,因为查询抛出上述错误,每当maxID小于sinceID之前(sinceID <maxID)的条件,我认为这是不正确。

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);
}


文章来源: search fails with maxid (ulong.max) and sinceid set, but separately it works