Hello, please help me solve this problem.
:local botToken "TOKEN_ID";
:local allowedChatId "CHAT_ID";
:local apiUrl "api.telegram.org";
:local fetchResultFileName "tg_updates.json";
:local result "";
:local fileFound "";
:local fullUrl ("https://" . $apiUrl . "/bot" . $botToken . "/getUpdates");
/tool fetch url=$fullUrl keep-result=no file=$fetchResultFileName;
:delay 1s;
:set fileFound [/file find name=$fetchResultFileName];
:if ([:len $fileFound] > 0) do={
:set result [/file get $fileFound contents];
/file remove $fetchResultFileName;
};
:if ([:len $result] > 0) do={
:local data [:parse $result];
:local updates ($data->"result");
:foreach update in=$updates do={
:local message ($update->"message");
:if ([:len $message] > 0) do={
:local chatId ($message->"chat"->"id");
:local text ($message->"text");
:if ($chatId = $allowedChatId) do={
:if ($text = "/delete_wg") do={
/interface wireguard remove [find name="wg-test"];
};
};
};
};
};
RouteOs 7.19.3
Error
executing script from winbox failed, please check it manually
expected end of command (line 9 column 41)
The error is on line 9, column 41, so:
1234567890123456789012345678901234567890123456789
|
/tool fetch url=$fullUrl keep-result=no file=$fetchResultFileName;
Are you sure that "file" is a valid parameter in "fetch"?
Maybe you want to use src-path instead?
AI detected ![]()
I fixed the script; it runs, but doesn't do anything. I get a message in the logs:
"No new updates in this run (possibly empty result array)."
I'm also attaching the debug log. It connects to the group, receives the message, but nothing happens.
:local botToken "TOKEN";
:local allowedChatId "ID";
:local apiUrl "api.telegram.org";
:local wgInterfaceName "wg-test"
:local lastUpdateId 0;
:local result "";
:local fullUrl "";
/log info "Telegram Bot Script: Starting execution.";
:set fullUrl ("https://" . $apiUrl . "/bot" . $botToken . "/getUpdates?offset=" . $lastUpdateId);
:set result [/tool fetch url=$fullUrl output=user as-value];
:if (($result->"status") = "finished") do={
:local data [:parse ($result->"data")];
:local updates ($data->"result");
:if ([:typeof $updates] = "array" || [:typeof $updates] = "list") do={
:foreach update in=$updates do={
:set lastUpdateId ($update->"update_id" + 1);
:local message ($update->"message");
:if ([:len $message] > 0) do={
:local chatId ($message->"chat"->"id");
:local text ($message->"text");
/log info ("Processing message from Chat ID: " . $chatId . ", Text: " . $text);
:if ([:tonum $allowedChatId] = $chatId && [:tolower $text] = "/delete_wg") do={
/log info "Command /delete_wg received and authorized. Attempting to remove interface.";
:if ([/interface wireguard find name=$wgInterfaceName] != "") do={
/interface wireguard remove [find name=$wgInterfaceName];
/log info ("Interface " . $wgInterfaceName . " removed successfully.");
} else={
/log info ("Interface " . $wgInterfaceName . " not found. Cannot remove.");
}
};
};
};
} else={
/log info "No new updates found in this run (empty result array from API).";
};
} else={
/log error ("Fetch failed: " . $result->"status" . ", Error: " . $result->"error");
}
:if ($lastUpdateId > 0) do={
/log info ("Confirming updates processed up to offset " . $lastUpdateId);
:set fullUrl ("https://" . $apiUrl . "/bot" . $botToken . "/getUpdates?offset=" . $lastUpdateId);
:do {:set result [/tool fetch url=$fullUrl output=none as-value]} on-error={ :log error "Network error during offset confirmation request." };
}
/log info "Telegram Bot Script: Finished execution.";
Download from https://api.telegram.org/botTOKEN/getUpdates?offset=0 to RAM FINISHED
No new updates in this run (possibly empty result array).
API Response: {"ok":true,"result":[{"update_id":866675605,
"message":{"message_id":5235,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765177238,"new_chat_title":"LAN events"}},{"update_id":866675606,
"message":{"message_id":5292,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765192337,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":
866675607,
"message":{"message_id":5294,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765192619,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675608,
"message":{"message_id":5294,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765192619,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675608,
:866675609,
"message":{"message_id":5303,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765193863,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"text_link","url":"tg://bot_command?command=delete_wg"}]}},{"update_id":866675610,
"message":{"message_id":5307,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765194196,"text":"/delete_wg","entities":[{"offset":0,"length
":10,"type":"bot_command"}]}},{"update_id":866675611,
"message":{"message_id":5309,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765194457,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675612,
"message":{"message_id":5378,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765261901,"text":"/delete_wg","entities":[{"offset":0,"lengt
h":10,"type":"bot_command"}]}},{"update_id":866675613,
"message":{"message_id":5380,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765262075,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675614,
"message":{"message_id":5383,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765262212,"text":"/delete_wg","entities":[{"offset":0,"leng
th":10,"type":"bot_command"}]}},{"update_id":866675615,
"message":{"message_id":5385,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765262453,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675616,
"message":{"message_id":5388,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765262716,"text":"/delete_wg","entities":[{"offset":0,"len
gth":10,"type":"bot_command"}]}},{"update_id":866675617,
"message":{"message_id":5389,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765262967,"text":"/delete_wg","entities":[{"offset":0,"length":10,"type":"bot_command"}]}},{"update_id":866675618,
"message":{"message_id":5393,"from":{"id":ID_ADMIN,"is_bot":false,"first_name":"\u0410\u043b\u0435\u043a\u0441\u0435\u0439","username":"NAME_ADMIN","language_code":"ru"},"chat":{"id":ID_GROUP,"title":"LAN events","type":"group","all_members_are_administrators":true,"accepted_gift_types":{"unlimited_gifts":false,"limited_gifts":false,"unique_gifts":false,"premium_subscription":false}},"date":1765263367,"text":"/delete_wg","entities":[{"offset":0,"le
ngth":10,"type":"bot_command"}]}}]}
At first look, it seems that guess AI doesn’t know about deserialize command. data variable is string until it’s deserialized from JSON (using :parse command for data is wrong, is not meant for deserialization), also list type doesn’t exists so it is unnecessary to check such type - [:typeof $updates] = "list". There I stopped analyzing…
Yep, the "else" that outputs "No new updates in this run (possibly empty result array)." seems to be the one corresponding to this "if":
:if ([:typeof $updates] = "array" || [:typeof $updates] = "list") do={
so the first issue is in that condition.
Thanks everyone. The code works; the /delete wg command deletes the interface.
:local botToken "MY_TOKEN";
:local allowedChatId "ID_GROUP";
:local apiUrl "api.telegram.org";
:local wgInterfaceName "wg-test"
:local lastUpdateId 0;
:local result "";
:local fullUrl "";
/log info "Telegram Bot Script: Starting execution.";
:set fullUrl ("https://" . $apiUrl . "/bot" . $botToken . "/getUpdates?offset=" . $lastUpdateId);
:set result [/tool fetch url=$fullUrl output=user as-value];
:if (($result->"status") = "finished") do={
:local data [:deserialize from=json value=($result->"data")];
:local updates ($data->"result");
:foreach update in=$updates do={
:set lastUpdateId ($update->"update_id" + 1);
:local message ($update->"message");
:if ([:len $message] > 0) do={
:local chatId ($message->"chat"->"id");
:local text ($message->"text");
/log info ("Processing message from Chat ID: " . $chatId . ", Text: " . $text);
:if ([:tonum $allowedChatId] = $chatId && $text = "/delete_wg") do={
/log info "Command /delete_wg received and authorized. Attempting to remove interface.";
:if ([/interface wireguard find name=$wgInterfaceName] != "") do={
/interface wireguard remove [find name=$wgInterfaceName];
/log info ("Interface " . $wgInterfaceName . " removed successfully.");
} else={
/log info ("Interface " . $wgInterfaceName . " not found. Cannot remove.");
}
};
};
};
} else={
/log error ("Fetch failed: " . $result->"status" . ", Error: " . $result->"error");
}
:if ($lastUpdateId > 0) do={
/log info ("Confirming updates processed up to offset " . $lastUpdateId);
:set fullUrl ("https://" . $apiUrl . "/bot" . $botToken . "/getUpdates?offset=" . $lastUpdateId);
:do {:set result [/tool fetch url=$fullUrl output=none as-value]} on-error={ :log error "Network error during offset confirmation request." };
}
/log info "Telegram Bot Script: Finished execution.";