Mostrando entradas con la etiqueta gestionar blogs. Mostrar todas las entradas
Mostrando entradas con la etiqueta gestionar blogs. Mostrar todas las entradas

Aplicación para gestionar múltiples blogs con Google Apps Script



Como muchos ya sabéis gestiono unas cuantas docenas de blogs y en ocasiones puede llegar a ser bastante una locura :)

Así pues llevo ya un tiempo montando una aplicación que me permite recoger información de Blogger y de Adsense y mostrarla en un dashboard fácil de gestionar.

Que he usado para crear esta aplicación?

- Web dinámica con Google Apps Script
- Gestionar blogs con Google Apps Script
- Gestionar ingresos de Adsense con Google Apps Script
- Como usar un iframe con Google Apps Script

Como queda?  Aquí un link para ver como queda la aplicación ( evidentemente los datos están falseados )

Te interesa? Ponte en contacto conmigo en este formulario y te explico precio y posibilidades de customización.

Si tienes otras ideas en la cabeza en la que crees que puedo ayudarte no vaciles en hacerme llegar tus peticiones aquí

Como obtener datos de adsense con Google Apps Script


Hace poco estaba intentando mejorar un viejo proyecto de gestión de blogs añadiéndole la funcionalidad de obtener los ingresos de adsense para cada url.

El código no es complicado pero espero que os sirva de base para poder hacer los importadores de datos que queráis. El script se encarga de obtener los ingresos del último año desglosados por url, pero ya veréis que es muy fácil de modificar y ponerlo como vosotros necesitéis.

En el documento donde instaléis el código deberéis tener un pestaña que se llame 'Adsense' que es donde pondrá la información

function generateReport()
{
  var adClientId = "ca-pub-XXXXXXXXX"; >> AQUI VA TU IDENTIFICADOR DE ADSENSE
  // Prepare report.
  var today = new Date();
  var desde= new Date(today.getTime() - 365 * 24 * 60 * 60 * 1000); //Ultimo año

  var timezone = Session.getTimeZone();
  var startDate = Utilities.formatDate(desde, timezone, 'yyyy-MM-dd');
  var endDate = Utilities.formatDate(today, timezone, 'yyyy-MM-dd');

  var report = AdSense.Reports.generate(startDate, endDate, {
      filter: ['AD_CLIENT_ID==' + escapeFilterParameter(adClientId)],
      metric:['EARNINGS'],                    //Ingresos
      dimension: ['DOMAIN_NAME'],  //Url
      sort: ['-EARNINGS'],                      //Ordenado por orden decreciente de ingresos
  });

  if (report.rows)
 {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = spreadsheet.getSheetByName("Adsense");

    var headers = report.headers.map(function(header) {
      return header.name;
    });
    sheet.appendRow(headers);
    sheet.getRange(2, 1, report.rows.length, headers.length)
        .setValues(report.rows);
  }
  else
  {
    Logger.log('No hay datos');
  }
}

function escapeFilterParameter(parameter)
{
   return parameter.replace('\\', '\\\\').replace(',', '\\,');
}

Espero que os sirva.

Cualquier duda que tengáis no vaciléis en ponerla en los comentarios.

Nos vemos

Como administrar blogs de blogger con Google Apps Script


Llevo años haciendo blogs como afición ( ojala fuera como profesión, pero no, no da dinero para eso :) ) y uno de los problemas que siempre he tenido es el de ir mirando las visitas de los blogs uno a uno para llevar el control del tráfico. Si tienes dos blogs no es un problema pero si tienes 20 ( o más ) puede ser realmente tedioso.

Es por ello que he montado un script que se conecta a la API de Blogger saca la información de tus blogs y te dice cuantas visitas has tenido en cada uno de ellos. El resultado lo da en forma de web, de este estilo:

Es un script relativamente sencillo y al que le podéis sacar mucho partido, pero si no tenéis experiencia en GAS os recomiendo que primero os miréis este link:  http://googleappscriptsweb.blogspot.com.es/2015/03/como-crear-una-web-dinamica-con-google.html

Os dejo el código:

