我尝试使用YouTube API v3(https://developers.google.com/youtube/v3/docs/captions/download)和官方.NET SDK nuget包(https://www.nuget.org/packages/Google.Apis.YouTube.v3/,版本1.9.0.1360)下载字幕轨道。
返回的流包含以下文本:
"在查询字符串中收到了OAuth令牌,该API禁止使用JSON或XML以外的响应格式。如果可能,请尝试在授权标头中发送OAuth令牌。"
而不是我刚刚通过YouTube.com用户界面手动上传和验证的SRT纯文本内容。
我找到了错误类型: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上设置任何标头的方法,我想我不应该手动完成。我希望DownloadRequest(或YouTubeBaseServiceRequest)将放置
/// <summary>
/// OAuth 2.0 token for the current user.
/// </summary>
[RequestParameter("oauth_token", RequestParameterType.Query)]
public virtual string OauthToken { get; set; }
进入正确的授权标头。我在版本1.9.0.1360中看不到这一点。
也许我忽略了什么?非常感谢任何帮助。
注意:我在此SDK中使用了与标题相关的其他方法,并且&#39;下载&#39;是唯一一个遇到麻烦的人。
答案 0 :(得分:1)
您在没有用户凭据的情况下委托服务(您只使用了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访问令牌将作为HTTP请求本身的附加标头包含在内。