获取 Twitch VOD 源视频 URL

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

我正在 Unity 中构建一个应用程序,可以通过 AVPro 视频播放器播放 Twitch VOD。使用 Twitch 的 V5 API,我可以检索给定频道的最多 100 个最新 VOD()。

我已经成功地做到了;但是,JSON 对象包含带有 VOD 链接的 URL(与您进入频道并单击存档广播时看到的 URL 相同),但不包含指向视频文件本身的链接。我需要一个视频文件链接到 AVPro 才能播放 VOD,我在互联网上和 Twitch 的 API 上进行了搜索,但找不到获取与 VOD 对应的视频文件 URL 的方法。我不想通过第三方服务下载 VOD,因为这会占用太多用户的内存。需要注意的是,我使用 Unity 的 WWW 类在 C# 中获取此数据。

我是否遗漏了什么,或者这根本不可能?非常感谢所有帮助!

c# json unity-game-engine web twitch
2个回答
2
投票

通过查看Twitch Leecher的源代码,我发现了以下两个API调用:

1. https://api.twitch.tv/api/vods/{0}/access_token
2. https://usher.ttvnw.net/vod/{0}?nauthsig={1}&nauth={2}&allow_source=true&player=twitchweb&allow_spectre=true&allow_audio_only=true

第一个 API 接收 {0} 的 VOD 视频 ID 并返回令牌和签名。对于第二个 API,再次使用 {0} 的视频 ID、{1} 的签名以及 {2} 的整个令牌。

完成之后,我就有了一个字符串,其中包含与不同质量相对应的 VOD 的各种源 URL。然后只需解析结果并获取我想要的链接即可!


0
投票

嘿,我尝试做一些基于并复制 Streamlink 中的某些内容的事情,老实说,对我来说这更像是一个副本,但至少这样你就不必查看源代码并查找特定部分并尝试理解它所以如果你想要这是我的代码,它不是更好的确定,但尝试使用你可能需要的一些功能来实现:

import requests
import re
import json
from urllib.parse import urlparse, parse_qs

def get_twitch_video_urls(video_id):
    client_id = "kimne78kx3ncx6brgo4mv6wki5h1ko"
    headers = {
        "Client-ID": client_id,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

    def get_access_token():
        query = {
            "operationName": "PlaybackAccessToken",
            "variables": {
                "isLive": False,
                "login": "",
                "isVod": True,
                "vodID": video_id,
                "playerType": "embed"
            },
            "extensions": {
                "persistedQuery": {
                    "version": 1,
                    "sha256Hash": "0828119ded1c13477966434e15800ff57ddacf13ba1911c129dc2200705b0712"
                }
            }
        }
        response = requests.post("https://gql.twitch.tv/gql", json=query, headers=headers)
        data = response.json()
        return data["data"]["videoPlaybackAccessToken"]["value"], data["data"]["videoPlaybackAccessToken"]["signature"]

    def get_video_info():
        query = {
            "operationName": "VideoMetadata",
            "variables": {"channelLogin": "", "videoID": video_id},
            "extensions": {
                "persistedQuery": {
                    "version": 1,
                    "sha256Hash": "cb3b1eb2f2d2b2f65b8389ba446ec521d76c3aa44f5424a1b1d235fe21eb4806"
                }
            }
        }
        response = requests.post("https://gql.twitch.tv/gql", json=query, headers=headers)
        return response.json()["data"]["video"]

    token, sig = get_access_token()
    video_info = get_video_info()

    urls = {
        "hls": f"https://usher.ttvnw.net/vod/{video_id}.m3u8?sig={sig}&token={token}",
        "dash": f"https://usher.ttvnw.net/vod/{video_id}.mpd?sig={sig}&token={token}"
    }

    video_urls = {}
    for stream_type, url in urls.items():
        response = requests.get(url)
        if response.status_code == 200:
            if stream_type == "hls":
                qualities = re.findall(r"#EXT-X-STREAM-INF:.*RESOLUTION=(\d+x\d+).*\n(.*)", response.text)
                for quality, stream_url in qualities:
                    video_urls[f"{stream_type}_{quality}"] = stream_url
            elif stream_type == "dash":
                video_urls[stream_type] = url

    return {
    "video_urls": video_urls,
    "title": video_info.get("title", ""),
    "created_at": video_info.get("createdAt", ""),
    "duration": video_info.get("lengthSeconds", 0),
    "view_count": video_info.get("viewCount", 0),
    "language": video_info.get("language", "Unknown")
}


# Usage
vod_id = input("Vod Id: ")
video_data = get_twitch_video_urls(vod_id)
print(json.dumps(video_data, indent=2))

我放置了一个部分,它从直播流中获取信息,因为也许它对您有用,并且它支持 dash 和 hls,并且从视频返回信息的格式很差,因为我忘记了并非所有 Twitch 流都有定义的语言,因此当 api 未提供语言时尝试放置语言时,一些流会崩溃,这就是我使用 .get 的原因,我希望它对您有所帮助。


后记: 我是 github 上的 N0N3C0D3。垃圾邮件>:)。好了,再见。

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