Categorias
analytics api google integra????o

Integra????o ASP.NET (C#) com o Google Analytics

Nesse artigo irei demonstrar como fazer consultas no Google Analytics, de um determinado site, para ser usado em c??lculos estat??sticos afim de gerar gr??ficos semelhantes. Ou seja, irei demonstrar como fazer a consulta e retornar os dados. Os gr??ficos e exposi????o dos dados ficar?? ao seu crit??rio. Ao final poder?? ter algo assim:

Primeiramente e ??bvio, ?? preciso dos dados da conta Google como o e-mail e senha para autentica????o. Cada site cadastrado no Analytics tem um ID do Perfil e ele pode ser localizado na seguinte p??gina  de Configura????es do Perfil. Atrav??s desse Id ?? que consultamos os dados de um determinado site.

Com esses dados em m??os, vamos ao entendimento da integra????o. O Google disponibilizou um framework que auxilia na consulta e retorno de dados em .NET e ela pode ser baixada no Google GData. Dentro dela cont??m v??rios bin??rios mas precisaremos apenas dos seguintes:

  1. Google.GData.Analytics.dll
  2. Google.GData.Client.dll
  3. Google.GData.Extensions.dll

Adicione-os ao seu projeto. Mas antes de come??ar a programar isso, vamos ao entendimento das consultas realizadas. No link http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/gdataExplorer.html tem um simulador que ser?? similar ?? consulta feita pela sua aplica????o. J?? no link http://code.google.com/intl/pt-BR/apis/analytics/docs/gdata/gdataReferenceDimensionsMetrics.html cont??m toda as especifica????es necess??rias.
Como n??o gosto de perder tempo e, para muitos pode ser um pouco confuso o seu entendimento logo de cara, vamos fazer uma abstra????o:

  • ids: ?? o ID do Perfil conforme vimos anteriormente;
  • dimensions: vamos “acatar” que seja os relacionamentos (linhas)  (n??o ?? obrigat??rio);
  • metrics: vamos “acatar” que seja o que deseja buscar (colunas);
  • segment: especifica????o do tipo de consulta (n??o ?? obrigat??rio); 
  • filters: ?? o WHERE da consulta (n??o ?? obrigat??rio);
  • sort: ordena????o  (n??o ?? obrigat??rio);
  • start-date: data de in??cio (formato yyyy-MM-dd);
  • end-date: data final (formato yyyy-MM-dd);
  • start-index: serve para paginar dados (como o MySQL usa o LIMIT);
  • max-result: quantidade m??xima de registros retornados.

Essa ?? a explica????o mais entend??vel poss??vel e que posso passar para voc??s. Logo, antes de botar a m??o na massa, sugiro fazer v??rias simula????es e ver como ?? retornado os objetos. De acordo com a simula????o que fiz, por exemplo, e de acordo com a figura seria a seguinte busca:

“Me retorne todas as cidades, que visitaram meu blog, com suas respectivas quantidades de visitas no per??odo de 03/07/2011 a 17/07/2011 ordenada por cidade. S?? me traga os 50 primeiros registros.”

Ent??o, me seria retornado a seguinte “tabela”:

Ficou claro? Tranquilo, n??? A pior parte j?? passou. Agora, porqu?? escrevi “tabela”… Porque n??o ??! Lembra que abstra??mos para que seja isso. Sabendo de como a API trabalha ent??o bastemos implementar. Vamos l??! Pode-se criar uma classe ou incorporar na mesma p??gina o c??digo. Fica a seu crit??rio!

Adicione os seguintes namespaces:

using Google.Analytics;
using Google.GData.Analytics;
using Google.GData.Client;
using Google.GData.Extensions;

Tamb??m as vari??veis abaixo s??o necess??rias para a devida autentica????o e consulta nas quais descrevem:

// Vari??veis
string user; // Usu??rio da Conta Google Analytics
string pass; // Senha  da Conta Google Analytics
string id_tabela; // ID do Perfil

// Inicializa????o
user = “email@gmail.com”;
pass = “senha”;
id_tabela = “ga:30897221”; // Tem que colocar a string “ga” na frete do ID do Perfil

Agora adicione os seguinte m??todos:

/// <summary>
/// Consulta o Analytics
/// </summary>
/// <param name=”query”></param>
    private DataFeed ConsultaAnalytics(DataQuery query)
    {
        AnalyticsService asv = new AnalyticsService(“gaExportAPI_acctSample_v2.0”);
        asv.setUserCredentials(user, pass);
        String baseUrl = “https://www.google.com/analytics/feeds/data”;
        query.Ids = id_tabela;
        query.Uri = new Uri(baseUrl);
        return asv.Query(query);
    }


/// <summary>
/// Retorna o resultado da consulta
/// </summary>
/// <param name=”query”></param>
/// <returns></returns>
    private DataTable RetornaTabela(DataQuery query)
    {
        DataTable resultado = new DataTable();
        DataFeed feed = ConsultaAnalytics(query);
        if (feed.Entries.Count > 0)
        {
            // Cria as colunas
            DataEntry colunEntry = feed.Entries[0] as DataEntry;
            foreach (Dimension colundimension in colunEntry.Dimensions)
                resultado.Columns.Add(new DataColumn(colundimension.Name.Substring(3)));
            foreach (Metric colunmetric in colunEntry.Metrics)
                resultado.Columns.Add(new DataColumn(colunmetric.Name.Substring(3)));          


            // Insere os dados
            foreach (DataEntry singleEntry in feed.Entries)
            {
                DataRow rw = resultado.NewRow();
                foreach (Metric metric in singleEntry.Metrics)
                    rw[metric.Name.Substring(3)] = metric.Value;
                foreach (Dimension dimension in singleEntry.Dimensions)
                    rw[dimension.Name.Substring(3)] = dimension.Value;
                resultado.Rows.Add(rw);
            }
        }
        return resultado;
    }

??bvio que essas s??o apenas sugest??es de implementa????es e voc?? podem mudar o quanto achar melhor a depender de sua unidade de neg??cio. Agora vamos fazer aquela consulta:

        // Dados da consulta
        DataQuery q = new DataQuery();
        q.Dimensions = “ga:city”;
        q.Metrics = “ga:visits”;
        q.GAStartDate = DateTime.Parse(“03/07/2011”).ToString(“yyyy-MM-dd”);
        q.GAEndDate = DateTime.Parse(“17/07/2011”).ToString(“yyyy-MM-dd”);
        q.Sort = “ga:city;
        q.NumberToRetrieve = 50;


        // Resultado
        DataTable resultado = RetornaTabela(q);

Pronto! Ir?? me retornar um DataTable com aquela tabela de dados. Basicamente todas aquelas informa????es que voc?? v?? no Analytics s??o vindas em formato tabela e que, posteriormente, s??o feitos tratamentos e c??lculos sobre eles. Como disse no in??cio do artigo, agora basta usar a tabela de dados conforme desejar…
Espero que tenham gostado depois de um tempo sem postar nada…

Categorias
e-mail google

Enviar e-mail em ASP.NET usando o GMail com conta no Google Apps

Um artigo bem simples que se encontra na net para envio de e-mail em C# ?? esse aqui. Um post bem simples e explicativo de como fazer o envio usando o SMTP do GMail. Mas n??o era bem isso que eu queria abordar (tamb??m) j?? que disponibilizei o link para o post ensinando como. Quem n??o conhece o Google Apps j?? deveria dar uma olhada pois ?? um conjunto de solu????es empresariais que ajuda na redu????o de custos de TI dando uma maior produtividade. Uma delas ?? a cria????o de e-mails tendo um dom??nio externo. Vou dispensar explica????es (nota: tem a vers??o free e paga)… vamos ?? “implementa????o”. Suponhamos que eu tenha o dom??nio www.thiagomarcal.com.br e que esteja configurado para o Google Apps. L?? eu criei um e-mail contato@thiagomarcal.com.br e agora quero us??-lo para fazer o envio de e-mails. Basta eu seguir o post citado anteriormente que ?? poss??vel fazer o envio com os seguintes dados:

  • SMTP: smtp.gmail.com
  • Sender: contato@thiagomarcal.com.br
  • Senha: 123456
  • Porta: 587
  • Ssl: true

Obviamente a senha ?? fict??cia… apenas usando para fins did??ticos, mas que realmente muita gente usa. Ent??o, tudo certo! Faz-se um envio e d?? o seguinte erro:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at

O servidor SMTP requer uma conex??o segura ou o cliente n??o foi autenticado. A resposta do servidor foi: 5.5.1 Autentica????o solicitada Saiba mais em

Se garantir que os dados est??o todos certos e j?? testou com outra conta (e fez o envio corretamente) fa??a o seguinte: mude a senha! Senha fraca ou padr??o (que nem 123456) o GMail bloqueia a autentica????o e n??o deixa enviar.

Categorias
dicas dll google ip salvador

Localiza????o de Usu??rio: Obter Cidade e Estado pelo IP em ASP.NET

A um certo tempo atr??s isso era um pouco complicado de ser feito ou fic??vamos dependentes (muito) de ferramentas de terceiros. Hoje, claramente, posso afirmar que temos mais flexibilidade por??m continuamos atrelados. Mas n??o seja por isso! A Google disponibilizou uma API inovadora que nos ajuda nesse caso e em muitos outros (relativo ao GoogleMaps). O GoogleMaps.Subgurim.NET ?? um avan??ado controle do GoogleMaps para o ASP.NET e permite uma gama de manipula????es sobre suas funcionalidades e a que iremos demonstrar aqui ?? a de obter informa????es do usu??rio pelo IP (no site deles pode encontrar bem como c??digos avan??ados e demais exemplos). Em contrapartida, ?? preciso de um arquivo extra contendo faixas de IP distribu??das pelo mundo. Ent??o a MaxMind disponibilizou tamb??m um arquivo bin??rio contendo essas informa????es gratuitamente. Voc?? pode obter o arquivo aqui ou aqui (a diferen??a ?? que um ?? o link direto e o outro ?? a p??gina geral que pode-se obter em outros formatos). Esse arquivo ?? mensalmente atualizando inserindo novas faixas, logo, deixo o dica para dar sempre uma atualizada quando poss??vel (com isso aumenta mais a precis??o mas hoje, com esse arquivo, j?? realiza uma boa cobertura).
Para in??cio dos trabalhos, baixe o componente GoogleMaps.Subgurim.NET e o arquivo de faixas GeoLiteCity.dat. Crie um novo Web Site. Adicione a GMaps.dll na pasta Bin do projeto e copie o GeoLiteCity.dat tamb??m (coloque em outra pasta afim de organiz??-los – no meu caso coloquei em uma pasta chamada Data). Agora escreva o seguinte c??digo abaixo:

using Subgurim.Controles;

private void ObtemInfoUser()
{
    string database = Server.MapPath(“~/Data/GeoLiteCity.dat”);
    LookupService servico = new LookupService(database);
    Location localizacao = servico.getLocation(Request.ServerVariables[“REMOTE_ADDR”]);
    if (localizacao != null)
    {
        Response.Write(“Cidade: “ + localizacao.city + “<br />”);
        Response.Write(“Pa??s: “ + localizacao.countryName + “<br />”);
        Response.Write(“C??digo do Pa??s: “ + localizacao.countryCode + “<br />”);
        Response.Write(“Regi??o: “ + localizacao.region + “<br />”);
        Response.Write(“C??digo da ??rea: “ + localizacao.area_code + “<br />”);
        Response.Write(“Latitude: “ + localizacao.latitude + “<br />”);
        Response.Write(“Longitudade: “ + localizacao.longitude);
    }
}
 
Voc?? deve obter a sa??da algo do tipo:
 
Cidade: Salvador
Pa??s: Brazil
C??digo do Pa??s: BR
Regi??o: 5
C??digo da ??rea: 0
Latitude: -12,7636
Longitude: -15,2821
 
* Obs: a latitude e longitude s??o dados fict??cios que eu coloquei 😉
 
Se voc?? estiver testando localmente, n??o ter?? resultado pois o Request.ServerVariables[“REMOTE_ADDR”] ir?? trazer o valor 127.0.0.1. Para saber seu IP externo acesse o MeuIp e substitua-o para visualizar os valores e valid??-los. Em breve estarei escrevendo outros artigos mostrando como aproveitar bem a API do GoogleMaps bem como demais funcionalidades. At?? mais!

UPDATE: Ap??s ler, vejam aqui sobre o pl??gio que fizeram com meu artigo e depois acusaram que eu que copiei. Quem l?? o blog sabe como eu escrevo e como expresso minhas id??ias…