publishport-opencli 1.0.36 → 1.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import{cli as f,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentError as d,CommandExecutionError as r}from"@jackwener/opencli/errors";import{browserFetch as l}from"./_shared/browser-fetch.js";import{requireObjectEvaluateResult as _}from"./_shared/evaluate-result.js";const g="https://creator.douyin.com/creator-micro/content/manage",m="/janus/douyin/creator/pc/work_list?status=0&count=20&max_cursor=0&scene=star_atlas&device_platform=android&aid=1128";function y(e){const n=String(e??"").trim();if(!n)throw new d("douyin delete aweme_id cannot be empty");if(!/^\d+$/.test(n))throw new d("douyin delete aweme_id must be a numeric id");return n}function s(e){return new Promise((n)=>setTimeout(n,e))}async function h(e,n){await e.goto(g);await s(3000);await s(3000);const t=_(await e.evaluate(`
1
+ import{cli as f,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentError as d,CommandExecutionError as r}from"@jackwener/opencli/errors";import{browserFetch as l}from"./_shared/browser-fetch.js";import{requireObjectEvaluateResult as _}from"./_shared/evaluate-result.js";const g="https://creator.douyin.com/creator-micro/content/manage",c="/janus/douyin/creator/pc/work_list?status=0&count=20&max_cursor=0&scene=star_atlas&device_platform=android&aid=1128";function y(e){const n=String(e??"").trim();if(!n)throw new d("douyin delete aweme_id cannot be empty");if(!/^\d+$/.test(n))throw new d("douyin delete aweme_id must be a numeric id");return n}function s(e){return new Promise((n)=>setTimeout(n,e))}async function h(e,n){await e.goto(g);await s(3000);await s(3000);const t=_(await e.evaluate(`
2
2
  (async () => {
3
3
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
4
4
  const targetId = ${JSON.stringify(String(n))};
@@ -6,7 +6,7 @@ import{cli as f,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentE
6
6
  const normalize = (value) => String(value || '').replace(/\\s+/g, ' ').trim();
7
7
 
8
8
  async function loadTarget() {
9
- const res = await fetch(${JSON.stringify(m)}, { credentials: 'include' });
9
+ const res = await fetch(${JSON.stringify(c)}, { credentials: 'include' });
10
10
  const payload = await res.json();
11
11
  const list = Array.isArray(payload.aweme_list) ? payload.aweme_list : [];
12
12
  const matches = list
@@ -27,7 +27,8 @@ import{cli as f,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentE
27
27
  const candidates = Array.from(document.querySelectorAll('[class*="video-card"]'))
28
28
  .filter((element) => {
29
29
  const text = normalize(textOf(element));
30
- return text.includes('删除作品') && text.includes('继续编辑');
30
+ // 卡片上的编辑按钮 2026-10 起叫「编辑作品」,旧版叫「继续编辑」
31
+ return text.includes('删除作品') && (text.includes('编辑作品') || text.includes('继续编辑'));
31
32
  });
32
33
  return candidates.filter((candidate) => !candidates.some((other) => other !== candidate && other.contains(candidate)));
33
34
  }
@@ -73,4 +74,4 @@ import{cli as f,Strategy as w}from"@jackwener/opencli/registry";import{ArgumentE
73
74
  }
74
75
  return { ok: false, reason: 'card_not_found', aweme_id: target.item.aweme_id, item_id: target.item.item_id, index: target.index, listCount: target.listCount };
75
76
  })()
76
- `),"抖音后台管理删除响应异常");if(!t?.ok)throw new r(`抖音后台管理删除失败: ${JSON.stringify(t)}`);return t}async function c(e,n){const t=await l(e,"GET",`https://creator.douyin.com${m}`,{timeoutMs:8000}),a=t.data?.work_list??t.aweme_list??t.work_list??[];if(!Array.isArray(a))throw new r("抖音作品列表响应缺少 work_list/aweme_list");return a.find((o)=>String(o.aweme_id||"")===n||String(o.item_id||"")===n)||null}f({site:"douyin",name:"delete",access:"write",description:"删除作品(优先使用创作者后台作品管理;找不到时回退到旧删除接口)",domain:"creator.douyin.com",strategy:w.COOKIE,siteSession:"persistent",args:[{name:"aweme_id",required:!0,positional:!0,help:"作品 ID / item_id"}],columns:["status"],func:async(e,n)=>{const t=y(n.aweme_id);try{return[{status:`✅ 已通过后台管理删除 ${(await h(e,t)).aweme_id||t}`}]}catch(i){if(!(i instanceof Error?i.message:String(i)).includes('"reason":"not_found"'))throw i}if(!await c(e,t))throw new r(`抖音作品 ${t} 未在作品列表中找到,未执行删除`);await l(e,"POST","https://creator.douyin.com/web/api/media/aweme/delete/?aid=1128",{body:{aweme_id:t},timeoutMs:8000});const u=Date.now()+1e4;while(Date.now()<u){await s(500);if(!await c(e,t))return[{status:`✅ 已删除 ${t}`}]}throw new r(`抖音作品 ${t} 删除后仍在作品列表中,删除未确认`)}});
77
+ `),"抖音后台管理删除响应异常");if(!t?.ok)throw new r(`抖音后台管理删除失败: ${JSON.stringify(t)}`);return t}async function m(e,n){const t=await l(e,"GET",`https://creator.douyin.com${c}`,{timeoutMs:8000}),a=t.data?.work_list??t.aweme_list??t.work_list??[];if(!Array.isArray(a))throw new r("抖音作品列表响应缺少 work_list/aweme_list");return a.find((o)=>String(o.aweme_id||"")===n||String(o.item_id||"")===n)||null}f({site:"douyin",name:"delete",access:"write",description:"删除作品(优先使用创作者后台作品管理;找不到时回退到旧删除接口)",domain:"creator.douyin.com",strategy:w.COOKIE,siteSession:"persistent",args:[{name:"aweme_id",required:!0,positional:!0,help:"作品 ID / item_id"}],columns:["status"],func:async(e,n)=>{const t=y(n.aweme_id);try{return[{status:`✅ 已通过后台管理删除 ${(await h(e,t)).aweme_id||t}`}]}catch(i){if(!(i instanceof Error?i.message:String(i)).includes('"reason":"not_found"'))throw i}if(!await m(e,t))throw new r(`抖音作品 ${t} 未在作品列表中找到,未执行删除`);await l(e,"POST","https://creator.douyin.com/web/api/media/aweme/delete/?aid=1128",{body:{aweme_id:t},timeoutMs:8000});const u=Date.now()+1e4;while(Date.now()<u){await s(500);if(!await m(e,t))return[{status:`✅ 已删除 ${t}`}]}throw new r(`抖音作品 ${t} 删除后仍在作品列表中,删除未确认`)}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "publishport-opencli",
3
- "version": "1.0.36",
3
+ "version": "1.0.37",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "provenance": false