An open API service indexing awesome lists of open source software.

https://github.com/rice-awa/minecraft-wiki-fetch-api

一个用于抓取和转换 Minecraft 中文 Wiki 内容的 API 服务。可搜索或抓取minecraft wiki页面内容并将其转化为markdown格式
https://github.com/rice-awa/minecraft-wiki-fetch-api

fetch-api javascript json markdown mc mczhwiki minecraft nodejs wiki

Last synced: about 2 months ago
JSON representation

一个用于抓取和转换 Minecraft 中文 Wiki 内容的 API 服务。可搜索或抓取minecraft wiki页面内容并将其转化为markdown格式

Awesome Lists containing this project

README

          

# Minecraft Wiki API

一个用于抓取、解析并转换中文 Minecraft Wiki 内容的 REST API,已适配 Vercel Serverless 部署。

## 功能特性

- **Web 控制台**:访问根路径 `/` 即可使用可视化的 API 测试控制台
- **API Key 认证**:支持静态 API Key 认证,保护敏感端点
- **分布式速率限制**:支持 Upstash Redis 分布式限流,区分认证/未认证用户配额
- Wiki 搜索:`GET /api/search`
- 页面获取:`GET /api/page/:pageName`
- 页面源代码(Wikitext):`format=wikitext`
- 批量获取:`POST /api/pages`
- 健康检查:`GET /health`、`GET /health/detailed`
- JSON 美化输出:查询参数 `pretty=true`

## 快速部署到 Vercel

### 方式一:一键部署(推荐)

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/rice-awa/minecraft-wiki-fetch-api&env=WIKI_BASE_URL,REQUEST_TIMEOUT,RATE_LIMIT_MAX&envDescription=API%20Configuration&envLink=https://github.com/rice-awa/minecraft-wiki-fetch-api/blob/main/.env.vercel)

### 方式二:CLI 部署

```bash
git clone https://github.com/rice-awa/minecraft-wiki-fetch-api.git
cd minecraft-wiki-fetch-api
npm install
npm install -g vercel
vercel login
npm run deploy
```

## 部署后验证

将 `https://your-project.vercel.app` 替换为你的实际域名。

**Web 控制台**:直接访问 `https://your-project.vercel.app/`

**API 测试**:

```bash
curl https://your-project.vercel.app/health
curl "https://your-project.vercel.app/api/search?q=钻石&limit=5&pretty=true"
curl "https://your-project.vercel.app/api/page/钻石?format=markdown&pretty=true"
curl "https://your-project.vercel.app/api/page/工作台?format=wikitext&pretty=true"
```

## 环境变量(Vercel)

推荐至少配置以下变量:

| 变量名 | 默认值 | 说明 |
| --- | --- | --- |
| `NODE_ENV` | `production` | 运行环境 |
| `WIKI_BASE_URL` | `https://zh.minecraft.wiki` | Wiki 源站 |
| `REQUEST_TIMEOUT` | `15000` | 外部请求超时(毫秒) |
| `MAX_RETRIES` | `2` | 外部请求重试次数 |
| `RATE_LIMIT_ANONYMOUS` | `30` | 未认证用户每分钟请求数 |
| `RATE_LIMIT_AUTHENTICATED` | `100` | 认证用户每分钟请求数 |
| `RATE_LIMIT_STORE` | `upstash` | 限流存储方式 |
| `UPSTASH_REDIS_REST_URL` | - | Upstash Redis URL(分布式限流必需) |
| `UPSTASH_REDIS_REST_TOKEN` | - | Upstash Redis Token |
| `API_KEY` | - | API 密钥(支持多个,逗号分隔) |
| `SEARCH_MAX_LIMIT` | `30` | 搜索最大条数 |
| `ALLOWED_ORIGINS` | `*` | CORS 白名单(逗号分隔) |
| `LOG_FILE` | `false` | Serverless 建议关闭文件日志 |

完整示例见:`./.env.vercel`

### API Key 认证

设置 `API_KEY` 环境变量启用认证:

```bash
# Vercel CLI
vercel env add API_KEY --env production

# 或在 Vercel Dashboard 中设置
```

**使用方式**:

```bash
# 方式一:请求头
curl -H "X-API-Key: your-api-key" https://your-api.vercel.app/api/pages

# 方式二:查询参数
curl "https://your-api.vercel.app/api/pages?api_key=your-api-key"
```

**端点保护规则**:

| 端点 | 访问级别 | 说明 |
| --- | --- | --- |
| `/health/*` | 公开 | 无需认证,无限流 |
| `/api/search` | 公开 | 无需认证,低限流 |
| `/api/page/:name` | 公开 | 无需认证,低限流 |
| `/api/pages` (POST) | **需认证** | 批量获取,高限流 |
| `/api/page/:name/cache` (DELETE) | **需认证** | 清除缓存 |

### 速率限制

未配置 Upstash 时自动降级到内存存储(本地开发友好)。

**配置项**:
- `RATE_LIMIT_ANONYMOUS=30` - 未认证用户配额
- `RATE_LIMIT_AUTHENTICATED=100` - 认证用户配额
- `RATE_LIMIT_WINDOW=60000` - 时间窗口(毫秒)

## API 概览

### `GET /api/search`

参数:

- `q`(必填):关键词
- `limit`(可选):结果数量,默认 `10`,最大 `50`
- `pretty`(可选):`true/false`

### `GET /api/page/:pageName`

参数:

- `format`(可选):`html` / `markdown` / `both` / `wikitext`
- `pretty`(可选):`true/false`

### `POST /api/pages`

```json
{
"pages": ["钻石", "铁锭"],
"format": "markdown",
"concurrency": 2
}
```

**format 可选值**:`html` / `markdown` / `both` / `wikitext`

### 健康检查

- `GET /health`
- `GET /health/detailed`
- `GET /health/ready`
- `GET /health/live`

## 本地开发

```bash
npm install
npm run dev
```

本地模拟 Serverless:

```bash
npm run dev:serverless
npm run test:serverless
```

## Vercel 适配说明

项目当前使用 `api/index.js` 作为 serverless 入口,配合 `vercel.json` 路由转发,支持:

- **根路径 `/`**:返回 `public/index.html` Web 控制台
- API 路径 `/api` 与 `/api/*`
- 健康检查 `/health` 与 `/health/*`

## 常见问题

### 1. 部署后访问 `/health` 返回 404

确认项目根目录的 `vercel.json` 已随代码部署,并且路由规则包含 `/health` 与 `/health/*`。

### 2. 请求超时

优先检查:

- `REQUEST_TIMEOUT` 是否过大
- 单次批量请求 `pages` 数量是否过多
- 是否触发了上游 Wiki 网络波动

### 3. CORS 报错

请在 Vercel 环境变量中正确设置 `ALLOWED_ORIGINS`,多个域名用逗号分隔。

### 4. 批量获取返回 401 未认证

`POST /api/pages` 端点需要有效的 API Key。请设置 `API_KEY` 环境变量,并在请求中通过 `X-API-Key` 请求头或 `api_key` 查询参数传递。

### 5. 速率限制返回 429

请求过于频繁,请检查响应头中的 `X-RateLimit-Reset` 了解限制重置时间。认证用户享有更高配额。

### 6. Upstash 配置

1. 访问 [Upstash Console](https://console.upstash.io) 创建 Redis 实例
2. 复制 `UPSTASH_REDIS_REST_URL` 和 `UPSTASH_REDIS_REST_TOKEN`
3. 在 Vercel 环境变量中添加这两个值

## 相关文档
- [部署详解](./deploy-vercel.md)
- [API 说明](./docs/API_DOCUMENTATION.md)
- [环境变量](./docs/environment-variables-guide.md)

## 许可证

- 项目代码:`MIT`(见 `./LICENSE`)
- Wiki 内容版权:遵循中文 Minecraft Wiki 所声明的许可条款