一键导入
feishu-portfolio-launch
从飞书多维表格链接出发,生成并上线作品集网站到 GitHub Pages,并用 GitHub Actions 定时刷新飞书临时媒体链接。适用于视频/图片附件存在飞书、需要对外展示的创作者(AI 视频、摄影、设计、样片库等)。不适合博客、电商、需要后端写入的场景。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
从飞书多维表格链接出发,生成并上线作品集网站到 GitHub Pages,并用 GitHub Actions 定时刷新飞书临时媒体链接。适用于视频/图片附件存在飞书、需要对外展示的创作者(AI 视频、摄影、设计、样片库等)。不适合博客、电商、需要后端写入的场景。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | feishu-portfolio-launch |
| description | 从飞书多维表格链接出发,生成并上线作品集网站到 GitHub Pages,并用 GitHub Actions 定时刷新飞书临时媒体链接。适用于视频/图片附件存在飞书、需要对外展示的创作者(AI 视频、摄影、设计、样片库等)。不适合博客、电商、需要后端写入的场景。 |
一句话:给我飞书多维表格链接,我把作品集网站搭出来,并把“飞书临时链接会过期”这件事自动化处理掉。
默认交付物:
index.html 或静态前端页面api/videos.jsonapi/covers.jsonapi/portfolio.jsonrefresh.py.github/workflows/refresh.yml内置模板资源:
目标结果:
✅ 适合:
❌ 不适合:
不要把飞书临时 URL 当成永久资源。
飞书附件的播放 / 下载地址会过期。正确做法不是让用户在本地电脑上定时跑脚本,而是:
file_token 解析成临时 URLapi/*.json也就是:
Feishu Bitable -> refresh.py -> api/*.json -> GitHub Pages
先检查本地是否具备初始化所需工具:
for cmd in node python3 gh git; do
which "$cmd" >/dev/null 2>&1 && echo "OK $cmd" || echo "MISS $cmd"
done
lark-cli --version >/dev/null 2>&1 && echo "OK lark-cli" || echo "MISS lark-cli"
gh auth status >/dev/null 2>&1 && echo "OK GitHub auth" || echo "MISS GitHub auth"
如果缺少工具,再让用户安装。
如果 gh 没登录,先完成 GitHub 登录。
向用户要飞书多维表格链接,例如:
https://my.feishu.cn/base/AbCdEfGhIjk
从 URL 里解析出 app_token。
然后列出所有表:
lark-cli api GET "/open-apis/bitable/v1/apps/${APP_TOKEN}/tables"
不要默认选第一张表。
很多 Base 里会同时存在“空模板表”和“真正有作品的素材表”。要继续读取记录并验证:
优先找这些字段:
样片 / 视频 / 附件封面 / 封面图 / 海报 / 图片内容 / 标题 / 作品名称类型 / 分类时长AI工具 / 工具序号如果一张表只有 文本 / 单选 / 日期 / 附件 这种空模板字段,继续换表,不要生成网站。
要让 GitHub Actions 能自动刷新,飞书应用必须至少能:
执行方案里要显式依赖这 4 个 secrets:
LARK_APP_IDLARK_APP_SECRETLARK_BASE_TOKENLARK_TABLE_ID如果用户本机已经有可用的飞书应用配置,可以复用。否则要明确告诉用户去飞书开放平台补权限和密钥。
不要只提取 file_token 列表。
应构建一份前端可直接消费的结构化数据,至少包含:
推荐输出:
api/portfolio.json:完整作品数组api/videos.json:video_token -> tmp_download_urlapi/covers.json:cover_token -> tmp_download_url结构样例可直接参考仓库内的 assets/portfolio.sample.json。
前端可以继续用静态 HTML + JS,也可以完全由 portfolio.json 渲染。
默认生成静态页面,要求:
动效要求默认一起交付,不要只做“能打开”的静态页:
实现边界:
requestAnimationFrame数据绑定原则:
/api/videos.json 和 /api/covers.json/api/portfolio.json 渲染卡片如果用户已有站点,优先保留现有视觉样式,只替换数据来源和刷新机制。
如果用户明确提到参考现有站点风格,优先复用这些动画类型:
标准流程:
gh repo create <repo-name> --public --source=. --remote=origin --push
然后确认 Pages 来源是:
main/检查:
gh api repos/<owner>/<repo>/pages
必须确认:
cname 正常(如果有自定义域名)main 和根目录刷新脚本应采用下面这条路线:
app_id + app_secret 换 tenant_access_tokenbatch_get_tmp_download_urlapi/videos.json、api/covers.json、api/portfolio.json关键要求:
推荐文件名:
refresh.py优先直接复制 skill 自带模板:
cp ~/.claude/skills/feishu-portfolio-launch/assets/refresh.py ./refresh.py
然后只修改字段候选数组,不要把具体 token 或具体 URL 硬编码进去。
不要再使用本地 launchd 作为默认方案。
默认方案必须是 GitHub Actions。
工作流要求:
workflow_dispatchschedule,默认每 12 小时执行一次python refresh.pyapi/videos.json、api/covers.json、api/portfolio.json标准 secrets:
LARK_APP_IDLARK_APP_SECRETLARK_BASE_TOKENLARK_TABLE_ID标准文件:
.github/workflows/refresh.yml优先直接复制 skill 自带模板:
mkdir -p .github/workflows
cp ~/.claude/skills/feishu-portfolio-launch/assets/refresh.yml .github/workflows/refresh.yml
如果当前环境已经有这些值,并且用户明确让你落地,就直接配置:
gh secret set LARK_APP_ID -R <owner>/<repo>
gh secret set LARK_APP_SECRET -R <owner>/<repo>
gh secret set LARK_BASE_TOKEN -R <owner>/<repo>
gh secret set LARK_TABLE_ID -R <owner>/<repo>
然后验证:
gh secret list -R <owner>/<repo>
如果缺值,就停在这里,明确告诉用户缺哪个,不要伪造。
完成配置后,立刻手动跑一次 workflow:
gh workflow run refresh.yml -R <owner>/<repo>
gh run list -R <owner>/<repo> --limit 3
gh run watch <run-id> -R <owner>/<repo> --exit-status
再检查线上结果:
python3 - <<'PY'
import json, urllib.request, time
url = f'https://<domain-or-pages-url>/api/videos.json?t={int(time.time())}'
with urllib.request.urlopen(url, timeout=20) as r:
data = json.load(r)
print(data.get('_refreshed_at'))
print(data.get('_count'))
PY
然后抽测 1 条视频:
206 或 200content-type 应为 video/mp4 或可播放媒体类型如果线上 api/videos.json 还是旧时间:
如果用户要自定义域名,再做:
CNAME 文件这部分沿用 GitHub Pages 标准流程,不需要和飞书逻辑耦合。
遇到“网站能打开但视频播不了”,优先判断:
api/videos.json 是否还是旧的默认不要先怀疑播放器,也不要先怀疑前端样式。
如果用户说“页面太死”或者“想要像作品集一样更有呼吸感”,默认增加动画层,而不是只改颜色和排版。
这个 Skill 完成后,至少要满足:
LARK_* secretsapi/videos.json 的 _refreshed_at 是新时间launchdfile_tokenvideos.json,忽略封面和结构化记录如果需要一个已经验证过的做法,先直接复用 skill 仓库自带模板:
assets/refresh.pyassets/refresh.ymlassets/portfolio.sample.json实际项目里最终会生成这些文件:
refresh.py.github/workflows/refresh.ymlapi/videos.jsonapi/covers.jsonapi/portfolio.json优先复用现成仓库模式,再按用户站点样式做适配。