Files
n8n/backups/2025-12-27/MikroTik Universal (With Duplicate Check).json

1 line
28 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"updatedAt":"2025-12-26T11:49:46.960Z","createdAt":"2025-12-26T08:25:46.267Z","id":"sY0ddu-A-1P9TDZclJDPy","name":"MikroTik Universal (With Duplicate Check)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message","callback_query"],"additionalFields":{}},"id":"0ff5b511-c211-4eb9-b562-42b45c88f0df","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-1376,560],"webhookId":"b396e51b-6ec0-4eca-b8cb-a3ed23b4ff56","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"📋 Выберите адрес-лист:","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"don't touch","additionalFields":{"callback_data":"sl|don't touch"}},{"text":"rdp_ts","additionalFields":{"callback_data":"sl|rdp_ts"}},{"text":"rdp_ts02","additionalFields":{"callback_data":"sl|rdp_ts02"}}]}},{"row":{"buttons":[{"text":"rdp_ts01srv","additionalFields":{"callback_data":"sl|rdp_ts01srv"}},{"text":"rdp_ts02srv","additionalFields":{"callback_data":"sl|rdp_ts02srv"}}]}}]},"additionalFields":{}},"id":"e22c5697-c8dc-4451-9a46-b2c5e2cfd081","name":"Msg: Ask List","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[192,176],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"upsert","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"list":"={{ $('Logic').item.json.list }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,368],"id":"f17f5c31-3e05-4980-9242-7f663a781964","name":"DB: Update List"},{"parameters":{"jsCode":"const input = $input.all()[0].json;\nlet chatId, text = '', cb = '';\nlet deleteMsgId = null; \n\n// Определяем, откуда пришел запрос (кнопка или текст)\nif (input.callback_query) {\n cb = input.callback_query.data || '';\n chatId = input.callback_query.message.chat.id;\n // Берем ID сообщения с кнопками (чтобы удалить меню)\n deleteMsgId = input.callback_query.message.message_id;\n} else if (input.message) {\n text = (input.message.text || '').trim();\n chatId = input.message.chat.id;\n // Берем ID сообщения пользователя (чтобы удалить его команду/текст)\n deleteMsgId = input.message.message_id;\n}\n\n// Функция для удобного ответа\nfunction respond(action, data = {}) {\n return [{\n json: {\n chatId,\n action,\n deleteMsgId, // Передаем ID сообщения дальше\n ...data\n }\n }];\n}\n\n// 1. Команды\nif (text === '/start' || text === '/menu') return respond('menu');\nif (text === '/addip') return respond('ask_ip');\nif (text === '/find') return respond('ask_search');\n\n// 2. Кнопки\nif (cb.startsWith('sl|')) return respond('save_list', { list: cb.split('|')[1] });\nif (cb.startsWith('st|')) return respond('save_time', { time: cb.split('|')[1] });\nif (cb.startsWith('to|') || cb.startsWith('del|')) return respond('check_state'); \n\n// 3. Текст (IP или Комментарий)\nif (text && !text.startsWith('/')) {\n if (/^\\d{1,3}(\\.\\d{1,3}){3}$/.test(text)) {\n return respond('save_ip', { ip: text });\n }\n return respond('save_comment', { comment: text });\n}\n\nreturn respond('menu');"},"id":"a3e26177-3807-4a17-aafe-2dbb351b0cf1","name":"Logic","type":"n8n-nodes-base.code","typeVersion":2,"position":[-1152,560]},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"timeout":"={{ $('Logic').item.json.time }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,560],"id":"80ac541c-647e-4579-9c12-829837c15886","name":"DB: Update Time"},{"parameters":{"operation":"get","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-32,832],"id":"ae0f1596-12d0-4209-857b-6233f0bf33c4","name":"DB: Get Final Data"},{"parameters":{"method":"POST","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list/add","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","sendBody":true,"specifyBody":"json","jsonBody":"={{\n {\n \"address\": $('Code in JavaScript1').item.json.ip,\n \"list\": $('Code in JavaScript1').item.json.list,\n \"timeout\": $('Code in JavaScript1').item.json.timeout,\n \"comment\": $('Code in JavaScript1').item.json.comment\n }\n}}","options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[1088,768],"id":"b16afff3-ac57-4e0d-9651-3a988820e853","name":"HTTP Request: Add IP","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"url":"http://10.33.33.1:8738/rest/ip/firewall/address-list","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[416,928],"id":"4c0124cf-ecf2-4d66-b3ce-239c65f4a8e7","name":"HTTP Request1","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"f1a796c2-041d-471a-a4b0-22b0bd15df20","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"ask_ip","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_ip","operator":{"type":"string","operation":"equals"},"id":"ac137fee-fc2a-4c02-89ac-5705e2c934bc"}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"9a906cfd-f59d-40a6-9ed5-83efb7f9a967","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_list","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"536ac3bf-1f51-4652-8f1c-deba5a86718c","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_time","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"7e00d527-7ffa-4093-ae99-5c37197b1f59","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"save_comment","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"1d088ff0-6dab-49e5-ba4f-68fa40c1cabf","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"check_state","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"cf1925e2-62b7-4a1c-8e8f-08cc7b575d27","leftValue":"={{ $('Logic').item.json.action }}","rightValue":"ask_search","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.4,"position":[-704,480],"id":"5786fbac-4940-4c65-a20c-9c5efd4a07dd","name":"Switch"},{"parameters":{"dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"columns":{"mappingMode":"defineBelow","value":{"ip":"={{ $('Logic').item.json.ip }}","chat_id":"={{ $('Logic').item.json.chatId }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-32,176],"id":"88478b7a-4323-48b8-944f-6cbb04f6a853","name":"DB: Save IP"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"🌐 **Режим добавления IP** Пожалуйста, введите IP-адрес в формате `1.2.3.4`","additionalFields":{"parse_mode":"Markdown"}},"id":"0fd6e587-c181-4575-b3c8-4307b676262d","name":"Msg: Ask IP","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-480,-16],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"matchType":"allConditions","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"last_action":"waiting_search"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"waiting_search","displayName":"waiting_search","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"last_action","displayName":"last_action","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,1040],"id":"779e1473-c343-4223-a78e-9e171fb1be6f","name":"DB: Update State (waiting_search)"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"Введите текст для поиска","additionalFields":{"parse_mode":"Markdown"}},"id":"d39d6cec-5859-4b28-9721-63132abc0607","name":"Msg: Ask Find","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-256,1040],"webhookId":"6b2e2622-087e-4f97-914a-ef61b33a3054","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"leftValue":"={{ $json.last_action }}","rightValue":"waiting_search","operator":{"type":"string","operation":"empty","singleValue":true},"id":"1ba963ee-c3d1-456a-9251-91857c5fdfad"}],"combinator":"and"}},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":3},"conditions":[{"id":"2b8ba99b-47ae-437a-879c-3ce9f5b01c11","leftValue":"={{ $json.last_action }}","rightValue":"=waiting_search","operator":{"type":"string","operation":"equals","name":"filter.operator.equals"}}],"combinator":"and"}}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.4,"position":[192,832],"id":"c26a7967-3af3-4104-ad70-28f07355a8cf","name":"Switch1"},{"parameters":{"chatId":"={{ $('Logic').first().json.chatId }}","text":"={{ $json.text }}","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[864,928],"id":"c15eb3a0-1669-4f51-b349-6c4f795e1975","name":"Send a text message","webhookId":"fb0e3bf8-34c4-42cc-a1fc-a95503049ec8","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⏱ Выберите время через сколько перестанет работать правило: *{{ $json.timeout }}*","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"1 день","additionalFields":{"callback_data":"st|1d"}},{"text":"14 дней","additionalFields":{"callback_data":"st|14d"}},{"text":"31 день","additionalFields":{"callback_data":"st|31d"}}]}}]},"additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,368],"id":"000b9b1b-604a-43c3-aae6-52e242c752a3","name":"Msg: Ask Time","webhookId":"6d930e6d-b512-409c-b06d-4d21b7e94d7f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⏱ Время выбрано: *{{ $json.timeout }}*.📝 Теперь напишите **комментарий** для этой записи (например: \"Иван Офис\"):","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,560],"id":"8d655819-70bc-429a-83f5-859ac04ba738","name":"Msg: Ask Comment","webhookId":"6d930e6d-b512-409c-b06d-4d21b7e94d7f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"update","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"columns":{"mappingMode":"defineBelow","value":{"comment":"={{ $('Logic').item.json.comment }}"},"matchingColumns":[],"schema":[{"id":"chat_id","displayName":"chat_id","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"ip","displayName":"ip","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"list","displayName":"list","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"timeout","displayName":"timeout","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"last_action","displayName":"last_action","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":true},{"id":"comment","displayName":"comment","required":false,"defaultMatch":false,"display":true,"type":"string","readOnly":false,"removed":false}],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-256,752],"id":"1f363c13-d0b3-4fcf-95c0-40f27e27fa94","name":"DB: Update Comment"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $json.deleteMsgId }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-928,560],"id":"72f208fb-d2b1-444b-ba17-320042f4d692","name":"Delete a chat message","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=✅ **IP-адрес успешно добавлен!** 📍 **IP**: `{{ $node[\"DB: Get Final Data\"].json[\"ip\"] }}` 📋 **Лист**: `{{ $node[\"DB: Get Final Data\"].json[\"list\"] }}` ⏱ **Время**: `{{ $node[\"DB: Get Final Data\"].json[\"timeout\"] }}` 📝 **Комментарий**: _{{ $node[\"DB: Get Final Data\"].json[\"comment\"] }}_ 🚀 Правило уже активно в MikroTik.","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1312,768],"id":"659dc251-4fbd-404c-8b48-603b1982da25","name":"Send a text message1","webhookId":"b9cfc33f-5741-47d3-a972-3e6afe01857d","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"=⚠️ Ошибка: IP-адрес `{{$json.ip}}` уже есть в списке `{{$json.list}}`. Добавление отменено.","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1088,576],"id":"6c5d7c4e-574a-4876-a00c-ed052b7ee776","name":"Send a text message2","webhookId":"d85390ac-6acf-49e7-9fbb-7afc898ebca7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"jsCode":"// === 1. ПОЛУЧЕНИЕ И НОРМАЛИЗАЦИЯ ДАННЫХ ===\nconst rawItems = $input.all();\nlet items = [];\n\nif (rawItems.length === 1 && Array.isArray(rawItems[0].json)) {\n items = rawItems[0].json.map(record => ({ json: record }));\n} else {\n items = rawItems;\n}\n\n// === 2. ПОЛУЧЕНИЕ ЗАПРОСА ИЗ ПРЕДЫДУЩИХ НОД ===\nlet query = '';\nlet chatId = null;\n\ntry {\n // Пытаемся взять текст, который пользователь ввел последним (из ноды Logic)\n // В n8n v1+ используем $(node).first().json\n const logicData = $('Logic').first().json;\n \n // Если в Logic пришел комментарий/текст для поиска\n query = (logicData.comment || '').toString().toLowerCase().trim();\n chatId = logicData.chatId;\n} catch (e) {\n // Резервный вариант, если путь выше не сработал\n if (rawItems.length > 0) chatId = rawItems[0].json.chatId;\n}\n\n// Если запроса нет — выходим\nif (!query) {\n return [{\n json: {\n chatId: chatId,\n text: \"⚠️ Ошибка: Поисковый запрос пуст. Пожалуйста, введите текст для поиска после команды.\",\n parse_mode: \"Markdown\"\n }\n }];\n}\n\n// === 3. ФИЛЬТРАЦИЯ ===\nconst matchedItems = items.filter(item => {\n const json = item.json || item;\n if (!json.address && !json.list) return false;\n\n const comment = (json.comment || '').toString().toLowerCase();\n const address = (json.address || '').toString().toLowerCase();\n \n return comment.includes(query) || address.includes(query);\n});\n\n// === 4. ЕСЛИ НИЧЕГО НЕ НАЙДЕНО ===\nif (matchedItems.length === 0) {\n return [{\n json: {\n chatId: chatId,\n text: `❌ *Ничего не найдено*\\n\\nЗапрос: \\`${query}\\`\\nПроверено записей: \\`${items.length}\\``,\n parse_mode: \"Markdown\"\n }\n }];\n}\n\n// === 5. ФОРМИРОВАНИЕ ОТВЕТА (КНОПКИ) ===\nreturn matchedItems.map(item => {\n const e = item.json || item;\n const id = e['.id'] || e.id;\n \n const safeList = (e.list || 'нет').toString().replace(/_/g, '\\\\_').replace(/\\*/g, '\\\\*');\n const safeComment = (e.comment || '—').toString().replace(/_/g, '\\\\_').replace(/\\*/g, '\\\\*');\n \n return {\n json: {\n chatId: chatId,\n text: `*Комментарий:* ${safeComment}\\n*IP:* \\`${e.address}\\`\\n*Лист:* ${safeList}`,\n parse_mode: \"Markdown\",\n reply_markup: {\n inline_keyboard: [\n [\n { text: 'trusted', callback_data: `to|${id}|trusted` },\n { text: 'blocked', callback_data: `to|${id}|blocked` },\n { text: 'vpn', callback_data: `to|${id}|vpn` }\n ],\n [\n { text: 'Удалить', callback_data: `del|${id}` }\n ]\n ]\n }\n }\n };\n});"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[640,928],"id":"85cf204a-133c-43dd-b3fe-3a8011eb2371","name":"Code in JavaScript"},{"parameters":{"jsCode":"// Получаем все входящие элементы\nconst items = $input.all();\nconst uniqueItems = [];\nconst seen = new Set();\n\nfor (const item of items) {\n // Создаем уникальный ключ из IP и названия листа\n const key = `${item.json.ip}-${item.json.list}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n uniqueItems.push(item);\n }\n}\n\nreturn uniqueItems;"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[416,672],"id":"b3ae67ec-1630-4819-b5d7-e6f084f0ba98","name":"Code in JavaScript1"},{"parameters":{"operation":"deleteRows","dataTableId":{"__rl":true,"value":"LwB8m7fQUDgXiNuT","mode":"list","cachedResultName":"mikrotik_sessions","cachedResultUrl":"/projects/sYuiFAb87pAir6jV/datatables/LwB8m7fQUDgXiNuT"},"filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $('Logic').item.json.chatId }}"}]},"options":{}},"type":"n8n-nodes-base.dataTable","typeVersion":1.1,"position":[-480,176],"id":"1d9e7c6c-5d35-4400-ad49-15c3d0bb5875","name":"Delete row(s)"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $('Logic').item.json.deleteMsgId - 1 }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-256,176],"id":"17e5622c-56c1-49cd-b2a4-672d580da3f2","name":"Delete a chat message1","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $('Logic').item.json.deleteMsgId - 1 }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-480,752],"id":"2df1ba1b-72aa-4953-b84e-73280b2a00f1","name":"Delete a chat message2","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"},{"parameters":{"url":"=http://10.33.33.1:8738/rest/ip/firewall/address-list","authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","sendQuery":true,"queryParameters":{"parameters":[{"name":"address","value":"={{ $json.ip }}"}]},"options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[640,672],"id":"7facdc1f-6534-4724-b2a2-49d12aa07cf2","name":"Check if IP exists","alwaysOutputData":true,"credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"5879c004-357a-4be4-8ac1-66e5e5260ddc","leftValue":"={{ $json.address }}","rightValue":0,"operator":{"type":"string","operation":"notEmpty","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"Exists"}]},"options":{"fallbackOutput":"extra"}},"type":"n8n-nodes-base.switch","typeVersion":3.2,"position":[864,672],"id":"83ba3dca-947d-4bfd-aa3c-c57f9c37494e","name":"Filter: Already Exists?"}],"connections":{"Telegram Trigger":{"main":[[{"node":"Logic","type":"main","index":0}]]},"Logic":{"main":[[{"node":"Delete a chat message","type":"main","index":0}]]},"DB: Update List":{"main":[[{"node":"Msg: Ask Time","type":"main","index":0}]]},"DB: Update Time":{"main":[[{"node":"Msg: Ask Comment","type":"main","index":0}]]},"DB: Get Final Data":{"main":[[{"node":"Switch1","type":"main","index":0}]]},"DB: Save IP":{"main":[[{"node":"Msg: Ask List","type":"main","index":0}]]},"Switch":{"main":[[{"node":"Msg: Ask IP","type":"main","index":0}],[{"node":"Delete row(s)","type":"main","index":0}],[{"node":"DB: Update List","type":"main","index":0}],[{"node":"DB: Update Time","type":"main","index":0}],[{"node":"Delete a chat message2","type":"main","index":0}],[{"node":"DB: Get Final Data","type":"main","index":0}],[{"node":"DB: Update State (waiting_search)","type":"main","index":0}]]},"DB: Update State (waiting_search)":{"main":[[{"node":"Msg: Ask Find","type":"main","index":0}]]},"Switch1":{"main":[[{"node":"Code in JavaScript1","type":"main","index":0}],[{"node":"HTTP Request1","type":"main","index":0}]]},"HTTP Request1":{"main":[[{"node":"Code in JavaScript","type":"main","index":0}]]},"HTTP Request: Add IP":{"main":[[{"node":"Send a text message1","type":"main","index":0}]]},"DB: Update Comment":{"main":[[{"node":"DB: Get Final Data","type":"main","index":0}]]},"Delete a chat message":{"main":[[{"node":"Switch","type":"main","index":0}]]},"Code in JavaScript":{"main":[[{"node":"Send a text message","type":"main","index":0}]]},"Code in JavaScript1":{"main":[[{"node":"Check if IP exists","type":"main","index":0}]]},"Delete row(s)":{"main":[[{"node":"Delete a chat message1","type":"main","index":0}]]},"Delete a chat message1":{"main":[[{"node":"DB: Save IP","type":"main","index":0}]]},"Delete a chat message2":{"main":[[{"node":"DB: Update Comment","type":"main","index":0}]]},"Check if IP exists":{"main":[[{"node":"Filter: Already Exists?","type":"main","index":0}]]},"Filter: Already Exists?":{"main":[[{"node":"Send a text message2","type":"main","index":0}],[{"node":"HTTP Request: Add IP","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","availableInMCP":false},"staticData":null,"meta":null,"pinData":{},"versionId":"155aa8a0-477e-475a-8ab9-fab2cbee50db","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-12-26T08:25:46.267Z","createdAt":"2025-12-26T08:25:46.267Z","role":"workflow:owner","workflowId":"sY0ddu-A-1P9TDZclJDPy","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]}