213 lines
6.1 KiB
Bash
213 lines
6.1 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
|
|||
|
|
echo "=== 小说内容同步到飞书 ==="
|
|||
|
|
echo "时间: $(date)"
|
|||
|
|
echo "小说: 《末日重生-开局囤货十亿物资》"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 配置
|
|||
|
|
NOVEL_DIR="/root/.openclaw/workspace/tomato-novel/books/末日重生-开局囤货十亿物资"
|
|||
|
|
CHAPTERS_DIR="$NOVEL_DIR/chapters"
|
|||
|
|
SYNC_STATE="/root/.openclaw/workspace/novel_sync_state.json"
|
|||
|
|
FEISHU_APP_TOKEN="MkRqbphc2afqEksxf6vcJjZVn8O"
|
|||
|
|
FEISHU_TABLE_ID="tbllH7wGmGbSCtPD"
|
|||
|
|
|
|||
|
|
# 初始化状态文件
|
|||
|
|
if [ ! -f "$SYNC_STATE" ]; then
|
|||
|
|
cat > "$SYNC_STATE" << EOF
|
|||
|
|
{
|
|||
|
|
"last_sync": "$(date -Iseconds)",
|
|||
|
|
"synced_chapters": [],
|
|||
|
|
"total_chapters": 0,
|
|||
|
|
"feishu_app_token": "$FEISHU_APP_TOKEN",
|
|||
|
|
"feishu_table_id": "$FEISHU_TABLE_ID"
|
|||
|
|
}
|
|||
|
|
EOF
|
|||
|
|
echo "📝 创建同步状态文件: $SYNC_STATE"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 发现章节文件
|
|||
|
|
echo "🔍 发现章节文件..."
|
|||
|
|
CHAPTER_FILES=$(find "$CHAPTERS_DIR" -name "*.md" -type f | grep -E "^[0-9]{4}_" | sort)
|
|||
|
|
TOTAL_CHAPTERS=$(echo "$CHAPTER_FILES" | wc -l)
|
|||
|
|
|
|||
|
|
echo "📚 发现 $TOTAL_CHAPTERS 个章节文件"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 显示章节列表
|
|||
|
|
echo "📋 章节列表:"
|
|||
|
|
echo "$CHAPTER_FILES" | head -10 | while read -r file; do
|
|||
|
|
filename=$(basename "$file")
|
|||
|
|
size=$(wc -c < "$file" 2>/dev/null || echo 0)
|
|||
|
|
echo " 📄 $filename ($size 字符)"
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
if [ "$TOTAL_CHAPTERS" -gt 10 ]; then
|
|||
|
|
echo " ... 还有 $((TOTAL_CHAPTERS - 10)) 个章节"
|
|||
|
|
fi
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 创建Python同步脚本
|
|||
|
|
echo "🔄 创建同步脚本..."
|
|||
|
|
cat > /tmp/sync_to_feishu.py << 'PYTHON_EOF'
|
|||
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
同步小说章节到飞书多维表格
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import os
|
|||
|
|
import re
|
|||
|
|
import json
|
|||
|
|
import time
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
def read_sync_state(state_file):
|
|||
|
|
"""读取同步状态"""
|
|||
|
|
if os.path.exists(state_file):
|
|||
|
|
with open(state_file, 'r', encoding='utf-8') as f:
|
|||
|
|
return json.load(f)
|
|||
|
|
return {"synced_chapters": []}
|
|||
|
|
|
|||
|
|
def save_sync_state(state_file, state):
|
|||
|
|
"""保存同步状态"""
|
|||
|
|
with open(state_file, 'w', encoding='utf-8') as f:
|
|||
|
|
json.dump(state, f, ensure_ascii=False, indent=2)
|
|||
|
|
|
|||
|
|
def parse_chapter_info(filename):
|
|||
|
|
"""解析章节信息"""
|
|||
|
|
# 格式: 0018_钢渣.md
|
|||
|
|
match = re.match(r'(\d{4})_(.*?)\.md', filename)
|
|||
|
|
if match:
|
|||
|
|
return {
|
|||
|
|
"number": int(match.group(1)),
|
|||
|
|
"title": match.group(2),
|
|||
|
|
"filename": filename
|
|||
|
|
}
|
|||
|
|
return None
|
|||
|
|
|
|||
|
|
def read_chapter_content(filepath, max_length=10000):
|
|||
|
|
"""读取章节内容"""
|
|||
|
|
try:
|
|||
|
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
|
|||
|
|
# 清理内容
|
|||
|
|
content = content.replace('\r', '')
|
|||
|
|
|
|||
|
|
# 截断过长的内容
|
|||
|
|
if len(content) > max_length:
|
|||
|
|
content = content[:max_length] + "\n\n【内容过长,已截断】"
|
|||
|
|
|
|||
|
|
return content
|
|||
|
|
except Exception as e:
|
|||
|
|
return f"读取失败: {e}"
|
|||
|
|
|
|||
|
|
def get_chapter_preview(content, length=200):
|
|||
|
|
"""获取章节预览"""
|
|||
|
|
# 移除换行和多余空格
|
|||
|
|
preview = content.replace('\n', ' ').strip()
|
|||
|
|
preview = re.sub(r'\s+', ' ', preview)
|
|||
|
|
|
|||
|
|
if len(preview) > length:
|
|||
|
|
preview = preview[:length] + "..."
|
|||
|
|
|
|||
|
|
return preview
|
|||
|
|
|
|||
|
|
def sync_chapter_to_feishu(chapter_info, content, app_token, table_id):
|
|||
|
|
"""同步章节到飞书(模拟)"""
|
|||
|
|
print(f" 📤 同步第{chapter_info['number']}章: {chapter_info['title']}")
|
|||
|
|
|
|||
|
|
# 这里应该调用飞书API
|
|||
|
|
# 实际实现需要安装飞书SDK
|
|||
|
|
|
|||
|
|
preview = get_chapter_preview(content)
|
|||
|
|
|
|||
|
|
# 模拟API调用
|
|||
|
|
print(f" 标题: {chapter_info['title']}")
|
|||
|
|
print(f" 字数: {len(content)} 字符")
|
|||
|
|
print(f" 预览: {preview}")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""主函数"""
|
|||
|
|
import sys
|
|||
|
|
|
|||
|
|
if len(sys.argv) < 4:
|
|||
|
|
print("用法: python3 script.py <章节目录> <状态文件> <应用token> <表格ID>")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
chapters_dir = sys.argv[1]
|
|||
|
|
state_file = sys.argv[2]
|
|||
|
|
app_token = sys.argv[3]
|
|||
|
|
table_id = sys.argv[4]
|
|||
|
|
|
|||
|
|
print("=== 开始同步到飞书多维表格 ===")
|
|||
|
|
|
|||
|
|
# 读取状态
|
|||
|
|
state = read_sync_state(state_file)
|
|||
|
|
synced = set(state.get("synced_chapters", []))
|
|||
|
|
|
|||
|
|
# 发现新章节
|
|||
|
|
new_chapters = []
|
|||
|
|
all_files = list(Path(chapters_dir).glob("*.md"))
|
|||
|
|
|
|||
|
|
for filepath in all_files:
|
|||
|
|
filename = filepath.name
|
|||
|
|
chapter_info = parse_chapter_info(filename)
|
|||
|
|
|
|||
|
|
if chapter_info and chapter_info["number"] not in synced:
|
|||
|
|
# 读取内容
|
|||
|
|
content = read_chapter_content(str(filepath))
|
|||
|
|
|
|||
|
|
# 同步到飞书
|
|||
|
|
if sync_chapter_to_feishu(chapter_info, content, app_token, table_id):
|
|||
|
|
new_chapters.append(chapter_info["number"])
|
|||
|
|
|
|||
|
|
# 更新状态
|
|||
|
|
if new_chapters:
|
|||
|
|
state["synced_chapters"].extend(new_chapters)
|
|||
|
|
state["synced_chapters"] = list(set(state["synced_chapters"]))
|
|||
|
|
state["last_sync"] = time.strftime("%Y-%m-%d %H:%M:%S")
|
|||
|
|
state["total_synced"] = len(state["synced_chapters"])
|
|||
|
|
|
|||
|
|
save_sync_state(state_file, state)
|
|||
|
|
|
|||
|
|
print(f"✅ 同步完成!")
|
|||
|
|
print(f"📊 统计:")
|
|||
|
|
print(f" - 新同步章节: {len(new_chapters)} 章")
|
|||
|
|
print(f" - 总同步章节: {len(state['synced_chapters'])} 章")
|
|||
|
|
else:
|
|||
|
|
print("📝 没有新章节需要同步")
|
|||
|
|
|
|||
|
|
print("")
|
|||
|
|
print("🔗 飞书表格地址:")
|
|||
|
|
print(f" https://ecncmdjvm81e.feishu.cn/base/{app_token}")
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|
|||
|
|
PYTHON_EOF
|
|||
|
|
|
|||
|
|
echo "✅ 同步脚本创建完成"
|
|||
|
|
echo ""
|
|||
|
|
|
|||
|
|
# 执行同步
|
|||
|
|
echo "🚀 开始执行同步..."
|
|||
|
|
python3 /tmp/sync_to_feishu.py "$CHAPTERS_DIR" "$SYNC_STATE" "$FEISHU_APP_TOKEN" "$FEISHU_TABLE_ID"
|
|||
|
|
|
|||
|
|
echo ""
|
|||
|
|
echo "=== 同步流程完成 ==="
|
|||
|
|
echo ""
|
|||
|
|
echo "🎯 后续操作建议:"
|
|||
|
|
echo "1. 安装飞书Python SDK: pip install lark-oapi"
|
|||
|
|
echo "2. 配置飞书API密钥"
|
|||
|
|
echo "3. 实现真正的API调用"
|
|||
|
|
echo "4. 设置定时同步任务"
|
|||
|
|
echo ""
|
|||
|
|
echo "📁 相关信息:"
|
|||
|
|
echo " - 小说目录: $CHAPTERS_DIR"
|
|||
|
|
echo " - 状态文件: $SYNC_STATE"
|
|||
|
|
echo " - 飞书表格: https://ecncmdjvm81e.feishu.cn/base/$FEISHU_APP_TOKEN"
|
|||
|
|
echo " - 表格ID: $FEISHU_TABLE_ID"
|
|||
|
|
echo ""
|
|||
|
|
echo "⚠️ 注意: 当前为模拟同步,需要实现真正的飞书API调用"
|