使用 Twitter API 从推文获取视频

问题描述 投票:0回答:4

我正在尝试使用 Twitter API 从给定的推文导入视频。但是,当我使用

statuses/show
端点时,它不会像图像那样返回视频的任何扩展实体,而是返回链接到某个视频容器的 URL 实体,该视频容器嵌入了一个视频播放器,其中包含指向该视频的模糊链接。视频。

这是一个例子:

我正在尝试导入推文

https://twitter.com/NHL/status/633987786018717696

使用 Twitter API 的

statuses/show
端点和推文 ID,我得到以下响应:

{
  "created_at": "Wed Aug 19 13:04:01 +0000 2015",
  "id": 633987786018717700,
  "id_str": "633987786018717696",
  "text": "The offseason has us missing all of our fans, even the wacky ones... especially the wacky ones. #IsItOctoberYet?\nhttps :/ /t . co/v4UGDQpa61",
  "source": "<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>",
  "truncated": false,
  "in_reply_to_status_id": null,
  "in_reply_to_status_id_str": null,
  "in_reply_to_user_id": null,
  "in_reply_to_user_id_str": null,
  "in_reply_to_screen_name": null,
  "user":  {
    "id": 50004938,
    "id_str": "50004938",
    "name": "NHL",
    "screen_name": "NHL",
    "location": "30 cities across U.S. & Canada",
    "description": "The official source of everything you need and want to know from the National Hockey League. Read before tweeting us: http : / /t . co/JlyVXSpqMn",
    "url": "http : / /t . co/VI8RlwuVr9",
    "entities":  {
      "url":  {
        "urls":  [
           {
            "url": "http : / /t . co/VI8RlwuVr9",
            "expanded_url": "http://www.NHL.com",
            "display_url": "NHL.com",
            "indices":  [
              0,
              22
            ]
          }
        ]
      },
      "description":  {
        "urls":  [
           {
            "url": "http : / / t . co/JlyVXSpqMn",
            "expanded_url": "http://nhl.com/socialmediapolicy",
            "display_url": "nhl.com/socialmediapol…",
            "indices":  [
              118,
              140
            ]
          }
        ]
      }
    },
    "protected": false,
    "followers_count": 4130811,
    "friends_count": 2646,
    "listed_count": 18479,
    "created_at": "Tue Jun 23 15:24:18 +0000 2009",
    "favourites_count": 909,
    "utc_offset": -14400,
    "time_zone": "Eastern Time (US & Canada)",
    "geo_enabled": true,
    "verified": true,
    "statuses_count": 87436,
    "lang": "en",
    "contributors_enabled": false,
    "is_translator": false,
    "is_translation_enabled": true,
    "profile_background_color": "000000",
    "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/378800000139631457/fd-xWa9G.jpeg",
    "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/378800000139631457/fd-xWa9G.jpeg",
    "profile_background_tile": false,
    "profile_image_url": "http://pbs.twimg.com/profile_images/534776558238437376/yxrm83O7_normal.jpeg",
    "profile_image_url_https": "https://pbs.twimg.com/profile_images/534776558238437376/yxrm83O7_normal.jpeg",
    "profile_banner_url": "https://pbs.twimg.com/profile_banners/50004938/1435502670",
    "profile_link_color": "040CDE",
    "profile_sidebar_border_color": "FFFFFF",
    "profile_sidebar_fill_color": "2E2E2E",
    "profile_text_color": "0F5A80",
    "profile_use_background_image": true,
    "has_extended_profile": false,
    "default_profile": false,
    "default_profile_image": false,
    "following": true,
    "follow_request_sent": false,
    "notifications": false
  },
  "geo": null,
  "coordinates": null,
  "place": null,
  "contributors": null,
  "is_quote_status": false,
  "retweet_count": 865,
  "favorite_count": 1342,
  "entities":  {
    "hashtags":  [
       {
        "text": "IsItOctoberYet",
        "indices":  [
          96,
          111
        ]
      }
    ],
    "symbols":  [],
    "user_mentions":  [],
    "urls":  [
       {
        "url": "https : / /t . co/v4UGDQpa61",
        "expanded_url": "https://amp.twimg.com/v/2a0210d1-4d39-4665-a749-ea34f8efef08",
        "display_url": "amp.twimg.com/v/2a0210d1-4d3…",
        "indices":  [
          113,
          136
        ]
      }
    ]
  },
      "favorited": false,
      "retweeted": false,
      "possibly_sensitive": false,
      "possibly_sensitive_appealable": false,
      "lang": "en"
    }

