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-Code | Bedeutung | Aufgaben des Agenten |
|---|---|---|
0 | Angemeldet | „login_tip“ an den Benutzer ausgeben, mit dem Vorgang fortfahren |
2 | Nicht 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 |
1 | Anderer Fehler | JSON 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.
| API | Beschreibung |
|---|---|
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-filebeenden (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
- wujie-Shadow: Abfragen ab
wujie-app.shadowRoot. - Direkter
create-Link führt zu weißem Bildschirm: Immer über den UI-Pfad zur Veröffentlichungsseite gehen. - Klicks auf Referenz/Text in wujie werden abgefangen → evaluate oder Koordinaten-Klick verwenden.
- Lange Texte nur über den Parameter von
evaluateübergeben. - Beschreibung mit
execCommand; Kurztitel mit nativem Setter. - Ort: Zweistufig per Koordinaten und Rücklesen zur Bestätigung.
- Cover nur mit
waitForFileChooser. - Upload-Prüfung nur über DOM; nach dem Upload zuerst Entwurf speichern.
- Vor dem Speichern des Entwurfs nicht von der Seite navigieren.
- „Ladefehler“ auf der Login-Seite ist eine rote Hering; mit
handOffden QR-Code zum Scannen an den Menschen übergeben. - Vor jeder Veröffentlichung
check-loginausführen; bei Exit-Code 2 muss angehalten werden. - Veröffentlichen ist der Endpunkt für den Menschen; dieses Skill erstellt nur Entwürfe.
Test
npm test