Итак, просто наперед, я впервые работаю с 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 в свою учетную запись, так зачем мне проходить аутентификацию на проверенном домене? Что я могу сделать, чтобы обойти это? Любая информация была бы отличной.