index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
 
    <style>
    table.table1{
       font-family: "Trebuchet MS", sans-serif;
       font-size: 16px;
       font-weight: bold;
       line-height: 1.4em;
       font-style: normal;
       border-collapse:separate;
    }
 
    .table1 thead th
    {
       padding:15px;
       color:#fff;
       text-shadow:1px 1px 1px #568F23;
       border:1px solid #93CE37;
       border-bottom:3px solid #9ED929;
       background-color:#9DD929;
       background:-webkit-gradient(
        linear,
        left bottom,
        left top,
        color-stop(0.02, rgb(123,192,67)),
        color-stop(0.51, rgb(139,198,66)),
        color-stop(0.87, rgb(158,217,41))
        );
    background: -moz-linear-gradient(
        center bottom,
        rgb(123,192,67) 2%,
        rgb(139,198,66) 51%,
        rgb(158,217,41) 87%
        );
    -webkit-border-top-left-radius:5px;
    -webkit-border-top-right-radius:5px;
    -moz-border-radius:5px 5px 0px 0px;
    border-top-left-radius:5px;
    border-top-right-radius:5px;
   }
 
    .table1 thead th:empty
    {
    background:transparent;
    border:none;
}
.table1 tbody th{
    color:#fff;
    text-shadow:1px 1px 1px #568F23;
    background-color:#9DD929;
    border:1px solid #93CE37;
    border-right:3px solid #9ED929;
    padding:0px 10px;
    background:-webkit-gradient(
        linear,
        left bottom,
        right top,
        color-stop(0.02, rgb(158,217,41)),
        color-stop(0.51, rgb(139,198,66)),
        color-stop(0.87, rgb(123,192,67))
        );
    background: -moz-linear-gradient(
        left bottom,
        rgb(158,217,41) 2%,
        rgb(139,198,66) 51%,
        rgb(123,192,67) 87%
        );
    -moz-border-radius:5px 0px 0px 5px;
    -webkit-border-top-left-radius:5px;
    -webkit-border-bottom-left-radius:5px;
    border-top-left-radius:5px;
    border-bottom-left-radius:5px;
}
.table1 tfoot td{
    color: #9CD009;
    font-size:32px;
    text-align:center;
    padding:10px 0px;
    text-shadow:1px 1px 1px #444;
}
.table1 tfoot th{
    color:#666;
}
.table1 tbody td{
    padding:1px;
    text-align:center;
    background-color:#DEF3CA;
    border: 2px solid #E7EFE0;
    -moz-border-radius:2px;
    -webkit-border-radius:2px;
    border-radius:2px;
    color:#666;
    text-shadow:1px 1px 1px #fff;
}
.table1 tbody span.check::before{
    content : url(../images/check0.png)
}
    </style>
<script>
    function Response(string)
    {
       document.getElementsByName("ejemplo")[0].innerHTML = string;
    }
 
    function InitWeb()
    {
       google.script.run.withSuccessHandler(Response).Init();
    }
</script>
 
  </head>
  <body>
    <script>
        InitWeb();
    </script>

<div name='ejemplo'>
    <p> Loading.... wait</p>
</div>
 
  </body>
</html>

codigo.gs
//Para obtener las credenciales: https://developers.google.com/blogger/docs/3.0/using#auth
var CLIENT_ID = 'TU_CLIENTE';
var CLIENT_SECRET = 'TU_CLAVE';

function getService() {
  // Create a new service with the given name. The name will be used when
  // persisting the authorized token, so ensure it is unique within the
  // scope of the property store.
  return OAuth2.createService('blogger')

      // Set the endpoint URLs, which are the same for all Google services.
      .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')
   

      // Set the client ID and secret, from the Google Developers Console.
      .setClientId(CLIENT_ID)
      .setClientSecret(CLIENT_SECRET)

      // Set the name of the callback function in the script referenced
      // above that should be invoked to complete the OAuth flow.
      .setCallbackFunction('authCallback')

      // Set the property store where authorized tokens should be persisted.
      .setPropertyStore(PropertiesService.getUserProperties())

      // Set the scopes to request (space-separated for Google services).
      // this is blogger read only scope for write access is:
      // https://www.googleapis.com/auth/blogger
      .setScope('https://www.googleapis.com/auth/blogger')
       
      // Below are Google-specific OAuth2 parameters.

      // Sets the login hint, which will prevent the account chooser screen
      // from being shown to users logged in with multiple accounts.
      .setParam('login_hint', Session.getActiveUser().getEmail())
   
      // Requests offline access.
      .setParam('access_type', 'offline')

      // Forces the approval prompt every time. This is useful for testing,
      // but not desirable in a production application.
      .setParam('approval_prompt', 'force');
}

function authCallback(request) {
  var bloggerService = getService();
  var isAuthorized = bloggerService.handleCallback(request);
  if (isAuthorized) {
    return HtmlService.createHtmlOutput('Success! You can close this tab.');
  } else {
    return HtmlService.createHtmlOutput('Denied. You can close this tab');
  }
}

var Data;

