koishi-plugin-share-links-analysis 0.15.0 → 0.15.2
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 +206 -42
- package/lib/core.d.ts +1 -0
- package/lib/index.js +323 -22
- package/lib/parsers/bilibili.d.ts +1 -0
- package/lib/parsers/bilibili.js +15 -1
- package/lib/parsers/kugou.d.ts +1 -0
- package/lib/parsers/kugou.js +16 -1
- package/lib/parsers/netease.d.ts +1 -0
- package/lib/parsers/netease.js +17 -1
- package/lib/parsers/qqmusic.d.ts +1 -0
- package/lib/parsers/qqmusic.js +16 -1
- package/lib/parsers/twitter.d.ts +1 -0
- package/lib/parsers/twitter.js +16 -2
- package/lib/parsers/xiaoheihe.d.ts +1 -0
- package/lib/parsers/xiaoheihe.js +15 -1
- package/lib/parsers/xiaohongshu.d.ts +1 -0
- package/lib/parsers/xiaohongshu.js +15 -1
- package/lib/parsers/youtube.d.ts +1 -0
- package/lib/parsers/youtube.js +22 -1
- package/lib/types.d.ts +1 -0
- package/lib/utils.js +117 -25
- package/package.json +48 -31
package/README.md
CHANGED
|
@@ -1,71 +1,235 @@
|
|
|
1
1
|
# koishi-plugin-share-links-analysis
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Koishi 分享链接解析插件。机器人收到支持平台的分享链接后,会自动提取标题、作者、正文、封面、媒体文件和源链接,并按配置发送为普通消息、合并转发或混合模式。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
目前插件内置以下平台解析器:
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- Bilibili
|
|
8
|
+
- Xiaohongshu
|
|
9
|
+
- Twitter / X
|
|
10
|
+
- Xiaoheihe
|
|
11
|
+
- YouTube
|
|
12
|
+
- Netease Music
|
|
13
|
+
- QQ Music
|
|
14
|
+
- Kugou Music
|
|
15
|
+
- GitHub
|
|
8
16
|
|
|
9
|
-
##
|
|
17
|
+
## 功能概览
|
|
10
18
|
|
|
11
|
-
|
|
19
|
+
- 自动识别聊天消息中的分享链接
|
|
20
|
+
- 统一输出标题、作者、统计信息、正文、封面、媒体文件和源链接
|
|
21
|
+
- 支持普通发送、合并转发、混合发送三种发送模式
|
|
22
|
+
- 支持按群组分别开关解析器和 NSFW 策略
|
|
23
|
+
- 支持解析结果时间线缓存与媒体文件缓存
|
|
24
|
+
- 支持乐观缓存回退,接口异常时优先返回最近一次可用结果
|
|
25
|
+
- 支持 CookieCloud 同步和部分平台本地 Cookie 采集
|
|
26
|
+
- 支持按平台代理设置
|
|
27
|
+
- 支持 `share.directlink` 获取直链,便于排障和手动转发
|
|
12
28
|
|
|
13
|
-
|
|
14
|
-
- [koishi-plugin-bili-parser](https://github.com/summonhim/koishi-plugin-bili-parser)
|
|
15
|
-
- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
|
|
16
|
-
- [koishi-plugin-xiaohongshu](https://www.npmjs.com/package/koishi-plugin-xiaohongshu)
|
|
17
|
-
以及解析方式原作者:[@MuJie](https://mu-jie.cc/)
|
|
18
|
-
- [BetterTwitFix](https://github.com/dylanpdx/BetterTwitFix)
|
|
19
|
-
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
|
|
20
|
-
- [NeteaseCloudMusicApiEnhanced](https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced)
|
|
29
|
+
## 运行要求
|
|
21
30
|
|
|
22
|
-
|
|
31
|
+
这个插件不是一个纯 npm 依赖包,它依赖 Koishi 运行时已经启用的服务:
|
|
23
32
|
|
|
24
|
-
|
|
33
|
+
- `database`
|
|
34
|
+
- `puppeteer`
|
|
35
|
+
- `http`
|
|
25
36
|
|
|
26
|
-
|
|
37
|
+
另外有两项环境相关前提:
|
|
27
38
|
|
|
28
|
-
|
|
39
|
+
- 如果你使用 `forward` 或 `mixed` 发送模式,当前实现按 OneBot/Napcat 转发消息能力设计,实际兼容性以你的适配器为准。
|
|
40
|
+
- YouTube 解析必须额外部署仓库里的 `yt_server.py`,只安装本插件本身不够。
|
|
29
41
|
|
|
30
|
-
|
|
31
|
-
- **Python 3.8+**
|
|
32
|
-
- **Node.js** (⚠️ 必须安装!`yt-dlp` 需要调用 Node 环境来执行 JS 脚本破解签名)
|
|
33
|
-
- **一个能够正常访问 YouTube 的网络代理** (强烈建议使用流媒体解锁节点)
|
|
42
|
+
## 配置
|
|
34
43
|
|
|
35
|
-
###
|
|
44
|
+
### 基础发送
|
|
36
45
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
46
|
+
- `Video_ClarityPriority`: 视频清晰度优先级。
|
|
47
|
+
- `Max_size`: 允许发送的最大文件大小,单位 MB。
|
|
48
|
+
- `useForward`: 发送模式,可选 `plain`、`forward`、`mixed`。
|
|
49
|
+
- `usingLocal`: 是否先下载到本地再发送。
|
|
50
|
+
- `sendFiles`: 是否发送视频、音频等文件。
|
|
51
|
+
- `sendVoice`: 音乐解析时是否额外发送语音。
|
|
52
|
+
- `sendLinks`: 在部分发送模式下追加直链。
|
|
53
|
+
|
|
54
|
+
### 缓存
|
|
55
|
+
|
|
56
|
+
- `enableCache`: 开启解析缓存和文件缓存。
|
|
57
|
+
- `cacheExpiration`: L1 解析缓存有效期,单位小时,`0` 表示永不过期。
|
|
58
|
+
- `optimisticCache`: 开启乐观缓存。
|
|
59
|
+
- `optimisticExpiration`: L2 乐观缓存保留时长,单位小时,`0` 表示永不过期。
|
|
60
|
+
- `autoCleanInterval`: 自动清理检查周期,单位小时,`0` 表示不自动清理。
|
|
61
|
+
|
|
62
|
+
缓存行为是两层的:
|
|
63
|
+
|
|
64
|
+
- 解析结果保存在 `sla_parse_timeline`
|
|
65
|
+
- 下载过的媒体文件保存在 `sla_file_cache`
|
|
66
|
+
|
|
67
|
+
当重新解析结果没有变化时,插件会只刷新最新时间线节点的 `last_checked_at`;当结果有变化时,会写入新的时间线节点,并记录自动生成的差异摘要。
|
|
68
|
+
|
|
69
|
+
### 模板格式
|
|
70
|
+
|
|
71
|
+
默认模板支持以下占位符:
|
|
72
|
+
|
|
73
|
+
- `{title}`
|
|
74
|
+
- `{cover}`
|
|
75
|
+
- `{authorName}`
|
|
76
|
+
- `{mainbody}`
|
|
77
|
+
- `{stats}`
|
|
78
|
+
- `{cache}`
|
|
79
|
+
- `{sourceUrl}`
|
|
80
|
+
|
|
81
|
+
### 群组策略
|
|
82
|
+
|
|
83
|
+
- `default_parsers`: 全局默认启用的解析器集合
|
|
84
|
+
- `allow_sensitive`: 默认是否允许敏感内容
|
|
85
|
+
|
|
86
|
+
群里可以再用指令覆盖默认值,覆盖结果保存在 `sla_group_settings`。
|
|
87
|
+
|
|
88
|
+
### 代理与 Cookie
|
|
89
|
+
|
|
90
|
+
- `proxy`: 全局代理地址
|
|
91
|
+
- `proxy_settings.<parser>`: 是否对特定解析器启用代理
|
|
92
|
+
- `cookieCloud.*`: CookieCloud 同步配置
|
|
93
|
+
|
|
94
|
+
插件会优先尝试 CookieCloud,同步不到时,再对支持的平台执行本地 Cookie 采集。
|
|
95
|
+
|
|
96
|
+
### 路径映射
|
|
97
|
+
|
|
98
|
+
如果 Koishi 和 OneBot 实现在不同容器或不同挂载路径中运行,需要正确设置:
|
|
99
|
+
|
|
100
|
+
- `onebotReadDir`
|
|
101
|
+
- `localDownloadDir`
|
|
102
|
+
|
|
103
|
+
这两个配置用于把 Koishi 下载后的本地文件路径映射成 OneBot 侧可读取的路径。
|
|
104
|
+
|
|
105
|
+
## YouTube 解析服务部署
|
|
106
|
+
|
|
107
|
+
YouTube 解析依赖仓库内的 `yt_server.py`。TypeScript 侧会向这个服务的 `/api/parse` 发起请求;插件配置项 `youtube_ApiUrl` 填的是服务基础地址,不是完整接口地址。
|
|
108
|
+
|
|
109
|
+
### 环境要求
|
|
110
|
+
|
|
111
|
+
- Python 3.8+
|
|
112
|
+
- Node.js
|
|
113
|
+
- 可访问 YouTube 的网络代理
|
|
114
|
+
|
|
115
|
+
`yt-dlp` 这里通过 Node runtime 处理 YouTube 相关脚本,所以机器上需要可用的 Node.js。
|
|
116
|
+
|
|
117
|
+
### 安装依赖
|
|
42
118
|
|
|
43
|
-
**2. 安装 Python 依赖**
|
|
44
119
|
```bash
|
|
45
120
|
pip install httpx fastapi uvicorn yt-dlp
|
|
46
121
|
```
|
|
47
122
|
|
|
48
|
-
|
|
49
|
-
|
|
123
|
+
### 配置代理
|
|
124
|
+
|
|
125
|
+
编辑 [yt_server.py](./yt_server.py),修改顶部的 `proxy`:
|
|
126
|
+
|
|
50
127
|
```python
|
|
51
|
-
|
|
52
|
-
# 配置代理
|
|
53
|
-
proxy = "http://127.0.0.1:7890" # 👈 在这里填入你的代理IP和端口
|
|
54
|
-
# =====================================
|
|
128
|
+
proxy = "http://127.0.0.1:7890"
|
|
55
129
|
```
|
|
56
130
|
|
|
57
|
-
|
|
131
|
+
### 启动服务
|
|
132
|
+
|
|
58
133
|
```bash
|
|
59
134
|
python yt_server.py
|
|
60
135
|
```
|
|
61
|
-
*(注:由于脚本内置了自动更新热重启逻辑,强烈建议直接使用上述命令启动,或者使用 `pm2 start yt_server.py --name yt-api --interpreter python3` 进行后台进程守护。)*
|
|
62
136
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
在 `youtube_pythonApiUrl` 配置项中填入你的后端地址:
|
|
137
|
+
默认监听:
|
|
138
|
+
|
|
66
139
|
```text
|
|
67
|
-
http://127.0.0.1:12001
|
|
140
|
+
http://127.0.0.1:12001
|
|
68
141
|
```
|
|
69
|
-
*(如果你的 Python 服务部署在其他服务器上,请将 `127.0.0.1` 替换为对应的服务器 IP)*
|
|
70
142
|
|
|
71
|
-
|
|
143
|
+
### 在插件中填写配置
|
|
144
|
+
|
|
145
|
+
将 `youtube_ApiUrl` 设为:
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
http://127.0.0.1:12001
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
不要写成 `http://127.0.0.1:12001/api/parse `,因为插件代码会自动拼接 `/api/parse`。
|
|
152
|
+
|
|
153
|
+
### 这个服务还做了什么
|
|
154
|
+
|
|
155
|
+
- 启动时自动检查一次 `yt-dlp` 更新
|
|
156
|
+
- 每 12 小时自动检查一次更新
|
|
157
|
+
- 更新后通过 `os.execv` 热重启自己
|
|
158
|
+
- 暴露 `/api/stream` 给插件做媒体流透传
|
|
159
|
+
|
|
160
|
+
## 支持平台
|
|
161
|
+
|
|
162
|
+
| 平台 | 说明 |
|
|
163
|
+
|---------------|----------------------------------|
|
|
164
|
+
| Bilibili | 视频、直播、专栏、动态、空间、音频、番剧等常见分享链接 |
|
|
165
|
+
| Xiaohongshu | 图文与视频笔记 |
|
|
166
|
+
| Twitter / X | 推文内容与媒体 |
|
|
167
|
+
| Xiaoheihe | 帖子内容与媒体 |
|
|
168
|
+
| YouTube | 视频与 Shorts,需要独立 Python 服务 |
|
|
169
|
+
| Netease Music | 歌曲、节目,依赖 NeteaseCloudMusicApi 服务 |
|
|
170
|
+
| QQ Music | 常见歌曲分享链接 |
|
|
171
|
+
| Kugou Music | 常见歌曲分享链接 |
|
|
172
|
+
| GitHub | 仓库链接基础信息 |
|
|
173
|
+
|
|
174
|
+
## 指令
|
|
175
|
+
|
|
176
|
+
所有指令都挂在 `share` 下。
|
|
177
|
+
|
|
178
|
+
| 指令 | 权限 | 作用 |
|
|
179
|
+
|------------------------------------|----|---------------------------------------|
|
|
180
|
+
| `share` | 1 | 查看当前群的解析器状态和 NSFW 状态 |
|
|
181
|
+
| `share.parsers [name] [mode]` | 1 | 开关当前群某个解析器,写入需要群管理员 |
|
|
182
|
+
| `share.nsfw [value]` | 1 | 开关当前群 NSFW 解析,写入需要群管理员 |
|
|
183
|
+
| `share.reset` | 1 | 当前群恢复全局默认策略 |
|
|
184
|
+
| `share.checkcache <url> [index]` | 1 | 查看时间线缓存,或读取指定历史节点 |
|
|
185
|
+
| `share.forceparse <url>` | 2 | 忽略缓存强制解析,并更新缓存时间线 |
|
|
186
|
+
| `share.forcecache <url>` | 2 | 强制刷新缓存,但不发送解析结果 |
|
|
187
|
+
| `share.directlink <url> [quality]` | 1 | 获取视频或音频直链,`quality` 支持 `high` / `low` |
|
|
188
|
+
| `share.clean` | 3 | 清空解析时间线、文件缓存记录和已缓存文件 |
|
|
189
|
+
| `share.refresh` | 3 | 强制刷新所有平台 Cookie |
|
|
190
|
+
| `share.migratecache` | 4 | 将旧 `sla_parse_cache` 迁移到新时间线结构 |
|
|
191
|
+
| `share.migratecacheformat` | 4 | 迁移新旧 cacheKey 格式并合并重复节点 |
|
|
192
|
+
| `share.dropoldcache` | 4 | 清空并尝试删除旧 `sla_parse_cache` |
|
|
193
|
+
|
|
194
|
+
## 数据表
|
|
195
|
+
|
|
196
|
+
插件会使用这些 Koishi 数据表:
|
|
197
|
+
|
|
198
|
+
- `sla_parse_timeline`: 解析结果时间线
|
|
199
|
+
- `sla_file_cache`: 已下载文件缓存
|
|
200
|
+
- `sla_cookie_cache`: 平台 Cookie 缓存
|
|
201
|
+
- `sla_group_settings`: 群组解析器与 NSFW 覆盖配置
|
|
202
|
+
- `sla_parse_cache`: 不在使用,支持通过迁移指令迁移到新数据库
|
|
203
|
+
|
|
204
|
+
## 开发说明
|
|
205
|
+
|
|
206
|
+
### 目录结构
|
|
207
|
+
|
|
208
|
+
- [src/index.ts](./src/index.ts): 插件入口、命令注册、缓存生命周期、数据库模型
|
|
209
|
+
- [src/core.ts](./src/core.ts): 解析器注册与分发
|
|
210
|
+
- [src/types.ts](./src/types.ts): 类型定义与 Koishi 模块扩展
|
|
211
|
+
- [src/utils.ts](./src/utils.ts): 下载、缓存、Cookie、发送、代理、权限判断
|
|
212
|
+
- [src/parsers/](./src/parsers): 各平台解析器实现
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
### 新增平台解析器
|
|
216
|
+
|
|
217
|
+
1. 在 `src/parsers/` 下新增平台文件。
|
|
218
|
+
2. 实现统一的解析器接口:`name`、`match()`、`process()`,按需补充 `init()`、`lc_get_cookie()`、`getFileCacheKey()`。
|
|
219
|
+
3. 在 src/core.ts 的 `parsers` 数组中注册。
|
|
220
|
+
|
|
221
|
+
## 鸣谢
|
|
222
|
+
|
|
223
|
+
本插件的实现参考或依赖了以下项目与资料:
|
|
224
|
+
|
|
225
|
+
- [koishi-plugin-bilibili-videolink-analysis](https://github.com/shangxueink/koishi-shangxue-apps/tree/main/plugins/bilibili-videolink-analysis)
|
|
226
|
+
- [koishi-plugin-bili-parser](https://github.com/summonhim/koishi-plugin-bili-parser)
|
|
227
|
+
- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect)
|
|
228
|
+
- [koishi-plugin-xiaohongshu](https://www.npmjs.com/package/koishi-plugin-xiaohongshu) 以及解析方式原作者:[@MuJie](https://mu-jie.cc/)
|
|
229
|
+
- [BetterTwitFix](https://github.com/dylanpdx/BetterTwitFix)
|
|
230
|
+
- [yt-dlp](https://github.com/yt-dlp/yt-dlp)
|
|
231
|
+
- [NeteaseCloudMusicApiEnhanced](https://github.com/NeteaseCloudMusicApiEnhanced/api-enhanced)
|
|
232
|
+
|
|
233
|
+
## License
|
|
234
|
+
|
|
235
|
+
本项目采用 [MIT](LICENSE) 开源许可。
|
package/lib/core.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ interface ParserModule {
|
|
|
5
5
|
match: (content: string, ctx: Context, config: PluginConfig) => Promise<Link[]>;
|
|
6
6
|
init?: (ctx: Context, config: PluginConfig) => Promise<any> | any;
|
|
7
7
|
lc_get_cookie?: (ctx: Context, config: PluginConfig) => Promise<string>;
|
|
8
|
+
getFileCacheKey?: (url: string, linkId?: string) => string | null;
|
|
8
9
|
process: (ctx: Context, config: PluginConfig, link: Link, session: Session) => Promise<ParsedInfo | null>;
|
|
9
10
|
[key: string]: any;
|
|
10
11
|
}
|