Usando API PHP do Google Adwords – AWQL

E ai meu povo, tudo bom?

Putz… estou anos luzes sem postar nada aqui no fórum, inclusive fiz algumas promessas no passado mas não consegui realizar, porém, neste novo ano tentarei ser um pouco mais ativo no blog!
Bom, estive envolvido em vários projetos, entre eles mudei de empresa (sempre estive envolvido no setor Automobilístico trabalhando em Concessionárias, passei por um período na Fábrica da Case New Holland e hoje voltei para o setor de concessionárias, melhor dizendo, hoje desenvolvo soluções para esse setor em uma empresa focada nisso).

Neste novo desafio que estou precisei fazer algumas integrações no Google Analytics, SEO e Adwords. Baixei o SDK da Google em PHP e particularmente achei muito complexo para realizar coisas um tanto ‘simples’. E nisso resolvi compartilhar e guardar aqui no Blog a forma que realizo essas integrações usando o recurso AWQL.

Começando pelo Google Adwords…

1° Baixem a biblioteca do Google Adwords
https://github.com/googleads/googleads-php-lib

2° Sigam os passos de autenticação oAuth2 que o Google faz neste link:
https://developers.google.com/adwords/api/docs/guides/authentication?hl=pt-br

3° Realizado os passos 1 e 2, vamos configurar o arquivo ‘adsapi_php.ini’ que está dentro da pasta que você baixou.
Obs.: Estarei fazendo os testes dentro da pasta GoogleAds-Php-Lib.

<?php
[ADWORDS]
; Required AdWords API properties. Details can be found at:
; https://developers.google.com/adwords/api/docs/guides/basic-concepts#soap_and_xml
developerToken = "SEU_TOKEN"
clientCustomerId = "CLIENT_ID VOCÊ PEGA NA CONTA DO ADWORDS"

; Optional. Set a friendly application name identifier.
; userAgent = "INSERT_USER_AGENT_HERE"

; Optional additional AdWords API settings.
; endpoint = "https://adwords.google.com/"
; isPartialFailure = false

; Optional setting for utility usage tracking in the user agent in requests.
; Defaults to true.
; includeUtilitiesInUserAgent = true

[ADWORDS_REPORTING]
; Optional reporting settings.
; isSkipReportHeader = false
; isSkipColumnHeader = false
; isSkipReportSummary = false
; isUseRawEnumValues = false

[OAUTH2]
; Required OAuth2 credentials. Uncomment and fill in the values for the
; appropriate flow based on your use case. See the README for guidance:
; https://github.com/googleads/googleads-php-lib/blob/master/README.md#getting-started

; For installed application or web application flow.
 clientId = "CLIENT ID DO PROJETO CRIADO NO CONSOLE DEVELOPER"
 clientSecret = "SENHA CRIADO NO PROJETO DO CONSOLE DEVELOPER"
 refreshToken = "ESSE ITEM VOCÊ CONSEGUE PEGANDO OAUTH2 PLAYGROUD (SEGUIR O PASSO 2)"

; For service account flow.
;jsonKeyFilePath = ""
;scopes = "https://www.googleapis.com/auth/adwords"
;impersonatedEmail = ""

[SOAP]
; Optional SOAP settings. See SoapSettingsBuilder.php for more information.
; compressionLevel = 

[CONNECTION]
; Optional proxy settings to be used by requests.
; If you don't have username and password, just specify host and port.
; proxy = "protocol://user:pass@host:port"
; Enable transparent HTTP gzip compression for all reporting requests.
; enableReportingGzip = false

[LOGGING]
; Optional logging settings.
; soapLogFilePath = "path/to/your/soap.log"
; soapLogLevel = "INFO"
; reportDownloaderLogFilePath = "path/to/your/report-downloader.log"
; reportDownloaderLogLevel = "INFO"
; batchJobsUtilLogFilePath = "path/to/your/bjutil.log"
; batchJobsUtilLogLevel = "INFO"
?>

Feito isto, vamos ao primeiro código, na pasta raiz do Google crie um arquivo chamado ‘index.php’.

<?php
ini_set('display_errors',1);
ini_set('display_startup_erros',1);
error_reporting(E_ALL);

require __DIR__ . '/vendor/autoload.php';

