Communitygithub.com

terryso/wechat-channels-video

Veröffentliche einen Video-Entwurf für WeChat-Kanäle mit Ego Lite via ego-browser – zuerst Login prüfen (Sitzungen laufen schnell ab), Video hochladen, Beschreibung/Kurztitel/Themen/Ort/Cover ausfüllen, nur Entwurf speichern. Gibt weich einen Fehler aus, wenn die Kanäle abgemeldet sind, und fordert den Benutzer auf, den QR-Code in Ego zu scannen. Persönliche Nutzung. Verwende dies, wenn der Benutzer fragt, etwas auf 视频号 / Channels Assistant zu posten.

Was ist wechat-channels-video?

Dieses Skill ermöglicht es AI-Agenten (wie Claude Code, Cursor, Codex), einen Video-Entwurf für WeChat-Kanäle (视频号) zu erstellen und zu speichern, ohne den Beitrag zu veröffentlichen. Es ist für die persönliche Nutzung gedacht und erfordert das installierte Tool 'Ego Lite' (`ego-browser` im Pfad). Der Agent führt zuerst eine verbindliche Login-Prüfung durch (mit `scripts/check-login.mjs`), da die Anmeldesitzungen bei WeChat-Kanälen schnell ablaufen. Nach erfolgreichem Login startet der Agent über `ego-browser` einen simplen Dateiserver (`serve-file.mjs`), lädt das Video auf die WeChat-Oberfläche hoch (über wujie-shadowDOM), füllt Beschreibung, Kurztitel, Themen und optional Ort und Cover aus und speichert schließlich den Entwurf. Die Veröffentlichung wird bewusst dem Menschen überlassen – das Skill endet mit dem Speichern des Entwurfs. Es behandelt die komplexen Eigenheiten der wujie-basierten WeChat-Oberfläche (z. B. Interaktionen im Shadow-DOM) und gibt klare Anweisungen zum Umgang mit häufigen Fehlern wie abgelaufenen Sitzungen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/terryso/ego-skills/tree/main/skills/wechat-channels-video

In Ihrer bevorzugten KI fragen

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

Dokumentation

Was macht wechat-channels-video?

Mit einer Ego-Lite-Sitzung auf dem Video-Helfer für Kanäle einen Video-Entwurf speichern. Nicht auf „Veröffentlichen“ klicken – das bleibt dem Menschen mit QR-Code vorbehalten.

Save a WeChat Channels draft through Ego Lite. Never click Publish — QR publish is human-only.

Zuerst Ego installieren

Zuerst Ego Lite installieren und sicherstellen, dass ego-browser im PATH ist. Fehlt es: weich fehlschlagen / den Benutzer informieren, es zu installieren – niemals den Browser ohne Weiteres aufrufen.

Vor jeder Veröffentlichung: Login-Prüfung (Pflicht)

Die Anmeldung bei den Kanälen läuft sehr schnell ab. Der Agent muss vor dem Hochladen oder Ausfüllen des Formulars ausführen:

node scripts/check-login.mjs
# Wenn das Fenster zum Scannen für den Menschen offen bleiben soll:
node scripts/check-login.mjs --keep
Exit-CodeBedeutungAufgaben des Agenten
0Angemeldet„login_tip“ an den Benutzer ausgeben, mit dem Vorgang fortfahren
2Nicht angemeldet / ego-browser nicht vorhanden„how_to_login“ / „how_to_login_zh“ anzeigen, anhalten. Der Benutzer soll den QR-Code in Ego scannen und dann check-login erneut ausführen
1Anderer FehlerJSON error melden, nicht so tun, als wäre veröffentlicht

Details in references/login.md. Kein separates Cookie-Healthcheck-Skill erstellen.

Eingaben (allgemein, keine lokalen Produktpfade)

Der Aufrufer stellt Videopfad und Textfelder bereit (siehe references/inputs.md). Dieses Skill hardcodiert keine Geschäftsverzeichnisse wie ~/….

Minimum erforderlich: Lokaler video-Pfad, description, short_title. Optional: tags, cover, Ort/Originalität/Aktivität.

Schmale CLI-Skripte (stabiler Teil)

ego-browser nodejs leitet keine Shell-Argv weiter; check-login wird bereits mit temporärem Entry + ego-browser nodejs -e verpackt.

# Im Repository-Stammverzeichnis
node skills/wechat-channels-video/scripts/check-login.mjs
node skills/wechat-channels-video/scripts/check-login.mjs --keep
node skills/wechat-channels-video/scripts/serve-file.mjs --file /absoluter/pfad/zu/video.mp4 --port 18765

