[Python] Usar Power Bi API sin permiso del administrador

La Data Web trae un poco de desarrollo de la mano de python para relacionarnos a la API de Power Bi Service. Este post nos ayudará a obtener el token de acceso a Power Bi Service con puro código python y la ayuda de una librería. La particularidad del post es que nos conectaremos sin que el administrador o la autoridad nos otorgue los permisos a la app que leerá la API.

Para poder lograr éste objetivo y codificar en python primero es necesario realizar ciertas configuraciones necesarias para que podamos tener acceso por código a la API de Power Bi.

Primero paso: Registrar App en Azure

Con nuestra cuenta profesional de microsoft vamos a loguear en www.portal.azure.com

Desde el portal nos dirigimos a registrar la aplicación como indica la imagen:

image

Luego colocaremos un nombre para nuestra app. Por ejemplo "PowerBI-API-Access" y damos en "Registrar". A partir de ese momento tendremos una app en azure capas de ayudarnos a comunicarnos con recursos y apis según los permisos asignados. Para asignar los que necesitaremos vamos a "API permissions", luego "Add a permission". 

Al tipear "Power bi service", hacemos click en la única opción que nos sugiere. 

image

Nos lleva a la siguiente imagen, donde pediremos los accesos necesarios.

image

Los permisos que podremos autodelegarnos pertenecen a Delegated permissions. Terminamos agregando los necesarios para nuestro objetivo. Normalmente solemos utilizar "ReadWrite.All" a workspace y dataset para actualizar los datos, pero existen muchos otros usos de la API.

Para poder conceder los permisos delegados a nosotros mismos vamos a configurar la autenticación de la siguiente manera:

image

Necesitamos el publico acceso autenticado a la app para llegar a la API. 

Seguimos configurando…

image

Guardamos la configuración. 

Segundo Paso: Aceptar permisos

A partir de este momento podemos dirigirnos al siguiente link que nos concederá el permiso. Este enlace solo funcionará por sólo una vez y se construye agregando el client id (o application id) de la siguiente manera:

https://login.windows.net/common/oauth2/authorize?response_type=code&client_id=[CLIENTID]&redirect_uri=https://login.live.com/oauth20_desktop.srf

Nos aparecerá la siguiente pantalla listando los permisos que queremos concederle a la app.

image

¡Estamos listos! Tras aceptar los permisos hemos concedido que el usuario que acaba de crear la app, pueda obtener un token de acceso a la API de Power Bi.

Paso Tres: Obtener token con Python

Habiendo seteado todo el ambiente solo nos resta escribir código. Naturalmente, la forma más común sugerida por microsoft, que está en su documentación, es usar PowerShell. Nosotros vamos a escaparle un poco para llevarlo a otro lenguaje que hoy por hoy está muy bien posicionado.

El ejemplo consiste en construir un script que nos permita realizar una actualización de un conjunto de datos de un Power Bi. Esto puede resultar muy útil para grandes arquitecturas que involucran actualizaciones de otros servicios previamente a power bi para que todo quede sincronizado en un solo hilo. En caso que quieran realizar otra acción, pueden chequear la documentación de la API que será sencilla de utilizar una vez que tengamos el access token.

Antes de ver el enlace a mi github con el código, debemos definir cuatro parámetros

  • power_bi_group_id = 'XXXX-XXXX-XXXX-XXXX'
  • power_bi_dataset_id = 'XXXX-XXXX-XXXX-XXXX'
  • power_bi_username = 'XXXX-XXXX-XXXX-XXXX'
  • power_bi_password = 'XXXX-XXXX-XXXX-XXXX'
  • power_bi_client_id = 'XXXX-XXXX-XXXX-XXXX'

Conociendo nuestro usuario dado que nos logueamos para registrar la app en azure y el id de la misma, solo nos resta conocer los id de los dataset y grupos. Para ello podemos hacer tiros de API que traigan el listado de ellos o podemos loguear en power bi y copiarlos de la URL de la siguiente manera.

Nos dirigimos en el portal al Conjunto de datos del área de recursos deseada. EJ:

image

Cuando estemos en la página en blanco podremos tomar los datos de una dirección semejante a ésta:

https://app.powerbi.com/groups/107c4556-aa47-43e8-b88c-a1fb7bc5f352/datasets/08110dd8-80fe-40f7-8b5c-2d97200b8d43

  • Group_id = 107c4556-aa47-43e8-b88c-a1fb7bc5f352
  • Dataset_id =  08110dd8-80fe-40f7-8b5c-2d97200b8d43

Ahora si contamos con los parámetros para obtener el token y correr un refresh de datos. Seguí el resto del código en github con los dos métodos ejemplo:  get_auth_token y refresh_dataset.

https://github.com/ibarrau/PowerBi-code/blob/master/Python/Refresh%20PBI%20python%203%20onpremise.py

Recordemos que una llamada al método de actualización cuenta como una actualización programada para Power Bi. Por lo tanto, solo es posible realizar 8 llamados al método por día considerando licencia free o pro.

¡Espero que les sirva para organizar flujos de un solo hilo!

Este post fue escrito con la asistencia de Martin Zurita.