Kursfolien von Changjiang Yuketang herunterladen und Lernzusammenfassungen erstellen
Wichtig: Verhaltensgrenzen der KI
Diese Fertigkeit trennt streng die Zuständigkeiten des Browser-MCP und der lokalen Skripte. Du musst die folgenden Grenzen einhalten und darfst sie nicht überschreiten.
Was du mit chrome-devtools-mcp tun darfst (ausschließlich)
- Öffne
https://changjiang.yuketang.cn/und überprüfe den Anmeldestatus. - Falls der Benutzer nicht angemeldet ist, fordere ihn zur Anmeldung auf und warte auf seine Bestätigung.
- Nach der Anmeldung, hole das Cookie:
- Bevorzugt über den DevTools Network-Request-Header, lies das
Cookie-Feld aus (dies erfasst alle Cookies, einschließlich HttpOnly). - Falls das Auslesen aus dem Request-Header nicht möglich ist, greife auf das nicht-HttpOnly
document.cookiezurück.
- Bevorzugt über den DevTools Network-Request-Header, lies das
- Bearbeite komplexe/unklare Aufgaben, die das Skript nicht erledigen kann (z. B. CAPTCHAs, Pop-ups, die eine manuelle Auswahl im Browser erfordern, oder browserspezifische Anmeldeabläufe).
Was du mit chrome-devtools-mcp nicht tun darfst
- Rufe API-Endpunkte wie Kurslisten, Stundenlisten oder PPT-Extraktionen auf und lies die Antwortdaten aus, um Geschäftsinformationen zu erhalten.
- Blättere um, mache Screenshots oder parst den HTML-Code, um Kurs-/Stunden-/PPT-Daten zu erhalten.
- Lade Bilder direkt herunter.
- Erstelle oder ändere Lernzusammenfassungen direkt.
- Verwende den Browser wiederholt, um die Korrektheit von Schnittstellen zu überprüfen.
Diese Aufgaben müssen mit scripts/bootstrap.js ausgeführt werden. Die spezifische API-Liste findest du in references/yuketang-api.md.
Wichtiger Unterschied: Das Lesen des
Cookie-Request-Headers einer Netzwerkanfrage mit dem MCP gehört zum "Abrufen des Anmeldestatus" und ist erlaubt. Das Lesen des API-Response-Bodys mit dem MCP gehört zum "Abrufen von Geschäftsdaten" und ist verboten.
Stoppe das MCP, sobald das minimale Manifest erstellt ist
Sobald du das Cookie über das MCP erhalten hast, stoppe sofort alle chrome-devtools-mcp-Operationen. Das Cookie darf nur über die Umgebungsvariable RAIN_COOKIES an das Skript übergeben werden. Die Manifest-Datei enthält nur die Kursinformationen. Die nachfolgenden Schritte müssen an das Skript übergeben werden:
set RAIN_COOKIES={"sessionid":"...","csrftoken":"...","uv_id":"0","university_id":"0","xtbz":"ykt"}
node <skill-path>/scripts/bootstrap.js verify-auth --manifest <skill-path>/tmp/manifest.jsonÜberprüfe den Anmeldestatus.node <skill-path>/scripts/bootstrap.js list-courses --manifest <skill-path>/tmp/manifest.json --jsonRufe die Kursliste ab.node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --jsonLade die Kursfolien herunter (Standard-Ausgabe inrain-class-reviewer-downloads/im Projektstammverzeichnis).node <skill-path>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Kursname>" --force-summaryExtrahiere Notizen und erstelle die Lernzusammenfassung.
Aus Kompatibilitätsgründen mit den Sicherheitsrichtlinien des Claude Code Auto Mode: Übergib das Manifest nicht über stdin und füge keine Cookies in die Manifest-Datei ein. Schreibe das endgültige Manifest in
tmp/manifest.jsonim Fertigkeitsverzeichnis (überschreibend) und referenziere es im Befehl über den Pfad. Das Cookie wird über die UmgebungsvariableRAIN_COOKIESübergeben. Das Verzeichnistmp/ist bereits in.gitignoreund wird nicht versioniert.
Nur wenn das Skript explizit menschliches Eingreifen meldet (z. B. CAPTCHA, Benutzer muss im Browser etwas auswählen), darf das MCP wieder aktiviert werden. Nach der Bearbeitung muss sofort zum Skript-Ablauf zurückgekehrt werden.
Fähigkeitenübersicht
- Automatischer Abruf des Anmeldestatus: Verbinde mit dem Browser über chrome-devtools-mcp, überprüfe/warte auf die Benutzeranmeldung und extrahiere das Cookie automatisch (unterstützt HttpOnly-Cookies).
- Skriptgesteuerter Folgeprozess: Überprüfung des Anmeldestatus, Kurserkennung, Stundenliste, PPT-Download, Extraktion von Markdown-Notizen und Generierung der Lernzusammenfassung – alles über lokale Skripte.
- Filter-Download: Unterstützt das Herunterladen nach Datum, Stunden-ID, neuester Stunde usw.
- Markdown-Notizen: Jede PPT-Folie wird als separates Markdown-Dokument gespeichert, enthält Titel, Kernpunkte, Formeln, Schlüsselwörter, Hauptkonzepte und eine detaillierte Zusammenfassung.
- Lernzusammenfassung: Integriert alle Seiten und generiert
review.md.
Voraussetzungen
Bevor du mit der Ausführung beginnst, musst du die folgenden expliziten Prüfungen nacheinander durchführen:
-
Überprüfe Node.js und npm
- Führe
node -vaus und stelle sicher, dass die Hauptversion >= 18 ist. - Führe
npm -vaus und stelle sicher, dass npm verfügbar ist. - Wenn eine der Bedingungen nicht erfüllt ist, stoppe und fordere den Benutzer auf, Node.js >= 18 zu installieren.
- Führe
-
Überprüfe chrome-devtools-mcp
- Versuche, ein MCP-Browser-Tool aufzurufen (z. B.
mcp__chrome-devtools__list_pagesodermcp__chrome-devtools__navigate_page). - Wenn das MCP nicht verfügbar ist, stoppe und fordere den Benutzer auf, zu bestätigen, dass Claude Code / OpenCode chrome-devtools-mcp aktiviert hat.
- Versuche, ein MCP-Browser-Tool aufzurufen (z. B.
-
Überprüfe den API-Schlüssel für die Zusammenfassung (nur wenn der Benutzer eine Lernzusammenfassung erstellt haben möchte)
- Überprüfe, ob die Umgebungsvariable
MIMO_TP_API_KEYexistiert und mittp-beginnt. - Wenn ja, fahre fort.
- Wenn nein, frage den Benutzer nach dem MiMo API Key (beginnt mit
tp-). - Nachdem der Benutzer den Schlüssel bereitgestellt hat, übergib ihn in allen nachfolgenden Befehlen, die die Zusammenfassung betreffen, über eine Umgebungsvariable, z. B.:
set MIMO_TP_API_KEY=tp-xxxx node .claude/skills/rain-class-reviewer/scripts/bootstrap.js summarize --course-dir rain-class-reviewer-downloads/<Kursname> - Es ist verboten, den Benutzer aufzufordern, den Schlüssel in eine Datei zu schreiben. Es ist auch der Fertigkeit verboten, den Schlüssel auf die Festplatte zu schreiben.
- Überprüfe, ob die Umgebungsvariable
-
Bestätige, dass der Benutzer den Namen des herunterzuladenden/zusammenzufassenden Kurses eindeutig angegeben hat.
Schnellstart
Alle Befehle sollten im Stammverzeichnis des aktuellen Claude Code / OpenCode-Projekts ausgeführt werden, wobei das Skript über einen relativen Pfad zum Fertigkeitsverzeichnis aufgerufen wird. scripts/bootstrap.js behandelt das Projektstammverzeichnis automatisch als Arbeitsverzeichnis, daher:
- Relative Pfade für
--manifest,-o,--course-dir,--lesson-dirusw. werden relativ zum Projektstammverzeichnis aufgelöst – es treten keine Pfadduplikate auf. - Wenn
--outputnicht angegeben ist, wird das Standard-Download-Verzeichnis unterrain-class-reviewer-downloads/im Projektstammverzeichnis erstellt, nicht im Fertigkeitsverzeichnis.
Beim ersten Aufruf verwendet scripts/bootstrap.js bevorzugt die vorgebaute Datei dist/cli.cjs (die bereits openai und andere Abhängigkeiten enthält), sodass keine Online-Installation erforderlich ist. Wenn diese nicht existiert, wird automatisch npm install ausgeführt.
Vollständiger Ablauf
1. Frage den Benutzer nach dem Kursnamen (oder einem Suchbegriff).
2. Öffne mit MCP https://changjiang.yuketang.cn/ und hole das Cookie (bevorzugt aus dem Network-Request-Header).
3. Erstelle ein minimales Manifest JSON und schreibe es in <skill-path>/tmp/manifest.json.
4. Führe node <skill-path>/scripts/bootstrap.js verify-auth --manifest <skill-path>/tmp/manifest.json aus, um den Anmeldestatus zu überprüfen.
5. Führe node <skill-path>/scripts/bootstrap.js list-courses --manifest <skill-path>/tmp/manifest.json --json aus, um die Kursliste zu erhalten.
6. Gleiche den Kurs basierend auf der Benutzereingabe ab; bei Unklarheiten zeige dem Benutzer die Kandidaten an und lasse die classroomId bestätigen.
7. Verwende den ursprünglichen courseName aus der Kursliste, erstelle ein neues Manifest mit der classroomId (überschreibe tmp/manifest.json) und führe node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --json aus, um die Kursfolien herunterzuladen (Standard-Ausgabe in rain-class-reviewer-downloads/).
8. Setze `MIMO_TP_API_KEY` und führe node <skill-path>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<ursprünglicher Kursname>" --force-summary aus, um die Lernzusammenfassung zu erstellen.
Beispiel (Claude Code projektweiter Skill-Pfad: .claude/skills/rain-class-reviewer):
node .claude/skills/rain-class-reviewer/scripts/bootstrap.js \
--manifest .claude/skills/rain-class-reviewer/tmp/manifest.json --json
Standard-Ausführungsablauf
1. Erfrage den gewünschten Kursnamen vom Benutzer
Bestätige den Kursnamen mit dem Benutzer. Erlaube Abkürzungen oder Schlüsselwörter, z. B. "Rechnernetzwerke". Notiere die ursprüngliche Eingabe des Benutzers und führe noch keinen Abgleich durch.
2. Verwende MCP, um das Cookie zu erhalten
Das sessionid von Changjiang Yuketang ist normalerweise ein HttpOnly-Cookie und kann nicht über document.cookie gelesen werden. Du musst es über den Chrome DevTools Network-Request-Header beziehen und streng die unten aufgeführte URL verwenden.
2.1 Öffne die Changjiang Yuketang-Seite
Die URL, zu der navigiert werden muss:
https://changjiang.yuketang.cn/
Schritte:
- Verbinde mit dem Browser.
- Navigiere mit
mcp__chrome-devtools__navigate_pagezu:https://changjiang.yuketang.cn/ - Wenn die Seite bereits geladen ist, verwende
type=reload, um dieselbe URL neu zu laden und eine neue Netzwerkanfrage zu erzeugen:mcp__chrome-devtools__navigate_page: type=reload, url=https://changjiang.yuketang.cn/
2.2 Löse eine Netzwerkanfrage mit Cookie aus
Nach dem Neuladen der Seite erzeugt der Browser normalerweise automatisch mehrere Anfragen mit Cookies. Wenn nicht genügend Anfragen erscheinen, musst du die folgende URL aktiv auslösen:
Bevorzugte Trigger-URL (diese URL ist identisch mit der Kurslistenschnittstelle, die das Skript später für verify-auth / list-courses verwendet – sicher und wiederverwendbar):
GET https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2
Auslösemethode (wähle eine, nur um Anfrage-Traffic zu erzeugen, es ist verboten, geschäftliche Antwortdaten zu lesen):
- Methode A: Führe ein Seiten-Refresh durch (siehe 2.1).
- Methode B: Führe über
evaluate_scriptaus:fetch('https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2', { credentials: 'include' });
Ersatz-Trigger-URL (wenn die bevorzugte Anfrage nicht erscheint, ist jede Anfrage an changjiang.yuketang.cn akzeptabel):
https://changjiang.yuketang.cn/ (Seitendokument)
https://changjiang.yuketang.cn/v2/web/index (Startseiten-Eingang)
https://changjiang.yuketang.cn/* (Statische Ressourcen unter derselben Domain, wie JS/CSS)
Es ist verboten, andere Yuketang-Subdomains oder Drittanbieter-Schnittstellen zu verwenden, um Cookies zu ermitteln.
2.3 Lies das Cookie aus dem Network-Request-Header
- Rufe
list_network_requestsauf, um die letzten Anfragen anzuzeigen. - Wähle in der Anfrageliste eine Anfrage nach folgender Priorität aus:
- Bevorzugt:
https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2 - Zweitwahl:
https://changjiang.yuketang.cn/oderhttps://changjiang.yuketang.cn/v2/web/index - Akzeptabel: Jede
https://changjiang.yuketang.cn/*Anfrage
- Bevorzugt:
- Verwende
get_network_request, um die Request Headers dieser Anfrage zu lesen. - Finde im Request-Header das Feld
cookieoderCookieund parst die folgenden Felder:sessionid(erforderlich)csrftoken(empfohlen für CSRF-Validierung)uv_id(extrahiere den tatsächlichen Wert, kann0oder ein anderer Wert sein)university_id(extrahiere den tatsächlichen Wert, kann mituv_ididentisch oder unterschiedlich sein)xtbz(normalerweiseykt)django_language(optional)
Beispiel-Cookie-Header:
sessionid=abc123; csrftoken=xyz789; uv_id=0; university_id=0; xtbz=ykt
Hartcodiere
uv_id=2874oderuniversity_id=2874nicht; der tatsächliche Wert muss aus dem Request-Header gelesen werden. Fehlende Werte oder0sind zulässig.
2.4 Behandlung des nicht angemeldeten Zustands
- Wenn der Request-Header kein
sessionidenthält oder die Anfrage auf die Anmeldeseite umgeleitet wurde, ist der Benutzer nicht angemeldet. - Fordere den Benutzer auf, sich manuell bei Changjiang Yuketang anzumelden.
- Warte auf die Antwort des Benutzers "Angemeldet".
- Lade die Seite neu oder löse erneut
https://changjiang.yuketang.cn/v2/api/web/courses/list?identity=2aus und lies das Cookie erneut.
2.5 Rückfallplan
Wenn das MCP das Cookie aus dem Request-Header nicht bereitstellen kann:
- Versuche,
document.cookiezu lesen, um nicht-HttpOnly-Cookies zu erhalten (normalerweise mindestenscsrftoken). - Wenn
sessionidimmer noch nicht abgerufen werden kann, bitte den Benutzer,sessionidmanuell bereitzustellen, oder überprüfe, ob das MCP das Abrufen von HttpOnly-Cookies unterstützt. - Unabhängig vom Erfolg des Rückfallplans muss das
sessionidletztendlich über den Network-Request-Header bezogen werden.
3. Erstelle das minimale Manifest
{
"version": "1.0",
"courseName": "Rechnernetzwerke"
}
courseName verwendet die ursprüngliche Eingabe des Benutzers. Dieses Manifest dient nur der Validierung und dem Abruf der Kursliste; es garantiert keine endgültige Übereinstimmung. Nachdem dieses Manifest erstellt wurde, stoppe sofort das MCP.
Das Cookie wird über die Umgebungsvariable RAIN_COOKIES übergeben (gilt für alle folgenden Schritte):
set RAIN_COOKIES={"sessionid":"...","csrftoken":"...","uv_id":"0","university_id":"0","xtbz":"ykt"}
4. Überprüfe den Anmeldestatus
set RAIN_COOKIES={...}
node <skill-path>/scripts/bootstrap.js verify-auth --manifest <skill-path>/tmp/manifest.json
- Erfolg: Fahre mit dem nächsten Schritt fort.
- Fehler: Kehre zu Schritt 2 zurück und hole das Cookie erneut.
5. Rufe die Kursliste ab
set RAIN_COOKIES={...}
node <skill-path>/scripts/bootstrap.js list-courses --manifest <skill-path>/tmp/manifest.json --json
Gibt classroomId, courseName, className und teacher für alle Kurse des aktuellen Kontos zurück.
6. Gleiche den Kurs ab und behandle Unklarheiten
Vergleiche die ursprüngliche Benutzereingabe mit der Kursliste:
- Eindeutig exakte Übereinstimmung: Verwende direkt diese
classroomId. - Keine Übereinstimmung: Zeige dem Benutzer alle verfügbaren Kurse an und fordere ihn auf, den Kursnamen oder die
classroomIdanzugeben. - Mehrere Übereinstimmungen: Zeige dem Benutzer die Kandidatenkurse an (mit Klasse, Lehrer, classroomId) und fordere ihn auf, zu bestätigen.
Es ist verboten, eigenmächtig eine Auswahl zu treffen. Nach der Bestätigung erstelle ein neues Manifest mit dem ursprünglichen courseName aus der Kursliste und überschreibe tmp/manifest.json:
{
"version": "1.0",
"courseName": "Rechnernetzwerke",
"classroomId": "13522533"
}
7. Lade die Kursfolien herunter
set RAIN_COOKIES={...}
node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --json
8. Extrahiere Markdown-Notizen und erstelle die Lernzusammenfassung
set MIMO_TP_API_KEY=tp-xxxx
node <skill-path>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Kursname>" --force-summary
Ausgabe:
- Markdown-Notizen pro Seite:
rain-class-reviewer-downloads/<Kursname>/extracted/<Stunde>/<Seitennummer>.md - Gesamte Lernzusammenfassung:
rain-class-reviewer-downloads/<Kursname>/review.md
Herunterladen nach Stunde filtern
Nur die neueste Stunde herunterladen:
node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --latest --json
Nach Datumsbereich herunterladen:
node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --since 2023-11-01 --until 2023-11-05 --json
Umgang mit mehrdeutigen Kursnamen
- Wenn mehrere Kurse mit demselben Namen existieren, gibt das Skript einen Fehler aus und listet die Kandidaten-
classroomIdauf. - Es ist verboten, eigenmächtig eine Auswahl zu treffen. Du musst dem Benutzer die Kandidatenkurse anzeigen und seine Bestätigung einholen.
- Nach der Bestätigung gib die
classroomIdexplizit im Manifest an, bevor du das Skript aufrufst.
Behandlung von Authentifizierungsfehlern
Wenn das Skript einen 403 / nicht angemeldet / Authentifizierungsfehler zurückgibt:
- Erkläre, dass die
sessionidabgelaufen oder fehlt. - Wiederhole Schritt 2 (verwende MCP, um zu überprüfen/erneut anzumelden).
- Aktualisiere die Umgebungsvariable
RAIN_COOKIES. - Führe das Skript erneut aus.
Besondere Hinweise für den Claude Code Auto Mode
Die Manifest-Datei dieser Fertigkeit enthält keine Cookies oder andere Anmeldeinformationen mehr; Cookies können nur über die Umgebungsvariable RAIN_COOKIES übergeben werden. Daher schreibt Write(tmp/manifest.json) nur den Kursnamen/die classroomId, was normalerweise die Dateischreibprüfung des Auto Mode besteht.
Wenn der Auto Mode das Schreiben in temporäre Dateien dennoch blockiert, kannst du im aktuellen Projektstammverzeichnis manuell eine .claude/policy.json erstellen:
{
"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."
]
}
}
Alle Befehle sollten die Umgebungsvariable RAIN_COOKIES enthalten:
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 verwenden
export RAIN_COOKIES='...'.
Sicherheit und Datenschutz
- Es ist verboten, das vollständige Cookie im Klartext im Dialog auszugeben.
- Das Manifest wird in
tmp/manifest.jsonim Fertigkeitsverzeichnis geschrieben und überschreibt den vorherigen Inhalt; das Manifest darf kein cookies-Feld enthalten. Das Verzeichnistmp/ist bereits in.gitignoreund wird nicht versioniert. - Cookies dürfen nur über die Umgebungsvariable
RAIN_COOKIESübergeben werden; speicherecookies.jsonnicht separat ab. - Das Download-Verzeichnis
rain-class-reviewer-downloads/und das temporäre Verzeichnistmp/sind bereits in.gitignore.
Bekannte Einschränkungen
- Das Tool verwendet bevorzugt die neue
lesson-summary+presentation-Schnittstelle, um die vollständige PPT zu erhalten; falls nicht verfügbar, wird automatisch auf diereview-Schnittstelle zurückgegriffen, die jedoch nur die im Unterricht gezeigten Folien enthält. - Die Zusammenfassungsfunktion ist auf den MiMo API Key angewiesen, der über die Umgebungsvariable
MIMO_TP_API_KEYübergeben werden muss; das Schreiben in eine Datei ist verboten.
Referenzen
references/yuketang-api.md: Schnittstellenliste und Einschränkungen von Changjiang Yuketang.references/manifest.example.json: Vollständiges Manifest-Beispiel.docs/usage.md: Vollständige CLI-Parameterbeschreibung.docs/implementation.md: Implementierungsdetails.