TweetInvi не получает изображение твита

Я читаю твиты, используя следующий код, он работает нормально, но медиа-объект всегда пуст, даже если в твите есть изображение, но он отлично работает, если в твите есть видео вместо изображения!

            var stream = userClient.Streams.CreateFilteredStream();
            stream.TweetMode = Tweetinvi.TweetMode.Extended;
            var twitterUser = await userClient.Users.GetUserAsync(username);
            stream.AddFollow(twitterUser);
            stream.MatchingTweetReceived += (sender, eventReceived) =>
            {
                
                if(!eventReceived.Tweet.Retweeted)
                    Console.WriteLine(eventReceived.Tweet);
            };

            await stream.StartMatchingAllConditionsAsync();

Я отлаживал все твиты и проверял, есть ли у каждого из них картинка на твиттер-сайте.

Это медиа-объект


person Cassini    schedule 12.05.2021    source источник
comment
Что для вас является медиаобъектом? 0 товаров? Я могу заставить это работать без проблем, единственная разница в том, что вместо этого я использовал stream.AddTrack(string).   -  person Timothy G.    schedule 22.05.2021
comment
@ТимотиГ. Пусто, когда в твите есть картинка, если в твите есть видео, то все нормально   -  person Cassini    schedule 23.05.2021


Ответы (1)


Media член группы ITweet является List<IMediaEntity>. Этот список может быть пустым. Используя приведенный ниже код, я смог получать твиты с их Media участником, содержащими IMediaEntity объекты:

static async Task Main(string[] args)
{
    Task task = Task.Run(() => BeginTweetStream());
    await task;
}

public static async Task BeginTweetStream()
{
    string userName = "SomeName";
    int i = 0;
    TwitterClient userClient = new TwitterClient("string", "string", "string", "string"); //where the strings are credentials
    var stream = userClient.Streams.CreateFilteredStream();
    stream.TweetMode = Tweetinvi.TweetMode.Extended;
    var twitterUser = await userClient.Users.GetUserAsync(userName);
    stream.AddTrack("SomeTrack");
    stream.MatchingTweetReceived += (sender, eventReceived) =>
    {
        if (eventReceived.Tweet.Media != null && eventReceived.Tweet.Media.Any() && !eventReceived.Tweet.Retweeted)
        {
            Console.WriteLine($"Tweet with {eventReceived.Tweet.Media.Count()} media found!");

            foreach (Tweetinvi.Models.Entities.IMediaEntity media in eventReceived.Tweet.Media)
            {
                Console.WriteLine($"Media type: {media.MediaType} Link: {media.URL}");
            }

            ++i;
        }

        if (i == 99) //stop after 100 tweets with media
        {
            stream.Stop();
            Console.WriteLine("Complete! Press any key to exit.");
            Console.Read(); 
        }
    };

    await stream.StartMatchingAllConditionsAsync();
}

Выход консоли:

Вывод

Вы можете проверить участника IMediaEntity.MediaType, чтобы узнать, что это за медиа. Мне не удалось найти документацию о том, какие значения можно установить, но до сих пор я видел:

  • photo
  • video
  • animated_gif

Обратите внимание, что элемент URL объекта IMediaEntity является ссылкой на сам твит. Если вам нужно само изображение, MediaURL или MediaURLHttps будут содержать ссылку только на изображение (для видео и анимированных GIF-файлов эти члены вместо этого являются ссылкой на миниатюру изображения).

person Timothy G.    schedule 22.05.2021
comment
Я использовал именно ваш код, но я использовал Хаберни для AddTrack вместо SomeTrack. Я получил твиты, но без их изображений! - person Cassini; 23.05.2021
comment
@Кассини, я в растерянности. Например, вы не получаете никаких ссылок в IMediaEntity.MedialURL? - person Timothy G.; 23.05.2021
comment
Нет, я не получаю никакой ссылки. - person Cassini; 23.05.2021
comment
@Cassini Можете ли вы опубликовать скриншоты вашего пустого медиа-объекта и объектов твита? - person Timothy G.; 23.05.2021
comment
Я добавил скриншот к вопросу. - person Cassini; 23.05.2021
comment
@Cassini Я просмотрел твит, используя идентификатор на скриншоте, и он содержит не изображение, а скорее ссылка на статью на веб-сайте, которую Твиттер отображает с миниатюрой, но технически это не фотография, по крайней мере, не в том смысле, что она возвращается как часть массива IMediaEntity. Вот твит из этой учетной записи, который действительно содержит изображение: twitter.com/ khaberni/status/1396480461447249925 - и Tweetinvi тоже указывает на это - person Timothy G.; 23.05.2021
comment
Другими словами, я думаю, вы изучали твиты, которые, по вашему мнению, содержали фотографии, но на самом деле они просто содержали ссылку на новостную статью/внешний веб-сайт, где Twitter отображает изображение из самой новой статьи в миниатюре. И глядя на то, что предоставляет Tweetinvi, вы не можете вытащить это фото из твита. - person Timothy G.; 23.05.2021
comment
Вот пример твита, который я читал twitter.com/khaberni/status/1396519075111739396 это изображение не является частью этого твита! - person Cassini; 23.05.2021
comment
@Cassini Опять же, это не фотография в твите, не в том смысле, что она будет в массиве объектов Media. Это миниатюра ссылки, которую отображает Twitter, и Twitter API не предоставляет эти изображения обратно пользователям. В моем предыдущем комментарии я связался с твитом, который содержит настоящую фотографию, API. Ваш код работает так же, как и мой, но твиты, которые вы просматриваете, не содержат фотографий, которые возвращаются как часть массива IMediaEntity, поэтому в нем 0 элементов. - person Timothy G.; 23.05.2021