向Google api进行身份验证时发生问题,或者与应用程序发生问题

时间:2019-06-12 22:58:41

标签: google-api youtube-api google-oauth youtube-data-api google-api-dotnet-client

因此,请注意,这是我第一次使用google的api和开发人员控制台,因此,如果我错过明显的经验,请经验丰富的google开发人员认为常识,请原谅我。话虽如此。我正在尝试创建一个已安装的应用程序,它将使用我的帐户将视频上传到youtube。我正在使用Powershell编写应用程序,因此在启动脚本时会导入相应的google .Net库。从那里开始,我基本上使用了此处的示例,并将内容转换为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视频上传到我的帐户,为什么我需要从经过验证的域进行身份验证?我该怎么办才能解决这个问题?任何信息都很棒。

2 个答案:

答案 0 :(得分:1)

纠正您的理解错误

一旦用户同意访问您的客户端,filedatastore就会使用

"<google_username>"为用户存储证书。如果您想了解更多有关此的信息,则应该尝试阅读我在file datastore

上的教程
$googlebroker = [Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker]::AuthorizeAsync($thing.Secrets, $scope, "<google_username>", $cancellation)

回答您的问题

  

YouTube数据API之前尚未在项目中使用过,或者已被禁用。

表示您尚未在google Developer console的项目中启用YouTube api,或者尚未为此API申请任何配额。在Google developer console中,转到API库-> YouTube数据API v3并启用它。完成此操作后,单击“管理”,然后转到“配额”。如果您以前没有启用过它(我怀疑您没有启用过),那么现在您将有0个配额。

enter image description here

单击“阴茎”图标并为此API申请配额。需要一段时间才能得到答复。

答案 1 :(得分:0)

该错误消息仅表示您尚未在Cloud Console中启用API。启用API后,您能否发布收到的错误消息?另外,请确保您使用正确项目的凭据运行脚本。您可以运行glcoud config list来查看正在使用的项目。