Skip to content

Commit fdb4a7f

Browse files
committed
feat: add comprehensive development documentation
- Create new MDX files for account information retrieval, background logic, build scripts, file structure, and content scraping - Update index and meta.json to include new documentation sections - Revise user guide to remove outdated content and improve clarity
1 parent 8ec79fd commit fdb4a7f

File tree

13 files changed

+754
-630
lines changed

13 files changed

+754
-630
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
---
2+
title: 账号信息获取原理
3+
---
4+
5+
为了能让用户得知他们在发布内容时使用的平台账号信息,我们设计获取了平台账号信息,并将平台信息存储到 `localStorage` 中。
6+
7+
具体实现在 `src/sync/account.ts` 文件以及 `src/sync/account` 文件夹中。
8+
9+
首先我们为 `PlatformInfo` 类型添加了 `accountKey``accountInfo` 字段,用于在前端请求平台数据时附加平台账号信息。
10+
11+
然后我们需要获取这些平台账号信息,并将其存储到 `localStorage` 中。
12+
13+
```ts
14+
/**
15+
* 获取指定平台账号的最新信息
16+
* @param accountKey 账号标识符
17+
* @returns 返回账号信息
18+
*/
19+
export async function refreshAccountInfo(accountKey: string): Promise<AccountInfo> {
20+
// 获取平台信息
21+
const platformInfos = getPlatformInfos();
22+
// 获取指定平台账号信息
23+
const platformInfo = platformInfos.find((p) => p.accountKey === accountKey);
24+
// 如果找不到指定平台账号信息,则抛出错误
25+
if (!platformInfo) {
26+
throw new Error(`找不到账号信息: ${accountKey}`);
27+
}
28+
29+
let accountInfo: AccountInfo;
30+
31+
// 根据平台类型获取账号信息,具体的函数实现在 `src/sync/account` 文件夹中
32+
if (accountKey === 'x') {
33+
accountInfo = await getXAccountInfo();
34+
} else if (accountKey === 'tiktok') {
35+
accountInfo = await getTiktokAccountInfo();
36+
} else if (accountKey === 'douyin') {
37+
accountInfo = await getDouyinAccountInfo();
38+
} else if (accountKey === 'rednote') {
39+
accountInfo = await getRednoteAccountInfo();
40+
} else if (accountKey === 'bilibili') {
41+
accountInfo = await getBilibiliAccountInfo();
42+
} else {
43+
return null;
44+
}
45+
46+
if (!accountInfo) {
47+
console.error(`获取账号信息失败: ${accountKey}`);
48+
removeAccountInfo(accountKey);
49+
return null;
50+
}
51+
52+
// 更新平台信息并保存到storage
53+
await saveAccountInfo(accountKey, accountInfo);
54+
55+
return accountInfo;
56+
}
57+
58+
/**
59+
* 刷新所有平台的账号信息
60+
* @returns 所有账号信息的映射表
61+
*/
62+
63+
// 该函数在 `src/options/index.tsx` 文件中被调用,即在用户打开选项页时,会调用该函数来获取平台账号信息
64+
export async function refreshAllAccountInfo(): Promise<Record<string, AccountInfo>> {
65+
// 获取所有平台信息
66+
const platformInfos = getPlatformInfos();
67+
const results: Record<string, AccountInfo> = {};
68+
const errors: Record<string, Error> = {};
69+
70+
// 并行刷新所有账号信息
71+
await Promise.allSettled(
72+
platformInfos.map(async (platformInfo) => {
73+
try {
74+
if (platformInfo.accountKey) {
75+
const accountInfo = await refreshAccountInfo(platformInfo.accountKey);
76+
results[platformInfo.accountKey] = accountInfo;
77+
}
78+
} catch (error) {
79+
console.error(`刷新账号信息失败: ${platformInfo.accountKey}`, error);
80+
errors[platformInfo.accountKey] = error as Error;
81+
}
82+
}),
83+
);
84+
85+
// 如果所有请求都失败了,抛出错误
86+
if (Object.keys(results).length === 0 && Object.keys(errors).length > 0) {
87+
throw new Error('所有账号信息刷新失败');
88+
}
89+
90+
return results;
91+
}
92+
```
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: 后台
3+
---
4+
5+
`src/background/index.ts` 文件中,我们定义了 `background` 的逻辑,例如标签页管理、消息处理等。
6+
7+
监听消息,通过 `defaultMessageHandler` 函数来处理消息,通过 `tabsManagerMessageHandler` 函数来处理标签页管理消息,通过 `trustDomainMessageHandler` 函数来处理信任域消息。
8+
9+
浏览器扩展通过 `chrome.runtime.onMessage` 来监听消息,可以接受来自 `content script` 的消息,也可以接受来自 `options` 页面的消息。
10+
11+
同时我们监听了标签页的更新和删除事件,用于标签页管理,当用户使用浏览器的标签页管理功能时,会触发这些事件,将更新的信息传递到我们来处理,例如重新加载、关闭、刷新等。以同步标签页在 `Sidepanel` 中的状态。
12+
13+
```ts
14+
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
15+
defaultMessageHandler(request, sender, sendResponse);
16+
tabsManagerMessageHandler(request, sender, sendResponse);
17+
trustDomainMessageHandler(request, sender, sendResponse);
18+
return true;
19+
});
20+
21+
// 监听标签页更新
22+
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
23+
tabsManagerHandleTabUpdated(tabId, changeInfo, tab);
24+
});
25+
26+
// 监听标签页删除
27+
chrome.tabs.onRemoved.addListener((tabId) => {
28+
tabsManagerHandleTabRemoved(tabId);
29+
});
30+
```
31+
32+
保活机制是为了能够保持 Background 在浏览器后台持续运行,防止被浏览器杀死。
33+
34+
```ts
35+
// Keep Alive || 保活机制 || START
36+
const quantumKeepAlive = new QuantumEntanglementKeepAlive();
37+
quantumKeepAlive.startEntanglementProcess();
38+
// Keep Alive || 保活机制 || END
39+
```
Lines changed: 11 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,10 @@
11
---
2-
title: 开始开发
2+
title: 构建发布脚本
33
---
44