跟随URL后,视频标签的来源是

https://amp.twimg.com/amplify-web-player/prod/source.html?vmap_url=https%3A%2F%2Famp.twimg.com%2Fprod%2Fmultibr_v_1%2Fvmap%2F2015%2F08%2F20%2F13%2F609fc2af-1d06-4894-80be-1c231f97557a%2Fa69baa90-58de-4d1d-b2dc-2c3ef1ab9b35.vmap&duration=91.958&image_src=https%3A%2F%2Famp.twimg.com%2Fprod%2Fdefault%2F2015%2F08%2F20%2F13%2Fe8f0b317-ba48-4cec-bf2c-da4598e2b46b_poster-67227.jpg&content_id=609fc2af-1d06-4894-80be-1c231f97557a&page=amplify_card

如果他们没有为其提供 external_entity,我如何从推文中提取该视频文件?

video twitter
4个回答
13
投票

l在 Twitter API V1 中,视频存储在 Extended_entities 对象中。根据比特率,可能有多个源。这是检索比特率最高的方法:

var bitrate = 0;
var hq_video_url;
for (var j=0; j<tweet.extended_entities.media[0].video_info.variants.length; j++) {
    if (tweet.extended_entities.media[0].video_info.variants[j].bitrate) {
        if (tweet.extended_entities.media[0].video_info.variants[j].bitrate > bitrate) {
            bitrate = tweet.extended_entities.media[0].video_info.variants[j].bitrate;
            hq_video_url = tweet.extended_entities.media[0].video_info.variants[j].url;
        }
    }
}

Twitter / X API V2 更新

在 API V2 中,响应结构略有变化:

let media_url = includes[i].preview_image_url;
let bit_rate = 0;
for (var j=0; j<includes[i].variants.length; j++) {
    if (includes[i].variants[j].bit_rate > bit_rate) {
        let video_url = includes[i].variants[j].url;
        bit_rate = includes[i].variants[j].bit_rate;
    }
}

6
投票

这里有 GIF 的解决方法!

在 Twitter API V2 中,当前无法获取 GIF 和视频 URL。我知道这太愚蠢了。但一种解决方法是获取内容的预览图像并手动构建媒体 URL。

假设我们想通过 V2 API 获取以下推文的 GIF URL: https://twitter.com/FloodSocial/status/870042717589340160

当我们使用以下 URL 获取推文时 https://api.twitter.com/2/tweets/870042717589340160?tweet.fields=attachments,author_id,created_at,entities,id,text&media.fields=preview_image_url,url&expansions=attachments.media_keys(当然还有你的不记名令牌) ),您将看到响应包含

preview_image_url
https://pbs.twimg.com/tweet_video_thumb/DBMDLy_U0AAqUWP.jpg

所以这里我们可以从 URL 中提取

DBMDLy_U0AAqUWP
部分,并在应该的位置手动构建真正的 GIF URL https://video.twimg.com/tweet_video/DBMDLy_U0AAqUWP.mp4

就这样吧。只需要编写提取器函数即可。


2
投票

使用

statuses/show
端点时,添加此选项
tweet_mode:'extended'
即可获取 extended_entities 对象。 响应中的该路径将包含视频网址:
extended_entities.media[0].video_info.variants
示例:

[
  {
    content_type: 'application/x-mpegURL',
    url: 'https://video.twimg.com/ext_tw_video/1358226.........'
  },
  {
    bitrate: 832000,
    content_type: 'video/mp4',
    url: 'https://video.twimg.com/ext_tw_video/1358226.........'
  },
  {
    bitrate: 256000,
    content_type: 'video/mp4',
    url: 'https://video.twimg.com/ext_tw_video/1358226.........'
  }
]

-2
投票

嗯,取决于您使用的平台...

  1. 直接连接到URL
  2. 使用二进制视频数据
  3. 通过一些将显示二进制数据(例如字节流)的小部件来泵送它。

如何执行此操作的具体细节将根据您使用的平台和语言而有很大差异。

© www.soinside.com 2019 - 2024. All rights reserved.