DonAzufre/rain-class-reviewer

Descarga diapositivas de los cursos de Changjiang Yuketang y genera materiales de revisión estructurados como una CLI y un Skill de Agente instalable.

¿Qué es rain-class-reviewer?

Este skill permite a un agente de IA (como Claude Code, Cursor o Codex) descargar diapositivas de cursos de la plataforma Changjiang Yuketang (长江雨课堂) y generar automáticamente materiales de revisión estructurados, como notas en Markdown y un resumen general de estudio (review.md). Está diseñado como una herramienta de línea de comandos (CLI) y como un skill instalable que sigue un flujo estricto: primero, utiliza chrome-devtools-mcp para interactuar con el navegador y obtener las cookies de autenticación (incluyendo HttpOnly) al iniciar sesión el usuario. Una vez obtenidas, todas las operaciones posteriores (listar cursos, descargar diapositivas, extraer notas y generar resúmenes) se ejecutan mediante scripts locales de Node.js, evitando el uso del navegador para tareas de extracción de datos. Esto asegura un proceso eficiente, seguro y compatible con los modos automáticos de los agentes. El skill soporta filtros de descarga por fecha, ID de lección o la lección más reciente, y requiere una clave API de MiMo para la generación de resúmenes. Es especialmente útil para estudiantes y profesionales que desean convertir presentaciones de cursos en línea en materiales de estudio reutilizables y fáciles de consultar.

Compatible con✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add DonAzufre/rain-class-reviewer

Installed? Explore more Investigación y análisis de datos skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Descarga de Diapositivas de Changjiang Yuketang y Generación de Esquemas de Revisión

Importante: Límites de Comportamiento del LLM

Este Skill distingue estrictamente las responsabilidades del MCP del navegador y los scripts locales. Debes respetar los siguientes límites y está prohibido realizar operaciones fuera de ellos.

Lo que puedes hacer con chrome-devtools-mcp (solo)

  1. Abrir https://changjiang.yuketang.cn/ y verificar el estado de inicio de sesión.
  2. Cuando el usuario no haya iniciado sesión, indicarle que complete el inicio de sesión y esperar su confirmación.
  3. Obtener la Cookie después del inicio de sesión:
    • Priorizar la lectura del campo Cookie desde los encabezados de solicitud de DevTools Network (puede obtener todas las Cookies, incluyendo HttpOnly).
    • Si no se puede obtener de los encabezados de solicitud, se puede recurrir a leer document.cookie (solo Cookies no HttpOnly).
  4. Manejar tareas complejas o ambiguas que el script no puede completar (como la verificación humana en la página, ventanas emergentes que requieren que el usuario haga clic manualmente, o flujos de inicio de sesión exclusivos del navegador).

Prohibido usar chrome-devtools-mcp para

  • Llamar a las APIs de listas de cursos, listas de lecciones, extracción de PPT, etc., y leer los datos de respuesta para obtener información del negocio.
  • Paginar, capturar imágenes o analizar HTML de la página para obtener datos de cursos/lecciones/PPT.
  • Descargar imágenes directamente.
  • Generar o modificar esquemas de revisión directamente.
  • Usar el navegador para sondear repetidamente la corrección de las interfaces.

Estas tareas deben implementarse llamando a scripts/bootstrap.js. La lista de interfaces específica se encuentra en references/yuketang-api.md.

Diferencia clave: Usar MCP para leer el encabezado Cookie de una solicitud de red se considera "obtener el estado de inicio de sesión" y está permitido; usar MCP para leer el cuerpo de una respuesta de API se considera "obtener datos del negocio" y está prohibido.

Detener MCP inmediatamente después de construir el Manifiesto mínimo

Una vez que obtengas la Cookie a través de MCP, detén inmediatamente todas las operaciones de chrome-devtools-mcp. La Cookie solo se puede pasar al script a través de la variable de entorno RAIN_COOKIES; el archivo de Manifiesto solo conserva la información del curso. Los pasos siguientes deben ser realizados por el script:

