通过 YouTube 数据 API [Python] 下载非自有视频的隐藏式字幕

Posted

技术标签:

【中文标题】通过 YouTube 数据 API [Python] 下载非自有视频的隐藏式字幕【英文标题】:Downloading closed captions of non-owned video through YouTube Data API [Python] 【发布时间】:2021-11-02 08:50:46 【问题描述】:

我正在使用 Python 编写一个请求视频隐藏字幕的应用程序。 代码如下所示:

videoID = getVideo(videoURL)
request = youtube.videos().list(
    part="snippet,contentDetails,statistics",
    id=videoID
)
response = request.execute()
items = response.get("items")[0]
contentDetails = items["contentDetails"]
caption = contentDetails["caption"]

if(caption):
    print("Video contains closed captions!")
else:
    print("Video does not contain closed captions.")

#get caption info
if(caption):
    caption_info = youtube.captions().list(part='id', videoId=videoID).execute().get('items', [])
    caption_str = youtube.captions().download(id=caption_info[0]['id'], tfmt='srt').execute()

最后一行抛出403错误:

raise HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: <HttpError 403 when requesting https://youtube.googleapis.com/youtube/v3/captions/uQKrZZwFbPddlMeZauOtvq1sR61wb1UwuVB4yxq7798%3D?tfmt=srt returned "The permissions associated with the request are not sufficient to download the caption track. The request might not be properly authorized, or the video order might not have enabled third-party contributions for this caption.". Details: "['message': 'The permissions associated with the request are not sufficient to download the caption track. The request might not be properly authorized, or the video order might not have enabled third-party contributions for this caption.', 'domain': 'youtube.caption', 'reason': 'forbidden', 'location': 'id', 'locationType': 'parameter']"

我已正确创建 API 凭据和 OAuth 2.0 客户端 ID,并且可以成功获取视频信息,例如标题、频道名称、时长等。 但是,每当我使用上面的代码请求字幕时,我都会收到该错误。我不拥有请求的视频。

有没有办法通过 YouTube 数据 API 下载我拥有的视频的隐藏字幕?

编辑 1: 这是处理 YouTube 数据 API 身份验证的代码

SCOPES = ["https://www.googleapis.com/auth/youtube.force-ssl"]

def youtube_authenticate():
    os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1"
    api_service_name = "youtube"
    api_version = "v3"
    client_secrets_file = "credentials.json"
    creds = None
    
    #check if authentication has already been completed
    if os.path.exists("token.pickle"):
        with open("token.pickle", "rb") as token:
            creds = pickle.load(token)
    #perform the authentication (1 time only)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(client_secrets_file, SCOPES)
            creds = flow.run_local_server(port=0)
        # save the authenticated credentials
        with open("token.pickle", "wb") as token:
            pickle.dump(creds, token)

    return build(api_service_name, api_version, credentials=creds)

【问题讨论】:

向我们展示处理 OAuth 2.0 身份验证/授权流程的代码。 (当然,编辑掉任何具体的凭据数据。) SCOPES 呢? @stvar 抱歉,将其添加到编辑中。正如我所读到的,这几乎是推荐用于通用视频访问的方法。 这个范围是在你的谷歌项目中指定的(在谷歌开发控制台中)? @stvar 是的。我认为我在这里需要的是使用视频记录而不是隐藏式字幕来解决这个问题。我找到了 youtube_transcript_api 库,可以轻松返回视频的完整记录。 【参考方案1】:

根据Captions.download端点的官方规范,该API不允许下载非拥有视频的字幕:

Authorization

此请求需要至少具有以下范围之一的授权 (read more about authentication and authorization)。

范围https://www.googleapis.com/auth/youtube.force-sslhttps://www.googleapis.com/auth/youtubepartner

【讨论】:

以上是关于通过 YouTube 数据 API [Python] 下载非自有视频的隐藏式字幕的主要内容,如果未能解决你的问题,请参考以下文章

通过Youtube Api上传360度视频

使用 Python 的具有多个帐户的 YouTube 数据 API

在 Python 中解码字符(YouTube 数据 API)

通过 YouTube 数据 API 访问公共数据,无需身份验证。

是否可以通过 Youtube 数据 API v3.0 获取时长(时间)视频

如何使用 python 从 youtube v3 api 修复 json?