import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, } from 'n8n-workflow'; export class TikTokProducts implements INodeType { description: INodeTypeDescription = { displayName: 'TikTok Get Products', name: 'tiktokGetProducts', icon: 'file:tiktok.png', group: ['transform'], version: 1, description: 'Get TikTok Shop products from showcase', defaults: { name: 'TikTok Get Products', }, inputs: ['main'], outputs: ['main'], credentials: [ { name: 'tikTokSession', required: true, }, ], properties: [ { displayName: 'Pagination Settings', name: 'paginationSettings', type: 'collection', placeholder: 'Add Setting', default: {}, options: [ { displayName: 'Count', name: 'count', type: 'number', default: 2, description: 'Number of products to return', }, { displayName: 'Offset', name: 'offset', type: 'number', default: 0, description: 'Offset for pagination', }, ], }, ], }; async execute(this: IExecuteFunctions): Promise { const items = this.getInputData(); const returnData: INodeExecutionData[] = []; // Get credentials const credentials = await this.getCredentials('tikTokSession'); const sessionData = JSON.parse(credentials.sessionData as string); // Extract headers from session data const headers = sessionData.headers || {}; const paginationSettings = this.getNodeParameter('paginationSettings', 0, {}) as any; const count = paginationSettings.count || 2; const offset = paginationSettings.offset || 0; for (let i = 0; i < items.length; i++) { try { // Use correct TikTok Shop API endpoint (matching dlir2404) const requestUrl = 'https://shop.tiktok.com/api/v1/desktop/showcase_product/list'; const response = await this.helpers.request({ method: 'GET', url: requestUrl, qs: { count, offset, }, headers: { ...headers, 'Accept': 'application/json, text/plain, */*', 'Referer': 'https://www.tiktok.com/', }, json: true, }); returnData.push({ json: response }); } catch (error: any) { if (this.continueOnFail()) { returnData.push({ json: { error: error.message, statusCode: error.statusCode, } }); continue; } throw error; } } return [returnData]; } }