set RAIN_COOKIES={"sessionid":"...","csrftoken":"...","uv_id":"0","university_id":"0","xtbz":"ykt"}
  1. node <ruta-del-skill>/scripts/bootstrap.js verify-auth --manifest <ruta-del-skill>/tmp/manifest.json para verificar el inicio de sesión.
  2. node <ruta-del-skill>/scripts/bootstrap.js list-courses --manifest <ruta-del-skill>/tmp/manifest.json --json para obtener la lista de cursos.
  3. node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --json para descargar las diapositivas (por defecto en el directorio rain-class-reviewer-downloads/ en la raíz del proyecto).
  4. node <ruta-del-skill>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Nombre del curso>" --force-summary para extraer notas y generar un esquema de revisión.

Para ser compatible con la política de seguridad del modo automático de Claude Code, no pases el Manifiesto a través de stdin ni escribas la Cookie en el archivo de Manifiesto. Escribe el Manifiesto final en el directorio tmp/manifest.json del Skill (sobrescribiendo) y refiérelo por ruta en los comandos; la Cookie se pasa a través de la variable de entorno RAIN_COOKIES. El directorio tmp/ ya está en .gitignore y no entrará en el control de versiones.

Solo cuando el script indique explícitamente que se necesita intervención manual (como un captcha, o que el usuario necesita hacer clic en algo en el navegador), se permite volver a habilitar MCP, y una vez manejado, se debe volver inmediatamente al flujo del script.

Resumen de Capacidades

  • Obtención automática del estado de inicio de sesión: Usa chrome-devtools-mcp para conectarse al navegador, verificar o esperar que el usuario inicie sesión y extraer automáticamente la Cookie (soporta HttpOnly Cookie).
  • Procesamiento posterior mediante scripts: La verificación del inicio de sesión, el descubrimiento de cursos, la lista de lecciones, la descarga de PPT, la extracción de notas en Markdown y la generación del esquema de revisión se realizan completamente mediante scripts locales.
  • Descarga con filtros: Soporta la descarga por fecha, ID de lección, o la lección más reciente.
  • Notas en Markdown: Cada página de PPT se guarda como un documento Markdown independiente que incluye título, puntos clave, fórmulas, palabras clave, conceptos centrales y un resumen detallado.
  • Esquema de revisión: Integra las páginas para generar review.md.

Requisitos Previos

Antes de comenzar la ejecución, se deben completar las siguientes verificaciones explícitas en orden:

  1. Verificar Node.js y npm

    • Ejecuta node -v y confirma que la versión principal sea >= 18.
    • Ejecuta npm -v y confirma que npm está disponible.
    • Si no se cumple alguna, detente e indica al usuario que instale Node.js >= 18.
  2. Verificar chrome-devtools-mcp

    • Intenta llamar a una herramienta MCP del navegador una vez (por ejemplo, mcp__chrome-devtools__list_pages o mcp__chrome-devtools__navigate_page).
    • Si MCP no está disponible, detente e indica al usuario que confirme que Claude Code / OpenCode tiene chrome-devtools-mcp habilitado.
  3. Verificar la API Key para resúmenes (solo cuando el usuario solicite generar un esquema de revisión)

    • Verifica si la variable de entorno MIMO_TP_API_KEY existe y comienza con tp-.
    • Si ya existe, continúa.
    • Si no existe, pregunta al usuario por la MiMo API Key (que comienza con tp-).
    • Una vez que el usuario proporcione la Key, pásala como variable de entorno en todos los comandos posteriores que involucren resúmenes, por ejemplo:
      set MIMO_TP_API_KEY=tp-xxxx
      node .claude/skills/rain-class-reviewer/scripts/bootstrap.js summarize --course-dir rain-class-reviewer-downloads/<Nombre del curso>
      
    • Prohibido pedir al usuario que escriba la Key en un archivo, y también está prohibido que el Skill la guarde en disco.
  4. Confirmar que el usuario haya especificado explícitamente el nombre del curso a descargar/resumir.

Inicio Rápido

Todos los comandos deben ejecutarse en el directorio raíz del proyecto actual de Claude Code / OpenCode, llamando al script mediante la ruta relativa al directorio del Skill. scripts/bootstrap.js automáticamente tratará el directorio raíz del proyecto como el directorio de trabajo, por lo tanto:

  • Los parámetros de ruta relativa como --manifest, -o, --course-dir, --lesson-dir se resuelven con respecto al directorio raíz del proyecto, sin duplicación de rutas.
  • Cuando no se especifica --output, el directorio de descarga predeterminado se generará en rain-class-reviewer-downloads/ dentro del directorio raíz del proyecto, no en el directorio de instalación del Skill.