5-
## 开始使用
5+
目前所有平台都采用页面操作的方式实现,主要包含以下几个关键部分:
66

7-
首先,运行开发服务器:
8-
9-
```bash
10-
pnpm i
11-
12-
pnpm dev
13-
```
14-
15-
在浏览器扩展程序页面中打开开发者模式,点击 `加载已解压的扩展程序` 并找到 `build/chrome-mv3-dev` 进行加载。
16-
17-
## 构建生产版本
18-
19-
运行以下命令:
20-
21-
```bash
22-
pnpm build
23-
```
24-
25-
你可以在 `build` 文件夹下找到构建内容
26-
27-
## 开发说明
28-
29-
### 你需要了解的文档
30-
31-
[Chrome Extension API Reference](https://developer.chrome.com/docs/extensions/reference/api)
32-
33-
[Edge Extension](https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/)
34-
35-
[Plasmo Docs](https://docs.plasmo.com/)
36-
37-
## 推荐文章
38-
39-
- [AI全栈指南 Vol.033:5分钟学会内容一键发布多平台](https://mp.weixin.qq.com/s/K7yh6EsBLOGJzl8Gh8SwLw)
40-
41-
### 文件架构
42-
43-
> src/sync:该文件夹下存放了有关操作不同平台的代码,其中 dynamic 是动态发布相关的,video 是视频发布相关的;任何加入的平台都需要在 common.ts 中注册。
44-
> components:该文件下存放了所有前端界面操作的组件。
45-
46-
### 开发文档
47-
48-
需要注意的是,不同平台的开发在细节上存在不同,不过大体上遵循类似的实现模式。脱离不开 `查找元素 - 编辑元素 - 自动发布` 的实现模式。
49-
50-
- [通用功能开发记录](development/common.md)
51-
- [抖音动态发布功能开发记录](development/douyin-dynamic.md)
52-
- [抖音账号信息获取](development/douyin-account.md)
53-
- [B站动态发布功能开发记录](development/bilibili-dynamic.md)
54-
55-
## 功能开发指南
56-
57-
### 动态发布功能
58-
59-
动态发布是我们扩展的核心功能之一。目前所有平台都采用页面操作的方式实现,主要包含以下几个关键部分:
60-
61-
#### 1. 基础架构
7+
## 基础架构
628

639
每个平台的动态发布功能都需要实现以下接口:
6410

@@ -68,11 +14,11 @@ export async function DynamicPlatform(data: SyncData) {
6814
}
6915
```
7016

71-
#### 2. 核心实现模式
17+
## 实现模式
7218

7319
所有平台遵循类似的实现模式:
7420

75-
1. 注册平台信息到 infos
21+
### 1. 注册平台信息到 infos
7622

7723
每个平台需要注册到 `infos` 中,然后通过 `infos` 中的信息来进行初始化。
7824

@@ -96,9 +42,9 @@ export async function DynamicPlatform(data: SyncData) {
9642

9743
其中 accountKey 是获取账号信息的 key,用于获取账号信息,详情可以查看 `src/sync/account.ts``src/sync/account` 文件夹。
9844

99-
2. 内容处理
45+
### 2. 内容处理
10046

101-
2.1 标题
47+
#### 2.1 标题
10248

10349
获取到输入框或其它输入区域,然后进行内容填充。可以考虑直接使用 `textContent``innerHTML` 进行填充,或者使用复制粘贴事件等方式进行。
10450

@@ -107,7 +53,7 @@ const titleElement = await waitForElement('h1[class*="title"]');
10753
const title = titleElement.textContent;
10854
```
10955

110-
2.2 内容
56+
#### 2.2 内容
11157

11258
获取到输入框或其它输入区域,然后进行内容填充。可以考虑直接使用 `textContent``innerHTML` 进行填充,或者使用复制粘贴事件等方式进行。
11359

@@ -116,7 +62,7 @@ const contentElement = await waitForElement('div[class*="content"]');
11662
const content = contentElement.textContent;
11763
```
11864

119-
2.3 上传图片/视频等
65+
#### 2.3 上传图片/视频等
12066

12167
找到文件输入Input后,使用 fetch 下载图片/视频等,然后使用 DataTransfer 模拟文件上传。
12268

@@ -133,7 +79,7 @@ fileInput.files = dataTransfer.files;
13379
fileInput.dispatchEvent(new Event('change', { bubbles: true }));
13480
```
13581

136-
3. 自动发布(可选)
82+
#### 3. 自动发布(可选)
13783

13884
```typescript
13985
if (autoPublish) {
@@ -147,15 +93,10 @@ if (autoPublish) {
14793
}
14894
```
14995

150-
#### 3. 开发建议
96+
## 开发建议
15197

15298
- 学习使用 `devtools`,使用审查元素来获取元素信息。
15399
- 学习各类 `event` 的使用,例如 `input``change``click` 等。
154100
- 学习 `浏览器 API` 的使用,例如 `fetch``DataTransfer``ClipboardEvent` 等。更多信息可以参考[MDN](https://developer.mozilla.org/zh-CN/docs/Web/API)
155101
- 在遇见问题的时候,可以先尝试使用 `console.log` 来输出信息,然后根据信息来判断问题所在。
156102

157-
### 提出贡献
158-
159-
我们非常欢迎你提出贡献,你可以通过 `pull request` 来提交你的代码。
160-
161-
在提交之前,请先阅读[贡献指南](../CONTRIBUTING.md)

content/docs/development/files.mdx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
title: 文件结构
3+
---
4+
5+
## Top Level
6+
7+
| 文件夹 | 说明 |
8+
| --- | --- |
9+
| src | 存放了实际运行的代码 |
10+
| build | 存放了构建后的文件,包括 Dev 和 Prod 版本 |
11+
| docs | 存放了开发文档 |
12+
| assets | 存放了扩展的图标等资源 |
13+
| locales | 存放了多语言的翻译文件 |
14+
| .cursor| 存放了 Cursor 的规则文件 |
15+
16+
## Src 文件夹
17+
18+
| 文件夹 | 说明 |
19+
| --- | --- |
20+
| src/sync | 存放了有关操作不同平台的代码 |
21+
| src/options | 存放了 Options 页面,在这里组织和发布内容 |
22+
| src/components | 存放了所有前端界面操作的组件 |
23+
| src/contents | 存放了注入网页的内容脚本 |
24+
| src/background | 存放了后台脚本 |
25+
| src/popup | 存放了弹窗页面 |
26+
| src/sidepanel | 存放了侧边栏页面 |
27+
| src/utils | 存放了工具函数 |
28+
29+
## Sync 文件夹
30+
31+
| 文件夹 | 说明 |
32+
| --- | --- |
33+
| src/sync/dynamic | 存放了各平台动态发布的操作脚本 |
34+
| src/sync/video | 存放了各平台视频发布的操作脚本 |
35+
| src/sync/article | 存放了各平台文章发布的操作脚本 |
36+
| src/sync/account | 存放了获取各平台账号信息的脚本 |
37+
| src/sync/common.ts | 定义了通用的类型和函数 |
38+
| src/sync/account.ts | 定义了账号信息类型和通用方法 |
39+
| src/sync/extraconfig.ts | 定义了各平台额外配置的存储和读取 |

content/docs/development/index.mdx

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
---
2+
title: 开始开发
3+
---
4+
5+
## 开始使用
6+
7+
首先,安装依赖:
8+
9+
```bash
10+
pnpm i
11+
```
12+
13+
之后,运行 Plasmo 开发服务器:
14+
15+
```bash
16+
pnpm dev
17+
```
18+
19+
在浏览器扩展程序页面中打开开发者模式,点击 `加载已解压的扩展程序` 并找到 `build/chrome-mv3-dev` 进行加载。
20+
21+
## 构建生产版本
22+
23+
运行以下命令:
24+
25+
```bash
26+
pnpm build
27+
```
28+
29+
你可以在 `build` 文件夹下找到构建内容
30+
31+
## 开发说明
32+
33+
### 你需要了解的文档
34+
35+
[Chrome Extension API Reference](https://developer.chrome.com/docs/extensions/reference/api)
36+
37+
[Edge Extension](https://learn.microsoft.com/en-us/microsoft-edge/extensions-chromium/)
38+
39+
[Plasmo Docs](https://docs.plasmo.com/)
40+
41+
## 推荐文章
42+
43+
- [AI全栈指南 Vol.033:5分钟学会内容一键发布多平台](https://mp.weixin.qq.com/s/K7yh6EsBLOGJzl8Gh8SwLw)
44+
45+
### 开发文档
46+
47+
需要注意的是,不同平台的开发在细节上存在不同,不过大体上遵循类似的实现模式。脱离不开 `查找元素 - 编辑元素 - 自动发布` 的实现模式。你可以通过以下文档来了解不同平台的开发细节:
48+
49+
- [构建发布脚本](/docs/development/build-script)
50+
- [抖音动态发布功能开发记录](/docs/development/douyin-dynamic)
51+
- [抖音账号信息获取](/docs/development/douyin-account)
52+
- [B站动态发布功能开发记录](/docs/development/bilibili-dynamic)
53+
54+
### 提出贡献
55+
56+
我们非常欢迎你提出贡献,你可以通过 `pull request` 来提交你的代码。
57+
58+
在提交之前,请先阅读[贡献指南](../CONTRIBUTING.md)

content/docs/development/meta.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
11
{
22
"title": "Development Documentation",
33
"description": "Recording implementation details during development",
4-
"root": true
4+
"root": true,
5+
"pages": [
6+
"---Introduction---",
7+
"index",
8+
"files",
9+
"build-script",
10+
"types",
11+
"---Development---",
12+
"publish",
13+
"account",
14+
"scraper",
15+
"background",
16+
"tabs",
17+
"---Reference---",
18+
"..."
19+
]
520
}

0 commit comments

Comments
 (0)