use Google\AdsApi\AdWords\AdWordsServices;
use Google\AdsApi\AdWords\AdWordsSessionBuilder;
use Google\AdsApi\AdWords\ReportSettingsBuilder;
use Google\AdsApi\AdWords\v201705\cm\CampaignService;
use Google\AdsApi\AdWords\v201702\cm\ReportDefinitionReportType;
use Google\AdsApi\AdWords\v201702\cm\ReportDefinitionService;
use Google\AdsApi\AdWords\Reporting\v201705\ReportDownloader;
use Google\AdsApi\AdWords\v201705\cm\OrderBy;
use Google\AdsApi\AdWords\v201705\cm\Paging;
use Google\AdsApi\AdWords\v201705\cm\Selector;
use Google\AdsApi\Common\OAuth2TokenBuilder;

class Adwords
{    

    public static function getData(){
        $oAuth2Credential = (new OAuth2TokenBuilder())
            ->fromFile()
            ->build();            

        /*
            Aqui você pode recuperar dados de outro clientId, diferente do que informou no adsapi_php.ini
            porém pode retirar o método "withClientCustomerId" para pegar os dados padrões do clientId do arquivo adsapi
        */
        $session = (new AdWordsSessionBuilder())
            ->fromFile()
            ->withOAuth2Credential($oAuth2Credential)  
            ->withClientCustomerId('CLIENT_ID_CUSTOMER')                      
            ->build();   
        
        #Utilizando AWQL poderá ver os exemplos e combinações no link: https://developers.google.com/adwords/api/docs/appendix/reports
        $reportQuery = 'SELECT Impressions,Clicks, Cost, AverageCpc, Conversions, ConversionRate, CostPerConversion 
                 FROM ACCOUNT_PERFORMANCE_REPORT DURING 20171101,20171130';
        
        $reportFormat = 'XML';
        $reportDownloader = new ReportDownloader($session);
        $reportDownloadResult = $reportDownloader->downloadReportWithAwql(
        $reportQuery, $reportFormat);

        $datatest =  $reportDownloadResult->getAsString();

        $xml = simplexml_load_string($datatest);
        $json = json_encode($xml);        

        //return array        
        echo ($json);                
    }
}

AdWords::getData();
?>

O retorno que você terá será algo parecido com isto:

{  
   "report-name":{  
      "@attributes":{  
         "name":"ACCOUNT_PERFORMANCE_REPORT"
      }
   },
   "date-range":{  
      "@attributes":{  
         "date":"Nov 1, 2017-Nov 30, 2017"
      }
   },
   "table":{  
      "columns":{  
         "column":[  
            {  
               "@attributes":{  
                  "name":"impressions",
                  "display":"Impressions"
               }
            },
            {  
               "@attributes":{  
                  "name":"clicks",
                  "display":"Clicks"
               }
            },
            {  
               "@attributes":{  
                  "name":"cost",
                  "display":"Cost"
               }
            },
            {  
               "@attributes":{  
                  "name":"avgCPC",
                  "display":"Avg. CPC"
               }
            },
            {  
               "@attributes":{  
                  "name":"conversions",
                  "display":"Conversions"
               }
            },
            {  
               "@attributes":{  
                  "name":"convRate",
                  "display":"Conv. rate"
               }
            },
            {  
               "@attributes":{  
                  "name":"costConv",
                  "display":"Cost \/ conv."
               }
            }
         ]
      },
      "row":{  
         "@attributes":{  
            "impressions":"752389",
            "clicks":"16051",
            "cost":"2246940000",
            "avgCPC":"139988",
            "conversions":"137.00",
            "convRate":"0.85%",
            "costConv":"16401022"
         }
      }
   }
}

Muito simples não é? Desta maneira achei mais rápido e fácil realizar as integrações e retorno de dados do Google Adwords.

Bônus: Os valores monetários, por exemplo, “costConv” (Custo de conversões) é retornado em microunidades monetárias então é necessário realizar um cálculo para encontrar o valor ‘real’, um exemplo disso:

//(16401022 / 1000000) = R$ 16,40
$costConv / 1000000;

Está e outras dicas poderá ser visto no link:
https://developers.google.com/adwords/api/docs/guides/reporting?hl=pt-br

Até a próxima galera!