基于 Cloudflare Workers 的智能内容解析与 Notion 同步系统,支持小红书和抖音内容的自动化处理与同步。
- 小红书解析: 提取标题、作者、正文、图片和视频,支持图文、视频、Live图等多种内容类型
- 抖音解析: 解析视频和图集内容,提取无水印视频链接,支持Live图识别
- 智能链接提取: 从分享文本中自动识别并提取小红书/抖音链接
- 防盗链解决: 下载原始媒体文件,解决平台防盗链问题
- 格式优化: 优先选择JPEG格式,确保Notion兼容性,避免WebP格式问题
- 智能存储: 根据文件大小自动选择存储方式(图床 vs CDN代理)
- 批量处理: 优化的批次处理机制,避免请求过载
- CDN代理: 大文件自动使用CDN代理,提升访问速度
- 自动同步: 解析内容直接同步到Notion数据库
- 智能标签: 自动生成平台、内容类型、Live图等标签
- 媒体展示: 图片、视频在Notion中完美展示
- 封面设置: 自动设置页面封面图片
- 环境感知: 生产环境自动减少日志输出,开发环境详细调试
- 分级日志: DEBUG、INFO、WARN、ERROR 四级日志管理
- 分类日志: 媒体处理、Live图、解析、同步等专门日志方法
- 性能优化: 避免不必要的日志计算,提升运行效率
- 环境变量控制: 通过
LOG_LEVEL环境变量灵活控制
- 统一配置: 所有硬编码值移到配置文件,便于维护
- 类型安全: 完整的 TypeScript 类型定义
- 批次优化: 可配置的批次大小和延迟时间
- 存储策略: 灵活的文件大小阈值和存储选择
- 运行环境: Cloudflare Workers (Edge Computing)
- 开发语言: TypeScript (ES6+语法)
- 路由框架: itty-router
- 存储服务: Cloudflare KV + R2 + TG-Image图床
- API集成: Notion API
- 日志系统: 环境感知的分级日志系统
- 配置管理: 类型安全的配置化管理
src/
├── index.ts # 主入口,HTTP路由处理
├── xiaohongshuParser.ts # 小红书内容解析器
├── douyinParser.ts # 抖音内容解析器
├── media.ts # 媒体文件处理核心
├── imageHost.ts # 图床服务接口
├── notionSync.ts # Notion同步核心
├── config.ts # 系统配置管理
├── logger.ts # 统一日志系统
├── proxyUrl.ts # CDN代理URL生成
└── utils.ts # 通用工具函数
- Cloudflare 账号(Workers + KV + R2)
- Notion 账号和 API Token
- TG-Image 图床账号(可选)
- Wrangler CLI 工具
git clone https://github.com/blurmood/SyncToNotion.git
cd SyncToNotionnpm install编辑 wrangler.toml 文件,配置您的资源:
# KV命名空间
kv_namespaces = [
{ binding = "CACHE_KV", id = "your-kv-namespace-id" }
]
# R2存储桶
[[r2_buckets]]
binding = "MEDIA_BUCKET"
bucket_name = "your-bucket-name"
# 环境变量
[vars]
ADMIN_KEY = "your-admin-key"
IMAGE_HOST_USERNAME = "your-image-host-username"
IMAGE_HOST_PASSWORD = "your-image-host-password"
LOG_LEVEL = "WARN" # 生产环境推荐 WARN,开发环境可用 DEBUG在 src/config.ts 中配置您的Notion信息:
export const NOTION_CONFIG = {
TOKEN: 'your-notion-integration-token',
DATABASE_ID: 'your-database-id',
// ... 其他配置
};# 构建TypeScript
npm run build
# 部署到Cloudflare Workers
npm run deployGET /parse?url={链接地址}&refresh={是否强制刷新}参数说明:
url: 小红书或抖音链接refresh: 可选,true时强制刷新缓存
示例请求:
curl "https://your-worker.your-subdomain.workers.dev/parse?url=https://www.xiaohongshu.com/explore/xxx"响应示例:
{
"title": "示例标题",
"author": {
"name": "作者昵称",
"id": "作者ID",
"avatar": "https://processed-avatar-url.jpg"
},
"content": "正文内容...",
"images": [
"https://processed-image-url-1.jpg",
"https://processed-image-url-2.jpg"
],
"video": "https://processed-video-url.mp4",
"stats": {
"likes": 1000,
"comments": 50,
"collects": 30,
"shares": 20
},
"original_url": "https://www.xiaohongshu.com/explore/xxx",
"parsed_at": "2024-12-18T12:00:00Z",
"_cache": "hit"
}POST /extract-link
Content-Type: application/json
{
"text": "分享文本内容"
}响应示例:
{
"found": true,
"link": "https://xhslink.com/xxx",
"platform": "小红书",
"original_text": "原始分享文本"
}POST /sync-from-text
Content-Type: application/json
{
"text": "包含小红书/抖音链接的分享文本",
"key": "your-admin-key",
"tags": ["自定义标签1", "自定义标签2"]
}参数说明:
text: 包含链接的分享文本key: 管理员密钥(必需)tags: 自定义标签数组(可选)
示例请求:
curl -X POST "https://your-worker.your-subdomain.workers.dev/sync-from-text" \
-H "Content-Type: application/json" \
-d '{
"text": "48 机智星球X博士发布了一篇小红书笔记,快来看吧! 😆 FrIaI2M8JntUjM9 😆 http://xhslink.com/a/cEUvjvndbsAdb,复制本条信息,打开【小红书】App查看精彩内容!",
"key": "your-admin-key",
"tags": ["收藏", "学习"]
}'成功响应:
{
"message": "同步到 Notion 成功",
"extracted_link": "http://xhslink.com/a/cEUvjvndbsAdb",
"platform": "小红书",
"notion_page_id": "8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"notion_page_url": "https://www.notion.so/your-workspace/xxx",
"applied_tags": ["小红书", "图文", "收藏", "学习"],
"video_processed": false,
"video_processing": false,
"video_url": null,
"async_processing": false,
"note": "同步处理完成"
}GET /health响应:
{
"status": "ok",
"timestamp": "2024-12-18T12:00:00Z"
}GET /admin/refresh-token?key=your-admin-key- 多平台支持: 自动识别小红书和抖音链接
- 内容类型检测: 图文、视频、Live图自动分类
- 格式优化: 优先选择JPEG格式,确保Notion兼容性
- 防盗链解决: 下载并重新托管所有媒体文件
- 智能存储策略:
- 小文件(< 19MB): TG-Image图床
- 大文件(≥ 19MB): Cloudflare R2存储
- 并发处理: 多媒体文件同时处理,提升效率
- 格式转换: WebP自动转换为JPG
- 智能标签系统:
- 平台标签: 小红书、抖音
- 内容类型: 图文、视频、实况图片
- 自定义标签: 用户可添加个性化标签
- 完美展示: 图片、视频在Notion中原生展示
- 封面设置: 自动设置页面封面图片
- 缓存机制: KV存储避免重复处理
- 错误重试: 网络请求和文件上传自动重试
- 降级处理: 多层降级策略,确保服务可用性
- 权限控制: 管理员密钥保护API安全
- 性能监控: 专业日志系统,便于性能分析和问题排查
- 环境感知: 生产环境自动优化日志输出,减少约80%的日志量
- 分类日志: 媒体、Live图、解析、同步等12种专门日志方法
- 性能提升: 避免不必要的字符串拼接和日志计算
- 调试友好: 开发环境提供详细的调试信息
- 统一配置: 所有硬编码值移到配置文件,提升可维护性
- 类型安全: 完整的 TypeScript 类型定义
- 灵活调整: 批次大小、延迟时间、文件阈值等可配置
- 清洁代码: 移除了267个console语句,代码更加整洁
- 模块化: 更好的代码组织和模块划分
- 错误处理: 更完善的错误处理和恢复机制
- 仅供个人学习和研究使用
- 请遵守相关平台的使用条款
- 不得用于商业用途或大规模数据采集
- 请尊重原创作者的版权
- 依赖第三方平台API,可能受到限制
- 媒体文件处理有大小限制
- 需要稳定的网络环境
- ✨ 新增: 专业日志系统,支持环境感知和分级日志
- ✨ 新增: 配置化管理,所有参数可配置
- ✨ 新增: CDN代理功能,支持大文件代理访问
- 🔧 优化: 批量处理机制,避免请求过载
- 🔧 优化: 代码质量提升,移除267个console语句
- 🔧 优化: 错误处理和恢复机制
- 🐛 修复: Live图处理的稳定性问题
- 🎉 发布: 基础功能完整实现
- ✨ 支持: 小红书和抖音内容解析
- ✨ 支持: Notion自动同步
- ✨ 支持: 智能媒体处理
本项目采用 MIT 协议开源,详见 LICENSE 文件。
# wrangler.toml
[[r2_buckets]]
binding = "MEDIA_BUCKET"
bucket_name = "your-bucket-name"# wrangler.toml
[vars]
IMAGE_HOST_USERNAME = "your-username"
IMAGE_HOST_PASSWORD = "your-password"在 src/config.ts 中配置Notion集成:
export const NOTION_CONFIG = {
TOKEN: 'secret_xxxxxxxxxx',
DATABASE_ID: 'your-database-id',
PROPERTIES: {
TITLE: '标题',
AUTHOR: '作者',
ORIGINAL_URL: '原帖链接',
TAGS: '标签',
CREATED_TIME: '创建时间'
}
};系统根据文件大小自动选择最优存储方案:
| 文件大小 | 存储方式 | 特点 |
|---|---|---|
| < 19MB | TG-Image图床 | 快速上传,CDN加速 |
| 19MB - 110MB | TG-Image图床(分片上传) | 支持大文件,自动分片 |
| ≥ 110MB | CDN代理 | 代理访问,节省存储成本 |
所有关键参数都可在 src/config.ts 中配置:
export const MEDIA_PROCESSING_CONFIG = {
// 延迟配置(毫秒)
DELAYS: {
BATCH_INTERVAL: 300, // 批次间延迟
IMAGE_INTERVAL: 100, // 图片间延迟
VIDEO_INTERVAL: 200, // 视频间延迟
LIVE_PHOTO_INTERVAL: 200 // Live图视频间延迟
},
// 批次大小配置
BATCH_SIZES: {
IMAGES: 12, // 图片批次大小
VIDEOS: 8 // 视频批次大小
},
// 文件大小限制(字节)
SIZE_LIMITS: {
IMAGE_HOST_THRESHOLD: 19 * 1024 * 1024, // 19MB
PROXY_THRESHOLD: 110 * 1024 * 1024 // 110MB
}
};- 智能检测: 自动识别内容类型(图文、视频、Live图)
- 批量处理: 根据配置进行批次处理,避免请求过载
- 格式优化: 优先选择JPEG,避免WebP兼容性问题
- 智能存储: 根据文件大小自动选择最优存储方案
- CDN代理: 大文件自动生成代理URL,提升访问速度
- 验证机制: 确保处理后链接有效可访问
- 错误处理: 完善的重试和降级机制
- KV缓存: 解析结果缓存24小时
- 强制刷新: 添加
refresh=true参数 - 缓存键: 基于平台和URL生成唯一键
# 安装依赖
npm install
# 启动开发模式
npm run dev
# 类型检查
npm run type-check
# 构建项目
npm run build# 部署到开发环境
wrangler deploy --env dev
# 部署到生产环境
wrangler deploy# 开发环境 - 显示所有日志
LOG_LEVEL=DEBUG
# 生产环境 - 只显示警告和错误(推荐)
LOG_LEVEL=WARN
# 完全静默
LOG_LEVEL=NONE- DEBUG: 详细的调试信息,包括处理步骤、参数等
- INFO: 一般信息,如操作成功、进度等
- WARN: 警告信息,如降级处理、非关键错误等
- ERROR: 错误信息,如处理失败、异常等
import { log } from './logger.js';
log.media('处理媒体文件...'); // 🎬 媒体处理
log.livePhoto('Live图处理完成'); // 📸 Live图处理
log.parse('开始解析内容'); // 🔍 解析处理
log.sync('同步到Notion'); // 📝 同步处理
log.success('操作成功'); // ✅ 成功日志
log.failure('操作失败', error); // ❌ 失败日志
log.progress(5, 10, '处理进度'); // 📊 进度日志
log.batch(1, 3, '批次处理'); // 📦 批处理日志
log.network('网络请求'); // 🌐 网络日志
log.cache('缓存操作'); // 💾 缓存日志
log.config('配置更新'); // ⚙️ 配置日志# 查看实时日志
wrangler tail
# 查看特定环境的日志
wrangler tail --env production