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)
- Abrir
https://changjiang.yuketang.cn/y verificar el estado de inicio de sesión. - Cuando el usuario no haya iniciado sesión, indicarle que complete el inicio de sesión y esperar su confirmación.
- Obtener la Cookie después del inicio de sesión:
- Priorizar la lectura del campo
Cookiedesde 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).
- Priorizar la lectura del campo
- 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
Cookiede 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"}
node <ruta-del-skill>/scripts/bootstrap.js verify-auth --manifest <ruta-del-skill>/tmp/manifest.jsonpara verificar el inicio de sesión.node <ruta-del-skill>/scripts/bootstrap.js list-courses --manifest <ruta-del-skill>/tmp/manifest.json --jsonpara obtener la lista de cursos.node <ruta-del-skill>/scripts/bootstrap.js --manifest <ruta-del-skill>/tmp/manifest.json --jsonpara descargar las diapositivas (por defecto en el directoriorain-class-reviewer-downloads/en la raíz del proyecto).node <ruta-del-skill>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Nombre del curso>" --force-summarypara 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.jsondel Skill (sobrescribiendo) y refiérelo por ruta en los comandos; la Cookie se pasa a través de la variable de entornoRAIN_COOKIES. El directoriotmp/ya está en.gitignorey 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:
-
Verificar Node.js y npm
- Ejecuta
node -vy confirma que la versión principal sea >= 18. - Ejecuta
npm -vy confirma que npm está disponible. - Si no se cumple alguna, detente e indica al usuario que instale Node.js >= 18.
- Ejecuta
-
Verificar chrome-devtools-mcp
- Intenta llamar a una herramienta MCP del navegador una vez (por ejemplo,
mcp__chrome-devtools__list_pagesomcp__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.
- Intenta llamar a una herramienta MCP del navegador una vez (por ejemplo,
-
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_KEYexiste y comienza contp-. - 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.
- Verifica si la variable de entorno
-
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-dirse 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á enrain-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:
- Conéctate al navegador.
- Usa
mcp__chrome-devtools__navigate_pagepara navegar a:https://changjiang.yuketang.cn/ - Si la página ya se ha cargado, usa
type=reloadpara 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
- Llama a
list_network_requestspara ver las solicitudes recientes. - 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/ohttps://changjiang.yuketang.cn/v2/web/index - Aceptable: Cualquier solicitud a
https://changjiang.yuketang.cn/*
- Prioritario:
- Usa
get_network_requestpara leer los Encabezados de Solicitud de esa solicitud. - Encuentra el campo
cookieoCookieen 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 ser0u otro valor)university_id(extraer según el valor real, podría ser igual o diferente auv_id)xtbz(normalmenteykt)django_language(opcional)
Ejemplo de encabezado Cookie:
sessionid=abc123; csrftoken=xyz789; uv_id=0; university_id=0; xtbz=ykt
No codifiques
uv_id=2874ouniversity_id=2874; debes leer los valores reales del encabezado de la solicitud. Valores ausentes o0están permitidos.
2.4 Manejar el caso de no haber iniciado sesión
- Si no hay
sessioniden 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=2y vuelve a leer la Cookie.
2.5 Plan de Respaldo
Si MCP no puede proporcionar la Cookie del encabezado de solicitud:
- Intenta leer
document.cookiepara obtener Cookies no HttpOnly (normalmente al menos se puede obtenercsrftoken). - Si aún no se puede obtener
sessionid, pide al usuario que proporcione manualmente elsessionid, o verifica si MCP soporta la obtención de HttpOnly Cookie. - Independientemente de si el respaldo tiene éxito, al final aún debes obtener
sessionida 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
classroomIddirectamente. - 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
classroomIdcandidatos. - 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
classroomIden 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:
- Indica que el
sessionidha expirado o falta. - Vuelve a ejecutar el paso 2 (usa MCP para verificar o volver a iniciar sesión).
- Actualiza la variable de entorno
RAIN_COOKIES. - 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.jsondentro del directorio del Skill, sobrescribiendo el contenido anterior; el Manifiesto no debe incluir el campo cookies. El directoriotmp/ya está en.gitignorey no entrará en el control de versiones. - La Cookie solo se puede pasar a través de la variable de entorno
RAIN_COOKIES; no guardescookies.jsonpor separado. - El directorio de descarga
rain-class-reviewer-downloads/y el directorio temporaltmp/ya están en.gitignore.
Limitaciones Conocidas
- La herramienta prioriza el uso de las nuevas interfaces
lesson-summary+presentationpara obtener el PPT completo; si no están disponibles, recurrirá automáticamente a la interfazreview, 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.