2017-08-28 116 views
1

我在MVC网络应用程序中使用YouTube API V3。目标是让我的网络用户使用我的OAuth凭据将视频上传到我的YouTube频道。用户将他们的视频上传到我的网络服务器后,我需要在我的网络服务器和YouTube之间进行自动上传,而不需要我自己的用户干预。YouTube API v3,C#MVC - 使用OAuth将视频上传到MY频道

我的(初稿)代码如下。我的问题是:

  1. 更新 - 下面解决。每当我尝试删除视频时,都会收到“未经授权”错误。当我检查令牌的范围时,它只有'YoutubeUpload'而不是'Youtube'。有什么办法可以解决这个问题吗?

  2. 我创造型的“其他” OAuth用户端凭证和出口的JSON(我指定的“其他”,而不是“Web应用程序” - 这是正确的?):https://console.developers.google.com/apis/credentials

当我尝试并上传视频,我将重定向到“授权应用”,并说“我的公司希望访问您的YouTube频道”。麻烦的是,我不想访问任何人的频道。我只是希望他们能够上传到我的频道。这是可能的,如果是的话,如何?

public async Task<string> UploadVideoToYouTube(Stream filestream) 
    { 
     UserCredential credential; 

     string cs = HttpContext.Current.Server.MapPath("~/client_secrets.json"); 

     using (var stream = new FileStream(cs, 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.Youtube, 
        YouTubeService.Scope.YoutubeUpload }, 
       "user", 
       CancellationToken.None 
      ); 
     } 

     //check scope with this URL 
     //https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={ACCESS-TOKEN} 
     // This bit checks if the token is out of date, 
     // and refreshes the access token using the refresh token. 
     if (credential.Token.IsExpired(SystemClock.Default)) 
     { 
      if (!await credential.RefreshTokenAsync(CancellationToken.None)) 
      { 
       Console.WriteLine("No valid refresh token."); 
      } 
     } 

     var youtubeService = new YouTubeService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = Assembly.GetExecutingAssembly().GetName().Name 
     }); 

     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" }; 
     //https://gist.github.com/dgp/1b24bf2961521bd75d6c 
     //26 - How-to & Style 
     video.Snippet.CategoryId = "26"; // See https://developers.google.com/youtube/v3/docs/videoCategories/list 
     video.Status = new VideoStatus(); 
     video.Status.PrivacyStatus = "private"; // "unlisted" or "private" or "public" 

     var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", filestream, "video/*"); 
     videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged; 
     videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived; 

     await videosInsertRequest.UploadAsync(); 

     return videosInsertRequest.ResponseBody.Id; 
    } 

    void videosInsertRequest_ResponseReceived(Video video) 
    { 
     //http://www.youtube.com/watch?v={VIDEO-ID} 
     Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id); 

    } 

    public async Task DeleteVideoFromYouTube(string id) 
    { 
     UserCredential credential; 

     string cs = HttpContext.Current.Server.MapPath("~/client_secrets.json"); 

     using (var stream = new FileStream(cs, 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.Youtube,      
       YouTubeService.Scope.YoutubeUpload }, 
       "user", 
       CancellationToken.None 
      ); 
     } 

     // This bit checks if the token is out of date, 
     // and refreshes the access token using the refresh token. 
     if (credential.Token.IsExpired(SystemClock.Default)) 
     { 
      if (!await credential.RefreshTokenAsync(CancellationToken.None)) 
      { 
       Console.WriteLine("No valid refresh token."); 
      } 
     } 

     var youtubeService = new YouTubeService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = Assembly.GetExecutingAssembly().GetName().Name 
     }); 

     var videosDeleteRequest = youtubeService.Videos.Delete(id); 
     await videosDeleteRequest.ExecuteAsync(); 


    } 

    void videosInsertRequest_ProgressChanged(IUploadProgress progress) 
    { 
     switch (progress.Status) 
     { 
      case UploadStatus.Uploading: 
       Console.WriteLine("{0} bytes sent.", progress.BytesSent); 
       break; 

      case UploadStatus.Failed: 
       Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception); 
       break; 
     } 
    } 

UPDATE解决的第一个问题是去这里:https://myaccount.google.com/permissions和删除授权的YouTube应用。它以前必须得到YouTubeService.Scope.Youtube范围的授权。

但是,当我删除该帐户并再次运行我的Web应用程序时,它促使我使用OAuth再次进行身份验证。我不希望它这样做。我希望它能够自动进行身份验证(适用于所有用户)。这是我仍然无人应答第二个问题....

+0

您是否得到了答案? – sachin

回答

0

这是下面的示例代码在YouTube上上传

视频
using System; 
using System.IO; 
using System.Reflection; 
using System.Threading; 
using System.Threading.Tasks; 

using Google.Apis.Auth.OAuth2; 
using Google.Apis.Services; 
using Google.Apis.Upload; 
using Google.Apis.Util.Store; 
using Google.Apis.YouTube.v3; 
using Google.Apis.YouTube.v3.Data; 

namespace Google.Apis.YouTube.Samples 
{ 
    /// <summary> 
    /// YouTube Data API v3 sample: upload a video. 
    /// Relies on the Google APIs Client Library for .NET, v1.7.0 or higher. 
    /// See https://developers.google.com/api-client-library/dotnet/get_started 
    /// </summary> 
    internal class UploadVideo 
    { 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Console.WriteLine("YouTube Data API: Upload Video"); 
     Console.WriteLine("=============================="); 

     try 
     { 
     new UploadVideo().Run().Wait(); 
     } 
     catch (AggregateException ex) 
     { 
     foreach (var e in ex.InnerExceptions) 
     { 
      Console.WriteLine("Error: " + e.Message); 
     } 
     } 

     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(); 
    } 

    private async Task Run() 
    { 
     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 
     }); 

     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 (var fileStream = new FileStream(filePath, FileMode.Open)) 
     { 
     var videosInsertRequest = youtubeService.Videos.Insert(video, "snippet,status", fileStream, "video/*"); 
     videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged; 
     videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived; 

     await videosInsertRequest.UploadAsync(); 
     } 
    } 

    void videosInsertRequest_ProgressChanged(Google.Apis.Upload.IUploadProgress progress) 
    { 
     switch (progress.Status) 
     { 
     case UploadStatus.Uploading: 
      Console.WriteLine("{0} bytes sent.", progress.BytesSent); 
      break; 

     case UploadStatus.Failed: 
      Console.WriteLine("An error prevented the upload from completing.\n{0}", progress.Exception); 
      break; 
     } 
    } 

    void videosInsertRequest_ResponseReceived(Video video) 
    { 
     Console.WriteLine("Video id '{0}' was successfully uploaded.", video.Id); 
    } 
    } 
} 
+0

感谢您的回应......但我不完全确定这是如何帮助解决我的问题..... –

0

关键是在这部分代码:

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

你必须指定正确的用户名称,而不仅仅是“用户”

+1

OP有可能故意混淆他们的用户名。 – alex

相关问题