1 line
27 KiB
JSON
1 line
27 KiB
JSON
{"updatedAt":"2025-12-18T05:21:02.386Z","createdAt":"2025-12-17T13:52:45.901Z","id":"NKZb0GpHbd8mQkIW","name":"MikroTik Universal (No DB)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message","callback_query"],"additionalFields":{}},"id":"864c89ee-e30e-4c15-9d0a-c53555f4e279","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-1296,112],"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":"e32aa69f-6402-4a9d-9589-af76f74f01f9","name":"Msg: Ask List","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[352,-192],"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":[-336,-32],"id":"dbeaa59d-ea63-44ba-a7c9-a89f8783dd53","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":"ab457912-85b4-4729-a8b0-e19e7f4d0bd9","name":"Logic","type":"n8n-nodes-base.code","typeVersion":2,"position":[-1088,112]},{"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":[-336,144],"id":"a13a2c5a-2570-4cf4-81ca-fbd40a0ad5f3","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":[-336,448],"id":"17fe9d8f-1de6-466e-8866-0c6dd9bdefed","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\": $json.ip,\n \"list\": $json.list,\n \"timeout\": $json.timeout,\n \"comment\": $json.comment\n }\n}}","options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.3,"position":[352,464],"id":"7b24d2f8-870c-4f25-8841-62774e829561","name":"HTTP Request","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":[144,624],"id":"fe2338b2-1ad9-4f6b-80d0-8aafcd55219e","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":[-672,32],"id":"a687ac78-25e3-47dd-b54b-a8ec9c861840","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":[144,-192],"id":"18645390-0387-4f03-873b-eb833669b2ba","name":"DB: Save IP"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"🌐 **Режим добавления IP** Пожалуйста, введите IP-адрес в формате `1.2.3.4`","additionalFields":{"parse_mode":"Markdown"}},"id":"39191d1f-036d-4306-af87-745f01f5f80d","name":"Msg: Ask IP","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-336,-368],"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":[-336,624],"id":"f3d52d9b-8393-4422-8599-3cfa91ab3e84","name":"DB: Update State (waiting_search)"},{"parameters":{"chatId":"={{ $('Logic').item.json.chatId }}","text":"Введите текст для поиска","additionalFields":{"parse_mode":"Markdown"}},"id":"cac7c3b1-ae17-4397-a8c9-63b3f12ca7fc","name":"Msg: Ask Find","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-128,624],"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":[-128,448],"id":"abf0af04-fe69-40f1-9887-d16d98ef2afe","name":"Switch1"},{"parameters":{"chatId":"={{ $('Logic').first().json.chatId }}","text":"={{ $json.text }}","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[560,624],"id":"a6b8ff7b-c290-41f0-a8d6-02a73c4b2397","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":[-128,-32],"id":"4a48f5fe-78c5-410f-9a07-78e15172ccd7","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":[-128,144],"id":"aa8690d9-2b03-4899-a7df-79f47905ba9e","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":[-128,304],"id":"962a31b8-dc78-467e-8397-717493a2bcb8","name":"DB: Update Comment"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $node[\"Logic\"].json[\"chatId\"] }}","messageId":"={{ $json.deleteMsgId }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-880,112],"id":"ace2fe55-506a-4368-bd60-527717fde7de","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":[560,464],"id":"0c975d1b-aad6-4989-aa02-ce2805180d9e","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-адрес {{$('Logic').item.json.ip}} уже есть в списке {{$json.list}}. Добавление отменено.","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[352,272],"id":"542df179-2554-4b9c-b5b5-34b53dd01d5f","name":"Send a text message2","webhookId":"d85390ac-6acf-49e7-9fbb-7afc898ebca7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"disabled":true},{"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":[352,624],"id":"13f6843a-af63-4e96-85ee-92a2a766093b","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 // Если у вас дубли могут быть с разными chat_id, оставьте только 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":[144,464],"id":"e4712c0e-a3c5-494d-9421-f0d38ac96e44","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":[-336,-192],"id":"28602a25-d93f-4b46-bb3f-472df819d13e","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":[-128,-192],"id":"637bfaf6-93d4-47ac-bd64-b554e9cb9181","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":[-336,304],"id":"8e0acc7f-9197-4e94-aed1-3f7233e754e0","name":"Delete a chat message2","webhookId":"b5567e7e-e74c-4ebd-955d-aaa8ee067ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueRegularOutput"}],"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}]]},"Msg: Ask List":{"main":[[]]},"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}]]},"Msg: Ask IP":{"main":[[]]},"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":{"main":[[{"node":"Send a text message1","type":"main","index":0}]]},"Msg: Ask Time":{"main":[[]]},"Msg: Ask Comment":{"main":[[]]},"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":"HTTP Request","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}]]}},"settings":{"executionOrder":"v1","availableInMCP":false,"timeSavedMode":"fixed","callerPolicy":"workflowsFromSameOwner"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"1637da9d-62a2-4ec7-b575-3c1576bdb9e4","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-12-17T13:52:45.901Z","createdAt":"2025-12-17T13:52:45.901Z","role":"workflow:owner","workflowId":"NKZb0GpHbd8mQkIW","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} |