# Im installierten Skill-Verzeichnis auch mit relativem Pfad möglich
node scripts/check-login.mjs
node scripts/serve-file.mjs --file /absoluter/pfad/zu/video.mp4 --port 18765
  • check-login: Einzige zwingende Login-Prüfung; endet standardmäßig mit finish({ keep: [] }) (außer bei --keep).
  • serve-file: Lokaler CORS-Dateiserver für fetch-Aufrufe der Seite; gibt { url, bytes, port } aus, beendet mit SIGINT. Große Videos nicht base64-codieren.

Nicht die gesamte Veröffentlichungs-UI in ein riesiges Skript packen: wujie, Koordinaten-Klicks, Cover-waitForFileChooser benötigen Agent-Snapshots/Screenshots. Die Skripte kümmern sich um die entscheidbare Login-Prüfung und Dateiübertragung; das Formular wird von den folgenden Agent-Schritten bearbeitet.

ego-browser API-Kurzreferenz

Jeder Aufruf von ego-browser nodejs ist ein neuer Prozess; TaskSpace/Page bleiben über Aufrufe hinweg bestehen, JS-Variablen nicht.

APIBeschreibung
taskSpace(name|id)Ein Benutzerziel – ein Space; spaceId merken und wiederverwenden
task.page("p1")Erste Seite mit goto wiederverwenden, keine neuen Seiten wahllos öffnen
page.snapshot()Beobachten (durchschaut offene Shadow-DOMs); Klicks werden in wujie oft abgefangen
page.evaluate(fn, arg)Nimmt nur einen JSON-serialisierbaren Parameter (lange Texte hierüber)
page.mouse.click(x, y)Wird in wujie-Overlays häufig verwendet
page.waitForFileChooser()Einziger zuverlässiger Weg zum Cover-Upload
task.handOff()An Menschen übergeben: QR-Code zum Veröffentlichen / Anmelden
task.finish({ keep: [] })Abschließen, Space schließen; wenn der Mensch weitermachen soll, handOff verwenden, nicht dauerhaft Space belegen

Wichtig: Snapshot sieht wujie-Shadow-DOM; Klicks auf Referenz-Text melden „intercepts pointer events“. Aktionen innerhalb von wujie mit .click() in evaluate oder Koordinaten-mouse.click ausführen.

Agent-Ablauf (nach erfolgreichem Login)

0. Zur Veröffentlichungsseite navigieren

Nicht direkt goto /platform/post/create (führt zu weißem Bildschirm durch Lazy Loading). Stattdessen den UI-Pfad gehen:

Startseite → linke Spalte „Inhaltsverwaltung“ → „Video“ → rechte Seite „Video veröffentlichen“

Bereitschaft prüfen: Im wujie erscheinen die Texte „Videobeschreibung“, „Kurztitel“, ein verstecktes input[type=file][accept*="video"] und ein Button „Entwurf speichern“.

const state = await page.evaluate(() => {
  const app = document.querySelector('wujie-app');
  if (!app?.shadowRoot) return { wujie: false };
  const t = app.shadowRoot.textContent || '';
  return {
    wujie: true,
    hasDesc: t.includes('视频描述'),
    hasShort: t.includes('短标题'),
    hasUpload: !!app.shadowRoot.querySelector('input[type=file][accept*="video"]'),
    hasSave: t.includes('保存草稿'),
  };
});

1. Video hochladen

Zuerst serve-file starten (Standard-Port 18765), dann auf der Seite per fetch + DataTransfer in das versteckte File-Input injizieren (die Videokomponente prüft nicht auf isTrusted; das Cover tut es):

const r = await page.evaluate(async (p) => {
  const root = document.querySelector('wujie-app').shadowRoot;
  const input = root.querySelector('input[type=file][accept*="video"]');
  const resp = await fetch(p.url);
  const dt = new DataTransfer();
  dt.items.add(new File([await resp.blob()], p.name, { type: 'video/mp4' }));
  input.files = dt.files;
  input.dispatchEvent(new Event('input', { bubbles: true }));
  input.dispatchEvent(new Event('change', { bubbles: true }));
  return 'injected ' + dt.files[0].size;
}, { url: 'http://127.0.0.1:18765/video.mp4', name: 'video.mp4' });

