UNPKG

n8n-nodes-netgsm-unofficial

Version:

N8N community node for Netgsm to send SMS and voice messages API integration

394 lines (393 loc) 14.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Netgsm = void 0; const n8n_workflow_1 = require("n8n-workflow"); class Netgsm { description = { displayName: 'Netgsm', name: 'netgsm', icon: 'file:netgsm.svg', group: ['communication'], version: 1, subtitle: '={{$parameter["operation"]}}', description: 'NetGSM ile SMS ve sesli mesaj gönderme (tekli ve çoklu)', defaults: { name: 'Netgsm', }, inputs: ["main"], outputs: ["main"], credentials: [ { name: 'netgsmApi', required: true, }, ], properties: [ { displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true, options: [ { name: 'Send SMS', value: 'sendSms', description: 'SMS mesajı gönder', action: 'Send an SMS message', }, { name: 'Send Voice Message (Text)', value: 'sendVoiceWithText', description: 'Text ile sesli mesaj gönder (TTS)', action: 'Send voice message with text', }, ], default: 'sendSms', }, { displayName: 'Message', name: 'message', type: 'string', typeOptions: { rows: 4, }, displayOptions: { show: { operation: ['sendSms'], }, }, default: '', description: 'Gönderilecek SMS mesaj içeriği.', required: true, }, { displayName: 'Encoding', name: 'encoding', type: 'options', displayOptions: { show: { operation: ['sendSms'], }, }, options: [ { name: 'Turkish (TR)', value: 'TR', }, { name: 'English (EN)', value: 'EN', }, ], default: 'TR', description: 'Karakter kodlaması.', }, { displayName: 'Message Sender (Originator)', name: 'msgheader', type: 'string', default: '', description: 'Mesaj başlığı (gönderen adı).', required: true, }, { displayName: 'Phone Numbers', name: 'phoneNumbers', type: 'string', typeOptions: { rows: 6, }, default: '', placeholder: '5551234567\n5559876543\n5555551234', description: 'Alıcıların telefon numaraları (90 olmadan). Her satıra bir numara yazın veya virgülle ayırın.', required: true, }, { displayName: 'Voice Message Text', name: 'voiceText', type: 'string', typeOptions: { rows: 4, }, displayOptions: { show: { operation: ['sendVoiceWithText'], }, }, default: '', description: 'Sesli mesaja dönüştürülecek metin.', required: true, }, { displayName: 'Options', name: 'options', type: 'collection', placeholder: 'Add Option', default: {}, options: [ { displayName: 'Continue On Failure', name: 'continueOnFailure', type: 'boolean', default: true, description: 'Gönderim başarısız olursa hata vermek yerine sonuçları döndür.', }, ], }, ], }; async execute() { const items = this.getInputData(); const returnData = []; for (let i = 0; i < items.length; i++) { try { const operation = this.getNodeParameter('operation', i); const credentials = await this.getCredentials('netgsmApi'); let responseData = []; switch (operation) { case 'sendSms': responseData = await sendSms.call(this, i, credentials); break; case 'sendVoiceWithText': responseData = await sendVoiceWithText.call(this, i, credentials); break; default: throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation: ${operation}`); } for (const response of responseData) { const executionData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray(response), { itemData: { item: i } }); returnData.push(...executionData); } } catch (error) { if (this.continueOnFail()) { const executionErrorData = this.helpers.constructExecutionMetaData(this.helpers.returnJsonArray({ error: error.message }), { itemData: { item: i } }); returnData.push(...executionErrorData); continue; } throw error; } } return [returnData]; } } exports.Netgsm = Netgsm; function parsePhoneNumbers(phoneNumbersStr) { if (!phoneNumbersStr || phoneNumbersStr.trim() === '') { return []; } const numbers = phoneNumbersStr .split(/[\n,;]/) .map(num => num.trim()) .filter(num => num.length > 0) .map(num => num.replace(/[^\d]/g, '')); return [...new Set(numbers)]; } async function sendSms(itemIndex, credentials) { const msgheader = this.getNodeParameter('msgheader', itemIndex); const phoneNumbersStr = this.getNodeParameter('phoneNumbers', itemIndex); const message = this.getNodeParameter('message', itemIndex); const encoding = this.getNodeParameter('encoding', itemIndex, 'TR'); const options = this.getNodeParameter('options', itemIndex, {}); const continueOnFailure = options.continueOnFailure !== false; const phoneNumbers = parsePhoneNumbers(phoneNumbersStr); if (phoneNumbers.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'En az bir geçerli telefon numarası gerekli.'); } const phoneNumbersXml = phoneNumbers.map(num => `<no>${num}</no>`).join(''); const xmlBody = `<?xml version='1.0' encoding='UTF-8'?> <mainbody> <header> <company dil='${encoding}'>NETGSM</company> <usercode>${credentials.username}</usercode> <password>${credentials.password}</password> <startdate></startdate> <stopdate></stopdate> <type>1:n</type> <msgheader>${msgheader}</msgheader> </header> <body> <msg><![CDATA[${message}]]></msg> ${phoneNumbersXml} </body> </mainbody>`; const requestOptions = { method: 'POST', body: xmlBody, headers: { 'Content-Type': 'application/xml; charset=UTF-8', }, url: 'https://api.netgsm.com.tr/sms/send/xml', }; try { const response = await this.helpers.httpRequest(requestOptions); if (typeof response === 'string') { const lines = response.trim().split('\n'); const statusLine = lines[0]?.trim(); const statusCode = statusLine.split(' ')[0]; if (statusCode === '00' || statusCode === '01' || statusCode === '02') { return phoneNumbers.map((phoneNumber, index) => ({ success: true, jobId: statusLine, message: 'SMS başarıyla gönderildi', phoneNumber: phoneNumber, sentMessage: message, method: 'sms', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { const errorMessage = `SMS gönderilemedi. Hata kodu: ${statusCode}. Yanıt: ${response}`; if (continueOnFailure) { return phoneNumbers.map((phoneNumber, index) => ({ success: false, error: errorMessage, phoneNumber: phoneNumber, sentMessage: message, method: 'sms', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage); } } } else { return phoneNumbers.map((phoneNumber, index) => ({ success: true, response: response, phoneNumber: phoneNumber, sentMessage: message, method: 'sms', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } } catch (error) { const errorMessage = error.message; if (continueOnFailure) { return phoneNumbers.map((phoneNumber, index) => ({ success: false, error: errorMessage, phoneNumber: phoneNumber, sentMessage: message, method: 'sms', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { throw error; } } } async function sendVoiceWithText(itemIndex, credentials) { const msgheader = this.getNodeParameter('msgheader', itemIndex); const phoneNumbersStr = this.getNodeParameter('phoneNumbers', itemIndex); const voiceText = this.getNodeParameter('voiceText', itemIndex); const options = this.getNodeParameter('options', itemIndex, {}); const continueOnFailure = options.continueOnFailure !== false; const phoneNumbers = parsePhoneNumbers(phoneNumbersStr); if (phoneNumbers.length === 0) { throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'En az bir geçerli telefon numarası gerekli.'); } const phoneNumberTags = phoneNumbers.map(num => `<no>${num}</no>`).join(''); const xmlBody = `<?xml version='1.0' encoding='UTF-8'?> <mainbody> <header> <usercode>${credentials.username}</usercode> <password>${credentials.password}</password> <key>0</key> <version>1</version> </header> <body> <text><![CDATA[${voiceText}]]></text> ${phoneNumberTags} </body> </mainbody>`; const requestOptions = { method: 'POST', body: xmlBody, headers: { 'Content-Type': 'application/xml; charset=UTF-8', }, url: 'https://api.netgsm.com.tr/voicesms/send', }; try { const response = await this.helpers.httpRequest(requestOptions); if (typeof response === 'string') { const lines = response.trim().split('\n'); const statusCode = lines[0]?.trim(); const resCode = statusCode.split(' ')[0]; if (resCode === '00' || resCode === '01' || resCode === '02') { return phoneNumbers.map((phoneNumber, index) => ({ success: true, jobId: statusCode, message: 'TTS sesli mesaj başarıyla gönderildi', phoneNumber: phoneNumber, voiceText: voiceText, method: 'voice_text_tts', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { const errorMessage = `TTS sesli mesaj gönderilemedi. Hata: ${response}`; if (continueOnFailure) { return phoneNumbers.map((phoneNumber, index) => ({ success: false, error: errorMessage, phoneNumber: phoneNumber, voiceText: voiceText, method: 'voice_text_tts', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { throw new n8n_workflow_1.NodeOperationError(this.getNode(), errorMessage); } } } else { return phoneNumbers.map((phoneNumber, index) => ({ success: true, response: response, phoneNumber: phoneNumber, voiceText: voiceText, method: 'voice_text_tts', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } } catch (error) { const errorMessage = error.message; if (continueOnFailure) { return phoneNumbers.map((phoneNumber, index) => ({ success: false, error: errorMessage, phoneNumber: phoneNumber, voiceText: voiceText, method: 'voice_text_tts', index: index + 1, totalCount: phoneNumbers.length, batchRequest: true, })); } else { throw error; } } }