Claude-skill-registry feishu-sync
使用Playwright自动同步文档到飞书。Use for tasks like syncing markdown to Feishu, automating Feishu document updates, browser automation for Feishu. Keywords: 飞书同步, feishu sync, playwright, 文档同步, 自动化
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/feishu-sync" ~/.claude/skills/majiayu000-claude-skill-registry-feishu-sync && rm -rf "$T"
manifest:
skills/data/feishu-sync/SKILL.mdsource content
feishu-sync
使用Playwright自动化同步Markdown文档到飞书Wiki/文档
Use this skill for 飞书文档自动同步、Markdown到飞书的自动化、浏览器自动化操作飞书。
快速使用
前置条件
# 确保使用anaconda python(已安装playwright) /opt/anaconda3/bin/python3 -c "from playwright.sync_api import sync_playwright; print('OK')" # 如未安装,执行: pip install playwright pyperclip playwright install chromium
运行同步
/opt/anaconda3/bin/python3 scripts/sync_to_feishu.py
核心脚本
位置:
scripts/sync_to_feishu.py
关键配置
# 目标飞书文档URL FEISHU_URL = "https://xxx.feishu.cn/wiki/xxxxxxx" # 源文件路径 REPORT_PATH = Path("docs/research/your-report.md")
执行流程
1. 读取本地Markdown文件 2. 复制内容到系统剪贴板 3. 启动Chrome浏览器(非无头模式) 4. 导航到飞书文档 5. 检测登录状态,等待用户登录(5分钟超时) 6. 登录后自动点击编辑区域 7. 移动到文档末尾,添加分隔线 8. 自动粘贴内容(Cmd+V) 9. 等待用户确认后关闭浏览器
最佳实践
1. 使用系统Chrome而非下载Chromium
# 推荐:使用系统安装的Chrome,避免下载超时 browser = await p.chromium.launch( headless=False, channel="chrome" # 关键参数 )
原因: Chromium下载经常超时(30s),使用系统Chrome可跳过下载步骤。
2. 禁用输出缓冲
# 在脚本开头添加,确保实时输出 sys.stdout.reconfigure(line_buffering=True) sys.stderr.reconfigure(line_buffering=True)
原因: 后台运行时输出会被缓冲,无法实时监控进度。
3. 设置足够的登录超时
await page.wait_for_url( lambda url: "wiki" in url and "accounts" not in url, timeout=300000 # 5分钟,给用户足够时间扫码登录 )
原因: 扫码登录需要时间,2分钟可能不够。
4. 多种编辑区域选择器
editor_selectors = [ '[data-testid="doc-editor"]', '.doc-content', '.suite-markdown-container', '[contenteditable="true"]', # 最通用 '.editor-container', '.wiki-content', '.lark-editor', ]
原因: 飞书不同版本/页面的编辑器选择器可能不同。
5. 使用pyperclip处理剪贴板
import pyperclip pyperclip.copy(report_content) # 然后用键盘快捷键粘贴 await page.keyboard.press('Meta+v')
原因: 直接用Playwright的fill()方法对富文本编辑器兼容性差。
常见问题
Q1: Chromium下载超时
Error: Request to https://cdn.playwright.dev/... timed out after 30000ms
解决: 使用
channel="chrome" 参数使用系统Chrome。
Q2: 登录超时
❌ 登录超时或失败: Timeout 120000ms exceeded
解决:
- 增加timeout到300000ms(5分钟)
- 确保浏览器窗口可见,及时完成登录
Q3: 找不到编辑区域
⚠️ 未找到编辑区域,尝试点击页面中心...
解决:
- 检查飞书文档是否有编辑权限
- 尝试手动点击编辑区域后再运行脚本
Q4: 粘贴失败
解决:
- 确保pyperclip已安装
- macOS需要授予终端剪贴板访问权限
- 手动按Cmd+V作为备选
Q5: 输出为空/无法监控进度
解决: 添加
sys.stdout.reconfigure(line_buffering=True)
扩展场景
同步到多个文档
FEISHU_URLS = [ "https://xxx.feishu.cn/wiki/doc1", "https://xxx.feishu.cn/wiki/doc2", ] for url in FEISHU_URLS: await sync_to_document(page, url, content)
定时同步
# crontab -e 0 9 * * * /opt/anaconda3/bin/python3 /path/to/sync_to_feishu.py >> /var/log/feishu-sync.log 2>&1
替换而非追加
# 全选后粘贴,替换全部内容 await page.keyboard.press('Meta+a') await page.keyboard.press('Meta+v')
完整脚本模板
#!/opt/anaconda3/bin/python3 """飞书文档自动同步""" import asyncio import sys from pathlib import Path sys.stdout.reconfigure(line_buffering=True) sys.stderr.reconfigure(line_buffering=True) from playwright.async_api import async_playwright import pyperclip FEISHU_URL = "https://xxx.feishu.cn/wiki/xxx" SOURCE_FILE = Path("docs/your-file.md") async def sync(): content = SOURCE_FILE.read_text(encoding="utf-8") pyperclip.copy(content) async with async_playwright() as p: browser = await p.chromium.launch(headless=False, channel="chrome") page = await (await browser.new_context()).new_page() await page.goto(FEISHU_URL) await page.wait_for_timeout(3000) # 等待登录 if "accounts" in page.url: print("请登录飞书...") await page.wait_for_url( lambda u: "wiki" in u and "accounts" not in u, timeout=300000 ) # 点击编辑区域 await page.wait_for_timeout(3000) await page.click('[contenteditable="true"]', timeout=5000) # 粘贴 await page.keyboard.press('Meta+End') await page.keyboard.press('Enter') await page.keyboard.press('Meta+v') print("✅ 同步完成") await page.wait_for_event('close', timeout=300000) await browser.close() if __name__ == "__main__": asyncio.run(sync())
相关资源
- Playwright Python文档: https://playwright.dev/python/
- 飞书开放平台: https://open.feishu.cn/
- pyperclip: https://pypi.org/project/pyperclip/