Saltearse al contenido

Los módulos

El servicio es un binario en Rust. Un proceso levanta tres cosas: el API (axum), el poller y el worker de emisión.

El mapa de módulos

Lo compartido

Hablar con redes

Los que trabajan solos

Superficie HTTP

Entrada

main.rs

levanta los tres

cli.rs

comandos de operación

api/

rutas y handlers

auth/

identidad y capacidades

poller.rs

cada N horas

emision/

toma la cola y publica

latidos.rs

«sigo vivo»

ingesta/

traer

redes/

publicar

instagram/

navegador + yt-dlp

cuentas.rs

plataformas y altas

archivo.rs

bytes en disco

cripto.rs

AES-256-GCM

alertas/

avisar

cauce/

export e import

probe/

sondas

Qué hace cada uno

Traer material — ingesta/

Un módulo por origen, todos detrás de la misma forma: dado una cuenta y su cursor, devolver lo nuevo.

MóduloOrigenCómo
ingesta/cliente.rsInstagram con tokenGraph API, cuentas Business/Creator
ingesta/instagram_publico.rsInstagram sin tokenNavegador headless sobre el perfil público
ingesta/telegram.rsTelegramBot API (getUpdates)
ingesta/rss.rsCualquier feedfeed-rs, RSS y Atom
ingesta/web.rsEl sitio propioLa API de Antisionista

Instagram tiene dos módulos y no uno. Con token se usa la API oficial, que es rápida y estable. Sin token —una cuenta pública que dio permiso pero no puede entregar credenciales de empresa— se entra al perfil con un navegador. Son caminos distintos con costos distintos, y la marca de cuál usar es explícita (config.via = 'navegador'), nunca inferida de que falte la credencial: inferirla convertiría un token revocado en un scrapeo sin que nadie lo decidiera.

Publicar — redes/

MóduloDestino
redes/mastodon.rsMastodon y compatibles
redes/telegram.rsCanales y grupos
redes/identidad.rs«¿Quién soy con este token?» — verifica antes de dar de alta
redes/segmentacion.rsParte un video largo en piezas publicables
redes/falso.rsUn destino de mentira, para los tests

Las sondas — probe/

Responden «¿esto funcionaría?» sin publicar nada. Están partidas en origen y destino porque son preguntas distintas: si se puede leer, y si se puede escribir.

Una sonda nunca devuelve «ok» sin haber tocado la red. Puede devolver no_verificado, que no es ni bien ni mal: no hubo con qué comprobarlo. Que exista como estado propio es lo que impide que «no se pudo mirar» se cuente como «está bien».

Cómo se relacionan las piezas de emisión

origina

recibe

autoriza

origen

destino

usa

1

1

1

1

1

1

0..*

0..*

0..*

1

1

0..*

Emision

+id: Uuid

+item_id: Uuid

+cuenta_destino_id: Uuid

+estado: String

+ronda: i32

+intentos: i32

+aprobado_por: Option<String>

+detener: bool

Item

+id: Uuid

+cuenta_origen_id: Uuid

+permalink: Option<String>

+tags: Vec<String>

+autor: Option<String>

+regimen: String

+archivo_estado: String

+pasa_condicion() : bool

Ruta

+clave: String

+origen_id: Uuid

+destino_id: Uuid

+condicion: Option<Json>

+activa: bool

+auto_publica: bool

Cuenta

+plataforma: String

+rol: String

+credenciales_cifradas: Option<Bytes>

+config: Json

+salud: String

+admite(rol) : bool

Consentimiento

+otorgado_por: String

+otorgado_en: DateTime

+revocado_en: Option<DateTime>

+cuentas_destino: Vec<Uuid>

+vigente() : bool

«interface»

ClienteDeRed

+publicar(item) : Result

+identidad() : Result

Mastodon

Telegram

Web

El grifo (max_por_hora) vive en la CUENTA de destino, no en la ruta. El límite es de quien recibe: si tres flujos distintos apuntan a la misma cuenta de Mastodon, el techo lo pone Mastodon y no cada flujo por su lado. Ponerlo en la ruta habría dejado que tres rutas «de 4 por hora» hicieran 12.

Las dos superficies: HTTP y CLI

Hacen cosas parecidas y no son intercambiables.

CLI (en el servidor)

Panel (HTTP)

misma función

dar de alta cuentas

aprobar emisiones

otorgar permisos

exportar cauce

SIN credenciales

dar de alta cuentas

exportar cauce

CON credenciales cifradas

importar y restaurar

backfill histórico

El respaldo con credenciales cifradas sale sólo por CLI. Por HTTP los tokens salen vacíos, siempre. Ese corte es lo que deja al invariante «este servicio no tiene un endpoint que devuelva texto cifrado» sin excepciones: el único camino que los toca no es un endpoint.

La CLI no tiene pase libre por correr en el servidor. Importar y restaurar validan identidad contra el anfitrión y exigen capacidad de administrar. Sólo exportar y validar quedan exentos, porque un respaldo tiene que poder correr por cron.