🔄 卡若AI 同步 2026-03-04 17:22 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个

This commit is contained in:
2026-03-04 17:22:35 +08:00
parent 6810b8fd37
commit d7468a6bca
4 changed files with 21 additions and 5 deletions

View File

@@ -25,7 +25,11 @@ cd /Users/karuo/Documents/开发/2、私域银行/神射手 && docker compose up
### 3. 使用方式
- **方式一(推荐)**:执行前点击节点「**设置链接与是否下载**」,将 `url` 改为要解析的抖音链接(如 `https://v.douyin.com/xxx``download` 为 `true` 则同时下载视频,为 `false` 则仅解析文案。然后点击 **Test workflow** 或 **Execute Workflow**
- **方式一(推荐)**:执行前点击节点「**设置链接与是否下载**」,将 `url` 改为要解析的抖音链接。支持:
- 短链:`https://v.douyin.com/xxx`
- 视频页:`https://www.douyin.com/video/7591362359689147057`
- 精选页:`https://www.douyin.com/jingxuan?modal_id=7591362359689147057`
`download` 为 `true` 则同时下载视频,为 `false` 则仅解析文案。然后点击 **Test workflow** 或 **Execute Workflow**。
- **方式二**:用「**Execute Workflow**」时在输入数据中传入一条数据:`{"url": "https://v.douyin.com/xxx", "download": true}`。
### 4. 结果

View File

@@ -27,10 +27,12 @@ MOBILE_UA = (
def parse_url_to_aweme_id(url: str) -> str | None:
"""从抖音链接提取 aweme_id"""
"""从抖音链接提取 aweme_id(支持 /video/ID 与 jingxuan?modal_id=ID"""
url = url.strip()
# 完整链接可直接提取
m = re.search(r"/video/(\d+)", url)
if m:
return m.group(1)
m = re.search(r"modal_id=(\d+)", url)
if m:
return m.group(1)
return None
@@ -39,10 +41,16 @@ def parse_url_to_aweme_id(url: str) -> str | None:
def fetch_and_parse(url: str) -> tuple[dict, str | None]:
"""
请求视频页面,解析 ID、文案、视频 URL。
支持短链 v.douyin.com完整链接。
支持短链 v.douyin.com完整链接、精选页 jingxuan?modal_id=ID
返回 (info_dict, video_url)
"""
url = url.strip()
initial_url = url # 保留原始链接,用于回退提取 aweme_id
# 精选页 jingxuan?modal_id= 转为 /video/ID 再请求
if "jingxuan" in url and "modal_id=" in url:
aweme = parse_url_to_aweme_id(url)
if aweme:
url = f"https://www.douyin.com/video/{aweme}"
# 短链需先 resolve 到完整链接
if "v.douyin.com" in url:
try:
@@ -62,7 +70,7 @@ def fetch_and_parse(url: str) -> tuple[dict, str | None]:
except Exception as e:
return {"error": str(e), "aweme_id": None}, None
aweme_id = parse_url_to_aweme_id(url)
aweme_id = parse_url_to_aweme_id(url) or parse_url_to_aweme_id(initial_url)
info = {
"aweme_id": aweme_id or "unknown",
"video_id": None,
@@ -83,6 +91,8 @@ def fetch_and_parse(url: str) -> tuple[dict, str | None]:
m = re.search(pattern, html)
if m:
info[key] = m.group(1)
if info.get("aweme_id") == "unknown" and parse_url_to_aweme_id(initial_url):
info["aweme_id"] = parse_url_to_aweme_id(initial_url)
# 2. 从 ROUTER_DATA 提取视频 URL优先避免拿到封面图
router = re.search(r"window\._ROUTER_DATA\s*=\s*(\{.*?\});?\s*</script>", html, re.DOTALL)

View File

@@ -221,3 +221,4 @@
| 2026-03-03 22:01:54 | 🔄 卡若AI 同步 2026-03-03 22:01 | 更新Cursor规则、金仓、水溪整理归档、卡木、总索引与入口、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-04 11:48:54 | 🔄 卡若AI 同步 2026-03-04 11:48 | 更新:水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-04 17:03:17 | 🔄 卡若AI 同步 2026-03-04 17:03 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-04 17:09:09 | 🔄 卡若AI 同步 2026-03-04 17:09 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 |

View File

@@ -224,3 +224,4 @@
| 2026-03-03 22:01:54 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-03 22:01 | 更新Cursor规则、金仓、水溪整理归档、卡木、总索引与入口、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-04 11:48:54 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-04 11:48 | 更新:水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-04 17:03:17 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-04 17:03 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-04 17:09:09 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-04 17:09 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |