2014-09-02 194 views
4

我嘗試使用youtube api v3和.NET上傳視頻到youtube,但它永遠掛着調用AuthorizeAsync。你可以看到代碼也在:https://developers.google.com/youtube/v3/code_samples/dotnetgoogleWebAuthorizationBroker.AuthorizeAsync永遠掛起

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

回答

1

我找到解決方案。代碼沒有工作,因爲應用程序託管在IIS上。 IIS訪問%appdata%文件夾內的文件夾可能存在問題。令牌文件默認保存在%appdata%文件夾中。我試圖改變該文件夾的權限。我添加了Everyone,DefaultAppPool,I_USER,但沒有成功。還有一個更新版本的Google.Apis(1.8.2),允許完整路徑(新的FileDataStore(fullPath,true))true表示完整路徑,但即使存在錯誤也是如此。使用該構造函數是不可能的,因爲我總是得到錯誤。所以我決定我的應用程序應該使用IIS Express(實際上我使用授權代碼創建了新的項目)。轉到解決方案屬性並將您的應用程序設置爲使用IIS Express。

獲取cliendId從https://console.developers.google.com(選擇Web應用程序),並設置HTTP(JSON文件)://本地主機:48372(或任何你的應用程序使用的端口)的JavaScript的起源和http://本地主機:48372/authorize.aspx爲重定向網址。你也應該在網上找到如何讓你的端口靜態)。保存你的clientId文件。 (您可能已經完成了這一步) 由於您使用IIS Express,因此AuthorizeAsync方法應該沒有問題。您將被要求輸入您的憑據並選擇您的YouTube帳戶(或者如果您已經入住,請選擇帳戶)。當您授予您的應用權限時,您將被重定向到authorize.aspx。您的授權aspx頁面應該使用提供的Client Secret屬性和DataStore屬性創建新的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」) 因此,當你有刷新標記並使用方法的最後一個方法時,你將能夠訪問google youtube api。您也有可能使用這種方式將其他用戶上傳到您的YouTube帳戶。如果您對用戶放入您的帳戶的內容感到滿意,您可以隨時將他們上傳的視頻設爲不公開,並在驗證時將其更改爲公開視頻。

谷歌youtube api中的一些方法需要OAUTH2身份驗證(從客戶端祕密獲取刷新令牌 - >從刷新令牌獲取訪問令牌...),例如上傳視頻,但有些像getvideos不需要。您可以將API密鑰提供給您的youtubeService架構而不是UserCredential

編輯:還有一個catch我忘了提及(對於那些認爲這是全部)。當你給你的應用程序訪問google api的權限(就在你被重定向到authorize.aspx之前),你會得到錯誤redirect_url不匹配,因爲url parametar redirect_url中的某處與你在ClientId中提供的重定向url不匹配json,(由於某種原因,至少端口是不同的)。更改此參數,以便與您在clientId json中提供的重定向url匹配。

0

我用管理員權限運行VS,它有幫助。

+0

我一直在運行,但對我來說,這個問題是因爲當我使用IIS的方法,只是絞死。然後,我切換到IIS Express以獲取該令牌,並稍後在我的託管在IIS上的應用程序中使用它。 – 2015-12-30 14:07:43