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
JavaScript
;
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;
}
}
}