Muestras de código de Ruby

Las siguientes muestras de código, que usan la biblioteca cliente de las APIs de Google para Ruby, están disponibles para YouTube Analytics API. Puedes descargar estas muestras de código desde la carpeta ruby del repositorio de muestras de código de las APIs de YouTube en GitHub.

Autorizar una solicitud

La siguiente muestra de código realiza la autorización de OAuth 2.0 verificando la presencia de un archivo local que contiene credenciales de autorización. Si el archivo no está presente, la secuencia de comandos abre un navegador y espera una respuesta, y, luego, guarda las credenciales devueltas de forma local.

require 'google/api_client' require 'google/api_client/client_secrets' require 'json' require 'launchy' require 'thin'  RESPONSE_HTML = <<stop <html>   <head>     <title>OAuth 2 Flow Complete</title>   </head>   <body>     You have successfully completed the OAuth 2 flow. Please close this browser window and return to your program.   </body> </html> stop  FILE_POSTFIX = '-oauth2.json'  # Small helper for the sample apps for performing OAuth 2.0 flows from the command # line. Starts an embedded server to handle redirects. class CommandLineOAuthHelper    def initialize(scope)     credentials = Google::APIClient::ClientSecrets.load     @authorization = Signet::OAuth2::Client.new(       :authorization_uri => credentials.authorization_uri,       :token_credential_uri => credentials.token_credential_uri,       :client_id => credentials.client_id,       :client_secret => credentials.client_secret,       :redirect_uri => credentials.redirect_uris.first,       :scope => scope     )   end    # Request authorization. Checks to see if a local file with credentials is present, and uses that.   # Otherwise, opens a browser and waits for response, then saves the credentials locally.   def authorize     credentialsFile = $0 + FILE_POSTFIX      if File.exist? credentialsFile       File.open(credentialsFile, 'r') do |file|         credentials = JSON.load(file)         @authorization.access_token = credentials['access_token']         @authorization.client_id = credentials['client_id']         @authorization.client_secret = credentials['client_secret']         @authorization.refresh_token = credentials['refresh_token']         @authorization.expires_in = (Time.parse(credentials['token_expiry']) - Time.now).ceil         if @authorization.expired?           @authorization.fetch_access_token!           save(credentialsFile)         end       end     else       auth = @authorization       url = @authorization.authorization_uri().to_s       server = Thin::Server.new('0.0.0.0', 8080) do         run lambda { |env|           # Exchange the auth code & quit           req = Rack::Request.new(env)           auth.code = req['code']           auth.fetch_access_token!           server.stop()           [200, {'Content-Type' => 'text/html'}, RESPONSE_HTML]         }       end        Launchy.open(url)       server.start()        save(credentialsFile)     end      return @authorization   end    def save(credentialsFile)     File.open(credentialsFile, 'w', 0600) do |file|       json = JSON.dump({         :access_token => @authorization.access_token,         :client_id => @authorization.client_id,         :client_secret => @authorization.client_secret,         :refresh_token => @authorization.refresh_token,         :token_expiry => @authorization.expires_at       })       file.write(json)     end   end end 

Recuperar los 10 videos principales por cantidad de reproducciones

En este ejemplo, se llama al método reports.query de la API para recuperar datos de YouTube Analytics. De forma predeterminada, el informe recupera los 10 videos más populares según el recuento de vistas y muestra varias métricas para esos videos, ordenando los resultados en orden inverso según el recuento de vistas. Si configuras parámetros de la línea de comandos, también puedes usar el mismo código para recuperar otros informes.

#!/usr/bin/ruby  require 'rubygems' gem 'google-api-client', '>0.7' 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 'trollop'  # These OAuth 2.0 access scopes allow for read-only access to the authenticated # user's account for both YouTube Data API resources and YouTube Analytics Data. YOUTUBE_SCOPES = ['https://www.googleapis.com/auth/youtube.readonly',   'https://www.googleapis.com/auth/yt-analytics.readonly'] YOUTUBE_API_SERVICE_NAME = 'youtube' YOUTUBE_API_VERSION = 'v3' YOUTUBE_ANALYTICS_API_SERVICE_NAME = 'youtubeAnalytics' YOUTUBE_ANALYTICS_API_VERSION = 'v1'  def get_authenticated_services   client = Google::APIClient.new(     :application_name => $PROGRAM_NAME,     :application_version => '1.0.0'   )   youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)   youtube_analytics = client.discovered_api(YOUTUBE_ANALYTICS_API_SERVICE_NAME, YOUTUBE_ANALYTICS_API_VERSION)    file_storage = Google::APIClient::FileStorage.new("#{$PROGRAM_NAME}-oauth2.json")   if file_storage.authorization.nil?     client_secrets = Google::APIClient::ClientSecrets.load     flow = Google::APIClient::InstalledAppFlow.new(       :client_id => client_secrets.client_id,       :client_secret => client_secrets.client_secret,       :scope => YOUTUBE_SCOPES     )     client.authorization = flow.authorize(file_storage)   else     client.authorization = file_storage.authorization   end    return client, youtube, youtube_analytics end  def main   now = Time.new.to_i   seconds_in_day = 60 * 60 * 24   seconds_in_week = seconds_in_day * 7   one_day_ago = Time.at(now - seconds_in_day).strftime('%Y-%m-%d')   one_week_ago = Time.at(now - seconds_in_week).strftime('%Y-%m-%d')    opts = Trollop::options do     opt :metrics, 'Report metrics', :type => String, :default => 'views,comments,favoritesAdded,favoritesRemoved,likes,dislikes,shares'     opt :dimensions, 'Report dimensions', :type => String, :default => 'video'     opt 'start-date', 'Start date, in YYYY-MM-DD format', :type => String, :default => one_week_ago     opt 'end-date', 'Start date, in YYYY-MM-DD format', :type => String, :default => one_day_ago     opt 'start-index', 'Start index', :type => :int, :default => 1     opt 'max-results', 'Max results', :type => :int, :default => 10     opt :sort, 'Sort order', :type => String, :default => '-views'   end    client, youtube, youtube_analytics = get_authenticated_services    begin     # Retrieve the channel resource for the authenticated user's channel.     channels_response = client.execute!(       :api_method => youtube.channels.list,       :parameters => {         :mine => true,         :part => 'id'       }     )      channels_response.data.items.each do |channel|       opts[:ids] = "channel==#{channel.id}"        # Call the Analytics API to retrieve a report. For a list of available       # reports, see:       # https://developers.google.com/youtube/analytics/v1/channel_reports       analytics_response = client.execute!(         :api_method => youtube_analytics.reports.query,         :parameters => opts       )        puts "Analytics Data for Channel #{channel.id}"        analytics_response.data.columnHeaders.each do |column_header|         printf '%-20s', column_header.name       end       puts        analytics_response.data.rows.each do |row|         row.each do |value|           printf '%-20s', value         end         puts       end     end   rescue Google::APIClient::TransmissionError => e     puts e.result.body   end end  main