소스 정보
- 저장소
- oijhl852/seedance-storyboard
- 최근 소스 활동
- 2026년 7월 15일 21:04
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 4
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/oijhl852/seedance-storyboard --skill sd-inject명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | sd-inject |
| description | API 注入引擎 — 凭证提取、segment/list、segment/update、注入验证。由 seedance-storyboard 主 skill 调用。 |
| metadata | {"version":"1.1.1","last_updated":"2026-07-16","author":"Takis","repository":"https://github.com/oijhl852/seedance-storyboard"} |
作者:Takis | 仓库:seedance-storyboard
通过 Seedance 平台 API 将提示词注入面板编辑器。
🔴 绝不调用 segment/del — 永久删除片段并切断已生成视频的链接。
🔴 DOM 操作不持久 — Vue 从 API 数据重新渲染。唯一可靠方法是通过 segment/update API。
🔴 默认只注入新建的空白片段 — 不覆盖、不删除已有片段。先由 sd-panel 建立空白片段并确认其序号,再获取新片段 ID。
const ticket = localStorage.getItem('ticket_production')?.replace(/"/g, '');
const userId = JSON.parse(localStorage.getItem('user') || '{}')?.info?.userid;
const projectId = new URL(window.location.href).searchParams.get('project_id');
const partNo = new URL(window.location.href).searchParams.get('part_no');
if (!ticket || !userId || !projectId || !partNo) {
throw new Error('缺少面板凭证或项目参数,停止注入,不要使用占位符继续。');
}
凭证只在当前页面内存中使用。不要把完整请求 URL、ticket 或用户信息写入日志、截图、回复或提交到仓库。
为避免参数中的特殊字符破坏请求,使用 URL 和 searchParams 组装地址,不要直接拼接未经编码的凭证。
const apiUrl = (path, params) => {
const url = new URL(`https://service.fujunhn.cn/api/v1/aigc/${path}`);
Object.entries(params).forEach(([key, value]) => url.searchParams.set(key, String(value)));
url.searchParams.set('_t', String(Date.now()));
return url;
};
const resp = await fetch(apiUrl('segment/list', {ticket, user_id: userId, project_id: projectId, part_no: partNo}));
if (!resp.ok) throw new Error(`segment/list HTTP ${resp.status}`);
const listResult = await resp.json();
const segments = listResult?.data?.segments;
if (!Array.isArray(segments)) {
throw new Error('segment/list 返回结构异常,停止注入。');
}
const segmentBySeq = new Map();
for (const segment of segments) {
const seq = String(segment?.seq ?? '');
if (!segment?.id || !seq || segmentBySeq.has(seq)) {
throw new Error('片段列表存在缺失或重复的 seq/id,停止注入。');
}
segmentBySeq.set(seq, segment);
}
注入前确认目标片段是刚建立的空白片段。若 segment/list 显示目标片段已有内容,停止并报告,不要直接覆盖。
const resp = await fetch(
apiUrl('segment/update', {ticket, user_id: userId}),
{
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
id: segmentId,
project_id: projectId,
part_no: partNo,
content: contentHtml
})
}
);
if (!resp.ok) throw new Error(`segment/update HTTP ${resp.status}`);
const result = await resp.json();
if (result?.data?.success !== true) {
throw new Error('segment/update 未确认成功,停止后续片段写入。');
}
调用 segment/update 前,必须先向用户展示:新建片段编号、空白状态、新内容摘要、将使用的资产 chip,以及预计修改的片段数量。只有用户明确回复确认后才能写入;取消、超时、目标片段非空或内容无法匹配时,保持原有片段不变。
只有用户明确要求“覆盖已有片段”时,才允许把目标从空白片段改为已有片段,并再次展示原内容与新内容的差异后确认。
批量注入时按片段顺序逐个更新。任意一个片段失败就停止后续写入,并报告已成功的片段和第一个失败片段,不自动重试整批。
1. 刷新页面 (navigate_page type="reload")
2. switchToSegment(n) 切换到目标片段
3. 检查 chip 数量
验证时同时确认:片段 ID 与 seq 对应、目标片段原本为空、页面重新加载后内容仍存在、chip 的 data-id 和图片 URL 与交接表一致。