Здравствуйте.
Настроил WB7 для отправки уведомлений через телеграм-бота и обнаружилась проблема. Суть.
На контроллере работают два сетевых интерфейса: wb-gsm-sim1 и wb-eth0.
wb-gsm-sim1 – модем с доступом в интернет.
wb-eth0 – LAN, “смотрит” во внутреннюю сеть, доступ в интернет тоже есть, но своеобразный. Поскольку контроллер установлен в школе, то доступ осуществляется через прокси провайдера, который выход на многие ресурсы блочит контент-фильтром. Можно, конечно, и без прокси получить доступ, но для этого нужно авторизоваться в браузере через Госуслуги раз в день, что на WB сделать не получится.
Для отправки ТГ-уведомлений нужен доступ к api.telegram.org, но ресурс заблокирован провайдером.
Попробовал разнести интерфейсы по приоритетам. Вроде, работает, но, периодически, из-за того, что, видимо, “плавает” мобильная связь, контроллер переключается на wb-eth0 и уведомления не доходят.
Подскажите, пожалуйста, можно ли сделать так, чтобы внешний трафик проходил через модем, а внутренний – через проводной интерфейс?
Добрый день!
Попробуйте выполнить настройку следующим образом — возможно, такой вариант поможет решить проблему.
Получается, что интерфейс с модемом по-умолчанию обращается к localhost, который доступен всегда и на основе этого будут отсутствовать причины для переключения на сетевой интерфейс.
Я правильно понял логику?
Добрый день.
Да, все верно.
К сожалению, контроллер всё равно переключается на проводное соединение. Может, есть какие-то другие пути?
Добрый день!
Попробуйте настроить статический IP-адрес в локальной сети без указания основного шлюза. В таком случае контроллер не будет иметь маршрута по умолчанию и должен перестать маршрутизировать трафик в локальную сеть.
Вариант без шлюза тоже не сработал – всё равно переключается. Решили проблему по другому. Написали заявку провайдеру, чтобы сняли блок на ТГ, прописали прокси в /etc/environment. Пока, вроде, работает.
В любом случае, спасибо за помощь.
Проблему, решил, но она не решилась.
Обнаружилось следующее.
Если пишу в консоли команду
curl -s -X POST https://api.telegram.org/bot123:ABC/sendMessage -d chat_id=-123 -d text="Текст сообщения"
то всё проходит – консоль возвращает результат выполнения команды.
Если в рамках работы правила исполняется такая функция:
function send_message_telegram(text_message){
var token = "123:ABC";
var chat_id = -123;
var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
runShellCommand(command);
}
то в логах появляется такая ошибка:
ERROR: command '/bin/sh -c curl -s -X POST https://api.telegram.org/bot123:ABC/sendMessage -d chat_id=-123 -d text="Текст сообщения"' failed with exit status 60
Информации о загадочном статусе 60 у меня найти не получилось. Предположу, что если под root работает, а из правил – нет, значит каких-то прав не хватает, что ли?
В консоли выполняете из bash, в скрипте из sh - ожидаете совершенно одинаковый вывод? А что в stderr и stdout выводится, включите и выведите в лог - интересно.
Ну и, кстати, а почему не использовать готовый и отлаженный бот? Например Телеграм-бот на wb-rules
В консоли выполняете из bash, в скрипте из sh - ожидаете совершенно одинаковый вывод?
Спасибо, не знал про такие нюансы.
Да, пробовал программно перехватывать сообщения вот так:
function send_message_telegram(text_message){
var token = "123:ABC";
var chat_id = -123;
var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
runShellCommand(command, {
captureOutput: true,
captureErrorOutput: true,
exitCallback: function (exitCode, capturedOutput, capturedErrorOutput)
{
log("cmd output: " + capturedOutput);
log("cmd Erroroutput: " + capturedErrorOutput);
}
});
}
После cmd output и cmd Erroroutput – пусто.
Ну и, кстати, а почему не использовать готовый и отлаженный бот?
Пробовал на другом контроллере его запустить и что-то не заладилось у меня с ним, поэтому на текущем контроллере даже не думал про него. Попробую, однако.
Телеграм-бот на wb-rules тоже не работает. Причем, здесь даже трудно понять, что происходит. Ниже, всё, что выводится в лог
Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Bot initialization
Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Virtual device is created
Mar 29 20:28:51 wirenboard-AG*** wb-rules[19318]: INFO: [rule info] telegram2wb: Connecting to the server...
Mar 29 20:28:52 wirenboard-AG*** wb-rules[19318]: INFO: reloading file: /etc/wb-rules/telegram2wb-logic.js
Посмотрел код модуля. Там сообщения тоже отправляются через curl, поэтому, видимо, не будет работать по причине того, что исполняется из sh.
Для примера:
function send_message_telegram(text_message){
var token = "123:ABC";
var chat_id = -123;
var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, text_message);
runShellCommand(command, {
captureOutput: true,
captureErrorOutput: true,
exitCallback: function (exitCode, capturedOutput, capturedErrorOutput)
{
log("cmd output: " + capturedOutput);
log("cmd Erroroutput: " + capturedErrorOutput);
}
});
}
send_message_telegram("simpleTest")
Выводит, вполне ожидаемое
2025-03-31 09:40:28cmd output: {"ok":false,"error_code":401,"description":"Unauthorized"}
2025-03-31 09:40:28cmd Erroroutput:
2501, stable.
Не стоит ли стороннее ПО?
Добрый день, удалось ли решить вопрос?
Здравствуйте.
Да, исключение сведений о шлюзе в настройках проводного интерфейса решило проблему. Правда, не совсем понятно, почему, когда я это сделал в первый раз, то это не помогло. Возможно, в настройках этих сведений не было, а где-то в буфере сохранились.
И еще осталось непонятным, почему команда, отправляющая сообщение в ТГ из консоли срабатывает, а из runShellCommand()
– нет.
Не отписывался, поскольку надо было убедиться, что всё работает с такими настройками сетевых интерфейсов. Две недели – полёт нормальный
Добрый день!
Рад, что всё получилось настроить!
Что касается отправки сообщения — рекомендую создать отдельный тред на форуме. Наши инженеры с удовольствием подключатся и помогут вам разобраться.