La API v1 se hizo para la app de Android: con ella la app inicia sesión, envía los traces y lee los informes. No hay una clave de API aparte: un script inicia sesión como la app, con usuario, contraseña y el código del segundo paso, y usa el token que devuelve el inicio de sesión. Esta página muestra el camino del envío con curl; el contrato completo, con todos los campos y códigos de error, está en API v1.
Antes de empezar
- Una cuenta con la verificación en dos pasos por app de autenticación y los términos aceptados en el navegador. Antes de la aceptación, las llamadas responden 403
termos_pendentes. - El inicio de sesión por la API cuenta en el límite de sesiones simultáneas de la cuenta, junto con el navegador y la app. Con el límite de una sesión, iniciar sesión desde el script cierra la sesión más antigua, como la del navegador.
curl,jqy bash en Linux. Los ejemplos usanstatyddde GNU.
No guarde la contraseña en el script, y guarde el token como una contraseña: con él, cualquiera abre sus análisis hasta que la sesión termine. Al final, cierre la sesión.
Iniciar sesión y obtener el token
- Envíe usuario y contraseña para recibir el desafío del segundo paso:
BASE=https://app.waitscope.com/api/v1 DESAFIO=$(curl -sS "$BASE/sessao" \ -H 'Content-Type: application/json' \ -d '{"username": "zz-exemplo", "password": "<contraseña>", "method": "app", "device_name": "script"}' | jq -r .desafio) - Cambie el desafío y el código de 6 dígitos de la app de autenticación por el token:
TOKEN=$(curl -sS "$BASE/sessao/codigo" \ -H 'Content-Type: application/json' \ -d "{\"desafio\": \"$DESAFIO\", \"codigo\": \"123456\"}" | jq -r .token)
Resultado: TOKEN tiene 43 caracteres. Vale hasta 90 días, vence tras 30 días sin uso y aparece en Mi cuenta como App Android · script. El desafío vale 10 minutos.
Para cerrar la sesión al final:
curl -sS -X DELETE "$BASE/sessao" -H "Authorization: Bearer $TOKEN"
Enviar el archivo
- Abra el envío con el nombre y el tamaño de cada archivo. Con
"juntar": true, los archivos se convierten en un solo análisis (analizar juntos):ARQ=exemplo-10046.trc TAM=$(stat -c %s "$ARQ") ENVIO=$(curl -sS "$BASE/envios" \ -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: application/json' \ -d "{\"juntar\": false, \"arquivos\": [{\"nome\": \"$ARQ\", \"tamanho\": $TAM}]}" | jq -r .id)Resultado: la respuesta 201 trae el
iddel envío, cada archivo con la posiciónny lo que ya llegó enrecebido, ypedaco_max, de 8388608 bytes (8 MiB). - Envíe el archivo en fragmentos de hasta 8 MiB, en orden, cada uno con el
Content-Rangede su fragmento y el tamaño total:PEDACO=8388608 INI=0 while [ "$INI" -lt "$TAM" ]; do FIM=$(( INI + PEDACO - 1 )) [ "$FIM" -ge "$TAM" ] && FIM=$(( TAM - 1 )) dd if="$ARQ" bs="$PEDACO" skip=$(( INI / PEDACO )) count=1 status=none | curl -fsS -X PUT "$BASE/envios/$ENVIO/arquivos/0" \ -H "Authorization: Bearer $TOKEN" \ -H 'Content-Type: application/octet-stream' \ -H "Content-Range: bytes $INI-$FIM/$TAM" \ --data-binary @- || break INI=$(( FIM + 1 )) doneResultado: cada fragmento aceptado responde 200 con el nuevo total en
recebido. - Concluya el envío y guarde el id del análisis:
ANALISE=$(curl -sS -X POST "$BASE/envios/$ENVIO/concluir" \ -H "Authorization: Bearer $TOKEN" | jq -r '.analises[0].id // .repetidas[0]')Resultado: la respuesta 201 trae en
analiseslos análisis nuevos y enrepetidaslos ids de los que ya existían con el mismo contenido (envío repetido).
Si un fragmento falla, el bucle se detiene. Pregunte al servidor cuánto ya llegó y ejecute de nuevo solo el while, que continúa desde ese punto:
INI=$(curl -sS "$BASE/envios/$ENVIO" -H "Authorization: Bearer $TOKEN" | jq '.arquivos[0].recebido')
Seguir el análisis
- Consulte el estado cada pocos segundos:
curl -sS "$BASE/analises/$ANALISE" -H "Authorization: Bearer $TOKEN" | jq '{status, progress, error}'Resultado:
statuspasa dequeuedarunning, con el avance enprogress, y termina endoneo enerror, con el motivo enerror. - Con
done, descargue el informe:curl -sS -o relatorio.html "$BASE/analises/$ANALISE/relatorio.html" -H "Authorization: Bearer $TOKEN"
relatorio.html es el mismo archivo de Descargar HTML en la consola. La ruta /relatorio, sin extensión, devuelve el informe en JSON, sección por sección. Antes del fin del análisis, o si terminó con error, las dos responden 409 conflito.
Cancelar y retomar
DELETE $BASE/envios/$ENVIOcancela el envío y borra lo que llegó.- El envío pertenece al token que lo creó y desaparece después de 24 horas sin un fragmento nuevo, o cuando termina la sesión del token.
- Repetir el
concluirdevuelve el mismo resultado, sin crear el análisis de nuevo: puede repetirlo si perdió la respuesta.
Problemas frecuentes
| Respuesta | Causa | Qué hacer |
|---|---|---|
401 sessao_invalida | Token ausente, vencido o cerrado | Inicie sesión de nuevo y use el token nuevo. |
403 termos_pendentes | Términos no aceptados en la versión vigente | Abra la consola en el navegador y acéptelos. |
409 conflito con recebido | El fragmento no empieza donde se detuvo el archivo | Continúe desde el byte de recebido. |
413 grande_demais | La suma supera el límite por envío, o el fragmento supera 8 MiB | Comprima el archivo o use fragmentos más pequeños. |
429 limite | Cola llena, análisis guardados en el límite u otro envío de la cuenta en curso | Espere o elimine análisis. Con envio en el cuerpo, el envío a medias es de este token: retómelo o cancélelo. |
503 sem_espaco | Servidor sin espacio en disco | Inténtelo más tarde y avise al administrador. |
Próximos pasos
- Todos los campos, rutas y códigos de error: API v1.
- Los límites de cada cuenta: límites y envío repetido.
- El mismo envío con pantalla: enviar por el navegador.