我尝试使用youtube api v3和.NET将视频上传到youtube,但它永远挂起来调用AuthorizeAsync。您也可以在以下位置查看代码:https://developers.google.com/youtube/v3/code_samples/dotnet
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
});
答案 0 :(得分:1)
我找到了解决方案。代码没有用,因为应用程序托管在IIS上。 IIS访问%appdata%文件夹中的文件夹可能存在问题。令牌文件默认保存在%appdata%文件夹中。我尝试更改该文件夹的权限。我添加了Everyone,DefaultAppPool,I_USER,......但没有成功。还有更新版本的Google.Apis(1.8.2)允许完整路径(新的FileDataStore(fullPath,true))true表示完整路径,但即使存在错误。使用该构造函数是不可能的,因为我总是会收到错误。所以我决定我的应用程序应该使用IIS Express(实际上我创建了带有授权代码的新项目)。转到解决方案属性并使用IIS Express设置应用程序。
从https://console.developers.google.com获取cliendId(json文件)(选择Web应用程序)并为javascript起源设置http:// localhost:48372(或您的应用程序端口使用的任何内容)和http:// localhost:48372 / authorize .aspx用于重定向网址。您还应该在互联网上找到如何使您的端口静态)。保存您的clientId文件。 (这个步骤你可能已经做过了) 当您使用IIS express时,AuthorizeAsync方法应该没有问题。您将被要求输入您的凭据并选择您的YouTube帐户(或者如果您已经进入帐户,则选择帐户)。当您授予应用程序权限时,您将被重定向到authorize.aspx。您的授权aspx页面应该创建新的IAuthorization流对象,并提供Client Secret属性和DataStore proprty。使用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") 因此,当您拥有刷新令牌并使用方法last方法时,您将能够访问google youtube api。您也可以使用此方法将其他用户上传到您的YouTube帐户。如果您认为用户在您的帐户中添加了内容,您可以随时制作他们上传的视频,并在验证后将其更改为公开。
google youtube api中的一些方法需要OAUTH2身份验证(从客户端密钥获取刷新令牌 - >从刷新令牌获取访问令牌...),例如上传视频,但有些像getvideos不需要。您可以为youtubeService结构提供API密钥,而不是UserCredential
编辑:还有一个我忘记提及的问题(对于那些认为这一切的人)。如果您授予应用访问google api的权限(在您被重定向到authorize.aspx之前),则会出现错误redirect_url不匹配,因为url parametar redirect_url中的某个位置与您在ClientId中提供的重定向网址不匹配json,(端口是不同的,至少,由于某种原因)。更改此参数,以便与您在clientId json中提供的重定向URL匹配。答案 1 :(得分:0)
我使用管理员权限运行VS并且它有所帮助。