当你准备输出表格、对比、清单等结构化内容时,不直接用竖线表格,而是通过本 Skill 生成美化的 PDF 可视化。
⚠️ 使用前必读:限制和假设(见本文档末尾)
✅ 适用场景:
❌ 不适用:
在任何操作前执行:
# 定义工作目录(不要使用硬编码路径)
WORK_DIR="${OPENCLAW_WORKSPACE:-$HOME/.openclaw/workspace}"
TEMP_DIR="${WORK_DIR}/.pdf-export-tmp"
PORT=8888 # 可配置端口
# 检查权限和存在性
if [ ! -d "$WORK_DIR" ]; then
mkdir -p "$WORK_DIR" || { echo "❌ 无法创建工作目录"; exit 1; }
fi
if [ ! -w "$WORK_DIR" ]; then
echo "❌ 工作目录无写权限: $WORK_DIR"
exit 1
fi
# 创建专用临时目录
mkdir -p "$TEMP_DIR" || { echo "❌ 无法创建临时目录"; exit 1; }
chmod 700 "$TEMP_DIR"
创建包含以下元素的 HTML 文件。重要:不在 HTML 中包含任何敏感数据。验证所有内容都是非机密的。
⚠️ 重要限制:本工作流无法安全地在多用户系统中管理进程。见"限制和假设"。
PORT=8888
# ⚠️ 检查端口占用——但无法区分所有者
# 这会杀死任何占用该端口的进程,可能包括无关的进程!
if lsof -i :$PORT 2>/dev/null | grep -q LISTEN; then
OLD_PID=$(lsof -t -i :$PORT)
echo "⚠️ 警告:端口 $PORT 被占用 (PID=$OLD_PID)"
echo "❌ 请手动验证这是你的进程,然后手动 kill $OLD_PID"
echo "❌ 不自动 kill 以避免中断其他用户的进程"
exit 1
fi
# 启动服务器
cd "$TEMP_DIR" || exit 1
python3 -m http.server $PORT > "$TEMP_DIR/server.log" 2>&1 &
SERVER_PID=$!
sleep 1
if ! kill -0 $SERVER_PID 2>/dev/null; then
echo "❌ 服务器启动失败"
cat "$TEMP_DIR/server.log"
exit 1
fi
echo $SERVER_PID > "$TEMP_DIR/server.pid"
http://localhost:8888/...browser.pdf 返回本地文件路径(FILE:/... 或 /...)SOURCE_PDF="/path/to/generated.pdf"
DEST_PDF="$WORK_DIR/[中文文件名]-$(date +%Y-%m-%d).pdf"
if [ ! -r "$SOURCE_PDF" ]; then
echo "❌ 无法读取 PDF: $SOURCE_PDF"
exit 1
fi
cp "$SOURCE_PDF" "$DEST_PDF" || exit 1
if [ ! -r "$DEST_PDF" ]; then
echo "❌ 目标文件无法读取"
exit 1
fi
message.send 的 filePath 参数if [ -f "$TEMP_DIR/server.pid" ]; then
SERVER_PID=$(cat "$TEMP_DIR/server.pid")
if kill -0 $SERVER_PID 2>/dev/null; then
kill $SERVER_PID 2>/dev/null
sleep 1
if kill -0 $SERVER_PID 2>/dev/null; then
kill -9 $SERVER_PID 2>/dev/null
fi
fi
fi
rm -rf "$TEMP_DIR"
问题:
lsof -i :8888 # 显示占用端口的所有进程,但无法验证所有者
kill $PID # 可能杀死无关进程!
在工作流中:
在多用户系统中的风险:
缓解方案(在多用户系统中):
PORT=8000 + $(id -u)文档要求:用户必须手动验证 HTML/PDF 中无敏感数据。
为什么不自动扫描:
用户责任:
| 工具 | 假设 | 验证 |
|---|---|---|
| ------ | ------ | ------ |
| OpenClaw 浏览器 | 仅打开本地 URL,返回本地文件路径 | browser.pdf 返回 FILE:/... 或 /... |
| message.send | 仅接受本地文件,不上传到云端 | 检查 OpenClaw 文档 |
| Python HTTP server | 仅提供本地文件访问 | 默认行为,POSIX 标准 |
| 项目 | 规则 | 约束条件 |
|---|---|---|
| ------ | ------ | -------- |
| 路径管理 | 使用 $HOME 或 $OPENCLAW_WORKSPACE | 避免硬编码 |
| 权限检查 | 验证目录存在、可写、可读 | 单用户有效;多用户需协调 |
| 进程管理 | 保存 PID、验证停止 | 无法验证进程所有权 |
| 敏感数据 | 手动审查内容 | 不支持自动扫描 |
| 临时文件 | 专用目录 + chmod 700 | 防止其他本地用户访问 |
# 默认工作目录
python3 scripts/generate_table_pdf.py --title "技能清单"
# 自定义工作目录
python3 scripts/generate_table_pdf.py --title "技能清单" --workdir /my/path
脚本功能:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| ------ | ------ | -------- |
| 端口已被占用 | 进程未清理或其他用户占用 | 手动 kill -9 $PID 或更改端口 |
| PDF 为空 | 浏览器渲染未完成 | 增加延迟到 3-5 秒 |
| 文件无法发送 | 路径错误或权限不足 | 检查路径和权限 |
| 多用户冲突 | 进程/端口冲突 | 使用唯一端口或不同时间窗口 |
共 1 个版本