@iducky/media-agent 1.1.0
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.
- package/README.md +90 -0
- package/SHA256SUMS +94 -0
- package/bin/media-agent.mjs +89 -0
- package/docs/guides/capabilities.md +103 -0
- package/docs/guides/image-text-publishing.md +81 -0
- package/docs/guides/installation.md +103 -0
- package/docs/guides/runtime.md +13 -0
- package/manifest.json +382 -0
- package/package.json +42 -0
- package/pyproject.toml +20 -0
- package/resources/capabilities.json +34 -0
- package/resources/configs/accounts.yaml +21 -0
- package/resources/configs/profile.template.json +20 -0
- package/resources/configs/ranking-profiles.yaml +21 -0
- package/resources/configs/toutiao-profile.template.json +22 -0
- package/resources/configs/xiaohongshu-profile.template.json +27 -0
- package/resources/data/industry-taxonomy.yaml +326 -0
- package/skills/douyin-competitor-collect/SKILL.md +177 -0
- package/skills/douyin-competitor-collect/agents/openai.yaml +4 -0
- package/skills/douyin-competitor-collect/references/output-schema.md +178 -0
- package/skills/douyin-creator-image-text-publish/SKILL.md +44 -0
- package/skills/douyin-creator-image-text-publish/agents/openai.yaml +4 -0
- package/skills/douyin-creator-image-text-publish/references/LICENSE.social-auto-upload +21 -0
- package/skills/douyin-creator-image-text-publish/references/execution-contract.md +46 -0
- package/skills/douyin-creator-image-text-publish/references/upstream.md +30 -0
- package/skills/douyin-creator-index/SKILL.md +32 -0
- package/skills/douyin-creator-index/agents/openai.yaml +4 -0
- package/skills/douyin-creator-login/SKILL.md +58 -0
- package/skills/douyin-creator-login/agents/openai.yaml +4 -0
- package/skills/douyin-creator-publish/SKILL.md +56 -0
- package/skills/douyin-creator-publish/agents/openai.yaml +4 -0
- package/skills/douyin-enterprise-leads/SKILL.md +26 -0
- package/skills/douyin-enterprise-leads/agents/openai.yaml +4 -0
- package/skills/douyin-enterprise-leads-login/SKILL.md +36 -0
- package/skills/douyin-enterprise-leads-login/agents/openai.yaml +4 -0
- package/skills/douyin-enterprise-short-video-export/SKILL.md +29 -0
- package/skills/douyin-enterprise-short-video-export/agents/openai.yaml +4 -0
- package/skills/douyin-enterprise-video-rankings/SKILL.md +51 -0
- package/skills/douyin-enterprise-video-rankings/agents/openai.yaml +4 -0
- package/skills/douyin-enterprise-video-rankings/references/industry-taxonomy.md +29 -0
- package/skills/douyin-web-login/SKILL.md +102 -0
- package/skills/douyin-web-login/agents/openai.yaml +4 -0
- package/skills/toutiao-creator-article-draft/SKILL.md +154 -0
- package/skills/toutiao-creator-article-draft/agents/openai.yaml +4 -0
- package/skills/toutiao-web-login/SKILL.md +96 -0
- package/skills/toutiao-web-login/agents/openai.yaml +4 -0
- package/skills/xiaohongshu-creator-image-text-publish/SKILL.md +46 -0
- package/skills/xiaohongshu-creator-image-text-publish/agents/openai.yaml +4 -0
- package/skills/xiaohongshu-creator-image-text-publish/references/LICENSE.social-auto-upload +21 -0
- package/skills/xiaohongshu-creator-image-text-publish/references/execution-contract.md +46 -0
- package/skills/xiaohongshu-creator-image-text-publish/references/upstream.md +31 -0
- package/skills/xiaohongshu-creator-login/SKILL.md +106 -0
- package/skills/xiaohongshu-creator-login/agents/openai.yaml +4 -0
- package/skills/xiaohongshu-creator-publish/SKILL.md +153 -0
- package/skills/xiaohongshu-creator-publish/agents/openai.yaml +4 -0
- package/src/media_agent/__init__.py +1 -0
- package/src/media_agent/cli.py +28 -0
- package/src/media_agent/commands.sh +436 -0
- package/src/media_agent/platforms/__init__.py +1 -0
- package/src/media_agent/platforms/douyin/__init__.py +1 -0
- package/src/media_agent/platforms/douyin/check_login.py +196 -0
- package/src/media_agent/platforms/douyin/collect_industry_taxonomy.py +184 -0
- package/src/media_agent/platforms/douyin/collect_video_rankings.py +352 -0
- package/src/media_agent/platforms/douyin/douyin_full_login.py +391 -0
- package/src/media_agent/platforms/douyin/douyin_hotspot_v2.py +454 -0
- package/src/media_agent/platforms/douyin/douyin_publish.py +1135 -0
- package/src/media_agent/platforms/douyin/enterprise_login.py +128 -0
- package/src/media_agent/platforms/douyin/export_short_video.py +70 -0
- package/src/media_agent/platforms/douyin/login_controller.py +508 -0
- package/src/media_agent/platforms/douyin/validate_industry_taxonomy.py +152 -0
- package/src/media_agent/platforms/douyin/validate_rankings.py +254 -0
- package/src/media_agent/platforms/toutiao/__init__.py +1 -0
- package/src/media_agent/platforms/toutiao/toutiao_check_login.py +54 -0
- package/src/media_agent/platforms/toutiao/toutiao_login_controller.py +250 -0
- package/src/media_agent/platforms/toutiao/toutiao_login_evidence.py +50 -0
- package/src/media_agent/platforms/toutiao/toutiao_login_ipc.py +70 -0
- package/src/media_agent/platforms/xiaohongshu/__init__.py +1 -0
- package/src/media_agent/platforms/xiaohongshu/xiaohongshu_check_login.py +189 -0
- package/src/media_agent/platforms/xiaohongshu/xiaohongshu_login_controller.py +449 -0
- package/src/media_agent/platforms/xiaohongshu/xiaohongshu_login_evidence.py +64 -0
- package/src/media_agent/platforms/xiaohongshu/xiaohongshu_login_ipc.py +120 -0
- package/src/media_agent/platforms/xiaohongshu/xiaohongshu_publish.py +925 -0
- package/src/media_agent/runtime/__init__.py +1 -0
- package/src/media_agent/runtime/account_manager.py +672 -0
- package/src/media_agent/runtime/browser.py +5 -0
- package/src/media_agent/runtime/paths.py +7 -0
- package/src/media_agent/script_map.json +23 -0
- package/src/node/config.mjs +48 -0
- package/src/node/integrity.mjs +34 -0
- package/src/node/skills.mjs +85 -0
- package/tools/archive_releases.py +83 -0
- package/tools/artifacts.py +56 -0
- package/tools/build_release.py +82 -0
- package/tools/check_catalog.py +23 -0
- package/tools/install_runtime.py +144 -0
- package/tools/run_tests.py +21 -0
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Media Agent Capabilities
|
|
2
|
+
|
|
3
|
+
面向 Agent 的社交媒体 Skills 与可见浏览器执行代码。Python 实现保留,npm 提供安装入口;账号登录态和任务数据独立存放。
|
|
4
|
+
|
|
5
|
+
## 当前状态
|
|
6
|
+
|
|
7
|
+
- 版本:`1.1.0`;npm 包:`@iducky/media-agent`。
|
|
8
|
+
- 15 个 Skill:覆盖既有抖音、小红书、头条能力;行业分类已合并到企业号视频榜单。
|
|
9
|
+
- 新增抖音、小红书图文 Skill:Agent 使用现有可见持久化浏览器,仅发布提供的图片与成稿,不使用第三方 MCP,不生成素材。
|
|
10
|
+
- 图文能力仍为 `ADAPTED_UNVERIFIED`;小红书视频 CLI 的在线待验收状态不因重构改变。
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
从 npm 安装指定版本:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @iducky/media-agent@1.1.0
|
|
18
|
+
media-agent skills install --target /absolute/agent/skills
|
|
19
|
+
media-agent setup
|
|
20
|
+
media-agent doctor
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
也可从源码构建 npm 制品并本地安装:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
python3 tools/build_release.py --output dist
|
|
27
|
+
npm install -g ./dist/iducky-media-agent-1.1.0.tgz
|
|
28
|
+
media-agent skills install --target /absolute/agent/skills --dry-run
|
|
29
|
+
media-agent skills install --target /absolute/agent/skills
|
|
30
|
+
media-agent setup
|
|
31
|
+
media-agent doctor
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Node.js >=18;仅安装 Skill 无需 Python。运行 Python 能力需要 Python >=3.9;setup 显式安装依赖。支持 macOS/Linux。使用 `npm view @iducky/media-agent version` 查询 registry 中的最新版本。
|
|
35
|
+
|
|
36
|
+
[全部文档导航](docs/README.md) · [安装、升级与回滚](docs/guides/installation.md) · [Agent 与运行时边界](docs/guides/runtime.md) · [图文发布说明](docs/guides/image-text-publishing.md)
|
|
37
|
+
|
|
38
|
+
## 目录
|
|
39
|
+
|
|
40
|
+
```text
|
|
41
|
+
bin/ media-agent 唯一公开命令入口
|
|
42
|
+
src/node/ Skill 安装、配置迁移与校验
|
|
43
|
+
src/media_agent/ Python CLI、公共 runtime、各平台实现
|
|
44
|
+
skills/ Agent Skills、元数据和参考资料
|
|
45
|
+
resources/ 配置模板、静态数据、capabilities.json 清单
|
|
46
|
+
tools/ 源码构建、安装、校验与历史制品迁移
|
|
47
|
+
tests/ 离线行为与安装契约测试
|
|
48
|
+
docs/ 指南、设计、原型、历史记录及发行索引
|
|
49
|
+
dist/ 临时构建产物(不入 Git)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
运行数据默认仍为 `~/.media-agent/social-accounts`,可通过 `--home` 或 `MEDIA_AGENT_HOME` 指定。代码保存在其中的 `.app/`,Python 环境为 `.venv/`;已有账号配置、浏览器 Profile 和任务记录升级时不覆盖。
|
|
53
|
+
|
|
54
|
+
## Skill 总览
|
|
55
|
+
|
|
56
|
+
| 平台 | Skill | 用途 | 明确边界 |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| 抖音 Creator | `douyin-creator-login` | Creator 二维码登录、短信二次验证、状态检查、正常关闭写盘和同 Profile 重启验收 | 不发布、不采集 |
|
|
59
|
+
| 抖音 Creator | `douyin-creator-publish` | 视频上传、字段填写、去重、人工确认门禁、单次提交和作品列表核验 | 不替代登录,不自动重复发布 |
|
|
60
|
+
| 抖音 Creator | `douyin-creator-image-text-publish` | 给定图片与成稿的图文准备、单次发布和作品核验;Agent 驱动可见浏览器 | 在线待验收;不生成素材、不使用第三方 MCP |
|
|
61
|
+
| 抖音 Creator | `douyin-creator-index` | 实时热点、飙升热点、排名、热度、趋势和链接采集 | 只读采集 |
|
|
62
|
+
| 抖音主站 | `douyin-web-login` | `douyin.com` 登录固化、二维码交付、账号核验及与 Creator 同账号检查 | 不采集竞品、不互动 |
|
|
63
|
+
| 抖音主站 | `douyin-competitor-collect` | 搜索并人工确认竞品账号,采集主页及前 20 个公开作品和绑定证据 | 不登录、不关注、点赞、评论或私信 |
|
|
64
|
+
| 抖音企业号线索版后台 | `douyin-enterprise-leads` | 线索版任务路由,选择登录、明细导出或行业与榜单流程 | 本身不替代专用子流程 |
|
|
65
|
+
| 抖音企业号线索版后台 | `douyin-enterprise-leads-login` | Leads 站点 OAuth 扫码、登录检查、会话写盘和重启验证 | 不采集或导出业务数据 |
|
|
66
|
+
| 抖音企业号线索版后台 | `douyin-enterprise-short-video-export` | 按日期导出自有短视频明细,等待真实下载并检查 XLSX | 不生成或修改平台数据 |
|
|
67
|
+
| 抖音企业号线索版后台 | `douyin-enterprise-video-rankings` | 查询已有行业、行业分类采集与候选校验;选择行业采集三类榜单 | 只读采集;正式分类基线替换需批准 |
|
|
68
|
+
| 小红书 Creator | `xiaohongshu-creator-login` | 二维码模式切换、扫码等待、登录证据判断和持久化重启验证 | 不发布、编辑或删除笔记 |
|
|
69
|
+
| 小红书 Creator | `xiaohongshu-creator-publish` | MP4/MOV 视频笔记上传、标题填写、单次发布和“笔记管理 → 全部”核验 | 不发布图文笔记、不编辑旧作品 |
|
|
70
|
+
| 小红书 Creator | `xiaohongshu-creator-image-text-publish` | 给定图片与成稿的图文准备、单次发布和笔记核验;Agent 驱动可见浏览器 | 在线待验收;不生成素材、不使用第三方 MCP |
|
|
71
|
+
| 今日头条 | `toutiao-web-login` | 头条主站二维码登录、可见账号核验和同 Profile 重启免扫码验证 | 不发布、评论、点赞或采集 |
|
|
72
|
+
| 今日头条 | `toutiao-creator-article-draft` | 新建图文文章、免费正版配图、单图封面、自动保存和草稿箱核验 | 不发布、不删除;修改旧稿必须明确目标 |
|
|
73
|
+
|
|
74
|
+
## 开发与发布
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm test
|
|
78
|
+
python3 tools/check_catalog.py
|
|
79
|
+
python3 tools/build_release.py --output dist
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
源码直接生成 npm 包与可选离线包,历史压缩包不作为构建输入。历史资产移至 [GitHub Releases](https://github.com/myducky/MediaAgentCapabilities/releases),索引见 [docs/releases/index.json](docs/releases/index.json)。完整迁移包只在需要时生成,不保存在源码仓库。
|
|
83
|
+
|
|
84
|
+
[构建与发布约定](docs/development/releasing.md) · [重构设计](docs/development/structure-refactor.md) · [能力与验收状态](docs/guides/capabilities.md)
|
|
85
|
+
|
|
86
|
+
## 账号与发布边界
|
|
87
|
+
|
|
88
|
+
每个真实账号复用独立持久化 Profile、固定指纹和唯一锁;不得跨账号复制 Cookie 或共享浏览器数据。登录需读取真实页面证据。发布区分准备、授权、提交和结果核验;点击成功或成功页不等于作品最终发布。结果不确定时不自动重发。
|
|
89
|
+
|
|
90
|
+
仓库与分发包不包含浏览器登录态、凭据、截图、日志、锁或任务输出。
|
package/SHA256SUMS
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
f9e5f92209a3a5b0fd65e17322bf6d363c9335b993125be66e959fc24803632d README.md
|
|
2
|
+
4ff69bc7c27219ea2760afe95ae58379721d8637d564fb6efbb550e1a687ddfa bin/media-agent.mjs
|
|
3
|
+
d58f69e08ac99fbf4651a343bf768071d2c0e0aaf966e7bc9f3d056cc71379d6 docs/guides/capabilities.md
|
|
4
|
+
b50e649c04ef4a22f4988604b6f5cef091c0671aaa183e52e782e955e323222b docs/guides/image-text-publishing.md
|
|
5
|
+
0929fcc2eddb0fc0e2d21291b564e3fab239a36895fe702b7e4ff4ddb771332b docs/guides/installation.md
|
|
6
|
+
42f137161763150ccff3c027908b3f33732dfccba2d8e754451a418bcf33c134 docs/guides/runtime.md
|
|
7
|
+
4a2489155e77bb1d5227259c2707678f6541a6fa7aa861884d38ef0faa7a5b4e package.json
|
|
8
|
+
70de33ef9e8436793e7f17df42a48ac5920ed015a76ab9ba21ff43484953b617 pyproject.toml
|
|
9
|
+
7a44ed8bdc9b0dc3e1b2b4951eae4f2c2e48a6c6de3c38d614ba874c4cbb98ea resources/capabilities.json
|
|
10
|
+
991295ddb6cb6e566f7b61625b7cc4b27e9c48bbe2174ccc4b8f7924b3174a54 resources/configs/accounts.yaml
|
|
11
|
+
23d019759870d3919e2c095f3e92061d4c7bb21ab8e563366a808c1d94e5bb17 resources/configs/profile.template.json
|
|
12
|
+
1d022c8432540d54f7721cc31cc8bfe4bcf5c221769bed231026600fe93fd274 resources/configs/ranking-profiles.yaml
|
|
13
|
+
6710b0acb168e26a3b5c20cb26b61e7b7a1cc8bb74463c39598f1a99fe9bdc22 resources/configs/toutiao-profile.template.json
|
|
14
|
+
6f543e9cb6cfdde0ad604b822b766b11696e6422450c3aaf25af55cb58483c6d resources/configs/xiaohongshu-profile.template.json
|
|
15
|
+
be7272317ab8351f2d1f2aef391650c7f4d01f5f00222dcc3b630c2e675dd55b resources/data/industry-taxonomy.yaml
|
|
16
|
+
dc34e9b3009f2b24daca47ee236a8d35688e4f1b260d90d1b4de16e1864386af skills/douyin-competitor-collect/SKILL.md
|
|
17
|
+
f7a4cfbc59453fca88cfa4d22a15929ab364e2d14d9ca7e1d3b574ee5d164c1d skills/douyin-competitor-collect/agents/openai.yaml
|
|
18
|
+
cfe24a8f44b11c5e894ccd19b730fdbc884301c2be7a6ea49fb8b39ceb8beea9 skills/douyin-competitor-collect/references/output-schema.md
|
|
19
|
+
46bab28ed8b525985a1cb55db3f92793cbbf278f1488eb18d29fe624225d2859 skills/douyin-creator-image-text-publish/SKILL.md
|
|
20
|
+
1ab44a0ba4bd89e75b5a983257d5961df2b5e805bc04db7d4c49c18f2931280e skills/douyin-creator-image-text-publish/agents/openai.yaml
|
|
21
|
+
8fd1171ac198090942b3e7f15887ec682cf010227e7afe74ee97f57351fd9f36 skills/douyin-creator-image-text-publish/references/LICENSE.social-auto-upload
|
|
22
|
+
3b4100deb63efccbd771aa200f912d2c88d2b4996712bb1b412ffd1ec061988b skills/douyin-creator-image-text-publish/references/execution-contract.md
|
|
23
|
+
050128427ee874f5b4fede8e048cc2bd737e97f4983eda1a8481bf9c6a7eb04b skills/douyin-creator-image-text-publish/references/upstream.md
|
|
24
|
+
396d4426a1e91582636b56b82ef1731e44020e6d5d65cf205c352025bd410c5a skills/douyin-creator-index/SKILL.md
|
|
25
|
+
73648aa2c38b4fed46950e00d5726f1c85c632ff32ad9dc471ff72a244c9f5d3 skills/douyin-creator-index/agents/openai.yaml
|
|
26
|
+
c0d6bfbc5c1b8ecfc28cf5c37645948c4ae3c5c3ce801b0d02b64cac0c6e16d6 skills/douyin-creator-login/SKILL.md
|
|
27
|
+
a4454ea33c2717c75240c6761dbdf563782a456dca4da9419d00c5e8f041160a skills/douyin-creator-login/agents/openai.yaml
|
|
28
|
+
9405109644e4b1171706844f22ef2142c9ff888e13b423d38f3175558d72e790 skills/douyin-creator-publish/SKILL.md
|
|
29
|
+
a901c8b4704aa328a2afdb5b5f2223d5bbe6355fe80984e5c6cb203d109be075 skills/douyin-creator-publish/agents/openai.yaml
|
|
30
|
+
dede04df0a162404ca96bd8cf10ec0495d746b3ede5a0160e26b3dd67712a33c skills/douyin-enterprise-leads-login/SKILL.md
|
|
31
|
+
76a7a8a2537b01b28bd131ecef7c878457678247a76e508475e234198b391bdd skills/douyin-enterprise-leads-login/agents/openai.yaml
|
|
32
|
+
8b7b4a1f6969b729929fb7fae8a4d3dd1e039cb17251c7c397d7ac615ffff6e0 skills/douyin-enterprise-leads/SKILL.md
|
|
33
|
+
ccfdc00953377bac4ba4f91f58a1747b25791a44054b04ad76e8925f95806f12 skills/douyin-enterprise-leads/agents/openai.yaml
|
|
34
|
+
e12142fdb89381e1cd10adebe4023c9a890ea8ffca3b1502b8048fc2a605f6a5 skills/douyin-enterprise-short-video-export/SKILL.md
|
|
35
|
+
bad374a6c819bf02c0d60d6cd42670384dd9bc5acce25930d4c5d3238001f4d3 skills/douyin-enterprise-short-video-export/agents/openai.yaml
|
|
36
|
+
ae64dff3805efba2697483511d8cd81c4c8f52e3b48e7483fcaaff8535952414 skills/douyin-enterprise-video-rankings/SKILL.md
|
|
37
|
+
80e56219c96f392e8ea6bcfd07b85290905df034db8f4c9abe49c3f12972eefa skills/douyin-enterprise-video-rankings/agents/openai.yaml
|
|
38
|
+
fb7193750db29be9f8cc93e21c53ed4753fde27b8424029057852fa1db8ef0b7 skills/douyin-enterprise-video-rankings/references/industry-taxonomy.md
|
|
39
|
+
a419f42a677e55f8dc1da46419a5b73c87deb716f87e05d311294133b754a936 skills/douyin-web-login/SKILL.md
|
|
40
|
+
0c23bc49afbdd841406114550b6704537f7986633098b9f3bda91a461c6ca1eb skills/douyin-web-login/agents/openai.yaml
|
|
41
|
+
4e7e781075c38aaad188aaef3020b8ed54581b52732b290967e7d366b5700f7e skills/toutiao-creator-article-draft/SKILL.md
|
|
42
|
+
0d20697da32bbe8c2fa86339eb12ebd7ace9c8d9ba146c888a40ee221422adeb skills/toutiao-creator-article-draft/agents/openai.yaml
|
|
43
|
+
5f64e05de1c6361f6883dc9a39da5595e3b7c822dc89cde2d7702747e0d0f42e skills/toutiao-web-login/SKILL.md
|
|
44
|
+
7ae9230957f23c00697e5c4c76e96ad9ee54a2ff5166f2a69c6088ff37daa0b2 skills/toutiao-web-login/agents/openai.yaml
|
|
45
|
+
63f33f028801f422e4c600ccfd557c01cc145019dad8fd7b7e881fcc74992589 skills/xiaohongshu-creator-image-text-publish/SKILL.md
|
|
46
|
+
8aff8a3bde85576de68848158216411f925a58eb0d3fb15668a536b0f3164ffe skills/xiaohongshu-creator-image-text-publish/agents/openai.yaml
|
|
47
|
+
8fd1171ac198090942b3e7f15887ec682cf010227e7afe74ee97f57351fd9f36 skills/xiaohongshu-creator-image-text-publish/references/LICENSE.social-auto-upload
|
|
48
|
+
3b4100deb63efccbd771aa200f912d2c88d2b4996712bb1b412ffd1ec061988b skills/xiaohongshu-creator-image-text-publish/references/execution-contract.md
|
|
49
|
+
52b36451770166681e7b10f8c73bcf6a85334da5366c9122ac45b7fa117823c8 skills/xiaohongshu-creator-image-text-publish/references/upstream.md
|
|
50
|
+
871fe010e8d2f419b172a10b3ec6ab15b851d1f8c799b14220a10e520b7709e2 skills/xiaohongshu-creator-login/SKILL.md
|
|
51
|
+
ef3c4c9cba3b079f26a0a676b55b195ff39a114f66757f992986f08aba2a841f skills/xiaohongshu-creator-login/agents/openai.yaml
|
|
52
|
+
9a738ef1cd78204b518e57eff377e163fb4acd058e24f446e5f4d136860acdff skills/xiaohongshu-creator-publish/SKILL.md
|
|
53
|
+
a75940ca97d7b641c32dde6962edf437fb3312dc8374f039922d72edc977df64 skills/xiaohongshu-creator-publish/agents/openai.yaml
|
|
54
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/__init__.py
|
|
55
|
+
5d8cdfae8a77d37cde70737f4b8ac8ad850330cf75512184cfcafc7dab9f2346 src/media_agent/cli.py
|
|
56
|
+
b0a8cbd3ad0ba993984bac0d6e9314ad92429be6e9edc5133321c6584c52a3e0 src/media_agent/commands.sh
|
|
57
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/platforms/__init__.py
|
|
58
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/platforms/douyin/__init__.py
|
|
59
|
+
b73756a197b70c81aa1a62c88c138318e5504c783e0e4bcfa5de7ac33536392c src/media_agent/platforms/douyin/check_login.py
|
|
60
|
+
9d91d831760579f5e0cf2f6b413fdd917f14f46081aff4fb221f681bf281c704 src/media_agent/platforms/douyin/collect_industry_taxonomy.py
|
|
61
|
+
d117921fd6a4c313ce359f40a13bcf719f0379fc7bf20eea7d8095bf5de4280a src/media_agent/platforms/douyin/collect_video_rankings.py
|
|
62
|
+
a0ec4757b9c95099527b1300b5b3d26d477263b34f53d6d32af002b0879eab36 src/media_agent/platforms/douyin/douyin_full_login.py
|
|
63
|
+
0afe2f18db2b7a31ea91161a055a07d91a74561f61f600e4785b3baa13316acd src/media_agent/platforms/douyin/douyin_hotspot_v2.py
|
|
64
|
+
1e0d9edacbb09c103b350d9d6227868787f0ea7fdade30f5dc301b0ba8424e84 src/media_agent/platforms/douyin/douyin_publish.py
|
|
65
|
+
ddb90725b49a4b60dc1fb95e31e1b02835320a3081431bd5d113954acdfe1ac7 src/media_agent/platforms/douyin/enterprise_login.py
|
|
66
|
+
cd5e317d37ac3764a170b0706bbdeea21fc008e5e802a706023288c0f0567534 src/media_agent/platforms/douyin/export_short_video.py
|
|
67
|
+
497a8521227d20d8fc26177345c5205a44b7f53a13ccb2ec88f3249903ddb5c4 src/media_agent/platforms/douyin/login_controller.py
|
|
68
|
+
61f1a546118e982a26235dcda31a4414838f2c3c0b777254b2509a364e5a5ced src/media_agent/platforms/douyin/validate_industry_taxonomy.py
|
|
69
|
+
2086fe809679e589ee377a8aeff42b153a83beaff4ff84b911f4a4c999d3d91f src/media_agent/platforms/douyin/validate_rankings.py
|
|
70
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/platforms/toutiao/__init__.py
|
|
71
|
+
a5db04d0ab4a22e04ce09b96dcba5f98bcccbd4a83400426b9b9f81df47a2fcc src/media_agent/platforms/toutiao/toutiao_check_login.py
|
|
72
|
+
8b8d831ede6731b1ec930c6073705c57e2f0039be37ec658b660bcda5c84c649 src/media_agent/platforms/toutiao/toutiao_login_controller.py
|
|
73
|
+
346b0ed29c9def46945a3650e82c5a71f33c21947823912c981c483a4cd9406d src/media_agent/platforms/toutiao/toutiao_login_evidence.py
|
|
74
|
+
22c4599c5a91bba2a5c828aabc2d358908d1992b19f7377b672cfbb4f4cecf7f src/media_agent/platforms/toutiao/toutiao_login_ipc.py
|
|
75
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/platforms/xiaohongshu/__init__.py
|
|
76
|
+
f03b1b3c2439cb638cdb7c6a338c8496c2690dd15198c0c9126b29074f21a48e src/media_agent/platforms/xiaohongshu/xiaohongshu_check_login.py
|
|
77
|
+
dedad1bdc99a55698afd1e7822becddf0cd54c0d3ed47e28725a0c10e4929584 src/media_agent/platforms/xiaohongshu/xiaohongshu_login_controller.py
|
|
78
|
+
6cec01b64f18c1786fe056d62972cfcda8f5e265b6505b5d248474838981aeb7 src/media_agent/platforms/xiaohongshu/xiaohongshu_login_evidence.py
|
|
79
|
+
0a97a6c5db896a6272bd392d92b3853e9fe0968c689c4aa8cd2d7065044a5777 src/media_agent/platforms/xiaohongshu/xiaohongshu_login_ipc.py
|
|
80
|
+
55883e3891eb83f22021d2b86f69524e05e2972a16c2e7c8464dd4f142f06983 src/media_agent/platforms/xiaohongshu/xiaohongshu_publish.py
|
|
81
|
+
04811b13579095b984b1456bdc429b6b687aca691d478cc596a611391f0ec1a1 src/media_agent/runtime/__init__.py
|
|
82
|
+
d9593fdfe4a03b5a9f1e863a2fa3e4ea0751d8ee9ba565a1fc5dd106951e1014 src/media_agent/runtime/account_manager.py
|
|
83
|
+
48eb9fd61a6a9f9695d6f4a4eab776ee90641bd3ae57b3a5242d4e2e58986e67 src/media_agent/runtime/browser.py
|
|
84
|
+
e9981bf51a388022a82bfe9c5670188c89315e6597788245be74b4eb3559a467 src/media_agent/runtime/paths.py
|
|
85
|
+
c337b61e5a047df1dc9a0080c9ad5b0ffed7c9e82bc382896c6b887a73b25f8a src/media_agent/script_map.json
|
|
86
|
+
a53630d6d172e6ce701e3709cbb54012c447c72f5f372b45931e5e94baf1f243 src/node/config.mjs
|
|
87
|
+
7cef52f29728dba2b8a863cb496a8f95a047f8330ed30fd8e1a91de1f2f78a22 src/node/integrity.mjs
|
|
88
|
+
e2a7f88e2deb75221131a452211e0d5709dba33f5fc9e0e151b809c5fbcc0392 src/node/skills.mjs
|
|
89
|
+
d0cbccf5f5c349eec03bc9410210d7b9895c4fe251679034f9d109cbda0d9624 tools/archive_releases.py
|
|
90
|
+
0e3670b8f22c49eed3b87e7e61a4924edcc832c7ab01c54fd9e67a3767bcca01 tools/artifacts.py
|
|
91
|
+
dbd124c7498f961e854e935d7950aba59a01de58304146669f548b7c083e5e0a tools/build_release.py
|
|
92
|
+
f670d0559a2dcbfebb9baf41b8c211ebdacc6fd2320424374c0ca90571e005df tools/check_catalog.py
|
|
93
|
+
a9ee1ce29581090ed81a7a3c9ca39f8c6f66dd3bd4fdaac3f1e7baa3243a9af2 tools/install_runtime.py
|
|
94
|
+
1f8d3da3ea5c934a00ebe76597b275e1533cebcdf15dacd1c74f7d82c1324a58 tools/run_tests.py
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {fileURLToPath} from 'node:url';
|
|
6
|
+
import {spawnSync} from 'node:child_process';
|
|
7
|
+
import {installSkills,migrateSkills} from '../src/node/skills.mjs';
|
|
8
|
+
import {transferConfig} from '../src/node/config.mjs';
|
|
9
|
+
import {verifyIntegrity} from '../src/node/integrity.mjs';
|
|
10
|
+
|
|
11
|
+
const root=path.dirname(path.dirname(fileURLToPath(import.meta.url)));
|
|
12
|
+
const pkg=JSON.parse(fs.readFileSync(path.join(root,'package.json'),'utf8'));
|
|
13
|
+
let args=process.argv.slice(2);
|
|
14
|
+
function value(args, i) {
|
|
15
|
+
if (!args[i+1] || args[i+1].startsWith('--')) throw new Error(`Value required: ${args[i]}`);
|
|
16
|
+
return args[i+1];
|
|
17
|
+
}
|
|
18
|
+
function expand(p) { return path.resolve(p.startsWith('~/') ? path.join(os.homedir(),p.slice(2)) : p); }
|
|
19
|
+
function run(command, argv, env) {
|
|
20
|
+
const result=spawnSync(command,argv,{stdio:'inherit',env});
|
|
21
|
+
if (result.error) throw new Error(`Cannot start ${command}: ${result.error.message}`);
|
|
22
|
+
return result.status ?? 1;
|
|
23
|
+
}
|
|
24
|
+
function main() {
|
|
25
|
+
let home=expand(process.env.MEDIA_AGENT_HOME || path.join(os.homedir(),'.media-agent/social-accounts'));
|
|
26
|
+
for (let i=0;i<args.length;i++) if(args[i]==='--home') {home=expand(value(args,i)); args.splice(i,2); i--;}
|
|
27
|
+
const [cmd,...rest]=args;
|
|
28
|
+
if (!cmd || ['help','--help','-h'].includes(cmd)) {
|
|
29
|
+
console.log(`media-agent ${pkg.version}\n\nUsage:\n media-agent skills list\n media-agent skills install --target DIR [--skill NAME ...] [--dry-run]\n media-agent setup [--home DIR] [--python PATH] [--dry-run] [--no-deps]\n media-agent doctor [--home DIR]\n media-agent config export|import DIR [--dry-run] [--home DIR]\n media-agent commands\n media-agent <command> [arguments] [--home DIR]\n\nSkill installation and configuration commands need only Node.js. Runtime: Python >=3.9, visible browser.\nBusiness commands: media-agent commands`); return 0;
|
|
30
|
+
}
|
|
31
|
+
if(cmd==='--version') {console.log(pkg.version); return 0;}
|
|
32
|
+
if(cmd==='skills') {
|
|
33
|
+
verifyIntegrity(root);
|
|
34
|
+
const [op,...options]=rest;
|
|
35
|
+
const catalog=JSON.parse(fs.readFileSync(path.join(root,'resources/capabilities.json'),'utf8'));
|
|
36
|
+
if(op==='list' && !options.length) { console.log(catalog.skills.join('\n')); return 0; }
|
|
37
|
+
if(!['install','migrate'].includes(op)) throw new Error('Expected skills list/install');
|
|
38
|
+
let target, dry=false, selected=[];
|
|
39
|
+
for(let i=0;i<options.length;i++) {
|
|
40
|
+
if(options[i]==='--target') {target=expand(value(options,i));i++;}
|
|
41
|
+
else if(options[i]==='--skill') {selected.push(value(options,i));i++;}
|
|
42
|
+
else if(options[i]==='--dry-run') dry=true;
|
|
43
|
+
else throw new Error(`Unknown option: ${options[i]}`);
|
|
44
|
+
}
|
|
45
|
+
if(!target) throw new Error('--target is required');
|
|
46
|
+
if(op==='install') installSkills(root,target,selected,dry);
|
|
47
|
+
else migrateSkills(catalog,target,dry);
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
if(cmd==='config') {
|
|
51
|
+
transferConfig(home,rest); return 0;
|
|
52
|
+
}
|
|
53
|
+
if(cmd==='run-script' || cmd==='run') throw new Error('Unsupported public command; use media-agent commands');
|
|
54
|
+
const python=process.env.MEDIA_AGENT_PYTHON || (fs.existsSync(path.join(home,'.venv/bin/python')) ? path.join(home,'.venv/bin/python') : 'python3');
|
|
55
|
+
const env={...process.env,PYTHONDONTWRITEBYTECODE:'1',MEDIA_AGENT_HOME:home,PYTHONPATH:path.join(root,'src')+(process.env.PYTHONPATH?path.delimiter+process.env.PYTHONPATH:'')};
|
|
56
|
+
if(cmd==='setup') {
|
|
57
|
+
let interpreter=python, opts=[];
|
|
58
|
+
for(let i=0;i<rest.length;i++) {
|
|
59
|
+
if(rest[i]==='--python') {interpreter=value(rest,i);i++;}
|
|
60
|
+
else if(['--dry-run','--no-deps'].includes(rest[i])) opts.push(rest[i]);
|
|
61
|
+
else throw new Error(`Unknown option: ${rest[i]}`);
|
|
62
|
+
}
|
|
63
|
+
return run(interpreter,[path.join(root,'tools/install_runtime.py'),'--target',home,...opts],env);
|
|
64
|
+
}
|
|
65
|
+
if(cmd==='doctor') {
|
|
66
|
+
if(rest.length) throw new Error(`Unknown option: ${rest[0]}`);
|
|
67
|
+
const r=spawnSync(python,['-c',`import importlib.util,json,sys; print(json.dumps({'version':sys.version.split()[0], 'supported':sys.version_info>=(3,9), 'dependencies':{x:importlib.util.find_spec(x) is not None for x in ['yaml','cryptography','cloakbrowser','openpyxl','playwright']}}))`],{encoding:'utf8',env});
|
|
68
|
+
let report;
|
|
69
|
+
try { report=JSON.parse(r.stdout); } catch { report={error:r.error?.message || r.stderr || 'Python unavailable'}; }
|
|
70
|
+
const active=path.join(home,'.app/current');
|
|
71
|
+
let activeVersion=null;
|
|
72
|
+
try { activeVersion=JSON.parse(fs.readFileSync(path.join(active,'package.json'),'utf8')).version; } catch {}
|
|
73
|
+
const ready=Boolean(report.supported && Object.values(report.dependencies||{}).every(Boolean) && activeVersion===pkg.version && fs.existsSync(path.join(active,'src/media_agent/cli.py')));
|
|
74
|
+
console.log(JSON.stringify({version:pkg.version,active_version:activeVersion,active_code:active,runtime_home:home,python,python_status:report,ready},null,2));
|
|
75
|
+
return ready?0:1;
|
|
76
|
+
}
|
|
77
|
+
const active=path.join(home,'.app/current');
|
|
78
|
+
const activeExists=fs.existsSync(active);
|
|
79
|
+
if(!activeExists && fs.existsSync(path.join(home,'.app')) && fs.readdirSync(path.join(home,'.app')).includes('current'))
|
|
80
|
+
throw new Error('Activated runtime is missing; run media-agent setup');
|
|
81
|
+
if(activeExists) {
|
|
82
|
+
if(!fs.existsSync(path.join(active,'src/media_agent/cli.py'))) throw new Error('Activated runtime is incomplete; run media-agent setup');
|
|
83
|
+
env.PYTHONPATH=path.join(fs.realpathSync(active),'src')+(process.env.PYTHONPATH?path.delimiter+process.env.PYTHONPATH:'');
|
|
84
|
+
} else if(pkg.mediaAgentArtifact && cmd!=='commands') {
|
|
85
|
+
throw new Error('Runtime is not installed; run media-agent setup first');
|
|
86
|
+
}
|
|
87
|
+
return run(python,['-m','media_agent.cli',...(cmd==='commands'?['--help']:args)],env);
|
|
88
|
+
}
|
|
89
|
+
try {process.exitCode=main();} catch(error) {console.error(`ERROR: ${error.message}`); process.exitCode=1;}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Media Agent 能力矩阵与部署状态
|
|
2
|
+
|
|
3
|
+
> 更新日期:2026-09-23(Asia/Shanghai)
|
|
4
|
+
> 当前源码:`1.1.0`,15 个 Skill;npm 包名为 `@iducky/media-agent`,亦可从源码构建安装;包的发布不等于已部署到用户真实运行环境。安装方式见[安装指南](installation.md)。
|
|
5
|
+
>
|
|
6
|
+
> 历史 v1.0.1–v1.0.10 制品已迁入 [GitHub Releases](https://github.com/myducky/MediaAgentCapabilities/releases),源码仓库仅保留 `docs/releases/index.json`。v1.0.10 包内仍为 14 个 Skill,不改写历史资产。
|
|
7
|
+
>
|
|
8
|
+
> 部署口径:将选定社交媒体 Skills 安装到业务 Agent 的实际技能目录;Hermes 可使用独立的 `social-media` 业务 Profile。每个真实平台账号仍使用独立社交账号浏览器 Profile,两层 Profile 不应混淆。
|
|
9
|
+
|
|
10
|
+
当前安装与构建测试共 13 个文件、106 个检查/用例通过,不能据此宣称平台流程已在线验收。下表的历史实测记录与当前离线检查分别注明。
|
|
11
|
+
|
|
12
|
+
## 能力覆盖
|
|
13
|
+
|
|
14
|
+
| 能力 | 运行时入口 | Skill | 验证依据与边界 | 源码状态 / 历史来源 |
|
|
15
|
+
| --- | --- | --- | --- | --- |
|
|
16
|
+
| 通用 Profile、固定指纹与 lock | `src/media_agent/runtime/account_manager.py`、配置模板 | 各业务 Skill 共用 | 安装与结构检查 | 已包含 |
|
|
17
|
+
| 抖音 Creator 持久化登录 | `login-*`、`check-login` | `douyin-creator-login` | 登录证据 5/5 | 已包含 |
|
|
18
|
+
| 抖音主站登录与 Creator 同态 | 复用持久化 controller/Profile 的可视浏览器 | `douyin-web-login` | 主站扫码、账号核验、重启固化及 Creator 同 Profile 检查已实测 | v1.0.5 新增 |
|
|
19
|
+
| 抖音竞品公开数据采集 | 主站可视浏览器串行采集 | `douyin-competitor-collect` | 账号与候选双确认、主页前20个响应式网格顺序、Video/Note同卡片取值与不同详情布局、单一完整文案字段、四种零值语义、完成状态一致性、三类证据、相对路径及哈希绑定规则已固化;一叶智能9条与获客宝601前20条基线已验收 | v1.0.5 首次新增;2026-08-07 修订由 v1.0.6 固化 |
|
|
20
|
+
| 抖音 Creator 人工确认发布 | `publish-*`、`src/media_agent/platforms/douyin/douyin_publish.py` | `douyin-creator-publish` | 发布测试 18/18 | 已包含 |
|
|
21
|
+
| 抖音 Creator 图文发布 | Agent 操作现有可见持久化浏览器;无独立图文 CLI | `douyin-creator-image-text-publish` | 来源提取、行为场景审查与安装验证;`ADAPTED_UNVERIFIED`,真实账号待验收 | 1.1.0 源码已包含,未发布 |
|
|
22
|
+
| 抖音 Creator 指数采集 | `collect-douyin-index`、`src/media_agent/platforms/douyin/douyin_hotspot_v2.py` | `douyin-creator-index` | 命令、Skill 与既有运行时保留 | 已包含 |
|
|
23
|
+
| 抖音企业号线索版后台登录 | `check-login --site leads`、`src/media_agent/platforms/douyin/enterprise_login.py` | `douyin-enterprise-leads-login` | 既有登录证据测试 | 已包含 |
|
|
24
|
+
| 抖音企业号线索版短视频明细导出 | `export-short-video` | `douyin-enterprise-short-video-export` | 命令门禁与 dry-run 基线 | 已包含 |
|
|
25
|
+
| 抖音企业号线索版视频榜单 | `collect-video-rankings` | `douyin-enterprise-video-rankings` | 采集器与验证器保留 | 已包含 |
|
|
26
|
+
| 抖音企业号线索版行业分类 | `collect-industry-taxonomy`,作为榜单 Skill 内的显式操作 | `douyin-enterprise-video-rankings` + `references/industry-taxonomy.md` | 保留 9 个一级、110 个二级基线;迁移安装测试 7/7 | 1.1.0 已合并,未发布;v1.0.10 仍使用独立分类 Skill |
|
|
27
|
+
| 抖音企业号线索版能力路由 | 各 Leads 子命令 | `douyin-enterprise-leads` | Skill 结构检查 | 已包含 |
|
|
28
|
+
| 小红书 Creator 持久化登录 | 6 个 `xhs-*` 命令、4 个小红书脚本 | `xiaohongshu-creator-login` | 当前行为与打包检查 13/13;另有运行路径与入口兼容测试 | 已包含 |
|
|
29
|
+
| 小红书 Creator 视频发布 | `xhs-publish-*`、`src/media_agent/platforms/xiaohongshu/xiaohongshu_publish.py`(v1.0.10 新增;浏览器自动化部分 IMPLEMENTED_UNVERIFIED);Agent 驱动可见浏览器仍可用 | `xiaohongshu-creator-publish` | 发布契约测试 16/16;一次真实 MOV 发布及“笔记管理 → 全部”已发布状态核验通过(Agent 驱动路径) | v1.0.10 新增 CLI 并已包含 |
|
|
30
|
+
| 小红书 Creator 图文发布 | Agent 操作现有可见持久化浏览器;无独立图文 CLI | `xiaohongshu-creator-image-text-publish` | 来源提取、行为场景审查与安装验证;`ADAPTED_UNVERIFIED`,真实账号待验收 | 1.1.0 源码已包含,未发布 |
|
|
31
|
+
| 今日头条主站持久化登录 | 复用持久化 controller/Profile 的可视浏览器 | `toutiao-web-login` | 主站扫码、账号核验和同 Profile 重启免扫码已实测 | v1.0.7 新增并已包含 |
|
|
32
|
+
| 今日头条文章草稿 | 复用头条账号可视浏览器;无独立 CLI | `toutiao-creator-article-draft` | 已固化标题正文分区、图片语义、正文与封面独立状态、封面确认、草稿箱验收,以及 v1.0.9 浏览器重开后的操作意图、新建/恢复路由、空白编辑器和跨任务证据隔离 | v1.0.9 修订并已包含 |
|
|
33
|
+
|
|
34
|
+
表中的路径指向 Python 实现。唯一公开命令是 `media-agent`,完整列表见 `media-agent commands`。安装后的规范源码位于 `<MEDIA_AGENT_HOME>/.app/current/src/`;审查参数支持、授权门禁或页面逻辑时应读取真实模块。
|
|
35
|
+
|
|
36
|
+
能力按站点/后台划分;个人号、企业号是账号属性。具备权限的同一企业账号可以在同一浏览器 Profile 中分别使用 Creator 和 Leads 能力,但两个主域的登录状态与业务结果必须独立核验。
|
|
37
|
+
|
|
38
|
+
## 历史版本与验收记录
|
|
39
|
+
|
|
40
|
+
以下版本数量和哈希仅描述对应历史制品,不作为 1.1.0 的安装清单或当前文件校验值。
|
|
41
|
+
|
|
42
|
+
`v1.0.6` 安装 12 个规范化业务 Skill,保留 v1.0.5 运行时并更新竞品采集 Skill、Schema 与文档;不迁移任何登录状态或采集结果。
|
|
43
|
+
|
|
44
|
+
`v1.0.7` 新增 `toutiao-web-login` 并安装 13 个规范化业务 Skill。`v1.0.8` 新增 `toutiao-creator-article-draft`,共安装 14 个规范化业务 Skill;既有 v1.0.7 归档保持不可变。
|
|
45
|
+
|
|
46
|
+
`v1.0.9` 不增加 Skill 数量;它修复飞书新建文章误打开并覆盖旧草稿、复用上一任务图片和证据的问题。新建 action 必须走“创作 → 文章”并验证空标题、空正文、0 张正文图;恢复 action 才可走“管理 → 草稿箱”。v1.0.8 归档保持不可变。
|
|
47
|
+
|
|
48
|
+
`v1.0.10` 不增加 Skill 数量;它为 `xiaohongshu-creator-publish` 新增 `xhs-publish-*` 五阶段 CLI(账本去重、门禁、退出码已经离线契约测试验证;浏览器自动化部分标注 IMPLEMENTED_UNVERIFIED,待 Level 2 在线实测固化),并带入 v1.0.9 之后在工作区完成的 IPC 半关闭竞态修复与既有测试修复。v1.0.9 归档保持不可变。
|
|
49
|
+
|
|
50
|
+
v1.0.4 包内、2026-08-05 实测修订后的项目源文件和远端安装版
|
|
51
|
+
`xiaohongshu-creator-publish/SKILL.md` SHA-256 均为
|
|
52
|
+
`894fd2f7a5e74eac3a2ed5ff0472013a870ccc9584fda06b0611f0b9d814d67a`。
|
|
53
|
+
v1.0.10 历史包中的该 SKILL.md 新增 CLI 命令小节,SHA-256 更新为
|
|
54
|
+
`6dfe2ba1182823a381c9a258fc86794ef56821781882333929b1ab26869dd764`,与 v1.0.4 历史值不再相等。
|
|
55
|
+
|
|
56
|
+
## 明确不包含
|
|
57
|
+
|
|
58
|
+
当前源码分发包和可选离线包不包含:
|
|
59
|
+
|
|
60
|
+
- 任何账号的 `browser_data`、Cookie、token、Local Storage 或登录状态;
|
|
61
|
+
- 二维码、短信验证码、手机号、账号身份数据;
|
|
62
|
+
- 运行截图、日志、Socket、PID、lock、任务输出或发布账本;
|
|
63
|
+
- Hermes 本体、Dashboard、Gateway、模型配置或系统服务;
|
|
64
|
+
- Local Web Console、社交媒体管理数据查看模块、完整访问控制层、SQLite 事件总线、统一 Token 计量、`license.dat` 或跨 Profile Router;这些仍是目标产品架构,不属于 1.1.0 当前实现。社交媒体管理模块的计划页面、字段和状态口径见 `docs/development/social-media-management-data-view-design.md`,`docs/prototypes/social-media-management-overview.html` 仅为模拟数据原型,不代表控制台、接口或数据库已经实现;
|
|
65
|
+
- 尚未完成真实验收的自动审核确认、Leads 同步确认、定时发布结果或 Cron。
|
|
66
|
+
|
|
67
|
+
因此,“能力代码已包含”不等于“目标机器账号已经登录”,也不等于尚未验收的业务结果已经完成。
|
|
68
|
+
|
|
69
|
+
## 远端 Hermes 已知状态
|
|
70
|
+
|
|
71
|
+
以下是 2026-08-04 至 2026-08-06 的历史远端回传结果,不是 2026-08-12 对目标机器执行的 v1.0.9 全量部署证明。可以确认:
|
|
72
|
+
|
|
73
|
+
- 远端保留 v1.0.3 的抖音运行时,并通过抖音回归测试;
|
|
74
|
+
- `xx` Hermes Profile 已安装并加载 `xiaohongshu-creator-login` Skill;
|
|
75
|
+
- 远端工作运行时已加入小红书控制器、检查器和 `xhs-*` 命令;
|
|
76
|
+
- 已完成一次小红书真实扫码登录和同 Profile 重启持久化验收;
|
|
77
|
+
- 已安装并发现修订后的 `xiaohongshu-creator-publish` Skill,SHA-256 与项目源文件一致;
|
|
78
|
+
- 已使用独立持久化 Profile 完成一次真实 MOV 上传、单次发布、成功页确认和“笔记管理 → 全部”核验,目标作品显示“已发布”;
|
|
79
|
+
- 验收结束时浏览器正常关闭且 lock 已释放。
|
|
80
|
+
- 2026-08-06 使用“盟军电子商务”账号 Profile 完成抖音主站登录固化,并验证竞品“一叶智能”主页8字段和9条公开作品采集;置顶角标、三种互动零值文案和截图哈希已核对。
|
|
81
|
+
|
|
82
|
+
仅依据这些历史回传,当前不能确认:
|
|
83
|
+
|
|
84
|
+
- 远端已完整安装当时的 `v1.0.9` 压缩包;
|
|
85
|
+
- 远端全部 14 个规范化 Skill 与最终 v1.0.9 manifest 逐文件、逐哈希一致;
|
|
86
|
+
- 远端小红书 IPC 已应用 v1.0.4 中新增的 `request_id` 旧响应隔离重构;
|
|
87
|
+
- 远端依赖、文档和配置模板与 v1.0.9 完全一致;
|
|
88
|
+
- 远端已安装并验收头条登录运行时和 `toutiao-creator-article-draft` v1.0.9 修订。
|
|
89
|
+
|
|
90
|
+
因此远端状态应表述为“部分抖音、小红书和头条业务流程已有独立实测记录;目标机器的 v1.0.9 完整部署仍待逐文件核验”,不能把专项实测等同于整包部署完成。
|
|
91
|
+
|
|
92
|
+
## 当前版本的远端部署完成标准
|
|
93
|
+
|
|
94
|
+
历史回传不能证明 1.1.0 已部署。只有对目标环境完成下列步骤,才能报告该环境更新完成:
|
|
95
|
+
|
|
96
|
+
1. 在可信源码机器运行 `npm test` 和 `python3 tools/build_release.py --output dist`,校验交付的 npm `.tgz` 及其 `.sha256`。
|
|
97
|
+
2. 在目标环境安装已校验的 npm 包,使用实际 `--home` 和 Agent Skill `--target` 先执行 dry-run;不要从已删除的仓库内历史压缩包路径安装。
|
|
98
|
+
3. 执行 `media-agent setup --home <运行目录>` 与 `media-agent skills install --target <技能目录>`。需要完整能力时安装清单中的全部 15 个 Skill;选择性安装则披露具体名单。
|
|
99
|
+
4. 核对已安装代码与交付制品一致,核对 Skill 文件及引用/许可交付完整;审查目录外备份和自定义旧 Skill 的保留提示。
|
|
100
|
+
5. 执行 `media-agent doctor --home <运行目录>`、`media-agent commands`。测试文件保留在源码仓库,不假定安装目录包含 `tests/`。
|
|
101
|
+
6. 确认已有账号配置、Profile 和 `browser_data` 未被覆盖。安装本身不要求打开或关闭用户现有浏览器;不能把全机进程/lock 数必须为 0 当作部署条件。
|
|
102
|
+
7. 按具体 Skill,在不与活动会话冲突的条件下进行必要的只读登录和业务验收;需实际发布时取得该作品的明确授权。图文仍在真实验收后才能从 `ADAPTED_UNVERIFIED` 升级状态。
|
|
103
|
+
8. 记录目标版本、数据根、安装 Skill 名单、依赖诊断结果和在线验收范围;`doctor.ready` 不等于已登录或发布验证通过。
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# 抖音与小红书图文 Skill 提取交接
|
|
2
|
+
|
|
3
|
+
更新:2026-09-23。已纳入 `@iducky/media-agent@1.1.0` 源码及构建清单;安装包分发与真实账号部署分别验收。两端状态均为 `ADAPTED_UNVERIFIED`,不能用本次离线检查宣称真实图文发布通过。
|
|
4
|
+
|
|
5
|
+
## 用户范围与交付
|
|
6
|
+
|
|
7
|
+
用户选择从 [dreammis/social-auto-upload](https://github.com/dreammis/social-auto-upload) 提取两个平台的图文能力,由 Agent 使用 Skill 操作现有可见浏览器;不使用第三方 MCP,不生成文案、封面或配图。
|
|
8
|
+
|
|
9
|
+
- [抖音图文 Skill](../../skills/douyin-creator-image-text-publish/SKILL.md)
|
|
10
|
+
- [小红书图文 Skill](../../skills/xiaohongshu-creator-image-text-publish/SKILL.md)
|
|
11
|
+
|
|
12
|
+
每个目录包含 `SKILL.md`、`agents/openai.yaml`、任务/会话契约、上游来源说明和 MIT 许可,复制单个目录时不会丢失本地引用。它们是 Agent 驱动的操作指南,不新增图文 CLI、不安装 `sau`、Patchright 或另一套浏览器。
|
|
13
|
+
|
|
14
|
+
## 固定来源及适配
|
|
15
|
+
|
|
16
|
+
固定上游提交:`0012d2c355f88f683cc38dde2a2db209e14091bc`。
|
|
17
|
+
|
|
18
|
+
| 提取对象 | 上游位置 | 本地适配 |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| 抖音 Skill、输入契约 | `skills/douyin-upload/` | 从视频/图文混合 CLI 入口收窄为给定素材图文任务 |
|
|
21
|
+
| 抖音页面流程 | `uploader/douyin_uploader/main.py` 的 `DouYinNote` | 图文入口、有序图片上传、标题正文、话题和管理列表 |
|
|
22
|
+
| 小红书 Skill、输入契约 | `skills/xiaohongshu-upload/` | 从视频/图文混合 CLI 入口收窄为给定素材图文任务 |
|
|
23
|
+
| 小红书页面流程 | `uploader/xiaohongshu_uploader/main.py` 的 `XiaoHongShuNote` | 图文入口、图片 input、正文编辑器、话题和成功页 |
|
|
24
|
+
|
|
25
|
+
上游支持 `--headed`,不是只能无头运行。但两个图文 uploader 都自行 launch 浏览器并 `new_context(storage_state=...)`;切换有头不能接管本项目持久化 Profile、指纹及锁。
|
|
26
|
+
|
|
27
|
+
本地保留页面流程和定位线索,以现有宿主浏览器工具执行;不复制上游浏览器生命周期、Cookie 读写、固定位置权限、转载声明、自动标题回退、文字截断、话题静默跳过和循环发布行为。上游提交循环可能在等待 URL 超时后再次点击,本地规则为先记录提交意图、最多一次点击、再核验列表。
|
|
28
|
+
|
|
29
|
+
## 调用与运行前提
|
|
30
|
+
|
|
31
|
+
Agent 使用相应 Skill,传入或从用户明确指令解析:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"action": "prepare",
|
|
36
|
+
"profile_id": "configured_profile_id",
|
|
37
|
+
"task_id": "image_text_001",
|
|
38
|
+
"images": ["/absolute/path/01.jpg", "/absolute/path/02.jpg"],
|
|
39
|
+
"title": "用户提供的标题",
|
|
40
|
+
"body": "用户提供的正文",
|
|
41
|
+
"tags": []
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
这是任务数据示例,不是新增 API。`prepare` 只准备,`publish` 依据明确任务授权发布,`verify` 只读核验。用户指定的账号必须能映射到现有 Profile,并具有 `creator_publish`;示例 Profile 不能直接用于运行。正文可明确留空,缺失则需补齐;图片必须有序且可访问。
|
|
46
|
+
|
|
47
|
+
宿主必须提供真实可见浏览器控制、文件上传、Profile/锁所有权核验,以及任务记录的可靠读写。已有会话由同一任务持锁时直接复用;其他任务持锁时停止。无可控会话返回 `BROWSER_SESSION_REQUIRED`,登录失效交给平台专用登录 Skill。不要通过旧视频 CLI 上传图片,也不要在已有会话持锁时启动第二个检查/发布浏览器。
|
|
48
|
+
|
|
49
|
+
只有登录态会随 Profile 保留,页面/编辑器不会自然恢复。仅准备后关闭浏览器会使页面快照失效;无法唯一找到原稿时须明确重新准备。任何提交意图已记录或无法排除曾经提交的任务都只能先查结果。
|
|
50
|
+
|
|
51
|
+
## 安装及发布状态
|
|
52
|
+
|
|
53
|
+
安装工具准备好后,可独立安装两个 Skill,无需创建 Python 环境:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
media-agent skills install --target /absolute/agent/skills \
|
|
57
|
+
--skill douyin-creator-image-text-publish \
|
|
58
|
+
--skill xiaohongshu-creator-image-text-publish
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
统一入口为 `media-agent skills install`。完整安装、升级和目录外备份行为见[安装指南](installation.md)。本次仅在隔离临时目录验证,未向用户真实 Skill 根目录或账号运行时部署。
|
|
62
|
+
|
|
63
|
+
工作区总数 15:v1.0.10 的 14 个基础上,增加两个图文 Skill,同期行业分类合入榜单 Skill 减少一个入口。v1.0.10 历史归档仍为原来的 14 个,现保存于 GitHub Releases,未改写旧包或其边车。1.1.0 的 npm/离线包由当前源码直接构建,不读取旧包。
|
|
64
|
+
|
|
65
|
+
任务记录位于运行时 `tasks/<platform>_image_text_publish/<profile_id>/<task_id>/`。它们是运行时产物,不能进入 Git、Skill 目录或迁移包。本版去重/授权/单次提交是 Agent 指令契约,不声称已由独立程序强制执行。
|
|
66
|
+
|
|
67
|
+
## 验证记录与待验收项目
|
|
68
|
+
|
|
69
|
+
2026-09-23 完成以下离线验证:
|
|
70
|
+
|
|
71
|
+
- 上游基线审查:Skill 仅定义上传发布命令,没有只准备流程;源码存在独立上下文、循环点击,以及仅凭 URL/标题框判定上传的缺口。
|
|
72
|
+
- 适配后行为模拟:抖音 6 个、小红书 8 个场景,包括只准备、点击超时、少图/顺序不明、关闭后恢复、输入缺失/超限、授权后内容变化;小红书另含成功页自动返回且审核中、首个话题候选不匹配。结果符合相应停止/只读/单次发布规则,未操作真实页面。
|
|
73
|
+
- `python3 tests/test_image_text_skill_install.py`:实际运行安装器到隔离目录,检查两个 Skill、全部随附文件的字节一致性、本地链接可解析和许可文件交付;不创建账号或任务数据。
|
|
74
|
+
|
|
75
|
+
两端分别需要以下在线验收,未完成前保持 `ADAPTED_UNVERIFIED`:
|
|
76
|
+
|
|
77
|
+
1. 使用目标账号现有可见 Profile,核验控制器和锁唯一,后台显示正确账号。
|
|
78
|
+
2. 用用户提供的两张可区分图片及成稿执行 `prepare`,确认顺序、正文段落、话题和设置均读回正确,未点击发布。
|
|
79
|
+
3. 验证无授权不提交,页面或素材变化会使旧准备快照失效;只读检查中断后的任务记录,不能用真实重复发布来“测试去重”。
|
|
80
|
+
4. 仅在用户明确授权实际作品发布时完成一次提交,保存非敏感平台证据;分别在作品管理或“笔记管理 → 全部”找到目标。
|
|
81
|
+
5. 准确区分已提交、审核中、已发布和不确定;正常关闭写盘并释放本任务锁。发布结果不明时保持现场并禁止重发。
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# 安装、升级与回滚
|
|
2
|
+
|
|
3
|
+
当前源码版本为 1.1.0。npm 包名为 `@iducky/media-agent`。安装指定版本:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install -g @iducky/media-agent@1.1.0
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
也可按以下步骤从源码构建并安装。npm 安装只安装命令与配套源码;仍需显式执行 `skills install` 和 `setup`。
|
|
10
|
+
|
|
11
|
+
## 从源码构建并安装
|
|
12
|
+
|
|
13
|
+
要求 Node.js >=18;执行 Python 能力需要 Python >=3.9。目前支持 macOS/Linux;现有 IPC 使用 Unix socket,没有声明 Windows 支持。
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
python3 tools/build_release.py --output dist
|
|
17
|
+
cd dist
|
|
18
|
+
shasum -a 256 -c iducky-media-agent-1.1.0.tgz.sha256
|
|
19
|
+
npm install -g ./iducky-media-agent-1.1.0.tgz
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
npm 安装不会自动创建 Python 环境、下载浏览器或启动浏览器,也不会自动选择 Agent 的 Skill 目录。包内携带对应版本源码与 Skill,不依赖上一个发布包。
|
|
23
|
+
|
|
24
|
+
## 仅安装 Skill
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
media-agent skills list
|
|
28
|
+
media-agent skills install --target /absolute/agent/skills --dry-run
|
|
29
|
+
media-agent skills install --target /absolute/agent/skills \
|
|
30
|
+
--skill douyin-creator-image-text-publish \
|
|
31
|
+
--skill xiaohongshu-creator-image-text-publish
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
不指定 `--skill` 时安装清单中的全部 15 个 Skill。此操作只需 Node.js,无需 Python。Skill 安装成功不代表账号已登录或浏览器发布能力已经在线验收。
|
|
35
|
+
|
|
36
|
+
更新时先完整复制并校验,再切换目录;旧 Skill(含用户定制文件)保存在目标 Skill 根目录同级的 `retired-skills/` 中,并打印具体路径。新目录仅含本版本文件;用户定制应从备份复核合并。无变化不会重复备份。自定义旧行业分类 Skill 保留并警告,只有固定哈希匹配的原版才会在合并后的榜单 Skill 安装成功后退休。
|
|
37
|
+
|
|
38
|
+
## 安装执行环境
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
media-agent setup --home /absolute/runtime --dry-run
|
|
42
|
+
media-agent setup --home /absolute/runtime --python /absolute/python3
|
|
43
|
+
media-agent doctor --home /absolute/runtime
|
|
44
|
+
media-agent commands
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
业务命令执行 `.app/current` 指向的版本;安装新版 npm 包后仍运行原激活版本,直到 `setup` 成功切换。未执行 setup 的正式制品拒绝业务命令。源码开发环境在未安装运行版本时可直接执行源码。`doctor` 会显示 npm 版本、激活版本及路径。
|
|
48
|
+
|
|
49
|
+
`setup` 为显式网络操作:创建该目录内的 `.venv`,通过 pip 安装项目依赖。浏览器程序是否需要下载由浏览器库决定,`doctor` 只检查 Python、依赖与安装结构,不代表登录有效或浏览器业务流程已验证。
|
|
50
|
+
|
|
51
|
+
`--no-deps` 只安装代码,用于已由外部管理依赖的环境或离线验证;不保证该环境可以启动浏览器。现有 `pyproject.toml` 的 `browser` extra 使用版本范围,当前没有声称 Python 依赖已完全锁定。
|
|
52
|
+
|
|
53
|
+
运行目录必须与源码/安装包目录分开,不能互相包含。安装器会在写入之前拒绝重合目录;代码指针原子切换失败时,原指针保持不变。
|
|
54
|
+
|
|
55
|
+
优先级:命令行 `--home`→ `MEDIA_AGENT_HOME` → `~/.media-agent/social-accounts`。已有账号继续使用原路径,保持登录 Profile、固定指纹与唯一 lock。
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
runtime/
|
|
59
|
+
├── .venv/ Python 环境
|
|
60
|
+
├── .app/releases/<version-hash>/ 版本化应用代码
|
|
61
|
+
├── .app/current 当前代码指针
|
|
62
|
+
├── accounts.yaml 用户配置,已有文件不覆盖
|
|
63
|
+
├── profiles/ 用户浏览器数据
|
|
64
|
+
├── locks/ controllers/ signals/
|
|
65
|
+
└── tasks/ screenshots/ logs/
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
自定义路径建议通过 `MEDIA_AGENT_HOME` 统一传给 Agent 的执行环境;Skill 中使用默认路径的示例需替换成该路径。不要为方便迁移而复制不同账号的 Cookie 或浏览器 Profile。
|
|
69
|
+
|
|
70
|
+
## 配置导出与导入
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
media-agent config export /absolute/config-backup --home /absolute/runtime --dry-run
|
|
74
|
+
media-agent config export /absolute/config-backup --home /absolute/runtime
|
|
75
|
+
media-agent config import /absolute/config-backup --home /absolute/new-runtime
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
仅复制 `accounts.yaml`、`ranking-profiles.yaml` 和 `profiles/*/config.json`。导入覆盖同名配置文件,不迁移浏览器登录态、任务记录或其他文件。文件逐个原子替换,整个批次不是事务;发生 I/O 错误时检查已复制项后重试。支持 `--dry-run`,拒绝源/目标重叠与符号链接路径。
|
|
79
|
+
|
|
80
|
+
## 可选离线包
|
|
81
|
+
|
|
82
|
+
完整离线包仅是构建产物,位于 `dist/media-agent-capabilities-v1.1.0.tar.gz`,不提交到源码仓库。离线包包含代码、Skill、非敏感模板、使用文档与校验清单,不包含 Python 解释器、依赖 wheel 或浏览器二进制;完全断网环境需提前准备这些依赖。
|
|
83
|
+
|
|
84
|
+
先验证外部 `.sha256`,再解压并执行 `node bin/media-agent.mjs setup`;Skill 安装使用同一入口的 `skills install`。包内 manifest 会检查缺失、篡改、额外文件和符号链接,并在安装或依赖下载前拒绝不完整制品。校验哈希用于验证完整性,不能替代可信下载来源。
|
|
85
|
+
|
|
86
|
+
## 升级与回滚
|
|
87
|
+
|
|
88
|
+
1. 安装新版 npm 包,然后运行 `setup`;已有账号配置、Profile、任务记录不覆盖。
|
|
89
|
+
2. 按需运行 `skills install`,审阅备份与定制合并。
|
|
90
|
+
3. 运行 `doctor`、CLI 离线检查,再进行所需在线验收。
|
|
91
|
+
4. 回滚优先重新安装之前已验证的 npm 包并运行其 `setup`;随后恢复对应 Skill 备份。Python 依赖也须与旧版要求匹配,仅切换代码指针不等于依赖已经回滚。
|
|
92
|
+
|
|
93
|
+
`.app/releases` 和 `retired-skills` 不会自动清空;只清理确认没有运行任务或回滚依赖的版本。npm 卸载不会删除用户目录内的运行数据或已安装 Skill。
|
|
94
|
+
|
|
95
|
+
历史 v1.0.1–v1.0.10 制品及哈希见源码仓库中的 `docs/releases/index.json` 和 [GitHub Releases](https://github.com/myducky/MediaAgentCapabilities/releases)。不重写 Git 历史,不覆盖旧资产。
|
|
96
|
+
|
|
97
|
+
## 从旧入口升级
|
|
98
|
+
|
|
99
|
+
新版本仅公开 `media-agent`,不再提供 `social.sh`、`scripts/*.py`、`install.sh` 或 Python console 命令。命令列表使用 `media-agent commands`;旧校验脚本改为 `media-agent validate-rankings` 与 `media-agent validate-industry-taxonomy`,企业登录改为 `media-agent enterprise-login`。
|
|
100
|
+
|
|
101
|
+
先安装新版 npm 包并执行 `setup`,再更新对应 Agent 的 Skill。检查自定义 Skill、定时任务和外部脚本中的旧路径,统一改用 `media-agent`。安装器会提示已有旧入口但不会删除它们,以免破坏尚未迁移的调用方;确认全部迁移并结束旧任务后再清理运行目录内的旧程序。不要删除 Profile、登录态或业务记录。
|
|
102
|
+
|
|
103
|
+
本次源码验证使用隔离临时目录,未更新本机既有 Hermes Skill 或真实账号环境;不把本地构建通过写成已部署。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Agent 与执行代码的边界
|
|
2
|
+
|
|
3
|
+
`skills/<name>/SKILL.md` 是 Agent 入口;`agents/openai.yaml` 是配套元数据,`references/` 存放长流程、证据格式及上游来源许可。不要把这些 Skill 改为第三方 MCP。
|
|
4
|
+
|
|
5
|
+
抖音、小红书图文发布由 Agent 操作现有可见持久化浏览器,仅使用用户给定图片、标题和正文;不生成文案、封面或配图。当前为 **ADAPTED_UNVERIFIED**,仍需真实账号验收。执行结果和提交授权遵守 Skill 中的契约,重构没有把文档约束自动变成代码强制门禁。
|
|
6
|
+
|
|
7
|
+
已有稳定 CLI 继续通过 `media-agent <command>` 调用。视频发布命令依旧只用于视频。部分旧采集脚本仍存在固定测试账号或参数限制;按 Skill 的 IMPLEMENTATION_REQUIRED/Agent 路径处理,不能因为源码已经入包而宣称所有采集命令都支持任意账号。
|
|
8
|
+
|
|
9
|
+
`src/media_agent/runtime/paths.py` 统一数据根目录;`runtime/browser.py` 延迟加载 CloakBrowser,保持调用方的可见浏览器、指纹和持久化参数。平台仍分别拥有登录证据、IPC、页面交互和业务状态机,避免在结构迁移中改动平台流程。
|
|
10
|
+
|
|
11
|
+
浏览器每个真实账号使用独立 Profile 与唯一锁。模块导入不启动浏览器,不读取真实账号配置,不写任务目录。真实操作仍需先校验账号与权限,再执行页面流程;结果不确定时保留证据,不自动重发。
|
|
12
|
+
|
|
13
|
+
`media-agent config export/import` 仅迁移配置,不包含浏览器登录态;配置文件也可能包含私人账号标识,只能在用户自己的机器之间传递,不上传 npm 或 Releases。
|