带有 Tweetmode.Extended 的空全文 属性 [5 月 30 日更新]
Empty FullText property with Tweetmode.Extended [update May 30th]
我正在使用 L2T(5.0.0 beta 2)编写 .Net Core(2.1 预览版,C# 7.3)流式控制台应用程序,但即使使用 strm.TweetMode == TweetMode.Extended
,查询也会提供 "compat" 推文回来,全文 属性 是空的。
您可以使用下面的 L2T 查询重现此内容。
我在网上搜索过,我找到了类似的东西(用 'search' 而不是 'Streaming')但没有答案,除了添加 && strm.TweetMode == TweetMode.Extended
,我做了。
有什么想法吗?
try
{
await
(from strm in twitterCtx.Streaming
.WithCancellation(cancelTokenSrc.Token)
where
strm.Type == StreamingType.Filter
&& strm.Track == "twitter"
&& strm.Language == "nl"
&& strm.TweetMode == TweetMode.Extended
select strm)
.StartAsync(async strm =>
{
await HandleStreamResponse(strm);
if (count++ >= 20)
cancelTokenSrc.Cancel();
});
}
[5 月 30 日更新]
发现了一些东西。它在子例程 "HandleStreamResponse" 中(下面的代码)。 Status.TweetMode
和 Status.ExtendedTweet.TweetMode
都是 return "Compat" 所有推文,但推文的全文在 status.ExtendedTweet.FullText
但即使进行了此检查,转推也会被截断为最多 140 个字符。我的节目不需要转推,所以我将它们过滤掉了。
我还不知道如何直接从流中过滤转推(可能吗?),所以我从流结果中检查 Status 的 retweetstatus。它在下面的代码中。
仅供参考:在这个子例程的 Linq To Twitter 示例中,Joe Mayo 使用了以下代码行,但这不起作用:Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);
即使在 L2T 查询中使用 && strm.TweetMode == TweetMode.Extended
,status.FullText
也是空的。
下面的示例中的代码比必需的多,但为了清楚起见,我使用了它。
static async Task<int> HandleStreamResponse(StreamContent strm)
{
switch (strm.EntityType)
{
case StreamEntityType.Status:
var status = strm.Entity as Status;
if (status.RetweetedStatus.StatusID == 0)
{
if (status.ExtendedTweet.FullText != null)
{
Console.WriteLine("Longer than 140 - \"@{0}\": {1} (TweetMode:{2})",
status.User.ScreenNameResponse, status.ExtendedTweet.FullText, status.TweetMode);
}
else
{
Console.WriteLine("Shorter than 140 - \"@{0}\": {1} (TweetMode:{2})",
status.User.ScreenNameResponse, status.Text, status.TweetMode);
}
}
// Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);
break;
default:
Console.WriteLine("Unknown - " + strm.Content + "\n");
break;
}
return await Task.FromResult(0);
}
}
以下是我的观察:
status.ExtentendedTweet.FullText
应该在正常情况下保留推文。
- 但是,如果推文被转发,那么
status.RetweetedStatus.ExtendedTweet.FullText
应该保留推文。
- 如果您在上述任何一种情况下都找不到
FullText
,请使用 status.Text
。
我正在使用以下内容更新示例:
case StreamEntityType.Status:
var status = strm.Entity as Status;
string text = null;
if (status.ExtendedTweet?.FullText != null)
text = status.ExtendedTweet?.FullText;
else if (status.RetweetedStatus?.ExtendedTweet?.FullText != null)
text = status.RetweetedStatus?.ExtendedTweet?.FullText;
else
text = status.Text;
Console.WriteLine("Status - @{0}: {1}", status.User.ScreenNameResponse, text);
break;
注意:通过 Twitter documentation (see Standard Streams)、TweetMode
不适用于流。此外,文档说 ExtentedTweet
应该始终与 FullText
一起出现。正如我们所见,这并不是实践中的全貌。我将在即将发布的版本中将 Streaming.TweetMode
标记为已过时。
我正在使用 L2T(5.0.0 beta 2)编写 .Net Core(2.1 预览版,C# 7.3)流式控制台应用程序,但即使使用 strm.TweetMode == TweetMode.Extended
,查询也会提供 "compat" 推文回来,全文 属性 是空的。
您可以使用下面的 L2T 查询重现此内容。
我在网上搜索过,我找到了类似的东西(用 'search' 而不是 'Streaming')但没有答案,除了添加 && strm.TweetMode == TweetMode.Extended
,我做了。
有什么想法吗?
try
{
await
(from strm in twitterCtx.Streaming
.WithCancellation(cancelTokenSrc.Token)
where
strm.Type == StreamingType.Filter
&& strm.Track == "twitter"
&& strm.Language == "nl"
&& strm.TweetMode == TweetMode.Extended
select strm)
.StartAsync(async strm =>
{
await HandleStreamResponse(strm);
if (count++ >= 20)
cancelTokenSrc.Cancel();
});
}
[5 月 30 日更新]
发现了一些东西。它在子例程 "HandleStreamResponse" 中(下面的代码)。 Status.TweetMode
和 Status.ExtendedTweet.TweetMode
都是 return "Compat" 所有推文,但推文的全文在 status.ExtendedTweet.FullText
但即使进行了此检查,转推也会被截断为最多 140 个字符。我的节目不需要转推,所以我将它们过滤掉了。
我还不知道如何直接从流中过滤转推(可能吗?),所以我从流结果中检查 Status 的 retweetstatus。它在下面的代码中。
仅供参考:在这个子例程的 Linq To Twitter 示例中,Joe Mayo 使用了以下代码行,但这不起作用:Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);
即使在 L2T 查询中使用 && strm.TweetMode == TweetMode.Extended
,status.FullText
也是空的。
下面的示例中的代码比必需的多,但为了清楚起见,我使用了它。
static async Task<int> HandleStreamResponse(StreamContent strm)
{
switch (strm.EntityType)
{
case StreamEntityType.Status:
var status = strm.Entity as Status;
if (status.RetweetedStatus.StatusID == 0)
{
if (status.ExtendedTweet.FullText != null)
{
Console.WriteLine("Longer than 140 - \"@{0}\": {1} (TweetMode:{2})",
status.User.ScreenNameResponse, status.ExtendedTweet.FullText, status.TweetMode);
}
else
{
Console.WriteLine("Shorter than 140 - \"@{0}\": {1} (TweetMode:{2})",
status.User.ScreenNameResponse, status.Text, status.TweetMode);
}
}
// Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);
break;
default:
Console.WriteLine("Unknown - " + strm.Content + "\n");
break;
}
return await Task.FromResult(0);
}
}
以下是我的观察:
status.ExtentendedTweet.FullText
应该在正常情况下保留推文。- 但是,如果推文被转发,那么
status.RetweetedStatus.ExtendedTweet.FullText
应该保留推文。 - 如果您在上述任何一种情况下都找不到
FullText
,请使用status.Text
。
我正在使用以下内容更新示例:
case StreamEntityType.Status:
var status = strm.Entity as Status;
string text = null;
if (status.ExtendedTweet?.FullText != null)
text = status.ExtendedTweet?.FullText;
else if (status.RetweetedStatus?.ExtendedTweet?.FullText != null)
text = status.RetweetedStatus?.ExtendedTweet?.FullText;
else
text = status.Text;
Console.WriteLine("Status - @{0}: {1}", status.User.ScreenNameResponse, text);
break;
注意:通过 Twitter documentation (see Standard Streams)、TweetMode
不适用于流。此外,文档说 ExtentedTweet
应该始终与 FullText
一起出现。正如我们所见,这并不是实践中的全貌。我将在即将发布的版本中将 Streaming.TweetMode
标记为已过时。