我尝试使用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
});
我找到了解决方案。代码不起作用,因为应用程序托管在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获取cliendId(json文件)(选择Web应用程序),并将http:// localhost:48372(或您的应用程序端口使用的任何端口)设置为javascript来源,并将http:// localhost:48372 / authorize.aspx设置为重定向URL。您还应该在互联网上找到如何使您的端口保持静态)。保存您的clientId文件。(您可能已经做过这一步)当您使用IIS Express时,AuthorizeAsync方法应该没有问题。系统将提示您输入凭据,然后选择您的YouTube帐户(如果您已经登录,请选择帐户)。当您授予您的应用程序许可后,您将被重定向到authorize.aspx。您的授权aspx页面应使用提供的“客户秘密”属性和DataStore属性创建新的IAuthorization流对象。使用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则不需要。您可以将API密钥(而不是UserCredential)提供给youtubeService建设者
编辑:还有一个我忘了提到的收获(对于那些以为这就是全部的人)。当您授予您的应用访问Google api的权限(在将您重定向到authorize.aspx之前)时,您会收到错误redirect_url不匹配的错误,因为url参数中的某处redirect_url与ClientId中提供的重定向URL不匹配json,(端口由于某些原因而有所不同)。更改此参数,使其与您在clientId json中提供的重定向URL匹配。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句