Проблема с аутентификацией в Google API или проблема с приложением - PullRequest
1 голос
/ 13 июня 2019

Итак, просто наперед, я впервые работаю с API и консолью разработчиков Google, так что простите, если я упустил что-то очевидное, что более опытный разработчик 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()

Итак, ясно, что есть какая-то проблема с приложением, как оно настроено, или как я аутентифицируюсь в нем. Тем не менее, я знаю, что приложение по крайней мере получает запросы, как вы можете видеть здесь . Итак, после проведения такого исследования, у меня есть пара образованных догадок относительно того, в чем может быть проблема, и мне нужен некоторый вклад в то, чтобы а) какой из них (если есть) является реальной проблемой, и б) что нужно сделать, чтобы исправь это. Мое первое обоснованное предположение включает параметры, которые я передал методу «AuthorizeAsync» класса Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker. Согласно этому документу: «В этом примере кода новый экземпляр UserCredential создается путем вызова метода GoogleWebAuthorizationBroker.AuthorizeAsync. Этот статический метод получает секретный ключ клиента (или поток к секретному ключу клиента), необходимые области действия, идентификатор пользователя, маркер отмены для отмены операции и необязательное хранилище данных. Если хранилище данных не указано, по умолчанию используется хранилище FileDataStore со стандартной папкой Google.Apis.Auth. Папка создается в Environment.SpecialFolder.ApplicationData. "

Часть, на которой я хочу сосредоточиться в приведенном выше утверждении, это «идентификатор пользователя», так как это вся информация, которая предоставляется в отношении описания этого параметра. Значение, которое я ввел, было строкой, содержащей имя пользователя для учетной записи Google, под которой зарегистрировано приложение, и учетную запись, которая будет загружать видео YouTube, но я не знаю, было ли это значение, которое было необходимо, так как я должен был войти в учетную запись в любом случае через веб-браузер, как часть этого процесса. Если это действительно проблема, что такое «идентификатор пользователя» в отношении этого параметра. Немного больше деталей в документации может иметь большое значение. Мое второе обоснованное предположение о том, что является причиной этого, связано с конфигурацией приложения, а точнее сгенерированными учетными данными oauth. Области, к которым приложению потребуется доступ, очевидно, считаются конфиденциальными, и, если я правильно понимаю, я должен пройти аутентификацию из проверенного домена и настроить кучу расширенных настроек, которые, как кто-то пишет этот проект для себя, а не как Компания, у меня просто нет доступа к. Я просто хочу загрузить видео YouTube в свою учетную запись, так зачем мне проходить аутентификацию на проверенном домене? Что я могу сделать, чтобы обойти это? Любая информация была бы отличной.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Исправление ошибки в вашем понимании

"<google_username>" используется filedatastore для хранения учетных данных для пользователя после того, как он дал согласие на доступ к вашему клиенту.Если вы хотите больше узнать об этом, попробуйте прочитать мое руководство по file dastore

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

Ответьте на свой вопрос

API данных YouTubeранее не использовался в проекте или был отключен.

Означает, что вы не включили API YouTube в своем проекте на консоли разработчика Google , или вы не подали заявку и не былипредоставлены какие-либо квоты для этого API еще.В Консоль разработчика Google перейдите в API Library -> YouTube Data API v3 и включите его.После того, как вы сделали это, нажмите Управление, затем перейдите в Квота.Если вы ранее не включали его, что, как я подозреваю, не было, то теперь у вас будет 0 квота.

enter image description here

щелкните значок пениса и подайте заявку наквота для этого API.Чтобы получить ответ, может потребоваться некоторое время.

0 голосов
/ 13 июня 2019

Это сообщение об ошибке просто означает, что вы не включили API в облачной консоли.Можете ли вы опубликовать сообщение об ошибке, которое вы получили после включения API?Также убедитесь, что вы запускаете сценарий с учетными данными для правильного проекта.Вы можете запустить glcoud config list, чтобы увидеть, какой проект вы используете.

...