YouTube v3 API 使用 SDK nuget 包下载字幕

YouTube v3 API caption download using SDK nuget package

我正在尝试使用 YouTube API v3(https://developers.google.com/youtube/v3/docs/captions/download) and official .NET SDK nuget package (https://www.nuget.org/packages/Google.Apis.YouTube.v3/,版本 1.9.0.1360)下载字幕轨道。

返回的流包含以下文本:

"The OAuth token was received in the query string, which this API forbids for response formats other than JSON or XML. If possible, try sending the OAuth token in the Authorization header instead."

而不是我刚刚通过YouTube.com手动上传并验证的SRT纯文本内容UI。

我发现错误类型:lockedDomainCreationFailure

我的代码:

    ...
        _service = new YTApi.YouTubeService(new BaseClientService.Initializer {
            ApplicationName = config.AppName,
            ApiKey = config.DeveloperKey
        });
    ...

    public Stream CaptionsDownload(
        string accessToken,
        string trackId
        )
    {
        var request = _service.Captions.Download(trackId);
        request.OauthToken = accessToken;
        request.Tfmt = YTApi.CaptionsResource.DownloadRequest.TfmtEnum.Srt;

        var trackStream = new MemoryStream();
        request.Download(trackStream);
        trackStream.Position = 0;

        return trackStream;
    }

我似乎找不到在 _service.HttpClient 上设置任何 header 的方法,我想我不应该手动进行。我希望 DownloadRequest(或 YouTubeBaseServiceRequest)将

/// <summary>
/// OAuth 2.0 token for the current user.
/// </summary>
[RequestParameter("oauth_token", RequestParameterType.Query)]
public virtual string OauthToken { get; set; }

进入正确的授权header。我没有在版本 1.9.0.1360 中看到这个实现。

也许我忽略了什么?非常感谢任何帮助。

注意:我在此 SDK 中使用了其他 caption-related 方法,而 'download' 是我唯一遇到问题的方法。

您在没有用户凭据的情况下初始化了服务(您只使用了 API 密钥)。查看我们 developers guide 中的示例之一(并选择正确的流程...您使用的是已安装的应用程序、windows phone 等吗?)

您必须更改创建服务的方式才能执行以下操作:

        UserCredential credential;
        using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
        {
            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                new[] { YoutubeService.Scope.<THE_RIGHT_SCOPE_HERE> },
                "user", CancellationToken.None);
        }

        // Create the service.
        _service = new YouTubeService(new BaseClientService.Initializer {
        ApplicationName = config.AppName,
                HttpClientInitializer = credential,
                ApplicationName = "Books API Sample",
            });

然后,对于 YouTube 服务的每个请求,您的 OAuth 访问令牌将作为额外的 header 包含在 HTTP 请求本身中。