Adrianistán

El blog de Adrián Arroyo


Subir APK a Google Play automáticamente

- Adrián Arroyo Calle

Hoy vamos a ver como subir un APK a Google Play directamente, usando la línea de comandos, sin pasar por el navegador. Perfecto para automatizar la publicación de actualizaciones.

desarrollador-android-680x394

 

Google Play, como muchos otros servicios de Google, dispone de una API. Gracias a ella podemos interactuar con los servicios de Google directamente desde nuestro código. Para ello necesitaremos un Client ID, un Client Secret y un refresh_token. En mi entrada sobre como crear credenciales OAuth2 para Google sabras como hacerlo. Busca la API de Google Play Android Developer API y actívala. Anota el client ID, el client secret y el refresh_token. Además es necesario que entres a la consola de desarrollo de Google Play y autorices tus credenciales en Configuración -> Acceso a API

screenshot-play google com 2016-07-26 17-23-56

Ahora podemos pasar a escribir nuestro script de subida de APK. Para ello usaremos Node.js y el fantástico paquete googleapis, que se encuentra en npm.

Iniciar sesión en googleapis


Primero instala el paquete con npm.
npm install googleapis

Teniendo a mano el client ID, el client secret y el refresh_token podemos iniciar sesión.


var CLIENT_ID="";
var CLIENT_SECRET="";
var REFRESH_TOKEN="";

var fs = require("fs");
var google = require("googleapis");
var androidpublisher = google.androidpublisher("v2"); // Esta es la API que vamos a usar, AndroidPublisher v2
var OAuth2 = google.auth.OAuth2;

var auth = new OAuth2(CLIENT_ID,CLIENT_SECRET,"");
auth.setCredentials({
refresh_token: REFRESH_TOKEN
});

auth.refreshAccessToken(function(err,tokens){
google.options({auth: auth});
// Ya estamos dentro
});


Crear y publicar una edición


¿Cuál es el procedimiento para subir un APK a Google Play usando la API?

  1. Crear una nueva edición

  2. Subir un APK a esa edición

  3. Asignar el APK a algún canal de distribución

  4. Guardar y publicar los cambios de la edición


Cuando creemos una edición se nos dará un ID de edición. Lo usaremos en el resto de llamadas. También cuando subamos un APK nos darán un versionCode que usaremos para asignar a uno de los canales de distribución. Google Play dispone de 4 canales de distribución:

  • alpha: Solo para los usuarios que hayas autorizado explícitamente

  • beta: Solo para los usuarios que hayas autorizado explícitamente

  • production: La versión que tienen todos los usuarios que no están registrados en alpha y beta.

  • rollout: Similar a production. Se indica un procentaje y Google se encargará de que solo el porcentaje de usuarios indicado tengan la actualización. Es ideal para probar nuevas características sin involucrar a todos tus usuarios.


Finalmente el código final del script queda así.


var CLIENT_ID="";
var CLIENT_SECRET="";
var REFRESH_TOKEN="";

var fs = require("fs");
var google = require("googleapis");
var androidpublisher = google.androidpublisher("v2");
var OAuth2 = google.auth.OAuth2;

var auth = new OAuth2(CLIENT_ID,CLIENT_SECRET,"");
auth.setCredentials({
refresh_token: REFRESH_TOKEN
});

auth.refreshAccessToken(function(err,tokens){
google.options({auth: auth});
androidpublisher.edits.insert({
packageName: "ga.yayeyo.cronoquiz.historia"
},function(err,edit){
console.dir(err);
androidpublisher.edits.apks.upload({
packageName: "ga.yayeyo.cronoquiz.historia",
editId: edit.id,
uploadType: "media",
media: {
mediaType: "application/vnd.android.package-archive",
body: fs.createReadStream("platforms/android/build/outputs/apk/android-release.apk")
}
},function(err,req){
console.dir(err);
var versionCode = req.versionCode;
androidpublisher.edits.tracks.update({
packageName: "ga.yayeyo.cronoquiz.historia",
editId: edit.id,
track: "production",
resource: {
versionCodes: [versionCode]
}
},function(err,req){
console.dir(err);
androidpublisher.edits.commit({
packageName: "ga.yayeyo.cronoquiz.historia",
editId: edit.id
},function(err,req){
console.dir(err);
});
});
});
});
});

Añadir comentario

Todos los comentarios están sujetos a moderación