Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.1 KiB
Capability: browser-profiles
Catálogo operativo de los perfiles del navegador Chromium para investigaciones
multicuenta OSINT. Por cada perfil de Chromium (un --profile-directory dentro
de un user-data-dir) guarda qué correo/cuentas usar, propósito, persona e
identidad de la investigación y la nota del vault que lo documenta, y permite
lanzar el perfil listo para trabajar mostrando sus cuentas. La fuente de
verdad vive en el service osint_db (FastAPI + DuckDB, http://127.0.0.1:8771),
en las tablas browser_profiles + browser_profile_accounts (schema main,
pobladas solo por API, como network_scans). Estas funciones son clientes HTTP
finos a ese service.
Regla de seguridad dura: una cuenta guarda secret_ref — una referencia
al secreto (ej. pass show osint/p1/gmail), NUNCA la contraseña en claro. Ni el
service ni estas funciones almacenan o resuelven credenciales: browser_profile_open
solo expone el secret_ref para que el operador (o otra herramienta) lo resuelva
con pass/keepass.
Comparte el ecosistema del project osint (vault Obsidian + service osint_db)
con los grupos recon, osint-passive y dav. El perfil real de Chromium vive
en ~/.config/chromium-cdp (user-data-dir con CDP 9222 inyectado por el wrapper
/usr/bin/chromium); el catálogo NO toca el perfil en disco, solo su metadata.
Funciones
| ID | Firma | Qué hace |
|---|---|---|
browser_profile_register_py_browser |
browser_profile_register(profile_dir, label="", persona="", purpose="", note_path="", tags=None, notes="", user_data_dir="", status="active", accounts=None, base_url=...) -> dict |
Registra/actualiza un perfil y, opcionalmente, sus cuentas en una sola llamada (1 POST del perfil + 1 POST por cuenta). Idempotente (upsert por profile_dir y por id de cuenta). accounts es una lista de dicts {service, identity, secret_ref?, role?, status?, notes?}. |
browser_profile_list_py_browser |
browser_profile_list(status=None, base_url=...) -> dict |
Lista los perfiles del catálogo con su nº de cuentas (n_accounts). Filtro opcional por status (active/archived). Devuelve {"status":"ok","profiles":[...]}. |
browser_profile_show_py_browser |
browser_profile_show(profile_dir, base_url=...) -> dict |
Muestra un perfil con todas sus cuentas. Devuelve {"status":"ok","profile":{...},"accounts":[...]} o error si no existe. Las cuentas traen secret_ref (referencia), nunca el password. |
browser_profile_open_py_browser |
browser_profile_open(profile_dir, url=None, base_url=..., dry_run=False) -> dict |
Lanza Chromium en el perfil (--profile-directory) vía systemd-run --user --scope (evita exit-144) y devuelve sus cuentas/secret_ref para saber qué usar. dry_run=True devuelve el comando sin abrir nada. Compone browser_profile_show para leer la metadata. |
Ejemplo canónico (end-to-end)
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from browser.browser_profile_register import browser_profile_register
from browser.browser_profile_list import browser_profile_list
from browser.browser_profile_show import browser_profile_show
from browser.browser_profile_open import browser_profile_open
# 1. Registrar un perfil con sus cuentas (secret_ref = referencia a pass, NO el password)
browser_profile_register(
"osint_01",
label="osint_01",
persona="sock-puppet Marta R.",
purpose="infiltración foros nicho X",
tags=["osint", "sockpuppet"],
accounts=[
{"service": "gmail", "identity": "marta.r.osint@gmail.com", "secret_ref": "pass show osint/osint_01/gmail", "role": "primary"},
{"service": "twitter", "identity": "@marta_r_osint", "secret_ref": "pass show osint/osint_01/x", "role": "burner"},
],
)
# 2. Listar el catálogo
browser_profile_list() # {"status":"ok","profiles":[{profile_dir, label, n_accounts, ...}]}
# 3. Ver un perfil con sus cuentas
browser_profile_show("osint_01") # {"profile": {...}, "accounts": [{service, identity, secret_ref, role}]}
# 4. Abrir el perfil listo para trabajar (lanza Chromium + dice qué cuentas usar)
browser_profile_open("osint_01", url="https://twitter.com")
# -> systemd-run --user --scope -- chromium --profile-directory=osint_01 https://twitter.com
# -> accounts: [(gmail, pass show osint/osint_01/gmail), (twitter, pass show osint/osint_01/x)]
Vía fn run (un id conocido a la vez):
./fn run browser_profile_list
./fn run browser_profile_show osint_01
./fn run browser_profile_open osint_01 https://twitter.com
Fronteras (qué NO cubre)
- No gestiona el perfil de Chromium en disco (crear/clonar/extensiones/avatar):
eso es
create_chrome_profile_bash_browser,list_chrome_profiles_go_browser,set_chrome_profile_appearance_bash_browser. Este grupo solo guarda metadata operativa y lanza un perfil existente. - No almacena ni resuelve contraseñas. Solo referencias (
secret_ref). El password se resuelve aparte conpass/keepass. - No automatiza el login ni rellena formularios: para eso usa el
browser_mcpo el grupoflow-replayuna vez el perfil está abierto. - Requiere el service
osint_dbvivo en:8771. Si está caído, las funciones devuelven{"status":"error", ...}sin lanzar.
Gotchas
- El
profile_dires el nombre del directorio REAL del perfil de Chromium (lo que va en--profile-directory):"Default","Profile 1","osint_01". NO es el nombre legible (ese eslabel). Verlos conlist_chrome_profiles_go_browsero elLocal Statedel user-data-dir. browser_profile_openpor defecto NO pasa--user-data-dir(el perfil vive en~/.config/chromium-cdp, que el wrapper/usr/bin/chromiumya inyecta). Si el perfil está en otro user-data-dir, regístralo conuser_data_dir=<ruta>y la función lo pasará explícito.- Se lanza vía
systemd-run --user --scopea propósito: lanzar Chromium directo desde un proceso hijo da exit-144 en este entorno. secret_refNUNCA es el password. Si te ves tentado a meter la contraseña ahí, para: guárdala enpass/keepass y referencia el comando.