因此,请注意,这是我第一次使用google的api和开发人员控制台,因此,如果我错过明显的经验,请经验丰富的google开发人员认为常识,请原谅我。话虽如此。我正在尝试创建一个已安装的应用程序,它将使用我的帐户将视频上传到youtube。我正在使用Powershell编写应用程序,因此在启动脚本时会导入相应的google .Net库。从那里开始,我基本上使用了位于here的示例,并将内容转换为powershell:
Add-Type -AssemblyName mscorlib
Add-Type -AssemblyName System.Net.Http
Add-Type -AssemblyName System
Add-Type -AssemblyName System.Core
Add-Type -AssemblyName System.Numerics
Add-Type -AssemblyName System.Xml
Add-Type -AssemblyName System.Xml.Linq
Add-Type -AssemblyName System.Data
Add-Type -AssemblyName System.Runtime.Serialization
#the below command imports the following assemblies: Google.Apis.Auth.dll, Google.Apis.Auth.PlatformServices.dll, Google.Apis.Core.dll, Google.Apis.dll, Google.Apis.PlatformServices.dll, Google.Apis.YouTube.v3.dll
Get-ChildItem 'C:\Users\whiggs\Documents\SAPIEN\PowerShell Studio\Projects\youtube\*.dll' | % {[reflection.assembly]::LoadFrom($_.FullName)}
$vid = "C:\Users\whiggs\Documents\gery2.mp4"
#$file = [System.IO.File]::OpenRead("C:\Users\whiggs\Documents\SAPIEN\PowerShell Studio\Projects\youtube\client_id.json")
$filemode = [System.IO.FileMode]::Open
$fileaccess = [System.IO.FileAccess]::Read
$stream = New-object System.IO.FileStream -ArgumentList "C:\Users\whiggs\Documents\SAPIEN\PowerShell Studio\Projects\youtube\client_secret.json", $filemode, $fileaccess
$googlebroker = New-object Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker
$thing = [Google.Apis.Auth.OAuth2.GoogleClientSecrets]::Load($stream)
[string[]]$scope = [Google.Apis.YouTube.v3.YouTubeService+ScopeConstants]::YoutubeUpload
#$scope = [Google.Apis.YouTube.v3.YouTubeService+Scope]::YoutubeUpload
$cancellation = [System.Threading.CancellationToken]::None
$googlebroker = [Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker]::AuthorizeAsync($thing.Secrets, $scope, "<google_username>", $cancellation)
$googlebroker.Wait()
[Google.Apis.Auth.OAuth2.UserCredential]$cred = $googlebroker.Result
$baseclient = new-object Google.Apis.Services.BaseClientService+Initializer
$baseclient.HttpClientInitializer = $cred
$baseclient.ApplicationName = "Contacts Tool"
$service = New-Object Google.Apis.YouTube.v3.YouTubeService($baseclient)
$video = New-Object Google.Apis.YouTube.v3.Data.Video
$video.Snippet = New-Object Google.Apis.YouTube.v3.Data.VideoSnippet
$video.Snippet.Title = "test"
$video.Snippet.Description = "none"
$video.Status = New-Object Google.Apis.YouTube.v3.Data.VideoStatus
$video.Status.PrivacyStatus = "public"
$vidstream = New-Object System.IO.FileStream -ArgumentList $vid, $filemode
$request = $service.Videos.Insert($video, "public", $vidstream, "video/*")
$task = $request.UploadAsync()
$task.Wait()
$vidstream.close()
$vidstream.Dispose()
实际上不需要包含代码,因为我知道它编写正确,因为不会生成任何异常。当我运行上面的代码时,它会运行到完成而不会生成异常,但是如果我看一下存储在$ task中的对象(类型为System.Threading.Tasks.Task),而整个对象报告它已运行完毕,更深入地研究对象的“ Result”属性可揭示任务实际上已失败,而更进一步地研究“ exception”属性可提供以下错误消息:
The service youtube has thrown an exception: Google.GoogleApiException: Google.Apis.Requests.RequestError
Access Not Configured. YouTube Data API has not been used in project <snip> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/youtube.googleapis.com/overview?project=<snip> then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry. [403]
Errors [
Message[Access Not Configured. YouTube Data API has not been used in project <snip> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/youtube.googleapis.com/overview?project=<snip> then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.] Location[ - ] Reason[accessNotConfigured] Domain[usageLimits]
]
at Google.Apis.Upload.ResumableUpload`1.<InitiateSessionAsync>d__25.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Google.Apis.Upload.ResumableUpload.<UploadAsync>d__70.MoveNext()
因此,很明显,在配置应用程序或我对其进行身份验证时,该应用程序存在某种问题。但是,我知道该应用程序至少正在接收请求,如您所见here。因此,在进行了这项研究之后,我对问题可能是什么进行了一些有根据的猜测,并且需要以下方面的一些输入:a)其中哪些(如果有)是实际问题,以及b)需要做什么改正它。我的第一个有根据的猜测是涉及传递给Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker类的“ AuthorizeAsync”方法的参数。根据{{3}}文件: “在此示例代码中,通过调用GoogleWebAuthorizationBroker.AuthorizeAsync方法创建了一个新的UserCredential实例。此静态方法获取客户端密码(或客户端密码流),所需的作用域,用户标识符,用于取消操作,以及一个可选的数据存储。如果未指定该数据存储,则默认为FileDataStore,该文件具有默认的Google.Apis.Auth文件夹。该文件夹在Environment.SpecialFolder.ApplicationData中创建。“
我在上面的语句中要重点关注的部分是“用户标识符”,因为这是有关此参数描述的所有信息。 我输入的值是一个字符串,其中包含应用程序注册所用的Google帐户的用户名以及将上传youtube视频的帐户,但是我不知道这是否是所需的值,因为必须通过网络浏览器登录该帐户,作为此过程的一部分。如果确实存在问题,那么就此参数而言,“用户标识符”是什么。文档中的更多细节可能会大有帮助。我的第二种猜测是引起此问题的原因与应用程序的配置有关,更具体地说,与生成的oauth凭据有关。该应用程序需要访问的范围显然被认为是敏感的,并且,如果我正确理解这一点,我必须从经过验证的域进行身份验证,并配置一堆高级设置,这些人是为自己编写此项目的人,而不是公司,我只是无法访问。我只想将youtube视频上传到我的帐户,为什么我需要从经过验证的域进行身份验证?我该怎么办才能解决这个问题?任何信息都很棒。