fix(ux): #1894 抖音提取前端不再拦截非http开头文本,透传后端400错误
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 1m20s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 1m25s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m37s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m36s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m52s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 3m18s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m41s
AI Code Review / AI Code Review (pull_request) Successful in 6m31s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 8m2s
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 7m17s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 3m22s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 3m21s

后端已通过 _extract_url_from_text 支持从任意分享文本(含App「复制链接」
带的文案)自动提取URL,前端不应再做 ^https?:// 前缀校验。

修复:
- ScriptLibrary.handleDouyinExtract: 删除 http(s):// 前缀正则校验,把
  用户粘贴的原文(trim 后)整体作为 {url} 提交给 POST /scripts/extract-from-douyin,
  由后端 _extract_url_from_text 负责 URL 识别/校验。
- 后端返回 400(未找到有效链接/仅支持抖音域名等)时,extractErrMsg 已能
  解析 response.data.detail,直接 toast.error 透传后端文案;保持通用
  fallback「抖音文案提取失败」兜底。
- 空输入提示由「请粘贴抖音视频链接」改为「请粘贴抖音视频链接或分享文案」。
- 弹窗说明文字 + TextArea placeholder 更新,提示用户直接粘贴 App「复制链接」
  全部内容即可(包含分享文案+短链)。
- loading 态提示文案开头加「提取中,」,confirmLoading/closable/maskClosable/
  TextArea disabled 已由 #1965 完成,无需额外修改即可防重复点击。

Refs: #1894
This commit is contained in:
saas-frontend
2026-09-17 09:52:14 +08:00
parent 605a3eb841
commit 1fc463ee17
+12 -14
View File
@@ -6,7 +6,7 @@
* 操作:编辑 / 删除 / 复制 / 使用(跳创作页预填)
* - 新建/编辑弹窗:标题(原"名称")、正文(含 AI 改写)、分类、标签
* - #1893/#1894 AI 能力:
* - 顶部「🎬 从抖音提取」按钮 → 输入抖音链接 → ASR 提取文案 → 自动填充到新建弹窗
* - 顶部「🎬 从抖音提取」按钮 → 粘贴分享文案/链接(后端自动提取URL) → ASR 提取文案 → 自动填充到新建弹窗
* - 正文下方「✨ AI 改写」按钮 → 点击直接执行(美化 loading spinner + "正在改写..."),
* 成功自动替换正文并 toast「改写成功」1s 自动关闭;失败 toast 错误
* - 标题旁「✨ AI 生成标题」按钮 → 候选列表一键填入
@@ -272,20 +272,16 @@ const ScriptLibrary: React.FC = () => {
setDouyinModalOpen(true)
}
/** 执行抖音提取,成功后打开新建弹窗并预填 content */
/** #1894:执行抖音提取。前端不再做 URL 前缀校验,直接把用户粘贴的原文(含分享文案+链接)交给后端 _extract_url_from_text 自动提取。后端 400 错误(未找到链接/非抖音域名等)直接透传给用户。 */
const handleDouyinExtract = async () => {
const url = douyinUrl.trim()
if (!url) {
message.warning("请粘贴抖音视频链接")
return
}
if (!/^https?:\/\//i.test(url)) {
message.warning("请输入以 http(s):// 开头的完整链接")
const raw = douyinUrl.trim()
if (!raw) {
message.warning("请粘贴抖音视频链接或分享文案")
return
}
setDouyinLoading(true)
try {
const res = await extractScriptFromDouyin({ url })
const res = await extractScriptFromDouyin({ url: raw })
message.success(`提取成功${res.duration_seconds ? `(时长 ${res.duration_seconds}s)` : ""}`)
setDouyinModalOpen(false)
setDouyinUrl("")
@@ -300,6 +296,7 @@ const ScriptLibrary: React.FC = () => {
})
setModalOpen(true)
} catch (err) {
// 后端 400(未找到有效链接/仅支持抖音域名等)直接透传错误信息
message.error(extractErrMsg(err, "抖音文案提取失败"))
} finally {
setDouyinLoading(false)
@@ -637,11 +634,12 @@ const ScriptLibrary: React.FC = () => {
destroyOnClose
>
<Paragraph type="secondary" style={{ marginBottom: 12, fontSize: 13 }}>
粘贴抖音分享链接(支持 v.douyin.com 短链和 www.douyin.com/video/ 长链), AI
将自动下载音频并识别文案。首次识别可能需要 5-15 秒。
粘贴抖音分享文案或链接即可,系统会自动从文本中识别链接(支持 v.douyin.com 短链、
www.douyin.com/video/ 长链,以及 App「复制链接」带的分享文案)。AI
将自动下载音频并识别文案, 首次识别可能需要 5-15 秒。
</Paragraph>
<Input.TextArea
placeholder="例如:https://v.douyin.com/xxxxx/ 或 https://www.douyin.com/video/xxxxx"
placeholder="直接粘贴 App「复制链接」的全部内容即可,例如:8.88 复制打开抖音... https://v.douyin.com/xxxxx/"
value={douyinUrl}
onChange={(e) => setDouyinUrl(e.target.value)}
rows={2}
@@ -651,7 +649,7 @@ const ScriptLibrary: React.FC = () => {
{douyinLoading && (
<div className="xx-ai-loading-hint">
<Spin size="small" style={{ marginRight: 8 }} />
正在下载视频并识别文案,可能需要数秒,请稍候…
提取中,正在下载视频并识别文案,可能需要数秒,请稍候…
</div>
)}
</Modal>