376 lines
9.0 KiB
TypeScript
376 lines
9.0 KiB
TypeScript
/**
|
||
* 文件:types.ts
|
||
* 作用:集中定义小红书模块使用的所有类型、接口、枚举与常量,保证模块间协作的类型安全。
|
||
*
|
||
* 内容结构:
|
||
* 1. 发布数据结构(XiaohongshuPost 等)
|
||
* 2. 上传/发布响应与状态枚举
|
||
* 3. 错误码、事件类型、配置常量(XIAOHONGSHU_CONSTANTS)
|
||
* 4. 图片、适配、系统级通用类型
|
||
*
|
||
* 设计原则:
|
||
* - 不依赖具体实现细节(api / adapter),仅暴露抽象描述
|
||
* - 常量集中,方便后续接入真实平台参数调整
|
||
* - 可扩展:若后续接入更多平台,可抽象出 PlatformXxx 基础层
|
||
*
|
||
* 扩展建议:
|
||
* - 引入严格的 Branded Type(例如 TitleLength / TagString)提升约束
|
||
* - 增加对服务端返回结构的精准建模(若接入正式 API)
|
||
*/
|
||
|
||
/**
|
||
* 小红书功能相关类型定义
|
||
*
|
||
* 说明:
|
||
* 本文件定义了小红书功能所需的所有接口、类型和常量,
|
||
* 为整个小红书模块提供类型安全保障。
|
||
*/
|
||
|
||
// ================== 基础数据类型 ==================
|
||
|
||
/**
|
||
* 小红书发布内容结构
|
||
*/
|
||
export interface XiaohongshuPost {
|
||
/** 文章标题 */
|
||
title: string;
|
||
/** 文章正文内容 */
|
||
content: string;
|
||
/** 图片列表(上传后返回的图片ID或URL) */
|
||
images: string[];
|
||
/** 标签列表(可选) */
|
||
tags?: string[];
|
||
/** 封面图片(可选) */
|
||
cover?: string;
|
||
}
|
||
|
||
/**
|
||
* 小红书API响应结果
|
||
*/
|
||
export interface XiaohongshuResponse {
|
||
/** 是否成功 */
|
||
success: boolean;
|
||
/** 响应消息 */
|
||
message: string;
|
||
/** 发布内容的ID(成功时返回) */
|
||
postId?: string;
|
||
/** 错误代码(失败时返回) */
|
||
errorCode?: string;
|
||
/** 详细错误信息(失败时返回) */
|
||
errorDetails?: string;
|
||
}
|
||
|
||
/**
|
||
* 发布状态枚举
|
||
*/
|
||
export enum PostStatus {
|
||
/** 发布中 */
|
||
PUBLISHING = 'publishing',
|
||
/** 发布成功 */
|
||
PUBLISHED = 'published',
|
||
/** 发布失败 */
|
||
FAILED = 'failed',
|
||
/** 等待审核 */
|
||
PENDING = 'pending',
|
||
/** 已删除 */
|
||
DELETED = 'deleted'
|
||
}
|
||
|
||
/**
|
||
* 图片处理结果
|
||
*/
|
||
export interface ProcessedImage {
|
||
/** 原始文件名 */
|
||
originalName: string;
|
||
/** 处理后的Blob数据 */
|
||
blob: Blob;
|
||
/** 处理后的尺寸信息 */
|
||
dimensions: {
|
||
width: number;
|
||
height: number;
|
||
};
|
||
/** 文件大小(字节) */
|
||
size: number;
|
||
}
|
||
|
||
/**
|
||
* 小红书配置选项
|
||
*/
|
||
export interface XiaohongshuSettings {
|
||
/** 是否启用小红书功能 */
|
||
enabled: boolean;
|
||
/** 用户名(可选,用于自动登录) */
|
||
username?: string;
|
||
/** 密码(加密存储,可选) */
|
||
password?: string;
|
||
/** 默认标签 */
|
||
defaultTags: string[];
|
||
/** 图片质量设置 (1-100) */
|
||
imageQuality: number;
|
||
/** 批量发布间隔时间(毫秒) */
|
||
publishDelay: number;
|
||
/** 是否启用图片优化 */
|
||
enableImageOptimization: boolean;
|
||
/** 是否启用调试模式 */
|
||
debugMode: boolean;
|
||
}
|
||
|
||
// ================== 接口定义 ==================
|
||
|
||
/**
|
||
* 小红书API接口
|
||
*
|
||
* 基于模拟网页操作实现,提供小红书平台的核心功能
|
||
*/
|
||
export interface XiaohongshuAPI {
|
||
/**
|
||
* 检查登录状态
|
||
* @returns 是否已登录
|
||
*/
|
||
checkLoginStatus(): Promise<boolean>;
|
||
|
||
/**
|
||
* 使用用户名密码登录
|
||
* @param username 用户名
|
||
* @param password 密码
|
||
* @returns 登录是否成功
|
||
*/
|
||
loginWithCredentials(username: string, password: string): Promise<boolean>;
|
||
|
||
/**
|
||
* 发布内容到小红书
|
||
* @param content 发布内容
|
||
* @returns 发布结果
|
||
*/
|
||
createPost(content: XiaohongshuPost): Promise<XiaohongshuResponse>;
|
||
|
||
/**
|
||
* 上传图片
|
||
* @param imageBlob 图片数据
|
||
* @returns 上传后的图片ID或URL
|
||
*/
|
||
uploadImage(imageBlob: Blob): Promise<string>;
|
||
|
||
/**
|
||
* 批量上传图片
|
||
* @param imageBlobs 图片数据数组
|
||
* @returns 上传后的图片ID或URL数组
|
||
*/
|
||
uploadImages(imageBlobs: Blob[]): Promise<string[]>;
|
||
|
||
/**
|
||
* 查询发布状态
|
||
* @param postId 发布内容ID
|
||
* @returns 发布状态
|
||
*/
|
||
getPostStatus(postId: string): Promise<PostStatus>;
|
||
|
||
/**
|
||
* 注销登录
|
||
* @returns 是否成功注销
|
||
*/
|
||
logout(): Promise<boolean>;
|
||
}
|
||
|
||
/**
|
||
* 小红书内容适配器接口
|
||
*
|
||
* 负责将Obsidian内容转换为小红书格式
|
||
*/
|
||
export interface XiaohongshuAdapter {
|
||
/**
|
||
* 转换标题
|
||
* @param title 原标题
|
||
* @returns 适配后的标题
|
||
*/
|
||
adaptTitle(title: string): string;
|
||
|
||
/**
|
||
* 转换正文内容
|
||
* @param content Markdown内容
|
||
* @returns 适配后的内容
|
||
*/
|
||
adaptContent(content: string): string;
|
||
|
||
/**
|
||
* 提取并转换标签
|
||
* @param content Markdown内容
|
||
* @returns 标签数组
|
||
*/
|
||
extractTags(content: string): string[];
|
||
|
||
/**
|
||
* 处理图片引用
|
||
* @param content 内容
|
||
* @param imageUrls 图片URL映射
|
||
* @returns 处理后的内容
|
||
*/
|
||
processImages(content: string, imageUrls: Map<string, string>): string;
|
||
|
||
/**
|
||
* 验证内容是否符合小红书要求
|
||
* @param post 发布内容
|
||
* @returns 验证结果和错误信息
|
||
*/
|
||
validatePost(post: XiaohongshuPost): { valid: boolean; errors: string[] };
|
||
}
|
||
|
||
/**
|
||
* 小红书渲染器接口
|
||
*
|
||
* 提供预览和发布功能
|
||
*/
|
||
export interface XiaohongshuRender {
|
||
/**
|
||
* 渲染预览内容
|
||
* @param markdownContent Markdown内容
|
||
* @param container 预览容器
|
||
* @returns Promise
|
||
*/
|
||
renderPreview(markdownContent: string, container: HTMLElement): Promise<void>;
|
||
|
||
/**
|
||
* 获取预览内容的HTML
|
||
* @returns HTML内容
|
||
*/
|
||
getPreviewHTML(): string;
|
||
|
||
/**
|
||
* 发布到小红书
|
||
* @returns 发布结果
|
||
*/
|
||
publishToXiaohongshu(): Promise<XiaohongshuResponse>;
|
||
|
||
/**
|
||
* 上传图片到小红书
|
||
* @returns 上传结果
|
||
*/
|
||
uploadImages(): Promise<string[]>;
|
||
|
||
/**
|
||
* 复制内容到剪贴板
|
||
* @returns Promise
|
||
*/
|
||
copyToClipboard(): Promise<void>;
|
||
|
||
/**
|
||
* 获取当前适配的内容
|
||
* @returns 小红书格式的内容
|
||
*/
|
||
getAdaptedContent(): XiaohongshuPost;
|
||
}
|
||
|
||
/**
|
||
* 图片处理器接口
|
||
*/
|
||
export interface XiaohongshuImageProcessor {
|
||
/**
|
||
* 转换图片为PNG格式
|
||
* @param imageBlob 原图片数据
|
||
* @returns PNG格式的图片数据
|
||
*/
|
||
convertToPNG(imageBlob: Blob): Promise<Blob>;
|
||
|
||
/**
|
||
* 批量处理图片
|
||
* @param images 图片信息数组
|
||
* @returns 处理后的图片数组
|
||
*/
|
||
processImages(images: { name: string; blob: Blob }[]): Promise<ProcessedImage[]>;
|
||
|
||
/**
|
||
* 优化图片质量和尺寸
|
||
* @param imageBlob 图片数据
|
||
* @param quality 质量设置(1-100)
|
||
* @param maxWidth 最大宽度
|
||
* @param maxHeight 最大高度
|
||
* @returns 优化后的图片
|
||
*/
|
||
optimizeImage(
|
||
imageBlob: Blob,
|
||
quality: number,
|
||
maxWidth?: number,
|
||
maxHeight?: number
|
||
): Promise<Blob>;
|
||
}
|
||
|
||
// ================== 常量定义 ==================
|
||
|
||
/**
|
||
* 小红书相关常量
|
||
*/
|
||
export const XIAOHONGSHU_CONSTANTS = {
|
||
/** 小红书官网URL */
|
||
BASE_URL: 'https://www.xiaohongshu.com',
|
||
|
||
/** 发布页面URL */
|
||
PUBLISH_URL: 'https://creator.xiaohongshu.com',
|
||
|
||
/** 默认配置 */
|
||
DEFAULT_SETTINGS: {
|
||
enabled: false,
|
||
defaultTags: [],
|
||
imageQuality: 85,
|
||
publishDelay: 2000,
|
||
enableImageOptimization: true,
|
||
debugMode: false
|
||
} as XiaohongshuSettings,
|
||
|
||
/** 图片限制 */
|
||
IMAGE_LIMITS: {
|
||
MAX_COUNT: 9, // 最多9张图片
|
||
MAX_SIZE: 10 * 1024 * 1024, // 最大10MB
|
||
SUPPORTED_FORMATS: ['jpg', 'jpeg', 'png', 'gif', 'webp'],
|
||
RECOMMENDED_SIZE: {
|
||
width: 1080,
|
||
height: 1440
|
||
}
|
||
},
|
||
|
||
/** 内容限制 */
|
||
CONTENT_LIMITS: {
|
||
MAX_TITLE_LENGTH: 20, // 标题最多20字
|
||
MAX_CONTENT_LENGTH: 1000, // 内容最多1000字
|
||
MAX_TAGS: 5 // 最多5个标签
|
||
}
|
||
} as const;
|
||
|
||
/**
|
||
* 错误代码常量
|
||
*/
|
||
export enum XiaohongshuErrorCode {
|
||
/** 网络错误 */
|
||
NETWORK_ERROR = 'NETWORK_ERROR',
|
||
/** 认证失败 */
|
||
AUTH_FAILED = 'AUTH_FAILED',
|
||
/** 内容格式错误 */
|
||
CONTENT_FORMAT_ERROR = 'CONTENT_FORMAT_ERROR',
|
||
/** 图片上传失败 */
|
||
IMAGE_UPLOAD_FAILED = 'IMAGE_UPLOAD_FAILED',
|
||
/** 发布失败 */
|
||
PUBLISH_FAILED = 'PUBLISH_FAILED',
|
||
/** 未知错误 */
|
||
UNKNOWN_ERROR = 'UNKNOWN_ERROR'
|
||
}
|
||
|
||
/**
|
||
* 事件类型定义
|
||
*/
|
||
export interface XiaohongshuEvent {
|
||
/** 事件类型 */
|
||
type: 'login' | 'upload' | 'publish' | 'error';
|
||
/** 事件数据 */
|
||
data: any;
|
||
/** 时间戳 */
|
||
timestamp: number;
|
||
}
|
||
|
||
/**
|
||
* 发布进度回调函数类型
|
||
*/
|
||
export type PublishProgressCallback = (progress: {
|
||
current: number;
|
||
total: number;
|
||
status: string;
|
||
file?: string;
|
||
}) => void; |