Última actualización: 2026-04-24
/meeting-transcript-extract — Teams transcript extractor via CDP
Objetivo
Capturar transcripciones de reuniones en Teams web sin depender de permisos de descarga VTT. Funciona para reuniones donde el usuario fue organizador O simplemente asistente. Resuelve el gap de SharePoint Stream player cuando devuelve "elemento no existe" para reuniones ajenas.
Pre-requisitos
- Browser-daemon ejecutándose (verificar con
scripts/ensure-daemons-auth.sh). - Cuenta autenticada:
- Puerto 9222 → cuenta1.
- Puerto 9223 → cuenta2.
- Tab de Teams abierto en
teams.microsoft.com/v2/con sesión activa.
Invocación
# Listar chats disponibles (dry-run)
python scripts/extract-teams-transcripts.py --port 9223 --out-dir /tmp/test
# Procesar todos los chats de reunión
python scripts/extract-teams-transcripts.py \
--port 9223 \
--out-dir projects/{slug}_main/{slug}-monica/meetings/raw \
--batch
# Procesar un chat específico (match diacritic-insensitive)
python scripts/extract-teams-transcripts.py \
--port 9223 \
--out-dir projects/{slug}_main/{slug}-monica/meetings/raw \
--substring "Demo OCV"
Pipeline técnico
- List chats: expandir sección Chats del tree en Teams, scroll progresivo, filtrar por chats que empiecen con
[oRevisi(reuniones). - Click chat: double-click programático via
Input.dispatchMouseEvent. - Buscar botón Transcripción: si no aparece, probar Ver resumen primero (activa el Recap pane que a veces expone la transcripción).
- Esperar iframe
xplatplugins.aspx: el Recap de Teams carga la transcripción en este iframe del tenant owner. El iframe es target CDP independiente (type=iframe). - Scroll iframe + dedupe: encontrar el container con mayor
scrollHeight-clientHeight, scroll porclientHeight*0.85cada paso, capturarinnerTexty deduplicar líneas. Parar en 3 stalls consecutivos o end-of-scroll. - Save:
{out-dir}/YYYYMMDD-teams-{slug}.transcript.txtcon header (title + extracted timestamp).
Estados de salida por reunión
ok— transcripción capturada y guardada.chat_not_found— el chat no aparece en la vista.no_transcript_btn— la reunión no tiene grabación / transcripción disponible.no_transcript_after_resumen— click en Ver resumen no expuso el botón.empty— iframe accesible pero sin texto útil (<100 chars).
Limitaciones conocidas
- Chats Daily recurrentes: solo se captura la última reunión recap; para anteriores hay que scrollear el historial del chat (no implementado).
- Reuniones >30 días: pueden haberse purgado de Teams.
- Tenant URLs: se infieren del iframe. Los valores reales NUNCA se hardcodean.
- Teams migrado a
teams.cloud.microsoft: si el browser usa esta URL sin navegación explícita a/v2/, el chat list puede estar vacío. Forzar navegación ateams.microsoft.com/v2/.
Integración con /project-update
En Fase 2 (Digestión), invocar post-digest de emails para los chats de meeting con actividad nueva en los últimos 7 días. El skill meeting-digest puede consumir los .transcript.txt generados.
Anti-patrones
- NUNCA hardcodear tenant URLs, user principals, o identidades. Descubrir empíricamente.
- NUNCA asumir permisos: si el click devuelve
no_transcript_btn, marcar como processed con status; no reintentar. - NUNCA inventar dominios.
Validación 2026-04-24
8 transcripciones capturadas en una pasada (~384 KB texto):
- Reuniones propias del usuario: OK vía SP Stream directo.
- Reuniones con el usuario como asistente: OK vía Teams iframe (breakthrough — SharePoint Stream directo denegaba acceso, Teams iframe lo expone vía Recap).
- Reuniones sin grabación: detectadas y skipped con status
no_transcript_btn.