这是一个基于Node.js的RESTful API服务,可以将任意网页内容转换为Markdown格式。该服务使用puppeteer-core来渲染网页,确保JavaScript动态内容也能被正确处理。
- 🌐 支持任意网页URL
- 🔄 保持浏览器会话持久化
- 📝 智能HTML到Markdown转换
- 🛡️ 内置安全保护和错误处理
- 🐳 Docker支持
- 🚀 高性能异步处理
- Node.js 20+
- Google Chrome/Chromium
- Docker (可选,用于容器化部署)
- 克隆仓库:
git clone [repository-url]
cd fetch-web-api
- 安装依赖:
npm install
- 运行服务:
npm run dev # 开发模式
# 或
npm start # 生产模式
直接从DockerHub拉取预构建的镜像:
docker pull maxazure/fetch-web-api:latest
docker run -d -p 8810:8810 --name fetch-web-api maxazure/fetch-web-api
如果您想自行构建Docker镜像:
docker build -t fetch-web-api .
docker run -d -p 8810:8810 --name fetch-web-api fetch-web-api
本项目使用GitHub Actions进行自动化CI/CD流程:
- 当代码推送到main分支时,自动触发构建流程
- 自动构建Docker镜像
- 自动推送到DockerHub
- 最新版本标签:
maxazure/fetch-web-api:latest
- 提交版本标签:
maxazure/fetch-web-api:<commit-sha>
- 最新版本标签:
- 自动更新DockerHub仓库描述
- 克隆仓库并创建新分支
- 提交代码更改
- 创建Pull Request到main分支
- 合并后自动触发构建和部署
请求:
- 方法:
POST
- 端点:
/api/fetch-markdown
- Content-Type:
application/json
请求体:
{
"url": "https://example.com"
}
成功响应:
{
"status": "success",
"title": "页面标题",
"markdown": "转换后的markdown内容"
}
错误响应:
{
"status": "error",
"message": "错误描述",
"error": "详细错误信息(仅在开发环境)"
}
请求:
- 方法:
GET
- 端点:
/api/health
响应:
{
"status": "success",
"message": "Service is running",
"timestamp": "2024-03-15T01:23:45.678Z"
}
服务配置可以通过环境变量进行自定义:
PORT
: 服务端口号(默认:8810)CHROME_PATH
: Chrome可执行文件路径,默认会根据操作系统自动检测:- MacOS:
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
- Windows:
C:\Program Files\Google\Chrome\Application\chrome.exe
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
- Linux:
/usr/bin/google-chrome
- MacOS:
USER_DATA_DIR
: Chrome用户数据目录(默认:/tmp/chrome-data)NODE_ENV
: 运行环境(development/production)
-
本地开发环境:
- 确保系统已安装Google Chrome
- 如果Chrome安装在非默认位置,通过
CHROME_PATH
环境变量指定:# MacOS例子 export CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" # Windows例子 (PowerShell) $env:CHROME_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe" # Linux例子 export CHROME_PATH="/usr/bin/google-chrome"
-
Docker环境:
- Dockerfile已配置自动安装Chrome
- 会自动检测和使用正确的Chrome路径
- 支持Chromium作为备选方案
服务包含完整的错误处理机制:
- URL验证
- 请求超时控制
- 浏览器异常恢复
- 内存泄漏预防
- 优雅关闭处理
-
在生产环境中,建议:
- 配置反向代理(如Nginx)
- 设置访问控制
- 限制请求频率
- 配置HTTPS
-
Docker部署注意事项:
- 使用非root用户运行
- 限制容器资源使用
- 定期更新依赖
在markdown转换服务中增加了以下改进:
在处理HTML内容时,现在会优先提取<body>
标签内的内容进行转换。这确保了只处理页面的主要内容。
const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
html = bodyMatch ? bodyMatch[1] : html;
增加了对各种无关标签的清理:
-
script标签:移除所有JavaScript代码
html = html.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
-
style标签:移除所有CSS样式
html = html.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, '');
-
link标签:移除外部资源链接
html = html.replace(/<link[^>]*>/gi, '');
保持了原有的功能:
- HTML注释清理
- 特殊字符处理
- Turndown配置(标题样式、代码块等)
- 换行符处理
MIT
这些更新确保了转换后的Markdown内容更加纯净可读,专注于实际内容而不包含任何样式、脚本等干扰元素。