Saltar a contenido

Recopilación de episodios mediante API

Un sistema externo puede leer episodios mediante GET /watcher/client-api/v3/episodes y guardarlos. Solo devuelve episodios accesibles para el usuario. Se requieren los permisos correspondientes sobre el archivo de las cámaras.

El recopilador consulta Watcher con los filtros indicados y guarda los episodios. El ejemplo exporta una vez un intervalo fijo; las condiciones para recopilación continua se explican después.

Preparar el acceso

  1. Elija un usuario con acceso al archivo de las cámaras.
  2. Obtenga access_token o clave personal según las instrucciones de autenticación.
  3. Prepare dirección Watcher, nombre técnico de cámara y límites del intervalo en milisegundos Unix. Use los mismos valores en ambos ejemplos.

Leer episodios

curl --fail-with-body --get \
  --header 'Authorization: Bearer <token>' \
  --data-urlencode 'media=entrance-example' \
  --data-urlencode 'opened_at_gte=1793692800000' \
  --data-urlencode 'opened_at_lte=1793779200000' \
  --data-urlencode 'limit=100' \
  'https://watcher.example.com/watcher/client-api/v3/episodes'

Sustituya media por el nombre de cámara. El tiempo se expresa en milisegundos Unix. La respuesta contiene episodes y cursores. Envíe next como cursor hasta terminar.

Guardar como JSON Lines

El ejemplo exporta el intervalo a episodes.jsonl. Requiere Python 3 sin paquetes adicionales. Guárdelo como collect_episodes.py, sustituyendo base, media y los límites:

import json
import os
from urllib.parse import urlencode
from urllib.request import Request, urlopen

base = "https://watcher.example.com/watcher/client-api/v3"
params = {
    "media": "entrance-example",
    "opened_at_gte": 1793692800000,
    "opened_at_lte": 1793779200000,
    "limit": 100,
}
headers = {"Authorization": "Bearer " + os.environ["WATCHER_TOKEN"]}

with open("episodes.jsonl", "w", encoding="utf-8") as output:
    while True:
        req = Request(base + "/episodes?" + urlencode(params), headers=headers)
        with urlopen(req, timeout=30) as response:
            result = json.load(response)
        for episode in result.get("episodes", []):
            output.write(json.dumps(episode, ensure_ascii=False) + "\n")
        cursor = result.get("next")
        if not cursor:
            break
        params["cursor"] = cursor

Defina el token en el entorno y ejecute:

read -rs WATCHER_TOKEN
export WATCHER_TOKEN
python3 collect_episodes.py
unset WATCHER_TOKEN

Tras read, pegue el token y pulse Intro; la entrada queda oculta. Si termina correctamente, episodes.jsonl contiene un objeto JSON por línea. Compare cámara y tiempos con el intervalo; abra uno de los episodios en Watcher para comprobarlo.

  • Archivo vacío tras una solicitud correcta — no se recibieron episodios accesibles del intervalo. Compruebe cámara, tiempo y permisos.
  • HTTP 401 o 403 — compruebe token, sesión y permisos de archivo. Repita tras corregir el acceso.
  • Error de conexión o tiempo de espera — compruebe dirección y conectividad desde el recopilador. Repita al restablecerla; un archivo de una ejecución interrumpida puede estar incompleto.

Para recopilación continua, persista el estado fuera del proceso y actualice por episode_id: un episodio puede recibirse otra vez con cambios. La integración determina intervalos y orden. Una exportación no garantiza entrega de todos los cambios posteriores.