如何使用 twitter API V2 从用户推文时间轴获取源视频 URL

How to get source video URL from user tweet timeline using twitter API V2

我正在使用以下 url 来获取用户推文。

https://api.twitter.com/2/users/{user_twitter_id}/tweets

以下是我的请求参数

query_params = {
    'max_results': max_results,
    'expansions': 'attachments.media_keys',
    'tweet.fields': 'id,created_at,text,author_id,in_reply_to_user_id,referenced_tweets,attachments,withheld,geo,entities,public_metrics,possibly_sensitive,source,lang,context_annotations,conversation_id,reply_settings',
    'media.fields': 'media_key,duration_ms,height,preview_image_url,type,url,width,public_metrics,non_public_metrics,organic_metrics,promoted_metrics,alt_text'
}

以下是我在“包含”中获得的响应,其中包含媒体列表

"includes": {
    "media": [
        {
            "height": 750,
            "media_key": "3_1489397927281840131",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKtnhhDWUAMtyBi.jpg",
            "width": 1125
        },
        {
            "height": 750,
            "media_key": "3_1489397930452783110",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKtnhs3XEAYeMkP.jpg",
            "width": 1125
        },
        {
            "height": 750,
            "media_key": "3_1489397944214302727",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKtnigIXMAcTO6t.jpg",
            "width": 1125
        },
        {
            "duration_ms": 242784,
            "height": 1080,
            "media_key": "13_1489018359819771906",
            "preview_image_url": "https://pbs.twimg.com/media/FKoOePDWYAA1ZZB.jpg",
            "public_metrics": {
                "view_count": 275300
            },
            "type": "video",
            "width": 1920
        },
        {
            "height": 2400,
            "media_key": "3_1488933061307809794",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKnAuwWWQAIZZ8J.jpg",
            "width": 3000
        },
        {
            "height": 2000,
            "media_key": "3_1488640905187938304",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKi3BB_X0AA47_h.jpg",
            "width": 3000
        },
        {
            "duration_ms": 41374,
            "height": 1080,
            "media_key": "13_1488623384250527746",
            "preview_image_url": "https://pbs.twimg.com/amplify_video_thumb/1488623384250527746/img/K2fiO7GwjmxL0H89.jpg",
            "public_metrics": {
                "view_count": 239341
            },
            "type": "video",
            "width": 1080
        },
        {
            "height": 2000,
            "media_key": "3_1488548514921603078",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKhi_NbWYAYqP04.jpg",
            "width": 3000
        },
        {
            "height": 750,
            "media_key": "3_1488336416732028931",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKeiFeGXIAMgHQx.jpg",
            "width": 1125
        },
        {
            "duration_ms": 53136,
            "height": 1080,
            "media_key": "13_1488316251667582978",
            "preview_image_url": "https://pbs.twimg.com/amplify_video_thumb/1488316251667582978/img/DE2q07gtwoARK76r.jpg",
            "public_metrics": {
                "view_count": 214984
            },
            "type": "video",
            "width": 1080
        },
        {
            "duration_ms": 40248,
            "height": 1080,
            "media_key": "13_1488154727544152064",
            "preview_image_url": "https://pbs.twimg.com/media/FKb85iAXoAou4ED.jpg",
            "public_metrics": {
                "view_count": 242329
            },
            "type": "video",
            "width": 1080
        },
        {
            "height": 913,
            "media_key": "3_1487927712761229314",
            "type": "photo",
            "url": "https://pbs.twimg.com/media/FKYuXxKXsAIbXd2.jpg",
            "width": 1200
        },
        {
            "duration_ms": 35785,
            "height": 1080,
            "media_key": "13_1487538546948939777",
            "preview_image_url": "https://pbs.twimg.com/amplify_video_thumb/1487538546948939777/img/qzUmEZKmD6ii_0dM.jpg",
            "public_metrics": {
                "view_count": 290603
            },
            "type": "video",
            "width": 1080
        }
    ]
}

正如您在媒体响应中看到的,我们有类型视频和媒体密钥,但没有实际视频 url 我们只能看到视频缩略图。所以请告诉我如何获取视频 urls 以及预览图像 url

这里有几点需要注意:

  • 在 Twitter API v2 中,在 2022 年 2 月撰写此答案时,视频 URL 当前不可用。这是 Twitter 正在处理的一个已知遗漏。

  • 推特APIv1.1,一般应该可以得到视频URLs。还有两件事需要了解...

    • 如果推文较长(超过 140 个字符),则您需要将 tweet_mode=extended 添加到 API 调用以确保包含整个推文数据和扩展实体.如果 truncated 字段值为 true,您可以判断是否没有检索到整个推文。上面的示例推文 ID 就是这种情况。使用 tweet_mode=extended 您将看到视频 URLs.
    • 如果推文来自广告平台,则视频可能是广告卡片格式的一部分,并且这些不会通过 API 提供。你可以通过检查 source 字段来判断推文是作为广告发布的证据。在这种情况下,广告商可以将媒体标记为不用于更广泛的联合/API 访问,并且视频 URL 不会在 API.
    • 中返回

除了 之外,还有一个变通方法 包括 直接 URL 视频: 只需获取推文 ID 并使用 https://cdn.syndication.twimg.com/tweet?id=<tweet_id> URL (example) 即可获取您需要的数据。

优点:

  • 无需任何 API 密钥即可工作,因此易于集成
  • 它为您提供指向 .mp4.hls 格式视频的直接链接

缺点

  • 这是内部API调用,外部使用不可靠❗️❗️❗️
  • 需要一个额外的请求来获取数据
  • 取消CORS策略需要代理