n8n-nodes-evolution-tools
Version:
n8n node para integrar com Evolution API WhatsApp como ferramenta para agentes com IA
150 lines (139 loc) • 4 kB
text/typescript
import { ITriggerFunctions } from 'n8n-core';
import { INodeType, INodeTypeDescription, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
import axios from 'axios';
import { evolutionApiToolDescription } from './EvolutionApiToolDescription';
export class EvolutionApiAiTool implements INodeType {
description: INodeTypeDescription = {
displayName: 'Evolution API AI Tool',
name: 'evolutionApiAiTool',
icon: 'file:evolutionApi.svg',
group: ['transform', 'ai', 'aiTool'],
version: 1,
description: 'Use Evolution API to send WhatsApp messages in AI agents',
subtitle: 'WhatsApp messaging via Evolution API',
defaults: {
name: 'Evolution API AI Tool',
},
credentials: [
{
name: 'evolutionApiApi',
required: true,
},
],
inputs: ['main'],
outputs: ['main'],
properties: [
...evolutionApiToolDescription,
],
};
// @ts-ignore
async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
const items = this.getInputData();
const returnData: INodeExecutionData[] = [];
const credentials = await this.getCredentials('evolutionApiApi');
const baseUrl = credentials.url as string;
const apiKey = credentials.apiKey as string;
// Get operation selected by user
const operation = this.getNodeParameter('operation', 0) as string;
for (let i = 0; i < items.length; i++) {
try {
// Define parameters based on the operation
if (operation === 'sendMessage') {
const apiUrl = `${baseUrl}/message/sendText/${this.getNodeParameter('instance', i)}`;
const number = this.getNodeParameter('phoneNumber', i) as string;
const message = this.getNodeParameter('message', i) as string;
// Make API call
const response = await axios({
method: 'POST',
url: apiUrl,
headers: {
'Content-Type': 'application/json',
'apikey': apiKey,
},
data: {
number,
options: {
delay: 1200,
},
textMessage: {
text: message,
},
},
});
returnData.push({
json: {
success: true,
result: response.data,
message: `Message sent successfully to ${number}`,
},
});
} else if (operation === 'sendMedia') {
const apiUrl = `${baseUrl}/message/sendMedia/${this.getNodeParameter('instance', i)}`;
const number = this.getNodeParameter('phoneNumber', i) as string;
const mediaUrl = this.getNodeParameter('mediaUrl', i) as string;
const caption = this.getNodeParameter('caption', i) as string;
const mediaType = this.getNodeParameter('mediaType', i) as string;
// Make API call
const response = await axios({
method: 'POST',
url: apiUrl,
headers: {
'Content-Type': 'application/json',
'apikey': apiKey,
},
data: {
number,
options: {
delay: 1200,
},
mediaMessage: {
mediatype: mediaType,
media: mediaUrl,
caption,
},
},
});
returnData.push({
json: {
success: true,
result: response.data,
message: `Media message sent successfully to ${number}`,
},
});
} else if (operation === 'getQrCode') {
const apiUrl = `${baseUrl}/instance/qrcode/${this.getNodeParameter('instance', i)}`;
// Make API call
const response = await axios({
method: 'GET',
url: apiUrl,
headers: {
'Content-Type': 'application/json',
'apikey': apiKey,
},
});
returnData.push({
json: {
success: true,
result: response.data,
message: 'QR code retrieved successfully',
},
});
} else {
throw new Error(`The operation "${operation}" is not supported!`);
}
} catch (error) {
if (this.continueOnFail()) {
returnData.push({
json: {
success: false,
error: error.message,
},
});
continue;
}
throw error;
}
}
return [returnData];
}
}