vcorp-chrome 1.4.1 → 1.6.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 +547 -547
- package/docs//344/272/221/347/253/257/345/217/221/345/270/203.md +32 -31
- package/docs//345/215/217/350/256/256.md +16 -1
- package/extension/background.js +2 -0
- package/extension/cloud-policy.js +390 -426
- package/extension/cloud.js +972 -1013
- package/extension/manifest.json +38 -38
- package/extension/mark.js +16 -1
- package/extension/panel.html +210 -204
- package/extension/panel.js +427 -428
- package/extension/welcome.html +99 -99
- package/package.json +44 -44
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
# 云端发布:让 maker.vcorp.ai
|
|
1
|
+
# 云端发布:让 maker.vcorp.ai 在你的浏览器里替你发视频、办事
|
|
2
2
|
|
|
3
|
-
这个分支(`my-dev`)的 vcorp-chrome 多了一条「云端通道」:配对之后,[maker.vcorp.ai](https://maker.vcorp.ai)(或你自建的 Opus Video Maker
|
|
3
|
+
这个分支(`my-dev`)的 vcorp-chrome 多了一条「云端通道」:配对之后,[maker.vcorp.ai](https://maker.vcorp.ai)(或你自建的 Opus Video Maker)的 AI 可以在**你自己的 Chrome** 里操作网页:把做好的视频发到你说的平台、查资料、填表。
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
5
|
+
- 没有预设的平台清单,也没有写死的发布脚本。要去哪个网站,AI 按任务自己申请,你点头才放行;页面上怎么点、怎么填,由 AI 看着页面现场操作。
|
|
6
|
+
- 用的是你平时登录着的账号、你自己的电脑和网络,网站看到的就是你本人在操作。
|
|
7
|
+
- 网站的 cookie 和密码**不离开你的电脑**,服务器和它的 AI 都拿不到。
|
|
8
|
+
- 它只能在你允许过的网站上、在它自己开的标签页里点点填填;你的其它页面它一个都看不到。
|
|
8
9
|
- 每个新任务都要你点「允许」,除非你打开了「自动允许新任务」。随时可以暂停、收回、断开。
|
|
9
10
|
|
|
10
11
|
不需要装 Node.js,不需要终端。
|
|
@@ -30,37 +31,37 @@
|
|
|
30
31
|
|
|
31
32
|
## 二、和网站配对(约 1 分钟)
|
|
32
33
|
|
|
33
|
-
1. 登录 maker.vcorp.ai,右上角菜单 →
|
|
34
|
+
1. 登录 maker.vcorp.ai,右上角菜单 → **浏览器扩展** → **获取配对码**,得到一个 `ABCD-EFGH` 样子的码(10 分钟内有效,只能用一次)。
|
|
34
35
|
2. 在扩展侧栏的 **云端发布** 里填这个码,点 **下一步**。
|
|
35
36
|
3. 侧栏会显示「要把这个浏览器交给 maker.vcorp.ai 上的账号『xxx』吗?」。**核对账号是不是你自己的**,再点 **确认连接**。
|
|
36
|
-
|
|
37
|
+
配对码如果是别人发给你的,点取消——填别人的码,等于把你浏览器里的登录交给别人去用。
|
|
37
38
|
4. 网页上「已连接的浏览器」里会出现这台电脑,显示 **在线**。
|
|
38
39
|
|
|
39
|
-
##
|
|
40
|
+
## 三、允许的网站
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
侧栏「允许它使用的网站」一开始是空的,扩展里没有预设平台。任务要去哪个网站,会先用 `sites` 申请,你点 **允许** 之后,这个网站(含子域)就记进这份名单;以后的任务再用到它,不用再批网站,只批任务本身。名单里每一行都能点 **移除**,进行中的任务也立刻失去它。
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
要发布的平台,在这个浏览器里**正常登录它的创作者后台**就行,就像你平时手动发视频那样。登录状态就是你浏览器里的登录状态,不需要导出 cookie。
|
|
44
45
|
|
|
45
46
|
如果发布时发现没登录,扩展会把那个标签页切到前台、弹一个通知,请你扫码登录,登录完点浮条上的「我完成了」。
|
|
46
47
|
|
|
47
48
|
## 四、发布时会发生什么
|
|
48
49
|
|
|
49
|
-
1.
|
|
50
|
-
2.
|
|
50
|
+
1. 在网页上新建发布任务,写清发到哪里、怎么写,确认策划后开始发布。
|
|
51
|
+
2. AI 先申请要去的网站。没开「自动允许新任务」时,浏览器弹出通知「maker.vcorp.ai 请求在你的浏览器里操作这些网站 → creator.douyin.com、creator.xiaohongshu.com」,点 **允许**(也可以在侧栏里点)。5 分钟没点算拒绝。开了这个开关,这一下不再问。
|
|
51
52
|
3. 浏览器在**后台标签页**里操作,不会抢你正在看的页面。这些标签页带彩色边框,归在一个以「Cloud · maker.vcorp.ai」命名的标签组里,点开就能看它在做什么。
|
|
52
53
|
4. 发完,任务结束,它开的标签页自动关掉(你正在看的那一页除外)。
|
|
53
54
|
|
|
54
|
-
###
|
|
55
|
+
### 任务进行中再申请网站
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
做的过程中如果还要去别的网站(比如查资料、下素材),它会再发一条申请,浏览器弹出通知「maker.vcorp.ai 的任务还想访问新的网站」,侧栏里同一张任务卡片上也有「允许这些网站 / 不允许」。
|
|
57
58
|
|
|
58
|
-
-
|
|
59
|
-
-
|
|
60
|
-
-
|
|
61
|
-
-
|
|
59
|
+
- 每次只问这次新出现的网站,点头之后它的标签页才能停在这些站和它们的子域上,这些站也进允许名单。
|
|
60
|
+
- 「自动允许新任务」管不到这里,每个新网站都要你点头。同一个任务里你拒绝过的,不再问第二次。
|
|
61
|
+
- 已经在允许名单里的不用再批。允许过 `douyin.com`,再申请 `creator.douyin.com` 不会弹窗。
|
|
62
|
+
- 一个任务最多新批 20 个网站。
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
开了「自动允许」时,任务一开始带着的网站和任务一起放行,但只给这一个任务用,不进允许名单,任务结束就作废。之后每多一个网站再问一次。
|
|
64
65
|
|
|
65
66
|
### 读取你电脑上的文件夹
|
|
66
67
|
|
|
@@ -108,16 +109,16 @@
|
|
|
108
109
|
- `test/cloud-policy.test.js`:每条规矩对应的攻击
|
|
109
110
|
- `extension/cloud.js`:连接、配对、任务批准、标签页归属、上传
|
|
110
111
|
|
|
111
|
-
服务器端实现见 Opus Video Maker 的 `extlink.js
|
|
112
|
+
服务器端实现见 Opus Video Maker 的 `extlink.js`(不在本仓库)。每个任务的信封只有任务号、标题和 `sites`(这个任务申请过的域名)。agent 发 `sites` 命令申请网站,参数是 `add`(域名列表)和一行 `reason`。没开「自动允许」时,第一次申请连同任务一起问你;任务开始之后再申请的网站单独问。开了的话,新任务和信封上一开始带着的网站直接放行,之后再申请的仍然单独问。
|
|
112
113
|
|
|
113
114
|
### 服务器被攻破时,它**能**做什么
|
|
114
115
|
|
|
115
|
-
|
|
116
|
+
在你**已经批准**的任务里、**允许名单**里的网站上,以及这个任务获准的网站上,以你的身份在网页上操作:发帖、改资料、删帖。开了「自动允许」时,新任务和它一开始的网站清单也算批准。任务开始之后再申请的网站,每个都要你另外点头,点头之前页面打不开。这是这个功能本身的能力,没法去掉,只能收窄:
|
|
116
117
|
|
|
117
|
-
-
|
|
118
|
-
-
|
|
119
|
-
- 开了「自动允许」,这些新任务不再问。任务开始之后再申请的网站,以及本地文件夹,仍然逐个点头。开关开着时,服务器可以在新任务的第一份网站清单里写最多 20
|
|
120
|
-
-
|
|
118
|
+
- 允许名单里只留你要用的网站,用不着的点移除;不用时暂停或断开。
|
|
119
|
+
- 不开「自动允许」,每个新任务都要你点头,先看一眼它要去的网站和用途。
|
|
120
|
+
- 开了「自动允许」,这些新任务不再问。任务开始之后再申请的网站,以及本地文件夹,仍然逐个点头。开关开着时,服务器可以在新任务的第一份网站清单里写最多 20 个域名,扩展不再问就放行(只给这个任务,不进允许名单)。不信任这个账号时不要开。
|
|
121
|
+
- 一个任务最多新批 20 个网站;IP、localhost、内网名,以及 `com.cn`、`github.io` 这类共享后缀一律申请不了。
|
|
121
122
|
- 每个任务最多 1500 条命令、每分钟最多 120 条;闲置 3 小时后批准作废。
|
|
122
123
|
- 提交/发布/删除/支付一类的按钮不能夹在批处理(`act`)里,必须单独点,每一下都进操作记录;支付按钮仍会弹原有的付款确认。
|
|
123
124
|
|
|
@@ -126,15 +127,15 @@
|
|
|
126
127
|
| 攻击 | 拦在哪 |
|
|
127
128
|
|---|---|
|
|
128
129
|
| 执行任意 JS、读接口、带着 cookie 发请求、看网络记录、下载文件到你的磁盘 | `eval` `fetch` `network` `download` `reload` 不在云端命令白名单里,扩展直接拒绝 |
|
|
129
|
-
| 打开网银、邮箱、`chrome://`、`file://`
|
|
130
|
-
|
|
|
130
|
+
| 打开网银、邮箱、`chrome://`、`file://` 或任何没允许的网站 | 开页、导航、`act` 里的每个导航步骤都按「允许名单 + 本任务里放行的网站」核对,各含子域。允许过 `channels.weixin.qq.com` 不等于允许整个 `weixin.qq.com`,申请上一级域名仍要你单独点头 |
|
|
131
|
+
| 点个外链或重定向跳出允许的网站,再读页面内容 | 每条命令前、结果发回之前,都核对本任务所有标签页(含正在加载的地址);跳出去了结果整份屏蔽,标签页退回或清空 |
|
|
131
132
|
| 看或操作你自己开着的标签页 | 云端只能碰它在本任务里开的页(以及从这些页里点开的新页);参数里的 `tabId` 一律剥掉,以任务表为准 |
|
|
132
133
|
| 让本机 agent 误接管云端的页 | 云端开页不改动本机的「最近受控标签页」 |
|
|
133
134
|
| 把你电脑上的文件(如 `~/.ssh/id_rsa`)当素材传到平台上 | `upload` 只收配对服务器 `/api/ext/media/` 下的 URL,不收本机路径、不收字节 |
|
|
134
135
|
| 偷偷读你没交给它的文件夹,或读隐藏文件、私钥 | 本地文件夹要你自己选,并且每个任务再点一次头。路径不能含 `..`,只收文档类扩展名,点开头的文件和 `node_modules` 会跳过。文件字节只能上传到配对服务器的 `/api/ext/pull/`,不能指到别的网址 |
|
|
135
136
|
| 截到你正在看的页面 | 截图用调试器截指定的标签页;云端不能要求切前台,关了「高保真模式」时只有那一页本来就在前台才截得了 |
|
|
136
137
|
| 用钓鱼文案骗你 | `ask` 浮条的标题强制带上服务器域名;服务器给的所有文字在侧栏里都以纯文本显示 |
|
|
137
|
-
| 网页里的脚本冒充侧栏去批准任务、改配置 |
|
|
138
|
+
| 网页里的脚本冒充侧栏去批准任务、改配置 | 配对、批准、移除网站、解除这些操作只接受扩展自己的页面发来的消息(`sender.tab` 为空且 URL 是扩展页) |
|
|
138
139
|
| 让别人的浏览器替自己发帖(把自己的配对码骗你填) | 配对分两步,第二步之前侧栏会写明「交给账号『xxx』」,由你确认 |
|
|
139
140
|
|
|
140
141
|
### 身份与连接
|
|
@@ -142,11 +143,11 @@
|
|
|
142
143
|
- 配对确认时,扩展用 WebCrypto 生成 ECDSA P-256 密钥对,**私钥 `extractable:false`** 存在扩展的 IndexedDB,连扩展自己的代码也导不出来;服务器只收到公钥。
|
|
143
144
|
- 每次连接:服务器发随机数 → 扩展签 `vcorp-cloud-v1\n<服务器 origin>\n<设备号>\n<随机数>`。服务器上没有能冒充你浏览器的口令;签名带着 origin,拿到别的站点重放没用。
|
|
144
145
|
- 只连 `https://`(本机调试允许 `http://localhost`),走 WSS。
|
|
145
|
-
- 服务器侧:配对码 8 位、10 分钟、一次性,按 IP
|
|
146
|
+
- 服务器侧:配对码 8 位、10 分钟、一次性,按 IP 限试错;每次运行一个临时 token,只在这次运行里有效,结束即作废并通知扩展关页;一个用户的命令只会送到这个用户自己配对的浏览器。
|
|
146
147
|
|
|
147
|
-
###
|
|
148
|
+
### 素材怎么进到网页
|
|
148
149
|
|
|
149
|
-
服务器把文件放在一个随机的能力 URL 后面(最长 2
|
|
150
|
+
服务器把文件放在一个随机的能力 URL 后面(最长 2 小时)。扩展核对它确实指向配对服务器的素材接口后,在目标页面的内容脚本里直接取这个 URL、在内存里造 `File` 投进上传框,几百 MB 的视频也不落你的磁盘、不弹保存框。页面里取不到时,48MB 以内的文件改由扩展取了再转交。
|
|
150
151
|
|
|
151
152
|
### 本机那条路不受影响
|
|
152
153
|
|
|
@@ -492,9 +492,24 @@ ref 就作废了**(ref 绑定在某一份快照上)。
|
|
|
492
492
|
→ { "outcome": "continued|cancelled|timed_out|completed|disabled", "text": "…" }
|
|
493
493
|
```
|
|
494
494
|
|
|
495
|
+
扫码、验证码、滑块不带 `kind`:这种只能本人做,免确认开关管不到。
|
|
496
|
+
对外动作(发消息、投递、发帖)要写 `"kind": "confirm"`,别的值一律当成没写。
|
|
497
|
+
|
|
498
|
+
```jsonc
|
|
499
|
+
{ "cmd": "ask", "params": {
|
|
500
|
+
"kind": "confirm",
|
|
501
|
+
"title": "确认发消息",
|
|
502
|
+
"prompt": "向对方发送下面这段话。点「我完成了」就发出去。"
|
|
503
|
+
} }
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
云端通道里,用户开了「对外动作不再逐条确认」,或在这个任务的浮条上点过「本任务内都同意」,
|
|
507
|
+
后续 `kind: "confirm"` 的 ask 不再弹窗,直接 `{ "outcome": "continued", "auto": true }`。
|
|
508
|
+
支付确认不走这条命令,没有跳过的办法。
|
|
509
|
+
|
|
495
510
|
| outcome | 含义 | agent 该怎么办 |
|
|
496
511
|
|---|---|---|
|
|
497
|
-
| `continued` |
|
|
512
|
+
| `continued` | 用户点了「我完成了」,或免确认直接放行(此时还有 `auto: true`) | 继续;`auto: true` 时在交付里记一笔 |
|
|
498
513
|
| `completed` | `until` 判据自动命中 | 继续 |
|
|
499
514
|
| `cancelled` | 用户点了取消 | **停止这个任务**,不要换个方式重试 |
|
|
500
515
|
| `timed_out` | 无人响应 | 用户不在电脑前 |
|
package/extension/background.js
CHANGED
|
@@ -2626,6 +2626,7 @@ const HANDLERS = {
|
|
|
2626
2626
|
const started = Date.now();
|
|
2627
2627
|
await chrome.tabs.sendMessage(id, {
|
|
2628
2628
|
__hcAsk: 'show', title: p.title, prompt: p.prompt, timeout, wantNote: p.wantNote !== false,
|
|
2629
|
+
...(p.kind === 'confirm' ? { offerAlways: true } : {}),
|
|
2629
2630
|
});
|
|
2630
2631
|
const panel = pollPanel(id, timeout);
|
|
2631
2632
|
|
|
@@ -2650,6 +2651,7 @@ const HANDLERS = {
|
|
|
2650
2651
|
|
|
2651
2652
|
return {
|
|
2652
2653
|
outcome: res.outcome,
|
|
2654
|
+
...(res.always ? { always: true } : {}),
|
|
2653
2655
|
text: `${head}${res.note ? `\n用户留言:${res.note}` : ''}\n\n${snap.text}`,
|
|
2654
2656
|
};
|
|
2655
2657
|
},
|