Как вставить видео youtube api v3 через сервисный аккаунт с ruby

Моя цель - разрешить пользователям моего приложения загружать данные на мою учетную запись YouTube через мой сервер. У меня есть учетная запись разработчика, с включенным API данных YouTube и настройкой клиента учетной записи службы, и по какой-то причине я не авторизован. Я порылся в сети, чтобы попытаться выяснить, почему и нашел много вещей. Я попытался дать разрешения в настройках безопасности администратора с идентификатором и областью клиента проекта. Многие люди говорили, что эта ошибка вызвана тем, что у меня нет учетной записи YouTube, связанной с моей учетной записью. но я понятия не имею, как их связать.

Это мой скрипт upload_video.rb:

require 'rubygems'
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/file_storage'
require 'google/api_client/auth/installed_app'
require 'certified'

DEVELOPER_KEY = "MY-DEVELOPER-KEY"
YOUTUBE_UPLOAD_SCOPE = 'https://www.googleapis.com/auth/youtube.upload'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def get_authenticated_service
  puts @PROGRAM_NAME
  client = Google::APIClient.new(
    :application_name => $PROGRAM_NAME,
    :application_version => '1.0.0'
)

key = Google::APIClient::KeyUtils.load_from_pkcs12('oauth2service.p12', 'notasecret')
  auth_client = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => YOUTUBE_UPLOAD_SCOPE,
  :issuer => 'SERVICE ACCOUNT EMAIL ADDRESS',
  :signing_key => key)
 auth_client.fetch_access_token!
 client.authorization = auth_client
 youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)
 return client, youtube
end

def upload2youtube file, title, description, category_id, keywords, privacy_status

  client, youtube = get_authenticated_service
  begin
    body = {
  :snippet => {
    :title => title,
    :description => description,
    :tags => keywords.split(','),
    :categoryId => category_id,
  },
  :status => {
    :privacyStatus => privacy_status
  }
}

videos_insert_response = client.execute!(
  :api_method => youtube.videos.insert,
  :body_object => body,
  :media => Google::APIClient::UploadIO.new(file, 'video/*'),
  :parameters => {
    :uploadType => 'resumable',
    :part => body.keys.join(',')
  }
 )

 videos_insert_response.resumable_upload.send_all(client)

 puts "Video id '#{videos_insert_response.data.id}' was successfully uploaded."
 rescue Google::APIClient::TransmissionError => e
 puts e.result.body
 end
end

Вот как я запускаю его из другого скрипта:

require 'google/api_client'
require_relative 'upload_video'

$PROGRAM_NAME = 'MY-PROJECT-NAME'
upload2youtube File.open("somevideo.avi"), "title", "description", 'categoryid', 'tag1,tag2,tag3', 'unlisted'

И вот результат:

{
 "error": {
  "errors": [
   {
    "domain": "youtube.header",
    "reason": "youtubeSignupRequired",
    "message": "Unauthorized",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Unauthorized"
 }
}

Что я делаю неправильно

Ответы на вопрос(1)

Ваш ответ на вопрос