function GetViewsOfBlog( id , name , blog )
{
    var api_all   = "https://www.googleapis.com/blogger/v3/blogs/" + id + "/pageviews?range=all" ;
    var api_month = "https://www.googleapis.com/blogger/v3/blogs/" + id + "/pageviews?range=30DAYS" ;
    var api_week  = "https://www.googleapis.com/blogger/v3/blogs/" + id + "/pageviews?range=7DAYS" ;
   
    var headers = {
       "Authorization": "Bearer " + getService().getAccessToken()
     };
 
    var options = {
      "headers": headers,
      "method" : "GET",
      "muteHttpExceptions": true ,
    };
   
    //Histórico
    var response = UrlFetchApp.fetch(api_all, options);
 
       var json = JSON.parse(response.getContentText());

       for (var i in json.counts)
       {
          blog.push(json.counts[i].count);
       }

  //Mensual
    var response = UrlFetchApp.fetch(api_month, options);
 
       var json = JSON.parse(response.getContentText());

       for (var i in json.counts)
       {
          blog.push(json.counts[i].count);
       }


  //Semanal
    var response = UrlFetchApp.fetch(api_week, options);
 
       var json = JSON.parse(response.getContentText());

       for (var i in json.counts)
       {
          blog.push(json.counts[i].count);
       }
   
     return blog;
}

// Modified from http://ctrlq.org/code/20068-blogger-api-with-google-apps-script
function bloggerAPI()
{
  var string = "";
  Data = new Array();     //Inicializamos la estructura que contiene toda la información
  var Total = new Array(3);
  Total[0] = 0;
  Total[1] = 0;
  Total[2] = 0;

  var service = getService();
  if (service.hasAccess()) {

    var api = "https://www.googleapis.com/blogger/v3/users/self/blogs";

    var headers = {
      "Authorization": "Bearer " + getService().getAccessToken()
    };
 
    var options = {
      "headers": headers,
      "method" : "GET",
      "muteHttpExceptions": true
    };
 
    var response = UrlFetchApp.fetch(api, options);
    var string = "";
 
    var json = JSON.parse(response.getContentText());

 
    for (var i in json.items)
    {
      var blog = new Array();
         
      blog.push(json.items[i].name);
      blog.push(json.items[i].url);

      blog = GetViewsOfBlog(json.items[i].id,json.items[i].name,blog);
   
      Data.push(blog); //Para cada blog ponemos su info
    }
 
    Data.sort(function(a, b){return  b[4] - a[4]});
 
    string += "<table class=\"table1\">";
       string += "<thead>";
       string += "<tr>";
          string += "<td> Blog </td >";
          string += "<td> Histórico </td >";
          string += "<td> Mes </td >";
          string += "<td> Semana </td >";
       string += "</tr>";
       string += "</thead>";  
 
     for (var i in Data)
     {
       Total[0] += Math.round(Data[i][2]);
       Total[1] += Math.round(Data[i][3]);
       Total[2] += Math.round(Data[i][4]);
     }
    string += "<tbody>";
    for (var i in Data)
    {
      string += "<tr>";
         string += "<td> <a href=" + Data[i][1] +">" + Data[i][0] + "</a> </td>" ;
         string += "<td>" +  Data[i][2] + "(" + Math.round((Data[i][2]*100/Total[0])*100)/100 + "%) </td>" ;
         string += "<td>" +  Data[i][3] + "(" + Math.round((Data[i][3]*100/Total[1])*100)/100 + "%) </td>" ;
         string += "<td>" +  Data[i][4] + "(" + Math.round((Data[i][4]*100/Total[2])*100)/100 + "%) </td>" ;
      string += "</tr>";
   
   
    }
 
     string += "<tr>";
         string += "<td> TOTAL </td>" ;
         string += "<td>" +  Total[0] + "</td>" ;
         string += "<td>" +  Total[1] + "</td>" ;
         string += "<td>" +  Total[2] + "</td>" ;
      string += "</tr>";
 
    string += "</tbody>";
    string += "</table>";
 
  }
  else
  {
    var authorizationUrl = service.getAuthorizationUrl();
    Logger.log('Open the following URL and re-run the script: %s',
        authorizationUrl);
  }

  return string;
}

function Init()
{
  return bloggerAPI();
}

//Retorna la página principal
function doGet()
{
  return HtmlService.createHtmlOutputFromFile('index');
}

Para obtener las credenciales para tu usuario debereis ir a https://developers.google.com/blogger/docs/3.0/using#auth 

El tema credenciales puede ser puñetero, si os da problemas ponedme un comentario y os intentaré ayudar.

Ya me explicareis si os va bien o si os ha dado problemas

Nos vemos

NOTA: Tengo un versión mejorada de este código a la venta. Incluye mejoras en la velocidad, obtención de datos de adsense y la posibilidad de customizarlo como necesitéis: Aquí tenéis el link

Tal vez te interese