Post

Automatizacion de APIs con curl y jq

Automatizacion de APIs con curl y jq

Automatizacion de APIs con curl y jq

Los scripts revisados usan varias APIs HTTP: Cloudflare, Jira/JSM, Telegram y pfSense. El patron comun es autenticar, paginar, filtrar con jq, comprobar errores y generar una salida reproducible.

Uso en la infraestructura

Este post documenta el patron comun para scripts que integran servicios externos mediante API HTTP. No representa un servicio unico, sino la base tecnica usada por automatizaciones de red, reporting, alertas y firewall.

UsoServicioPara que se usa
DDNSCloudflareActualizar registros DNS cuando cambia la IP publica
ReportingJira/JSMExtraer tickets, comentarios y tiempos a CSV
AlertasTelegramEnviar avisos desde scripts de monitorizacion
FirewallpfSenseAutomatizar backups o acciones operativas

Si estos patrones fallan, los scripts dependientes pueden dejar de actualizar DNS, generar informes incompletos o no enviar alertas.

Patron recomendado: plantilla base

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash
set -euo pipefail

need() { command -v "$1" >/dev/null 2>&1 || { echo "Falta $1" >&2; exit 2; }; }
need curl
need jq

API_TOKEN="${API_TOKEN:-}"
[[ -z "$API_TOKEN" ]] && { echo "Falta API_TOKEN" >&2; exit 1; }

Patron recomendado: GET JSON

1
2
3
4
5
6
resp="$(curl -fsS \
  -H "Authorization: Bearer <TOKEN>" \
  -H 'Accept: application/json' \
  'https://api.example.net/v1/items')"

echo "$resp" | jq -r '.items[].name'

Patron recomendado: paginacion

1
2
3
4
5
6
7
8
9
10
11
12
13
start=0
limit=50
while :; do
  resp="$(curl -fsS --get \
    --data-urlencode "start=${start}" \
    --data-urlencode "limit=${limit}" \
    -H "Authorization: Bearer <TOKEN>" \
    'https://api.example.net/v1/items')"
  count="$(echo "$resp" | jq '.values | length')"
  (( count == 0 )) && break
  echo "$resp" | jq -c '.values[]'
  (( start += count ))
done

Patron recomendado: CSV con jq

1
jq -r '["key","created"], (.[] | [.key, .created]) | @csv' datos.json > salida.csv

Patron recomendado: fechas ISO

1
2
normalizada="$(echo "$fecha" | sed -E 's/([0-9]{2})([0-9]{2})$/\1:\2/')"
epoch="$(date -d "$normalizada" +%s)"

Checklist

  • Token fuera del script.
  • curl -fsS para fallos visibles.
  • --data-urlencode en JQL, filtros y textos.
  • mktemp con trap para temporales.
  • CSV generado con jq @csv, no concatenando comas a mano.

Scripts originales relacionados

ScriptUso
jira_tool.shconsultar Jira/JSM y generar CSV
get_jsm_keys.shextraer claves JSM paginadas
jira_comment_diff.shcalcular tiempos entre creacion y comentarios
cloudflare_*.shactualizar registros DNS por API
libra_bot.shenviar mensajes a Telegram
pfsense_backups_auto.shautomatizar descarga de backup pfSense
This post is licensed under CC BY 4.0 by the author.