/install castreader
CastReader — Read Web Pages & Books Aloud
Setup (once per session)
cd \x3Cskill-directory> && npm install
How to find target (chatId)
User messages look like: [Telegram username id:8716240840 ...]
The number after id: is the target. You MUST use this number in every message tool call.
Example: target is "8716240840".
Mode A: When user sends a URL
Step 1: Extract article
node scripts/read-url.js "\x3Curl>" 0
Returns: { title, language, totalParagraphs, totalCharacters, paragraphs[] }
Step 2: Show info + ask user to choose
Reply with this text:
📖 {title}
🌐 {language} · 📝 {totalParagraphs} paragraphs · 📊 {totalCharacters} chars
📋 Summary:
{write 2-3 sentence summary from paragraphs}
Reply a number to choose:
1️⃣ Listen to full article (~{totalCharacters} chars, ~{Math.ceil(totalCharacters / 200)} sec to generate)
2️⃣ Listen to summary only (~{summary_char_count} chars, ~{Math.ceil(summary_char_count / 200)} sec to generate)
STOP. Wait for user to reply 1 or 2.
Step 3a: User chose 1 (full article)
Reply: 🎙️ Generating full audio (~{totalCharacters} chars, ~{Math.ceil(totalCharacters / 200)} seconds)...
node scripts/read-url.js "\x3Curl>" all
Then send the audio file using the message tool:
{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {title}"}
Reply: ✅ Done!
Step 3b: User chose 2 (summary only)
Reply: 🎙️ Generating summary audio...
Save the SAME summary text you showed in Step 2 to a file and generate:
echo "\x3Csummary text>" > /tmp/castreader-summary.txt
node scripts/generate-text.js /tmp/castreader-summary.txt \x3Clanguage>
Then send the audio file using the message tool:
{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"/tmp/castreader-summary.mp3", "caption":"📋 Summary: {title}"}
Reply: ✅ Done!
Mode B: When user asks to read a book (微信读书 / Kindle)
Books are synced from WeChat Reading or Kindle to ~/castreader-library/books/.
Each book is stored in a folder like 书名-hashid (e.g. 儒林外史-dc532c705c6d3edc5503acc).
⚠️ CRITICAL: You MUST use sync-books.js --list to get the exact book folder ID. NEVER guess or construct the folder path yourself. The folder name includes a title prefix that you cannot predict.
Step 1: List available books
node scripts/sync-books.js --list
Returns: { books: [{ id, title, author, language, totalChapters, totalCharacters, source, syncedAt }] }
The id field is the exact folder name you must use in all subsequent commands. Example: "儒林外史-dc532c705c6d3edc5503acc".
Step 2: Show book list and let user choose
Reply with the book list:
📚 Your synced books:
1. 📖 {title} — {author}
🌐 {language} · 📑 {totalChapters} chapters · 📊 {totalCharacters} chars · 📱 {source}
2. ...
Reply the number of the book you want to read.
STOP. Wait for user to choose a book.
Step 3: Show chapter list and let user choose
node scripts/sync-books.js --book "\x3Cid>"
Use the exact id from Step 1 output. Returns the book content with chapter list.
Reply:
📖 {title} — {author}
📑 {totalChapters} chapters · 📊 {totalCharacters} chars
📋 Chapters:
1. {chapter 1 title}
2. {chapter 2 title}
...
Reply a number to listen to a chapter, or "all" to listen to the full book.
STOP. Wait for user to choose.
Step 4a: User chose a chapter number
node scripts/sync-books.js --book "\x3Cid>" --chapter \x3Cnum> --audio
Returns: { title, audioFile, fileSizeBytes }
Send the audio:
{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {bookTitle} — Chapter {num}"}
Step 4b: User chose "all" (full book)
node scripts/sync-books.js --book "\x3Cid>" --audio
Returns: { title, audioFile, fileSizeBytes }
Send the audio:
{"action":"send", "target":"\x3CchatId>", "channel":"telegram", "filePath":"\x3CaudioFile>", "caption":"🔊 {bookTitle} (full)"}
Reading a chapter as text (no audio)
If the user wants to read (not listen), use without --audio:
node scripts/sync-books.js --book "\x3Cid>" --chapter \x3Cnum>
Returns: { title, author, language, chapter: { number, title, text }, totalChapters }
Rules
- ALWAYS extract first (index=0 for URLs, --list for books), show info, wait for user choice. Never skip.
- ALWAYS send audio files using the
messagetool withtarget(numeric chatId) andchannel("telegram"). Never just print the file path. - For books: ALWAYS run
--listfirst and use the exactidfrom the output. NEVER construct book paths manually or use partial IDs. - Do NOT use built-in TTS tools. ONLY use
read-url.js,generate-text.js, andsync-books.js. - Do NOT use web_fetch. ONLY use
read-url.js. - Do NOT use the
readtool to directly access files in~/castreader-library/. ONLY usesync-books.js.
- 确保已安装 OpenClaw(本地或 Docker 部署)
- 在对话框中输入安装命令:
/install castreader - 安装完成后,直接呼叫该 Skill 的名称或使用
/castreader触发 - 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
Castreader Openclaw Skill 是什么?
URL to audio: extract any web page and convert to natural AI speech (Kokoro TTS). The only skill that turns a URL into a podcast-quality MP3 — no API key nee... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 594 次。
如何安装 Castreader Openclaw Skill?
在 OpenClaw 或 Claude Code 对话框中运行命令「/install castreader」即可一键安装,无需额外配置。
Castreader Openclaw Skill 是免费的吗?
是的,Castreader Openclaw Skill 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。
Castreader Openclaw Skill 支持哪些平台?
Castreader Openclaw Skill 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(darwin, linux, win32)。
谁开发了 Castreader Openclaw Skill?
由 vinxu(@vinxu)开发并维护,当前版本 v3.2.14。