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

No hay comentarios:

Publicar un comentario

Tal vez te interese