Пустое свойство FullText с помощью Tweetmode.Extended [обновление 30 мая] - PullRequest
0 голосов
/ 28 мая 2018

Я программирую .Net Core (2.1 превью, C # 7.3) Потоковое консольное приложение с L2T (5.0.0 beta 2), но даже с strm.TweetMode == TweetMode.Extended запрос возвращает «компат» твиты, свойство FullTextпусто.

Вы можете воспроизвести это с помощью запроса 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();
                });
        }

[ Обновление 30 мая ]

Нашел что-то.Он находится в подпрограмме «HandleStreamResponse» (код ниже).Status.TweetMode и Status.ExtendedTweet.TweetMode оба возвращают "Compat" для всех твитов, но полный текст твита находится в status.ExtendedTweet.FullText

Но даже с этой проверкой ретвиты усекаютсядо 140 символов макс.Мне не нужны ретвиты для моей программы, поэтому я отфильтровываю их.

Я пока не знаю, как напрямую отфильтровать ретвиты из потока ( возможно ли это? ), поэтому я проверяю статус ретвитов статуса из результата потока.Это в коде ниже.

К вашему сведению: в примерах Linq To Twitter для этой подпрограммы Джо Майо использует следующую строку кода, но это не работает: Console.WriteLine("{0}: {1} {2}", status.StatusID, status.User.ScreenNameResponse, status.Text ?? status.FullText);

Дажес && strm.TweetMode == TweetMode.Extended в запросе L2T 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);
    }
}

1 Ответ

0 голосов
/ 03 июня 2018

Вот мои наблюдения:

  1. status.ExtentendedTweet.FullText должен содержать твит в обычных обстоятельствах.
  2. Однако, если твит ретвитят, тогда status.RetweetedStatus.ExtendedTweet.FullText должен удерживать твит.
  3. Если вы не можете найти 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 (см. Стандартные потоки) , TweetMode не относится к потокам.Кроме того, в документах говорится, что ExtentedTweet всегда должно быть там с FullText.Как мы видим, это не полная картина на практике.В следующих выпусках я отмечу Streaming.TweetMode как устаревшие.

...