From e148cd921858e02d5fd047a9813e8f6c6af39f5f Mon Sep 17 00:00:00 2001 From: Claude Sonnet 5 Date: Wed, 12 Aug 2026 19:23:56 +0000 Subject: [PATCH] Restore from Gitea ZIP snapshot (12.08.2026) after full instance reinstall MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Git history was lost when the previous Gitea instance was wiped and reinstalled due to an unresolved corruption bug — this commit is the last known-good file content, exported before the reinstall. Prior commit history is not recoverable through this path. --- ...answers questions with a RAG MCP and a Search Engine MCP.json | 1 + backups/2025-12-27/MikroTik Universal (No DB).json | 1 + .../2025-12-27/MikroTik Universal (With Duplicate Check).json | 1 + backups/2025-12-27/MikroTik ↔ Telegram (Fixed Connections).json | 1 + backups/2025-12-27/My workflow.json | 1 + backups/2025-12-27/RAG in n8n.json | 1 + backups/2025-12-27/Remnawave Final Loop Fix.json | 1 + backups/2025-12-27/TG to AI (Final Fixed).json | 1 + backups/2025-12-27/Telegram → AI Workflow Creator (Fixed).json | 1 + backups/2025-12-27/Telegram → AI Workflow Creator New.json | 1 + backups/2025-12-27/Telegram-n8n-Commander.json | 1 + backups/2025-12-27/Traffic Forecast Dynamic.json | 1 + backups/2025-12-27/Traffic Forecast via Telegram.json | 1 + backups/2025-12-27/Webflow_Lead_Slack_Airtable.json | 1 + backups/2025-12-27/[DIET BOT] админ-панель.json | 1 + backups/2025-12-27/assist.json | 1 + backups/2025-12-27/digest.json | 1 + backups/2025-12-27/docker manage.json | 1 + backups/2025-12-27/mikrotik.json | 1 + backups/2025-12-27/n8n_backup_gitea.json | 1 + backups/2025-12-27/pars_tg.json | 1 + backups/2025-12-27/pars_tg2.json | 1 + backups/2025-12-27/tg_callbacks.json | 1 + backups/2025-12-27/tx_text.json | 1 + 24 files changed, 24 insertions(+) create mode 100644 backups/2025-12-27/AI Assistant which answers questions with a RAG MCP and a Search Engine MCP.json create mode 100644 backups/2025-12-27/MikroTik Universal (No DB).json create mode 100644 backups/2025-12-27/MikroTik Universal (With Duplicate Check).json create mode 100644 backups/2025-12-27/MikroTik ↔ Telegram (Fixed Connections).json create mode 100644 backups/2025-12-27/My workflow.json create mode 100644 backups/2025-12-27/RAG in n8n.json create mode 100644 backups/2025-12-27/Remnawave Final Loop Fix.json create mode 100644 backups/2025-12-27/TG to AI (Final Fixed).json create mode 100644 backups/2025-12-27/Telegram → AI Workflow Creator (Fixed).json create mode 100644 backups/2025-12-27/Telegram → AI Workflow Creator New.json create mode 100644 backups/2025-12-27/Telegram-n8n-Commander.json create mode 100644 backups/2025-12-27/Traffic Forecast Dynamic.json create mode 100644 backups/2025-12-27/Traffic Forecast via Telegram.json create mode 100644 backups/2025-12-27/Webflow_Lead_Slack_Airtable.json create mode 100644 backups/2025-12-27/[DIET BOT] админ-панель.json create mode 100644 backups/2025-12-27/assist.json create mode 100644 backups/2025-12-27/digest.json create mode 100644 backups/2025-12-27/docker manage.json create mode 100644 backups/2025-12-27/mikrotik.json create mode 100644 backups/2025-12-27/n8n_backup_gitea.json create mode 100644 backups/2025-12-27/pars_tg.json create mode 100644 backups/2025-12-27/pars_tg2.json create mode 100644 backups/2025-12-27/tg_callbacks.json create mode 100644 backups/2025-12-27/tx_text.json diff --git a/backups/2025-12-27/AI Assistant which answers questions with a RAG MCP and a Search Engine MCP.json b/backups/2025-12-27/AI Assistant which answers questions with a RAG MCP and a Search Engine MCP.json new file mode 100644 index 0000000..0fea9c4 --- /dev/null +++ b/backups/2025-12-27/AI Assistant which answers questions with a RAG MCP and a Search Engine MCP.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-03T08:57:06.038Z","createdAt":"2025-12-03T08:27:21.172Z","id":"0J4i0Xlku6iq8SrC","name":"AI Assistant which answers questions with a RAG MCP and a Search Engine MCP","active":false,"isArchived":true,"nodes":[{"parameters":{"options":{"systemMessage":"You are a helpful assistant\n\nYou answer questions about MCP (Model Context Protocol). You have access to two MCP servers:\n\n- The RAG MCP Server which answers general questions about MCP\n- The Search Engine MCP Server which allows you to use a Search Engine in realtime.\n\nThe Search Engine MCP Server has two tools;\n- list tool - which shows all the available tools\n- execute tool - which allows you to execute a search query on a search engine.\n\nYou DO NOT answer questions with your internal knowledge, you ONLY use the knowledge provided by the two MCP servers to answer questions."}},"id":"7d21346c-f225-4cc8-85d6-6dd68fc9a035","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[592,240],"typeVersion":2},{"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini"},"options":{}},"id":"ab24be4f-acbd-47b9-abe1-1db621150971","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[352,528],"typeVersion":1.2,"credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"contextWindowLength":15},"id":"71e5008a-2e56-4588-a4c3-a8724026b998","name":"Simple Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[560,528],"typeVersion":1.3},{"parameters":{},"id":"aa1ae334-de5d-4cd3-a4a5-60f48ca37bbe","name":"MCP_Search_List_Tools","type":"n8n-nodes-mcp.mcpClientTool","position":[1040,528],"typeVersion":1},{"parameters":{"content":"## RAG MCP Server","height":220,"width":280,"color":3},"id":"cef78817-9d96-4e16-80d1-6c8a2e7b574b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[688,464],"typeVersion":1},{"parameters":{"content":"## Search Engine MCP Server","height":220,"width":360,"color":5},"id":"62d8bad6-50f4-4eec-b553-2107c7e5ee28","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[992,464],"typeVersion":1},{"parameters":{"operation":"executeTool","toolName":"search_engine","toolParameters":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Tool_Parameters', ``, 'json') }}"},"id":"4522cb25-9a05-4509-a3cb-0f4275c95bb3","name":"MCP_Search_Search_Engine","type":"n8n-nodes-mcp.mcpClientTool","position":[1232,528],"typeVersion":1},{"parameters":{"sseEndpoint":"http://localhost:5678/mcp/f88b9b77-40f2-4fad-8e14-0fc7faed7a0b","options":{}},"id":"e96335a9-cc8a-4d29-85d2-905321fba47c","name":"RAG MCP Server","type":"@n8n/n8n-nodes-langchain.mcpClientTool","position":[800,528],"typeVersion":1},{"parameters":{},"id":"76531f2c-8f92-455f-a618-8fc1dd579d03","name":"MCP Client","type":"n8n-nodes-mcp.mcpClientTool","position":[1024,192],"typeVersion":1},{"parameters":{"updates":["message"],"additionalFields":{}},"type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[336,240],"id":"8ec4db09-107a-4501-b70e-8c1e030a4992","name":"Telegram Trigger","webhookId":"dc3bef1c-7eef-4572-85dc-b835d0b96a8f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}}],"connections":{"MCP Client":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"RAG MCP Server":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"MCP_Search_List_Tools":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"MCP_Search_Search_Engine":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Telegram Trigger":{"main":[[{"node":"AI Agent","type":"main","index":0}]]}},"settings":{},"staticData":null,"meta":{"templateId":"5398"},"pinData":{},"versionId":"6e9b526a-8d62-44d8-b2fa-2b66cfd11cb8","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-03T08:27:21.172Z","createdAt":"2025-12-03T08:27:21.172Z","role":"workflow:owner","workflowId":"0J4i0Xlku6iq8SrC","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/MikroTik Universal (No DB).json b/backups/2025-12-27/MikroTik Universal (No DB).json new file mode 100644 index 0000000..f6eecae --- /dev/null +++ b/backups/2025-12-27/MikroTik Universal (No DB).json @@ -0,0 +1 @@ +{"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":[]} \ No newline at end of file diff --git a/backups/2025-12-27/MikroTik Universal (With Duplicate Check).json b/backups/2025-12-27/MikroTik Universal (With Duplicate Check).json new file mode 100644 index 0000000..cbdd258 --- /dev/null +++ b/backups/2025-12-27/MikroTik Universal (With Duplicate Check).json @@ -0,0 +1 @@ +{"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":[]} \ No newline at end of file diff --git a/backups/2025-12-27/MikroTik ↔ Telegram (Fixed Connections).json b/backups/2025-12-27/MikroTik ↔ Telegram (Fixed Connections).json new file mode 100644 index 0000000..cc410d6 --- /dev/null +++ b/backups/2025-12-27/MikroTik ↔ Telegram (Fixed Connections).json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-08T20:59:27.678Z","createdAt":"2025-12-08T11:04:55.349Z","id":"WH2YAlOoEGwYhFVG","name":"MikroTik ↔ Telegram (Fixed Connections)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message","callback_query"],"additionalFields":{}},"name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-1840,32],"id":"0dcb4cd8-48b0-475a-a1e8-2c21f3276d28","webhookId":"10e7c043-bcbd-4b2c-9994-41b32ed03127","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"functionCode":"// === Получаем данные ===\nconst input = $input.all()[0].json;\nlet chatId, text = '', callbackData = '';\n\nif (input.callback_query) {\n callbackData = input.callback_query.data || '';\n chatId = input.callback_query.message.chat.id;\n} else if (input.message) {\n text = (input.message.text || '').trim();\n chatId = input.message.chat.id;\n}\n\n// === Меню ===\nif (text === '/menu' || text === '/start' || callbackData === 'menu') {\n return [{ json: { chatId, action: 'menu' } }];\n}\n\n// === Кнопки ===\nif (callbackData === 'add_ip') {\n return [{ json: { chatId, action: 'add_ip' } }];\n}\nif (callbackData === 'find_mode') {\n return [{ json: { chatId, action: 'find_mode' } }];\n}\n\n// === Перемещение и удаление ===\nif (callbackData.startsWith('to|') || callbackData.startsWith('del|')) {\n const parts = callbackData.split('|');\n const action = parts[0] === 'del' ? 'delete' : 'move';\n return [{ json: { chatId, entryId: parts[1], newList: parts[2], action } }];\n}\n\n// === КОМАНДА /addip (РАБОТАЕТ В ЛЮБОМ СЛУЧАЕ) ===\nif (text && text.toLowerCase().startsWith('/addip')) {\n const match = text.match(/\\/addip\\s+([\\d.]+)(?:\\s+([\\w-]+))?(?:\\s+([\\w\\d]+))?(?:\\s+\"?([^\"]+)\"?)?/i);\n if (match) {\n const [, ip, list = 'trusted', timeout = '30d', comment = 'Добавлено через Telegram'] = match;\n return [{\n json: {\n chatId,\n ip: ip.trim(),\n list: list.trim(),\n timeout: timeout.trim(),\n comment: (comment || 'Добавлено через Telegram').trim(),\n action: 'add_or_update'\n }\n }];\n } else {\n return [{ json: { chatId, action: 'add_ip' } }]; // если формат кривой — просим ещё раз\n }\n}\n\n// === /find или кнопка ===\nif (text.startsWith('/find ') || callbackData === 'find_mode') {\n const search = text.startsWith('/find ') ? text.slice(6).trim() : '';\n if (!search && text !== '/find') {\n return [{ json: { chatId, action: 'find_mode' } }];\n }\n return [{ json: { chatId, search, action: 'find' } }];\n}\n\nreturn [{ json: { chatId, action: 'menu' } }];"},"name":"Parse","type":"n8n-nodes-base.function","typeVersion":1,"position":[-1616,32],"id":"58d61cc2-c411-4c2e-91bd-b2827805deb8"},{"parameters":{"authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list","options":{}},"name":"Get All IPs","type":"n8n-nodes-base.httpRequest","typeVersion":2,"position":[-912,-32],"id":"6072ec58-eeb3-4596-872b-991416ebfbed","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","requestMethod":"={{ $json.action === 'delete' ? 'DELETE' : 'PATCH' }}","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list/{{ $json.entryId }}","jsonParameters":true,"options":{},"bodyParametersJson":"={{ $json.action === 'delete' ? {} : { list: $json.newList } }}"},"name":"Move or Delete","type":"n8n-nodes-base.httpRequest","typeVersion":2,"position":[-912,496],"id":"c059b155-ff98-433a-82fb-2e4e883934bb","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"authentication":"genericCredentialType","genericAuthType":"httpBasicAuth","requestMethod":"POST","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list/add","jsonParameters":true,"options":{},"bodyParametersJson":"={{\n {\n \"address\": $json.ip,\n \"list\": $json.list,\n \"timeout\": $json.timeout,\n \"comment\": $json.comment\n }\n}}"},"name":"Add or Update IP","type":"n8n-nodes-base.httpRequest","typeVersion":2,"position":[-912,288],"id":"1bf702a3-cafc-4d3e-b993-66620011481b","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"chatId":"={{ $json.chatId }}","text":"={{$json.text}}","replyMarkup":"inlineKeyboard","additionalFields":{}},"name":"Send Inline Results","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-416,-32],"id":"2c319907-41c4-420b-85f0-d6d3ae1b02fa","webhookId":"a698532b-1bce-4863-9bd5-5ab4ba641b64","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.chatId }}","text":"*Управление MikroTik через Telegram*","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"Добавить IP","additionalFields":{"callback_data":"add_ip"}},{"text":"Найти по комментарию","additionalFields":{"callback_data":"find_mode"}},{"text":"Обновить","additionalFields":{"callback_data":"menu"}}]}}]},"additionalFields":{}},"name":"Show Menu","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-912,-416],"id":"1bceeba2-7681-43d4-9d03-1aa72f147211","webhookId":"4ecab171-6694-4e92-85c2-bbc18f374ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.chatId }}","text":"Отправь команду в формате: `/addip 1.2.3.4 ts01srv 7d \"Иван из офиса\"`","additionalFields":{}},"name":"Request Add","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-912,-256],"id":"f1c341dc-0dab-48ef-b901-289b3183608f","webhookId":"4ecab171-6694-4e92-85c2-bbc18f374ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.chatId }}","text":"Напиши команду `/find часть_комментария`\nНапример: `/find Иван`","additionalFields":{}},"name":"Request Find","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-912,112],"id":"81974336-6d75-4cbe-9881-cbce4bb9b8d2","webhookId":"4ecab171-6694-4e92-85c2-bbc18f374ee2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Telegram Trigger').item.json.message.from.id }}","text":"=IP {{ $('Parse').item.json.ip }} успешно добавлен в лист *{{ $('Parse').item.json.list }}*","additionalFields":{}},"name":"Add Success","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-672,288],"id":"63ab56fb-7f70-4aed-a8ea-a5ffed0885f1","webhookId":"a698532b-1bce-4863-9bd5-5ab4ba641b64","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.chatId }}","text":"{{ $json.action === 'delete' ? 'Запись удалена' : 'Лист изменён на *' + $json.newList + '*' }}","additionalFields":{}},"name":"Confirm Action","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-672,496],"id":"4c4442e9-cb91-473b-acb0-6dd0667604c9","webhookId":"a698532b-1bce-4863-9bd5-5ab4ba641b64","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"dataType":"string","value1":"={{ $json.action }}","rules":{"rules":[{"value2":"menu"},{"value2":"add_ip","output":1},{"value2":"find_mode","output":2},{"value2":"find","output":3}]},"fallbackOutput":0},"name":"Router","type":"n8n-nodes-base.switch","typeVersion":1,"position":[-1344,-112],"id":"95298746-e82b-4f28-8938-75f2634caa11"},{"parameters":{"dataType":"string","value1":"={{ $json.action }}","rules":{"rules":[{"value2":"add_or_update"},{"value2":"delete","output":1},{"value2":"move","output":2}]}},"name":"Router1","type":"n8n-nodes-base.switch","typeVersion":1,"position":[-1344,160],"id":"08f0a7ac-b127-4721-949d-ff8d2c19096d"},{"parameters":{"jsCode":"// === 1. ПОЛУЧЕНИЕ И НОРМАЛИЗАЦИЯ ДАННЫХ ===\nconst rawItems = $input.all();\nlet items = [];\n\n// Распаковка массива (фикс для n8n)\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 const parseData = $('Parse').first().json;\n query = (parseData.search || '').toString().toLowerCase().trim();\n chatId = parseData.chatId;\n} catch (e) {\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 \n // Пропускаем пустые записи\n if (!json.address && !json.list) return false;\n\n // Берем значения полей\n const comment = (json.comment || '').toString().toLowerCase();\n const address = (json.address || '').toString().toLowerCase();\n \n // !!! ГЛАВНОЕ ИЗМЕНЕНИЕ ЗДЕСЬ !!!\n // Мы убрали \"list.includes(query)\", теперь поиск идет ТОЛЬКО по:\n // 1. Комментарию\n // 2. IP-адресу (это удобно оставить)\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":[-672,-32],"id":"90391b05-bda6-4703-9781-dcd9d365ca34","name":"Code in JavaScript"}],"connections":{"Telegram Trigger":{"main":[[{"node":"Parse","type":"main","index":0}]]},"Parse":{"main":[[{"node":"Router","type":"main","index":0},{"node":"Router1","type":"main","index":0}]]},"Get All IPs":{"main":[[{"node":"Code in JavaScript","type":"main","index":0}]]},"Move or Delete":{"main":[[{"node":"Confirm Action","type":"main","index":0}]]},"Add or Update IP":{"main":[[{"node":"Add Success","type":"main","index":0}]]},"Router":{"main":[[{"node":"Show Menu","type":"main","index":0}],[{"node":"Request Add","type":"main","index":0}],[{"node":"Request Find","type":"main","index":0}],[{"node":"Get All IPs","type":"main","index":0}]]},"Router1":{"main":[[{"node":"Add or Update IP","type":"main","index":0}],[{"node":"Move or Delete","type":"main","index":0}],[{"node":"Move or Delete","type":"main","index":0}]]},"Code in JavaScript":{"main":[[{"node":"Send Inline Results","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"86cbc0e5-3898-4bec-acb4-b2d839b0a7f8","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-12-08T11:04:55.349Z","createdAt":"2025-12-08T11:04:55.349Z","role":"workflow:owner","workflowId":"WH2YAlOoEGwYhFVG","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/My workflow.json b/backups/2025-12-27/My workflow.json new file mode 100644 index 0000000..d54e62c --- /dev/null +++ b/backups/2025-12-27/My workflow.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-03T08:56:41.048Z","createdAt":"2025-11-29T21:38:38.667Z","id":"QkcQOlUlhxvB4Urv","name":"My workflow","active":false,"isArchived":true,"nodes":[{"parameters":{"updates":["*"],"additionalFields":{}},"name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-400,208],"id":"67242ab2-91ef-45ed-b065-7f3464a6d373","webhookId":"8da6a665-bf05-49f4-b17d-2a302fd2ecda","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"functionCode":"// Парсим сообщение из Telegram\nconst message = $input.all()[0].json.message.text;\nconst chatId = $input.all()[0].json.message.chat.id;\n\n// Проверяем формат сообщения (пример: /addip 192.168.1.100 trusted_ips 1d \"Комментарий\")\nconst match = message.match(/^\\/addip (\\d+\\.\\d+\\.\\d+\\.\\d+)(?: (\\S+)(?: (\\S+)(?: \"(.+)\")?)?)?/);\n\nif (!match) {\n return [{\n json: {\n chatId,\n error: 'Неверный формат. Используйте: /addip IP [list] [timeout] \"[comment]\"'\n }\n }];\n}\n\n// Извлекаем параметры\nconst [, ipAddress, addressList = 'trusted_hosts', timeout = '1d', comment = 'Added via Telegram'] = match;\n\nreturn [{\n json: {\n chatId,\n ipAddress,\n addressList,\n timeout,\n comment,\n success: true\n }\n}];"},"name":"Parse Telegram Command","type":"n8n-nodes-base.function","typeVersion":1,"position":[-208,208],"id":"cd42faf3-6552-4055-bba0-a0f0742e02ee"},{"parameters":{"authentication":"basicAuth","requestMethod":"POST","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list","jsonParameters":true,"options":{},"bodyParametersJson":"{\n \"address\": \"{{$node['Parse Telegram Command'].json['ipAddress']}}\",\n \"list\": \"{{$node['Parse Telegram Command'].json['addressList']}}\",\n \"timeout\": \"{{$node['Parse Telegram Command'].json['timeout']}}\",\n \"comment\": \"{{$node['Parse Telegram Command'].json['comment']}}\"\n}"},"name":"MikroTik API Request","type":"n8n-nodes-base.httpRequest","typeVersion":1,"position":[0,208],"id":"8f7a7535-0423-4111-a4ad-fa1d8d57334c","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"operation":"send"},"name":"Telegram Success","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[208,112],"id":"16fb0c34-49e5-48d5-b1a4-0eeb44b40e13","webhookId":"0260be7d-496c-4728-a861-e41d14cbdd5e","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"operation":"send"},"name":"Telegram Error","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[208,304],"id":"976d6166-60de-4b06-99bb-c2e027229050","webhookId":"06a8453c-242e-48c4-b5b7-b868a23dc102","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}}],"connections":{"Telegram Trigger":{"main":[[{"node":"Parse Telegram Command","type":"main","index":0}]]},"Parse Telegram Command":{"main":[[{"node":"MikroTik API Request","type":"main","index":0}]]},"MikroTik API Request":{"main":[[{"node":"Telegram Success","type":"main","index":0},{"node":"Telegram Error","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"8955e382-3a25-4495-aa00-7f7aeef3e9eb","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-11-29T21:38:38.667Z","createdAt":"2025-11-29T21:38:38.667Z","role":"workflow:owner","workflowId":"QkcQOlUlhxvB4Urv","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/RAG in n8n.json b/backups/2025-12-27/RAG in n8n.json new file mode 100644 index 0000000..30b25dc --- /dev/null +++ b/backups/2025-12-27/RAG in n8n.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-05T13:12:59.842Z","createdAt":"2025-12-03T08:32:37.392Z","id":"nJ2eDjcQO5DPZuWz","name":"RAG in n8n","active":false,"isArchived":false,"nodes":[{"parameters":{"formTitle":"Upload your data to test RAG","formFields":{"values":[{"fieldLabel":"Upload your file(s)","fieldType":"file","acceptFileTypes":".pdf, .csv, .docx","requiredField":true}]},"options":{}},"type":"n8n-nodes-base.formTrigger","typeVersion":2.2,"position":[-128,0],"id":"f7a656ec-83fc-4ed2-a089-57a9def662b7","name":"Upload your file here","webhookId":"82848bc4-5ea2-4e5a-8bb6-3c09b94a8c5d"},{"parameters":{"options":{}},"type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","typeVersion":1.2,"position":[80,336],"id":"6ea78663-cf2f-4f2d-8e68-43047c2afd87","name":"Embeddings OpenAI","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"dataType":"binary","options":{}},"type":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","typeVersion":1.1,"position":[320,176],"id":"94aecac0-03f9-4915-932b-d14a2576607b","name":"Default Data Loader"},{"parameters":{"content":"### 📚 Load Data Flow","height":524,"width":700,"color":7},"type":"n8n-nodes-base.stickyNote","position":[-176,-64],"typeVersion":1,"id":"d19d04f3-5231-4e47-bed7-9f24a4a8f582","name":"Sticky Note1"},{"parameters":{"mode":"insert","memoryKey":{"__rl":true,"value":"vector_store_key","mode":"list","cachedResultName":"vector_store_key"}},"type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","typeVersion":1.2,"position":[64,0],"id":"bf50a11f-ca6a-4e04-a6d2-42fee272b260","name":"Insert Data to Store"},{"parameters":{"mode":"retrieve-as-tool","toolName":"knowledge_base","toolDescription":"Use this knowledge base to answer questions from the user","memoryKey":{"__rl":true,"mode":"list","value":"vector_store_key"}},"type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","typeVersion":1.2,"position":[1184,352],"id":"09c0db62-5413-440e-8c13-fb6bb66d9b6a","name":"Query Data Tool"},{"parameters":{"promptType":"define","text":"={{ $json.text }}","options":{"systemMessage":"You are a helpful personal finder called Jackie. \n\nGuidelines:\n- Always use Query Data Tool"}},"type":"@n8n/n8n-nodes-langchain.agent","typeVersion":2,"position":[1024,160],"id":"579aed76-9644-42d1-ac13-7369059ff1c2","name":"AI Agent"},{"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","typeVersion":1.2,"position":[880,272],"id":"b5aa8942-9cd5-4c2f-bd77-7a0ceb921bac","name":"OpenAI Chat Model","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"content":"### 🐕 2. Retriever Flow","height":524,"width":840,"color":7},"type":"n8n-nodes-base.stickyNote","position":[608,-64],"typeVersion":1,"id":"28bc73a1-e64a-47bf-ac1c-ffe644894ea5","name":"Sticky Note2"},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"6d3fc987-0504-4f15-b44e-ac9e87156954","leftValue":"={{ $json.message.text }}","rightValue":"","operator":{"type":"string","operation":"empty","singleValue":true}}],"combinator":"and"},"options":{}},"type":"n8n-nodes-base.if","typeVersion":2.2,"position":[928,-32],"id":"9a04ceb1-964f-4259-8793-370381079d66","name":"If"},{"parameters":{"resource":"file","fileId":"={{ $('Listen for incoming events').item.json.message.voice.file_id }}","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1088,-48],"id":"20917588-1eb9-4b32-9335-2aa6f1e06e28","name":"Get Voice File","webhookId":"b76dc106-a130-42f4-b6d4-c1b2cce03819","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"resource":"audio","operation":"transcribe","options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":2.1,"position":[1296,-48],"id":"29407c24-bd2d-4fb1-9880-fdc185f4a410","name":"Transcribe a recording","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"assignments":{"assignments":[{"id":"39d69a44-fc96-44b7-8bd7-8e9129084420","name":"text","value":"={{ $json?.message?.text || \"\" }}","type":"string"}]},"includeOtherFields":true,"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[784,-32],"id":"a706425f-2d1d-4654-944a-7f2a85bbdc59","name":"Voice or Text"},{"parameters":{"updates":["message"],"additionalFields":{}},"type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[624,-16],"id":"33453c04-30aa-4401-87b2-b306d8cb4c24","name":"Listen for incoming events","webhookId":"a236a2f1-1eff-465b-aba5-b1505f1c3a18","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Listen for incoming events').first().json.message.from.id }}","text":"={{ $json.output }}","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1328,160],"id":"fda54a79-1a02-4a5c-9aef-0453bc44e471","name":"Send a text message","webhookId":"dc06c94c-79a8-497b-9c58-512dccc2c15c","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}}],"connections":{"Upload your file here":{"main":[[{"node":"Insert Data to Store","type":"main","index":0}]]},"Embeddings OpenAI":{"ai_embedding":[[{"node":"Insert Data to Store","type":"ai_embedding","index":0},{"node":"Query Data Tool","type":"ai_embedding","index":0}]]},"Default Data Loader":{"ai_document":[[{"node":"Insert Data to Store","type":"ai_document","index":0}]]},"Query Data Tool":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"If":{"main":[[{"node":"Get Voice File","type":"main","index":0}],[{"node":"AI Agent","type":"main","index":0}]]},"Get Voice File":{"main":[[{"node":"Transcribe a recording","type":"main","index":0}]]},"Transcribe a recording":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Voice or Text":{"main":[[{"node":"If","type":"main","index":0}]]},"Listen for incoming events":{"main":[[{"node":"Voice or Text","type":"main","index":0}]]},"AI Agent":{"main":[[{"node":"Send a text message","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateId":"rag-starter-template","templateCredsSetupCompleted":true},"pinData":{},"versionId":"f3d59437-6047-420e-a60d-fe1c739dc97b","activeVersionId":null,"triggerCount":2,"shared":[{"updatedAt":"2025-12-03T08:32:37.392Z","createdAt":"2025-12-03T08:32:37.392Z","role":"workflow:owner","workflowId":"nJ2eDjcQO5DPZuWz","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Remnawave Final Loop Fix.json b/backups/2025-12-27/Remnawave Final Loop Fix.json new file mode 100644 index 0000000..4df6ab8 --- /dev/null +++ b/backups/2025-12-27/Remnawave Final Loop Fix.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-20T09:44:00.286Z","createdAt":"2025-12-20T08:24:59.964Z","id":"IUYOCZtINnHMUhWI","name":"Remnawave Final Loop Fix","active":true,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"id":"eb97aa49-b1b6-4249-8a9d-60254966b59d","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-528,160],"webhookId":"remnawave-add-user","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"jsCode":"// Получаем текст\nconst text = $('Telegram Trigger').first().json.message.text;\n\n// Настройки времени\nlet days = 30;\nlet durationMultiplier = 24 * 60 * 60 * 1000;\n\n// Парсим срок (30d, 1m, 24h)\nconst durationRegex = /\\b(\\d+)([dmh])\\b/i;\nconst durationMatch = text.match(durationRegex);\n\nif (durationMatch) {\n const value = parseInt(durationMatch[1]);\n const unit = durationMatch[2].toLowerCase();\n if (unit === 'd') days = value;\n if (unit === 'm') days = value * 30;\n if (unit === 'h') days = value / 24;\n}\n\n// Считаем дату окончания\nconst expireDateSec = Math.floor((Date.now() + (days * durationMultiplier)) / 1000);\n\n// Ищем юзеров\nconst lines = text.split(/[\\n\\s]+/);\nconst users = [];\n\nfor (const line of lines) {\n const cleanLine = line.trim();\n if (!cleanLine) continue;\n if (cleanLine.startsWith('/')) continue;\n if (cleanLine.match(durationRegex)) continue;\n \n users.push(cleanLine);\n}\n\nreturn users.map(user => ({\n json: {\n username: user,\n expireDateSec: expireDateSec,\n days: days\n }\n}));"},"id":"f135a0a1-f751-4e59-866f-1e617b61ae3c","name":"Parse Input","type":"n8n-nodes-base.code","typeVersion":2,"position":[-96,160]},{"parameters":{"batchSize":1,"options":{}},"id":"6e21712b-51fc-454d-a744-e05feccfeee0","name":"Split In Batches","type":"n8n-nodes-base.splitInBatches","typeVersion":2,"position":[128,160]},{"parameters":{"method":"POST","url":"={{ $('Config').item.json.BASE_URL }}/api/users","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"={{ 'Bearer ' + $('Config').item.json.API_TOKEN }}"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"username","value":"={{ $json.username }}"},{"name":"expireAt","value":"={{ new Date($json.expireDateSec * 1000).toISOString() }}"},{"name":"externalSquadUuid","value":"={{ $('Config').item.json.EXTERNAL_SQUAD_ID ? $('Config').item.json.EXTERNAL_SQUAD_ID : null }}"},{"name":"trafficLimitBytes","value":0},{"name":"trafficLimitStrategy","value":"NO_RESET"}]},"options":{}},"id":"0bac5c3d-d051-4da9-ada2-2ce2bd883127","name":"1. Create User","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[368,48],"onError":"continueErrorOutput"},{"parameters":{"method":"POST","url":"={{ $('Config').item.json.BASE_URL }}/api/internal-squads/{{ $('Config').item.json.INTERNAL_SQUAD_ID }}/bulk-actions/add-users","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"={{ 'Bearer ' + $('Config').item.json.API_TOKEN }}"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"uuids","value":"={{ [ $json.uuid ] }}"}]},"options":{}},"id":"d13903c8-4292-4a22-8be0-c4b1b7cda704","name":"2. Add to Squad","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[576,48],"onError":"continueErrorOutput"},{"parameters":{"chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","text":"={{ $('Split In Batches').item.json.username }} — ✅ Создан и добавлен в группу\nего подписка:\n{{ $('1. Create User').item.json.response.subscriptionUrl }}","additionalFields":{"parse_mode":"HTML"}},"id":"0a9103c9-928d-4982-9692-734b4a841bee","name":"Reply Success","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[800,48],"webhookId":"aa2109f8-e48b-4d2f-b557-509cea0428f7","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","text":"={{ $('Split In Batches').item.json.username }} — ❌ Ошибка: {{ $input.item.json.message || JSON.stringify($input.item.json) }}","additionalFields":{}},"id":"825fa336-4485-40cf-a132-60ad0adef891","name":"Reply Error","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[800,256],"webhookId":"9719e5da-0945-4e1a-8c15-82e88b89e91d","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"fields":{"values":[{"name":"BASE_URL","stringValue":"https://panel.infra.pet"},{"name":"API_TOKEN","stringValue":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiNDQ4NDNmNjAtYzY3YS00OWM3LWJkOWMtMzEwOGE4ZTkxYjM2IiwidXNlcm5hbWUiOm51bGwsInJvbGUiOiJBUEkiLCJpYXQiOjE3NjYyMTkwMjUsImV4cCI6MTA0MDYxMzI2MjV9.QTcYdHeCYegiFbodTy6Q0VPExvso8ui-7kujxEjl1D0"},{"name":"INTERNAL_SQUAD_ID","stringValue":"77e82a2f-b15b-4678-9cdc-425f6f8e1dcc"},{"name":"EXTERNAL_SQUAD_ID","stringValue":"55f91437-419a-4412-bcfc-6d43c775a997"}]},"options":{}},"id":"3201251d-293c-48b2-aeb1-05bceeb60e00","name":"Config","type":"n8n-nodes-base.set","typeVersion":3.2,"position":[-304,160]}],"connections":{"Telegram Trigger":{"main":[[{"node":"Config","type":"main","index":0}]]},"Parse Input":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]},"Split In Batches":{"main":[[{"node":"1. Create User","type":"main","index":0}]]},"1. Create User":{"main":[[{"node":"2. Add to Squad","type":"main","index":0}],[{"node":"Reply Error","type":"main","index":0}]]},"2. Add to Squad":{"main":[[{"node":"Reply Success","type":"main","index":0}],[{"node":"Reply Error","type":"main","index":0}]]},"Config":{"main":[[{"node":"Parse Input","type":"main","index":0}]]},"Reply Error":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]},"Reply Success":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","availableInMCP":false},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"d8941967-e5cd-4649-8165-efff8c698045","activeVersionId":"d8941967-e5cd-4649-8165-efff8c698045","triggerCount":1,"shared":[{"updatedAt":"2025-12-20T08:24:59.964Z","createdAt":"2025-12-20T08:24:59.964Z","role":"workflow:owner","workflowId":"IUYOCZtINnHMUhWI","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":{"updatedAt":"2025-12-21T11:47:18.050Z","createdAt":"2025-12-20T09:44:00.288Z","versionId":"d8941967-e5cd-4649-8165-efff8c698045","workflowId":"IUYOCZtINnHMUhWI","nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"id":"eb97aa49-b1b6-4249-8a9d-60254966b59d","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-528,160],"webhookId":"remnawave-add-user","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"jsCode":"// Получаем текст\nconst text = $('Telegram Trigger').first().json.message.text;\n\n// Настройки времени\nlet days = 30;\nlet durationMultiplier = 24 * 60 * 60 * 1000;\n\n// Парсим срок (30d, 1m, 24h)\nconst durationRegex = /\\b(\\d+)([dmh])\\b/i;\nconst durationMatch = text.match(durationRegex);\n\nif (durationMatch) {\n const value = parseInt(durationMatch[1]);\n const unit = durationMatch[2].toLowerCase();\n if (unit === 'd') days = value;\n if (unit === 'm') days = value * 30;\n if (unit === 'h') days = value / 24;\n}\n\n// Считаем дату окончания\nconst expireDateSec = Math.floor((Date.now() + (days * durationMultiplier)) / 1000);\n\n// Ищем юзеров\nconst lines = text.split(/[\\n\\s]+/);\nconst users = [];\n\nfor (const line of lines) {\n const cleanLine = line.trim();\n if (!cleanLine) continue;\n if (cleanLine.startsWith('/')) continue;\n if (cleanLine.match(durationRegex)) continue;\n \n users.push(cleanLine);\n}\n\nreturn users.map(user => ({\n json: {\n username: user,\n expireDateSec: expireDateSec,\n days: days\n }\n}));"},"id":"f135a0a1-f751-4e59-866f-1e617b61ae3c","name":"Parse Input","type":"n8n-nodes-base.code","typeVersion":2,"position":[-96,160]},{"parameters":{"batchSize":1,"options":{}},"id":"6e21712b-51fc-454d-a744-e05feccfeee0","name":"Split In Batches","type":"n8n-nodes-base.splitInBatches","typeVersion":2,"position":[128,160]},{"parameters":{"method":"POST","url":"={{ $('Config').item.json.BASE_URL }}/api/users","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"={{ 'Bearer ' + $('Config').item.json.API_TOKEN }}"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"username","value":"={{ $json.username }}"},{"name":"expireAt","value":"={{ new Date($json.expireDateSec * 1000).toISOString() }}"},{"name":"externalSquadUuid","value":"={{ $('Config').item.json.EXTERNAL_SQUAD_ID ? $('Config').item.json.EXTERNAL_SQUAD_ID : null }}"},{"name":"trafficLimitBytes","value":0},{"name":"trafficLimitStrategy","value":"NO_RESET"}]},"options":{}},"id":"0bac5c3d-d051-4da9-ada2-2ce2bd883127","name":"1. Create User","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[368,48],"onError":"continueErrorOutput"},{"parameters":{"method":"POST","url":"={{ $('Config').item.json.BASE_URL }}/api/internal-squads/{{ $('Config').item.json.INTERNAL_SQUAD_ID }}/bulk-actions/add-users","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"={{ 'Bearer ' + $('Config').item.json.API_TOKEN }}"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"uuids","value":"={{ [ $json.uuid ] }}"}]},"options":{}},"id":"d13903c8-4292-4a22-8be0-c4b1b7cda704","name":"2. Add to Squad","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[576,48],"onError":"continueErrorOutput"},{"parameters":{"chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","text":"={{ $('Split In Batches').item.json.username }} — ✅ Создан и добавлен в группу\nего подписка:\n{{ $('1. Create User').item.json.response.subscriptionUrl }}","additionalFields":{"parse_mode":"HTML"}},"id":"0a9103c9-928d-4982-9692-734b4a841bee","name":"Reply Success","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[800,48],"webhookId":"aa2109f8-e48b-4d2f-b557-509cea0428f7","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","text":"={{ $('Split In Batches').item.json.username }} — ❌ Ошибка: {{ $input.item.json.message || JSON.stringify($input.item.json) }}","additionalFields":{}},"id":"825fa336-4485-40cf-a132-60ad0adef891","name":"Reply Error","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[800,256],"webhookId":"9719e5da-0945-4e1a-8c15-82e88b89e91d","credentials":{"telegramApi":{"id":"XfLtzJeW8r1QKw4d","name":"Telegram pomoshnik_monster"}}},{"parameters":{"fields":{"values":[{"name":"BASE_URL","stringValue":"https://panel.infra.pet"},{"name":"API_TOKEN","stringValue":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1dWlkIjoiNDQ4NDNmNjAtYzY3YS00OWM3LWJkOWMtMzEwOGE4ZTkxYjM2IiwidXNlcm5hbWUiOm51bGwsInJvbGUiOiJBUEkiLCJpYXQiOjE3NjYyMTkwMjUsImV4cCI6MTA0MDYxMzI2MjV9.QTcYdHeCYegiFbodTy6Q0VPExvso8ui-7kujxEjl1D0"},{"name":"INTERNAL_SQUAD_ID","stringValue":"77e82a2f-b15b-4678-9cdc-425f6f8e1dcc"},{"name":"EXTERNAL_SQUAD_ID","stringValue":"55f91437-419a-4412-bcfc-6d43c775a997"}]},"options":{}},"id":"3201251d-293c-48b2-aeb1-05bceeb60e00","name":"Config","type":"n8n-nodes-base.set","typeVersion":3.2,"position":[-304,160]}],"connections":{"Telegram Trigger":{"main":[[{"node":"Config","type":"main","index":0}]]},"Parse Input":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]},"Split In Batches":{"main":[[{"node":"1. Create User","type":"main","index":0}]]},"1. Create User":{"main":[[{"node":"2. Add to Squad","type":"main","index":0}],[{"node":"Reply Error","type":"main","index":0}]]},"2. Add to Squad":{"main":[[{"node":"Reply Success","type":"main","index":0}],[{"node":"Reply Error","type":"main","index":0}]]},"Config":{"main":[[{"node":"Parse Input","type":"main","index":0}]]},"Reply Error":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]},"Reply Success":{"main":[[{"node":"Split In Batches","type":"main","index":0}]]}},"authors":"Oleg Grechko","name":"Version d8941967","description":"","autosaved":false},"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/TG to AI (Final Fixed).json b/backups/2025-12-27/TG to AI (Final Fixed).json new file mode 100644 index 0000000..20601ba --- /dev/null +++ b/backups/2025-12-27/TG to AI (Final Fixed).json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-05T13:44:57.168Z","createdAt":"2025-12-05T13:12:22.196Z","id":"pbxJhgKargb04QBi","name":"TG to AI (Final Fixed)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{"download":true}},"id":"a80f3e49-fabb-4d68-96d9-aee529d8b518","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1.1,"position":[-576,400],"webhookId":"tg-webhook","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"method":"POST","url":"https://api.stability.ai/v1/generation/stable-diffusion-xl-1024-v1-0/image-to-image","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Accept","value":"application/json"}]},"sendBody":true,"contentType":"multipart-form-data","bodyParameters":{"parameters":[{"name":"text_prompts[0][text]","value":"={{ $json.message.caption || \"high quality, detailed\" }}"},{"name":"text_prompts[0][weight]","value":"1"},{"name":"init_image_mode","value":"IMAGE_STRENGTH"},{"name":"image_strength","value":"0.35"},{"name":"samples","value":"2"},{"name":"steps","value":"30"},{"parameterType":"formBinaryData","name":"init_image","inputDataFieldName":"data"}]},"options":{}},"id":"e3559163-6cfb-4722-af60-122dfd0137c5","name":"Stability AI Request","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[-144,400],"credentials":{"httpHeaderAuth":{"id":"U4iKTPOIVsBzAyTa","name":"stable.ai"}}},{"parameters":{"jsCode":"// Получаем артефакты (картинки) из JSON ответа\n// Stability AI возвращает массив 'artifacts'\nconst artifacts = items[0].json.artifacts;\nconst results = [];\n\n// Проходимся по всем картинкам (их будет 2, так как samples=2)\nif (artifacts && artifacts.length > 0) {\n artifacts.forEach((image, index) => {\n results.push({\n json: {\n finishReason: image.finishReason,\n seed: image.seed,\n info: `Вариант ${index + 1}`\n },\n binary: {\n data: {\n data: image.base64,\n mimeType: 'image/png',\n fileExtension: 'png',\n fileName: `generated_${index}.png`\n }\n }\n });\n });\n} else {\n // Если что-то пошло не так и картинок нет\n return [];\n}\n\nreturn results;"},"id":"0ccdeca0-0975-402d-917a-c339b4aaa4f0","name":"Process Response","type":"n8n-nodes-base.code","typeVersion":2,"position":[80,400]},{"parameters":{"operation":"sendPhoto","chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","binaryData":true,"additionalFields":{}},"id":"5963fd17-15d7-471d-8a43-a48eff236139","name":"Send Photo to TG","type":"n8n-nodes-base.telegram","typeVersion":1.1,"position":[304,400],"webhookId":"dbde12a9-bb16-4e39-8e79-447addb70b92","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"operation":"resize","width":1024,"height":1024,"resizeOption":"ignoreAspectRatio","options":{}},"type":"n8n-nodes-base.editImage","typeVersion":1,"position":[-352,400],"id":"6237fa02-50df-4df0-915b-5c39973ce931","name":"Edit Image"}],"connections":{"Stability AI Request":{"main":[[{"node":"Process Response","type":"main","index":0}]]},"Process Response":{"main":[[{"node":"Send Photo to TG","type":"main","index":0}]]},"Edit Image":{"main":[[{"node":"Stability AI Request","type":"main","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Edit Image","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"333e1db5-0737-4667-adca-6f9cc9d549a0","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-05T13:12:22.196Z","createdAt":"2025-12-05T13:12:22.196Z","role":"workflow:owner","workflowId":"pbxJhgKargb04QBi","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Telegram → AI Workflow Creator (Fixed).json b/backups/2025-12-27/Telegram → AI Workflow Creator (Fixed).json new file mode 100644 index 0000000..ac03237 --- /dev/null +++ b/backups/2025-12-27/Telegram → AI Workflow Creator (Fixed).json @@ -0,0 +1 @@ +{"updatedAt":"2025-10-27T08:03:18.061Z","createdAt":"2025-10-23T11:46:12.459Z","id":"d02Xv9I3If0Qt4aj","name":"Telegram → AI Workflow Creator (Fixed)","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"id":"c425cc32-f48b-42b3-a51c-74995b95983e","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[-880,-128],"webhookId":"telegram-webhook","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"jsCode":"const inputData = $input.first() || {};\nconsole.log('Input Data:', JSON.stringify(inputData, null, 2));\n\nconst jsonData = inputData.json || {};\nif (!jsonData || typeof jsonData !== 'object') {\n return [{\n json: {\n error: 'Некорректные данные от Telegram. Ожидался объект json.',\n chat_id: '',\n message_id: ''\n }\n }];\n}\n\nconst message = jsonData.message || {};\nif (!message || typeof message !== 'object') {\n return [{\n json: {\n error: 'Некорректные данные от Telegram. Ожидался объект message.',\n chat_id: '',\n message_id: ''\n }\n }];\n}\n\nif (!message.text) {\n return [{\n json: {\n error: 'Это не текстовое сообщение. Отправьте текстовую команду.',\n chat_id: message.chat?.id || '',\n message_id: message.message_id || ''\n }\n }];\n}\n\nconst messageText = message.text || '';\nconst chatId = message.chat?.id || '';\nconst messageId = message.message_id || '';\n\nconst regex = /^\\/create\\s+(.+)/;\nconst match = messageText.match(regex);\n\nif (match) {\n return [{\n json: {\n description: match[1].trim(),\n chat_id: chatId,\n message_id: messageId,\n success: true\n }\n }];\n} else {\n return [{\n json: {\n error: 'Команда не распознана. Используйте: /create <описание workflow>',\n chat_id: chatId,\n message_id: messageId,\n success: false\n }\n }];\n}"},"id":"a6cbef33-941f-4a06-b5b9-315c8451e1de","name":"Check /create Command","type":"n8n-nodes-base.code","typeVersion":2,"position":[-640,-128]},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict"},"conditions":[{"id":"1","leftValue":"={{ $json.success }}","rightValue":"true"}],"combinator":"and"},"options":{}},"id":"90a71303-43a5-47a6-9de8-036a9429e4f6","name":"If Success","type":"n8n-nodes-base.if","typeVersion":2,"position":[-400,-128]},{"parameters":{"jsCode":"const description = $json.description;\nconst chatId = $json.chat_id;\nconst messageId = $json.message_id;\n\nconsole.log('Generating workflow for:', description);\n\nconst requestBody = {\n model: \"gpt-4o-mini\",\n messages: [\n {\n role: \"system\",\n content: \"Ты эксперт по n8n. Генерируй ВАЛИДНЫЙ JSON для импорта workflow в n8n по описанию пользователя. Структура: {name: string, nodes: [], connections: {}, settings: {}, tags: []}. Каждый node должен иметь: id (uuid), name, type, typeVersion, position [x,y], parameters. Используй случайные UUID для id. Верни ТОЛЬКО валидный JSON без каких-либо объяснений или текста вокруг.\"\n },\n {\n role: \"user\", \n content: \"Создай n8n workflow JSON для: \" + description\n }\n ],\n max_tokens: 4000,\n temperature: 0.1\n};\n\ntry {\n const response = await $http({\n method: 'POST',\n url: 'https://api.openai.com/v1/chat/completions',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + $credentials.openAiApi.apiKey\n },\n body: JSON.stringify(requestBody),\n timeout: 30000\n });\n\n console.log('OpenAI Response Status:', response.status);\n \n if (response.status !== 200) {\n throw new Error(`OpenAI API error: ${response.status} - ${JSON.stringify(response.body)}`);\n }\n\n const responseData = response.body;\n \n if (!responseData.choices || !responseData.choices[0]) {\n throw new Error('Некорректный ответ от OpenAI: нет choices');\n }\n\n const aiResponse = responseData.choices[0].message.content.trim();\n console.log('AI Raw Response:', aiResponse);\n\n let workflowJson;\n try {\n const cleanResponse = aiResponse.replace(/```json\\n?|```\\n?/g, '');\n workflowJson = JSON.parse(cleanResponse);\n } catch (error) {\n throw new Error('AI вернул невалидный JSON: ' + error.message + '. Raw: ' + aiResponse.substring(0, 200));\n }\n\n if (!workflowJson.name) {\n workflowJson.name = 'AI Generated Workflow - ' + description.substring(0, 30);\n }\n if (!workflowJson.nodes) workflowJson.nodes = [];\n if (!workflowJson.connections) workflowJson.connections = {};\n if (!workflowJson.settings) workflowJson.settings = {};\n if (!workflowJson.tags) workflowJson.tags = [];\n\n return [{\n json: {\n workflow: workflowJson,\n chat_id: chatId,\n message_id: messageId,\n description: description,\n success: true\n }\n }];\n\n} catch (error) {\n console.error('OpenAI API Error:', error);\n return [{\n json: {\n error: 'Ошибка при генерации workflow: ' + error.message,\n chat_id: chatId,\n message_id: messageId,\n success: false\n }\n }];\n}"},"id":"94c989b8-899a-479f-a393-eb10dcfaedd3","name":"Generate Workflow (AI)","type":"n8n-nodes-base.code","typeVersion":2,"position":[-160,-128]},{"parameters":{"method":"POST","url":"={{ $vars.N8N_HOST || 'http://localhost:5678' }}/api/v1/workflows","authentication":"predefinedCredentialType","nodeCredentialType":"n8nApi","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"bodyParameters":{"parameters":[{}]},"options":{}},"id":"4a4f8032-0281-4e50-b033-af3dff90303b","name":"Create Workflow (API)","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[96,-128],"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"jsCode":"const apiResponse = $input.first();\nconst baseData = $('Generate Workflow (AI)').first().json;\n\nconsole.log('API Response Status:', apiResponse.statusCode);\nconsole.log('API Response Body:', JSON.stringify(apiResponse.json, null, 2));\n\nif (apiResponse.statusCode >= 200 && apiResponse.statusCode < 300) {\n return [{\n json: {\n success: true,\n workflow_id: apiResponse.json.id,\n workflow_name: apiResponse.json.name || baseData.workflow.name,\n chat_id: baseData.chat_id,\n message_id: baseData.message_id,\n message: `✅ Workflow \"${apiResponse.json.name}\" успешно создан! ID: ${apiResponse.json.id}`\n }\n }];\n} else {\n return [{\n json: {\n success: false,\n error: `Ошибка создания workflow: ${apiResponse.statusCode} - ${JSON.stringify(apiResponse.json)}`,\n chat_id: baseData.chat_id,\n message_id: baseData.message_id,\n message: `❌ Ошибка создания workflow: ${apiResponse.statusCode}`\n }\n }];\n}"},"id":"b4646fb4-426d-4f5d-8dfd-ed88867baec1","name":"Check Creation Success","type":"n8n-nodes-base.code","typeVersion":2,"position":[336,-128]},{"parameters":{"chatId":"1171589143","text":"={{ $json.message || $json.error || 'Неизвестная ошибка' }}","additionalFields":{}},"id":"4c8ecf81-50a2-4d9d-a147-8d1dcbcd0db2","name":"Send Telegram Response","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[576,-128],"webhookId":"95dce1e8-b429-41f6-8cfc-c2f481cbcbe9","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"1171589143","text":"={{ $json.error || 'Команда не распознана. Используйте: /create <описание workflow>' }}","additionalFields":{}},"id":"12dc1f44-3ac1-4719-af6b-11bf0fca65f8","name":"Send Error Response","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-160,80],"webhookId":"c3a9456e-8745-47fd-a6ce-2fff54c93d5c","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}}],"connections":{"Telegram Trigger":{"main":[[{"node":"Check /create Command","type":"main","index":0}]]},"Check /create Command":{"main":[[{"node":"If Success","type":"main","index":0}]]},"If Success":{"main":[[{"node":"Generate Workflow (AI)","type":"main","index":0},{"node":"Send Error Response","type":"main","index":0}]]},"Generate Workflow (AI)":{"main":[[{"node":"Create Workflow (API)","type":"main","index":0}]]},"Create Workflow (API)":{"main":[[{"node":"Check Creation Success","type":"main","index":0}]]},"Check Creation Success":{"main":[[{"node":"Send Telegram Response","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"7aea6e15-f4d6-4f2a-af9e-74b1dcdb7d20","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-10-23T11:46:12.459Z","createdAt":"2025-10-23T11:46:12.459Z","role":"workflow:owner","workflowId":"d02Xv9I3If0Qt4aj","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Telegram → AI Workflow Creator New.json b/backups/2025-12-27/Telegram → AI Workflow Creator New.json new file mode 100644 index 0000000..33739b2 --- /dev/null +++ b/backups/2025-12-27/Telegram → AI Workflow Creator New.json @@ -0,0 +1 @@ +{"updatedAt":"2025-10-23T11:54:34.689Z","createdAt":"2025-10-23T10:10:14.976Z","id":"yyXLAtVh1rd9lwEE","name":"Telegram → AI Workflow Creator New","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"id":"5bb9a6f2-57e6-4bf8-86bc-e383b063f9d8","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[0,0],"webhookId":"telegram-webhook","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"jsCode":"const inputData = $input.first() || {};\nconst message = inputData.json?.message || {};\nconst messageText = message.text || '';\nconst chatId = message.chat?.id || '';\nconst messageId = message.message_id || '';\n\nconst regex = /^\\/create\\s+(.+)/;\nconst match = messageText.match(regex);\n\nif (match) {\n return [{\n json: {\n description: match[1].trim(),\n chat_id: chatId,\n message_id: messageId\n }\n }];\n} else {\n return [{\n json: {\n error: 'Команда не распознана. Используйте /create <описание>',\n chat_id: chatId,\n message_id: messageId\n }\n }];\n}"},"id":"febf518b-beda-4202-b613-ea7f09285a81","name":"Check /create Command","type":"n8n-nodes-base.code","typeVersion":2,"position":[224,0]},{"parameters":{"jsCode":"const inputData = $input.first();\n\nreturn [{\n json: {\n description: inputData?.json?.description || '',\n chat_id: inputData?.json?.chat_id || '',\n message_id: inputData?.json?.message_id || ''\n }\n}];"},"id":"0a13c28d-bd75-4ea1-acf9-a123606d7162","name":"Extract Description","type":"n8n-nodes-base.code","typeVersion":2,"position":[448,0]},{"parameters":{"method":"POST","url":"https://api.openai.com/v1/chat/completions","authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"model","value":"gpt-4o-mini"},{"name":"messages","value":"=JSON.parse('[{\"role\": \"system\", \"content\": \"Ты эксперт по n8n. Генерируй ВАЛЬНЫЙ JSON для импорта воркфлоу n8n по описанию пользователя. Используй актуальную структуру n8n (версия 1.x). Включи: name, nodes[], connections{}. Каждый node должен иметь: id, name, type, typeVersion, position[], parameters{}. Соединяй ноды через connections. Верни ТОЛЬКО валидный JSON без объяснений.\"}, {\"role\": \"user\", \"content\": \"Создай n8n workflow JSON: {{ $json.description }}\"}]')"},{"name":"max_tokens","value":4000},{"name":"temperature","value":0.1}]},"options":{}},"id":"536068e0-b3ec-41d1-bd9f-c61902458683","name":"Generate Workflow (AI)","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[896,0],"credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"jsCode":"const response = $input.first().json;\nconst aiResponse = response.choices[0].message.content;\n\n// Парсим JSON из ответа AI\nlet workflowJson;\ntry {\n workflowJson = JSON.parse(aiResponse);\n} catch (error) {\n throw new Error('AI вернул невалидный JSON: ' + error.message);\n}\n\nreturn {\n ...$input.first().json,\n workflow: workflowJson,\n chat_id: $('Extract Description').first().json.chat_id,\n message_id: $('Extract Description').first().json.message_id\n};"},"id":"66f7f81f-5720-49ba-a1d5-62ebab96d1c8","name":"Parse Workflow JSON","type":"n8n-nodes-base.code","typeVersion":2,"position":[1120,0]},{"parameters":{"method":"POST","url":"=https://{{ $vars.N8N_HOST || 'your-n8n-instance.com' }}/api/v1/workflows","authentication":"predefinedCredentialType","nodeCredentialType":"n8nApi","sendBody":true,"bodyParameters":{"parameters":[{"name":"name","value":"={{ $json.workflow.name || 'New Workflow' }}"},{"name":"nodes","value":"=JSON.stringify($json.workflow.nodes)"},{"name":"connections","value":"=JSON.stringify($json.workflow.connections)"},{"name":"active","value":false}]},"options":{"response":{"response":{"fullResponse":true}}}},"id":"24511dfd-63d3-4dc3-9876-593b298bbe7f","name":"Create Workflow (API)","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1328,0],"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"jsCode":"const apiResponse = $input.first().json;\nconst workflowData = $('Parse Workflow JSON').first().json.workflow;\nconst baseData = $('Extract Description').first().json;\n\nif (apiResponse.id) {\n return {\n success: true,\n workflow_id: apiResponse.id,\n workflow_name: workflowData.name,\n chat_id: baseData.chat_id,\n message_id: baseData.message_id,\n workflow_json: workflowData\n };\n} else {\n return {\n success: false,\n error: 'Ошибка создания воркфлоу: ' + JSON.stringify(apiResponse),\n chat_id: baseData.chat_id,\n message_id: baseData.message_id\n };\n}"},"id":"b1ed22d5-b7c6-4409-b289-8c6abd659fe9","name":"Check Creation Success","type":"n8n-nodes-base.code","typeVersion":2,"position":[1552,0]},{"parameters":{"chatId":"1171589143","text":"идёт процесс","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[688,0],"id":"032afb7a-406a-4fbf-b62e-6c7958820abb","name":"Send a proccessing message","webhookId":"143ce306-be21-4f33-90e4-80110e839794","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"1171589143","text":"work done","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1776,0],"id":"061af2b7-a847-460e-85a1-2f039c01f6ae","name":"Send a success message","webhookId":"143ce306-be21-4f33-90e4-80110e839794","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}}],"connections":{"Telegram Trigger":{"main":[[{"node":"Check /create Command","type":"main","index":0}]]},"Check /create Command":{"main":[[{"node":"Extract Description","type":"main","index":0}]]},"Generate Workflow (AI)":{"main":[[{"node":"Parse Workflow JSON","type":"main","index":0}]]},"Parse Workflow JSON":{"main":[[{"node":"Create Workflow (API)","type":"main","index":0}]]},"Create Workflow (API)":{"main":[[{"node":"Check Creation Success","type":"main","index":0}]]},"Extract Description":{"main":[[{"node":"Send a proccessing message","type":"main","index":0}]]},"Send a proccessing message":{"main":[[{"node":"Generate Workflow (AI)","type":"main","index":0}]]},"Check Creation Success":{"main":[[{"node":"Send a success message","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"456ab5fa-01ef-4a73-b75d-8326d00810bf","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-10-23T10:10:14.976Z","createdAt":"2025-10-23T10:10:14.976Z","role":"workflow:owner","workflowId":"yyXLAtVh1rd9lwEE","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Telegram-n8n-Commander.json b/backups/2025-12-27/Telegram-n8n-Commander.json new file mode 100644 index 0000000..35b0b06 --- /dev/null +++ b/backups/2025-12-27/Telegram-n8n-Commander.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-29T20:43:06.821Z","createdAt":"2025-11-29T20:43:06.821Z","id":"Xe0lkIQfcKyw4YLB","name":"Telegram-n8n-Commander","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{"chatIds":"123456789","userIds":"123456789"}},"id":"e15d13ae-e02e-4294-b8a7-a75b2e61ae00","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[144,1104],"webhookId":"0eea20d1-fab3-416e-8f22-6f975f79650b","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"disabled":true},{"parameters":{"assignments":{"assignments":[{"id":"ce8eebdd-c313-4444-a1bd-dcde56619a0d","name":"command","type":"string","value":"={{\n $json.message.text\n .toLowerCase()\n .replace(/^\\//, '')\n .split(/ (.+)/)[0]\n || ''\n}}"},{"id":"834f7369-52f1-4df3-bfcb-754be0bb11e0","name":"arg1","type":"string","value":"={{\n $json.message.text\n .toLowerCase()\n .replace(/^\\//, '')\n .split(/ (.+)/)[1]\n || ''\n}}"}]},"options":{}},"id":"88c70f41-f8a1-4c06-a99d-6830911855a4","name":"Cmd Parse","type":"n8n-nodes-base.set","position":[368,1104],"typeVersion":3.4},{"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d5b702ed-dcaf-461a-a148-04b231d55617","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"start"}]},"renameOutput":true,"outputKey":"start"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e9ac521f-9416-4756-9f3c-9be5dd5a5ccb","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"help"}]},"renameOutput":true,"outputKey":"help"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"e20bdf17-2418-43ad-8b37-a4a5f4e46b2a","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"backup"}]},"renameOutput":true,"outputKey":"backup"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"b1dfbc98-aac0-483c-a386-79180e96d0bb","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"cleanup"}]},"renameOutput":true,"outputKey":"cleanup"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"2524d410-a971-4a1f-b8a1-c30d363c6be6","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"workflows"}]},"renameOutput":true,"outputKey":"workflows"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a27bd761-d2d6-4768-9449-ca5380db38ce","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"execute"}]},"renameOutput":true,"outputKey":"execute"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"593d46f5-40ce-468a-b834-c2376dca1684","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"activate"}]},"renameOutput":true,"outputKey":"activate"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"0ff85afd-02f8-42ad-b892-59b3dcf025a9","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"deactivate"}]},"renameOutput":true,"outputKey":"deactivate"},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f5dee847-2c55-427f-a1f9-3f038f19e30e","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $('Cmd Parse').item.json.command }}","rightValue":"executions"}]},"renameOutput":true,"outputKey":"executions"}]},"options":{"fallbackOutput":"extra","ignoreCase":true,"renameFallbackOutput":"Error"}},"id":"17f7f8cb-a76c-4f51-9ca9-9c92769db076","name":"Cmd Switch","type":"n8n-nodes-base.switch","position":[592,960],"executeOnce":false,"typeVersion":3.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d760c8fa-65bc-4ef5-a0b0-9bf1ef711db6","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $('Cmd Parse').item.json.arg1 }}","rightValue":"="}]},"options":{}},"id":"ede58bc3-556a-4714-855d-bf85c725986c","name":"Execute Arg","type":"n8n-nodes-base.if","position":[944,1120],"typeVersion":2.2},{"parameters":{"operation":"activate","workflowId":{"__rl":true,"mode":"id","value":"={{ $json.id }}"},"requestOptions":{}},"id":"f9ea88d9-46cf-4825-ae60-ef6f08c1fad0","name":"Activate Workflow","type":"n8n-nodes-base.n8n","position":[2544,1312],"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}},"onError":"continueErrorOutput"},{"parameters":{"operation":"deactivate","workflowId":{"__rl":true,"mode":"id","value":"={{ $json.id }}"},"requestOptions":{}},"id":"b2a535fe-af33-4261-ac4b-71f60aa988ee","name":"Deactivate Workflow","type":"n8n-nodes-base.n8n","position":[2544,1488],"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}},"onError":"continueErrorOutput"},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d760c8fa-65bc-4ef5-a0b0-9bf1ef711db6","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $('Cmd Parse').item.json.arg1 }}","rightValue":"="}]},"options":{}},"id":"40b4f841-41fa-4465-b319-82332f9d9ebf","name":"Activate Arg","type":"n8n-nodes-base.if","position":[944,1312],"typeVersion":2.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d760c8fa-65bc-4ef5-a0b0-9bf1ef711db6","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $('Cmd Parse').item.json.arg1 }}","rightValue":"="}]},"options":{}},"id":"5a7470bf-1551-4823-a70d-dfbfe156013d","name":"Deactivate Arg","type":"n8n-nodes-base.if","position":[944,1488],"typeVersion":2.2},{"parameters":{"chatId":"123456789","text":"=❌ This command requires an argument!","additionalFields":{"appendAttribution":false}},"id":"d4a60714-4b27-4076-a9c1-b76d88eb335a","name":"Arg Error","type":"n8n-nodes-base.telegram","position":[1248,1952],"webhookId":"d1b9cd05-5507-45aa-8ee8-5c19eccfc76d","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Invalid command!","additionalFields":{"appendAttribution":false}},"id":"1ebc0f40-64fa-4ff9-9c9c-7ceed1feff1a","name":"Cmd Error","type":"n8n-nodes-base.telegram","position":[944,1952],"webhookId":"033ee218-b4e1-420b-bf73-592029ba53a1","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=✅ Workflow executed.","additionalFields":{"appendAttribution":false}},"id":"750829e6-5021-495f-8b2d-9fb9bb012f71","name":"Executed","type":"n8n-nodes-base.telegram","position":[2848,1120],"webhookId":"93483e2c-71d5-4733-9572-b205551fff74","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=✅ Workflow activated.","additionalFields":{"appendAttribution":false}},"id":"20b70724-43df-4ff7-8b0a-0c683c5ca1c7","name":"Activated","type":"n8n-nodes-base.telegram","position":[2848,1312],"webhookId":"a26128ae-81be-4d1a-bf6d-bf38ef54816b","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=✅ Workflow deactivated.","additionalFields":{"appendAttribution":false}},"id":"96cfcb82-a1a0-4473-9c4d-f23266138816","name":"Deactivated","type":"n8n-nodes-base.telegram","position":[2848,1488],"webhookId":"51e51fa0-93b9-4c39-8896-f9d72df898e4","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Workflow name not found!","additionalFields":{"appendAttribution":false}},"id":"59d9baca-a112-47cb-80a9-1f8abe44de4c","name":"Workflow Name Error","type":"n8n-nodes-base.telegram","position":[2032,1952],"webhookId":"76b885b4-302a-4033-89f5-2e3b5c9f6f8c","executeOnce":true,"typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"filters":{},"requestOptions":{}},"id":"fd63b78c-d6d7-46b3-b7cf-c82b9ebe99d2","name":"List Workflows 1","type":"n8n-nodes-base.n8n","position":[1248,1120],"executeOnce":true,"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"filters":{},"requestOptions":{}},"id":"17b7f116-4fb7-4585-8911-bf87e8d8791d","name":"List Workflows 2","type":"n8n-nodes-base.n8n","position":[1248,1312],"executeOnce":true,"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"filters":{},"requestOptions":{}},"id":"1cf22b30-b7e3-4223-9795-2ef9fb9b95da","name":"List Workflows 3","type":"n8n-nodes-base.n8n","position":[1248,1488],"executeOnce":true,"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"43882ae1-cf25-46d2-9702-7035590b517c","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.active }}","rightValue":""}]},"options":{}},"id":"bef963e3-8a53-4854-959c-41b16d856ca2","name":"If Inactive","type":"n8n-nodes-base.if","position":[2032,1312],"typeVersion":2.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"43882ae1-cf25-46d2-9702-7035590b517c","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.active }}","rightValue":""}]},"options":{}},"id":"bd0da360-20dd-4a27-8a4a-ff37d222f260","name":"If Active","type":"n8n-nodes-base.if","position":[2032,1488],"typeVersion":2.2},{"parameters":{"chatId":"123456789","text":"=❌ Workflow is already active!","additionalFields":{"appendAttribution":false}},"id":"da278d02-7bec-4ff9-beb2-acd41b917602","name":"Workflow Active Error","type":"n8n-nodes-base.telegram","position":[2320,1952],"webhookId":"0d7e6070-983e-47c1-8713-39359d6a41db","executeOnce":true,"typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Workflow is already inactive!","additionalFields":{"appendAttribution":false}},"id":"434f70e7-490e-400e-ac3e-e863b0cc6dec","name":"Workflow Inactive Error","type":"n8n-nodes-base.telegram","position":[2320,2128],"webhookId":"be3c092d-c053-4d15-9c64-4f8bb38ddf5c","executeOnce":true,"typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"filters":{},"requestOptions":{}},"id":"1692f627-dffd-429c-ab09-7d42e9c367c5","name":"List Workflows ","type":"n8n-nodes-base.n8n","position":[944,944],"executeOnce":true,"typeVersion":1,"alwaysOutputData":true,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"chatId":"123456789","text":"=My commands are:\n\n\n➖ help\nList of commands.\n\n➖ cleanup\nDeletes all archived workflows.\n\n➖ backup\nBackup workflows and credentials.\n\n➖ workflows\nList all workflows.\n\n➖ execute \nExecute a workflow.\n\n➖ activate \nActivate a workflow.\n\n➖ deactivate \nDeactivate a workflow.\n\n➖ executions \nList last executions.\n\n\n💡 To execute a workflow, it must have a trigger node of type \"When Executed by Another Workflow\". To activate a workflow, it must have a trigger node that supports activation.","additionalFields":{"appendAttribution":false}},"id":"73da59b3-0321-43fc-9977-493261a63b28","name":"Help","type":"n8n-nodes-base.telegram","position":[944,384],"webhookId":"2f993ec0-a72e-4bf3-a5c0-8d31742d80e1","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"assignments":{"assignments":[{"id":"43a779d0-acf5-49d8-920a-590af435b7d1","name":"name","type":"string","value":"={{ $json.name }}"},{"id":"09a74ca9-26fe-490f-b4db-c9c40200e2a5","name":"active","type":"boolean","value":"={{ $json.active }}"}]},"options":{}},"id":"f58aabeb-d74d-48f3-9eb3-c0ab83766405","name":"Workflow List","type":"n8n-nodes-base.set","position":[1488,944],"typeVersion":3.4,"alwaysOutputData":true},{"parameters":{"chatId":"123456789","text":"={{ $json.msg }}","additionalFields":{"appendAttribution":false}},"id":"c2768407-003e-4465-a3aa-8ce64181cc6f","name":"Workflows","type":"n8n-nodes-base.telegram","position":[2848,944],"webhookId":"5ae7f6bf-d7b9-4f2a-8a99-2b93109779ff","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"18dab2ca-c722-4d2f-8d91-f24a12e28d91","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isEmpty() }}","rightValue":""}]},"options":{}},"id":"d068fd50-e479-4d7a-865a-99e998b739a6","name":"Workflow Found 1","type":"n8n-nodes-base.if","position":[1728,1120],"typeVersion":2.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"18dab2ca-c722-4d2f-8d91-f24a12e28d91","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isEmpty() }}","rightValue":""}]},"options":{}},"id":"281a78ce-a506-4491-ac81-55691db917d2","name":"Workflow Found 2","type":"n8n-nodes-base.if","position":[1728,1312],"typeVersion":2.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"18dab2ca-c722-4d2f-8d91-f24a12e28d91","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isEmpty() }}","rightValue":""}]},"options":{}},"id":"d1306b1e-3360-4858-bead-16e1080a770d","name":"Workflow Found 3","type":"n8n-nodes-base.if","position":[1728,1488],"typeVersion":2.2},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"075dd1e2-2580-4016-ba11-3b271049a718","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"eeac61a0-7732-4adc-86eb-6dd4f6d8a72c","name":"Not Archived","type":"n8n-nodes-base.filter","position":[1248,944],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"278fa2d1-3d8a-48b3-b898-0d81779bcb11","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.name.toLowerCase() }}","rightValue":"={{ $('Execute Arg').item.json.arg1 }}"},{"id":"83bc1669-a58f-45c9-a6f3-4d3a94d72fa5","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"fb176162-a724-4ff2-823f-e74ac44a8b9a","name":"Find Workflow 1","type":"n8n-nodes-base.filter","position":[1488,1120],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"278fa2d1-3d8a-48b3-b898-0d81779bcb11","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.name.toLowerCase() }}","rightValue":"={{ $('Activate Arg').item.json.arg1 }}"},{"id":"ca761ff5-d7ac-4c11-b844-c10d34062fc4","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"0b6a380b-e8a5-4623-87fa-42c5849e4e9e","name":"Find Workflow 2","type":"n8n-nodes-base.filter","position":[1488,1312],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"278fa2d1-3d8a-48b3-b898-0d81779bcb11","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.name.toLowerCase() }}","rightValue":"={{ $('Deactivate Arg').item.json.arg1 }}"},{"id":"6eec9d79-2ad2-40af-8baf-38ab772f6f0b","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"9fbf0880-87b7-40ce-9dd6-7c98d928f81e","name":"Find Workflow 3","type":"n8n-nodes-base.filter","position":[1488,1488],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d760c8fa-65bc-4ef5-a0b0-9bf1ef711db6","operator":{"type":"string","operation":"notEmpty","singleValue":true},"leftValue":"={{ $('Cmd Parse').item.json.arg1 }}","rightValue":"="}]},"options":{}},"id":"13e527d1-1e2c-4ad7-aa9b-7be8cce6faac","name":"Executions Arg","type":"n8n-nodes-base.if","position":[944,1664],"typeVersion":2.2},{"parameters":{"filters":{},"requestOptions":{}},"id":"af0b4296-d923-431e-a1a0-133dcb70eb54","name":"List Workflows 4","type":"n8n-nodes-base.n8n","position":[1248,1664],"executeOnce":true,"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"278fa2d1-3d8a-48b3-b898-0d81779bcb11","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.name.toLowerCase() }}","rightValue":"={{ $('Executions Arg').item.json.arg1 }}"},{"id":"6eec9d79-2ad2-40af-8baf-38ab772f6f0b","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"520db062-c43c-4be3-98b8-6abc8774016a","name":"Find Workflow 4","type":"n8n-nodes-base.filter","position":[1488,1664],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"18dab2ca-c722-4d2f-8d91-f24a12e28d91","operator":{"type":"boolean","operation":"false","singleValue":true},"leftValue":"={{ $json.isEmpty() }}","rightValue":""}]},"options":{}},"id":"3722ffb9-0baa-453f-8530-445777302578","name":"Workflow Found 4","type":"n8n-nodes-base.if","position":[1728,1664],"typeVersion":2.2},{"parameters":{"resource":"execution","limit":50,"filters":{"workflowId":{"__rl":true,"mode":"id","value":"={{ $json.id }}"}},"options":{},"requestOptions":{}},"id":"fbd80597-9558-4ac5-a380-a321ff9dc9aa","name":"List Workflow Executions","type":"n8n-nodes-base.n8n","position":[2032,1664],"executeOnce":true,"typeVersion":1,"alwaysOutputData":true,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"assignments":{"assignments":[{"id":"0ec10b59-a57e-4b6d-a13a-9d2674fb39b3","name":"id","type":"string","value":"={{ $json.id }}"},{"id":"18038ae8-3a18-4c6b-b97a-1f222bbe2547","name":"mode","type":"string","value":"={{ $json.mode }}"},{"id":"90484316-e73a-41ff-9cb0-dbdfeaf6da11","name":"started","type":"string","value":"={{ $json.startedAt?.toDateTime().toLocal().format(\"dd/MM/yyyy HH:mm\") }}"},{"id":"a56880cb-3c81-48fc-bd96-ec018e43ec5e","name":"workflow","type":"string","value":"={{ $('Workflow Found 4').item.json.name }}"},{"id":"d89a11d0-2abd-4fad-ba64-510e9d922158","name":"finished","type":"boolean","value":"={{ $json.finished }}"}]},"options":{}},"id":"90ee23bd-30c7-41af-981f-edb80a06bd6d","name":"Executions Fields","type":"n8n-nodes-base.set","position":[2320,1664],"typeVersion":3.4,"alwaysOutputData":true},{"parameters":{"chatId":"123456789","text":"={{ $json.msg }}","additionalFields":{"appendAttribution":false}},"id":"6db9fe93-ca72-429c-ad43-13504c333287","name":"Executions","type":"n8n-nodes-base.telegram","position":[2848,1664],"webhookId":"43b75945-8442-4e0a-b848-afae7a4d0d35","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"jsCode":"let msg = \"Executions:\\n\\n\"\nif ($input.first().json.id === null) {\n return {\n json: {\n msg: \"No executions.\"\n }\n }\n}\nfor (const item of $input.all()) {\n let status = item.json.finished ? '✅' : '❌'\n let mode = item.json.mode === 'manual' ? ' (manual)' : ''\n msg = msg + (status + \" \" + item.json.workflow + \" - \" + item.json.id + \" - \" + item.json.started + mode + \"\\n\")\n}\nreturn {\n json: {\n msg: msg\n }\n}"},"id":"80a6a8e1-2402-43ff-9a55-116a46cbec46","name":"Executions Message","type":"n8n-nodes-base.code","position":[2544,1664],"typeVersion":2},{"parameters":{"jsCode":"let msg = \"Workflows:\\n\\n\"\nif ($input.first().json.name === null) {\n return {\n json: {\n msg: \"No workflows.\"\n }\n }\n}\nfor (const item of $input.all()) {\n let status = item.json.active ? '🟢' : '⚫'\n msg = msg + (status + \" \" + item.json.name + \"\\n\")\n}\nreturn {\n json: {\n msg: msg\n }\n}"},"id":"46c75e15-fbf1-4af4-bb8d-b92def2d95ab","name":"Workflows Message","type":"n8n-nodes-base.code","position":[2544,944],"typeVersion":2},{"parameters":{"workflowId":{"__rl":true,"mode":"id","value":"={{ $json.id }}","cachedResultName":"={{ $json.id }}"},"workflowInputs":{"value":{},"schema":[],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":true},"options":{}},"id":"2cc8c70e-0ba4-452b-909f-0e6d2c5d9ebb","name":"Execute Workflow","type":"n8n-nodes-base.executeWorkflow","position":[2544,1120],"typeVersion":1.2,"onError":"continueErrorOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Workflow execution failed!","additionalFields":{"appendAttribution":false}},"id":"4c716ae2-1873-4117-96be-d9b43e29751e","name":"Execution Error","type":"n8n-nodes-base.telegram","position":[2848,2128],"webhookId":"8a5b39fb-80d6-474f-810a-7d3151647e8c","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Workflow activation failed!","additionalFields":{"appendAttribution":false}},"id":"f7765a15-87ae-4eda-a160-a58bfbe84528","name":"Activation Error","type":"n8n-nodes-base.telegram","position":[2848,2304],"webhookId":"b38649fe-98bf-4b71-80cd-e800952e95b2","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Workflow deactivation failed!","additionalFields":{"appendAttribution":false}},"id":"db8dbcaa-1f84-4884-89b8-7ae422b04a35","name":"Deactivation Error","type":"n8n-nodes-base.telegram","position":[2848,2480],"webhookId":"516b2616-387f-4059-881c-1f41fe8a54de","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"filters":{"activeWorkflows":false},"requestOptions":{}},"id":"5505fff0-ac02-4eed-9705-c9257a97c09f","name":"List Archived","type":"n8n-nodes-base.n8n","position":[944,768],"executeOnce":true,"typeVersion":1,"alwaysOutputData":true,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"075dd1e2-2580-4016-ba11-3b271049a718","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.isArchived }}","rightValue":""}]},"options":{}},"id":"728ac6ad-f4eb-4fc8-afcc-cf4675abc119","name":"Only Archived","type":"n8n-nodes-base.filter","position":[1248,768],"typeVersion":2.2,"alwaysOutputData":true},{"parameters":{"jsCode":"let msg = \"Archived Workflows Deleted:\\n\\n\"\nif ($('Archived List').first().json.name === null) {\n return {\n json: {\n msg: \"No archived workflows.\"\n }\n }\n}\nfor (const item of $('Archived List').all()) {\n msg = msg + (\"🗑\" + \" \" + item.json.name + \"\\n\")\n}\nreturn {\n json: {\n msg: msg\n }\n}"},"id":"6ed373f3-213d-443e-ade5-ef8d63bd0bcc","name":"Archived Message","type":"n8n-nodes-base.code","position":[2544,768],"typeVersion":2},{"parameters":{"chatId":"123456789","text":"={{ $('Archived Message').item.json.msg }}","additionalFields":{"appendAttribution":false}},"id":"4bef2fca-b427-4d37-8f07-8f3836b14d88","name":"Cleanup","type":"n8n-nodes-base.telegram","position":[2848,768],"webhookId":"a48ea4b2-39a4-44d5-be6f-97c0029d9f3b","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"assignments":{"assignments":[{"id":"c0da97ee-d423-48a7-8c79-58c43969a539","name":"name","type":"string","value":"={{ $json.name }}"},{"id":"cba865ac-9909-4a1a-a6ae-58958135920c","name":"id","type":"string","value":"={{ $json.id }}"}]},"options":{}},"id":"6d495662-dc3e-4436-8a25-253edf0c8e1b","name":"Archived List","type":"n8n-nodes-base.set","position":[1488,768],"typeVersion":3.4,"alwaysOutputData":true},{"parameters":{"operation":"delete","workflowId":{"__rl":true,"mode":"id","value":"={{ $('Archived List').item.json.id }}"},"requestOptions":{}},"id":"503bf272-cfea-439b-8bb2-6c2449889123","name":"Delete Archived","type":"n8n-nodes-base.n8n","position":[1728,768],"typeVersion":1,"alwaysOutputData":true,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}},"onError":"continueRegularOutput"},{"parameters":{"command":"n8n export:workflow --backup --output=/home/node/backup/workflows"},"id":"ffa28697-c911-4a1d-8683-036483fd29bf","name":"Backup Workflows","type":"n8n-nodes-base.executeCommand","position":[944,592],"typeVersion":1,"alwaysOutputData":false,"onError":"continueRegularOutput"},{"parameters":{"command":"n8n export:credentials --backup --decrypted --output=/home/node/backup/credentials"},"id":"bf994128-f304-4183-b605-7cdd184b488f","name":"Backup Credentials","type":"n8n-nodes-base.executeCommand","position":[1248,592],"typeVersion":1,"alwaysOutputData":false,"onError":"continueRegularOutput"},{"parameters":{"command":"tar -czf /home/node/backup.tar.gz -C /home/node/backup workflows credentials"},"id":"67ffcdd5-5217-4113-8669-bd3515950b3f","name":"Backup Tarball","type":"n8n-nodes-base.executeCommand","position":[1488,592],"typeVersion":1,"alwaysOutputData":false,"onError":"continueRegularOutput"},{"parameters":{"operation":"sendDocument","chatId":"123456789","binaryData":true,"additionalFields":{"fileName":"backup.tar.gz"}},"id":"76d7e61f-9ce9-4d59-9172-3677538961e4","name":"Backup","type":"n8n-nodes-base.telegram","position":[2848,592],"webhookId":"abecda49-24f5-4928-b98a-c4d850d0d2d6","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"command":"rm -rf /home/node/backup /home/node/backup.tar.gz"},"id":"09468bb4-18aa-45f0-aae9-8cc8890edbeb","name":"Cleanup Files","type":"n8n-nodes-base.executeCommand","position":[2848,432],"typeVersion":1,"onError":"continueRegularOutput"},{"parameters":{"fileSelector":"/home/node/backup.tar.gz","options":{}},"id":"74fb0e3b-0b99-44a2-ad67-51feb08c2998","name":"Read File","type":"n8n-nodes-base.readWriteFile","position":[2544,592],"typeVersion":1,"onError":"continueErrorOutput"},{"parameters":{"chatId":"123456789","text":"=❌ Backup failed!","additionalFields":{"appendAttribution":false}},"id":"67f15550-4c28-4799-9b19-72c6f201cdb8","name":"Backup Error","type":"n8n-nodes-base.telegram","position":[2848,1952],"webhookId":"4c62b914-7d68-4520-bd82-0d169d1d84fa","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"content":"# Telegram n8n Commander\nRemotely manage and operate your n8n instance from Telegram with powerful admin commands.\n\nThis workflow connects your n8n instance with a Telegram Bot, giving you remote control over key admin operations through simple chat commands.\n\n## Commands\n- List your workflows (**workflows**)\n\n- Execute a workflow (**execute** [name])\n\n- Activate/deactivate workflows (**activate** [name], **deactivate** [name])\n\n- List past executions (**executions** [name])\n\n- Permanently delete archived workflows (**cleanup**)\n\n- Create backups of all your workflows and credentials (**backup**)\n\n- Get help (**help**)\n\n- Get notified when a workflow fails and when n8n instance starts.\n\n## Notes\n- **execute**, **activate**, **deactivate**, and **executions** require the workflow name as argument.\n\n- To **execute** a workflow, it must have a trigger node of type \"When Executed by Another Workflow\".\n\n- To **activate** a workflow, it must have a trigger node that supports activation.\n\n- **backup** only works on self-hosted setups.\n\n- Your credentials will be decrypted in the backup file. Please take security precautions when using this file.\n\n- In each workflow that fails and you want to receive a warning, configure this workflow as Error Workflow in its settings.\n\n\n\n*(See the Setup note for instructions on how to set up this workflow.)*","height":940,"width":680},"id":"f18fe971-4c66-4700-93ec-99bfc1ef93d6","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,0],"typeVersion":1},{"parameters":{"content":"# Setup\nTo set up this workflow you will need credentials for your Telegram bot and for your n8n API. You will need to edit all Telegram Nodes and n8n Nodes.\n\n## Credentials\nFirst of all, let's create the necessary credentials.\nYou can see instructions on how to create credentials [here.](https://docs.n8n.io/credentials/)\n\n### n8n API\n- Go to your n8n settings, in the sidebar go to n8n API.\n- Click on the Create an API Key button. Then you must give the key a name and save it. Your key will only be displayed at this point; copy it for the next steps.\n- Now we can create a credential for the n8n nodes. Create a new n8n API credential and use the key we just created. You will need to configure your server address as well.\n\n### Telegram Bot\n- First you need to have a Telegram bot and its token.\n- In your Telegram application, start a conversation with @BotFather and send him the command /newbot, follow the steps and then he will create your bot and present your token.\n- You will also need your Telegram user's ChatID/UserID. This way we can protect this workflow so that it only responds to you on Telegram. You can use @userinfobot for this, see instructions [here.](https://bigone.zendesk.com/hc/en-us/articles/360008014894-How-to-get-the-Telegram-user-ID#:~:text=1.,The%20Number%20ID)\n- Now in your n8n create a Telegram API type credential using your bot's token.\n\n## Nodes\nNow you have what you need to configure the nodes for this workflow.\n\n### n8n Nodes\n\n\n\n\n\n\n\n\n\n\n\n\n\nEdit each of these nodes and in the \"Credentials to connect with\" field select your n8n credential.\n\n### Telegram Nodes\n\n\n\n\n\n\n\n\n\n\n\n\n\nEdit each of these nodes and in the \"Credentials to connect with\" field select your telegram credential.\nIn the \"Chat ID\", \"Restrict to Chat IDs\" or \"Restrict to User IDs\" fields, enter your ChatID.\n\n\n\n**Your workflow is ready! Activate it and interact with your bot on Telegram!**","height":1260,"width":680},"id":"e9bbfe4f-abac-477b-8d12-e45c831f21ab","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,1424],"typeVersion":1},{"parameters":{"chatId":"123456789","text":".","additionalFields":{}},"id":"adbf948d-cfe2-447b-89df-0fc04d70d445","name":"Telegram Nodes","type":"n8n-nodes-base.telegram","position":[48,2384],"webhookId":"5f1283bb-cd9f-4c4d-a062-0b7c939f855e","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"operation":"get","workflowId":{"__rl":true,"mode":"id","value":"1"},"requestOptions":{}},"id":"7e934333-986b-4f91-8e73-343f41dad69c","name":"n8n Nodes","type":"n8n-nodes-base.n8n","position":[48,2128],"typeVersion":1,"credentials":{"n8nApi":{"id":"LFyobxvAMNg8Kk5i","name":"n8n account"}}},{"parameters":{},"id":"21776303-7531-45fe-aac4-4e20ac60c952","name":"Error Trigger","type":"n8n-nodes-base.errorTrigger","position":[944,2304],"typeVersion":1},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"732da136-33e9-47fa-9729-65afd9670f4d","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.execution.mode }}","rightValue":"manual"}]},"options":{}},"id":"f1e5afe7-5ec0-4cb9-8c12-039992bd9520","name":"If not manual exec","type":"n8n-nodes-base.if","position":[1168,2304],"typeVersion":2.2},{"parameters":{"events":["init"]},"id":"ca7d3312-f3b2-4e7e-a346-8f9834f54938","name":"n8n Started Trigger","type":"n8n-nodes-base.n8nTrigger","position":[944,2480],"typeVersion":1,"disabled":true},{"parameters":{"chatId":"123456789","text":"=❌ Execution failed!\n{{ $now.format(\"dd/MM/yyyy HH:mm:ss\") }}\n\n\nWorkflow: \n{{ $json.workflow.name }}\n\nExecution Id:\n{{ $json.execution.id }}\n\nNode: \n{{ $json.execution.lastNodeExecuted }}\n\nError: \n{{ $json.execution.error.message }}","additionalFields":{"appendAttribution":false}},"id":"17ada4ce-294d-4efd-9628-9bbc8896c259","name":"Workflow Error Msg","type":"n8n-nodes-base.telegram","position":[1424,2304],"webhookId":"a2fee1cf-d8f5-4c51-aed4-9fa30e0251c5","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"},{"parameters":{"chatId":"123456789","text":"=❗ Instance started!\n{{ $now.format(\"dd/MM/yyyy HH:mm:ss\") }}","additionalFields":{"appendAttribution":false}},"id":"90e768c6-d0bc-4be6-aea1-ce805b1b65ee","name":"n8n Started Msg","type":"n8n-nodes-base.telegram","position":[1424,2480],"webhookId":"a2fee1cf-d8f5-4c51-aed4-9fa30e0251c5","typeVersion":1.2,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}},"onError":"continueRegularOutput"}],"connections":{"Cmd Parse":{"main":[[{"node":"Cmd Switch","type":"main","index":0}]]},"If Active":{"main":[[{"node":"Deactivate Workflow","type":"main","index":0}],[{"node":"Workflow Inactive Error","type":"main","index":0}]]},"Read File":{"main":[[{"node":"Backup","type":"main","index":0},{"node":"Cleanup Files","type":"main","index":0}],[{"node":"Backup Error","type":"main","index":0}]]},"Cmd Switch":{"main":[[{"node":"Help","type":"main","index":0}],[{"node":"Help","type":"main","index":0}],[{"node":"Backup Workflows","type":"main","index":0}],[{"node":"List Archived","type":"main","index":0}],[{"node":"List Workflows ","type":"main","index":0}],[{"node":"Execute Arg","type":"main","index":0}],[{"node":"Activate Arg","type":"main","index":0}],[{"node":"Deactivate Arg","type":"main","index":0}],[{"node":"Executions Arg","type":"main","index":0}],[{"node":"Cmd Error","type":"main","index":0}]]},"Execute Arg":{"main":[[{"node":"List Workflows 1","type":"main","index":0}],[{"node":"Arg Error","type":"main","index":0}]]},"If Inactive":{"main":[[{"node":"Activate Workflow","type":"main","index":0}],[{"node":"Workflow Active Error","type":"main","index":0}]]},"Activate Arg":{"main":[[{"node":"List Workflows 2","type":"main","index":0}],[{"node":"Arg Error","type":"main","index":0}]]},"Not Archived":{"main":[[{"node":"Workflow List","type":"main","index":0}]]},"Archived List":{"main":[[{"node":"Delete Archived","type":"main","index":0}]]},"Error Trigger":{"main":[[{"node":"If not manual exec","type":"main","index":0}]]},"List Archived":{"main":[[{"node":"Only Archived","type":"main","index":0}]]},"Only Archived":{"main":[[{"node":"Archived List","type":"main","index":0}]]},"Workflow List":{"main":[[{"node":"Workflows Message","type":"main","index":0}]]},"Backup Tarball":{"main":[[{"node":"Read File","type":"main","index":0}]]},"Deactivate Arg":{"main":[[{"node":"List Workflows 3","type":"main","index":0}],[{"node":"Arg Error","type":"main","index":0}]]},"Executions Arg":{"main":[[{"node":"List Workflows 4","type":"main","index":0}],[{"node":"Arg Error","type":"main","index":0}]]},"Delete Archived":{"main":[[{"node":"Archived Message","type":"main","index":0}]]},"Find Workflow 1":{"main":[[{"node":"Workflow Found 1","type":"main","index":0}]]},"Find Workflow 2":{"main":[[{"node":"Workflow Found 2","type":"main","index":0}]]},"Find Workflow 3":{"main":[[{"node":"Workflow Found 3","type":"main","index":0}]]},"Find Workflow 4":{"main":[[{"node":"Workflow Found 4","type":"main","index":0}]]},"List Workflows ":{"main":[[{"node":"Not Archived","type":"main","index":0}]]},"Archived Message":{"main":[[{"node":"Cleanup","type":"main","index":0}]]},"Backup Workflows":{"main":[[{"node":"Backup Credentials","type":"main","index":0}]]},"Execute Workflow":{"main":[[{"node":"Executed","type":"main","index":0}],[{"node":"Execution Error","type":"main","index":0}]]},"List Workflows 1":{"main":[[{"node":"Find Workflow 1","type":"main","index":0}]]},"List Workflows 2":{"main":[[{"node":"Find Workflow 2","type":"main","index":0}]]},"List Workflows 3":{"main":[[{"node":"Find Workflow 3","type":"main","index":0}]]},"List Workflows 4":{"main":[[{"node":"Find Workflow 4","type":"main","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Cmd Parse","type":"main","index":0}]]},"Workflow Found 1":{"main":[[{"node":"Execute Workflow","type":"main","index":0}],[{"node":"Workflow Name Error","type":"main","index":0}]]},"Workflow Found 2":{"main":[[{"node":"If Inactive","type":"main","index":0}],[{"node":"Workflow Name Error","type":"main","index":0}]]},"Workflow Found 3":{"main":[[{"node":"If Active","type":"main","index":0}],[{"node":"Workflow Name Error","type":"main","index":0}]]},"Workflow Found 4":{"main":[[{"node":"List Workflow Executions","type":"main","index":0}],[{"node":"Workflow Name Error","type":"main","index":0}]]},"Activate Workflow":{"main":[[{"node":"Activated","type":"main","index":0}],[{"node":"Activation Error","type":"main","index":0}]]},"Executions Fields":{"main":[[{"node":"Executions Message","type":"main","index":0}]]},"Workflows Message":{"main":[[{"node":"Workflows","type":"main","index":0}]]},"Backup Credentials":{"main":[[{"node":"Backup Tarball","type":"main","index":0}]]},"Executions Message":{"main":[[{"node":"Executions","type":"main","index":0}]]},"If not manual exec":{"main":[[{"node":"Workflow Error Msg","type":"main","index":0}]]},"Deactivate Workflow":{"main":[[{"node":"Deactivated","type":"main","index":0}],[{"node":"Deactivation Error","type":"main","index":0}]]},"n8n Started Trigger":{"main":[[{"node":"n8n Started Msg","type":"main","index":0}]]},"List Workflow Executions":{"main":[[{"node":"Executions Fields","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"c83a1668-233c-4458-9178-bb4840f68dd9","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-11-29T20:43:06.821Z","createdAt":"2025-11-29T20:43:06.821Z","role":"workflow:owner","workflowId":"Xe0lkIQfcKyw4YLB","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Traffic Forecast Dynamic.json b/backups/2025-12-27/Traffic Forecast Dynamic.json new file mode 100644 index 0000000..4cbb399 --- /dev/null +++ b/backups/2025-12-27/Traffic Forecast Dynamic.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-12T09:44:10.802Z","createdAt":"2025-12-12T09:43:57.181Z","id":"HeNuVT2DB61vKm6y","name":"Traffic Forecast Dynamic","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-592,-112],"id":"9bd9cd1c-102e-4aa8-8d6e-b69e5003931c","webhookId":"traffic-forecast-bot","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"resource":"file","fileId":"={{ $json.message.document.file_id }}","additionalFields":{}},"name":"Get File","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-368,-112],"id":"f4e44340-4096-4c3d-b043-855f418977e0","webhookId":"b572f623-3010-47da-b480-eae5ae111b38","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"options":{}},"name":"Parse File","type":"n8n-nodes-base.spreadsheetFile","typeVersion":2,"position":[-144,-112],"id":"80ae83b6-aa9a-48fb-b2ac-18826df7f7ad"},{"parameters":{"jsCode":"// --- НАСТРОЙКИ МОДЕЛИ ---\n// Alpha (0.1 - 0.9). Чем больше, тем быстрее прогноз реагирует на последние изменения.\n// 0.1 - очень плавный прогноз (учитывает долгую историю)\n// 0.8 - нервный прогноз (повторяет вчерашний день)\nconst ALPHA = 0.3; \n\n// --- ПОЛУЧЕНИЕ ДАННЫХ ---\nconst items = $input.all();\nif (items.length === 0) return [];\nconst inputData = items.map(item => item.json);\n\n// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---\nfunction parseCleanNumber(value) {\n if (typeof value === 'number') return value;\n if (!value) return 0;\n const cleanStr = String(value).replace(/\\s/g, '').replace(/,/g, '.');\n const parsed = parseFloat(cleanStr);\n return isNaN(parsed) ? 0 : parsed;\n}\n\nfunction getJsDateFromExcel(serial) {\n const utc_days = Math.floor(serial - 25569);\n const utc_value = utc_days * 86400; \n const date_info = new Date(utc_value * 1000);\n return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate());\n}\n\nfunction formatDate(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n// --- ШАГ 0: ПАРСИНГ И ПОДГОТОВКА ---\nconst keys = Object.keys(inputData[0]);\nconst dateKey = keys.find(k => /date|дата|день/i.test(k)) || keys[0];\nconst trafficKey = keys.find(k => /traffic|трафик|кол-во|value|факт/i.test(k)) || keys[1];\n\n// Преобразуем в удобный массив объектов\nlet parsedRows = inputData.map(row => {\n const rawTraffic = row[trafficKey];\n const rawDate = row[dateKey];\n const traffic = parseCleanNumber(rawTraffic);\n \n let date;\n if (typeof rawDate === 'number') date = getJsDateFromExcel(rawDate);\n else date = new Date(rawDate);\n\n return {\n dateObj: date,\n originalDate: rawDate,\n traffic: traffic,\n hasTraffic: traffic > 0 && !isNaN(traffic),\n isValidDate: !isNaN(date.getTime())\n };\n}).filter(r => r.isValidDate);\n\n// ВАЖНО: Сортируем по дате от прошлого к будущему\nparsedRows.sort((a, b) => a.dateObj - b.dateObj);\n\n// --- ШАГ 1: РАСЧЕТ СЕЗОННОСТИ (Глобальные паттерны) ---\n// Считаем коэффициенты дней недели и месяцев по всей доступной истории\nconst statsDay = {};\nconst statsMonth = {};\nlet globalSum = 0;\nlet globalCount = 0;\n\nparsedRows.forEach(row => {\n if (!row.hasTraffic) return;\n \n const d = row.dateObj.getDay();\n const m = row.dateObj.getMonth();\n \n globalSum += row.traffic;\n globalCount++;\n\n statsDay[d] = (statsDay[d] || {s:0, c:0});\n statsDay[d].s += row.traffic;\n statsDay[d].c++;\n\n statsMonth[m] = (statsMonth[m] || {s:0, c:0});\n statsMonth[m].s += row.traffic;\n statsMonth[m].c++;\n});\n\nconst globalAvg = globalCount > 0 ? globalSum / globalCount : 0;\n\n// Вычисляем коэффициенты (K)\nconst K_Day = {};\nconst K_Month = {};\n\nfor(let i=0; i<7; i++) {\n K_Day[i] = statsDay[i] ? (statsDay[i].s / statsDay[i].c) / globalAvg : 1.0;\n}\nfor(let i=0; i<12; i++) {\n K_Month[i] = statsMonth[i] ? (statsMonth[i].s / statsMonth[i].c) / globalAvg : 1.0;\n}\n\n// --- ШАГ 2: АДАПТИВНЫЙ ПРОГНОЗ (ЭКСПОНЕНЦИАЛЬНОЕ СГЛАЖИВАНИЕ) ---\n// Идем по времени и обновляем \"Уровень\" трафика (Level)\n\n// Начальный уровень берем как глобальное среднее (или среднее первых N дней)\nlet currentLevel = globalAvg;\n\nconst finalOutput = parsedRows.map(row => {\n const d = row.dateObj.getDay();\n const m = row.dateObj.getMonth();\n \n // 1. Рассчитываем сезонный коэффициент для текущей точки\n const seasonality = (K_Day[d] || 1) * (K_Month[m] || 1);\n \n // 2. Делаем прогноз НА СЕГОДНЯ, используя уровень ВЧЕРАШНЕГО дня\n // Forecast = Level * Seasonality\n let forecastVal = Math.round(currentLevel * seasonality);\n \n // 3. Если у нас есть ФАКТ (История), мы корректируем уровень (Обучаемся)\n if (row.hasTraffic) {\n // Очищаем факт от сезонности, чтобы получить \"чистый уровень\"\n const deseasonalizedActual = row.traffic / seasonality;\n \n // Обновляем уровень: \n // Новый уровень = (Alpha * Текущий факт) + ((1-Alpha) * Старый уровень)\n currentLevel = (ALPHA * deseasonalizedActual) + ((1 - ALPHA) * currentLevel);\n }\n \n // Формируем красивую дату\n const dateStr = formatDate(row.dateObj);\n\n return {\n json: {\n \"Дата\": dateStr,\n \"День недели\": row.dateObj.toLocaleDateString('ru-RU', { weekday: 'short' }),\n \"Исторический трафик (Факт)\": row.traffic || 0,\n \"Прогнозный трафик\": forecastVal\n }\n };\n});\n\nreturn finalOutput;"},"name":"Calculate Forecast","type":"n8n-nodes-base.code","typeVersion":2,"position":[80,-112],"id":"17bebbe3-a7bd-4bfb-894b-1d4080b69ba7"},{"parameters":{"operation":"toFile","fileFormat":"xlsx","options":{}},"name":"Create CSV","type":"n8n-nodes-base.spreadsheetFile","typeVersion":2,"position":[304,-112],"id":"a19692de-39db-4622-a15e-cc52f3f5f5e7"},{"parameters":{"operation":"sendDocument","chatId":"={{ $('Telegram Trigger').first().json.message.chat.id }}","binaryData":true,"additionalFields":{}},"name":"Send Result","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[528,-112],"id":"0804d9ba-d8bd-4986-b036-8fba1a95d151","webhookId":"b7e31308-df8c-44ee-9e89-87c4b1b585f7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}}],"connections":{"Telegram Trigger":{"main":[[{"node":"Get File","type":"main","index":0}]]},"Get File":{"main":[[{"node":"Parse File","type":"main","index":0}]]},"Parse File":{"main":[[{"node":"Calculate Forecast","type":"main","index":0}]]},"Calculate Forecast":{"main":[[{"node":"Create CSV","type":"main","index":0}]]},"Create CSV":{"main":[[{"node":"Send Result","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"be154c7b-ea55-4241-b0c8-6a3e6fc47d4f","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-12T09:43:57.181Z","createdAt":"2025-12-12T09:43:57.181Z","role":"workflow:owner","workflowId":"HeNuVT2DB61vKm6y","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Traffic Forecast via Telegram.json b/backups/2025-12-27/Traffic Forecast via Telegram.json new file mode 100644 index 0000000..715cf4e --- /dev/null +++ b/backups/2025-12-27/Traffic Forecast via Telegram.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-11T08:19:23.847Z","createdAt":"2025-12-11T07:26:21.150Z","id":"VCPJdSaOUiAvXjBI","name":"Traffic Forecast via Telegram","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-592,-96],"id":"8971e1d6-fca4-4f4e-8e1d-c7e38823f716","webhookId":"traffic-forecast-bot","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"resource":"file","fileId":"={{ $json.message.document.file_id }}","additionalFields":{}},"name":"Get File","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-368,-96],"id":"54455673-f9ca-4f5a-982e-b4f94d97aed7","webhookId":"b572f623-3010-47da-b480-eae5ae111b38","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"options":{}},"name":"Parse File","type":"n8n-nodes-base.spreadsheetFile","typeVersion":2,"position":[-160,-96],"id":"a7cf8415-5a2e-44d7-8211-ae63de825efd"},{"parameters":{"jsCode":"// --- ПОЛУЧЕНИЕ ДАННЫХ ---\nconst items = $input.all();\nconst inputData = items.map(item => item.json);\n\n// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---\nfunction parseCleanNumber(value) {\n if (typeof value === 'number') return value;\n if (!value) return 0;\n const cleanStr = String(value).replace(/\\s/g, '').replace(/,/g, '.');\n const parsed = parseFloat(cleanStr);\n return isNaN(parsed) ? 0 : parsed;\n}\n\nfunction getJsDateFromExcel(serial) {\n const utc_days = Math.floor(serial - 25569);\n const utc_value = utc_days * 86400; \n const date_info = new Date(utc_value * 1000);\n return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate());\n}\n\nfunction formatDate(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n// --- ШАГ 1: АНАЛИЗ СТАТИСТИКИ ---\n\nlet totalTrafficSum = 0;\nlet totalCount = 0;\n\nconst trafficByDay = {}; // Дни недели (0-6)\nconst trafficByMonth = {}; // Месяцы (0-11)\nconst trafficByYear = {}; // Годы (2022, 2023...) -> ЭТО НОВОЕ\n\nif (inputData.length === 0) return [];\nconst keys = Object.keys(inputData[0]);\nconst dateKey = keys.find(k => /date|дата|день/i.test(k)) || keys[0];\nconst trafficKey = keys.find(k => /traffic|трафик|кол-во|value/i.test(k)) || keys[1];\n\n// 1. Сбор данных\nfor (const row of inputData) {\n const rawTraffic = row[trafficKey];\n const rawDate = row[dateKey];\n const traffic = parseCleanNumber(rawTraffic);\n \n // Игнорируем нули, чтобы не портить среднее\n if (traffic === 0) continue;\n\n let date;\n if (typeof rawDate === 'number') date = getJsDateFromExcel(rawDate);\n else date = new Date(rawDate);\n \n if (isNaN(date.getTime())) continue;\n\n totalTrafficSum += traffic;\n totalCount++;\n\n const d = date.getDay();\n const m = date.getMonth();\n const y = date.getFullYear(); // Получаем год\n\n // Суммы по дням недели\n trafficByDay[d] = (trafficByDay[d] || {s:0, c:0});\n trafficByDay[d].s += traffic;\n trafficByDay[d].c++;\n\n // Суммы по месяцам\n trafficByMonth[m] = (trafficByMonth[m] || {s:0, c:0});\n trafficByMonth[m].s += traffic;\n trafficByMonth[m].c++;\n\n // Суммы по годам (Тренд)\n trafficByYear[y] = (trafficByYear[y] || {s:0, c:0});\n trafficByYear[y].s += traffic;\n trafficByYear[y].c++;\n}\n\nconst avgTotalTraffic = totalCount > 0 ? totalTrafficSum / totalCount : 0;\n\n// 2. Расчет коэффициентов\nconst coeffWeekday = {};\nconst coeffMonth = {};\nconst coeffYear = {}; // Коэффициент силы года\n\n// Дни недели\nfor (let i = 0; i < 7; i++) {\n const data = trafficByDay[i];\n coeffWeekday[i] = data ? (data.s / data.c) / avgTotalTraffic : 1.0;\n}\n// Месяцы\nfor (let i = 0; i < 12; i++) {\n const data = trafficByMonth[i];\n coeffMonth[i] = data ? (data.s / data.c) / avgTotalTraffic : 1.0;\n}\n// Годы (Новое!)\nfor (const y in trafficByYear) {\n const data = trafficByYear[y];\n // Если среднее за 2024 год = 300, а общее среднее = 200, то K_Year = 1.5\n coeffYear[y] = data ? (data.s / data.c) / avgTotalTraffic : 1.0;\n}\n\n// --- ШАГ 2: РАСЧЕТ ПРОГНОЗА ---\n\nconst finalOutput = inputData.map(row => {\n const rawDate = row[dateKey];\n const rawTraffic = row[trafficKey];\n \n let date;\n let formattedDate = rawDate;\n\n if (typeof rawDate === 'number') {\n date = getJsDateFromExcel(rawDate);\n formattedDate = formatDate(date);\n } else {\n date = new Date(rawDate);\n if (!isNaN(date.getTime())) formattedDate = formatDate(date);\n }\n\n let forecastValue = 0;\n\n if (date && !isNaN(date.getTime()) && avgTotalTraffic > 0) {\n const d = date.getDay();\n const m = date.getMonth();\n const y = date.getFullYear();\n \n const K_DN = coeffWeekday[d] || 1;\n const K_SEZ = coeffMonth[m] || 1;\n \n // Добавляем коэффициент года. \n // Если для этого года нет статистики (будущее), берем последний известный год или 1.0\n let K_YEAR = coeffYear[y];\n \n // Если год неизвестен (например, 2026, а статистики нет), берем коэф последнего года из данных\n if (!K_YEAR) {\n const knownYears = Object.keys(coeffYear).sort();\n const lastYear = knownYears[knownYears.length - 1];\n K_YEAR = coeffYear[lastYear] || 1.0;\n }\n \n // Новая формула\n forecastValue = Math.round(avgTotalTraffic * K_DN * K_SEZ * K_YEAR);\n }\n\n return {\n json: {\n \"Дата\": formattedDate,\n \"Исторический трафик (Факт)\": rawTraffic,\n \"Прогнозный трафик\": forecastValue\n }\n };\n});\n\nreturn finalOutput;"},"name":"Calculate Forecast","type":"n8n-nodes-base.code","typeVersion":2,"position":[64,-96],"id":"100a6bbb-fe43-4f65-a185-df835b3f90da"},{"parameters":{"operation":"toFile","fileFormat":"xlsx","options":{}},"name":"Create CSV","type":"n8n-nodes-base.spreadsheetFile","typeVersion":2,"position":[288,-96],"id":"f0bcaa19-0c67-49c4-bd16-ff5b44276049"},{"parameters":{"operation":"sendDocument","chatId":"={{ $('Telegram Trigger').first().json.message.chat.id }}","binaryData":true,"additionalFields":{}},"name":"Send Result","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[512,-96],"id":"1b4771a2-dd94-4053-88c2-04bd9e12cbad","webhookId":"b7e31308-df8c-44ee-9e89-87c4b1b585f7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"jsCode":"// --- ПОЛУЧЕНИЕ ДАННЫХ ---\nconst items = $input.all();\nconst inputData = items.map(item => item.json);\n\n// --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---\n\nfunction parseCleanNumber(value) {\n if (typeof value === 'number') return value;\n if (!value) return 0;\n // Удаляем пробелы и меняем запятую на точку\n const cleanStr = String(value).replace(/\\s/g, '').replace(/,/g, '.');\n const parsed = parseFloat(cleanStr);\n return isNaN(parsed) ? 0 : parsed;\n}\n\n// Конвертация Excel-даты (44562 -> Date)\nfunction getJsDateFromExcel(serial) {\n const utc_days = Math.floor(serial - 25569);\n const utc_value = utc_days * 86400; \n const date_info = new Date(utc_value * 1000);\n return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate());\n}\n\n// Красивый вывод даты YYYY-MM-DD\nfunction formatDate(date) {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n// --- ШАГ 1: АНАЛИЗ ДАННЫХ И РАСЧЕТ КОЭФФИЦИЕНТОВ ---\n// Нам нужно сначала пройтись по всем данным, чтобы понять \"норму\" (среднее, сезонность)\n\nlet totalTrafficSum = 0;\nlet totalCount = 0;\nconst trafficByDay = {}; // Статистика по дням недели\nconst trafficByMonth = {}; // Статистика по месяцам\n\n// Находим названия колонок один раз\nif (inputData.length === 0) return [];\nconst keys = Object.keys(inputData[0]);\n// Ищем колонку даты (содержит date, дата, день) и трафика\nconst dateKey = keys.find(k => /date|дата|день/i.test(k)) || keys[0];\nconst trafficKey = keys.find(k => /traffic|трафик|кол-во|value/i.test(k)) || keys[1];\n\n// Первый проход: Считаем суммы\nfor (const row of inputData) {\n const rawTraffic = row[trafficKey];\n const rawDate = row[dateKey];\n\n const traffic = parseCleanNumber(rawTraffic);\n \n // Если трафика нет (0 или пусто), мы НЕ учитываем это в расчете среднего,\n // иначе прогноз занизится.\n if (traffic === 0) continue;\n\n let date;\n if (typeof rawDate === 'number') date = getJsDateFromExcel(rawDate);\n else date = new Date(rawDate);\n \n if (isNaN(date.getTime())) continue;\n\n totalTrafficSum += traffic;\n totalCount++;\n\n const d = date.getDay();\n const m = date.getMonth();\n\n trafficByDay[d] = (trafficByDay[d] || {s:0, c:0});\n trafficByDay[d].s += traffic;\n trafficByDay[d].c++;\n\n trafficByMonth[m] = (trafficByMonth[m] || {s:0, c:0});\n trafficByMonth[m].s += traffic;\n trafficByMonth[m].c++;\n}\n\n// Если данных нет, возвращаем как есть\nconst avgTotalTraffic = totalCount > 0 ? totalTrafficSum / totalCount : 0;\n\n// Расчет коэффициентов\nconst coeffWeekday = {};\nconst coeffMonth = {};\n\nfor (let i = 0; i < 7; i++) {\n const data = trafficByDay[i];\n // Если данных по этому дню нет, коэффициент = 1\n coeffWeekday[i] = data ? (data.s / data.c) / avgTotalTraffic : 1.0;\n}\nfor (let i = 0; i < 12; i++) {\n const data = trafficByMonth[i];\n coeffMonth[i] = data ? (data.s / data.c) / avgTotalTraffic : 1.0;\n}\n\n// --- ШАГ 2: ЗАПОЛНЕНИЕ КОЛОНКИ ПРОГНОЗ ---\n// Теперь идем по тем же строкам и дописываем прогноз\n\nconst finalOutput = inputData.map(row => {\n const rawDate = row[dateKey];\n const rawTraffic = row[trafficKey];\n const factTraffic = parseCleanNumber(rawTraffic); // Факт может быть 0\n\n let date;\n let formattedDate = rawDate; // По умолчанию оставляем как было\n\n // Нормализуем дату для расчета\n if (typeof rawDate === 'number') {\n date = getJsDateFromExcel(rawDate);\n formattedDate = formatDate(date);\n } else {\n date = new Date(rawDate);\n if (!isNaN(date.getTime())) {\n formattedDate = formatDate(date);\n }\n }\n\n let forecastValue = 0;\n\n // Если дата валидная, считаем прогноз\n if (date && !isNaN(date.getTime()) && avgTotalTraffic > 0) {\n const d = date.getDay();\n const m = date.getMonth();\n \n const K_DN = coeffWeekday[d];\n const K_SEZ = coeffMonth[m];\n \n forecastValue = Math.round(avgTotalTraffic * K_DN * K_SEZ);\n }\n\n // Возвращаем объект в нужном порядке\n return {\n json: {\n \"Дата\": formattedDate,\n \"Исторический трафик (Факт)\": rawTraffic, // Оставляем оригинальное значение\n \"Прогнозный трафик\": forecastValue\n }\n };\n});\n\nreturn finalOutput;"},"name":"Calculate Forecast1","type":"n8n-nodes-base.code","typeVersion":2,"position":[64,80],"id":"26c95bbe-ef72-4331-ae6e-70dfe4fcc86e","disabled":true}],"connections":{"Telegram Trigger":{"main":[[{"node":"Get File","type":"main","index":0}]]},"Get File":{"main":[[{"node":"Parse File","type":"main","index":0}]]},"Parse File":{"main":[[{"node":"Calculate Forecast","type":"main","index":0}]]},"Calculate Forecast":{"main":[[{"node":"Create CSV","type":"main","index":0}]]},"Create CSV":{"main":[[{"node":"Send Result","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"4b8d3db7-ff4d-44c7-91f9-dab154b2dae2","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-11T07:26:21.150Z","createdAt":"2025-12-11T07:26:21.150Z","role":"workflow:owner","workflowId":"VCPJdSaOUiAvXjBI","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/Webflow_Lead_Slack_Airtable.json b/backups/2025-12-27/Webflow_Lead_Slack_Airtable.json new file mode 100644 index 0000000..136b8c4 --- /dev/null +++ b/backups/2025-12-27/Webflow_Lead_Slack_Airtable.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-11T07:09:10.104Z","createdAt":"2025-12-11T07:09:10.104Z","id":"gxObHp6a909HAR7n","name":"Webflow_Lead_Slack_Airtable","active":false,"isArchived":false,"nodes":[{"parameters":{"path":"c646a064-5ba1-425d-8b8a-9817a9c2ebce","options":{}},"name":"Webhook","type":"n8n-nodes-base.webhook","position":[0,0],"typeVersion":2,"id":"3d5e69fa-3b24-4473-b0c6-3ff97f184b98","webhookId":"c646a064-5ba1-425d-8b8a-9817a9c2ebce"},{"parameters":{"url":"https://company.clearbit.com/v2/companies/find","options":{}},"name":"Clearbit Enrichment","type":"n8n-nodes-base.httpRequest","position":[208,0],"typeVersion":2,"id":"25f17850-b893-4a40-be0f-f61dc218f3da"},{"parameters":{},"name":"Airtable","type":"n8n-nodes-base.airtable","position":[400,0],"typeVersion":4,"id":"f03e3c72-21d0-4508-bf45-76049e97ed35","credentials":{}},{"parameters":{},"name":"Slack Alerts","type":"n8n-nodes-base.slack","position":[608,0],"typeVersion":4,"id":"33be5d0e-17b4-4462-b76d-85d22db89fef","credentials":{}}],"connections":{"Webhook":{"main":[[{"node":"Clearbit Enrichment","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":null,"pinData":{},"versionId":"34b1e410-55a1-4039-8b4b-1abf120312db","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-11T07:09:10.104Z","createdAt":"2025-12-11T07:09:10.104Z","role":"workflow:owner","workflowId":"gxObHp6a909HAR7n","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/[DIET BOT] админ-панель.json b/backups/2025-12-27/[DIET BOT] админ-панель.json new file mode 100644 index 0000000..e04e2f5 --- /dev/null +++ b/backups/2025-12-27/[DIET BOT] админ-панель.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-01T10:09:37.037Z","createdAt":"2025-12-01T05:41:17.010Z","id":"odr6t7aUXIvLK7WT","name":"[DIET BOT] админ-панель","active":false,"isArchived":false,"nodes":[{"parameters":{"updates":["message"],"additionalFields":{}},"id":"52e32e3a-8fe2-4562-ade4-39e2eac546b5","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1.1,"position":[-1040,-880],"webhookId":"telegram-webhook","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":1},"conditions":[{"leftValue":"={{ $json.message.text }}","rightValue":"/admin замени_на_свой_токен","operator":{"type":"string","operation":"regex"},"id":"24222da3-3ac8-44ea-bfc9-a99eeaf72230"}],"combinator":"and"},"options":{}},"id":"42104fb7-1a41-4d48-89d5-e0522b6c58b0","name":"Ты админ?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-816,-880]},{"parameters":{"chatId":"={{ $json.message.chat.id }}","text":"❌ Доступ запрещён. Неверная команда.","additionalFields":{}},"id":"db5f2dae-0cb5-4d7d-bdf9-6579eac3ed6b","name":"Нет доступа","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-608,-960],"webhookId":"9c6c0d0e-d6e9-4a24-ac14-7ad31d533daf","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.message.chat.id }}","text":"*🍎 Админ-панель: Правильное питание и диета*\n\nВыберите действие:","additionalFields":{}},"id":"6fe629bf-c269-45a9-ac64-09bb888fd7d8","name":"Главное меню","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-608,-800],"webhookId":"add2c247-811b-4a5e-878a-b975f301b779","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"updates":["callback_query"],"additionalFields":{}},"id":"f7617f76-51d7-4038-94a5-5adb10beb2a9","name":"Callback Trigger","type":"n8n-nodes-base.telegramTrigger","typeVersion":1.1,"position":[-1024,-48],"webhookId":"telegram-callback-webhook","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"conditions":{"options":{"caseSensitive":true},"conditions":[{"leftValue":"={{ $json.callback_query.data }}","rightValue":"^admin_|^promo|^stats|^broadcast","operator":{"type":"string","operation":"regex"}}]},"options":{}},"id":"1dd136c2-97c6-4037-9ec9-ea7ddf1fb3a9","name":"Админ callback?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-736,-48]},{"parameters":{"chatId":"={{ $json.callback_query.message.chat.id }}","text":"❌ Сессия истекла. Войдите заново: /admin токен","additionalFields":{}},"id":"c52b7b1b-ab9d-4948-a270-235680b4d67d","name":"Callback нет доступа","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-608,-528],"webhookId":"f9540840-0302-4efd-9035-21f41b238958","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{},"id":"4d1c876c-4426-4661-b7fa-054104f4e1f3","name":"Получить статистику","type":"n8n-nodes-base.postgres","typeVersion":1.2,"position":[-800,176]},{"parameters":{"jsCode":"// Форматируем статистику\nconst [total, active, revenue] = $input.all();\nconst totalUsers = total[0].json[0].total;\nconst activeUsers = active[0].json[0].active;\nconst totalRevenue = revenue[0].json[0].revenue;\n\nconst text = `*📊 Статистика на ${new Date().toLocaleDateString('ru-RU')}*\n\n👥 Всего пользователей: *${totalUsers}*\n💎 Активных: *${activeUsers}*\n💰 Доход: *${totalRevenue} ₽*`;\n\nreturn [{\n json: {\n text,\n chatId: $json.callback_query.message.chat.id,\n messageId: $json.callback_query.message.message_id\n }\n}];"},"id":"7b84c3ea-e5ef-4b90-82a8-856816fafe15","name":"Формат статистики","type":"n8n-nodes-base.code","typeVersion":2,"position":[-192,-304]},{"parameters":{"chatId":"={{ $json.chatId }}","text":"={{ $json.text }}","additionalFields":{}},"id":"efe72899-27c3-480a-8890-366358b9810a","name":"Отправить статистику","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,-304],"webhookId":"d68178d7-3881-49f0-bdce-e0dfc3500862","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{},"id":"c62bd7be-779a-4633-aa38-5c2a6aeb8d04","name":"Получить пользователей","type":"n8n-nodes-base.postgres","typeVersion":1.2,"position":[-816,-640]},{"parameters":{"jsCode":"// Форматируем список пользователей\nconst users = $input.all()[0].json;\nconst page = $json.callback_query.data.split('_')[2];\n\nlet text = `*👥 Список пользователей (страница ${page})*\n\n`;\n\nfor (const u of users) {\n const status = u.lifetime ? '🛡️ Вечная' : (new Date(u.subscription_until) > new Date() ? `📅 До ${new Date(u.subscription_until).toLocaleDateString('ru-RU')}` : '❌ Нет');\n text += `👤 ${u.first_name || 'N/A'} (@${u.username || 'без юзернейма'})\\n` +\n `ID: \\`${u.user_id}\\` | ${status}\\n\\n`;\n}\n\nreturn [{\n json: {\n text,\n page: page,\n chatId: $json.callback_query.message.chat.id,\n messageId: $json.callback_query.message.message_id\n }\n}];"},"id":"307d58d2-e49f-4acd-bcd0-89ccb79becab","name":"Формат пользователей","type":"n8n-nodes-base.code","typeVersion":2,"position":[-192,-480]},{"parameters":{"chatId":"={{ $json.chatId }}","text":"={{ $json.text }}","additionalFields":{}},"id":"8347dcc8-0222-4618-bb55-71c36599fac9","name":"Отправить список пользователей","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,-480],"webhookId":"e3989bfd-47dd-47db-9064-299a91ae5998","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.callback_query.message.chat.id }}","text":"*🎟️ Создать промокод*\n\nОтправьте в формате: /promo КОД_ПРОМО ДНИ [ИСПОЛЬЗОВАНИЙ]\nПример: /promo DIET30 30 100\n(Если использований не указано — без лимита)","additionalFields":{}},"id":"2226d9d6-d368-4f65-93af-af5cbbda41fa","name":"Запрос промокода","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,16],"webhookId":"5d1bd976-b72b-4b70-9215-d0da80a9730c","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"conditions":{"conditions":[{"leftValue":"={{ $json.message.text }}","rightValue":"^/promo ","operator":{"type":"string","operation":"regex"}}]},"options":{}},"id":"a51c8f73-77fe-4dda-8bc0-8f83855cc5d5","name":"Это промокод?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-512,304]},{"parameters":{"jsCode":"// Парсим команду промо\nconst msg = $json.message.text;\nconst parts = msg.split(' ');\n\nif (parts.length < 3) {\n return [];\n}\n\nconst code = parts[1].toUpperCase();\nconst days = parseInt(parts[2]);\nconst uses = parts[3] ? parseInt(parts[3]) : 999;\n\nreturn [{\n json: {\n code,\n days,\n uses,\n chatId: $json.message.chat.id\n }\n}];"},"id":"b4bc34a8-0efe-4af8-a113-67b2f5e760eb","name":"Парсинг промо","type":"n8n-nodes-base.code","typeVersion":2,"position":[-192,176]},{"parameters":{},"id":"bb9ec702-364c-4eb9-b74e-8b30ad844324","name":"Создать промо в БД","type":"n8n-nodes-base.postgres","typeVersion":1.2,"position":[48,320]},{"parameters":{"chatId":"={{ $json.chatId }}","text":"*✅ Промокод создан!*\n\nКод: `{{ $json.code }}`\nДней: {{ $json.days }}\nИспользований: {{ $json.uses === 999 ? 'без лимита' : $json.uses }}\n\nВернуться в меню: /admin токен","additionalFields":{}},"id":"1e865397-5249-4426-9ab3-9d412544f275","name":"Промо готов","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,320],"webhookId":"5e14e03b-9e99-4448-87e9-6367fc21e6dc","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.message.chat.id }}","text":"❌ Неверный формат. Используйте /promo КОД ДНИ [USES]","additionalFields":{}},"id":"aa84eea8-37db-4607-9eda-ce2b67b59f31","name":"Ошибка промо","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-192,496],"webhookId":"ce6276fa-ebb4-4856-ab69-33587b0f36a7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.callback_query.message.chat.id }}","text":"*📤 Рассылка*\n\nОтправьте сообщение (текст/фото/видео). Я разошлю всем (или платным).","additionalFields":{}},"id":"7ed1ef27-4b0a-4e94-886e-f5fc2ce5f1be","name":"Запрос рассылки","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,-144],"webhookId":"72aaa8e9-c11e-46e5-a9fe-4a2542a60003","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"options":{}},"id":"55e10e34-9d79-49d2-9e9f-8e0a067432a7","name":"Установить цель рассылки","type":"n8n-nodes-base.set","typeVersion":3,"position":[-192,-144]},{"parameters":{"jsCode":"const target = $json.target;\nlet query = \"SELECT user_id FROM users\";\n\nif (target === 'paid') {\n query = \"SELECT user_id FROM users WHERE subscription_until > CURRENT_TIMESTAMP OR lifetime = true\";\n}\n\nreturn [{\n json: {\n query,\n target\n }\n}];"},"id":"58b15264-5727-4e67-86f8-5208e85123dc","name":"Генерировать запрос","type":"n8n-nodes-base.code","typeVersion":2,"position":[48,496]},{"parameters":{},"id":"32479cc2-2b18-4145-918c-adaa3ff175a5","name":"Список для рассылки","type":"n8n-nodes-base.postgres","typeVersion":1.2,"position":[288,496]},{"parameters":{"jsCode":"// Упрощённая версия рассылки\nconst users = $input.all()[0].json;\nconst total = users.length;\n\nreturn [{\n json: {\n sent: total,\n total: total,\n target: $json.target,\n chatId: $json.chatId\n }\n}];"},"id":"ca939354-edf6-44e9-9585-5c93d136fbc0","name":"Выполнить рассылку","type":"n8n-nodes-base.code","typeVersion":2,"position":[512,496]},{"parameters":{"chatId":"={{ $json.chatId }}","text":"*📤 Рассылка завершена*\n\nОтправлено: {{ $json.sent }}/{{ $json.total }} пользователям\nЦель: {{ $json.target === 'paid' ? 'платным' : 'всем' }}","additionalFields":{}},"id":"a76e3fcb-a758-4e80-9853-e7f8f0ecd5f6","name":"Результат рассылки","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[736,496],"webhookId":"24255f61-1ddf-4c82-9cd9-3a088f65443d","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $json.callback_query.message.chat.id }}","text":"*🔙 Главное меню*","additionalFields":{}},"id":"0357df3a-eb06-4969-9cd0-4442c0cbab75","name":"Назад в меню","type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[288,-656],"webhookId":"bf61f4a5-1b82-4b63-bedf-e566c1f7c81f","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"conditions":{"conditions":[{"leftValue":"={{ $json.callback_query.data }}","rightValue":"admin_main","operator":{"type":"string","operation":"equals"}}]},"options":{}},"id":"0b6128df-8675-4949-bd47-858bc3ca459a","name":"Назад в меню?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-192,-640]},{"parameters":{"conditions":{"conditions":[{"leftValue":"={{ $json.callback_query.data }}","rightValue":"promo_new","operator":{"type":"string","operation":"equals"}}]},"options":{}},"id":"d1e8af0f-ea70-4bc0-90da-f715081e9e25","name":"Новый промокод?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-192,32]},{"parameters":{"conditions":{"conditions":[{"leftValue":"={{ $json.callback_query.data }}","rightValue":"broadcast","operator":{"type":"string","operation":"contains"}}]},"options":{}},"id":"104e3ddb-cc57-491f-82c8-fc55e832ef69","name":"Рассылка?","type":"n8n-nodes-base.if","typeVersion":2,"position":[-192,320]}],"connections":{"Telegram Trigger":{"main":[[{"node":"Ты админ?","type":"main","index":0}]]},"Ты админ?":{"main":[[{"node":"Нет доступа","type":"main","index":0}],[{"node":"Главное меню","type":"main","index":0}]]},"Callback Trigger":{"main":[[{"node":"Админ callback?","type":"main","index":0}]]},"Админ callback?":{"main":[[{"node":"Callback нет доступа","type":"main","index":0}],[{"node":"Назад в меню?","type":"main","index":0},{"node":"Новый промокод?","type":"main","index":0},{"node":"Рассылка?","type":"main","index":0}]]},"Формат статистики":{"main":[[{"node":"Отправить статистику","type":"main","index":0}]]},"Формат пользователей":{"main":[[{"node":"Отправить список пользователей","type":"main","index":0}]]},"Назад в меню?":{"main":[[{"node":"Назад в меню","type":"main","index":0}]]},"Новый промокод?":{"main":[[{"node":"Запрос промокода","type":"main","index":0}]]},"Рассылка?":{"main":[[{"node":"Установить цель рассылки","type":"main","index":0}]]},"Установить цель рассылки":{"main":[[{"node":"Запрос рассылки","type":"main","index":0}]]},"Это промокод?":{"main":[[{"node":"Парсинг промо","type":"main","index":0}],[{"node":"Ошибка промо","type":"main","index":0}]]},"Выполнить рассылку":{"main":[[{"node":"Результат рассылки","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"e5f73d48-c1b8-4f7e-a8f0-b755c2176ad2","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-01T05:41:17.010Z","createdAt":"2025-12-01T05:41:17.010Z","role":"workflow:owner","workflowId":"odr6t7aUXIvLK7WT","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/assist.json b/backups/2025-12-27/assist.json new file mode 100644 index 0000000..89a832d --- /dev/null +++ b/backups/2025-12-27/assist.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-03T08:30:08.133Z","createdAt":"2025-11-29T20:12:24.570Z","id":"59fKEtwJ3Bj0wfyl","name":"assist","active":false,"isArchived":false,"nodes":[{"parameters":{"operation":"getAll","calendar":{"__rl":true,"value":"=lamerrrrok@gmail.com","mode":"id"},"limit":500,"options":{"timeMin":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}","timeMax":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}","fields":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Fields', ``, 'string') }}"}},"id":"75ab6a9b-2421-4279-9ed7-218981319e77","name":"Google Calendar","type":"n8n-nodes-base.googleCalendarTool","position":[3904,96],"typeVersion":1.1,"credentials":{"googleCalendarOAuth2Api":{"id":"pelU7b447VS9d9Cc","name":"Google Calendar account"}}},{"parameters":{"sessionIdType":"customKey","sessionKey":"={{ $('Listen for incoming events').first().json.message.from.id }}"},"id":"87068f41-26d6-479a-b049-87d6b04419bf","name":"Window Buffer Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[2688,96],"typeVersion":1.2},{"parameters":{"operation":"getAll","limit":20,"filters":{"labelIds":["INBOX"],"readStatus":"unread","receivedAfter":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Received_After', ``, 'string') }}","receivedBefore":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Received_Before', ``, 'string') }}"}},"id":"6a7124df-4122-461d-bfc0-4f2439073122","name":"Get Email","type":"n8n-nodes-base.gmailTool","position":[3472,96],"webhookId":"a4ae7b5d-7686-4bee-a753-848932860b4e","typeVersion":2.1,"credentials":{"gmailOAuth2":{"id":"mMAw1rTaQW76ponL","name":"Gmail account"}}},{"parameters":{"updates":["message"],"additionalFields":{}},"id":"3d0d55ec-3518-414b-8f25-f94befadae75","name":"Listen for incoming events","type":"n8n-nodes-base.telegramTrigger","position":[1552,-272],"webhookId":"322dce18-f93e-4f86-b9b1-3305519b7834","typeVersion":1,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"chatId":"={{ $('Listen for incoming events').first().json.message.from.id }}","text":"={{ $json.output }}","additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"id":"88a69a7b-b5be-4a1a-8a07-5103777ef4a8","name":"Telegram","type":"n8n-nodes-base.telegram","position":[3360,-288],"webhookId":"2c133a40-af48-4106-bc1a-be6047840a89","typeVersion":1.1,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"onError":"continueErrorOutput"},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a0bf9719-4272-46f6-ab3b-eda6f7b44fd8","operator":{"type":"string","operation":"empty","singleValue":true},"leftValue":"={{ $json.message.text }}","rightValue":""}]},"options":{}},"id":"6e79dc16-0010-4195-887b-eae299e2471b","name":"If","type":"n8n-nodes-base.if","position":[2000,-272],"typeVersion":2.2},{"parameters":{"fields":{"values":[{"name":"text","stringValue":"={{ $json?.message?.text || \"\" }}"}]},"options":{}},"id":"619eb872-6718-468a-9468-0df700a4a71f","name":"Voice or Text","type":"n8n-nodes-base.set","position":[1776,-272],"typeVersion":3.2},{"parameters":{"resource":"file","fileId":"={{ $('Listen for incoming events').item.json.message.voice.file_id }}","additionalFields":{}},"id":"bae594e9-028e-4732-907b-c79b1d5c2174","name":"Get Voice File","type":"n8n-nodes-base.telegram","position":[2224,-352],"webhookId":"ef3f120e-c212-45ff-99b5-b6a5a82598d8","typeVersion":1.1,"credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"content":"## Process Telegram Request\n","height":279,"width":624,"color":7},"id":"d6d9c72e-9de8-48b3-88a9-ceda2783d192","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1744,-384],"typeVersion":1},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n1. [In OpenRouter](https://openrouter.ai/settings/keys) click **“Create API key”** and copy it.\n\n2. Open the ```OpenRouter``` node:\n * **Select Credential → Create New**\n * Paste into **API Key** and **Save**\n","height":316,"width":294,"color":3},"id":"c8169b5d-eaef-4bb1-94fd-ea6b09dc210a","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[2256,48],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"options":{}},"id":"6fae16b5-a94d-4708-a4f2-9efd72b548d4","name":"OpenRouter","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[2352,80],"typeVersion":1,"credentials":{"openRouterApi":{"id":"zF58stjgF5xdkTLm","name":"OpenRouter account"}}},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis node helps your agent remember the last few messages to stay on topic.","height":260,"width":308,"color":7},"id":"93f8d1c1-8a0f-4973-b449-523e8ff038eb","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note15","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[2576,48],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis node allows your agent create and get tasks from Google Tasks\n","height":260,"width":484,"color":7},"id":"b4b96b38-6a0e-4a4c-85f6-02f447e29560","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note16","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[2912,48],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis node allows your agent access your gmail\n","height":260,"width":308,"color":7},"id":"000b3c4f-ae2f-403c-bd23-38aff73b8cbf","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note18","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[3424,48],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis node allows your agent access your Google calendar\n","height":260,"width":404,"color":7},"id":"14e56d35-c325-4e0e-b851-38f1c72bfcb4","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note19","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[3760,48],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUses OpenAI to convert voice to text.\n[In OpenAI](https://platform.openai.com/api-keys) click **“Create new secret key”** and copy it.","height":276,"width":324,"color":7},"id":"162cb1a0-c143-43fe-889c-07352270ecea","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note20","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[2432,-384],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"Caylee, your peronal AI Assistant:\n1. Get email\n2. Check calendar\n3. Get and create to-do tasks \n\nEdit the **System Message** to adjust your agent’s thinking, behavior, and replies.\n\n\n\n\n\n\n\n\n\n\n","height":380,"width":396,"color":7},"id":"ede7c045-6ee8-4554-98d4-11e5b1e5bfa5","cid":"Ikx1Y2FzIFBleXJpbiI","name":"Sticky Note13","type":"n8n-nodes-base.stickyNote","creator":"Lucas Peyrin","position":[2816,-480],"typeVersion":1,"notes":"© 2025 Lucas Peyrin"},{"parameters":{"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nSend message back to Telegram\n","height":288,"width":304,"color":7},"id":"baa455b1-dd6b-4892-b890-e8bbc459ea8a","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[3264,-384],"typeVersion":1},{"parameters":{"task":"MTY1MjU2Mzk4NDU3MzA3MDY4Nzg6MDow","title":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}","additionalFields":{}},"id":"6aec4732-41d3-4360-a93c-9ffb503b2634","name":"Create a task in Google Tasks","type":"n8n-nodes-base.googleTasksTool","position":[3008,112],"typeVersion":1,"credentials":{"googleTasksOAuth2Api":{"id":"PXDMVlSFIBDkKxzf","name":"Google Tasks account"}}},{"parameters":{"operation":"getAll","task":"MTY1MjU2Mzk4NDU3MzA3MDY4Nzg6MDow","additionalFields":{}},"id":"6c6b0dd2-68fa-44c3-8de2-431bd4c05f12","name":"Get many tasks in Google Tasks","type":"n8n-nodes-base.googleTasksTool","position":[3200,112],"typeVersion":1,"credentials":{"googleTasksOAuth2Api":{"id":"PXDMVlSFIBDkKxzf","name":"Google Tasks account"}}},{"parameters":{"resource":"audio","operation":"transcribe","options":{}},"id":"ad674785-332f-44cd-8946-65ccb60465ff","name":"Transcribe a recording","type":"@n8n/n8n-nodes-langchain.openAi","position":[2544,-352],"typeVersion":1.8,"credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"sendTo":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('To', ``, 'string') }}","subject":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Subject', ``, 'string') }}","message":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Message', `Please format this nicely in html`, 'string') }}","options":{"appendAttribution":false}},"id":"a995374e-fa30-42c7-b5f2-4f9ec8fed3e2","name":"Send Email","type":"n8n-nodes-base.gmailTool","position":[3616,96],"webhookId":"a4ae7b5d-7686-4bee-a753-848932860b4e","typeVersion":2.1,"credentials":{"gmailOAuth2":{"id":"mMAw1rTaQW76ponL","name":"Gmail account"}}},{"parameters":{"promptType":"define","text":"={{ $json.text }}","options":{"systemMessage":"=You are a helpful personal assistant called Jackie. \n\nToday's date is {{ $today.format('yyyy-MM-dd') }}.\n\nGuidelines:\n- When summarizing emails, include Sender, Message date, subject, and brief summary of email.\n- if the user did not specify a date in the request assume they are asking for today\n- When answering questions about calendar events, filter out events that don't apply to the question. For example, the question is about events for today, only reply with events for today. Don't mention future events if it's more than 1 week away\n- When creating calendar entry, the attendee email is optional"}},"id":"ef4d845b-f2c6-46fd-b57d-d242c7eac78b","name":"Jackie, AI Assistant 👩🏻‍🏫","type":"@n8n/n8n-nodes-langchain.agent","position":[2896,-288],"typeVersion":1.6}],"connections":{"If":{"main":[[{"node":"Get Voice File","type":"main","index":0}],[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"main","index":0}]]},"Get Email":{"ai_tool":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_tool","index":0}]]},"OpenRouter":{"ai_languageModel":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_languageModel","index":0}]]},"Send Email":{"ai_tool":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_tool","index":0}]]},"Voice or Text":{"main":[[{"node":"If","type":"main","index":0}]]},"Get Voice File":{"main":[[{"node":"Transcribe a recording","type":"main","index":0}]]},"Google Calendar":{"ai_tool":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_tool","index":0}]]},"Window Buffer Memory":{"ai_memory":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_memory","index":0}]]},"Transcribe a recording":{"main":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"main","index":0}]]},"Listen for incoming events":{"main":[[{"node":"Voice or Text","type":"main","index":0}]]},"Create a task in Google Tasks":{"ai_tool":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_tool","index":0}]]},"Get many tasks in Google Tasks":{"ai_tool":[[{"node":"Jackie, AI Assistant 👩🏻‍🏫","type":"ai_tool","index":0}]]},"Jackie, AI Assistant 👩🏻‍🏫":{"main":[[{"node":"Telegram","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"3506732a-3feb-4f5a-ad04-e4c49c8ba1b0","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-11-29T20:12:24.570Z","createdAt":"2025-11-29T20:12:24.570Z","role":"workflow:owner","workflowId":"59fKEtwJ3Bj0wfyl","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/digest.json b/backups/2025-12-27/digest.json new file mode 100644 index 0000000..154f8ec --- /dev/null +++ b/backups/2025-12-27/digest.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-30T15:55:43.530Z","createdAt":"2025-11-30T14:22:32.513Z","id":"1M7DW5S6VWz9VpBh","name":"digest","active":false,"isArchived":false,"nodes":[{"parameters":{"rule":{"interval":[{"triggerAtHour":21}]}},"type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.2,"position":[64,112],"id":"898b2c59-c464-41e9-8acb-caf02ce2a5c4","name":"Schedule Trigger"},{"parameters":{"jsCode":"// определяем начало и конец текущего дня (МСК)\nconst now = new Date(new Date().toLocaleString('en-US', { timeZone: 'Europe/Moscow' }));\nconst pad = n => String(n).padStart(2, '0');\nconst date = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;\n\nreturn [{\n json: {\n date, // '2025-05-16'\n dayStart: `${date}T00:00:00`,\n dayEnd: `${date}T23:59:59`\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[240,112],"id":"1299704b-b649-4672-a00b-9d05d7e47964","name":"calcRange"},{"parameters":{"jsCode":"// items = массив строк из таблицы meals\nconst users = {}; // chat_id → агрегаты\n\nfor (const { json: r } of items) {\n const id = r.chat_id;\n const dt = new Date(r.eaten_at);\n\n if (!users[id]) {\n users[id] = {\n chat_id: id, // ← для Telegram\n gpt: { // ← для LLM\n date: $items('calcRange')[0].json.date,\n kcal: 0, prot: 0, fat: 0, carb: 0,\n meals: [] // строки «HH:MM — блюдо 200 г»\n }\n };\n }\n\n const u = users[id].gpt;\n\n // суммарные КБЖУ\n u.kcal += r.kcal;\n u.prot += r.prot;\n u.fat += r.fat;\n u.carb += r.carb;\n\n // строка тайм-лайна\n const hhmm = dt.toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit' });\n u.meals.push(`${hhmm} — ${r.dish} ${r.grams} г`);\n}\n\n// превращаем в массив items\nreturn Object.values(users).map(j => ({ json: j }));\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[624,112],"id":"8b675099-d670-400a-8f3e-55950d7f4527","name":"groupByUser"},{"parameters":{"modelId":{"__rl":true,"value":"chatgpt-4o-latest","mode":"list","cachedResultName":"CHATGPT-4O-LATEST"},"messages":{"values":[{"content":"=Ты нутри-диетолог-бот. На вход приходит отчет о питании пользователя в JSON:\n{\n \"date\": \"YYYY-MM-DD\",\n \"kcal\": число | null,\n \"prot\": число | null,\n \"fat\" : число | null,\n \"carb\": число | null,\n \"meals\": [ \"08:00 — …\", … ] // массив может быть пуст\n}\n\n✅ Если данные по КБЖУ есть - сделай отчёт:\n\n• Итог КБЖУ за день: kcal, Б, Ж, У \n• Замечания: (кратко, только если есть замечания по рациону пользователя) \n• Совет на завтра: (1 конкретная рекомендация по улучшению самочувствия или питания)\n\nВ конце: \"Если будут вопросы — пиши :)\"\n\n--------------------------------\nФормат:\n\n• Telegram-Markdown Legacy \n• Сделай текст визуально приятным, важное выдели\n• жирный — одна `*`, курсив — одна `_` \n• до 3 тематических эмоджи во всём сообщении \n• Не выдавай ``` и не возвращай JSON.\n","role":"system"},{"content":"={{ JSON.stringify($json.gpt, null, 2) }}"}]},"options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":1.8,"position":[800,112],"id":"9273841b-ded5-453c-835a-65914ce7b014","name":"digestGPT","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"operation":"getAll","tableId":"meals","returnAll":true,"matchType":"allFilters","filters":{"conditions":[{"keyName":"deleted","condition":"is","keyValue":"false"},{"keyName":"eaten_at","condition":"lte","keyValue":"={{ $json.dayEnd }}"},{"keyName":"eaten_at","condition":"gte","keyValue":"={{ $json.dayStart }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[432,112],"id":"001813d5-c8fe-416a-aee5-4ad1532098be","name":"GET today","alwaysOutputData":false,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"content":"# РАССЫЛКА каждый день в 21:00 по мск\n\n\n\n","height":352,"width":1718,"color":6},"id":"f535baca-c956-4724-9d19-43bf603c2a24","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,0],"typeVersion":1},{"parameters":{"method":"POST","url":"https://rosfwogfdgfdgfdgfdhcc.supabase.co/rest/v1/rpc/upsert_digest","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","sendHeaders":true,"headerParameters":{"parameters":[{"name":"apikey","value":"KEY"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"_chat_id","value":"={{ $('groupByUser').item.json.chat_id }}"},{"name":"_for_date","value":"={{ $('groupByUser').item.json.gpt.date }}"},{"name":"_kcal","value":"={{ $('groupByUser').item.json.gpt.kcal }}"},{"name":"_prot","value":"={{ $('groupByUser').item.json.gpt.prot }}"},{"name":"_fat","value":"={{ $('groupByUser').item.json.gpt.fat }}"},{"name":"_carb","value":"={{ $('groupByUser').item.json.gpt.carb }}"},{"name":"_meals_json","value":"={{ $('groupByUser').item.json.gpt.meals }}"},{"name":"_summary_md","value":"={{ $('digestGPT').item.json.message.content }}"},{"name":"_msg_id","value":"={{ $json.result.message_id }}"}]},"options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1552,112],"id":"787493b2-e4e6-47be-9e54-93a9e9bd7aea","name":"SAVE SUPA digest","credentials":{"httpHeaderAuth":{"id":"8MpbqGPzLpfPWyM8","name":"Header Auth account"}}},{"parameters":{"chatId":"={{ $('groupByUser').item.json.chat_id }}","text":"={{ $json[\"message\"][\"content\"] || $json }}","additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1344,112],"id":"270ba6ba-b8a7-4493-85c5-f71dd2102678","name":"SEND","webhookId":"f28557c8-d474-47fe-9f04-5d6dbb9bd96c","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"jsCode":"// убираем экранирование у формат-маркеров * и _\nif ($json.message?.content) {\n $json.message.content = $json.message.content\n // сначала двойные обратные слэши\n .replace(/\\\\([*_])/g, '$1');\n}\nreturn $json;\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[1136,112],"id":"4b406b0b-47de-4cc3-8c39-969e8f542487","name":"Escape"}],"connections":{"Schedule Trigger":{"main":[[{"node":"calcRange","type":"main","index":0}]]},"calcRange":{"main":[[{"node":"GET today","type":"main","index":0}]]},"groupByUser":{"main":[[{"node":"digestGPT","type":"main","index":0}]]},"digestGPT":{"main":[[{"node":"Escape","type":"main","index":0}]]},"GET today":{"main":[[{"node":"groupByUser","type":"main","index":0}]]},"SEND":{"main":[[{"node":"SAVE SUPA digest","type":"main","index":0}]]},"Escape":{"main":[[{"node":"SEND","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":{"node:Schedule Trigger":{"recurrenceRules":[]}},"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"16512367-e4b6-494e-97ef-e749639ca6cc","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-11-30T14:22:32.513Z","createdAt":"2025-11-30T14:22:32.513Z","role":"workflow:owner","workflowId":"1M7DW5S6VWz9VpBh","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/docker manage.json b/backups/2025-12-27/docker manage.json new file mode 100644 index 0000000..51a15f9 --- /dev/null +++ b/backups/2025-12-27/docker manage.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-29T20:49:05.134Z","createdAt":"2025-11-29T20:48:09.567Z","id":"UCNbmE7E4cwkqPUz","name":"docker manage","active":false,"isArchived":false,"nodes":[{"parameters":{"httpMethod":"POST","path":"c851e840-457c-4050-8803-4e6d258580e1","options":{}},"id":"a9418004-77a7-4fc3-a6da-e64f0c85e4de","name":"Webhook","type":"n8n-nodes-base.webhook","position":[64,160],"typeVersion":2.1,"webhookId":"77095d61-8836-4ad8-995d-f66746369cbf"},{"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4.1-mini","cachedResultName":"GPT-4.1-MINI"},"responses":{"values":[{"role":"system","content":"You are a senior IT specialist experienced in debugging distributed systems, containers, Linux services, and application logs. When the user provides log output or an error message, you must:\n\nAnalyze the logs carefully and respond in a structured format:\n\nSummary\nShort, concise explanation of what's happening.\n\nMost Likely Root Cause\nOne clear sentence. If unknown, say so and state what’s missing.\n\nImpact\nExplain if functionality is broken, partially limited, or unaffected.\n\nKey Evidence From Logs\nList only the relevant log lines and briefly explain each.\n\nSeverity Level\nRate 1–5 (1 negligible, 5 critical). Include a one-line justification.\n\nRecommended Next Steps\nBullet actionable steps. Include different paths if needed (example: “If you use USB devices…”).\n\nFollow-up / What to Monitor\nOne or two items the user should watch for or collect next.\n\nGuidelines:\n\nBe concise and structured. No long essays.\n\nNever just quote logs back. Interpret them.\n\nIf assumptions are required, state them explicitly.\n\nIf the logs do not contain enough info, say so and request specifics.\n\nTone should be calm, confident, and clear like a senior engineer helping a teammate.\n\nAvoid unnecessary technical jargon unless required.\n\nFocus on actionable clarity."},{"content":"={{ $('get logs').item.json.stdout }}"}]},"builtInTools":{},"options":{}},"id":"805eb9a4-abc4-4c68-b525-28847c91094a","name":"Message a model","type":"@n8n/n8n-nodes-langchain.openAi","position":[1712,640],"typeVersion":2,"credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"updates":["message"],"additionalFields":{}},"id":"24fb74b7-9c06-4f37-9c25-a9befebb1ed1","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[96,672],"typeVersion":1.2,"webhookId":"06e6be4d-8b16-4c5f-9a9b-967e74cc66ff","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a4f85833-5791-4513-bef5-f31c582bf26a","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.message.text.toLowerCase() }}","rightValue":"logs"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"52a99c27-c2bb-49b5-9ca9-27c3de1aa9ac","operator":{"type":"string","operation":"contains"},"leftValue":"={{ $json.message.text.toLowerCase() }}","rightValue":"restart"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f12f78c4-e959-4e50-9b1d-2a605169387d","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.message.text.toLowerCase() }}","rightValue":"status"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"3e13d044-3bfe-4669-a107-ace1b573240e","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.message.text.toLowerCase() }}","rightValue":"update"}]}}]},"options":{}},"id":"197134d7-14db-46e8-976b-fd3ea6e6ee5e","name":"Switch","type":"n8n-nodes-base.switch","position":[416,1088],"typeVersion":3.3},{"parameters":{"mode":"combine","combineBy":"combineByPosition","options":{}},"id":"b8cd9d32-f9fe-42e8-b845-37f1f658f9ad","name":"Merge","type":"n8n-nodes-base.merge","position":[1040,640],"typeVersion":3.2},{"parameters":{"mode":"combine","combineBy":"combineByPosition","options":{}},"id":"acba80b9-bf47-4228-a91c-cd0a2783f297","name":"Merge1","type":"n8n-nodes-base.merge","position":[1040,1008],"typeVersion":3.2},{"parameters":{"rules":{"values":[{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"5f956f73-4789-4fae-bedc-7c1f0edfc2d2","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.body.heartbeat.msg }}","rightValue":"running"}]}},{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"d1ec668d-53e8-44b2-9cb6-6a4de3bcec07","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.body.heartbeat.msg }}","rightValue":"running"}]}}]},"options":{}},"id":"6d28964d-53a2-4760-95d8-9b32311e8b5c","name":"Switch1","type":"n8n-nodes-base.switch","position":[288,160],"typeVersion":3.3},{"parameters":{"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"30a53424-65b9-4a9b-a4cd-e78933c8441b","operator":{"type":"string","operation":"empty","singleValue":true},"leftValue":"={{ $json.stderr }}","rightValue":""}]},"options":{}},"id":"e66c9386-c788-4b53-a0ac-1dbd186d8f90","name":"If","type":"n8n-nodes-base.if","position":[1776,1008],"typeVersion":2.2},{"parameters":{"chatId":"8209283663","text":"={{ $json.body.msg }}","replyMarkup":"replyKeyboard","replyKeyboardOptions":{},"additionalFields":{"appendAttribution":false,"reply_to_message_id":0}},"id":"e2773fd4-c08e-43c8-b737-4b37840ebed8","name":"OK Message","type":"n8n-nodes-base.telegram","position":[512,64],"typeVersion":1.2,"webhookId":"77af8e80-627d-4140-8d4a-217ff22ed31b","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"={{ $json.body.monitor.docker_container }} reported an issue : {{ $json.body.heartbeat.msg }} at {{ $json.body.heartbeat.time }}","replyMarkup":"replyKeyboard","replyKeyboard":{"rows":[{"row":{"buttons":[{"text":"={{ $json.body.monitor.docker_container }} Logs","additionalFields":{}},{"text":"={{ $json.body.monitor.docker_container }} Restart","additionalFields":{}}]}}]},"replyKeyboardOptions":{},"additionalFields":{"appendAttribution":false,"reply_to_message_id":0}},"id":"b3be1e4e-2891-44f5-86e0-13d45e5aaf88","name":"ERROR Message","type":"n8n-nodes-base.telegram","position":[512,256],"typeVersion":1.2,"webhookId":"5ab67fa8-6936-4cf4-93c1-a249f0a6a0ff","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"=Analyzing Log File...","additionalFields":{"appendAttribution":false}},"id":"30b13373-c151-430c-a95a-6eb8fa3f14b0","name":"Status Update","type":"n8n-nodes-base.telegram","position":[1488,640],"typeVersion":1.2,"webhookId":"74fe0f97-3e35-48cd-96b2-8b222505b847","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"={{ $json.output[0].content[0].text }}","additionalFields":{"appendAttribution":false}},"id":"24e0c35a-5de5-40f6-be7c-515bf84b04c0","name":"Log Analysis","type":"n8n-nodes-base.telegram","position":[2064,640],"typeVersion":1.2,"webhookId":"fe8bb2b6-097d-40ee-8108-5d5652d35ce7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"=Attempting to restart...","additionalFields":{"appendAttribution":false}},"id":"716ff4d7-42f6-4fa6-8bcb-bbee571fc9b1","name":"Restart Message","type":"n8n-nodes-base.telegram","position":[1264,1008],"typeVersion":1.2,"webhookId":"a01b2aeb-bf4c-4184-b0d4-255cf9cb8768","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"=Successfull restarting {{ $json.stdout }}","additionalFields":{"appendAttribution":false}},"id":"fe73b4da-24b7-442a-bbb2-44b12505880e","name":"Success restart","type":"n8n-nodes-base.telegram","position":[2064,912],"typeVersion":1.2,"webhookId":"4a8ee06c-15cb-4da3-aeb6-101869cf3b88","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"=Restart failed\n{{ $('restart container').item.json.stderr }}","additionalFields":{"appendAttribution":false}},"id":"10144c60-1c3f-408d-a9b2-39a384907971","name":"Restart Failed","type":"n8n-nodes-base.telegram","position":[2064,1104],"typeVersion":1.2,"webhookId":"3821d08a-ddd7-4f66-b302-57518808eff7","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"={{ $json.stdout }}","additionalFields":{"appendAttribution":false,"parse_mode":"HTML"}},"id":"5a10f813-651f-425b-a660-756e1f108bae","name":"Docker Status","type":"n8n-nodes-base.telegram","position":[1072,1456],"typeVersion":1.2,"webhookId":"8e2f52ba-ec85-46f3-b42f-d80730cc4283","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"command":"=docker logs --tail 100 {{ $json.service_name }}","cwd":"/root/"},"id":"e83dbb5a-0b89-4455-ac4b-4d13dee186c5","name":"get logs","type":"n8n-nodes-base.ssh","position":[1264,640],"typeVersion":1,"credentials":{"sshPassword":{"id":"9jCP71iIVSvJoPxR","name":"SSH Password account"}}},{"parameters":{"command":"=docker restart {{ $('Merge1').item.json.service_name }}","cwd":"/root/"},"id":"7d621bb8-59bf-43a7-adea-c6930356a398","name":"restart container","type":"n8n-nodes-base.ssh","position":[1488,1008],"typeVersion":1,"credentials":{"sshPassword":{"id":"9jCP71iIVSvJoPxR","name":"SSH Password account"}}},{"parameters":{"command":"docker ps --format \"{{.Names}}\\t{{.Status}}\"","cwd":"/root/"},"id":"3813d41d-00fe-47dc-9590-40d76e847aa0","name":"docker ps","type":"n8n-nodes-base.ssh","position":[848,1456],"typeVersion":1,"credentials":{"sshPassword":{"id":"9jCP71iIVSvJoPxR","name":"SSH Password account"}}},{"parameters":{"language":"python","pythonCode":"import re\nimport json\n\ndef extract_update_summary(stdout):\n match = re.search(r'Update Summary:\\n({.*?\\})', stdout, re.DOTALL)\n if not match:\n return {}\n update_json = match.group(1)\n update_json_clean = re.sub(r',\\s*([\\]\\}])', r'\\1', update_json)\n return json.loads(update_json_clean)\n\ndef format_update_message(update_summary):\n status_parts = []\n for compose_file, updates in update_summary.items():\n service = compose_file.replace('-compose.yaml', '')\n if updates == [\"none\"]:\n status_parts.append(f\"{service}: No updates\")\n else:\n status_parts.append(f\"{service}: Updated ({', '.join(updates)})\")\n return \"; \".join(status_parts)\n\n# n8n passes items as a list of dicts; get the \"stdout\" field from the input\nstdout = _input.first().json.stdout\nupdate_summary = extract_update_summary(stdout)\nmessage = format_update_message(update_summary)\nreturn [{\"message\": message}]\n"},"id":"308111a8-7470-476e-8b1b-b10524d52ec2","name":"Code in Python (Beta)","type":"n8n-nodes-base.code","position":[1248,1856],"typeVersion":2},{"parameters":{"command":"./update-all-docker-compose.sh","cwd":"/root/"},"id":"68c5641e-bb14-41c9-aa82-67e6f24276ef","name":"Update Docker","type":"n8n-nodes-base.ssh","position":[1024,1856],"notesInFlow":true,"typeVersion":1,"alwaysOutputData":true,"credentials":{"sshPassword":{"id":"9jCP71iIVSvJoPxR","name":"SSH Password account"}}},{"parameters":{"chatId":"8209283663","text":"=Running Update...","additionalFields":{"appendAttribution":false,"parse_mode":"HTML"}},"id":"fc1658de-3fc2-4481-86cb-612ea51bbb92","name":"Update Msg","type":"n8n-nodes-base.telegram","position":[800,1856],"typeVersion":1.2,"webhookId":"43e19fea-7577-4dd3-a659-e695c15eeb97","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"8209283663","text":"={{ $json.message }}","additionalFields":{"appendAttribution":false,"parse_mode":"HTML"}},"id":"38c58f7a-8afc-44e6-9869-fa1179eb7392","name":"Update Msg1","type":"n8n-nodes-base.telegram","position":[1536,1856],"typeVersion":1.2,"webhookId":"09bc92cc-40a8-4b28-af58-060970ec69ca","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"content":"## Incoming Webhook\n\nuse a webhook from tools like Uptime Kuma","height":384},"id":"61ae9bd8-68c8-44e6-aa8e-594355423960","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,0],"typeVersion":1},{"parameters":{"content":"## User Interaction\n\nAllow users to triggers events directly from Telegram","height":304,"width":352},"id":"1b880d57-d4ad-4a5c-a2a4-40634190fd2c","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,560],"typeVersion":1},{"parameters":{"language":"python","pythonCode":"def extract_service_name(message):\n # Split by spaces\n parts = message.split()\n # Take the first part (service name)\n if parts:\n return parts[0]\n else:\n return ''\n\n# Example usage:\nincoming_message = _input.first().json.message.text\nservice_name = extract_service_name(incoming_message)\nreturn {\n \"service_name\": service_name\n}"},"id":"f37914c6-5e0a-42ae-9c57-d2024b464128","name":"Extract the Service Name","type":"n8n-nodes-base.code","position":[800,640],"typeVersion":2},{"parameters":{"content":"## Issue Analyzer\nAutomatically analyse the log file for a docker container and provide feedback to the user","height":320,"width":1488},"id":"68ad89f8-defe-47a9-b2a3-232062c89f85","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[784,512],"typeVersion":1},{"parameters":{"content":"## Docker Restart Service\nAutomatically restart a given docker container","height":352,"width":1488},"id":"2a080819-9c59-4c9a-9d29-430ff2cd5435","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[768,896],"typeVersion":1},{"parameters":{"content":"## Allow the user to get all current deployed docker container\n","height":352,"width":752},"id":"320eb71d-4a54-435e-b703-09ce97416bfb","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[768,1328],"typeVersion":1},{"parameters":{"content":"## Automatically update all docker images on the server","height":352,"width":1232},"id":"be540fdf-4ed1-4457-9a6f-2ee0987ee384","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[768,1728],"typeVersion":1},{"parameters":{"content":"## Custom Script for your Docker server\n\n''bash\nProcessing hompage-compose.yaml\n GNU nano 7.2 update-all-docker-compose.sh\n#!/bin/bash\ndeclare -A UPDATED_CONTAINERS\nN8N_FILE=\"n8n-compose.yaml\" # Adjust to your n8n compose filename\n\nfor file in *-compose.yaml; do\n if [[ \"$file\" == \"$N8N_FILE\" ]]; then\n echo \"Skipping $file (n8n instance)\"\n continue\n fi\n\n echo \"Processing $file\"\n UPDATED_IMAGES=()\n\n OUTPUT=$(docker compose -f \"$file\" pull 2>&1)\n echo \"$OUTPUT\"\n\n while IFS= read -r line; do\n if [[ $line =~ \"Downloaded newer image\" ]]; then\n IMAGE=$(echo \"$line\" | awk '{print $2}')\n UPDATED_IMAGES+=(\"$IMAGE: updated\")\n elif [[ $line =~ \"Image is up to date\" ]]; then\n IMAGE=$(echo \"$line\" | awk '{print $2}')\n UPDATED_IMAGES+=(\"$IMAGE: already up-to-date\")\n fi\n done <<< \"$OUTPUT\"\n\n docker compose -f \"$file\" up -d\n\n UPDATED_CONTAINERS[\"$file\"]=${UPDATED_IMAGES[@]:-none}\ndone\n\necho \"Update Summary:\"\necho \"{\"\nfor file in \"${!UPDATED_CONTAINERS[@]}\"; do\n echo \" \\\"$file\\\": [\"\n for status in ${UPDATED_CONTAINERS[$file]}; do\n echo \" \\\"$status\\\",\"\n done\n echo \" ],\"\ndone\necho \"}\"\n''","height":944,"width":464},"id":"77380b75-b58f-4d30-8859-8700df1a686f","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[768,2112],"typeVersion":1}],"connections":{"If":{"main":[[{"node":"Success restart","type":"main","index":0}],[{"node":"Restart Failed","type":"main","index":0}]]},"Merge":{"main":[[{"node":"get logs","type":"main","index":0}]]},"Merge1":{"main":[[{"node":"Restart Message","type":"main","index":0}]]},"Switch":{"main":[[{"node":"Merge","type":"main","index":0}],[{"node":"Merge1","type":"main","index":0}],[{"node":"docker ps","type":"main","index":0}],[{"node":"Update Msg","type":"main","index":0}]]},"Switch1":{"main":[[{"node":"OK Message","type":"main","index":0}],[{"node":"ERROR Message","type":"main","index":0}]]},"Webhook":{"main":[[{"node":"Switch1","type":"main","index":0}]]},"get logs":{"main":[[{"node":"Status Update","type":"main","index":0}]]},"docker ps":{"main":[[{"node":"Docker Status","type":"main","index":0}]]},"Update Msg":{"main":[[{"node":"Update Docker","type":"main","index":0}]]},"Status Update":{"main":[[{"node":"Message a model","type":"main","index":0}]]},"Update Docker":{"main":[[{"node":"Code in Python (Beta)","type":"main","index":0}]]},"Message a model":{"main":[[{"node":"Log Analysis","type":"main","index":0}]]},"Restart Message":{"main":[[{"node":"restart container","type":"main","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Switch","type":"main","index":0},{"node":"Extract the Service Name","type":"main","index":0}]]},"restart container":{"main":[[{"node":"If","type":"main","index":0}]]},"Code in Python (Beta)":{"main":[[{"node":"Update Msg1","type":"main","index":0}]]},"Extract the Service Name":{"main":[[{"node":"Merge","type":"main","index":1},{"node":"Merge1","type":"main","index":1}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"0bf0ffe4-c9bb-492d-9110-4584b7c054dd","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-11-29T20:48:09.567Z","createdAt":"2025-11-29T20:48:09.567Z","role":"workflow:owner","workflowId":"UCNbmE7E4cwkqPUz","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/mikrotik.json b/backups/2025-12-27/mikrotik.json new file mode 100644 index 0000000..f451559 --- /dev/null +++ b/backups/2025-12-27/mikrotik.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-29T21:59:25.882Z","createdAt":"2025-11-29T20:59:52.613Z","id":"ToDRzIsMSKmFdU22","name":"mikrotik","active":false,"isArchived":false,"nodes":[{"parameters":{"functionCode":"const message = $input.all()[0].json.message.text;\nconst chatId = $input.all()[0].json.message.chat.id;\n\nconst match = message.match(/^\\/addip (\\d+\\.\\d+\\.\\d+\\.\\d+)(?: (\\S+)(?: (\\S+)(?: \"(.+)\")?)?)?/);\n\nif (!match) {\n return [{ json: { chatId, error: 'Формат: /addip IP [список] [таймаут] \"[комментарий]\"' } }];\n}\n\nconst [, ip, list = 'trusted', timeout = '1d', comment = 'Добавлено через Telegram'] = match;\nreturn [{ json: { chatId, ip, list, timeout, comment } }];"},"name":"Parse Command","type":"n8n-nodes-base.function","typeVersion":1,"position":[-960,976],"id":"4a48ea56-0bd0-467f-acb4-24aa6228dcd7"},{"parameters":{"authentication":"basicAuth","requestMethod":"POST","url":"http://10.33.33.1:8738/rest/ip/firewall/address-list/add","jsonParameters":true,"options":{},"bodyParametersJson":"={\n \"address\": \"{{ $json.ip }}\",\n \"list\": \"{{ $json.list }}\",\n \"timeout\": \"{{ $json.timeout }}\",\n \"comment\": \"{{ $json.comment }}\"\n}"},"name":"Add to MikroTik","type":"n8n-nodes-base.httpRequest","typeVersion":1,"position":[-720,976],"id":"03cd0c69-269b-46e3-84a9-af04ad098f6a","credentials":{"httpBasicAuth":{"id":"gBAUOrSceRAWqNfB","name":"mikrot api"}}},{"parameters":{"updates":["*"],"additionalFields":{}},"name":"Telegram Trigger1","type":"n8n-nodes-base.telegramTrigger","typeVersion":1,"position":[-1152,976],"id":"416be817-5533-4dc2-8c2e-87f266bdd2a5","webhookId":"d90faed7-0985-4037-95d5-1d5faa092ae2","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}},{"parameters":{"chatId":"1171589143","text":"ip dobalen","additionalFields":{}},"name":"Telegram Success1","type":"n8n-nodes-base.telegram","typeVersion":1,"position":[-480,976],"id":"7374248f-553c-49b3-8b34-4412faa04c70","webhookId":"321b1665-3f87-409b-a855-2e92fb4155a4","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram account"}}}],"connections":{"Parse Command":{"main":[[{"node":"Add to MikroTik","type":"main","index":0}]]},"Add to MikroTik":{"main":[[{"node":"Telegram Success1","type":"main","index":0}]]},"Telegram Trigger1":{"main":[[{"node":"Parse Command","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"a540ad77-73fa-4395-9ec4-fca15113edcf","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-11-29T20:59:52.613Z","createdAt":"2025-11-29T20:59:52.613Z","role":"workflow:owner","workflowId":"ToDRzIsMSKmFdU22","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/n8n_backup_gitea.json b/backups/2025-12-27/n8n_backup_gitea.json new file mode 100644 index 0000000..25bbd39 --- /dev/null +++ b/backups/2025-12-27/n8n_backup_gitea.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-27T21:49:21.541Z","createdAt":"2025-12-27T18:31:30.486Z","id":"BlRmzgPv0m7n7rCfoFaQE","name":"n8n_backup_gitea","active":false,"isArchived":false,"nodes":[{"parameters":{"chatId":"1171589143","text":"n8n успешно запушен","additionalFields":{}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1040,-64],"id":"1a613417-3efd-4417-a7a0-5ac05f5fe068","name":"Send a text message","webhookId":"cd1430e6-5895-4ecd-b0df-41bb5c311f75","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}}},{"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 0 * * *"}]}},"id":"c8765d52-406e-4de1-8353-7ec6cd6fb54c","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","typeVersion":1.1,"position":[-528,-64]},{"parameters":{"url":"http://10.33.33.70:30109/api/v1/workflows","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","options":{}},"id":"fc778077-ceb1-40ea-9ecf-2cff1bd31771","name":"Get All Workflows","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[-304,-64],"credentials":{"httpHeaderAuth":{"id":"bXtIMzDotX8HKyWy","name":"n8n-api"}}},{"parameters":{"fieldToSplitOut":"data","options":{}},"id":"9a7e423c-dad6-4d2f-959b-1515a176188b","name":"Split into Items","type":"n8n-nodes-base.itemLists","typeVersion":3,"position":[-80,-64]},{"parameters":{"jsCode":"return items.map((item) => {\n const workflow = item.json;\n // Убираем спецсимволы из имени файла\n const safeName = workflow.name.replace(/[/\\\\?%*:|\"<>]/g, '-');\n \n // Кодируем ВЕСЬ объект воркфлоу в Base64\n const base64 = Buffer.from(JSON.stringify(workflow)).toString('base64');\n \n return {\n json: {\n safeName: safeName,\n base64Content: base64,\n today: new Date().toISOString().split('T')[0]\n }\n };\n});"},"id":"e62ffc50-788d-4ebd-96ba-e7e456617ef4","name":"Prepare Data (Base64)","type":"n8n-nodes-base.code","typeVersion":2,"position":[144,-64]},{"parameters":{"options":{}},"id":"40140d3a-3a99-4f4c-abaf-2c376fb6d3a9","name":"Loop (Split in Batches)","type":"n8n-nodes-base.splitInBatches","typeVersion":3,"position":[352,-64]},{"parameters":{"method":"POST","url":"=http://10.33.33.70:30008/api/v1/repos/ogrechko/n8n/contents/backups/{{ $json.today }}/{{ $json.safeName }}.json","authentication":"predefinedCredentialType","nodeCredentialType":"giteaApi","sendBody":true,"specifyBody":"json","jsonBody":"={\n \"content\": \"{{ $json.base64Content }}\",\n \"message\": \"Backup: {{ $json.safeName }}\",\n \"branch\": \"master\"\n}","options":{}},"id":"91ab5dc5-9ac9-4eed-9a1d-f811969bfeff","name":"Push to Gitea","type":"n8n-nodes-base.httpRequest","typeVersion":4.1,"position":[576,-64],"credentials":{"giteaApi":{"id":"JpwYw1CY65zUadHB","name":"Gitea account"}}},{"parameters":{"amount":2},"id":"bfe90672-384c-4f7d-b783-0ee0f2082f2e","name":"Wait 2s","type":"n8n-nodes-base.wait","typeVersion":1.1,"position":[800,-64],"webhookId":"4113ef8c-8ada-4b32-acdb-8ba96426bd86"}],"connections":{"Schedule Trigger":{"main":[[{"node":"Get All Workflows","type":"main","index":0}]]},"Get All Workflows":{"main":[[{"node":"Split into Items","type":"main","index":0}]]},"Split into Items":{"main":[[{"node":"Prepare Data (Base64)","type":"main","index":0}]]},"Prepare Data (Base64)":{"main":[[{"node":"Loop (Split in Batches)","type":"main","index":0}]]},"Loop (Split in Batches)":{"main":[[{"node":"Send a text message","type":"main","index":0}],[{"node":"Push to Gitea","type":"main","index":0}]]},"Push to Gitea":{"main":[[{"node":"Wait 2s","type":"main","index":0}]]},"Wait 2s":{"main":[[{"node":"Loop (Split in Batches)","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","availableInMCP":false},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"7dc6e5ca-386c-450d-82a9-8dab29661d39","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-27T18:31:30.486Z","createdAt":"2025-12-27T18:31:30.486Z","role":"workflow:owner","workflowId":"BlRmzgPv0m7n7rCfoFaQE","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/pars_tg.json b/backups/2025-12-27/pars_tg.json new file mode 100644 index 0000000..e1a8fb1 --- /dev/null +++ b/backups/2025-12-27/pars_tg.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-03T21:09:54.768Z","createdAt":"2025-12-03T20:47:48.689Z","id":"WNwF7L3mikoSfdwv","name":"pars_tg","active":false,"isArchived":false,"nodes":[{"parameters":{"options":{}},"type":"@n8n/n8n-nodes-langchain.chatTrigger","typeVersion":1.4,"position":[-480,-80],"id":"ece42184-9786-4fdd-8532-6ed6d3b412e3","name":"When chat message received","webhookId":"67c19089-9e45-4e3d-96db-390962f84509"},{"parameters":{"options":{"systemMessage":"=You are a smart agent\n\nToday's date is - {{ $now }}\n\nYour primary tool for generating responses is \"open and close tg\".\n\nAlways answer only based on these tools. [ ]\n\nAlways after the user's question, send a message using the tool - \"telegram tool\" stating that you have started the process and a response will be provided soon.\n\n1 Tool - \"open and close tg\"\nUse it when you need to parse data from the specified channel for any date in order to answer.\n\nChannel ID for parsing - -1001138673901\n\nBe sure to send the channel ID to this tool and formulate a prompt that can solve the user's request. Send the prompt along with the channel ID."}},"type":"@n8n/n8n-nodes-langchain.agent","typeVersion":3,"position":[-112,-96],"id":"1fe1c47f-2a4a-4a39-9e1f-0cfc14c9de04","name":"AI Agent"},{"parameters":{"contextWindowLength":500},"type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","typeVersion":1.3,"position":[-64,192],"id":"2a19bd8b-97a3-4066-8a4c-2bef14ac3bbb","name":"Simple Memory"},{"parameters":{"options":{}},"type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","typeVersion":1,"position":[-272,128],"id":"0a7bf2fa-c60a-497e-8b0b-94c670048417","name":"OpenRouter Chat Model","credentials":{"openRouterApi":{"id":"zF58stjgF5xdkTLm","name":"OpenRouter account"}}},{"parameters":{"description":"you should go in this tool if you need data on telegram chanell (closed and opened)","workflowId":{"__rl":true,"value":"Hx3uO2aSTDEtCIWj","mode":"list","cachedResultUrl":"/workflow/Hx3uO2aSTDEtCIWj","cachedResultName":"pars_tg2"},"workflowInputs":{"mappingMode":"defineBelow","value":{},"matchingColumns":[],"schema":[],"attemptToConvertTypes":false,"convertFieldsToString":false}},"type":"@n8n/n8n-nodes-langchain.toolWorkflow","typeVersion":2.2,"position":[208,192],"id":"11a57857-034a-44ab-8ff8-92d1d256b552","name":"open and close tg"}],"connections":{"When chat message received":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"OpenRouter Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"open and close tg":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"2d12300a-0eaa-4165-8807-c3c40472b97b","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-03T20:47:48.689Z","createdAt":"2025-12-03T20:47:48.689Z","role":"workflow:owner","workflowId":"WNwF7L3mikoSfdwv","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/pars_tg2.json b/backups/2025-12-27/pars_tg2.json new file mode 100644 index 0000000..1053dc7 --- /dev/null +++ b/backups/2025-12-27/pars_tg2.json @@ -0,0 +1 @@ +{"updatedAt":"2025-12-03T21:09:16.854Z","createdAt":"2025-12-03T20:55:08.726Z","id":"Hx3uO2aSTDEtCIWj","name":"pars_tg2","active":false,"isArchived":false,"nodes":[{"parameters":{"inputSource":"passthrough"},"type":"n8n-nodes-base.executeWorkflowTrigger","typeVersion":1.1,"position":[-320,-48],"id":"66d86dac-706e-49ae-afdb-1f8a5dcdae95","name":"When Executed by Another Workflow"},{"parameters":{"promptType":"define","text":"={{ $json.query }}","options":{"systemMessage":"=You are a smart assistant, whose sole task is to correctly form a link depending on the user's request, send it to the tool – Request, receive a selection of posts from this tool, and then send it further in the form of a brief summary.\n\nTo form the link, use the following data:\nLink format – http://5.181.20.197:3000/parse?channel={channel}&limit={limit}&offsetDate={date}\n\nWhere the following parameters need to be substituted:\n{channel} - channel id\n{limit} - a number indicating the number of posts to parse\n{date} - a number indicating the required date from which to start parsing, for example 2025-05-15 (This is May 15, 2025)\n{channel} - provided to us by the user\n{limit} - You must decide for yourself how many posts to get\n{date} - The date starting from which we parse posts backwards\n\nWe receive posts in the following format:\n{\n\"id\": 1575162,\n\"text\": \"Here is the post text\",\n\"date\": 1747671550\n}\n\nThe post date comes in UNIX timestamp format in seconds (not milliseconds), for example: 1747733735. Use UTC when converting. Convert such numbers to ISO or YYYY-MM-DD format correctly.\n\nExample of a formed link for passing to the tool – Request:\n\n\"http://5.181.20.197:3000/parse?channel=1577983092&limit=10&offsetDate=2025-05-15\""}},"type":"@n8n/n8n-nodes-langchain.agent","typeVersion":3,"position":[-112,-48],"id":"2e7c5107-d612-4454-88d0-da05254d0e8c","name":"AI Agent"},{"parameters":{"options":{}},"type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","typeVersion":1,"position":[-256,160],"id":"00b513a6-547d-4c4a-b929-5a68529326db","name":"OpenRouter Chat Model","credentials":{"openRouterApi":{"id":"zF58stjgF5xdkTLm","name":"OpenRouter account"}}},{"parameters":{"sessionIdType":"customKey","sessionKey":"={{ $json.query }}","contextWindowLength":500},"type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","typeVersion":1.3,"position":[-112,160],"id":"d78c52b3-e9a2-429c-8e30-5f59032d3205","name":"Simple Memory"},{"parameters":{"toolDescription":"=Your task is to substitute the following data into the link http://5.181.20.197:3000/parse?channel={channel}&limit={limit}&offsetDate={date} \n\n{channel} - channel id\n{limit} - a number indicating the number of posts to parse\n{date} - a number indicating the date from which to start parsing","url":"http://5.181.20.197:3000/parse?channel={channel}&limit={limit}&offsetDate={date}","options":{}},"type":"n8n-nodes-base.httpRequestTool","typeVersion":4.3,"position":[144,160],"id":"7d4f02db-67f0-403f-bc90-95d8288b3deb","name":"Request"}],"connections":{"When Executed by Another Workflow":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"OpenRouter Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Request":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":null,"pinData":{},"versionId":"a98f78a4-889a-4e5e-aa96-8e9716bdfc06","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-12-03T20:55:08.726Z","createdAt":"2025-12-03T20:55:08.726Z","role":"workflow:owner","workflowId":"Hx3uO2aSTDEtCIWj","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/tg_callbacks.json b/backups/2025-12-27/tg_callbacks.json new file mode 100644 index 0000000..743af18 --- /dev/null +++ b/backups/2025-12-27/tg_callbacks.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-30T14:49:06.937Z","createdAt":"2025-11-30T14:22:03.470Z","id":"jZIoYr8RW41K0j4J","name":"tg_callbacks","active":false,"isArchived":false,"nodes":[{"parameters":{"content":"# нажал ДА = ВЫБЕРИ ВЕС","height":292,"width":1178,"color":4},"id":"8cbb64b7-c351-4b48-8870-6c6ec65498c7","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[0,448],"typeVersion":1},{"parameters":{"updates":["*"],"additionalFields":{}},"type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[-624,1152],"id":"de564fd6-34c6-4a15-acbb-416dcb225a40","name":"Telegram Trigger","webhookId":"e4d6b058-dc8c-4130-9abd-41243518e824","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"52493568-0b68-46b8-b18a-894cf77bcac1","leftValue":"={{$json.callback_query.data}}","rightValue":"manual_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"manual"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"5eeb9b3f-d4ce-45f6-bb62-32244fd9a99a","leftValue":"={{ $json.message.photo[0] }}","rightValue":"","operator":{"type":"object","operation":"exists","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"image"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"2f1495ad-2eb2-4729-af5a-23c949adce8c","leftValue":"={{$json.callback_query.data}}","rightValue":"dish_yes_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"dish_yes"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"leftValue":"={{$json.callback_query.data}}","rightValue":"dish_no_","operator":{"type":"string","operation":"startsWith"},"id":"c9ead52e-1b81-453a-bd9b-1d18dcbd82bb"}],"combinator":"and"},"renameOutput":true,"outputKey":"dish_no"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"646db5d3-3518-4edf-9374-cef371fa7ba9","leftValue":"={{$json.callback_query.data}}","rightValue":"alt_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"alt"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"1bcf1e75-3e73-465b-8bbb-2665b845e7e9","leftValue":"={{$json.callback_query.data}}","rightValue":"weight_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"weight"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"90573faf-164a-418f-a4a8-b69d3e7aaf3d","leftValue":"={{$json.callback_query.data}}","rightValue":"cancel_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"cancel"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"6166763a-38e9-494a-aea0-20bdc9626314","leftValue":"={{ $json.message.text }}","rightValue":"/","operator":{"type":"string","operation":"exists","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"text_cmd"}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.2,"position":[-416,1040],"id":"77416214-f1c4-4160-ae59-2c266ceec40b","name":"Switch"},{"parameters":{"jsCode":"// alt_0_7 → parts = ['alt','0','7']\nconst [, idx, id] = $json.callback_query.data.split('_');\n\nreturn [{\n json: {\n chat_id : $json.callback_query.message.chat.id, // ID чата, где лежит сообщение-клавиатура\n draft_id : Number(id), // 7\n alt_idx : Number(idx), // 0 / 1 / 2\n del_msg_id : $json.callback_query.message.message_id // ID сообщения, которое надо удалить\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[64,1168],"id":"f0f7a047-5dd6-47e0-b420-22f1d2d4b244","name":"Parse alt"},{"parameters":{"operation":"get","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{$json.chat_id}}"},{"keyName":"message_id","keyValue":"={{$json.draft_id}}"},{"keyName":"status","keyValue":"await_alt"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[448,1168],"id":"dc33c3e0-b25b-415d-bef5-8fd1eb637e90","name":"GET 3","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"update","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","condition":"eq","keyValue":"={{ $json.chat_id }}"},{"keyName":"message_id","condition":"eq","keyValue":"={{$json.draft_id}}"}]},"fieldsUi":{"fieldValues":[{"fieldId":"chosen_name","fieldValue":"={{$json.dish_ru}}"},{"fieldId":"grams_pred","fieldValue":"={{$json.grams_est}}"},{"fieldId":"status","fieldValue":"await_weight"},{"fieldId":"updated_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[768,1184],"id":"f2b7c43e-769e-414d-b91b-7d9b010278bb","name":"UPDATE 3","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"content":"# нажал НЕТ + ЕЩЕ 2 варианта","height":292,"width":1178,"color":3},"id":"4f107a54-cfa4-468d-a5d8-26f381e91e82","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,768],"typeVersion":1},{"parameters":{"content":"# нажал на 1/2 = ВЫБЕРИ ВЕС","height":292,"width":1178,"color":3},"id":"54fcc08b-bf5c-4e18-b972-8327f858ddf7","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,1088],"typeVersion":1},{"parameters":{"content":"# РЕЗУЛЬТАТ\n\n","height":392,"width":1758,"color":4},"id":"8fb8dda2-b400-40e0-81bd-fdedfd69df23","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[0,1408],"typeVersion":1},{"parameters":{"operation":"update","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","condition":"eq","keyValue":"={{ $json.chat_id }}"},{"keyName":"message_id","condition":"eq","keyValue":"={{$json.draft_id}}"}]},"fieldsUi":{"fieldValues":[{"fieldId":"grams_pred","fieldValue":"={{$json.grams}}"},{"fieldId":"status","fieldValue":"done"},{"fieldId":"updated_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[1392,1632],"id":"981f62eb-7550-4756-825f-1377dffc59fd","name":"UPDATE 4","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"chatId":"={{$json.chat_id}}","text":"=*{{ $json.dish }} – {{ $json.grams }} г*\n\n*Калорий:* {{ $json.kcal }}\n*Б:* {{ $json.prot }} *Ж:* {{ $json.fat }} *У:* {{ $json.carb }}\n\n✔️ _сохранил в память_","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"🚫 не сохранять","additionalFields":{"callback_data":"=cancel_{{ $json.id }}"}}]}}]},"additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1568,1440],"id":"d9c2dc63-f07a-4732-8c43-a8e2ea1881e6","name":"DONE","webhookId":"54ba5fcc-0866-4f93-aa38-bad03e1710e6","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"operation":"get","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{$json.chat_id}}"},{"keyName":"message_id","keyValue":"={{$json.draft_id}}"},{"keyName":"status","keyValue":"await_dish"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[448,848],"id":"e382162d-8c34-4836-b159-6c68964d94f9","name":"GET 2","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"update","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","condition":"eq","keyValue":"={{ $json.chat_id }}"},{"keyName":"message_id","condition":"eq","keyValue":"={{$json.draft_id}}"}]},"fieldsUi":{"fieldValues":[{"fieldId":"status","fieldValue":"await_alt"},{"fieldId":"updated_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[768,864],"id":"db2269cb-082a-46d0-98d2-a4dc82618059","name":"UPDATE 2","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"update","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","condition":"eq","keyValue":"={{ $json.chat_id }}"},{"keyName":"message_id","condition":"eq","keyValue":"={{$json.draft_id}}"}]},"fieldsUi":{"fieldValues":[{"fieldId":"chosen_name","fieldValue":"={{$json.dish_ru}}"},{"fieldId":"status","fieldValue":"await_weight"},{"fieldId":"updated_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[768,544],"id":"e07d29c3-4443-432b-a571-1ce443b5833e","name":"UPDATE 1","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"get","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{$json.chat_id}}"},{"keyName":"message_id","keyValue":"={{$json.draft_id}}"},{"keyName":"status","keyValue":"await_dish"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[448,528],"id":"e0a044e2-5370-4ceb-8150-23efbbd287b2","name":"GET 1","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"chatId":"={{$json.chat_id}}","text":"Выбери массу порции:","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"={{$json.buttons[0].text}}","additionalFields":{"callback_data":"={{$json.buttons[0].data}}"}},{"text":"={{$json.buttons[1].text}}","additionalFields":{"callback_data":"={{$json.buttons[1].data}}"}},{"text":"={{$json.buttons[2].text}}","additionalFields":{"callback_data":"={{$json.buttons[2].data}}"}}]}}]},"additionalFields":{"appendAttribution":false}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[960,1168],"id":"13871358-51f9-4b3c-8b20-70b65c18eb90","name":"await_weight 3","webhookId":"d3d32e66-ff1c-42d9-9bfe-cf7f223f745b","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"chatId":"={{ $json.chat_id }}","text":"Выбери массу порции:","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"={{ $json.buttons[0].text }}","additionalFields":{"callback_data":"={{ $json.buttons[0].data }}"}},{"text":"={{ $json.buttons[1].text }}","additionalFields":{"callback_data":"={{ $json.buttons[1].data }}"}},{"text":"={{ $json.buttons[2].text }}","additionalFields":{"callback_data":"={{ $json.buttons[2].data }}"}}]}}]},"additionalFields":{"appendAttribution":false}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[960,528],"id":"f0d2d066-1898-428e-9ab0-1239f76d256f","name":"await_weight 1","webhookId":"d3d32e66-ff1c-42d9-9bfe-cf7f223f745b","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"chatId":"={{$json.chat_id}}","text":"=*Выберите альтернативу:*\n\n{{ $json.alt_lines.join('\\n') }}\n","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"={{$json.buttons[0].text}}","additionalFields":{"callback_data":"={{$json.buttons[0].data}}"}},{"text":"={{$json.buttons[1].text}}","additionalFields":{"callback_data":"={{$json.buttons[1].data}}"}}]}}]},"additionalFields":{"appendAttribution":false}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[960,848],"id":"d2c24a86-a3fa-4432-a543-6c63fc00e436","name":"await_alt","webhookId":"d3d32e66-ff1c-42d9-9bfe-cf7f223f745b","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"jsCode":"// weight_200_7 → parts = ['weight','200','7']\nconst [, grams, id] = $json.callback_query.data.split('_');\n\nreturn [{\n json: {\n chat_id : $json.callback_query.message.chat.id, // тот же chat_id\n draft_id : Number(id), // 7\n grams : Number(grams), // 200\n del_msg_id : $json.callback_query.message.message_id // ID клавиатуры веса\n }\n}];"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[80,1504],"id":"28511818-7857-4075-a662-5a6647f128fe","name":"Split weight"},{"parameters":{"operation":"deleteMessage","chatId":"={{ $json.chat_id }}","messageId":"={{ $json.del_msg_id }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[272,1632],"id":"b7d233d5-543a-440c-97a2-92b22ac7c717","name":"DEL await_weight","webhookId":"182771d4-324c-4a5e-9b6b-cb35d00a0a98","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"operation":"deleteMessage","chatId":"={{ $json.chat_id }}","messageId":"={{ $json.del_msg_id }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[240,1184],"id":"c9f1aab0-b659-49fb-b2c6-f67f83056aa4","name":"DEL await_alt","webhookId":"182771d4-324c-4a5e-9b6b-cb35d00a0a98","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"operation":"deleteMessage","chatId":"={{ $json.chat_id }}","messageId":"={{ $json.del_msg_id }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[240,864],"id":"7d79b792-e168-4721-ab67-d13b0af7d62f","name":"DEL dish_no","webhookId":"182771d4-324c-4a5e-9b6b-cb35d00a0a98","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"operation":"deleteMessage","chatId":"={{ $json.chat_id }}","messageId":"={{ $json.del_msg_id }}"},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[240,544],"id":"2b82adaa-309e-420d-a480-5538fe31fae5","name":"DEL dish_yes","webhookId":"182771d4-324c-4a5e-9b6b-cb35d00a0a98","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"jsCode":"/**\n * INPUT ожидает:\n * • items[0].json — строка-row из Supabase (`draft`)\n * • $json.alt_idx — 0 / 1 / 2 (пришло из «alt_0_»)\n *\n * Правка: alt_idx указывает на элемент candidates[1…3],\n * поэтому делаем сдвиг +1.\n */\n\n// 0. Достаём draft: бывает либо объектом, либо массивом с одним элементом\nconst draft = Array.isArray(items[0].json)\n ? items[0].json[0]\n : items[0].json;\n\n// 1. candidates: если это строка — парсим\nconst candidates = typeof draft.candidates === 'string'\n ? JSON.parse(draft.candidates)\n : draft.candidates || [];\n\n// 2. выбираем нужную альтернативу (alt_idx + 1)\nconst offs = ($json.alt_idx ?? 0) + 1;\nconst cand = candidates[offs] || {\n dish : '(не найдено)',\n grams : draft.grams_pred || 200,\n};\n\n// 3. считаем три варианта массы\nconst g = Number(cand.grams) || 200;\nconst step = g < 120 ? 20 : 50;\nconst btns = [g - step, g, g + step].filter(x => x > 0);\n\nreturn [{\n json: {\n chat_id : draft.chat_id,\n draft_id : draft.message_id, // пригодится для UPDATE\n dish_ru : cand.dish,\n grams_est : g,\n buttons : btns.map(x => ({\n text : `${x} г`,\n data : `weight_${x}_${draft.message_id}`,\n })),\n },\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[592,1168],"id":"3fa5e0f5-cfa6-4846-81a7-059879525667","name":"WEIGHT 3"},{"parameters":{"jsCode":"/** INPUT ожидает:\n * • items[0].json ← строка из Supabase (`draft`)\n * • $json.alt_idx ← 0 / 1 / 2 (пришло из «alt_0_id»)\n */\n\n/* 0. draft может лежать либо прямо в .json, либо в .json[0]\n (зависит от Always Output Data) */\nconst draft = Array.isArray(items[0].json)\n ? items[0].json[0]\n : items[0].json;\n\n/* 1. candidates: если строка → JSON.parse */\nconst candidates = typeof draft.candidates === 'string'\n ? JSON.parse(draft.candidates)\n : draft.candidates || [];\n\n/* 2. индекс альтернативы */\nconst idx = $json.alt_idx ?? 0;\nconst cand = candidates[idx] || { dish:'(не найдено)', grams: draft.grams_pred || 200 };\n\n/* 3. считаем кнопки веса */\nconst g = cand.grams;\nconst step = g < 120 ? 20 : 50;\nconst btns = [g-step, g, g+step].filter(x=>x>0);\n\nreturn [{\n json:{\n chat_id : draft.chat_id,\n draft_id : draft.message_id, // пригодится для UPDATE\n dish_ru : cand.dish,\n grams_est : g,\n buttons : btns.map(x=>({\n text : `${x} г`,\n data : `weight_${x}_${draft.message_id}`\n }))\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[592,528],"id":"99b613d9-8bea-47eb-95ef-09f3ca01c653","name":"WEIGHT 1","alwaysOutputData":true},{"parameters":{"jsCode":"/**\n * Упрощаем: код лишь формирует данные,\n * а финальный текст собираем прямо в Telegram-узле.\n */\n\n// 0. Достаём draft (учёт Always-Output Data)\nconst raw = items[0].json[0] ?? items[0].json;\n\n// 1. Парсим candidates, если пришла строкой\nconst candidates = typeof raw.candidates === 'string'\n ? JSON.parse(raw.candidates)\n : raw.candidates || [];\n\n// 2. Берём альтернативы (макс. 3) — без первого\nconst alts = candidates.slice(1, 4);\n\n// 3. Подготовим «красивые» строки для списка\nconst altLines = alts.map((c, i) => `${i + 1}. ${c.dish}`);\n\n// 4. Кнопки 1-2-3\nconst buttons = alts.map((_, i) => ({\n text : String(i + 1),\n data : `alt_${i}_${raw.message_id}`,\n}));\n\nreturn [{\n json: {\n chat_id : raw.chat_id,\n draft_id : raw.message_id,\n\n // для Telegram-узла\n alt_lines : altLines, // массив ['1. …', '2. …', …]\n buttons, // inline-кнопки\n },\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[592,848],"id":"faa2cbcc-c0c4-4d9f-a899-b25b12140f9d","name":"MORE","alwaysOutputData":true},{"parameters":{"tableId":"meals","fieldsUi":{"fieldValues":[{"fieldId":"chat_id","fieldValue":"={{$json.chat_id}}"},{"fieldId":"dish","fieldValue":"={{ $json.dish }}"},{"fieldId":"grams","fieldValue":"={{ $json.grams }}"},{"fieldId":"eaten_at","fieldValue":"={{ $json.eaten_at }}"},{"fieldId":"kcal","fieldValue":"={{ $json.kcal }}"},{"fieldId":"fat","fieldValue":"={{ $json.fat }}"},{"fieldId":"carb","fieldValue":"={{ $json.carb }}"},{"fieldId":"prot","fieldValue":"={{ $json.prot }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[1392,1440],"id":"b2dd0185-0ef8-470b-b55d-07c25d8738cf","name":"CREATE meals","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"jsCode":"// Пример callback_data: dish_yes_7\nconst parts = $json.callback_query.data.split('_');\nconst draftId = parts.pop(); // '7'\n\n// ID сообщения с кнопками «Да / Нет»,\n// которое нужно удалить после обработки\nconst delMsgId = $json.callback_query.message.message_id;\n\nreturn [{\n json: {\n draft_id : Number(draftId), // 7\n chat_id : $json.callback_query.from.id, // 7758…\n del_msg_id : delMsgId // для Delete-узла\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[64,528],"id":"cf73cd44-91a1-4171-8026-83c6580581a3","name":"Parse dish_YES"},{"parameters":{"jsCode":"// Пример callback_data: dish_yes_7\nconst parts = $json.callback_query.data.split('_');\nconst draftId = parts.pop(); // '7'\n\n// ID сообщения с кнопками «Да / Нет»,\n// которое нужно удалить после обработки\nconst delMsgId = $json.callback_query.message.message_id;\n\nreturn [{\n json: {\n draft_id : Number(draftId), // 7\n chat_id : $json.callback_query.from.id, // 7758…\n del_msg_id : delMsgId // для Delete-узла\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[64,848],"id":"0a101f1a-66ca-4a87-9eaa-791cb1bafb35","name":"Parse dish_NO"},{"parameters":{"jsCode":"// Parse macros (замена текущего кода)\nconst sw = $items('Split weight')[0].json; // chat_id, grams, draft_id …\n\n// assistant.content уже объект: dish, kcal, prot, …\nconst gpt = $json.message?.content ?? $json; // на случай, если jsonOutput=false\n\nconst toMsk = () => {\n const msk = new Date(new Date().toLocaleString('en-US',{timeZone:'Europe/Moscow'}));\n const p = n => String(n).padStart(2,'0');\n return `${msk.getFullYear()}-${p(msk.getMonth()+1)}-${p(msk.getDate())}` +\n `T${p(msk.getHours())}:${p(msk.getMinutes())}:00+03:00`;\n};\n\nreturn [{\n json: {\n ...sw, // chat_id, grams …\n ...gpt, // dish, kcal, prot …\n eaten_at: toMsk()\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[1168,1520],"id":"cc5abefe-1e43-4393-b223-602774224696","name":"Parse macros"},{"parameters":{},"type":"n8n-nodes-base.merge","typeVersion":3.1,"position":[672,1520],"id":"2f88a2f3-5971-414f-9684-d1d37e81387b","name":"Merge"},{"parameters":{"resource":"file","fileId":"={{ $json.photo_file_id }}","additionalFields":{}},"id":"7580a5f0-c838-4dab-9f48-38a534309e31","name":"Get Image","type":"n8n-nodes-base.telegram","position":[224,128],"typeVersion":1.2,"webhookId":"8b210039-e135-420d-a5f1-53fc3ca1e836","retryOnFail":false,"maxTries":2,"credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"operation":"toBinary","sourceProperty":"data","options":{"fileName":"={{ $json.result.file_path }}"}},"id":"e9990056-5926-4dc3-a4f5-c1a7db679dcd","name":"Convert","type":"n8n-nodes-base.convertToFile","position":[624,128],"typeVersion":1.1},{"parameters":{"jsCode":"/**\n * Берём исходный update из триггера\n */\nconst upd = $items(\"Telegram Trigger\")[0].json.message;\nconst chatId = upd.chat.id;\nconst msgId = upd.message_id;\nconst photoId = upd.photo[upd.photo.length - 1].file_id;\n\n/**\n * Русский JSON от Vision\n */\nconst vision = JSON.parse(($json.content || '').replace(/```/g, '').trim());\nconst candidates = vision.candidates || [];\nconst first = candidates[0] || { dish:'блюдо', grams:0 };\n\n/**\n * Draft‑объект\n */\nreturn [{\n json: {\n chat_id : chatId,\n message_id : msgId,\n photo_file_id : photoId,\n\n candidates, // массив на русском\n grams_pred : first.grams,\n status : 'await_dish',\n\n text : `Это *${first.dish}*?`,\n cb_yes : `dish_yes_${msgId}`,\n cb_no : `dish_no_${msgId}`\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[1024,128],"id":"890d69b4-2a3d-4d4b-ab5a-1abd06bff9d6","name":"Parse Vision"},{"parameters":{"assignments":{"assignments":[{"id":"bd8a8c20-939e-49b0-93d0-bb58b8719ebb","name":"chat_id","value":"={{ $json.message.chat.id }}","type":"string"},{"id":"f89d0646-9f73-4067-bbf7-af9913b5f688","name":"message_id","value":"={{$json.message.message_id}}","type":"string"},{"id":"07282534-971f-4430-8d45-5f3e15d3c167","name":"photo_file_id","value":"={{$json.message.photo[$json.message.photo.length - 1].file_id}}","type":"string"}]},"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[64,128],"id":"5752a827-6495-47b2-b8ab-9b5495d264c2","name":"Get ready"},{"parameters":{"chatId":"={{ $json.chat_id }}","text":"={{ $json.text }}","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"Да","additionalFields":{"callback_data":"={{$json.cb_yes}}"}},{"text":"Нет","additionalFields":{"callback_data":"={{$json.cb_no}}"}}]}}]},"additionalFields":{"appendAttribution":false}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[1440,224],"id":"9dc2e33f-38ee-45c1-9cc7-adb282d1331c","name":"dish YES or NO","webhookId":"dc6a9f65-91bd-46e4-8c95-17b2ebe68d7c","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"tableId":"meals_draft","fieldsUi":{"fieldValues":[{"fieldId":"chat_id","fieldValue":"={{ $json.chat_id }}"},{"fieldId":"message_id","fieldValue":"={{ $json.message_id }}"},{"fieldId":"photo_file_id","fieldValue":"={{ $json.photo_file_id }}"},{"fieldId":"candidates","fieldValue":"={{ $json.candidates }}"},{"fieldId":"grams_pred","fieldValue":"={{ $json.grams_pred }}"},{"fieldId":"status","fieldValue":"={{ $json.status }}"},{"fieldId":"created_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[1440,48],"id":"5620bf9d-a9dc-4504-baa7-a837ce33a204","name":"CREATE candidates","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"assignments":{"assignments":[{"id":"360c7be2-b049-4c62-bb83-5fafd0850722","name":"chat_id","value":"={{$json.chat_id}}","type":"string"},{"id":"584b9ab5-5ba9-42f9-a9d9-7bb9bb115361","name":"message_id","value":"={{$json.message_id}}","type":"string"},{"id":"8d7a3167-4cbb-4051-8c23-a0b88438c815","name":"photo_file_id","value":"={{$json.photo_file_id}}","type":"string"},{"id":"246a834e-e731-4239-aa92-60eb7c75d79f","name":"candidates","value":"={{$json.candidates}}","type":"string"},{"id":"69f21e55-55ef-4cf0-b73d-b3e39144e057","name":"grams_pred","value":"={{$json.grams_pred}}","type":"string"},{"id":"1b41e033-b7ce-47b0-8f57-0f8dc109ecab","name":"status","value":"={{$json.status}}","type":"string"}]},"includeOtherFields":true,"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[1264,48],"id":"daf38393-7e4a-4a65-b106-772a023d6d36","name":"EDIT candidates"},{"parameters":{"content":"# ФОТО БЛЮДА = 1 ВАРИАНТ","height":392,"width":1698,"color":6},"id":"4ea9bc63-fda6-4c02-9b5e-69c2e054c18c","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[0,0],"typeVersion":1},{"parameters":{"method":"POST","url":"https://api.telegram.org/botKEY/sendChatAction","sendBody":true,"bodyParameters":{"parameters":[{"name":"chat_id","value":"={{ $json.message.from.id }}"},{"name":"action","value":"typing"}]},"options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[-416,848],"id":"bf3b7eb3-2a56-448f-b354-9bf96ec4573b","name":"HTTP typing...","alwaysOutputData":true,"onError":"continueRegularOutput"},{"parameters":{"operation":"binaryToPropery","options":{}},"id":"dc25033a-af2e-459b-b776-c1dbf7e3d394","name":"Extract","type":"n8n-nodes-base.extractFromFile","position":[464,128],"typeVersion":1},{"parameters":{"workflowId":{"__rl":true,"value":"kohwX0oaY0hmL9b2","mode":"list","cachedResultUrl":"/workflow/kohwX0oaY0hmL9b2","cachedResultName":"tx_text"},"workflowInputs":{"mappingMode":"defineBelow","value":{},"matchingColumns":[],"schema":[],"attemptToConvertTypes":false,"convertFieldsToString":true},"options":{"waitForSubWorkflow":true}},"type":"n8n-nodes-base.executeWorkflow","typeVersion":1.2,"position":[112,2288],"id":"8b0bbc63-fa92-47e8-a5d7-3bdcbd32b290","name":"tg_text"},{"parameters":{"content":"# ТЕКСТ и /\n","height":312,"width":318,"color":7},"id":"d14cf488-d3a0-4208-be12-bc9393b478bf","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[0,2192],"typeVersion":1},{"parameters":{"content":"# НЕ СОХРАНЯТЬ\n","height":312,"width":958,"color":7},"id":"8af20db1-b8f7-48ce-a64d-249d904bb5ea","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[0,1840],"typeVersion":1},{"parameters":{"jsCode":"// cancel_62\nconst mealId = Number($json.callback_query.data.split('_').pop());\n\nreturn [{\n json:{\n meal_id : mealId,\n chat_id : $json.callback_query.from.id,\n msg_id : $json.callback_query.message.message_id\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[64,1952],"id":"d7043f72-4a21-469f-8058-ade0923d49eb","name":"Parse cancel"},{"parameters":{"operation":"update","tableId":"meals","matchType":"allFilters","filters":{"conditions":[{"keyName":"id","condition":"eq","keyValue":"={{ $json.meal_id }}"},{"keyName":"chat_id","condition":"eq","keyValue":"={{$json.chat_id}}"}]},"fieldsUi":{"fieldValues":[{"fieldId":"deleted","fieldValue":"true"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[240,1952],"id":"2d342f15-4653-4e0e-9e3e-f841eaed6772","name":"UPDATE meals","alwaysOutputData":true,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"get","tableId":"meals","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{ $json.chat_id }}"},{"keyName":"id","keyValue":"={{ $json.id }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[400,1952],"id":"6141812b-9efd-40bb-ae6e-184b42149a92","name":"GET meals","alwaysOutputData":true,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"jsCode":"const row = $items('GET meals')[0].json; // dish, grams, kcal …\nconst ctx = $items('Parse cancel')[0].json; // chat_id, msg_id\n\nreturn [{\n json: {\n chat_id : ctx.chat_id,\n msg_id : ctx.msg_id,\n\n // что пойдёт в текст\n dish : row.dish,\n grams : row.grams,\n kcal : row.kcal,\n prot : row.prot,\n fat : row.fat,\n carb : row.carb\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[560,1952],"id":"854e0904-640e-412d-8a48-8c569e498b17","name":"build cancel"},{"parameters":{"operation":"editMessageText","chatId":"={{ $json.chat_id }}","messageId":"={{ $json.msg_id }}","text":"=*{{ $json.dish }} – {{ $json.grams }} г*\n\n*Калорий:* {{ $json.kcal }}\n*Б:* {{ $json.prot }} *Ж:* {{ $json.fat }} *У:* {{ $json.carb }}\n\n🚫 _не сохранил_\n","additionalFields":{"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[752,1952],"id":"0d8a0b50-ff67-4170-99d4-7d4aadca132b","name":"EDITED","webhookId":"d03fb55d-8c26-4782-92a9-d0c9c351a440","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"resource":"image","operation":"analyze","modelId":{"__rl":true,"value":"chatgpt-4o-latest","mode":"list","cachedResultName":"CHATGPT-4O-LATEST"},"text":"\nТы пищевой классификатор.\nВерни JSON ТОЛЬКО на русском, без ``` :\n\n{\n \"candidates\": [\n { \"dish\": \"строка\", \"grams\": число, \"confidence\": 0‑1 },\n … максимум 3\n ]\n}\n","inputType":"base64","options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":1.8,"position":[864,128],"id":"4b235725-e5af-430b-8201-aa5984a0476b","name":"VISION","retryOnFail":true,"notesInFlow":false,"executeOnce":false,"credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"modelId":{"__rl":true,"value":"chatgpt-4o-latest","mode":"list","cachedResultName":"CHATGPT-4O-LATEST"},"messages":{"values":[{"content":"=Ты нутри-калькулятор. \nНа вход получаешь JSON \n{ \"dish\":\"строка\", \"grams\":число }. \n\nОтвечай строго JSON одной строкой:\n\n{\n \"dish\":\"строка\",\n \"kcal\":число,\n \"prot\":число,\n \"fat\":число,\n \"carb\":число\n}\n\nБез пояснений, без ```.","role":"system"},{"content":"={{ $json.chosen_name }}, {{ $json.grams_pred }}"}]},"jsonOutput":true,"options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":1.8,"position":[832,1520],"id":"0586f799-bd0a-4089-bce3-7b859600e557","name":"NUTRION","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"model":"openai/gpt-4o","options":{}},"type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","typeVersion":1,"position":[2288,1632],"id":"52ddcbd7-9829-4590-9eff-879a11bc72e9","name":"OpenRouter Chat Model","disabled":true},{"parameters":{"jsonSchemaExample":"{\n \"dish\": \"овощной салат с сыром\",\n \"kcal\": 122,\n \"prot\": 3.8,\n \"fat\": 8.2,\n \"carb\": 9.2\n}\n"},"type":"@n8n/n8n-nodes-langchain.outputParserStructured","typeVersion":1.2,"position":[2432,1632],"id":"ca89f1d7-5f6e-474e-9987-a89ee34da567","name":"Structured Output Parser","disabled":true},{"parameters":{"jsCode":"/**\n * Parse macros (универсально для:\n * – старого jsonOutput: true\n * – нового Structured Output Parser c массивом или без)\n */\n\n// 1. данные от Split weight (chat_id, grams, draft_id, …)\nconst sw = $items('Split weight')[0].json;\n\n// 2. что пришло от LLM / parser\n// – если это массив → берём первый элемент\n// – если внутри есть .output → берём его, иначе сам объект\nconst raw = Array.isArray($json) ? $json[0] : $json;\nconst gpt = raw.output ?? raw; // { dish, kcal, prot, fat, carb }\n\n// 3. helper → строка даты-времени в МСК ISO +03:00\nconst toMsk = () => {\n const msk = new Date(\n new Date().toLocaleString('en-US', { timeZone: 'Europe/Moscow' })\n );\n const p = n => String(n).padStart(2, '0');\n return `${msk.getFullYear()}-${p(msk.getMonth() + 1)}-${p(msk.getDate())}` +\n `T${p(msk.getHours())}:${p(msk.getMinutes())}:00+03:00`;\n};\n\n// 4. собираем итоговый объект (плоский)\nreturn [{\n json: {\n ...sw, // chat_id, grams, draft_id, …\n ...gpt, // dish, kcal, prot, fat, carb\n eaten_at: toMsk()\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[2624,1488],"id":"dad7038f-a082-4adc-b9a5-329cc2ad5e23","name":"Parse macros 2","disabled":true},{"parameters":{"promptType":"define","text":"={{ $json.chosen_name }}, {{ $json.grams_pred }}","hasOutputParser":true,"options":{"systemMessage":"Ты нутри-калькулятор. \nНа вход получаешь JSON \n{ \"dish\":\"строка\", \"grams\":число }. \n\nОтвечай строго JSON одной строкой:\n\n{\n \"dish\":\"строка\",\n \"kcal\":число,\n \"prot\":число,\n \"fat\":число,\n \"carb\":число\n}\n\nБез пояснений, без ```."}},"type":"@n8n/n8n-nodes-langchain.agent","typeVersion":1.9,"position":[2272,1488],"id":"1bf73b9a-6682-4bd7-9430-cbc841a65382","name":"NUTRION OR","disabled":true},{"parameters":{"operation":"get","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{$json.chat_id}}"},{"keyName":"message_id","keyValue":"={{$json.draft_id}}"},{"keyName":"status","keyValue":"=await_dish"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[448,1600],"id":"6e3168d4-961c-4d8c-b347-faa580776f96","name":"GET await_dish","alwaysOutputData":false,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"operation":"get","tableId":"meals_draft","filters":{"conditions":[{"keyName":"chat_id","keyValue":"={{$json.chat_id}}"},{"keyName":"message_id","keyValue":"={{$json.draft_id}}"},{"keyName":"status","keyValue":"await_weight"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[448,1440],"id":"cb7cc959-621d-4fb0-874b-f10e96b7e39e","name":"GET await_weight","alwaysOutputData":false,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"content":"### другая LLM\n\n\n","height":392,"width":618,"color":5},"id":"45f631a8-6840-4219-a084-a0fb861a3ac8","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[2192,1408],"typeVersion":1}],"connections":{"Telegram Trigger":{"main":[[{"node":"Switch","type":"main","index":0},{"node":"HTTP typing...","type":"main","index":0}]]},"Switch":{"main":[[],[{"node":"Get ready","type":"main","index":0}],[{"node":"Parse dish_YES","type":"main","index":0}],[{"node":"Parse dish_NO","type":"main","index":0}],[{"node":"Parse alt","type":"main","index":0}],[{"node":"Split weight","type":"main","index":0}],[{"node":"Parse cancel","type":"main","index":0}],[{"node":"tg_text","type":"main","index":0}]]},"Parse alt":{"main":[[{"node":"GET 3","type":"main","index":0},{"node":"DEL await_alt","type":"main","index":0}]]},"GET 3":{"main":[[{"node":"WEIGHT 3","type":"main","index":0}]]},"GET 2":{"main":[[{"node":"MORE","type":"main","index":0}]]},"GET 1":{"main":[[{"node":"WEIGHT 1","type":"main","index":0}]]},"Split weight":{"main":[[{"node":"DEL await_weight","type":"main","index":0},{"node":"GET await_dish","type":"main","index":0},{"node":"GET await_weight","type":"main","index":0}]]},"WEIGHT 3":{"main":[[{"node":"UPDATE 3","type":"main","index":0},{"node":"await_weight 3","type":"main","index":0}]]},"WEIGHT 1":{"main":[[{"node":"await_weight 1","type":"main","index":0},{"node":"UPDATE 1","type":"main","index":0}]]},"MORE":{"main":[[{"node":"await_alt","type":"main","index":0},{"node":"UPDATE 2","type":"main","index":0}]]},"Parse dish_YES":{"main":[[{"node":"GET 1","type":"main","index":0},{"node":"DEL dish_yes","type":"main","index":0}]]},"Parse dish_NO":{"main":[[{"node":"GET 2","type":"main","index":0},{"node":"DEL dish_no","type":"main","index":0}]]},"Parse macros":{"main":[[{"node":"UPDATE 4","type":"main","index":0},{"node":"CREATE meals","type":"main","index":0}]]},"Merge":{"main":[[{"node":"NUTRION","type":"main","index":0}]]},"Get Image":{"main":[[{"node":"Extract","type":"main","index":0}]]},"Convert":{"main":[[{"node":"VISION","type":"main","index":0}]]},"Parse Vision":{"main":[[{"node":"EDIT candidates","type":"main","index":0},{"node":"dish YES or NO","type":"main","index":0}]]},"Get ready":{"main":[[{"node":"Get Image","type":"main","index":0}]]},"EDIT candidates":{"main":[[{"node":"CREATE candidates","type":"main","index":0}]]},"Extract":{"main":[[{"node":"Convert","type":"main","index":0}]]},"Parse cancel":{"main":[[{"node":"UPDATE meals","type":"main","index":0}]]},"UPDATE meals":{"main":[[{"node":"GET meals","type":"main","index":0}]]},"GET meals":{"main":[[{"node":"build cancel","type":"main","index":0}]]},"build cancel":{"main":[[{"node":"EDITED","type":"main","index":0}]]},"CREATE meals":{"main":[[{"node":"DONE","type":"main","index":0}]]},"VISION":{"main":[[{"node":"Parse Vision","type":"main","index":0}]]},"NUTRION":{"main":[[{"node":"Parse macros","type":"main","index":0}]]},"OpenRouter Chat Model":{"ai_languageModel":[[{"node":"NUTRION OR","type":"ai_languageModel","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"NUTRION OR","type":"ai_outputParser","index":0}]]},"NUTRION OR":{"main":[[{"node":"Parse macros 2","type":"main","index":0}]]},"GET await_dish":{"main":[[{"node":"Merge","type":"main","index":1}]]},"GET await_weight":{"main":[[{"node":"Merge","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":null,"pinData":{},"versionId":"df708ee1-5b21-4094-8656-93c821012ed9","activeVersionId":null,"triggerCount":1,"shared":[{"updatedAt":"2025-11-30T14:22:03.470Z","createdAt":"2025-11-30T14:22:03.470Z","role":"workflow:owner","workflowId":"jZIoYr8RW41K0j4J","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file diff --git a/backups/2025-12-27/tx_text.json b/backups/2025-12-27/tx_text.json new file mode 100644 index 0000000..fc7da4f --- /dev/null +++ b/backups/2025-12-27/tx_text.json @@ -0,0 +1 @@ +{"updatedAt":"2025-11-30T14:45:15.046Z","createdAt":"2025-11-30T14:22:55.223Z","id":"kohwX0oaY0hmL9b2","name":"tx_text","active":false,"isArchived":false,"nodes":[{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"0a73cab2-d78a-4354-a626-2fa054d2426a","leftValue":"={{ $json.message.text }}","rightValue":"/start","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"start"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"leftValue":"={{ $json.message.text }}","rightValue":"/v","operator":{"type":"string","operation":"startsWith"},"id":"c83a3bbf-a07a-4547-aa5f-24d1641dc2fe"}],"combinator":"and"},"renameOutput":true,"outputKey":"main"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"fa47404d-c110-4d4a-8310-126eb004bd75","leftValue":"={{ $json.message.text }}","rightValue":"/","operator":{"type":"string","operation":"notStartsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"chat"}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.2,"position":[-4128,624],"id":"c9164468-42e2-475b-ae89-1f30d90d4cd8","name":"Switch"},{"parameters":{"jsCode":"const chatId = $items('extract')[0].json.chat_id;\nconst src = JSON.parse($json.message.content); // {\"dish\":..,\"grams\":..[, \"time\":\"HH:MM\"]}\n\n// ── московская «сегодня»\nconst now = new Date(new Date().toLocaleString('en-US',{ timeZone:'Europe/Moscow' }));\n\n// берём HH:MM из src.time или текущее\nlet [hh, mm] =\n src.time?.match(/^(\\d{2}):(\\d{2})$/)?.slice(1) ||\n [now.getHours(), now.getMinutes()].map(n => String(n).padStart(2,'0'));\n\n// собираем ISO-строку в МСК (+03:00) — без перевода в UTC\nconst pad = n => String(n).padStart(2,'0');\nconst eatenAt = `${now.getFullYear()}-${pad(now.getMonth()+1)}-${pad(now.getDate())}` +\n `T${hh}:${mm}:00+03:00`;\n\nreturn [{\n json: {\n chat_id : chatId,\n dish : src.dish,\n grams : src.grams,\n eaten_at: eatenAt\n }\n}];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[-3024,64],"id":"bc17ee36-1ac2-4392-aad1-fba77291cdc4","name":"parseJSON"},{"parameters":{"inputSource":"passthrough"},"type":"n8n-nodes-base.executeWorkflowTrigger","typeVersion":1.1,"position":[-4432,624],"id":"67bd015d-9cdc-42c8-978f-13b436d9ffee","name":"When Executed by Another Workflow"},{"parameters":{"jsCode":"const text = $json.message.text.replace(/^\\/v\\s+/i, '');\nreturn [{ json: { chat_id: $json.message.chat.id, raw: text } }];\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[-3792,144],"id":"1a8628d9-70b1-4986-ab3a-67127dae4dad","name":"extract"},{"parameters":{"modelId":{"__rl":true,"value":"gpt-4o-mini","mode":"list","cachedResultName":"GPT-4O-MINI"},"messages":{"values":[{"content":"=Ты нутри-калькулятор.\nНа вход одна строка «dish, grams».\nВерни ТОЛЬКО одну строку JSON:\n{\"dish\":\"…\",\"kcal\":число,\"prot\":число,\"fat\":число,\"carb\":число}\nБез ``` и без пояснений.","role":"system"},{"content":"={{ $json.dish }}, {{ $json.grams }}"}]},"jsonOutput":true,"options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":1.8,"position":[-2800,64],"id":"b59fbfc7-0ef2-4343-bd3a-9d278c66baa4","name":"nutrion","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"modelId":{"__rl":true,"value":"gpt-4o-mini","mode":"list","cachedResultName":"GPT-4O-MINI"},"messages":{"values":[{"content":"Ты нутри-парсер.\n\nПолучаешь одну строку с описанием еды, которую ел человек и время употребления.\n\n- Если можешь разумно оценить порцию и массу (число граммов) — даже по словам типа «1 шт», «половина», «два куска» — верни ОДНУ строку JSON:\n\n{\"dish\":\"…\",\"grams\":число[, \"time\":\"HH:MM\"]}\n\n- time указывай, только если нашёл в тексте, без даты.\n\n- Если оценить порцию или время нельзя — верни ТЕКСТ-подсказку:\n*Не распознал* 🤔\n\n*Формат:* /v блюдо граммы [HH:MM]\n*Пример:* /v яблоко 100г 18:00","role":"system"},{"content":"={{ $json.raw }}"}]},"options":{}},"type":"@n8n/n8n-nodes-langchain.openAi","typeVersion":1.8,"position":[-3584,144],"id":"f6bfff2b-d314-4711-9270-955298485482","name":"parser","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"content":"# /v РУЧНОЙ ВВОД\n\n\n\n\n","height":432,"width":1858,"color":4},"id":"7e1060f1-6a5e-4bb3-af9e-4dfcd099c011","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-3872,0],"typeVersion":1},{"parameters":{"content":"# ОБЩЕНИЕ С НУТРИЦИОЛОГОМ\n\n\n\n","height":472,"width":1858,"color":6},"id":"7d0b54c9-0380-4574-862e-0498caa8b9c9","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-3872,464],"typeVersion":1},{"parameters":{"content":"# /start И СОЗДАНИЕ ПРОФИЛЯ\n\n\n\n","height":312,"width":858,"color":7},"id":"9939394c-5911-47a3-88e1-61aa477cdc4c","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-3872,-352],"typeVersion":1},{"parameters":{"updates":["*"],"additionalFields":{}},"type":"n8n-nodes-base.telegramTrigger","typeVersion":1.2,"position":[-4688,1152],"id":"ffd54069-c184-432a-a21c-803bb6c44a15","name":"Telegram Trigger","webhookId":"e4d6b058-dc8c-4130-9abd-41243518e824","credentials":{"telegramApi":{"id":"L9KHcMiteyKROF5r","name":"Telegram main n8n"}},"disabled":true},{"parameters":{"rules":{"values":[{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"52493568-0b68-46b8-b18a-894cf77bcac1","leftValue":"={{$json.callback_query.data}}","rightValue":"manual_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"manual"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"5eeb9b3f-d4ce-45f6-bb62-32244fd9a99a","leftValue":"={{ $json.message.photo[0] }}","rightValue":"","operator":{"type":"object","operation":"exists","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"image"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"2f1495ad-2eb2-4729-af5a-23c949adce8c","leftValue":"={{$json.callback_query.data}}","rightValue":"dish_yes_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"dish_yes"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"leftValue":"={{$json.callback_query.data}}","rightValue":"dish_no_","operator":{"type":"string","operation":"startsWith"},"id":"c9ead52e-1b81-453a-bd9b-1d18dcbd82bb"}],"combinator":"and"},"renameOutput":true,"outputKey":"dish_no"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"646db5d3-3518-4edf-9374-cef371fa7ba9","leftValue":"={{$json.callback_query.data}}","rightValue":"alt_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"alt"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"1bcf1e75-3e73-465b-8bbb-2665b845e7e9","leftValue":"={{$json.callback_query.data}}","rightValue":"weight_","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"renameOutput":true,"outputKey":"weight"},{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"6166763a-38e9-494a-aea0-20bdc9626314","leftValue":"={{ $json.message.text }}","rightValue":"/","operator":{"type":"string","operation":"exists","singleValue":true}}],"combinator":"and"},"renameOutput":true,"outputKey":"text_cmd"}]},"options":{}},"type":"n8n-nodes-base.switch","typeVersion":3.2,"position":[-4464,1072],"id":"47364896-8015-4659-b5e5-0118e2433fe8","name":"Switch1","disabled":true},{"parameters":{"tableId":"profiles","fieldsUi":{"fieldValues":[{"fieldId":"telegram_id","fieldValue":"={{ $('Switch').item.json.message.from.id }}"},{"fieldId":"first_name","fieldValue":"={{ $('Switch').item.json.message.from.first_name }}"},{"fieldId":"username","fieldValue":"={{ $('Switch').item.json.message.from.username }}"},{"fieldId":"locale","fieldValue":"={{ $('Switch').item.json.message.from.language_code }}"},{"fieldId":"created_at","fieldValue":"={{ new Date().toISOString() }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[-3408,-272],"id":"a6a31b4f-86c6-4bf8-9e4b-631f712375ad","name":"CREATE profile","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"tableId":"meals","fieldsUi":{"fieldValues":[{"fieldId":"chat_id","fieldValue":"={{ $('parseJSON').item.json.chat_id }}"},{"fieldId":"dish","fieldValue":"={{ $json.message.content.dish }}"},{"fieldId":"grams","fieldValue":"={{ $('parseJSON').item.json.grams }}"},{"fieldId":"kcal","fieldValue":"={{ $json.message.content.kcal }}"},{"fieldId":"prot","fieldValue":"={{ $json.message.content.prot }}"},{"fieldId":"fat","fieldValue":"={{ $json.message.content.fat }}"},{"fieldId":"carb","fieldValue":"={{ $json.message.content.carb }}"},{"fieldId":"eaten_at","fieldValue":"={{ $('parseJSON').item.json.eaten_at }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[-2400,64],"id":"8b721fc8-086c-4f99-93dc-bf2d85398f77","name":"CREATE meals","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"11bc0d87-40a0-4a39-b576-9fbb5f7535e8","leftValue":"={{ $json.message.content }}","rightValue":"{","operator":{"type":"string","operation":"startsWith"}}],"combinator":"and"},"options":{}},"type":"n8n-nodes-base.if","typeVersion":2.2,"position":[-3248,144],"id":"c23ec87b-4ae6-4c85-ad00-98463a279ac5","name":"IF 2"},{"parameters":{"chatId":"={{ $('Switch').item.json.message.from.id }}","text":"=*Привет, {{ $('Switch').item.json.message.from.first_name }}!*\n\nЯ помогу тебе отслеживать рацион, считать КБЖУ и подсказывать, как питаться лучше.\n\n🧾 *Как начать:*\n📸 Просто *отправь фото еды* — я распознаю блюдо и рассчитаю КБЖУ. \n🧠 Каждое блюдо *сохраняется в твоём дневнике* — можно вернуться, пересмотреть и задать вопросы. \n📬 *Каждый вечер* я присылаю краткий отчёт и даю рекомендации на завтра.\n\n📝 *Можно вводить вручную:* \nПример: _/v омлет 2 яйца 09:00_\n\n⚖️ Если не знаешь вес — опиши на глаз, я прикину сам.\n\nГотов? Тогда начинаем — *просто пришли фото!*","additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-3200,-224],"id":"ca337e78-64cc-4c64-bca9-17c1ea866ed3","name":"start","webhookId":"da4a8d3c-0d67-480c-a25d-4844309807d2","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"chatId":"={{ $('extract').item.json.chat_id }}","text":"={{ $json.message.content }}","additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-3024,240],"id":"ac45a9e6-7b89-4e5d-bc57-13f0111eeb27","name":"ERROR","webhookId":"da4a8d3c-0d67-480c-a25d-4844309807d2","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"chatId":"={{ $('parseJSON').item.json.chat_id }}","text":"=*{{ $json.dish }} – {{ $json.grams }} г*\n\n*Калорий:* {{ $json.kcal }}\n*Б:* {{ $json.prot }} *Ж:* {{ $json.fat }} *У:* {{ $json.carb }}\n\n✔️ _сохранил в память_","replyMarkup":"inlineKeyboard","inlineKeyboard":{"rows":[{"row":{"buttons":[{"text":"🚫 не сохранять","additionalFields":{"callback_data":"=cancel_{{ $json.id }}"}}]}}]},"additionalFields":{"appendAttribution":false,"parse_mode":"Markdown"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-2224,64],"id":"d88c0638-258c-4cff-b281-efae3273f1bc","name":"OK","webhookId":"da4a8d3c-0d67-480c-a25d-4844309807d2","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"content":"## [включать только для настройки]\n\n","height":432,"width":598,"color":5},"id":"c9c6e80a-9912-412e-9a76-1e0116a3072d","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-4768,992],"typeVersion":1},{"parameters":{"operation":"getAll","tableId":"profiles","returnAll":true,"filters":{"conditions":[{"keyName":"telegram_id","condition":"eq","keyValue":"={{ $json.message.from.id }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[-3792,-240],"id":"ce283995-c8bb-44a8-ab2c-edc7f5a344c8","name":"GET profile","alwaysOutputData":true,"credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"loose","version":2},"conditions":[{"id":"dbd664b4-20b3-4d51-8000-20892b93782d","leftValue":"={{ Object.keys($items(\"GET profile\")[0].json || {}).length }}","rightValue":0,"operator":{"type":"number","operation":"equals"}}],"combinator":"and"},"looseTypeValidation":true,"options":{}},"type":"n8n-nodes-base.if","typeVersion":2.2,"position":[-3600,-240],"id":"b0e56ab9-830e-4308-b243-4bc5429ee3e9","name":"IF NO"},{"parameters":{"model":{"__rl":true,"value":"gpt-4.1","mode":"list","cachedResultName":"gpt-4.1"},"options":{}},"type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","typeVersion":1.2,"position":[-3024,704],"id":"87d7d1a7-4e34-447f-8e1b-c3708e54c5f2","name":"OpenAI","credentials":{"openAiApi":{"id":"PvUURuR361IXH0ve","name":"OpenAi account"}}},{"parameters":{"chatId":"={{ $json.chat_id }}","text":"={{ $json.content }}","additionalFields":{"appendAttribution":false,"parse_mode":"MarkdownV2"}},"type":"n8n-nodes-base.telegram","typeVersion":1.2,"position":[-2368,560],"id":"2167b5a3-2649-410a-a1b6-1432a5f418e7","name":"Telegram","webhookId":"ce8565f7-fca8-4e4e-b9ba-109e833298a3","credentials":{"telegramApi":{"id":"R8VDF53JH3mzhoHd","name":"Telegram dieta"}}},{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"336d64ed-3993-434e-9bbd-abb9f3c777f3","leftValue":"={{ $json.summary_md }}","rightValue":"","operator":{"type":"string","operation":"exists","singleValue":true}}],"combinator":"and"},"options":{}},"type":"n8n-nodes-base.if","typeVersion":2.2,"position":[-3472,736],"id":"9eb724a0-8e6d-412c-bb9b-c19a0f00c322","name":"If"},{"parameters":{"method":"POST","url":"https://lsdfsdfsdffdssdfgdsmuxv.supabase.co/rest/v1/rpc/get_current_summary","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","sendHeaders":true,"headerParameters":{"parameters":[{"name":"apikey","value":"KEY"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"_chat_id","value":"={{ $json.chat_id }}"}]},"options":{}},"type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[-3648,736],"id":"97736d2f-06bf-4867-92c2-2d3db4c5e83f","name":"SUPA digest","executeOnce":false,"alwaysOutputData":true,"credentials":{"httpHeaderAuth":{"id":"8MpbqGPzLpfPWyM8","name":"Header Auth account"}}},{"parameters":{"assignments":{"assignments":[{"id":"64fb8515-cda5-462c-afcf-2c9865a3631d","name":"hasDigest","value":false,"type":"boolean"}]},"includeOtherFields":true,"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[-3232,720],"id":"005f2615-542b-46fa-8a76-9cb03b0948e6","name":"NO DIGEST"},{"parameters":{"assignments":{"assignments":[{"id":"08b17997-5514-4157-9518-365744b2a556","name":"hasDigest","value":true,"type":"boolean"}]},"includeOtherFields":true,"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[-3232,560],"id":"01c85f51-adc6-46d2-9446-7c61bde6d647","name":"YES DIGEST"},{"parameters":{"operation":"getAll","tableId":"meals","matchType":"allFilters","filters":{"conditions":[{"keyName":"chat_id","condition":"eq","keyValue":"={{ $('Switch').item.json.message.from.id }}"},{"keyName":"eaten_at","condition":"gte","keyValue":"={{ (() => {\n // «сейчас» в Москве\n const now = new Date(new Date()\n .toLocaleString('en-US', { timeZone: 'Europe/Moscow' }));\n\n // минус 7 суток\n now.setDate(now.getDate() - 7);\n\n // ставим начало дня и возвращаем ISO +03:00\n now.setHours(0,0,0,0);\n return now.toISOString().replace('Z','+03:00');\n})() }}\n"},{"keyName":"eaten_at","condition":"lte","keyValue":"={{ (() => {\n const now = new Date(new Date()\n .toLocaleString('en-US', { timeZone: 'Europe/Moscow' }));\n return now.toISOString().replace('Z','+03:00');\n})() }}\n"},{"keyName":"deleted","condition":"is","keyValue":"false"}]}},"type":"n8n-nodes-base.supabaseTool","typeVersion":1,"position":[-2864,704],"id":"510dd810-d7ec-4b33-a858-0f680a16ba49","name":"get_week_meals","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"content":"## [основной триггер]\n\n","height":272,"width":298},"id":"6aa8616c-d2e4-4f2b-92cb-e343f5c2e43c","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-4528,560],"typeVersion":1},{"parameters":{"mode":"runOnceForEachItem","jsCode":"const escapeMdV2 = s =>\n s.replace(/[_*[\\]()~`>#+\\-=|{}.!]/g, '\\\\$&');\n\nif (item.json.output) {\n item.json.output = escapeMdV2(item.json.output);\n}\nreturn item;\n"},"type":"n8n-nodes-base.code","typeVersion":2,"position":[-2704,560],"id":"c65c19fe-511e-4dc6-b4c8-883f9393f98b","name":"Escape"},{"parameters":{"assignments":{"assignments":[{"id":"442870a4-1075-4f7c-bdce-f6011d4c93da","name":"chat_id","value":"={{ $json.message.chat.id }}","type":"string"},{"id":"d38f3a89-b513-46c0-b960-ba64a754bd58","name":"session_id","value":"={{ 'user_' + $json.message.chat.id }}","type":"string"},{"id":"8d169f91-297e-494d-8260-224ef6f88cba","name":"role","value":"user","type":"string"},{"id":"011e9af4-a978-4985-bf28-dbafcb4fa2e9","name":"content","value":"={{ $json.message.text }}","type":"string"},{"id":"3ad625a1-0bdd-48cf-901b-d1306d890628","name":"username","value":"={{ $json.message.from.username }}","type":"string"},{"id":"c4c0ac19-2cdd-451b-b0f0-7829e06bd7b6","name":"first_name","value":"={{ $json.message.from.first_name }}","type":"string"},{"id":"c270f762-1398-45d2-a58c-883b5f512bd3","name":"metadata","value":"={{ JSON.stringify($json) }}","type":"string"}]},"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[-3824,640],"id":"fc32bc09-bcb2-478c-a68e-d76374a9ae29","name":"User Log"},{"parameters":{"tableId":"chat_logs","fieldsUi":{"fieldValues":[{"fieldId":"chat_id","fieldValue":"={{ $json.chat_id }}"},{"fieldId":"session_id","fieldValue":"={{ $json.session_id }}"},{"fieldId":"role","fieldValue":"={{ $json.role }}"},{"fieldId":"content","fieldValue":"={{ $json.content }}"},{"fieldId":"username","fieldValue":"={{ $json.username }}"},{"fieldId":"first_name","fieldValue":"={{ $json.first_name }}"},{"fieldId":"metadata","fieldValue":"={{ $json.metadata }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[-3648,560],"id":"6809455e-17ae-43fe-85f4-90ebaa50a84b","name":"Save User Msg","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"tableId":"chat_logs","fieldsUi":{"fieldValues":[{"fieldId":"chat_id","fieldValue":"={{ $('Bot Log').item.json.chat_id }}"},{"fieldId":"session_id","fieldValue":"={{ $('Bot Log').item.json.session_id }}"},{"fieldId":"role","fieldValue":"={{ $('Bot Log').item.json.role }}"},{"fieldId":"content","fieldValue":"={{ $('Bot Log').item.json.content }}"},{"fieldId":"metadata","fieldValue":"={{ $('Bot Log').item.json.metadata }}"}]}},"type":"n8n-nodes-base.supabase","typeVersion":1,"position":[-2208,560],"id":"9feb58a1-c00c-4fd0-aea7-2598bfb1188b","name":"Save Bot Msg","credentials":{"supabaseApi":{"id":"OoOx3pPUNd1lRJTr","name":"Supabase account"}}},{"parameters":{"assignments":{"assignments":[{"id":"03bc3c9d-7d1b-4f70-999d-115edccd98dd","name":"chat_id","value":"={{ $('User Log').item.json.chat_id }}","type":"string"},{"id":"9093739a-9c1b-4b54-8487-9a79272b6892","name":"session_id","value":"={{ $('User Log').item.json.session_id }}","type":"string"},{"id":"4bc4cf2d-63c7-49f3-bae8-7d08160305ca","name":"role","value":"assistant","type":"string"},{"id":"494392e4-828d-4fd6-a70b-af2c9e050558","name":"content","value":"={{ $json.output }}","type":"string"},{"id":"581ad272-fd98-4fa1-8bb1-b985f816079d","name":"metadata","value":"={{ JSON.stringify($json) }}","type":"string"}]},"options":{}},"type":"n8n-nodes-base.set","typeVersion":3.4,"position":[-2528,560],"id":"54206087-4a48-4835-9a55-3c18eee2ed80","name":"Bot Log"},{"parameters":{"promptType":"define","text":"={{ $('Switch').item.json.message.text }}","options":{"systemMessage":"=Ты дипломированный нутрициолог. Твоя задача отвечать на вопросы пользователя и консультировать его. Веди себя как профессионал, но старайся общаться достаточно естественно, так как беседа ведется в мессенджере.\n\nНа вход получаешь:\n1. Отчет по питанию для клиента за прошедший день: {{ $json.summary_md }}\n2. kcal за день: {{ $json.kcal }}\n3. fat: {{ $json.fat }}\n4. carb: {{ $json.carb }}\n5. prot: {{ $json.prot }}\n6. hasDigest: {{ $json.hasDigest }}\n\n• Если отчет за день есть, а hasDigest = true → используй этот отчет в качестве основного источника данных при осставлении рекомендаций для человека и ответа на его вопросы. \n• Если инфы нет, а hasDigest = false → значит просто не учитывай эту информацию (не обязательно уведомлять человека) и общайся, стараясь быть ценным для собеседника\n• У тебя есть доступ к инструменту \"get_today_meals\" который дает доступ к полному рациону питания человека за последние две недели, используй его при необходимости.\n\n- Формат сообщения должен быть Markdown для телеграм, для жирного шрифта используй одну * в начале и в конце, а для курсива _ вместо ** (ПРИМЕР: *жирный*, _курсив_).\n- Разрешается использовать тематические эмоджи где уместно.\n- Используй жирный *только для целых слов или фраз*, курсив — тоже для целых слов.\n- Не вставляй * внутри markdown-заголовков и списков.\n"}},"type":"@n8n/n8n-nodes-langchain.agent","typeVersion":1.9,"position":[-3024,560],"id":"cba58739-8392-49bc-96b5-a0e2ebe14147","name":"nutrion 2"}],"connections":{"Switch":{"main":[[{"node":"GET profile","type":"main","index":0}],[{"node":"extract","type":"main","index":0}],[{"node":"User Log","type":"main","index":0}]]},"parseJSON":{"main":[[{"node":"nutrion","type":"main","index":0}]]},"When Executed by Another Workflow":{"main":[[{"node":"Switch","type":"main","index":0}]]},"extract":{"main":[[{"node":"parser","type":"main","index":0}]]},"nutrion":{"main":[[{"node":"CREATE meals","type":"main","index":0}]]},"parser":{"main":[[{"node":"IF 2","type":"main","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Switch1","type":"main","index":0}]]},"Switch1":{"main":[[],[],[],[],[],[],[{"node":"Switch","type":"main","index":0}]]},"CREATE profile":{"main":[[{"node":"start","type":"main","index":0}]]},"IF 2":{"main":[[{"node":"parseJSON","type":"main","index":0}],[{"node":"ERROR","type":"main","index":0}]]},"CREATE meals":{"main":[[{"node":"OK","type":"main","index":0}]]},"GET profile":{"main":[[{"node":"IF NO","type":"main","index":0}]]},"IF NO":{"main":[[{"node":"CREATE profile","type":"main","index":0}],[{"node":"start","type":"main","index":0}]]},"OpenAI":{"ai_languageModel":[[{"node":"nutrion 2","type":"ai_languageModel","index":0}]]},"SUPA digest":{"main":[[{"node":"If","type":"main","index":0}]]},"If":{"main":[[{"node":"YES DIGEST","type":"main","index":0}],[{"node":"NO DIGEST","type":"main","index":0}]]},"YES DIGEST":{"main":[[{"node":"nutrion 2","type":"main","index":0}]]},"NO DIGEST":{"main":[[{"node":"nutrion 2","type":"main","index":0}]]},"get_week_meals":{"ai_tool":[[{"node":"nutrion 2","type":"ai_tool","index":0}]]},"Escape":{"main":[[{"node":"Bot Log","type":"main","index":0}]]},"Telegram":{"main":[[{"node":"Save Bot Msg","type":"main","index":0}]]},"User Log":{"main":[[{"node":"Save User Msg","type":"main","index":0},{"node":"SUPA digest","type":"main","index":0}]]},"Bot Log":{"main":[[{"node":"Telegram","type":"main","index":0}]]},"nutrion 2":{"main":[[{"node":"Escape","type":"main","index":0}]]}},"settings":{"executionOrder":"v1"},"staticData":null,"meta":{"templateCredsSetupCompleted":true},"pinData":{},"versionId":"03f13c10-304e-4181-b6d0-c15852a55dae","activeVersionId":null,"triggerCount":0,"shared":[{"updatedAt":"2025-11-30T14:22:55.223Z","createdAt":"2025-11-30T14:22:55.223Z","role":"workflow:owner","workflowId":"kohwX0oaY0hmL9b2","projectId":"sYuiFAb87pAir6jV"}],"activeVersion":null,"tags":[]} \ No newline at end of file