n8n-nodes-wechat-publish
Version:
N8N nodes for WeChat Official Account publishing - Create drafts and publish articles to WeChat Official Account platform
240 lines (239 loc) • 5.12 kB
TypeScript
/**
* WeChat API Response Types
*/
export interface WeChatApiResponse<T = any> {
errcode?: number;
errmsg?: string;
data?: T;
}
/**
* Access Token Response
*/
export interface AccessTokenResponse {
access_token: string;
expires_in: number;
}
/**
* Draft Article Structure
*/
export interface DraftArticle {
article_type: 'news' | 'newspic';
title: string;
author?: string;
digest?: string;
content: string;
content_source_url?: string;
thumb_media_id: string;
need_open_comment?: 0 | 1;
only_fans_can_comment?: 0 | 1;
pic_crop_235_1?: string;
pic_crop_1_1?: string;
image_info?: {
image_list: Array<{
image_media_id: string;
}>;
};
cover_info?: {
crop_percent_list: Array<{
ratio: '1_1' | '16_9' | '2.35_1';
x1: string;
y1: string;
x2: string;
y2: string;
}>;
};
product_info?: {
footer_product_info: {
product_key: string;
};
};
}
/**
* Create Draft Request
*/
export interface CreateDraftRequest {
articles: DraftArticle[];
}
/**
* Create Draft Response
*/
export interface CreateDraftResponse {
media_id: string;
}
/**
* Get Draft Response
*/
export interface GetDraftResponse {
media_id: string;
content: {
news_item: DraftArticle[];
};
update_time: number;
}
/**
* Publish Request
*/
export interface PublishRequest {
media_id: string;
}
/**
* Publish Response
*/
export interface PublishResponse {
publish_id: string;
}
/**
* Publish Status Response
*/
export interface PublishStatusResponse {
publish_id: string;
publish_status: 0 | 1 | 2 | 3;
article_id?: string;
article_url?: string;
fail_idx?: number[];
}
/**
* Media Upload Response
*/
export interface MediaUploadResponse {
media_id: string;
url: string;
}
/**
* WeChat API Client Configuration
*/
export interface WeChatApiConfig {
appId: string;
appSecret: string;
baseUrl: string;
timeout: number;
}
/**
* Meme API Response Types
*/
export interface MemeItem {
postLink: string;
subreddit: string;
title: string;
url: string;
nsfw: boolean;
spoiler: boolean;
author: string;
ups: number;
preview: string[];
}
export interface MemeApiResponse {
postLink?: string;
subreddit?: string;
title?: string;
url?: string;
nsfw?: boolean;
spoiler?: boolean;
author?: string;
ups?: number;
preview?: string[];
count?: number;
memes?: MemeItem[];
}
/**
* Batch Upload Memes Response
*/
export interface BatchUploadMemesResponse {
success_count: number;
failed_count: number;
duplicated_count: number;
media_ids: string[];
failed_urls: string[];
processed_memes: Array<{
url: string;
title: string;
media_id?: string;
error?: string;
is_duplicate?: boolean;
}>;
}
/**
* WeChat Node Operations
*/
export type WeChatOperation = 'createDraft' | 'getDraft' | 'deleteDraft' | 'publishDraft' | 'getPublishStatus' | 'uploadMedia' | 'getMaterialList' | 'batchUploadMemes' | 'batchPublishDrafts';
/**
* Material item in the list
*/
export interface MaterialItem {
media_id: string;
name?: string;
update_time: number;
url?: string;
}
/**
* Get material list request
*/
export interface GetMaterialListRequest {
type: string;
offset: number;
count: number;
}
/**
* Get material list response
*/
export interface GetMaterialListResponse {
total_count: number;
item_count: number;
item: MaterialItem[];
}
/**
* Node Operation Parameters
*/
export interface NodeOperationParams {
operation: WeChatOperation;
mediaId?: string;
publishId?: string;
title?: string;
content?: string;
author?: string;
digest?: string;
thumbMediaId?: string;
contentSourceUrl?: string;
needOpenComment?: boolean;
onlyFansCanComment?: boolean;
picCrop235?: string;
picCrop11?: string;
articleType?: 'news' | 'newspic';
imageList?: string[];
productKey?: string;
materialType?: 'image' | 'video' | 'voice' | 'news';
offset?: number;
count?: number;
memeCount?: number;
subreddit?: string;
skipNsfw?: boolean;
skipSpoiler?: boolean;
minUps?: number;
enableImageInsertion?: boolean;
imageInsertionMode?: 'auto' | 'manual' | 'paragraph';
insertionImageIds?: string[];
maxImagesPerArticle?: number;
imageInsertionStrategy?: 'random' | 'sequential' | 'balanced';
}
/**
* Image Insertion Configuration
*/
export interface ImageInsertionConfig {
enabled: boolean;
mode: 'auto' | 'manual' | 'paragraph';
imageIds: string[];
maxImages: number;
strategy: 'random' | 'sequential' | 'balanced';
}
/**
* Content Processing Result
*/
export interface ContentProcessingResult {
processedContent: string;
insertedImages: number;
imagePositions: Array<{
imageId: string;
position: number;
context: string;
}>;
}