Mostrando postagens com marcador google. Mostrar todas as postagens
Mostrando postagens com marcador google. Mostrar todas as postagens

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...

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.

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...