Zur Überprüfung nur das DOM beobachten: Es erscheint eine Vorschau-Karte mit „Teilen/Gefällt mir/Kommentieren“ und der Fortschritt zeigt stabil 100%. Das performance-Resource erfasst keinen Upload-POST. Während des Uploads kein Formular ausfüllen; wenn wujie kurzzeitig null ist, kurz warten und erneut prüfen – nicht aktualisieren.

1.5 Kontrollpunkt: Zuerst Entwurf speichern

Nach dem Upload sofort einmal auf „Entwurf speichern“ klicken, dann Beschreibung/Kurztitel/Ort ausfüllen, und zum Schluss erneut speichern. So wird vermieden, dass bei einem Fehler die große Datei erneut hochgeladen werden muss.

2. Beschreibung + Themen

Die Beschreibung ist ein .input-editor (nicht contenteditable). Es wird execCommand verwendet; der Text wird als zweites Evaluate-Argument übergeben:

await page.evaluate((p) => {
  const ed = document.querySelector('wujie-app').shadowRoot.querySelector('.input-editor');
  ed.focus();
  document.execCommand('selectAll', false, null);
  document.execCommand('delete', false, null);
  document.execCommand('insertText', false, p.desc);
}, { desc });
await page.evaluate((p) => {
  const ed = document.querySelector('wujie-app').shadowRoot.querySelector('.input-editor');
  ed.focus();
  document.execCommand('insertParagraph');
  document.execCommand('insertText', false, p.tags);
  ed.blur();
}, { tags });

3. Kurztitel

Ein echtes <input>, das einen nativen Setter erfordert; zur Überprüfung input.value lesen (innerText enthält keine Input-Werte).

4. Ort

Standardmäßig ist oft die Stadt eingetragen. Sicherer Weg: Mit mouse.click öffnen → Snapshot/Screenshot → auf „Keinen Ort anzeigen“ klicken → Feld zurücklesen zur Bestätigung. Evaluate-Koordinaten könnten auf eine versteckte Ebene treffen.

5. Entwurf speichern (Endpunkt)

Klick auf „Entwurf speichern“. Erfolgssignal: „Gespeichert“ + der untere Button wird grau. Anschließend zur Entwurfsübersicht navigieren und prüfen. Vor dem Sichtbarwerden des Entwurfs den Editor nicht verlassen.

Optional: Originalität deklarieren, Aktivität suchen (nativer Setter für den Suchbegriff; falls nichts gefunden wird, „Nicht an Aktivität teilnehmen“).

6. Cover (optional)

Einziger zuverlässiger Weg: waitForFileChooser() + vertrauenswürdiger Klick auf „Cover hochladen“ + chooser.setFiles(<absoluter Pfad>). Das Injizieren von input.files / OS-Dateiauswahl wurde bereits als nicht funktionierend getestet. Nachdem der Bestätigungs-Button nicht mehr lädt und die Vorschau nicht mehr zum Standard-Frame zurückfällt, Entwurf speichern.

7. Abschluss

  • serve-file beenden (Port freigeben).
  • Wenn der Mensch veröffentlichen soll: In der Entwurfsübersicht handOff() aufrufen.
  • Sonst finish({ keep: [] }) ausführen, nicht dauerhaft den Space belegen.

Fallstrick-Liste

  1. wujie-Shadow: Abfragen ab wujie-app.shadowRoot.
  2. Direkter create-Link führt zu weißem Bildschirm: Immer über den UI-Pfad zur Veröffentlichungsseite gehen.
  3. Klicks auf Referenz/Text in wujie werden abgefangen → evaluate oder Koordinaten-Klick verwenden.
  4. Lange Texte nur über den Parameter von evaluate übergeben.
  5. Beschreibung mit execCommand; Kurztitel mit nativem Setter.
  6. Ort: Zweistufig per Koordinaten und Rücklesen zur Bestätigung.
  7. Cover nur mit waitForFileChooser.
  8. Upload-Prüfung nur über DOM; nach dem Upload zuerst Entwurf speichern.
  9. Vor dem Speichern des Entwurfs nicht von der Seite navigieren.
  10. „Ladefehler“ auf der Login-Seite ist eine rote Hering; mit handOff den QR-Code zum Scannen an den Menschen übergeben.
  11. Vor jeder Veröffentlichung check-login ausführen; bei Exit-Code 2 muss angehalten werden.
  12. Veröffentlichen ist der Endpunkt für den Menschen; dieses Skill erstellt nur Entwürfe.

Test

npm test

Verwandte Skills