如果您注释掉SinceID或MaxID子句,则以下查询可以正常运行,但如果包含两者,则会生成“bad 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();
答案 0 :(得分:1)
如果查看Fiddler中的查询结果,您会看到响应是:
{"errors":[{"code":195,"message":"Missing or invalid url parameter"}]}
我无法回应为什么Twitter不接受同时使用SinceID和MaxID的查询。但是,查询是正确形成的,并且没有任何文档描述对于此特定方案的这两个参数之间的关系的约束。 MaxID的目的是成为下一个查询返回的最高推文的id。 MaxID和SinceID都旨在帮助您浏览数据。我写了一篇关于如何做到这一点的博客文章:
答案 1 :(得分: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。
答案 2 :(得分:0)
万一其他人遇到此问题,我遇到此问题时MaxId是无效的推文ID。
我开始使用零但ulong.MaxValue有同样的问题。使用有效值将其切换出来并且工作正常。如果您还没有使用SinceId,它似乎工作正常。
答案 3 :(得分:0)
我曾经得到相同的错误“缺少或无效的url参数”,但是根据Joe Mayo's solution,我还在while循环之前添加了if(sinceID&lt; 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);
}