Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Ошибка: Призрачное пустое сообщение в Telegram при отправке из стороннего скрипта

    Ошибка: Призрачное пустое сообщение в Telegram при отправке из стороннего скрипта

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Ошибка: Призрачное пустое сообщение в Telegram при отправке из стороннего скрипта, RouterOS
     
    DyadyaGenya
    Guest
    #1
    0
    29.03.2025 11:02:00
    У меня есть скрипт/функция для отправки сообщений в Telegram. В целом всё работает нормально, но если попытаться отправить более двух сообщений подряд из стороннего скрипта, появляется фантомное пустое сообщение. Это происходит только между вторым и третьим сообщением. После третьего можно отправить ещё пару десятков сообщений, и фантомных сообщений больше не возникает. Проблема появляется исключительно при отправке из одного стороннего скрипта. Если же логика отправки находится внутри скрипта с самой функцией, то проблема не проявляется. Пока что я придумал пару способов обойти этот фантом:

    1. Добавить проверку на пустое сообщение в самой функции.
    2. Сделать некий обёртку при отправке сообщений из стороннего скрипта.

    Вот текст моего скрипта с функцией отправки сообщений:

    # Конфигурация бота
    :global botConfig
    :if ([:typeof $botConfig] != "array") do={ :set botConfig [:toarray ""] }
    :set ($botConfig->"Telegram") {
       "botToken"="XXXXXXXXXXXXXXXXXXXXX";
       "mainID"="XXXXXXXXXXXX"
    }

    # Функция для формирования URL
    :global botUrl do={
       :global botConfig
       :return ("https://api.telegram.org/bot" . ($botConfig->"Telegram"->"botToken"))
    }

    # Функция сериализации массива в JSON
    :global arrayToJson do={
       :local array $1
       :local result "{"
       :local first true
       :foreach key,value in=$array do={
           :if ($first) do={:set first false} else={:set result ($result . ",")}
           :set result ($result . "\"" . $key . "\": \"" . $value . "\"")
       }
       :set result ($result . "}")
       :return $result
    }

    # Функция отправки сообщения
    :global sendTelegramMessage
    :set sendTelegramMessage do={
       :global botUrl
       :global botConfig
       :global arrayToJson
       
       :local message $1
       :local chatId $2
       
       :if ([:typeof $chatId] = "nothing" || $chatId = "") do={
           :set chatId ($botConfig->"Telegram"->"mainID")
       }
       
       # Защита от пустых сообщений
       :if ([:len $message] = 0) do={
           :put "Пропускаем пустое сообщение"
           :return false
       }
       
       :local data {"chat_id"=$chatId; "text"=$message}
       :local jsonString [$arrayToJson $data]
       :put "Отправка: $jsonString"
       
       :local url ([$botUrl] . "/sendMessage")
       :local result [/tool fetch mode=https \
           url=$url \
           http-method=post \
           http-header-field="Content-Type: application/json" \
           http-data=$jsonString \
           output=user \
           as-value]
       :put "Результат: $result"
       
       # Исправление: записываем данные в переменную
       :local response ($result->"data")
       :put "Ответ: $response"
       
       :return ($result->"status" = "finished")
    }

    # Тест отправки
    [$sendTelegramMessage "Test message 1"]
    [$sendTelegramMessage "Another test message 2" "XXXXXXXXX"]
    [$sendTelegramMessage "Test message 3"]
    [$sendTelegramMessage "Test message 4"]

    Если отправлять из другого скрипта вот так:

    :global sendTelegramMessage
     [$sendTelegramMessage "Test message 1"]
     [$sendTelegramMessage "Another test message 2" "XXXXXXXXXX"]
     [$sendTelegramMessage "Test message 3"]
     [$sendTelegramMessage "Test message 4"]

    То появляется глупое сообщение. Но если обернуть так:

    :global sendTelegramMessage
       :put [$sendTelegramMessage "Test message 1"]
       :put [$sendTelegramMessage "Another test message 2" "XXXXXXXXXXXX"]
       :put [$sendTelegramMessage "Test message 3"]
       :put [$sendTelegramMessage "Test message 4"]

    Или так:

    :global sendTelegramMessage
       :local result1 [$sendTelegramMessage "Test message 1"]
       :put "Результат 1: $result1"
       :local result2 [$sendTelegramMessage "Another test message 2" "XXXXXXXXXXXX"]
       :put "Результат 2: $result2"
       :local result3 [$sendTelegramMessage "Test message 3"]
       :put "Результат 3: $result3"
       :local result4 [$sendTelegramMessage "Test message 4"]
       :put "Результат 4: $result4"

    То фантомное сообщение не появляется. Кто-нибудь может подсказать, откуда берётся этот фантом и как с ним бороться? У меня RouterOS 7.10.2.
     
     
     
    Sertik
    Guest
    #2
    0
    29.04.2025 06:47:00
    Rex ответил тебе. Это давно известная ошибка в RouterOS, о которой я, например, писал здесь https://habr.com/ru/articles/646663/. Она касается не только твоей функции для Telegram, а вообще всех функций. Если вызвать любую функцию подряд два раза (без присвоения результата), она выполнится три раза! Можешь проверить на любой своей функции. Простая проверка в теле функции решает проблему: :if ([$len $0]!=0) do={ }.
     
     
     
    rextended
    Guest
    #3
    0
    29.04.2025 07:57:00
    Приходить сюда и писать «есть альтернативное решение твоей задачи, но оно сложнее» (к тому же не работает) — это не лучшее решение... а раз уж там что-то нужно добавить, почему бы просто не сделать :return "" в конце, вместо :if ([$len $0]!=0) do={} в начале??? К тому же $len — НЕПРАВИЛЬНО (правильно :len), так какой вообще тест он делал?
    :if ([$len [:nothing]]!=0) do={:put true} else={:put false}

    :if ([$len ""]!=0) do={:put true} else={:put false}

    :if ([$len "xxx"]!=0) do={:put true} else={:put false} — всегда true.
     
     
     
    optio
    Guest
    #4
    0
    29.04.2025 15:30:00
    Я что-то пропускаю или почему просто не вызвать функцию без квадратных скобок [$echo “”], и тогда нет проблем с возвращаемым значением, даже если вызывать её несколько раз?
    :local echo do={  
     :put "Called with: $1"  
     <здесь тоже может быть бессмысленный return>  
    }  
    $echo "A"  
    $echo "B"  
    $echo "C"  
    $echo "D"  
    $echo "E"  
    $echo "F"  

    > /system/script/run script1  
    Called with: A  
    Called with: B  
    Called with: C  
    Called with: D  
    Called with: E  
    Called with: F  

    или что-то в таком духе:  
    :local echo do={  
     :return "Called with: $1"  
    }  
    :put [$echo "A"]
    $echo  
    :put [$echo "B"]
    $echo 1  
    :put [$echo "C"]
    $echo "something"  
    :put [$echo "D"]
    $echo nil  
    :put [$echo "E"]
    $echo [:nothing]
    :put [$echo "F"]

    > /system/script/run script1  
    Called with: A  
    Called with: B  
    Called with: C  
    Called with: D  
    Called with: E  
    Called with: F  

    В любом случае, вызов функции в квадратных скобках стоит использовать только тогда, когда нужно обработать возвращаемое значение…
     
     
     
    rextended
    Guest
    #5
    0
    29.04.2025 16:54:00
    Кажется, вы пропустили предыдущие сообщения, всё началось с этого поста: http://forum.mikrotik.com/t/bug-phantom-empty-message-in-telegram-when-sending-from-a-third-party-script/182925/1, и мы обсуждаем, как был написан этот скрипт и почему при таком способе написания возникают ошибки.
     
     
     
    rextended
    Guest
    #6
    0
    29.04.2025 16:58:00
    Честно говоря, надоело сто раз везде на форуме одно и то же повторять. Смиритесь. Мне надоело постоянно всё доказывать, а люди всё время пытаются опровергнуть (даже пишут неправду, не проверив, как в посте перед вашим). Если вам так хорошо получается бесконечно доказывать обратное очевидному, то вы же умеете делать свои скрипты. Если вам не нравится то, что я пишу, просто не читайте.
     
     
     
    optio
    Guest
    #7
    0
    29.04.2025 16:59:00
    Окей, понял, в целом скрипт OP плохой… Что касается названия темы, «баг» решается правильным вызовом функций.
     
     
     
    optio
    Guest
    #8
    0
    29.04.2025 17:03:00
    Что касается бесполезного заполнителя return, я просто хотел подчеркнуть, что он никак не влияет на возникновение «багов», даже если по какой-то причине существует, когда функция вызывается без квадратных скобок. Это не относится к твоему примеру.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры