Search code examples
ruby-on-railsrubyadsenseadsense-api

Is it possible to access the AdSense API using ruby?


I am trying to access the AdSense Management API using ruby. They recommend using their generic Google-API client library:

http://code.google.com/p/google-api-ruby-client/#Google_AdSense_Management_API

This hasn't been very helpful and I have run into errors:

Faraday conflicts in google_drive and google-api-client

Where should I start in order to get access to my AdSense data?

Thanks in advance.


Solution

  • Unfortunately, we haven't prepared any sample code for the AdSense Management API... yet! As you point out, though, the client library is generic, and should work with any of the newer Google APIs, so some of the other samples may help.

    If you're running into any specific issues, please create a question focused on those and point me to it, and I'll do my best to help.

    If you want a quick sample to get started, I can cook that up for you, but we should make sure the issues you're running into have to do with the AdSense Management API itself, and not just the client library, as the one you were linking to.

    [Edit] Here's a quick sample, based on Sinatra:

    #!/usr/bin/ruby
    require 'rubygems'
    require 'sinatra'
    require 'google/api_client'
    
    FILENAME = 'auth.obj'
    OAUTH_CLIENT_ID = 'INSERT_OAUTH2_CLIENT_ID_HERE'
    OAUTH_CLIENT_SECRET = 'INSERT_OAUTH2_CLIENT_SECRET_HERE'
    
    before do
      @client = Google::APIClient.new
      @client.authorization.client_id = OAUTH_CLIENT_ID
      @client.authorization.client_secret = OAUTH_CLIENT_SECRET
      @client.authorization.scope = 'https://www.googleapis.com/auth/adsense'
      @client.authorization.redirect_uri = to('/oauth2callback')
      @client.authorization.code = params[:code] if params[:code]
    
      # Load the access token here if it's available
      if File.exist?(FILENAME)
        serialized_auth = IO.read(FILENAME)
        @client.authorization = Marshal::load(serialized_auth)
      end
      if @client.authorization.refresh_token && @client.authorization.expired?
        @client.authorization.fetch_access_token!
      end
      @adsense = @client.discovered_api('adsense', 'v1.1')
      unless @client.authorization.access_token || request.path_info =~ /^\/oauth2/
        redirect to('/oauth2authorize')
      end
    end
    
    get '/oauth2authorize' do
      redirect @client.authorization.authorization_uri.to_s, 303
    end
    
    get '/oauth2callback' do
      @client.authorization.fetch_access_token!
      # Persist the token here
      serialized_auth = Marshal::dump(@client.authorization)
      File.open(FILENAME, 'w') do |f|
        f.write(serialized_auth)
      end
      redirect to('/')
    end
    
    get '/' do
    
      call = {
        :api_method => @adsense.reports.generate,
        :parameters => {
          'startDate' => '2011-01-01',
          'endDate' => '2011-08-31',
          'dimension' => ['MONTH', 'CUSTOM_CHANNEL_NAME'],
          'metric' => ['EARNINGS', 'TOTAL_EARNINGS']
        }
      }
    
      response = @client.execute(call)
      output = ''
    
      if response && response.data && response.data['rows'] &&
          !response.data['rows'].empty?
        result = response.data
    
        output << '<table><tr>'
        result['headers'].each do |header|
          output << '<td>%s</td>' % header['name']
        end
        output << '</tr>'
    
        result['rows'].each do |row|
          output << '<tr>'
          row.each do |column|
            output << '<td>%s</td>' % column
          end
          output << '</tr>'
        end
    
        output << '</table>'
      else
        output << 'No rows returned'
      end
    
      output
    end