Autenticación
goopdl habla con Google Play como si fuera un dispositivo Android, así que cada petición necesita un token. Hay dos formas de conseguirlo:
| Modo | Qué necesitas | Ideal para |
|---|---|---|
| Anónimo (por defecto) | Nada | La mayoría de descargas |
| Cuenta de Google | Una cuenta desechable, con la sesión iniciada mediante goopdl auth login |
Apps a las que no llegan las cuentas anónimas, o cuando el dispensador te limita |
goopdl auth status muestra qué modo está activo.
#Anónimo (por defecto)
Por defecto, goopdl pide un token anónimo al dispensador público de tokens de
Aurora Store (https://auroraoss.com/api/auth). No
necesitas cuenta de Google.
goopdl auth token # token arm64
goopdl auth token --arch armv7 # token para dispositivos antiguos de 32 bits
goopdl auth token --country IN # registra el dispositivo con el MCC/MNC de India
goopdl auth clear-cache # borra todos los tokens y registros de dispositivo en cachéNo hace falta ejecutar auth token primero: el resto de comandos consiguen un
token cuando lo necesitan. Todas las opciones están en
auth token.
#Dónde se guardan los tokens
Los tokens se guardan en el directorio de configuración de goopdl, que es el primero de estos que aplique:
$GOOPDL_CONFIG_DIR, si es una ruta absoluta. Se expande~.$XDG_CONFIG_HOME/goopdl, siXDG_CONFIG_HOMEes una ruta absoluta.~/.config/goopdl.
Si alguna de las dos variables tiene una ruta relativa, se ignora, para que la
caché nunca acabe en el directorio actual. En Linux y macOS el directorio se
crea con permisos 0700 y los archivos de tokens se escriben con 0600.
NotaHasta la 1.4.x goopdl usaba siempre
~/.config/goopdl. Si tienesXDG_CONFIG_HOMEapuntando a otro sitio, goopdl ahora usa$XDG_CONFIG_HOME/goopdly la primera vez pide tokens nuevos. Para seguir usando la ubicación antigua, defineGOOPDL_CONFIG_DIR=~/.config/goopdl.
| Archivo dentro de ese directorio | Contenido |
|---|---|
auth-{arch}[-{country}][-profile-{key}].json |
Token de la última ejecución de auth token |
token-pool-{arch}[-{country}][-profile-{key}].json |
Pool de hasta 5 tokens que usan download, latest y fast-download |
direct-device-{account}-{arch}[-{country}]-profile-{key}.json |
Solo en el modo cuenta de Google: el dispositivo registrado, sin token |
account.json |
La cuenta de Google guardada: email, y el token AAS si no está en el almacén de claves del sistema |
La parte -profile-{key} aparece cuando fijas un dispositivo con --profile,
así cada perfil tiene sus propios tokens. goopdl auth logout borra todos
estos archivos. goopdl auth clear-cache los borra todos menos
account.json. goopdl auth token muestra la ruta donde ha guardado el token,
y goopdl auth status muestra el directorio y cuántos archivos tiene.
Los tokens caducan a los 50 minutos. En cómo funciona se explica el pool.
#Dispensador propio
Usa un dispensador autoalojado en cualquier comando con --dispenser / -d:
goopdl auth token -d https://my-dispenser.example.com/api/auth
goopdl download com.whatsapp -d https://my-dispenser.example.com/api/auth#Cuenta de Google
Inicia sesión una vez y goopdl se salta el dispensador e inicia sesión directamente en Google:
goopdl auth login # abre un navegador y guarda la cuenta
goopdl download com.whatsapp # la usa
goopdl auth status # muestra la cuenta en uso, nunca el token
goopdl auth logout # la borra junto con todos los tokens en cachéTambién puedes pasar la cuenta en dos variables, por ejemplo en CI o en un contenedor:
export GOOPDL_ACCOUNT_EMAIL="account@example.com"
export GOOPDL_AAS_TOKEN="aas_et/..."
goopdl download com.whatsapp- Las variables siempre tienen prioridad sobre la cuenta guardada.
- Si defines solo una de las dos variables, goopdl termina con error. No vuelve a la cuenta guardada ni al modo anónimo.
- El token AAS tiene que empezar por
aas_et/. - Los bearer tokens temporales de Google Play se quedan en memoria y nunca se escriben en disco. Cada proceso inicia sesión una vez por cuenta, arquitectura, país y perfil de dispositivo, y reutiliza el token hasta que caduca (la caducidad que indica Google menos 5 minutos, o 50 minutos) o Google lo rechaza.
- Aparte de la cuenta guardada, en disco goopdl solo escribe el registro del dispositivo, ver abajo.
- Solo la CLI lee
account.jsony el almacén de claves. Desde Python, unClientrecibe la cuenta comoCredentialse ignora tanto las variables como el archivo.
AvisoUn token AAS es una credencial de larga duración con acceso completo a Play Store en esa cuenta. Usa una cuenta de Google desechable, nunca la principal.
goopdl auth loginguarda el token en el almacén de claves del sistema, o en disco si no hay; usa
#Dónde se guarda la cuenta
goopdl auth login guarda el token AAS en el almacén de claves del sistema:
| Sistema | Almacén |
|---|---|
| macOS | Llavero (Keychain) |
| Windows | Administrador de credenciales |
| Linux | Secret Service por D-Bus (GNOME Keyring, KWallet) |
La entrada tiene el servicio goopdl y el email como nombre de usuario.
account.json, en el
directorio de configuración, guarda entonces
solo el email y "storage": "keyring".
goopdl relee el token justo después de guardarlo. Si no hay almacén, o falla o
no devuelve nada, goopdl avisa y escribe el token en account.json. Es lo
normal en servidores, contenedores y por SSH sin sesión de escritorio.
--insecure-storage se salta el almacén y usa siempre el archivo:
goopdl auth login # almacén, o account.json si no hay
goopdl auth login --insecure-storage # siempre account.jsongoopdl auth status muestra dónde está el token: Storage : system keyring
con el nombre del backend, o Storage : file. Si account.json apunta al
almacén pero el token no está, o no se puede abrir el almacén, los comandos
terminan con código 2. Vuelve a ejecutar goopdl auth login, o usa las
variables.
NotaEl almacén deja el token fuera de copias de seguridad, carpetas sincronizadas y copias de tu disco. No lo protege de otros programas que se ejecutan con tu usuario: en Linux y Windows cualquiera puede leerlo sin preguntar. Un token en
account.jsonno tiene ninguna de las dos protecciones.
Sobre account.json, con o sin token:
- El archivo se escribe de forma atómica con permisos
0600, dentro del directorio0700. - En Linux y macOS goopdl rechaza el archivo si otros usuarios pueden leerlo o
si no es un archivo normal tuyo. Ejecuta
chmod 600sobre él, o vuelve a iniciar sesión. En Windows goopdl no comprueba los permisos: el archivo depende de los de tu perfil de usuario. - Un archivo mal formado también da error. Vuelve a ejecutar
goopdl auth login, ogoopdl auth logout. goopdl auth logoutborra la entrada del almacén, el archivo y todos los tokens en caché.goopdl auth clear-cache,auth.clear_auth()yClient.clear_cache()no tocan ni el archivo ni el almacén.
#Qué guarda el modo cuenta
Iniciar sesión registra un dispositivo Android en la cuenta. Para no añadir uno más con cada comando, goopdl guarda el dispositivo que registró y lo reutiliza en las ejecuciones siguientes y en otros procesos:
| Archivo en el directorio de configuración | Contenido |
|---|---|
direct-device-{account}-{arch}[-{country}]-profile-{key}.json |
El registro del dispositivo: GSF ID, token de consistencia del check-in y token de configuración del dispositivo |
{account}es un hash del email. El email, el token AAS y el bearer token nunca se escriben en él, ni en el nombre ni en el archivo.- El archivo se escribe de forma atómica con permisos
0600, dentro del directorio0700. Un archivo.lockal lado permite que varios procesos compartan un mismo registro, así que registran un solo dispositivo. - Si Google rechaza dos tokens seguidos en ese dispositivo (HTTP 401), goopdl registra otro.
- Si no se puede escribir en el directorio, goopdl guarda el registro en memoria para el proceso actual y registra un aviso.
goopdl auth clear-cacheborra estos archivos y conserva la cuenta guardada, así que el siguiente comando registra un dispositivo nuevo sin volver a iniciar sesión.goopdl auth logouttambién los borra, junto con la cuenta. Desde Python, usaauth.clear_auth()oClient.clear_cache().latest,download --versiony los reintentos con otros perfiles de dispositivo siguen iniciando sesión con un dispositivo nuevo en cada sondeo: necesitan GSF IDs distintos.
#Conseguir un token AAS
Elige la opción que te resulte más cómoda:
goopdl auth login(recomendado en escritorio). Ver abajo.goopdl auth login --manual, si la automatización del navegador no funciona.- goopdl-auth: una pequeña app de Android. Inicias sesión en el móvil y te muestra el token AAS. No guarda credenciales ni tokens. Pon el token en las variables de arriba.
goopdl auth login guarda la cuenta. Añade --print para que solo imprima el
token por stdout, para las variables o un gestor de secretos:
TOKEN=$(goopdl auth login --print)Las preguntas y los mensajes van a stderr, así que en TOKEN solo queda el
token. goopdl ya no inicia sesión con contraseña: Google rechaza tanto la
contraseña de la cuenta como las contraseñas de aplicación con
BadAuthentication.
#Inicio de sesión con navegador (recomendado)
goopdl auth logingoopdl abre Chrome, Edge, Chromium o Brave con un perfil temporal nuevo. Inicia
sesión y selecciona Acepto (I agree). goopdl captura el email y el
oauth_token de un solo uso, cierra el navegador, borra el perfil y canjea el
oauth_token por un token AAS.
Si goopdl no encuentra tu navegador, define GOOPDL_BROWSER con la ruta a su
ejecutable o usa --manual.
#Inicio de sesión manual
goopdl auth login --manualgoopdl abre Google EmbeddedSetup en tu navegador habitual. Usa una ventana privada si tiene abierta la sesión de otra cuenta de Google.
- Inicia sesión y selecciona Acepto (I agree).
- Abre las herramientas de desarrollo (
F12). - En Chrome o Edge, ve a Aplicación → Cookies →
https://accounts.google.com. - Copia la cookie
oauth_token. Empieza poroauth2_4/. - Vuelve a la terminal, introduce el mismo email y pega el token. El token no se muestra al pegarlo.
El oauth_token solo sirve una vez y caduca enseguida, así que pégalo cuanto
antes.