Skip to content

Commit 3f49f3a

Browse files
committed
fix: substitui fetch por https.get nos 4 nós toolCode do agente Alicia
fetch não está disponível no ambiente Node.js dos nós toolCode do n8n. Todos os 4 tools (buscar_insights, listar_campanhas, listar_conjuntos, buscar_insights_multiplas_contas) agora usam require('https') + httpGet, igual ao padrão já funcional no nó Buscar e Formatar Todos. https://claude.ai/code/session_01TSV3FcRdbPFXKZUAftjEoQ
1 parent 24e0ae6 commit 3f49f3a

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

n8n-alicia-meta-ads.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@
340340
"parameters": {
341341
"name": "buscar_insights",
342342
"description": "Busca métricas/insights do Meta Ads. Use para: gasto (spend), leads (actions), impressões, cliques, CTR, CPC, alcance. Envie JSON com: object_id (ID da conta ex: act_123456 OU ID de campanha), date_preset (today/yesterday/this_week_mon_today/last_7d/last_14d/last_30d/last_month), fields (ex: spend,impressions,clicks,ctr,cpc,actions,reach,cost_per_action_type), level opcional (account/campaign/adset/ad). IMPORTANTE: Para leads, inclua 'actions' nos fields e filtre por action_type = onsite_conversion.total_messaging_connection.",
343-
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com object_id e date_preset'; }\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst objectId = params.object_id;\nconst datePreset = params.date_preset || 'today';\nconst fields = params.fields || 'spend,impressions,clicks,ctr,cpc,actions,reach,cost_per_action_type';\nconst level = params.level || '';\nif (!objectId) return 'Erro: object_id é obrigatório';\nlet url = `https://graph.facebook.com/v19.0/${objectId}/insights?date_preset=${encodeURIComponent(datePreset)}&fields=${encodeURIComponent(fields)}&access_token=${token}`;\nif (level) url += `&level=${encodeURIComponent(level)}`;\ntry {\n const res = await fetch(url);\n const data = await res.json();\n if (data.error) return `Erro Meta API: ${data.error.message} (código: ${data.error.code})`;\n if (!data.data || data.data.length === 0) return 'Nenhum dado encontrado para o período solicitado.';\n return JSON.stringify(data.data);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
343+
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com object_id e date_preset'; }\nconst https = require('https');\nconst httpGet = (u) => new Promise((resolve, reject) => { https.get(u, (res) => { let d = ''; res.on('data', c => d += c); res.on('end', () => { try { resolve(JSON.parse(d)); } catch(err) { reject(err); } }); }).on('error', reject); });\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst objectId = params.object_id;\nconst datePreset = params.date_preset || 'today';\nconst fields = params.fields || 'spend,impressions,clicks,ctr,cpc,actions,reach,cost_per_action_type';\nconst level = params.level || '';\nif (!objectId) return 'Erro: object_id é obrigatório';\nlet url = `https://graph.facebook.com/v19.0/${objectId}/insights?date_preset=${encodeURIComponent(datePreset)}&fields=${encodeURIComponent(fields)}&access_token=${token}`;\nif (level) url += `&level=${encodeURIComponent(level)}`;\ntry {\n const data = await httpGet(url);\n if (data.error) return `Erro Meta API: ${data.error.message} (código: ${data.error.code})`;\n if (!data.data || data.data.length === 0) return 'Nenhum dado encontrado para o período solicitado.';\n return JSON.stringify(data.data);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
344344
},
345345
"id": "13abddfb-207b-4d02-aa60-c7b8658c7860",
346346
"name": "Tool: Buscar Insights",
@@ -355,7 +355,7 @@
355355
"parameters": {
356356
"name": "listar_campanhas",
357357
"description": "Lista todas as campanhas de uma conta de anúncios. Envie JSON com: account_id (formato: act_XXXXXXXXX). Retorna: id, nome, status, objetivo, budget diário e total. Use para encontrar o ID de uma campanha específica antes de buscar os insights.",
358-
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_id'; }\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountId = params.account_id;\nif (!accountId) return 'Erro: account_id é obrigatório (formato: act_XXXXXXXXX)';\ntry {\n const url = `https://graph.facebook.com/v19.0/${accountId}/campaigns?fields=id,name,status,objective,daily_budget,lifetime_budget&limit=100&access_token=${token}`;\n const res = await fetch(url);\n const data = await res.json();\n if (data.error) return `Erro Meta API: ${data.error.message}`;\n if (!data.data || data.data.length === 0) return 'Nenhuma campanha encontrada nessa conta';\n const campaigns = data.data.map(c => ({\n id: c.id,\n nome: c.name,\n status: c.status,\n objetivo: c.objective,\n budget_diario_reais: c.daily_budget ? (parseInt(c.daily_budget) / 100).toFixed(2) : null,\n budget_total_reais: c.lifetime_budget ? (parseInt(c.lifetime_budget) / 100).toFixed(2) : null\n }));\n return JSON.stringify(campaigns);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
358+
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_id'; }\nconst https = require('https');\nconst httpGet = (u) => new Promise((resolve, reject) => { https.get(u, (res) => { let d = ''; res.on('data', c => d += c); res.on('end', () => { try { resolve(JSON.parse(d)); } catch(err) { reject(err); } }); }).on('error', reject); });\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountId = params.account_id;\nif (!accountId) return 'Erro: account_id é obrigatório (formato: act_XXXXXXXXX)';\ntry {\n const url = `https://graph.facebook.com/v19.0/${accountId}/campaigns?fields=id,name,status,objective,daily_budget,lifetime_budget&limit=100&access_token=${token}`;\n const data = await httpGet(url);\n if (data.error) return `Erro Meta API: ${data.error.message}`;\n if (!data.data || data.data.length === 0) return 'Nenhuma campanha encontrada nessa conta';\n const campaigns = data.data.map(c => ({\n id: c.id,\n nome: c.name,\n status: c.status,\n objetivo: c.objective,\n budget_diario_reais: c.daily_budget ? (parseInt(c.daily_budget) / 100).toFixed(2) : null,\n budget_total_reais: c.lifetime_budget ? (parseInt(c.lifetime_budget) / 100).toFixed(2) : null\n }));\n return JSON.stringify(campaigns);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
359359
},
360360
"id": "731c36fc-e0b1-44a4-a13e-fcda6b6f2a2e",
361361
"name": "Tool: Listar Campanhas",
@@ -370,7 +370,7 @@
370370
"parameters": {
371371
"name": "listar_conjuntos",
372372
"description": "Lista conjuntos de anúncios (adsets) de uma conta ou campanha. Envie JSON com: account_id (act_XXXXXXXXX) OU campaign_id (ID numérico). Retorna: id, nome, status e budget.",
373-
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_id ou campaign_id'; }\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountId = params.account_id;\nconst campaignId = params.campaign_id;\nif (!accountId && !campaignId) return 'Erro: forneça account_id ou campaign_id';\nconst baseId = campaignId || accountId;\ntry {\n const url = `https://graph.facebook.com/v19.0/${baseId}/adsets?fields=id,name,status,daily_budget,lifetime_budget,campaign_id&limit=100&access_token=${token}`;\n const res = await fetch(url);\n const data = await res.json();\n if (data.error) return `Erro Meta API: ${data.error.message}`;\n if (!data.data || data.data.length === 0) return 'Nenhum conjunto de anúncios encontrado';\n const adsets = data.data.map(a => ({\n id: a.id,\n nome: a.name,\n status: a.status,\n budget_diario_reais: a.daily_budget ? (parseInt(a.daily_budget) / 100).toFixed(2) : null,\n budget_total_reais: a.lifetime_budget ? (parseInt(a.lifetime_budget) / 100).toFixed(2) : null\n }));\n return JSON.stringify(adsets);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
373+
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_id ou campaign_id'; }\nconst https = require('https');\nconst httpGet = (u) => new Promise((resolve, reject) => { https.get(u, (res) => { let d = ''; res.on('data', c => d += c); res.on('end', () => { try { resolve(JSON.parse(d)); } catch(err) { reject(err); } }); }).on('error', reject); });\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountId = params.account_id;\nconst campaignId = params.campaign_id;\nif (!accountId && !campaignId) return 'Erro: forneça account_id ou campaign_id';\nconst baseId = campaignId || accountId;\ntry {\n const url = `https://graph.facebook.com/v19.0/${baseId}/adsets?fields=id,name,status,daily_budget,lifetime_budget,campaign_id&limit=100&access_token=${token}`;\n const data = await httpGet(url);\n if (data.error) return `Erro Meta API: ${data.error.message}`;\n if (!data.data || data.data.length === 0) return 'Nenhum conjunto de anúncios encontrado';\n const adsets = data.data.map(a => ({\n id: a.id,\n nome: a.name,\n status: a.status,\n budget_diario_reais: a.daily_budget ? (parseInt(a.daily_budget) / 100).toFixed(2) : null,\n budget_total_reais: a.lifetime_budget ? (parseInt(a.lifetime_budget) / 100).toFixed(2) : null\n }));\n return JSON.stringify(adsets);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
374374
},
375375
"id": "a8b12824-f38e-4296-87fe-49bd6e9f934b",
376376
"name": "Tool: Listar Conjuntos",
@@ -385,7 +385,7 @@
385385
"parameters": {
386386
"name": "buscar_insights_multiplas_contas",
387387
"description": "Busca insights de MÚLTIPLAS contas ao mesmo tempo. Use quando o usuário não especificar cliente. Envie JSON com: account_ids (array de IDs ex: ['act_111','act_222']), date_preset, fields.",
388-
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_ids (array), date_preset e fields'; }\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountIds = params.account_ids || [];\nconst datePreset = params.date_preset || 'today';\nconst fields = params.fields || 'spend,impressions,clicks,actions,reach';\nif (accountIds.length === 0) return 'Erro: account_ids deve ser um array com pelo menos 1 conta';\ntry {\n const results = [];\n for (const accountId of accountIds) {\n const url = `https://graph.facebook.com/v19.0/${accountId}/insights?date_preset=${encodeURIComponent(datePreset)}&fields=${encodeURIComponent(fields)}&access_token=${token}`;\n const res = await fetch(url);\n const data = await res.json();\n if (!data.error && data.data && data.data.length > 0) {\n results.push({ account_id: accountId, data: data.data[0] });\n } else if (data.error) {\n results.push({ account_id: accountId, error: data.error.message });\n } else {\n results.push({ account_id: accountId, data: null, note: 'sem dados no período' });\n }\n }\n return JSON.stringify(results);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
388+
"jsCode": "let params;\ntry { params = JSON.parse(query); } catch(e) { return 'Erro: envie JSON com account_ids (array), date_preset e fields'; }\nconst https = require('https');\nconst httpGet = (u) => new Promise((resolve, reject) => { https.get(u, (res) => { let d = ''; res.on('data', c => d += c); res.on('end', () => { try { resolve(JSON.parse(d)); } catch(err) { reject(err); } }); }).on('error', reject); });\nconst token = 'EAAeVLzZANk8oBQ79Ue5UimCCCYL9uNZCH9EZA7vZAJtqB5B9aQ6mO53EnUI1b8Cskpq9tRsYZAaDKvZB1kLZABjbqgwi3aenhyPnAtQkeineasNmaZA7vue9ndlaErc59UFZBaMBeDnBC8ZBpXtn9PdUP4OMQvkd53QZAL1jI9SC49WGZCvgopdZABkhGKCEuVStyYGRfYPrlhksx7HHkqZBNWo5gMLhREik5hvkp1JA7X';\nconst accountIds = params.account_ids || [];\nconst datePreset = params.date_preset || 'today';\nconst fields = params.fields || 'spend,impressions,clicks,actions,reach';\nif (accountIds.length === 0) return 'Erro: account_ids deve ser um array com pelo menos 1 conta';\ntry {\n const results = [];\n for (const accountId of accountIds) {\n const url = `https://graph.facebook.com/v19.0/${accountId}/insights?date_preset=${encodeURIComponent(datePreset)}&fields=${encodeURIComponent(fields)}&access_token=${token}`;\n const data = await httpGet(url);\n if (!data.error && data.data && data.data.length > 0) {\n results.push({ account_id: accountId, data: data.data[0] });\n } else if (data.error) {\n results.push({ account_id: accountId, error: data.error.message });\n } else {\n results.push({ account_id: accountId, data: null, note: 'sem dados no período' });\n }\n }\n return JSON.stringify(results);\n} catch(e) { return `Erro de conexão: ${e.message}`; }"
389389
},
390390
"id": "81aa87da-6607-4ffc-95b9-1be17e23ec68",
391391
"name": "Tool: Insights Multiplas Contas",
@@ -656,4 +656,4 @@
656656
},
657657
"id": "uIUtsjBWTxjZObX3",
658658
"tags": []
659-
}
659+
}

0 commit comments

Comments
 (0)