En la primera llamada, scripts/bootstrap.js dará prioridad al uso de dist/cli.cjs precompilado (que ya incluye dependencias como openai), sin necesidad de instalación en línea; si no existe, ejecutará automáticamente npm install.

Flujo Completo

1. Pregunta al usuario el nombre del curso (o una palabra clave).
2. Usa MCP para abrir https://changjiang.yuketang.cn/ y obtener la Cookie (priorizando la lectura desde los encabezados de solicitud de Network).
3. Construye el Manifiesto JSON mínimo y escríbelo en <ruta-del-skill>/tmp/manifest.json.
4. Ejecuta node <ruta-del-skill>/scripts/bootstrap.js verify-auth --manifest <ruta-del-skill>/tmp/manifest.json para verificar el inicio de sesión.
5. Ejecuta node <ruta-del-skill>/scripts/bootstrap.js list-courses --manifest <ruta-del-skill>/tmp/manifest.json --json para obtener la lista de cursos.
6. Coincide el curso según la entrada del usuario; si hay ambigüedad, muestra los candidatos al usuario y confirma el classroomId.
7. Usa el courseName original devuelto por la lista de cursos, construye un nuevo Manifiesto con el classroomId (sobrescribe tmp/manifest.json), ejecuta node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --json para descargar (la salida predeterminada es rain-class-reviewer-downloads/).
8. Después de establecer `MIMO_TP_API_KEY`, ejecuta `node <ruta-del-skill>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Nombre original del curso>" --force-summary` para generar el esquema de revisión.

Ejemplo (ruta del Skill a nivel de proyecto en Claude Code: .claude/skills/rain-class-reviewer):

node .claude/skills/rain-class-reviewer/scripts/bootstrap.js \
  --manifest .claude/skills/rain-class-reviewer/tmp/manifest.json --json

Flujo de Ejecución Estándar

1. Obtener el nombre del curso deseado por el usuario

Confirma el nombre del curso con el usuario; se permiten abreviaturas o palabras clave, por ejemplo "Redes de Computadoras". Registra la entrada original del usuario sin hacer ninguna coincidencia inmediatamente.

2. Usar MCP para obtener la Cookie

El sessionid de Changjiang Yuketang suele ser una HttpOnly Cookie, que no se puede leer mediante document.cookie. Debes obtenerlo a través de los encabezados de solicitud de Chrome DevTools Network, y debes usar estrictamente las URL que se enumeran a continuación.

2.1 Abrir la página de Changjiang Yuketang

URL a la que se debe navegar:

https://changjiang.yuketang.cn/

Pasos:

  1. Conéctate al navegador.
  2. Usa mcp__chrome-devtools__navigate_page para navegar a:
    https://changjiang.yuketang.cn/
    
  3. Si la página ya se ha cargado, usa type=reload para recargar la misma URL y generar nuevas solicitudes de red:
    mcp__chrome-devtools__navigate_page: type=reload, url=https://changjiang.yuketang.cn/
    

2.2 Activar una solicitud de red con Cookie

Después de recargar la página, el navegador normalmente genera automáticamente múltiples solicitudes con Cookie. Si no aparecen suficientes solicitudes, debes activar activamente la siguiente URL:

URL de activación preferida (esta URL es exactamente la misma que la interfaz de lista de cursos que usan los scripts posteriores verify-auth / list-courses, segura y reutilizable):

GET https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2

Forma de activación (elige una, solo para generar tráfico de solicitud, prohibido leer datos de respuesta de negocio):

  • Opción A: Realiza una recarga de página (ver 2.1).
  • Opción B: Ejecuta mediante evaluate_script:
    fetch('https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2', { credentials: 'include' });
    

URL de activación alternativa (cuando la solicitud preferida no aparece, cualquier solicitud a changjiang.yuketang.cn es aceptable):

https://changjiang.yuketang.cn/            (documento de la página)
https://changjiang.yuketang.cn/v2/web/index (página de inicio)
https://changjiang.yuketang.cn/*           (recursos estáticos bajo el mismo dominio, como JS/CSS)

Prohibido usar otros subdominios de Yuketang o interfaces de terceros para sondear la Cookie.

