Youtube API v3 .NET integration

本文关键字:integration NET v3 API Youtube | 更新日期: 2023-09-27 18:14:03

我有youtube api v2集成在我的应用程序。我有API密钥,我想集成Youtube API v3,但我得到错误401(响应状态码不表明成功)在

Microsoft.Runtime.CompilerServices.TaskAwaiter。在Microsoft.Runtime.CompilerServices.TaskAwaiter.抛出失败(Task Task)。HandleNonSuccess(Task Task) at google. api .Upload. resumableupload ' 1.d__0.MoveNext() in c:'code'google.com'google-api-dotnet-client'default'Tools'Google.Apis.Release'bin'Debug'output'default'Src'GoogleApis'Apis[Media]'Upload'ResumableUpload.cs:line 377

这是相关代码:

var youtubeService = new YouTubeService(new BaseClientService.Initializer()
{
    ApiKey = "myapikey",
    ApplicationName = ConfigurationManager.AppSettings["YoutubeApplicationName"].ToString(),
});
var video = new Video();
video.Snippet = new VideoSnippet();
video.Snippet.Title = "Default Video Title";
video.Snippet.Description = "Default Video Description";
video.Snippet.Tags = new string[] { "tag1", "tag2" };
video.Snippet.CategoryId = "22"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list
video.Status = new VideoStatus();
video.Status.PrivacyStatus = "unlisted"; // or "private" or "public"
var filePath = @"REPLACE_ME.mp4"; // Replace with path to actual movie file.
using (streamVideo)
{
    var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", streamVideo, "video/*");
    videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged;
    videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived;
    await videosInsertRequest.UploadAsync();
}

Youtube API v3 .NET integration

YouTube API错误参考将错误401列为authorizationRequiredyoutubeSignupRequired(在请求上下文错误标题下)。我不确定如何确定完整的错误信息-如果有可能从异常中看到实际的HTTP响应。

将您的代码与示例代码进行比较,您似乎没有将HttpClientInitializer值与YouTube用户的凭据一起传递。YouTube将需要这个来决定视频要上传到哪个频道。

相关片段:

  UserCredential credential; 
  using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)) 
  { 
    credential = await GoogleWebAuthorizationBroker.AuthorizeAsync( 
        GoogleClientSecrets.Load(stream).Secrets, 
        // This OAuth 2.0 access scope allows an application to upload files to the 
        // authenticated user's YouTube channel, but doesn't allow other types of access. 
        new[] { YouTubeService.Scope.YoutubeUpload }, 
        "user", 
        CancellationToken.None 
    ); 
  } 
  var youtubeService = new YouTubeService(new BaseClientService.Initializer() 
  { 
    HttpClientInitializer = credential, 
    ApplicationName = Assembly.GetExecutingAssembly().GetName().Name 
  }); 

我找到解决方案了。代码没有工作,因为应用程序托管在IIS上。IIS访问%appdata%文件夹中的文件夹时可能有问题。默认情况下,令牌文件保存在%appdata%文件夹中。我试过更改那个文件夹的权限。我添加了Everyone,DefaultAppPool,I_USER,…但没有成功。谷歌也有更新的版本。api(1.8.2)允许全路径( new FileDataStore(fullPath,true)) true表示全路径,但即使在那里也有bug。不可能使用那个构造函数,因为我总是得到错误。所以我决定我的应用程序应该使用IIS Express(事实上,我创建了一个带有授权代码的新项目)。进入解决方案属性并设置应用程序使用IIS Express。

  • 从https://console.developers.google.com(选择web应用程序)获取cliendId (json文件)并设置http:// localhost:48372(或任何你的应用程序端口使用)为javascript起源和http:// localhost:48372/authorize.aspx重定向url。您还应该在互联网上找到如何将端口设置为静态的)。保存您的clientId文件。(这一步你可能已经做过了)
  • 当你使用IIS express时,AuthorizeAsync方法应该没有问题。您将被提示输入您的凭据并选择您的youtube帐户(或仅选择帐户,如果您已经登录)。当你给你的应用程序权限时,你会被重定向到authorization .aspx。您的授权aspx页面应该创建新的IAuthorization流对象,并提供客户端秘密属性和数据存储属性。使用code= Request.Params["code"]从URL读取代码并创建UserCredential对象。youtubeService的HttpClientInitializer属性类型为UserCredential。您应该使用的方法类似于var usercredential= flow.SomeMethodWhichReceives("user",code,CancelletionToken.None)。之后,包含刷新令牌的文件将在您指定的 FileDataStore文件夹中生成。
  • 当你有你的刷新令牌,你可以做任何你想要的,因为刷新令牌应该永远持续(除非手动撤销)。有一种方法允许从refreshtoken获取usercredential,比如flow.getAccessTokenfromRefreshToken("user","your_refresh_token_string")

所以,当你有你的刷新令牌和使用方法最后一个方法,你将能够访问谷歌youtube api。你也有可能得到其他用户上传到你的youtube帐户使用这种方法。如果你对用户放在你的账户上的内容保守,你可以总是把他们上传的视频设置为私有,并在验证后将其更改为公共。

google youtube api中的一些方法需要OAUTH2认证(从客户端secret获取刷新令牌->从刷新令牌获取访问令牌…),例如上传视频,但像getvideos这样的方法不需要。你可以提供API key给你的youtubeService构造函数而不是UserCredential

编辑:还有一个我忘记提到的问题(对于那些认为这就是全部的人)。当你给你的应用程序权限访问谷歌api(就在你被重定向到authorization .aspx之前),你会得到错误redirect_url不匹配,因为在url参数redirect_url的某个地方与你在ClientId json中提供的重定向url不匹配,(端口不同,至少,出于某种原因)。更改此参数,使其与您在clientId json中提供的重定向url相匹配。