May 082012
 

(read this post in english)

En este artículo vamos a comentar la manera de usar la versión v201109 del API de Google Adwords en Perl. En la exposición que sigue suponemos que ya contamos con una cuenta de Adwords, y que hemos creado ya alguna campaña que contiene algunos adgroups.

Instalación de la librería Perl del API de AdWords

Comenzamos por descargarnos la librería desde el sitio web de google: http://code.google.com/p/google-api-adwords-perl/downloads/list Cuando accedemos a la url arriba indicada, vemos que la última versión de la librería es el fichero awapi_perl_lib_2_5_6.tar.gz.

Una vez descargada y descomprimida, procedemos a su instalación executando los siguientes pasos en el directorio en donde se ha extraído:

1. Identificación de dependencias a instalar

$ perl Build.PL

En nuestra instalación, la salida de este comando es:

Checking prerequisites...
 requires:
 ! IO::Socket::SSL is not installed
 ! Math::Random::MT is not installed
 ! XML::Simple is not installed
 build_requires:
 ! Config::Properties is not installed
 ! Test::MockObject is not installed

2. Instalación de dependencias

Como usuario root, ejecutamos:

$ perl Build installdeps

3. Instalación del módulo

$ perl Build
$ sudo perl Build install

A continuación, vamos a probar un programa perl que obtiene los identificadores de las campañas existentes en nuestra cuenta adwords.

Estructura del programa

#!/usr/bin/perl -w

use strict;
use warnings;
use lib "../adwords_api/awapi_perl_lib_2_5_6/lib";

use Google::Ads::AdWords::Client;
use Google::Ads::AdWords::Logging;
use Google::Ads::AdWords::v201109::OrderBy;
use Google::Ads::AdWords::v201109::Paging;
use Google::Ads::AdWords::v201109::Predicate;
use Google::Ads::AdWords::v201109::Selector;

use constant PAGE_SIZE => 500;
use Cwd qw(abs_path);
use POSIX;

sub get_campaigns {
     ...
}
# Grabar la petición SOAP XML, la respuesta y los errores del API.
Google::Ads::AdWords::Logging::enable_all_logging();

# Obtener una conexión al servidor de AdWords.
# Los datos de validación del cliente se leen del fichero 'adwords.properties'
# en el directorio de login del usuario.
my $client = Google::Ads::AdWords::Client->new({
        version => "v201109"
        });

# By default examples are set to die on any server returned fault.
$client->set_die_on_faults(1);

# Call the example
get_campaigns($client);

En la línea cinco se indica la ubicación en donde hemos depositado la librería. A continuación se incluyen los distintos módulos que vamos a utilizar de la librería, y después viene la definición de la rutina “get_campaigns”, que comentamos más adelante. Por último tenemos el programa principal en donde se establece la conexión con el servidor de AdWords, y se llama a la rutina “get_campaigns”.

Validación del cliente adwords

Para obtener una conexión al servidor de Adwords hacemos la llamada:

my $client = Google::Ads::AdWords::Client->new({
        version => "v201109"
        });

en donde como vemos sólo hemos especificado la versión del API que vamos a utilizar. El resto de la información necesaria para validar el cliente se encuentra en el fichero “adwords.properties” en el directorio de login del usuario. Este fichero es de la forma:

 # Please see http://code.google.com/apis/adwords/docs/headers.html
 # for an overview of header information.
 # The email and password values listed here are used to generate the authToken.
 # The clientId value can either correspond to clientCustomerId or clientEmail.

 email=INSERTA-AQUI-LA-DIRECCION-DE-EMAIL

 # Password corresponding to the account listed in email.

 password=INSERTA-AQUI-LA-CONTRASEÑA

 clientId=INSERTA-AQUI-EL-ID-DE-CLIENTE

 # A string of your choosing, used to identify your application.
 userAgent="Demo Adwords API Perl"

 developerToken=INSERTA-AQUI-EL-DEVELOPER-TOKEN

 # Set the following to use an existing AuthToken. This is optional if set, then
 # email and password will not be used.
 #authToken=
 # To use the Sandbox environment, uncomment the alternativeUrl.
 #alternateUrl=https://adwords-sandbox.google.com

Alternativamente, es posible pasar toda la información de validación necesaria mediante argumentos en la llamada a Client->new , siendo innecesario en este caso el fichero “adwords.properties”:

my $client = Google::Ads::AdWords::Client->new({
        version => "v201109",
        email => 'INSERTA-AQUI-LA-DIRECCION DE EMAIL',
        password => 'INSERTA-AQUI-LA-CONTRASEÑA',
        client_id => 'INSERTA-AQUI-EL-ID-DE-CLIENTE',
        developer_token => 'INSERTA-AQUI-EL-DEVELOPER-TOKEN',
        user_agent => 'Test Adwords API Perl',
        });