2.3 Leer la Cookie desde los encabezados de solicitud de Network

  1. Llama a list_network_requests para ver las solicitudes recientes.
  2. En la lista de solicitudes, selecciona una según la siguiente prioridad:
    • Prioritario: https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2
    • Segunda opción: https://changjiang.yuketang.cn/ o https://changjiang.yuketang.cn/v2/web/index
    • Aceptable: Cualquier solicitud a https://changjiang.yuketang.cn/*
  3. Usa get_network_request para leer los Encabezados de Solicitud de esa solicitud.
  4. Encuentra el campo cookie o Cookie en los encabezados y analiza los siguientes campos:
    • sessionid (obligatorio)
    • csrftoken (recomendado, para la validación CSRF)
    • uv_id (extraer según el valor real, podría ser 0 u otro valor)
    • university_id (extraer según el valor real, podría ser igual o diferente a uv_id)
    • xtbz (normalmente ykt)
    • django_language (opcional)

Ejemplo de encabezado Cookie:

sessionid=abc123; csrftoken=xyz789; uv_id=0; university_id=0; xtbz=ykt

No codifiques uv_id=2874 o university_id=2874; debes leer los valores reales del encabezado de la solicitud. Valores ausentes o 0 están permitidos.

2.4 Manejar el caso de no haber iniciado sesión

  • Si no hay sessionid en el encabezado de la solicitud, o si la solicitud es redirigida a la página de inicio de sesión, significa que el usuario no ha iniciado sesión.
  • Indica al usuario que inicie sesión manualmente en Changjiang Yuketang.
  • Espera a que el usuario responda "ya inicié sesión".
  • Recarga la página o activa de nuevo https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2 y vuelve a leer la Cookie.

2.5 Plan de Respaldo

Si MCP no puede proporcionar la Cookie del encabezado de solicitud:

  1. Intenta leer document.cookie para obtener Cookies no HttpOnly (normalmente al menos se puede obtener csrftoken).
  2. Si aún no se puede obtener sessionid, pide al usuario que proporcione manualmente el sessionid, o verifica si MCP soporta la obtención de HttpOnly Cookie.
  3. Independientemente de si el respaldo tiene éxito, al final aún debes obtener sessionid a través del encabezado de solicitud de Network.

3. Construir el Manifiesto Mínimo

{
  "version": "1.0",
  "courseName": "Redes de Computadoras"
}

courseName usa la entrada original del usuario. Este Manifiesto solo se usa para la verificación y para obtener la lista de cursos; no garantiza la coincidencia final. Inmediatamente después de construir este Manifiesto, detén MCP.

La Cookie se pasa a través de la variable de entorno RAIN_COOKIES (igual a continuación):

set RAIN_COOKIES={"sessionid":"...","csrftoken":"...","uv_id":"0","university_id":"0","xtbz":"ykt"}

4. Verificar el Estado de Inicio de Sesión

set RAIN_COOKIES={...}
node <ruta-del-skill>/scripts/bootstrap.js verify-auth --manifest <ruta-del-skill>/tmp/manifest.json
  • Éxito: Continúa al siguiente paso.
  • Fracaso: Vuelve al paso 2 y vuelve a obtener la Cookie.

5. Obtener la Lista de Cursos

set RAIN_COOKIES={...}
node <ruta-del-skill>/scripts/bootstrap.js list-courses --manifest <ruta-del-skill>/tmp/manifest.json --json

Devuelve el classroomId, courseName, className, teacher de todos los cursos de la cuenta actual.

6. Coincidir el Curso y Manejar Ambigüedades

Usa la entrada original del usuario para coincidir con la lista de cursos:

  • Coincidencia exacta única: Usa ese classroomId directamente.
  • Sin coincidencia: Muestra al usuario todos los cursos disponibles y pídele que especifique el nombre del curso o classroomId.
  • Múltiples coincidencias: Muestra al usuario los cursos candidatos (incluyendo clase, profesor, classroomId) y pídele que confirme.

Prohibido elegir por tu cuenta. Después de la confirmación, usa el courseName original devuelto por la lista de cursos para construir un nuevo Manifiesto y sobrescribe tmp/manifest.json:

{
  "version": "1.0",
  "courseName": "Redes de Computadoras",
  "classroomId": "13522533"
}

