CommunityRecherche & Datenanalysegithub.com

DonAzufre/rain-class-reviewer

Lade Kursfolien von Changjiang Yuketang herunter und erstelle strukturierte Lernmaterialien als CLI und installierbare Agenten-Fertigkeit.

Was ist rain-class-reviewer?

Diese Fertigkeit ermöglicht es KI-Agenten (wie Claude Code, Cursor oder Codex), Kursfolien von der chinesischen Lernplattform Changjiang Yuketang (长江雨课堂) automatisiert herunterzuladen und daraus strukturierte Zusammenfassungen zu generieren. Sie trennt strikt die Aufgaben des Browser-MCPs (nur für Authentifizierung und Cookie-Extraktion) von denen lokaler Skripte (für Datenerfassung und -verarbeitung). Zuerst wird über das Chrome DevTools MCP die Sitzung im Browser validiert und das `sessionid`-Cookie aus den Netzwerkanfrage-Headern gelesen. Danach übernimmt ein lokales Node.js-Skript (`scripts/bootstrap.js`) die Kurserkennung, den Folien-Download, die Textextraktion und die Erstellung einer umfassenden Lernzusammenfassung (`review.md`). Die Fertigkeit unterstützt Filterung nach Datum, Unterrichtsstunde und die Zusammenfassung mittels einer externen KI-API (MiMo). Sie wurde für den Einsatz in Claude Code Auto Mode optimiert, wo sensible Daten wie Cookies ausschließlich über Umgebungsvariablen übergeben werden, um Sicherheitsrichtlinien einzuhalten.

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

Installed? Explore more Recherche & Datenanalyse skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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)

  1. Öffne https://changjiang.yuketang.cn/ und überprüfe den Anmeldestatus.
  2. Falls der Benutzer nicht angemeldet ist, fordere ihn zur Anmeldung auf und warte auf seine Bestätigung.
  3. 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.cookie zurück.
  4. 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"}
  1. node <skill-path>/scripts/bootstrap.js verify-auth --manifest <skill-path>/tmp/manifest.json Überprüfe den Anmeldestatus.
  2. node <skill-path>/scripts/bootstrap.js list-courses --manifest <skill-path>/tmp/manifest.json --json Rufe die Kursliste ab.
  3. node <skill-path>/scripts/bootstrap.js --manifest <skill-path>/tmp/manifest.json --json Lade die Kursfolien herunter (Standard-Ausgabe in rain-class-reviewer-downloads/ im Projektstammverzeichnis).
  4. node <skill-path>/scripts/bootstrap.js summarize --course-dir "rain-class-reviewer-downloads/<Kursname>" --force-summary Extrahiere 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.json im Fertigkeitsverzeichnis (überschreibend) und referenziere es im Befehl über den Pfad. Das Cookie wird über die Umgebungsvariable RAIN_COOKIES übergeben. Das Verzeichnis tmp/ ist bereits in .gitignore und 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:

  1. Überprüfe Node.js und npm

    • Führe node -v aus und stelle sicher, dass die Hauptversion >= 18 ist.
    • Führe npm -v aus 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.
  2. Überprüfe chrome-devtools-mcp

    • Versuche, ein MCP-Browser-Tool aufzurufen (z. B. mcp__chrome-devtools__list_pages oder mcp__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.
  3. Ü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_KEY existiert und mit tp- 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.
  4. 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-dir usw. werden relativ zum Projektstammverzeichnis aufgelöst – es treten keine Pfadduplikate auf.
  • Wenn --output nicht angegeben ist, wird das Standard-Download-Verzeichnis unter rain-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:

  1. Verbinde mit dem Browser.
  2. Navigiere mit mcp__chrome-devtools__navigate_page zu:
    https://changjiang.yuketang.cn/
    
  3. 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_script aus:
    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

  1. Rufe list_network_requests auf, um die letzten Anfragen anzuzeigen.
  2. 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/ oder https://changjiang.yuketang.cn/v2/web/index
    • Akzeptabel: Jede https://changjiang.yuketang.cn/* Anfrage
  3. Verwende get_network_request, um die Request Headers dieser Anfrage zu lesen.
  4. Finde im Request-Header das Feld cookie oder Cookie und parst die folgenden Felder:
    • sessionid (erforderlich)
    • csrftoken (empfohlen für CSRF-Validierung)
    • uv_id (extrahiere den tatsächlichen Wert, kann 0 oder ein anderer Wert sein)
    • university_id (extrahiere den tatsächlichen Wert, kann mit uv_id identisch oder unterschiedlich sein)
    • xtbz (normalerweise ykt)
    • django_language (optional)

Beispiel-Cookie-Header:

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

Hartcodiere uv_id=2874 oder university_id=2874 nicht; der tatsächliche Wert muss aus dem Request-Header gelesen werden. Fehlende Werte oder 0 sind zulässig.

2.4 Behandlung des nicht angemeldeten Zustands

  • Wenn der Request-Header kein sessionid enthä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=2 aus und lies das Cookie erneut.

2.5 Rückfallplan

Wenn das MCP das Cookie aus dem Request-Header nicht bereitstellen kann:

  1. Versuche, document.cookie zu lesen, um nicht-HttpOnly-Cookies zu erhalten (normalerweise mindestens csrftoken).
  2. Wenn sessionid immer noch nicht abgerufen werden kann, bitte den Benutzer, sessionid manuell bereitzustellen, oder überprüfe, ob das MCP das Abrufen von HttpOnly-Cookies unterstützt.
  3. Unabhängig vom Erfolg des Rückfallplans muss das sessionid letztendlich ü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 classroomId anzugeben.
  • 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-classroomId auf.
  • 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 classroomId explizit im Manifest an, bevor du das Skript aufrufst.

Behandlung von Authentifizierungsfehlern

Wenn das Skript einen 403 / nicht angemeldet / Authentifizierungsfehler zurückgibt:

  1. Erkläre, dass die sessionid abgelaufen oder fehlt.
  2. Wiederhole Schritt 2 (verwende MCP, um zu überprüfen/erneut anzumelden).
  3. Aktualisiere die Umgebungsvariable RAIN_COOKIES.
  4. 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.json im Fertigkeitsverzeichnis geschrieben und überschreibt den vorherigen Inhalt; das Manifest darf kein cookies-Feld enthalten. Das Verzeichnis tmp/ ist bereits in .gitignore und wird nicht versioniert.
  • Cookies dürfen nur über die Umgebungsvariable RAIN_COOKIES übergeben werden; speichere cookies.json nicht separat ab.
  • Das Download-Verzeichnis rain-class-reviewer-downloads/ und das temporäre Verzeichnis tmp/ 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 die review-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.

Verwandte Skills