# 自定义解析器API使用指南
## 📡 API端点
当你在演练场发布自定义解析器后,可以通过以下API端点使用:
---
## 1️⃣ 302重定向(直接下载)
**端点**: `/parser`
**方法**: `GET`
**描述**: 返回302重定向到实际下载地址,适合浏览器直接访问下载
### 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| url | string | ✅ 是 | 分享链接(需URL编码) |
| pwd | string | ❌ 否 | 分享密码 |
### 请求示例
```bash
# 基本请求
GET http://localhost:6400/parser?url=https://lanzoui.com/i7Aq12ab3cd
# 带密码
GET http://localhost:6400/parser?url=https://lanzoui.com/i7Aq12ab3cd&pwd=1234
# curl命令
curl -L "http://localhost:6400/parser?url=https://lanzoui.com/i7Aq12ab3cd"
```
### 响应
```http
HTTP/1.1 302 Found
Location: https://download-server.com/file/xxx
```
浏览器会自动跳转到下载地址。
---
## 2️⃣ JSON响应(获取解析结果)
**端点**: `/json/parser`
**方法**: `GET`
**描述**: 返回JSON格式的解析结果,包含下载链接等详细信息
### 请求参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| url | string | ✅ 是 | 分享链接(需URL编码) |
| pwd | string | ❌ 否 | 分享密码 |
### 请求示例
```bash
# 基本请求
GET http://localhost:6400/json/parser?url=https://lanzoui.com/i7Aq12ab3cd
# 带密码
GET http://localhost:6400/json/parser?url=https://lanzoui.com/i7Aq12ab3cd&pwd=1234
# curl命令
curl "http://localhost:6400/json/parser?url=https://lanzoui.com/i7Aq12ab3cd"
```
### 响应格式
```json
{
"code": 200,
"msg": "success",
"data": {
"url": "https://download-server.com/file/xxx",
"fileName": "example.zip",
"fileSize": "10MB",
"parseTime": 1234
}
}
```
---
## 🔧 使用场景
### 场景1: 浏览器直接下载
用户点击链接直接下载:
```html
点击下载
```
### 场景2: 获取下载信息
JavaScript获取下载链接:
```javascript
fetch('http://localhost:6400/json/parser?url=https://lanzoui.com/i7Aq12ab3cd')
.then(res => res.json())
.then(data => {
console.log('下载链接:', data.data.url);
console.log('文件名:', data.data.fileName);
});
```
### 场景3: 命令行下载
```bash
# 方式1: 直接下载
curl -L -O "http://localhost:6400/parser?url=https://lanzoui.com/i7Aq12ab3cd"
# 方式2: 先获取链接再下载
DOWNLOAD_URL=$(curl -s "http://localhost:6400/json/parser?url=https://lanzoui.com/i7Aq12ab3cd" | jq -r '.data.url')
curl -L -O "$DOWNLOAD_URL"
```
### 场景4: Python脚本
```python
import requests
# 获取解析结果
response = requests.get(
'http://localhost:6400/json/parser',
params={
'url': 'https://lanzoui.com/i7Aq12ab3cd',
'pwd': '1234'
}
)
result = response.json()
if result['code'] == 200:
download_url = result['data']['url']
print(f'下载链接: {download_url}')
# 下载文件
file_response = requests.get(download_url)
with open('download.file', 'wb') as f:
f.write(file_response.content)
```
---
## 🎯 解析器匹配规则
系统会根据分享链接的URL自动选择合适的解析器:
1. **优先匹配自定义解析器**
- 检查演练场发布的解析器
- 使用 `@match` 正则表达式匹配
2. **内置解析器**
- 如果没有匹配的自定义解析器
- 使用系统内置的解析器
### 示例
假设你发布了蓝奏云解析器:
```javascript
// @match https?://lanzou[a-z]{1,2}\.com/(?[a-zA-Z0-9]+)
```
当请求以下链接时会使用你的解析器:
- ✅ `https://lanzoui.com/i7Aq12ab3cd`
- ✅ `https://lanzoux.com/i7Aq12ab3cd`
- ✅ `http://lanzouy.com/i7Aq12ab3cd`
---
## ⚙️ 高级用法
### 1. 指定解析器类型
```bash
# 通过type参数指定解析器
GET http://localhost:6400/parser?url=https://example.com/s/abc&type=custom_parser
```
### 2. 获取文件列表
对于支持文件夹的网盘:
```bash
# 获取文件列表
GET http://localhost:6400/json/parser/list?url=https://example.com/s/abc
# 按文件ID获取下载链接
GET http://localhost:6400/json/parser/file?url=https://example.com/s/abc&fileId=123
```
### 3. 批量解析
```javascript
const urls = [
'https://lanzoui.com/i7Aq12ab3cd',
'https://lanzoui.com/i8Bq34ef5gh'
];
const results = await Promise.all(
urls.map(url =>
fetch(`http://localhost:6400/json/parser?url=${encodeURIComponent(url)}`)
.then(res => res.json())
)
);
```
---
## 🔒 安全注意事项
### 1. SSRF防护
系统已实施SSRF防护,以下请求会被拦截:
❌ 内网地址:
```bash
# 这些会被拦截
http://127.0.0.1:8080/admin
http://192.168.1.1/config
http://169.254.169.254/latest/meta-data/
```
✅ 公网地址:
```bash
# 这些是允许的
https://lanzoui.com/xxx
https://pan.baidu.com/s/xxx
```
### 2. 速率限制
建议添加速率限制,避免滥用:
```javascript
// 使用节流
import { throttle } from 'lodash';
const parseUrl = throttle((url) => {
return fetch(`/json/parser?url=${encodeURIComponent(url)}`);
}, 1000); // 每秒最多1次请求
```
---
## 📊 错误处理
### 常见错误码
| 错误码 | 说明 | 解决方法 |
|--------|------|----------|
| 400 | 参数错误 | 检查url参数是否正确编码 |
| 404 | 未找到解析器 | 确认链接格式是否匹配解析器规则 |
| 500 | 解析失败 | 查看日志,可能是解析器代码错误 |
| 503 | 服务不可用 | 稍后重试 |
### 错误响应示例
```json
{
"code": 500,
"msg": "解析失败: 无法提取下载参数",
"data": null
}
```
### 错误处理示例
```javascript
fetch('/json/parser?url=' + encodeURIComponent(shareUrl))
.then(res => res.json())
.then(data => {
if (data.code === 200) {
console.log('成功:', data.data.url);
} else {
console.error('失败:', data.msg);
}
})
.catch(error => {
console.error('请求失败:', error.message);
});
```
---
## 💡 最佳实践
### 1. URL编码
始终对分享链接进行URL编码:
```javascript
// ✅ 正确
const encodedUrl = encodeURIComponent('https://lanzoui.com/i7Aq12ab3cd');
fetch(`/json/parser?url=${encodedUrl}`);
// ❌ 错误
fetch('/json/parser?url=https://lanzoui.com/i7Aq12ab3cd');
```
### 2. 错误重试
实现指数退避重试:
```javascript
async function parseWithRetry(url, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
const response = await fetch(`/json/parser?url=${encodeURIComponent(url)}`);
const data = await response.json();
if (data.code === 200) {
return data;
}
// 如果是服务器错误,重试
if (data.code >= 500 && i < maxRetries - 1) {
await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
continue;
}
throw new Error(data.msg);
} catch (error) {
if (i === maxRetries - 1) throw error;
await new Promise(resolve => setTimeout(resolve, Math.pow(2, i) * 1000));
}
}
}
```
### 3. 超时处理
设置请求超时:
```javascript
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000); // 30秒超时
fetch('/json/parser?url=' + encodeURIComponent(url), {
signal: controller.signal
})
.then(res => res.json())
.finally(() => clearTimeout(timeout));
```
---
## 📚 更多资源
- **演练场文档**: `/parser/doc/JAVASCRIPT_PARSER_GUIDE.md`
- **自定义解析器**: `/parser/doc/CUSTOM_PARSER_GUIDE.md`
- **安全指南**: `/parser/doc/security/`
---
**最后更新**: 2025-11-29
**版本**: v1.0