Subrutina “get_campaigns”

sub get_campaigns {
  my $client = shift;

  # Crear un selector.
  my $paging = Google::Ads::AdWords::v201109::Paging->new({
    startIndex => 0,
    numberResults => PAGE_SIZE
  });
  my $selector = Google::Ads::AdWords::v201109::Selector->new({
    fields => ["Id", "Name"],
    ordering => [Google::Ads::AdWords::v201109::OrderBy->new({
      field => "Name",
      sortOrder => "ASCENDING"
    })],
    paging => $paging
  });
  # Obtener los resultados, página a página
  my $page;
  do {
    # Obtener todas las campañas.
    $page = $client->CampaignService()->get({serviceSelector => $selector});

    # Presentar en pantalla los nombres e IDs de las campañas
    if ($page->get_entries()) {
      foreach my $campaign (@{$page->get_entries()}) {
        printf "Encontrada campaña "%s" con id "%d".n",
               $campaign->get_name(), $campaign->get_id();
      }
    } else {
      print "No se han encontrado campañas.n";
    }
    $paging->set_startIndex($paging->get_startIndex() + PAGE_SIZE);
  } while ($paging->get_startIndex() < $page->get_totalNumEntries());

  return 1;
}

En primer lugar, creamos un selector genérico, en el que inidicamos los campos que queremos obtener, y los criterios de búsqueda, ordenación y paginación de los resultados.

Después, aplicamos el selector al método $client->CampaignService->get(), y presentamos en pantalla los resultados. En la primera llamada a get(), obtenemos un máximo de PAGE_SIZE resultados, en donde PAGE_SIZE es una constante que hemos definido al principio del programa.

Repetimos la llamada a CampaignService.get() (habiendo actualizado los valores de la variable $paging que utiliza el selector), hasta obtener todos los resultados.

Obtener todos los adgroups de una campaña

En el ejemplo anterior hemos visto como recuperar todas las IDs de las campañas existentes en la cuenta. Si queremos  obtener los adgroups de una campaña, el código es muy similar, con la diferencia de que:

  • Llamamos al método $client->AdGroupService()->get() en vez de a
    $client->CampaignService->get()
  • En el selector, incluimos un filtro para seleccionar sólamente los adgrupos de una campaña, identificada por su id de campaña.
    Para definir el filtro, creamos un objeto ‘predicate’ que contiene las condiciones del filtro
Ejemplo:
sub get_ad_groups {
  my $client = shift;
  my $campaign_id = shift; // Pasamos el campaign_id como argumento

  # Crear el 'predicate' (condición) a aplicar en la búsqueda
  my $campaign_predicate = Google::Ads::AdWords::v201109::Predicate->new({
    field => "CampaignId",
    operator => "IN",
    values => [$campaign_id]
  });

  # Crear el selector
  my $paging = Google::Ads::AdWords::v201109::Paging->new({
    startIndex => 0,
    numberResults => PAGE_SIZE
  });
  my $selector = Google::Ads::AdWords::v201109::Selector->new({
    fields => ["Id", "Name"],
    predicates => [$campaign_predicate],
    ordering => [Google::Ads::AdWords::v201109::OrderBy->new({
      field => "Name",
      sortOrder => "ASCENDING"
    })],
    paging => $paging
  });

  # Obtener los resultados, página a página
  my $page;
  do {
    # Obtener todos los adgroups
    $page = $client->AdGroupService()->get({serviceSelector => $selector});

    # Presentar en pantalla los nombres e IDs de los adgroups recibidos
    if ($page->get_entries()) {
      my @results = ref($page->get_entries()) eq "ARRAY" ?
          @{$page->get_entries()} : ($page->get_entries());
      foreach my $ad_group (@results) {
        printf "Encontrado adgroup con nombre "%s" e id "%d".n",
               $ad_group->get_name(), $ad_group->get_id();
      }
    } else {
      print "No se encontró ningún adgroup.n";
    }
    $paging->set_startIndex($paging->get_startIndex() + PAGE_SIZE);
  } while ($paging->get_startIndex() < $page->get_totalNumEntries());

  return 1;
}
 Publicado por en 7:14 pm

  2 Respuestas a “Cómo usar el API de Google Adwords en Perl”

  1. […] un artículo anterior hemos visto cómo se pueden desarrollar scripts perl de administración automatizada de campañas de Google Adwords, utilizando la librería Perl que implementa el API de acceso a Google […]

 Deja un comentario

(requerido)

(requerido)