# Academic Search Proxy - Cloudflare Worker

CORS 代理服务，解决浏览器访问学术搜索 API 的跨域限制。

## 支持的服务

- ✅ **Semantic Scholar** - AI 驱动的学术搜索
- ✅ **PubMed** - 医学/生物学文献数据库
- ✅ **CrossRef** - DOI 注册机构数据库
- ✅ **OpenAlex** - 开放学术图谱
- ✅ **arXiv** - 预印本服务器

## 快速开始

### 本地开发

```bash
cd workers/academic-search-proxy
npx wrangler dev
```

服务将在 `http://localhost:8787` 启动。

### 部署到 Cloudflare

```bash
# 首次部署
npx wrangler deploy

# 设置环境变量（可选）
npx wrangler secret put SEMANTIC_SCHOLAR_API_KEY
npx wrangler secret put PUBMED_API_KEY
npx wrangler secret put AUTH_SECRET
```

## API 端点

### 健康检查
```
GET /health
```

返回服务状态和配置信息。

### Semantic Scholar
```
GET /api/semanticscholar/graph/v1/paper/search?query=machine+learning&limit=5
```

### PubMed
```
GET /api/pubmed/esearch.fcgi?db=pubmed&term=cancer&retmode=json&retmax=5
GET /api/pubmed/efetch.fcgi?db=pubmed&id=12345&retmode=xml
```

### CrossRef
```
GET /api/crossref/works?query.title=deep+learning&rows=5
```

### OpenAlex
```
GET /api/openalex/works?search=neural+networks
```

### arXiv
```
GET /api/arxiv/query?search_query=ti:transformer&max_results=5
```

## 客户端使用

修改前端代码，将直接 API 调用改为通过代理：

```javascript
// 配置代理地址
const PROXY_BASE = 'https://your-worker.workers.dev';

// Semantic Scholar
fetch(`${PROXY_BASE}/api/semanticscholar/graph/v1/paper/search?query=test`)

// PubMed
fetch(`${PROXY_BASE}/api/pubmed/esearch.fcgi?db=pubmed&term=cancer&retmode=json`)

// CrossRef
fetch(`${PROXY_BASE}/api/crossref/works?query.title=test`)

// OpenAlex
fetch(`${PROXY_BASE}/api/openalex/works?search=test`)

// arXiv
fetch(`${PROXY_BASE}/api/arxiv/query?search_query=ti:test`)
```

## 配置

### 环境变量

在 `wrangler.toml` 中配置（或使用 Cloudflare Dashboard）：

```toml
[vars]
ENABLE_AUTH = "false"
ALLOWED_ORIGINS = "http://localhost:8080,https://yourdomain.com"
```

### Secrets（敏感信息）

使用 wrangler CLI 设置：

```bash
# Semantic Scholar API Key (可选，提高速率限制)
npx wrangler secret put SEMANTIC_SCHOLAR_API_KEY

# PubMed API Key (可选，提高速率限制)
npx wrangler secret put PUBMED_API_KEY

# 认证密钥（如果启用 ENABLE_AUTH）
npx wrangler secret put AUTH_SECRET
```

### 客户端 API Key 透传

如果不想在 Worker 中存储 API Key，可以从客户端传递：

```javascript
fetch(`${PROXY_BASE}/api/semanticscholar/...`, {
    headers: {
        'X-Api-Key': 'your-client-api-key'
    }
})
```

### 启用认证

1. 设置 `ENABLE_AUTH = "true"`
2. 设置 `AUTH_SECRET`
3. 客户端请求时包含认证头：

```javascript
fetch(`${PROXY_BASE}/api/...`, {
    headers: {
        'X-Auth-Key': 'your-auth-secret'
    }
})
```

## 速率限制

### 无 API Key
- **Semantic Scholar**: 20 请求/分钟
- **PubMed**: 3 请求/秒

### 有 API Key
- **Semantic Scholar**: 180 请求/分钟（提升 9 倍）
- **PubMed**: 10 请求/秒（提升 3 倍）

### 获取 API Key
- [Semantic Scholar API](https://www.semanticscholar.org/product/api)
- [NCBI API Key](https://www.ncbi.nlm.nih.gov/account/settings/)

## 安全建议

1. ✅ 在生产环境启用 `ENABLE_AUTH`
2. ✅ 设置 `ALLOWED_ORIGINS` 限制来源
3. ✅ 使用 Secrets 存储敏感信息
4. ✅ 监控使用量，避免滥用
5. ✅ 定期轮换 `AUTH_SECRET`

## 故障排查

### CORS 错误
确保 Worker 返回正确的 CORS 头。检查：
- `Access-Control-Allow-Origin`
- `Access-Control-Allow-Methods`
- `Access-Control-Allow-Headers`

### 401 Unauthorized
- 检查 `ENABLE_AUTH` 配置
- 确认 `X-Auth-Key` 头正确
- 验证 `ALLOWED_ORIGINS` 包含你的域名

### API 速率限制
- 考虑添加 API Key
- 实现客户端缓存
- 添加请求去重逻辑

## 开发

### 目录结构
```
workers/academic-search-proxy/
├── src/
│   └── index.js        # Worker 主文件
├── wrangler.toml       # Cloudflare 配置
├── README.md           # 本文档
└── DEPLOY.md           # 部署指南
```

### 测试

```bash
# 健康检查
curl https://your-worker.workers.dev/health

# Semantic Scholar
curl "https://your-worker.workers.dev/api/semanticscholar/graph/v1/paper/search?query=test"

# PubMed
curl "https://your-worker.workers.dev/api/pubmed/esearch.fcgi?db=pubmed&term=cancer&retmode=json"
```

## License

MIT