7. Descargar Diapositivas

set RAIN_COOKIES={...}
node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --json

8. Extraer Notas en Markdown y Generar Esquema de Revisión

set MIMO_TP_API_KEY=tp-xxxx
node <ruta-del-skill>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Nombre del curso>" --force-summary

Salida:

  • Notas Markdown por página: rain-class-reviewer-downloads/<Nombre del curso>/extracted/<Lección>/<Número de página>.md
  • Esquema de revisión general: rain-class-reviewer-downloads/<Nombre del curso>/review.md

Descarga Filtrada por Lección

Descargar solo la lección más reciente:

node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --latest --json

Descargar por rango de fechas:

node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --since 2023-11-01 --until 2023-11-05 --json

Manejo de Ambigüedades en el Nombre del Curso

  • Si hay múltiples cursos con el mismo nombre, el script mostrará un error y listará los classroomId candidatos.
  • Prohibido elegir por tu cuenta, debes mostrar los cursos candidatos al usuario y pedir confirmación.
  • Después de la confirmación, especifica explícitamente classroomId en el Manifiesto antes de llamar al script.

Manejo de Fallos de Autenticación

Si el script devuelve 403 / no iniciado / fallo de verificación de autenticación:

  1. Indica que el sessionid ha expirado o falta.
  2. Vuelve a ejecutar el paso 2 (usa MCP para verificar o volver a iniciar sesión).
  3. Actualiza la variable de entorno RAIN_COOKIES.
  4. Vuelve a ejecutar el script.

Nota Especial para el Modo Automático de Claude Code

El archivo de Manifiesto de este Skill ya no contiene cookies ni credenciales; la Cookie solo se puede pasar a través de la variable de entorno RAIN_COOKIES. Por lo tanto, Write(tmp/manifest.json) solo escribe el nombre del curso/classroomId, lo que generalmente pasa la verificación de escritura de archivos del modo automático.

Si el modo automático aún intercepta la escritura en el archivo temporal, puedes crear manualmente .claude/policy.json en el directorio raíz del proyecto actual:

{
  "autoMode": {
    "allow": [
      "Allow writing the rain-class-reviewer skill manifest file at .claude/skills/rain-class-reviewer/tmp/manifest.json, which only contains course name and classroomId.",
      "Allow running node .claude/skills/rain-class-reviewer/scripts/bootstrap.js commands for course download and summarization."
    ]
  }
}

Todos los comandos deben incluir la variable de entorno RAIN_COOKIES:

set RAIN_COOKIES={"sessionid":"...","csrftoken":"...","uv_id":"0","university_id":"0","xtbz":"ykt"}
node .claude/skills/rain-class-reviewer/scripts/bootstrap.js verify-auth --manifest .claude/skills/rain-class-reviewer/tmp/manifest.json

Git Bash / Linux / macOS usan export RAIN_COOKIES='...'.

Seguridad y Privacidad

  • Prohibido mostrar la Cookie completa en texto plano en la conversación.
  • El Manifiesto se escribe en tmp/manifest.json dentro del directorio del Skill, sobrescribiendo el contenido anterior; el Manifiesto no debe incluir el campo cookies. El directorio tmp/ ya está en .gitignore y no entrará en el control de versiones.
  • La Cookie solo se puede pasar a través de la variable de entorno RAIN_COOKIES; no guardes cookies.json por separado.
  • El directorio de descarga rain-class-reviewer-downloads/ y el directorio temporal tmp/ ya están en .gitignore.

Limitaciones Conocidas

  • La herramienta prioriza el uso de las nuevas interfaces lesson-summary + presentation para obtener el PPT completo; si no están disponibles, recurrirá automáticamente a la interfaz review, pero esta última solo contiene las diapositivas que se mostraron durante la clase.
  • La función de resumen depende de la MiMo API Key, que debe pasarse a través de la variable de entorno MIMO_TP_API_KEY; está prohibido escribirla en un archivo.

Referencias

  • references/yuketang-api.md: Lista de interfaces y restricciones de Changjiang Yuketang.
  • references/manifest.example.json: Ejemplo completo de Manifiesto.
  • docs/usage.md: Documentación completa de parámetros de la CLI.
  • docs/implementation.md: Detalles de implementación.

Skills relacionados