【问题标题】:Youtube API v3 .NET integrationYoutube API v3 .NET 集成
【发布时间】:2014-09-11 15:04:03
【问题描述】:

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

Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) at Google.Apis.Upload.ResumableUpload`1.d__0.MoveNext() in c:\代码\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\output\default\Src\GoogleApis\Apis[媒体]\Upload\ResumableUpload.cs: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();
}

【问题讨论】:

    标签: c# youtube youtube-api


    【解决方案1】:

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

    将您的代码与sample code 进行比较,您似乎没有将HttpClientInitializer 值与YouTube 用户的凭据一起传递。 YouTube 将需要此信息来确定要将视频上传到哪个频道。

    相关sn-p:

      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 
      }); 
    

    【讨论】:

    • 是的,我必须使用 HttpClientInitializer,但是当我调用 GoogleWebAuthorizationBroker.AuthorizeAsync 时没有任何反应。程序挂起,无一例外。
    【解决方案2】:

    我找到了解决办法。代码不起作用,因为应用程序托管在 IIS 上。 IIS 访问 %appdata% 文件夹内的文件夹可能存在问题。令牌文件默认保存在 %appdata% 文件夹中。我尝试更改对该文件夹的权限。我添加了 Everyone,DefaultAppPool,I_USER,... 但没有成功。还有更新版本的 Google.Apis (1.8.2) 允许完整路径 ( new FileDataStore(fullPath,true)) true 表示完整路径,但即使存在错误。无法使用该构造函数,因为我总是出错。所以我决定我的应用程序应该使用 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 帐户(如果您已经登录,则只需选择帐户)。当您授予您的应用权限时,您将被重定向到 authorize.aspx。您的授权 aspx 页面应创建新的 IAuthorization 流对象,并提供 Client Secret 属性和 DataStore 属性。使用code= Request.Params["code"] 从URL 读取代码并创建UserCredential 对象。youtubeService 的HttpClientInitializer 属性是UserCredential 类型。您应该使用的方法类似于 var usercredential= flow.SomeMethodWhichReceives("user",code,CancelletionToken.None)。之后,在您指定的 FileDataStore 文件夹中生成包含刷新令牌的文件。
    • 当您拥有刷新令牌时,您可以做任何您想做的事情,因为刷新令牌应该永远存在(除非手动撤销)。有一种方法允许从 refreshtoken 获取用户凭据,例如 flow.getAccessTokenfromRefreshToken("user","your_refresh_token_string")

    因此,当您拥有刷新令牌并使用方法 last 方法时,您将能够访问 google youtube api。您还可以使用这种方法将其他用户上传到您的 youtube 帐户。如果您对用户在您的帐户中添加的内容有所了解,您可以随时将他们上传的视频设为私有,并在您验证它们时将其更改为公开。

    google youtube api 中的某些方法需要 OAUTH2 身份验证(从客户端密钥获取刷新令牌 -> 从刷新令牌获取访问令牌...),例如上传视频,但有些方法不需要 getvideos。您可以向您的 youtubeService 构造器提供 API 密钥,而不是 UserCredential

    编辑:还有一个我忘了提的问题(对于那些认为这就是全部的人)。当您授予您的应用访问 google api 的权限时(就在您被重定向到 authorize.aspx 之前),您将收到错误 redirect_url mismatch,因为 url 参数 redirect_url 中的某处与您提供的重定向 url 不匹配您的 ClientId json,(至少由于某种原因,端口不同)。更改此参数,使其与您在 clientId json 中提供的重定向 url 匹配。

    【讨论】:

      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 2016-12-31
      • 2019-11-09
      • 2013-06-01
      • 2016-03-28
      • 2018-03-19
      • 2016-11-05
      • 2014-05-11
      相关资源
      最近更新 更多