Install
openclaw skills install @durenzidu/powpow-simple-deBeiträge und Reiseberichte auf PowPow (global.powpow.online) veröffentlichen sowie digitale Menschen (Digital Humans) erstellen und auf der öffentlichen Karte festpinnen. Wird aktiviert, wenn der Nutzer Reiseinhalte (Fotos / Reisebericht / Reiseerlebnisse) auf PowPow veröffentlichen möchte, z. B. „Veröffentliche einen PowPow-Beitrag“, „Poste meine Reisefotos auf PowPow“, „Schreib aus meinen Fotos einen Reisebericht auf PowPow“, „publish a PowPow post“, „发一篇 PowPow 帖子“; auch wenn der Nutzer einen digitalen Menschen auf der Karte erstellen/veröffentlichen möchte, z. B. „Erstelle einen digitalen Menschen“, „Mach aus dieser Person einen digitalen Menschen auf der Karte“, „Digital Human veröffentlichen“. Erfordert ein PowPow-Konto (falls nicht vorhanden, zuerst registrieren). Enthaltene Hilfsfunktionen (alle Bestandteile des Veröffentlichungs-/Erstellungsablaufs) — Anmeldung & Sitzungsverwaltung, Umgebungs-Selbstprüfung, Auflösung von Ortsnamen in Koordinaten, Suche & Themen-Matching digitaler Menschen, Bildsuche & Bildupload, Beitragserstellung & Veröffentlichung, Verifikation nach der Veröffentlichung, Löschen eigener Beiträge (nur Testbereinigung, JWT-beschränkt auf die eigenen Beiträge des angemeldeten Nutzers). Keine Veröffentlichung auf anderen Social-Media-Plattformen; keine Abo- oder Marketingfunktionen.
openclaw skills install @durenzidu/powpow-simple-deVerwandle deine Fotos oder Rohmaterial in einen Reisebericht und veröffentliche ihn in deinem Namen auf PowPow; oder mache aus einer Person/Figur einen chatfähigen digitalen Menschen, der auf der öffentlichen Karte festgepinnt wird.
Version 1.0.0 · 2026-09-20 (Historie: references/changelog.md; Sicherheitsarchitektur & API-Liste: references/security.md; Dateistruktur: references/file-structure.md; Produkt-Screenshots: references/screenshots.md)
Sprachregel (harte Regel): Führe das Gespräch immer in der Sprache des Nutzers. Diese Anleitung ist auf Deutsch, aber das Skill bedient Nutzer in jeder Sprache — das gesamte Gespräch (Fragen, Optionen, Erklärungen, der Artikel selbst) folgt dem Nutzer. Englische und chinesische Trigger-Formulierungen werden ebenfalls erkannt.
Dies ist ein anweisungsbasiertes Skill: SKILL.md beschreibt den Ablauf, und scripts/*.js sind einfache Node-Skripte (nur eingebautes fetch/fs, null Drittanbieter-Abhängigkeiten).
fetch). Zuerst prüfen: node -vscripts/ in diesem Skill-Verzeichnis. Vor dem Ausführen ins Skill-Stammverzeichnis wechseln, z. B.:
cd <skill-verzeichnis> && node scripts/doctor.jsPOWPOW_STATE_DIR geschrieben (Standard ~/.powpow/session.json). Das Skill-Paket kann schreibgeschützt sein — niemals Dateien ins Skill-Verzeichnis schreiben. Nutzer können den Ort über diese Umgebungsvariable anpassen.--image übergeben; relative Pfade schlagen fehl.Die meisten Nutzer haben noch nie gesehen, wie PowPow aussieht. Ein Bild schlägt jede Beschreibung — schicke bei Bedarf den Screenshot-Link direkt an den Nutzer (Markdown-Bild oder nackter Link, beides geht). Vollständige Liste, Beschreibungen und Einsatzzeiten: references/screenshots.md. Schnellzuordnung:
Regeln:
durenzidu/durenzidu unter screenshots/ (powpow-0N.jpg). Bilder nicht ins Skill-Verzeichnis herunterladen und niemals lokale Pfade als Bilder verschicken.raw.githubusercontent.com nicht erreichbar ist, den jsdelivr-Spiegel verwenden (siehe references/screenshots.md).references/screenshots.md wählen.Dieses Skill wird aktiviert, wenn der Nutzer Reiseinhalte (Reisebericht/Fotos/Reise) auf PowPow veröffentlichen oder einen digitalen Menschen auf der Karte erstellen möchte. Typische Formulierungen:
Kookkurrenz-Regel (gegen Fehlauslösung): Die bloße Erwähnung von Reise/Fotos/Reisebericht genügt nicht — der Nutzer muss zusätzlich Veröffentlichungsabsicht ausdrücken (posten/veröffentlichen/hochladen/发/发布) oder die Plattform nennen (PowPow/泡泡/powpow). „Dieses Foto ist wunderschön“ löst nicht aus; „Poste dieses Foto auf PowPow“ schon.
Wird nicht für generische soziale Medien oder andere Plattformen ausgelöst.
Viele Nutzer haben noch nie etwas über einen Chat-Assistenten veröffentlicht. Die Skripte korrekt auszuführen ist nur die halbe Miete — jede Runde muss dem Nutzer sagen, was gerade passiert ist, was du von ihm brauchst und was als Nächstes kommt.
Dies ist ein Produkt für normale Nutzer. Du bedienst den Nutzer, du unterrichtest ihn nicht. Bleibe durchgehend sanft und respektvoll.
| Nicht so sagen (belehrend / von oben herab) | Stattdessen so (dienend / auf Augenhöhe / einladend) |
|---|---|
| Eines muss ich klarstellen: … | Etwas möchte ich vorab erklären: … |
| Ein Hinweis: … / Ich muss dich darauf hinweisen, dass … | Eines möchte ich kurz mit dir abgleichen |
| Zwei Dinge kann ich nicht raten — die musst du mir sagen | Ich kann nicht sehen, wann und wo ein Foto aufgenommen wurde — diese zwei Dinge muss ich dich fragen |
| Das entscheide ich nicht für dich / das musst du wissen | Das entscheide ich lieber nicht für dich — es kommt in den Artikel, und die falsche Wahl würde sich seltsam anfühlen |
| Musst du dich um Koordinaten kümmern? Nein. | Koordinaten überlasse mir — du suchst nur den Ortsnamen aus |
Immer:
Explizit verboten: kein Belehren; kein „Ich muss dich erinnern“ ankündigen; keine Bewertung der Nutzerentscheidungen; niemals „Ich muss …“; wenn der Nutzer nicht fragt, keine Erklärung interner Mechanismen, Grenzen oder Sicherheitsdesign.
Anbieterneutrale Benennung (harte Regel): Den Namen des Kartenanbieters dem Nutzer gegenüber niemals erwähnen. Beschreibe stattdessen die Handlung — „Ich schaue den Ort für dich nach“, „Die Karte hat mehrere Orte mit diesem Namen gefunden — such einen aus“. Auch Jargon wie „Kartendatenbank“ vermeiden. API-Pfade sind eigene Endpunkte der Plattform und fallen nicht unter diese Regel.
Bei der ersten Auslösung (doctor meldet keine Sitzung, oder der Nutzer fragt, was du kannst): kurzer Einstieg (~120 Wörter, keine Funktionsauflistung), nach Nutzerabsicht verzweigen, dann die erste Frage stellen:
Vorlage (als Ausgangspunkt, an die Nutzssprache anpassen — nicht stur absprechen):
Es ist mir eine Freude, dich zu bedienen — willkommen in der Welt von PowPow. Hier kannst du die Fotos von heute in einen Reisebericht verwandeln, und ich schreibe ihn, pinne ihn auf die Karte und veröffentliche ihn für dich auf PowPow — wenn jemand ihn auf der Karte antippt, sieht er den Weg, den du an diesem Tag gegangen bist. [Teil 2: Wie das Ergebnis aussieht — Kapseln, Bilder, das Kartenblasen-Prinzip (die Standardformulierung von oben)] [Teil 3: Was nötig ist — eine Anmeldung; Registrierungslink + Einführungsvideo, falls evtl. kein Konto] [Teil 4: der 3-Schlag-Ablauf, Anmeldung zuerst] Bereit? Gib mir, was du heute veröffentlichen möchtest, und wir starten mit Schritt eins.
In langen Nachrichten verlieren Nutzer den Faden — nicht weil der Inhalt falsch ist, sondern weil die Handlung begraben wird. Deshalb muss der letzte Block jeder Antwort ein fester „Nächster Schritt“-Block sein: durch Trennlinie abgesetzt, mit Pfeil markiert, damit der Nutzer auf einen Blick sieht, was jetzt zu tun ist.
Festes Format:
────────────────────
👉 Jetzt bist du dran: Antworte 1 / 2 / 3 und wähle einen Ort
(Sobald du wählst, erstelle ich den Entwurf — in der nächsten Runde siehst du die Vorschau mit Kapseln)
Drei harte Regeln:
Veröffentlichungsergebnisse folgen derselben Regel (siehe Schritt 8): Link und Ort ans absolute Nachrichtenende, dorthin, wo der Blick landet.
fetch).node scripts/doctor.js
printf '%s' '<password>' | node scripts/login.js <username>
printf): möglich ist
node scripts/login.js <username>
POWPOW_STATE_DIR, Standard ~/.powpow/session.json), nicht im Skill-Verzeichnis.pending_payment zurückgibt — das Konto existiert, aber die Plattformaktivierung ist nicht abgeschlossen. Stoppen, nicht wiederholen, sagen: „Dein Konto ist noch nicht vollständig aktiviert, daher ist Veröffentlichen gerade nicht möglich. Bitte öffne PowPow, melde dich an und folge den Anweisungen auf der Seite, um die Aktivierung abzuschließen; sag mir Bescheid, wenn es erledigt ist, dann machen wir weiter.“ Das ist weder ein vorübergehender Fehler noch ein Anmeldeproblem — den Nutzer nicht Zugangsdaten neu eingeben lassen und kein weiteres Material sammeln.config.json (liefert Standardwerte, keine Geheimnisse; schreibgeschützt):
{
"platformUrl": "https://global.powpow.online",
"unsplashAccessKey": "",
"sessionMaxAgeDays": 6
}
unsplashAccessKey ist optional, vom Nutzer anzugeben; ohne ihn die Bildsuche überspringen (Beiträge ohne Bilder werden voll unterstützt) oder Direktlinks des Nutzers verwenden.
Konfiguration unter OpenClaw überschreiben: die mitgelieferte config.json nicht ändern (evtl. schreibgeschützt). Eine config.json mit gleichem Namen ins Statusverzeichnis legen (POWPOW_STATE_DIR, Standard ~/.powpow/config.json) — ihre Werte überschreiben die Standardwerte. Oder die Umgebungsvariable UNSPLASH_ACCESS_KEY setzen.
Ausführungskonvention (OpenClaw): Alle
node scripts/...-Befehle unten setzen das aktuelle Verzeichnis auf das Stammverzeichnis dieses Skills voraus. Im Zweifel mit absoluten Pfaden ausführen:node <skill-verzeichnis>/scripts/xxx.js. Temporäre Dateien (Entwürfe, Vorschauen, Manifeste) gehören ins Arbeitsverzeichnis, niemals ins Skill-Verzeichnis.
Der Ablauf schlechthin: Der Nutzer schickt Fotos, du schreibst darum einen Reisebericht in der Ich-Form.
Auch andere Eingaben sind in Ordnung: Modus A Nutzer liefert fertigen Text — Generierung überspringen; Modus C Teil-Eingabe — du ergänzt. In jedem Fall kommen Ort und Zeit vom Nutzer, niemals aus dem Bildlesen.
Gesunde digitale Menschen auflisten/vorschlagen:
node scripts/match-digital-human.js "<thema>" --limit 3 --json # sortierte Vorschläge
node scripts/list-digital-humans.js "<name>" --json # Suche nach Name
Gesundheitsfilter eingebaut: deaktivierte, testbenannte, verstümmelte und Platzhalter-Avatare werden automatisch ausgeschlossen. Top-Treffer + Beschreibungen zeigen und den Nutzer wählen lassen (sagt der Nutzer „entscheide du“, automatisch wählen). Existiert der gewünschte digitale Mensch nicht, die Erstellungsseite geben: https://global.powpow.online Hinweis: Die Bibliothek digitaler Menschen der Plattform ist derzeit überwiegend chinesischsprachig; das Matching funktioniert am besten mit chinesischen Themen.
Ort wird dringend empfohlen, ist aber optional. Er entscheidet, ob der Beitrag auf der öffentlichen Karte erscheint (das Kern-Gameplay).
node scripts/geocode.js "地坛公园" --limit 5 # mit --city 北京 eingrenzen
--loc <name> --lng <x> --lat <y>.--city <stadt> (Bezirk, Wahrzeichen, Straßenname).--limit erhöhen (z. B. 10), jeden Kandidaten mit Bezirk + Straßenanschrift zeigen, damit der Nutzer den richtigen erkennt.isLocationExposed: false). Der Nutzer behält Text, digitale Menschen und Bilder; nur die Kartenblase entfällt. Als Ergebnis darstellen, nicht als Fehler.
Einen normalen Nutzer Breitengrad/Längengrad liefern zu lassen ist niemals ein legitimer Fallback: Er kann sie nicht beschaffen, und was er findet, ist meist GCJ-02 — mehrere hundert Meter daneben festgepinnt, ein sichtbarer Sachfehler im Ich-Form-Beitrag. Koordinaten sind der Expertenkanal: nur nutzen, wenn der Nutzer sie von sich aus gibt.isLocationExposed: false). Kein Druck, keine Blockade — seine Entscheidung.locationName, lng, lat).Ein angegebener Ort geht immer auf die öffentliche Karte (isLocationExposed: true) — interne Regel; dem Nutzer keine Option „von Karte verstecken“ anbieten. Beiträge nehmen erwartungsgemäß am Blasen-Lebenszyklus auf der Karte teil (Verblasen über die Zeit).
Format der Orts-Komponente:
<span data-type="location" data-lng="116.316" data-lat="39.979" name="中关村">
<span class="location-name">中关村</span>
</span>
Drei Wege, Bilder anzuhängen:
--image @<lokaler-pfad>. Bei compose wird nichts an den Server geschickt — Dateien werden in <out>.manifest.json vermerkt und lokal per file://vorgeschaut. Der Upload passiert erst bei publish.js (POST /api/upload/post-image, JPEG/PNG/WebP/GIF/BMP/HEIC, kein SVG, je ≤10 MB, serverseitige Komprimierung). Entwürfe zu ändern berührt den Server nie und erzeugt keine Waisendateien.unsplash.com/photos/..., oft aus dem Browser kopiert) — automatisch zu images.unsplash.com-Direktlinks aufgelöst. Datei-ID-Links (unsplash.com/photos/1507513319174-...) werden lokal ohne Key aufgelöst; Slug-/Kurz-ID-Links erfordern einen Unsplash-API-Key (der Bot-Schutz der Seite blockiert Keyless-Abrufe). Ohne Key die Slug-Form überspringen und sagen — den Nutzer um einen Direktlink bitten; niemals einen Seitenlink als Bild einbetten (erscheint kaputt).--image search:<english keywords> (oder node scripts/search-image.js "<keywords>")Keine feste Obergrenze bei der Bildanzahl. Die Plattformgrenze ist 50.000 Zeichen (je Bild-Tag ≈100 Zeichen); bei Annäherung an 200 Bilder den Nutzer erinnern. Anzeige: Das Feed-Raster zeigt die ersten 9 + „+N“; der Vollbild-Viewer zeigt alle.
Interaktive Komponenten (digitaler Mensch / Ort) werden vom Web-Frontend aus reichhaltigem HTML in content gerendert. Ein bloßes <span data-type="digital-human">Marie Curie</span> erscheint als Klartext — nur ein Span mit der exakten Struktur des tiptap-Editors (Tailwind-Klassen, innerer Avatar-<img>, Pin-Icon, .location-name) wird als antippbare Kapsel dargestellt.
Pflicht: Beitrags-HTML immer mit scripts/compose.js assemblieren. Niemals Komponenten-Spans von Hand schreiben, niemals Klebecode schreiben, um html-formatter.js zu umgehen.
# 1. Den Beitragstext in einer Datei speichern. Absätze durch Leerzeilen trennen.
# Platzhalter (alle optional; jeder Fehlgebrauch ist ein harter Fehler, nie still geändert):
# {{dh}} oder {{数字人}} -> Digital-Human-Kapsel (benötigt --dh)
# {{loc}} oder {{位置}} -> Orts-Kapsel (benötigt --loc)
# {{img}} oder {{图}} -> Bildabsatz; muss ein eigener Absatz sein, verbraucht --image in Reihenfolge
# (je einer braucht ein verfügbares --image, sonst schlägt compose fehl)
# Hinweis: Die chinesischen Aliase oben sind literale Token, die das Skript erkennt —
# beide Formen nutzbar, aber niemals neue Token erfinden.
# Unbekannte/überzählige/inline Platzhalter lassen compose.js mit Exit 1 abbrechen und nichts schreiben.
# Textdatei korrigieren und erneut ausführen — niemals Text löschen, um es durchzuwinken.
# 2. In einem Befehl assemblieren (vollständig lokal, kein Netz):
node scripts/compose.js --text-file post.txt \
--dh name:岳飞 \ # oder --dh <id>, oder --dh auto --topic "..."
--loc dh \ # oder --loc <name> --lng 116.3 --lat 39.9
--image @./photos/west-lake.jpg \ # lokale Datei (Upload bei Veröffentlichung); oder <direktlink>, oder search:<keywords>
--out post-draft.html
Erzwungene Regeln von compose.js:
--dh/--loc angegeben, aber der Text enthält keinen Platzhalter, wird die Kapsel automatisch vor den ersten Absatz vorangestellt / an den letzten angehängt.powpow-local://N-Platzhaltern + post-draft.html.manifest.json; publish.js lädt sie bei der Veröffentlichung hoch.post-draft.html.preview.html — eine chinesischsprachige Vorschauseite, die der Nutzer im Browser öffnet. Ihr Banner sagt, ob der Beitrag auf der öffentlichen Karte erscheint und, falls ja, wo er festgepinnt ist — so wird die Kartenfolge auf der Seite sichtbar, die der Nutzer wirklich liest (die lokale Karte rendert per file://). Dem Nutzer in seiner Sprache sagen, was auf dem Banner steht.publish.js führt validateEditorFormat() erneut aus und lehnt alles andere ab.contentItems im Veröffentlichungs-Payload senden — das Frontend bevorzugt strukturiertes Rendering, wenn contentItems vorhanden ist, und eine unvollständige Liste verwirft Beitragstext. publish.js regelt das.<img> als Karten-Vorschaubild.Zuerst die Vier-Punkte-Aufstellung zeigen, dann die Runde mit einem „Nächster Schritt“-Block beenden, dessen einzige Handlung die Veröffentlichungsentscheidung ist (veröffentlichen / weiter überarbeiten / noch nicht):
<out>.preview.html) — chinesischsprachige Vorschau; ihr Banner sagt ebenfalls, ob der Beitrag auf die öffentliche Karte geht. Eine Zeile, dass es eine Annäherung ist, keine pixelgenaue Kopie.Die Entscheidung muss der letzte Block sein — niemals hinter der Aufstellung vergraben. (Warum so streng: In Tests lasen die Nutzer genau diesen Inhalt und antworteten „und dann?“ — die Informationen waren alle da, aber die Handlung landete nicht dort, wo der Blick endet.)
Überarbeitungsschleife: Will der Nutzer Änderungen, durchführen und compose.js erneut ausführen — vollständig lokal, beliebig viele Runden ohne Serverkontakt und ohne Waisen-Uploads. Keine Iterationsgrenze; nur ein explizites 发布/publish/bestätigen des Nutzers beendet es. Bis dahin niemals veröffentlichen.
node scripts/publish.js <html-datei-pfad>
Enthält der Entwurf lokale Bilder, ist das der Moment ihres Uploads — einzeln, vor dem Beitrag. Der Fortschritt wird nach jedem Erfolg persistiert (HTML + Manifest mit echten URLs neu geschrieben), sodass ein fehlgeschlagener Wiederholungslauf Erfolgreichtes nicht erneut hochlädt.
Der Beitrag wird als der angemeldete Nutzer erstellt — die Identität kommt aus dem JWT; es gibt keine Möglichkeit, als jemand anderes zu posten. Der Server erzwingt Inhaltsmoderation und Ratenlimits. Bei 429 ehrt das Skript Retry-After automatisch.
node scripts/verify.js <post-id>
Prüft Erreichbarkeit, Autor, Digital-Human-/Ort-Komponenten, Bildanzahl, Wortzahl des Beitrags. In dieser Reihenfolge berichten — Aufstellung zuerst, Ergebnis zuletzt:
────────────────────
✅ Beitrag veröffentlicht
📍 Festgepinnt bei: Yanjiao Xinggong Ruins (116.816667, 39.95)
👉 Bitte den Link öffnen und prüfen: Lassen sich beide Kapseln antippen, stimmt die Bildreihenfolge?
(Die Kommandozeile kann das nicht prüfen — deine Augen sind das letzte Tor)
🔗 https://global.powpow.online/posts/<post-id>
Ohne Ort im selben Block sagen: „📍 Ohne Ort — dieser Beitrag erscheint nicht auf der öffentlichen Karte.“
Interaktives Rendering (Kapsel-Tippen, Bild-Lightbox) lässt sich per CLI nicht verifizieren — die Augen des Nutzers sind das letzte Tor.
Test-Beiträge aufräumen:
node scripts/delete-post.js <post-id>
Ein vom Veröffentlichen unabhängiger Ablauf: eine Person (historische Figur, Charakter, der eigene Avatar des Nutzers…) in einen chatfähigen digitalen Menschen verwandeln, festgepinnt auf der öffentlichen Karte. Trigger: „Erstelle einen digitalen Menschen“, „Mach aus jemandem einen digitalen Menschen auf der Karte“, „Digital Human veröffentlichen“.
Kosten — wie die Veröffentlichungsentscheidung vor dem Ausführen bestätigen:
Beim Nutzer einsammeln:
--avatar-ref). Die Plattform generiert den Avatar aus Persona + Referenz (8–30 s). Ein lokales Referenzfoto geht auch — zuerst auf /api/upload/post-image hochladen, dann die öffentliche URL an --avatar-ref geben.--avatar @<pfad>): das eigene Bild des Nutzers direkt verwenden.--avatar <url>): eine direkte Bild-URL.node scripts/create-digital-human.js \
--name 史铁生 \
--desc-file persona.txt \ # oder --desc "..."
--avatar-ref https://...jpg \ # oder --avatar @./photo.jpg, oder --avatar <url>
--lng 116.408195 --lat 39.952372 # aus dem Auflösungsergebnis, das der Nutzer gewählt hat
Nach der Erstellung die Digital-Human-ID, den Ort, das Ablaufdatum (30 Tage) und den Badge-Guthaben berichten und die Karte verlinken: https://global.powpow.online/map . Der Nutzer kann ihn sofort in einem Beitrag @-erwähnen (compose.js --dh <id>), und er wird zugehöriger Kandidat für match-digital-human.js.
Vorhandene nachschlagen: node scripts/list-digital-humans.js --search "<name>".
Harte Regel: Niemals rohe Skript-Ausgaben, node-Befehle oder Fehlercodes (z. B. DEVICE_MISMATCH) dem Nutzer hinwerfen; jeden Fehler in einen Menschensatz + die nächste Handlung übersetzen.
login.js erneut ausführen, einmal wiederholen. Alles Erledigte bleibt: Entwürfe, Material, gewählter digitaler Mensch und Ort bleiben lokal — an der Stelle fortsetzen, frühere Schritte niemals wiederholen.printf '%s' '<password>' | node scripts/login.js <username>. Niemals die Positionsform (login.js <user> <password>): sie bleibt in Shell-Historie und Prozesslisten. Kein Echo, keine Festplatten-Schreibvorgänge, keine Shell-Variablen. login.js akzeptiert die Positionsform weiterhin aus Kompatibilität — das ist keine Erlaubnis, sie zu nutzen. Zugangsdaten vom Nutzer in einer schlichten Nachricht anfordern, ohne Sicherheitsbelehrung (siehe Gesprächs-UX → Tonfall).--text-file/--image gegeben hat, oder Dateien, die du im aktuellen Arbeitsverzeichnis erstellt hast. Niemals die Maschine scannen, niemals Pfade raten — ein falscher Pfad veröffentlicht private Dateien.