📦 Castreader Openclaw — 网页转语音

v3.2.14

输入任意网页 URL,自动提取正文并用 Kokoro TTS 生成自然语音 MP3,无需 API Key 即可一键获得播客级音质,也支持本地电子书朗读。

1· 491·1 当前·1 累计
by @vinxu·MIT-0
下载技能包
License
MIT-0
最后更新
2026/4/14
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
安全
medium confidence
技能文件、脚本与说明与其声明用途一致(提取 URL 或本地书籍并通过 CastReader 生成 TTS),但需运行 npm(Puppeteer/Chromium),会将提取文本发送至外部 TTS API,且存在少量元数据不匹配需注意。
评估建议
安装前请考虑: - 网络与隐私:技能会提取网页与书籍文本并发送至外部 TTS API(默认 https://api.castreader.ai)。若内容含敏感数据,请勿使用在线 TTS 模式。API Key 可选;如设置 CASTREADER_API_KEY 将随请求一起发送。 - 安装体积:必须在技能目录执行 `npm install`,将安装 Puppeteer 及大量 npm 包并下载 Chromium 二进制文件,下载量大且占用额外磁盘空间。建议于沙箱、容器或 VM 中运行。 - 本地文件访问:技能会从 ~/castreader-library/books/ 读取同步书籍,使用前请确保该目录仅存放预期文件。 - 代码审查与测试:如需额外安全,可检查内含脚本,并先离线运行提取模式(`node scripts/read-url.js <url> 0`)验证提取行为,无需生成 TTS。也可在隔离环境执行 `npm install --no-audit` 并监控网络流量。 - 元数据不匹配:注册元数据未声明脚本使用的环境变量,请按需设置或省略 CASTREADER_API_K...
详细分析 ▾
用途与能力
技能为 URL/书籍转音频工具,其代码(提取器包、基于 puppeteer 的提取与 TTS 调用)与此目的一致。同时读取本地库目录 ~/castreader-library/books/ 中的同步书籍——与“朗读书籍”功能相符。小差异:SKILL 元数据未列出脚本使用的环境变量(CASTREADER_API_URL/VOICE/API_KEY),README 中有说明。
指令范围
SKILL.md 指示代理运行 npm install 后仅使用提供的 node 脚本。这些脚本(extract/read-url/sync-books/generate-text)通过 Puppeteer 浏览网页、向目标页面注入 extractor-bundle.js、在 /tmp 及用户主目录 castreader-library 下读写文件,并将提取文本 POST 至外部 TTS 端点(默认 https://api.castreader.ai)。所有操作均在声明范围内,但会将提取的网页/书籍文本发往外部(隐私考量)。
安装机制
注册表中无自动安装描述,但 SKILL.md 要求在技能目录执行 `npm install`。package.json 依赖 puppeteer,安装时将拉取大量 npm 包并下载 Chromium 二进制文件——属于中风险、大体积操作。包均来自 npm 官方仓库(无冷门地址),但需预期较大下载及本地资源占用。
凭证需求
注册元数据未声明所需环境变量,但代码读取可选变量:CASTREADER_API_URL、CASTREADER_API_KEY、CASTREADER_VOICE、CASTREADER_SPEED。若提供 API_KEY,将在 TTS 请求中携带该密钥。脚本亦读取用户主目录 ~/castreader-library/books/ 下的文件——用于同步书籍但可能含敏感内容。整体所需环境与文件访问与功能相符,但元数据遗漏及提取文本外发 API 为需注意点。
持久化与权限
技能未请求 'always: true',不修改其他技能或系统设置,也不在代理范围持久化配置。按需调用(node 脚本)运行,除常规文件系统与网络访问外不请求额外权限。
scripts/read-url.js:133
检测到 shell 命令执行(child_process)。
scripts/generate-text.js:16
环境变量访问结合网络发送。
scripts/read-url.js:29
环境变量访问结合网络发送。
scripts/sync-books.js:38
环境变量访问结合网络发送。
scripts/generate-text.js:103
文件读取结合网络发送(可能外泄)。
scripts/read-url.js:130
文件读取结合网络发送(可能外泄)。
scripts/sync-books.js:130
文件读取结合网络发送(可能外泄)。
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

🖥️ OSmacOS · Linux · Windows

版本

latestv3.2.142026/3/12

改进 README:更清晰的价值主张,移除已删除脚本,修复链接,优化 SKILL.md 以供搜索

无害

安装命令

点击复制
官方npx clawhub@latest install castreader
镜像加速npx clawhub@latest install castreader --registry https://cn.longxiaskill.com

技能文档

# CastReader — 朗读网页与书籍 ## 安装(每会话一次) `` cd && npm install ` ## 如何获取 target(chatId) 用户消息格式类似: [Telegram username id:8716240840 ...] id: 后面的数字即为 target。你必须在每次调用 message 工具时使用该数字。 示例:target 为 "8716240840"。 --- ## 模式 A:用户发送 URL ### 步骤 1:提取文章 ` node scripts/read-url.js "" 0 ` 返回: { title, language, totalParagraphs, totalCharacters, paragraphs[] } ### 步骤 2:展示信息并让用户选择 回复以下内容: ` 📖 {title} 🌐 {language} · 📝 {totalParagraphs} 段落 · 📊 {totalCharacters} 字符 📋 摘要:{从段落中写 2–3 句摘要} 回复数字选择: 1️⃣ 收听全文(约 {totalCharacters} 字符,生成约 {Math.ceil(totalCharacters / 200)} 秒) 2️⃣ 仅收听摘要(约 {summary_char_count} 字符,生成约 {Math.ceil(summary_char_count / 200)} 秒) ` 停止。等待用户回复 1 或 2。 ### 步骤 3a:用户选 1(全文) 回复:🎙️ 正在生成全文音频(约 {totalCharacters} 字符,约 {Math.ceil(totalCharacters / 200)} 秒)... ` node scripts/read-url.js "" all ` 然后使用 message 工具发送音频文件: `json {"action":"send", "target":"", "channel":"telegram", "filePath":"", "caption":"🔊 {title}"} ` 回复:✅ 完成! ### 步骤 3b:用户选 2(仅摘要) 回复:🎙️ 正在生成摘要音频... 将步骤 2 中展示的相同摘要文本保存到文件并生成: ` echo "

" > /tmp/castreader-summary.txt node scripts/generate-text.js /tmp/castreader-summary.txt ` 然后使用 message 工具发送音频文件: `json {"action":"send", "target":"", "channel":"telegram", "filePath":"/tmp/castreader-summary.mp3", "caption":"📋 摘要:{title}"} ` 回复:✅ 完成! --- ## 模式 B:用户要求朗读书籍(微信读书 / Kindle) 书籍从微信读书或 Kindle 同步到 ~/castreader-library/books/。 每本书保存在形如 书名-hashid 的文件夹中(例如 儒林外史-dc532c705c6d3edc5503acc)。 ⚠️ 关键:你必须先用 sync-books.js --list 获取确切的图书文件夹 ID。绝不要猜测或手动构造路径。文件夹名包含不可预测的前缀。 ### 步骤 1:列出可用书籍 ` node scripts/sync-books.js --list ` 返回: { books: [{ id, title, author, language, totalChapters, totalCharacters, source, syncedAt }] } 其中的 id 字段就是后续命令必须使用的确切文件夹名。 示例:"儒林外史-dc532c705c6d3edc5503acc"。 ### 步骤 2:展示书单并让用户选择 回复书单: ` 📚 你已同步的书籍: 1. 📖 {title} — {author} 🌐 {language} · 📑 {totalChapters} 章 · 📊 {totalCharacters} 字符 · 📱 {source} 2. ... 回复数字选择要听的书。 ` 停止。等待用户选择。 ### 步骤 3:展示章节列表并让用户选择 ` node scripts/sync-books.js --book "" ` 使用步骤 1 输出中的确切 id。 返回书籍内容及章节列表。 回复: ` 📖 {title} — {author} 📑 {totalChapters} 章 · 📊 {totalCharacters} 字符 📋 章节: 1. {chapter 1 title} 2. {chapter 2 title} ... 回复数字收听对应章节,或回复 "all" 收听整本书。 ` 停止。等待用户选择。 ### 步骤 4a:用户选择章节号 ` node scripts/sync-books.js --book "" --chapter --audio ` 返回: { title, audioFile, fileSizeBytes } 发送音频: `json {"action":"send", "target":"", "channel":"telegram", "filePath":"", "caption":"🔊 {bookTitle} — 第 {num} 章"} ` ### 步骤 4b:用户选择 "all"(整本书) ` node scripts/sync-books.js --book "" --audio ` 返回: { title, audioFile, fileSizeBytes } 发送音频: `json {"action":"send", "target":"", "channel":"telegram", "filePath":"", "caption":"🔊 {bookTitle}(全文)"} ` ### 仅阅读章节文本(不生成音频) 若用户只想阅读(不听),去掉 --audio` node scripts/sync-books.js --book "" --chapter ` 返回: { title, author, language, chapter: { number, title, text }, totalChapters } --- ## 规则 - 必须先提取(URL 用 index=0,书籍用 --list),展示信息,等待用户选择。绝不跳过。 - 必须使用 message 工具发送音频文件,并带上 target(数字 chatId)和 channel("telegram")。绝不要只打印文件路径。 - 书籍:必须先运行 --list,并使用输出中的确切 id。绝不要手动构造路径或使用部分 ID。 - 不要使用内置 TTS 工具。仅使用 read-url.jsgenerate-text.jssync-books.js。 - 不要使用 web_fetch。仅使用 read-url.js。 - 不要使用 read 工具直接访问 ~/castreader-library/ 下的文件。仅使用 sync-books.js`。

数据来源ClawHub ↗ · 中文优化:龙虾技能库