📚 小说内容: - 《末日重生-开局囤货十亿物资》33章 - 完整的状态文件、记忆索引、钩子系统 🛠️ 系统配置: - 版本控制管理系统 - 自动化脚本系统 - 质量监控系统 🧠 固化记忆: - 长期记忆文件 - 系统配置文档 - 恢复流程指南 💾 数据安全: - 本地备份系统 - Git版本控制 - 远程同步机制 同步时间: 2026-03-30 16:25:35 系统状态: inkos正常运行中 (PID: 1433309) 创作进度: 第33章《油粮》创作中
213 lines
6.1 KiB
Bash
Executable File
213 lines
6.1 KiB
Bash
Executable File
#!/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调用" |