Jump to content

Управление роутером по Telegram


Recommended Posts

  • 3 weeks later...
Spoiler


BusyBox v1.27.2 () built-in shell (ash)

~ # /opt/etc/storage/tg_say.sh
-sh: /opt/etc/storage/tg_say.sh: not found
~ #

Помогите понять, что это за ошибка. Все установлено, что ему еще не хватает?

Даже просто скрипт с wget идет с ошибкой. Первый раз начал работать с такими скриптами, прошу не пинать.

Link to comment
Share on other sites

  • 4 weeks later...
23 минуты назад, emlen сказал:

ценное замечание))) а всетаки по поводу торушки?

а по поводу тора, то что в профильной теме описано, ip  сабжа в ipset , dnsы в dnsmasq который будет их транслировать в ipsetы и правила iptables с редиректом всего этого счастья в тор прокси. по типу такого https://github.com/blackcofee/rublock-tor/wiki/Home-RU

Edited by r13
  • Thanks 2
Link to comment
Share on other sites

Доброго времени суток.

На ентваре стоит Тор из этой статьи, вариант 1. Работает замечательно.

Можноли как-то что башбот работал через прокси?

Edited by Павел
Link to comment
Share on other sites

Доброго времени суток.
На ентваре стоит Тор из этой статьи, вариант 1. Работает замечательно.
Можноли как-то что башбот работал через прокси?
типа если статью из предыдущего сообщения под нас перекроить, кто бы из знающих хаутуху запилил

GIGA II

Link to comment
Share on other sites

  • 2 weeks later...

вообщем все оказалось очень просто, параметр --socks5 в вызове curl и дело в шляпе

GIGA II

Link to comment
Share on other sites

не очень жизнеспособно получилось, почему-то при работающем торе проц занят на 100 процентов((

GIGA II

Link to comment
Share on other sites

  • 2 weeks later...

есть такое дело, грузиться прилично.  И может только у меня:

скрипт запускаеться, но не работает - бот не отвечает, файлы не изменял ни как(не считая параметр --socks5) с момента как он перестал работать из-за блокириовки.

Edited by Павел
дополнил
Link to comment
Share on other sites

  • 2 weeks later...
В 10.01.2018 в 00:12, exared сказал:
Скрытый текст

 

Добавьте в скрипт приведенную ниже функцию, предварительно задав новую переменную KMSG_URL:



KMSG_URL=$URL'/sendMessage'

 



function send_keyboard {
    local text="$1"; shift 1; local keyboard=init
    OLDIFS=$IFS; IFS=$(echo -en "\"")
    for f in $*;do [ "$f" != " " ] && local keyboard="$keyboard, [\"$f\"]";done
    IFS=$OLDIFS; local keyboard=${keyboard/init, /}
    res=$(curl -s "$KMSG_URL" --header "content-type: multipart/form-data" -F "chat_id=$TARGET" -F "text=$text" -F "reply_markup={\"keyboard\": [$keyboard],\"one_time_keyboard\": false}")
}
  Скрыть содержимое

c87484e3e4258cd7b4bfe58d0f93b829.png


Аргументы функции: первый - сообщение в чате, последующие - надписи на кнопках. При нажатии на кнопку соответствующая надпись может быть использована как команда. Поэтому кириллица в аргументах функции (кроме первого) нежелательна.
Поле one_time_keyboard указывает клиенту скрыть или нет клавиатуру после использования (после нажатия на кнопку). Её по-прежнему можно будет открыть через иконку в поле ввода сообщения. По умолчаниюFalse
Пример использования:



send_keyboard "I can help you find and share classical music" "Get random music" "Send music to friends"


 

 

 

Может поможете, как использовать Inline keyboard?

Edited by John9110
Link to comment
Share on other sites

Мне с помощью телеграм бота хочется реализовать такого помощника, который всегда под рукой, который помогает решать если не повседневные, то наиболее частые задачи.

Основное - хочется в моменте получать от бота сообщения, о том, что кто-то успешно или не успешно подключается на WebUI, по FTP или подключается к серверу VPN.

В качестве команд, которые нужно отдавать боту наиболее интересна перезагрузка роутера и добавление торрента на закачку через URL на торрент файл.

Что уже сделал.

# vi /opt/bin/tg_say.sh

#  chmod +x /opt/bin/tg_say.sh

tg_say.sh:

#!/opt/bin/bash

API_TOKEN='токен моего бота'
CHAT_ID='айди моего с ботом чата'

if [ -z "$CHAT_ID" ]; then
    echo 'Please, define CHAT_ID first! See "chat":{"id":xxxxxxx string below:'
    /opt/bin/wget -qO - https://api.telegram.org/bot$API_TOKEN/getUpdates
    exit 1
fi

MSG="<b>$(hostname)</b>: $@"

/opt/bin/wget -q "https://api.telegram.org/bot$API_TOKEN/sendMessage?chat_id=$CHAT_ID&parse_mode=html&text=$MSG" 2>&1

if [ $? -eq 0 ]; then
    echo 'Message sent successfully.'
else
    echo 'Error while sending message!'
    exit 1
fi

Поправил /opt/etc/init.d/S51bashbot как тут рекомендовали с установкой screen через opkg install screen

#!/bin/sh

ENABLED=yes
PROCS=bashbot.sh
ARGS=""
PREARGS="screen -dmS bashbot.socket"
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/init.d/rc.func

И теперь пробую править bashbot.sh с помощью наработок и советов этой темы:

#!/opt/bin/bash

TOKEN='токен моего бота'
NAMEA='мой логин в телеграм'
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage?chat_id='
UPD_URL=$URL'/getUpdates?offset='
KMSG_URL=$URL'/sendMessage'
OFFSET=0
TIMEOUT='&timeout=30'


function send_message {
	res=$(curl --insecure --data-urlencode "text=$2" "$MSG_URL$1&")
}
function send_keyboard {
    local text="$1"; shift 1; local keyboard=init
    OLDIFS=$IFS; IFS=$(echo -en "\"")
    for f in $*;do [ "$f" != " " ] && local keyboard="$keyboard, [\"$f\"]";done
    IFS=$OLDIFS; local keyboard=${keyboard/init, /}
    res=$(curl -s "$KMSG_URL" --header "content-type: multipart/form-data" -F "chat_id=$TARGET" -F "text=$text" -F "reply_markup={\"keyboard\": [$keyboard],\"one_time_keyboard\": true}")
}

while true; do {
	res=$(curl --insecure $UPD_URL$OFFSET$TIMEOUT)

	TARGET=$(echo $res | JSON.sh | egrep '\["result",0,"message","chat","id"\]' | cut -f 2)
	OFFSET=$(echo $res | JSON.sh | egrep '\["result",0,"update_id"\]' | cut -f 2)
	MESSAGE=$(echo $res | JSON.sh -s | egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
	USER=$(echo $res | JSON.sh | egrep '\["result",0,"message","from","username"\]' | cut -f 2 | cut -d '"' -f 2)

	[ -z "$MESSAGE" ] || echo "[$(date +%Y.%m.%d_%H:%M:%S)][$USER] $MESSAGE" >> /opt/var/log/bashbot.log
	OFFSET=$((OFFSET+1))
	tail -f с | \
	while read line ; do
		if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi
	done
	if [ $OFFSET != 1 ]; then
		case $MESSAGE in
			'/help') send_keyboard "Bot knows commands:" "/help" "/top" "/meminfo" "/cpuinfo" "/uname" "/log";;
			'/start') msg="Just few commands are implemented. Blame @ryzhov_al if something goes wrong.";;
			'/top') msg="$(top -n1 | head -n3)";;
			'/meminfo') msg="$(cat /proc/meminfo)";;
			'/cpuinfo') msg="$(cat /proc/cpuinfo)";;
			'/uname') msg="$(uname -a)";;
			'/log') msg="$(cat /opt/var/log/bashbot.log)";;
			*) msg=$(ndmq -p "$MESSAGE" -x);;

		esac
		[ $USER = $NAMEA ] || send_message "$TARGET" "Sorry. Private bot"
		[ $USER = $NAMEA ] && send_message "$TARGET" "$msg"
	fi

} &>/dev/null; done

Но в таком виде сообщения о не успешной авторизиции приходят, но бот не реагирует на посылаемые ему команды.

Я не очень понимаю, где мне брать журнал "реального времени".

То есть для сбора логов у меня в Entware установлен syslog-ng, который собирает все логи и пишет их в файл (/opt/var/log/syslog.log) но в этом случае получается, что стоит мне перезапустить бота и он тут же высыпет мне россыпь сообщений о неудачной авторизации в WebUI (мои предыдущие тесты). А мне хочется, что бы бот начал смотреть "живой" лог роутера и парсил его на лету.

Файлов в /var/log/ у меня нет.

В общем, сейчас 2 проблемы - совместить в одном скрипте бота ответы на мои запросы и понять как парсить живой лог роутера. 

 

UPD: Кажется первая проблема решена с помощью параметра -n 0 команды tail. Теперь бот реагирует только на актуальные события, которые произошли после его запуска, а не на все, что нашел в логе. То есть часть парсера логов теперь выглядит вот так:

	tail -f -n 0 /opt/var/log/syslog.log | while read line ; do
		if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi
	done

 

Edited by ankar84
  • Upvote 1
Link to comment
Share on other sites

В итоге полное решение на данный момент это вынесение оповещательной части бота в отдельный сервис (демон). По аналогии создал /opt/bin/bashbotevent.sh:

#!/opt/bin/bash

tail -f -n 0 /opt/var/log/syslog.log | while read line ; do
	if [[ $line =~ "ndm: Core::Scgi::Auth: authentication failed for user" ]] ; then /opt/bin/tg_say.sh "$line"; fi
done

В этот скрипт со временем будут добавлять реакции на нужные мне события.

И создал новый /opt/etc/init.d/S52bashbotevent:

#!/bin/sh

ENABLED=yes
PROCS=bashbotevent.sh
ARGS=""
PREARGS="screen -dmS bashbot.socket"
DESC=$PROCS
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

. /opt/etc/init.d/rc.func

Оба сделал исполняемыми

chmod +x /opt/bin/bashbotevent.sh

chmod +x /opt/etc/init.d/S52bashbotevent

И после 

 # /opt/etc/init.d/S52bashbotevent start

Бот реагирует и на команды и присылает сообщения о не успешных попытках авторизации.

Link to comment
Share on other sites

  • 1 month later...

допилил бота, теперь при получении серого ip отправляет клавиатурку с возможностью перезапустить интерфейс.

Скрытый текст

#!/opt/bin/bash
 
TOKEN=''
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage?chat_id='
UPD_URL=$URL'/getUpdates?offset='
update_id=0
TARGET= #chat_id
KMSG_URL=$URL'/sendMessage'
proxy='--socks5 127.0.0.1:9055' # TOR
send_fw_avalible=0

send_message() {
    if [[ -z $3 ]]
    then
        res1=$(curl $proxy -s -X POST -H "Charset: UTF-8" $URL/sendMessage -d chat_id=$1 -d "text=$2")
    else
        if [[ $3 == 'inline_keyboard' ]]
        then
        inline_keyboard='{"inline_keyboard":[
        [{"text":"'$4'","callback_data":"'$5'"},
        {"text":"'$6'","callback_data":"'$7'"}]
        ]}'
        res=$(curl $proxy -s -X POST -H "Charset: UTF-8" $URL/sendMessage -d chat_id=$1 -d "reply_markup=${inline_keyboard}" -d "text=$2")
        fi
    fi
}
edit_message () {
res=$(curl $proxy -s -X POST -H "Charset: UTF-8" $URL/editMessageText -d chat_id=$callback_query_message_chat_id -d message_id=$callback_query_message_message_id -d "text=$1")
}

while true; do {
    res=''
    until [[ -n $res ]]; do {
    res=$(curl $proxy $UPD_URL$update_id)
    } done
    update_id=$(echo $res | JSON.sh | egrep '\["result",0,"update_id"\]' | cut -f 2)
    callback_query=$(echo -e $res | JSON.sh | egrep '\["result",0,"callback_query"\]' | cut -f 2)
     callback_query_data=$(echo -e $res | JSON.sh | egrep '\["result",0,"callback_query","data"\]' | cut -f 2 | cut -d '"' -f 2)
    callback_query_id=$(echo $res|JSON.sh|egrep '\["result",0,"callback_query","id"\]' | cut -f 2)
    callback_query_message_chat_id=$(echo $res|JSON.sh|egrep '\["result",0,"callback_query","message","chat","id"\]' | cut -f 2)
    callback_query_message_message_id=$(echo $res|JSON.sh|egrep '\["result",0,"callback_query","message","message_id"\]' | cut -f 2)
    callback_query_message_text=$(echo -e $res|JSON.sh|egrep '\["result",0,"callback_query","message","text"\]' | cut -f 2 | cut -d '"' -f 2)

    message_from_id=$(echo $res|JSON.sh|egrep '\["result",0,"message","from","id"\]' | cut -f 2)
    message_text=$(echo -e $res|JSON.sh|egrep '\["result",0,"message","text"\]' | cut -f 2 | cut -d '"' -f 2)
    message=$(echo -e $res|JSON.sh|egrep '\["result",0,"message"\]' | cut -f 2)
    update_id=$((update_id+1))
 # # # commands
if [ $update_id != 1 ]
then
    if [[ $message_from_id == $TARGET || $callback_query_message_chat_id == $TARGET ]]
    then
        if [[ -n $callback_query ]]
        then
            curl $proxy -s $URL/answerCallbackQuery?callback_query_id=$callback_query_id
            case $callback_query_data in
            'Breboot')
                edit_message "Сейчас будет произведен перезапуск интерфейса."
                ndmq -p 'interface PPPoE0 down' -P MESSAGE
                sleep 1
                ndmq -p 'interface PPPoE0 up' -P MESSAGE
                sleep 10
                ndmq -p 'ndns get-update auto' -P MESSAGE
                /opt/etc/init.d/S35tor restart
                ;;
            'Bnoreboot')
                edit_message "Перезапуск интерфейса не произведен. Вы можете выполнить перезапуск вручную."
                ;;
            *) ;;
            esac
        fi
            
        if [[ -n $message ]]
        then
            case $message_text in
            '/start') 
                send_message "$message_from_id" "Старт"
                ;;
            '/info')
                    
                ;;
            '/reboot') 
                send_message "$message_from_id" "Сейчас будет произведен перезапуск интерфейса."
                ndmq -p 'interface PPPoE0 down' -P MESSAGE
                sleep 1
                ndmq -p 'interface PPPoE0 up' -P MESSAGE
                sleep 10
                ndmq -p 'ndns get-update auto' -P MESSAGE
                ;;
                *) send_message "$message_from_id" "$message_text" "inline_keyboard" "Yes" "BYes" "No" "bNo";;
            esac
        fi
    else
        echo "[$(date +%Y.%m.%d_%H:%M:%S)][$message_from_id][$message_text]" >> /opt/var/log/bashbot.log
        send_message "$message_from_id" "Это приватный бот, доступ запрещен!"
    fi
else
fw_installed=$(ndmq -p 'components list beta' -x | egrep -m 1 '\<installed>'|cut -d ">" -f 2|cut -d "<" -f 1)
fw_avalible=$(ndmq -p 'components list beta' -x | egrep -m 1 '\<version>'|cut -d ">" -f 2|cut -d "<" -f 1)

if [[  "$fw_installed" != "$fw_avalible" && "$send_fw_avalible" == 0 ]]
then
send_message "$TARGET" "Возможно доступно обновление прошивки роутера." 
send_fw_avalible=1
fi
    ip_web=$(curl https://wtfismyip.com/text) #curl'ом с сайта вытаскиваем ip-адрес 
    ip_local=$(ndmq -p 'show interface PPPoE0' -x|grep address|cut -d ">" -f 2|cut -d "<" -f 1)
    ip_temp=$(tail -n 1 /opt/root/TempIP)
    if [[ -n "$ip_web" && -n "$ip_local" ]]
    then
        if [[ "$ip_web" == "$ip_local" ]]
        then
            if [[ "$ip_local" != "$ip_temp" ]]
            then
                echo $ip_local> /opt/root/TempIP
                send_message "$TARGET" "Ваш новый белый IP-адрес $ip_local"
            fi
        else
            if [[ "$ip_local" != "$ip_temp" ]]
            then
                echo $ip_local> /opt/root/TempIP
                send_message "$TARGET" "Обнаружен серый IP-адрес. Перезапустить интерфейс?" "inline_keyboard" "Yes" "Breboot" "No" "Bnoreboot"
            fi
        fi
    else
        send_message "$TARGET" "Не удалось получить IP-адрес:
IP_Web=$ip_web
IP_Local=$ip_local"
    fi
fi

} &>/dev/null; done

 

  • Upvote 4
Link to comment
Share on other sites

Цитата

Мне с помощью телеграм бота хочется реализовать такого помощника, который всегда под рукой, который помогает решать если не повседневные, то наиболее частые задачи.

Возможно, одной из интересных возможностей, которую можно добавить в функционал такого помощника, будет система домашней охранной сигнализации.
Реализация данной функции предполагает подключение (пайку) трех контактов простейшего датчика движения к монтажной плате роутера.
Соответственно, два контакта датчика должны быть подключены к питающему напряжению роутера, сигнальный контакт - к распаянной на плате функциональной кнопке.

Скрытый текст

IMG_20180130_100715.thumb.jpg.d706565d1018f4347800ab86c96b1630.jpgIMG_20180130_102914.thumb.jpg.db30ec8ee14ddf34d81aca52b40db5bf.jpgIMG_20180130_102952.thumb.jpg.57024e0d33964e3cfd3e28d9c03e8e3d.jpgIMG_20180130_103443.thumb.jpg.cd16340c6dbe8a11fbd4d030c63a01ab.jpgIMG_20180710_200533.thumb.jpg.54c5b86570fd0a505bbf0aaf3a5bb978.jpg

Внимание! При осуществлении указанных здесь действий по аппаратной модернизации роутера вы лишаетесь гарантии на ваше устройство и рискуете вывести его из строя.
Если у вас нет необходимого навыка, паяльной станции и тестера, то лучше не рисковать работоспособностью устройства.

При грамотной доработке вашего роутера вы получаете вполне рабочую систему домашней охранной сигнализации, функционал которой включает в себя:

1. Отправку сообщения о наличии движения в ваше отсутствие в чат/чаты Telegram
2. Отправку в чат/чаты фотоснимка/серии снимков/видеозаписи интересующего вас участка квартиры после срабатывания датчика (требуется IP камера)
3. Автоматическое отключение/включение рассылки тревожных сообщений во время присутствия/отсутствия дома вас и ваших близких
4. Простейший лог тревожных событий

Установите недостающий пакет:

opkg install curl

Обеспечьте жизнеспособность вашего бота в изменчивом мире, следуя рекомендациям из этой темы:

Создайте на роутере файл /opt/etc/ndm/button.d/buttons.sh
со следующим содержимым:

#!/opt/bin/bash

TOKEN='token'
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage'
CHATIDA='CHAT_ID_1'; CHATIDB='CHAT_ID_2'
MACA='00:00:00:00:00:00'; MACB='11:11:11:11:11:11'

grp() {
res=$(ndmq -x -p "show associations"|grep $1)
}

smg() {
res=$(curl --socks5 admin:password@127.0.0.1:63128 -s "$MSG_URL" -d "chat_id=$2" -d "text=$1" -d "parse_mode=markdown" -d "disable_web_page_preview=true") &> /dev/null
}

if grp $MACA; then exit 0; fi
if grp $MACB; then exit 0; fi

smg "_Обнаружено движение!_" "$CHATIDA"
smg "_Обнаружено движение!_" "$CHATIDB"

echo "$(date +"%c") MODET!" >> /opt/var/log/bashbot.log

Здесь CHAT_ID_1, CHAT_ID_2 - ID чатов, в которые отправляется тревожное сообщение
MACA, MACB - MAC адреса телефонов, при регистрации которых в домашней беспроводной сети, тревожные сообщения о движении не отправляются.

Сделайте скрипт исполняемым:

chmod +x /opt/etc/ndm/button.d/buttons.sh

Измените в интерфейсе роутера назначение задействованной в проекте кнопки на "OPKG - Запуск скриптов button.d"

Теперь при нажатии на клавишу роутера или при срабатывании датчика вам и вашим близким придет сообщение в чат Telegram.

При наличии свободной IP камеры, поддерживающей отправку фотоснимка через SFTP по команде, вы можете реализовать отправку в чат/чаты
фотоснимка/серии снимков/видеозаписи интересующего вас участка квартиры после срабатывания датчика. Я, например, реализовал эту функцию с помощью программы IP Webcam,
установленной на старый смартфон с Android на борту. Телефон, расположенный рядом с датчиком, в данном случае играет роль указанной выше IP камеры.
Конечно, большинство IP камер имеют собственный датчик движения, но приведенное здесь решение все же имеет ряд преимуществ.
В этом случае в скрипт могут быть добавлены несколько строк. В моем случае, к примеру:

#!/opt/bin/bash

TOKEN='token'
URL='https://api.telegram.org/bot'$TOKEN
MSG_URL=$URL'/sendMessage'
CHATIDA='CHAT_ID_1'; CHATIDB='CHAT_ID_2'
MACA='00:00:00:00:00:00'; MACB='11:11:11:11:11:11'; MACD='22:22:22:22:22:22'
COM_URL='http://user:password@192.168.0.2:8088/photo_save_only.jpg'

grp() {
res=$(ndmq -x -p "show associations"|grep $1)
}

smg() {
res=$(curl --socks5 admin:password@127.0.0.1:63128 -s "$MSG_URL" -d "chat_id=$2" -d "text=$1" -d "parse_mode=markdown" -d "disable_web_page_preview=true") &> /dev/null
}

if grp $MACA; then exit 0; fi
if grp $MACB; then exit 0; fi

if grp $MACD; then smg "_Обнаружено движение!_" "$CHATIDA"
smg "_Обнаружено движение!_" "$CHATIDB"
/opt/bin/curl -s $COM_URL
else smg "_Обнаружено движение! Камера оффлайн_" "$CHATIDA"
smg "_Обнаружено движение! Камера оффлайн_" "$CHATIDB"; fi

echo "$(date +"%c") MODET!" >> /opt/var/log/bashbot.log

Здесь MACD - MAC адрес телефона с установленной IP Webcam.
COM_URL - отправляемый для создания снимка HTTP запрос, в котором присутствуют данные для авторизации и IP адрес устройства.
Отправлять в чат различные графические файлы, полученные по SFTP, можно, к примеру, используя следующую конструкцию в основном скрипте bashbot.sh:

TOKEN='token''
URL='https://api.telegram.org/bot'$TOKEN
PHO_URL=$URL'/sendPhoto'
CHATIDA='CHAT_ID_1'
SDIR="/opt/alarm/*"

sph() {
res=$(curl --socks5 admin:password@127.0.0.1:63128 -s -X POST $PHO_URL -F chat_id=$2 -F photo="@$1") &> /dev/null
}

slg() {
res=$(echo "$(date +"%c") $1" >> /opt/var/log/bashbot.log)
}

for FILE in $SDIR; do filename=$(basename "$FILE"); ext="${filename##*.}"
case $ext in
jpg) sph "$FILE" "$CHATIDA"; slg "$ext";;
png) sph "$FILE" "$CHATIDA"; slg "$ext";;
gif) sph "$FILE" "$CHATIDA"; slg "$ext";;
*)
esac; rm -f $FILE; done
fi

Здесь SDIR - папка, в которую складываются полученные по SFTP графические файлы.

Еще немного дополнив скрипт, можно добавить более точные и сложные условия отключения/включения рассылки тревожных сообщений или управлять этими условиями из чата,
включать бытовую технику с поддержкой WoL в момент вашего прихода домой, реализовать возможность использования нормально закрытых датчиков на герконах (электропитание им не требуется)
в дополнение к датчику движения (соответственно, может быть организовано до трех раздельных независимых зон охраны), и многое другое.

Удачи в ваших проектах!

Edited by exared
  • Upvote 3
Link to comment
Share on other sites

25 минут назад, exared сказал:

Реализация данной функции предполагает подключение (пайку) трех контактов простейшего датчика движения к монтажной плате роутера.
Соответственно, два контакта датчика должны быть подключены к питающему напряжению роутера, сигнальный контакт - к распаянной на плате функциональной кнопке.

Просто как вариант:

Чтобы не трогать плату и корпус роутера, я делал аналогичную штуку с помощью начинки из старой USB-клавиатуры, платка из неё довольно миниатюрна. На кинетике она будет определяться как HID-устройство, а события отлавливаться с помощью triggerhappy. Модули USB HID в кинетиковской прошивке есть.

  • Upvote 4
Link to comment
Share on other sites

  • 6 months later...
  • 3 years later...

Подскажите, а можно реализовать такую штуку, что бы по отправке сообщения в ТГ боту по заданному адресу создавался файл с заданным содержанием(текстом)?

Link to comment
Share on other sites

Ктонибудь ещё пользуется ботом? Перестал работать tg_say.sh(или wget и curl)

Если сформированную им ссылку напрямую скормить wget'y, то ответ приходит: 400 bad request

Если эту же ссылку напрямую в браузер вставить, то все нормально проходит.

 

Link to comment
Share on other sites

Можно, например, через curl

#!/bin/sh

CURL_BIN="/opt/bin/curl -m 600 -k -i -X GET"

API_TOKEN=""
CHAT_ID=""

ROUTER_NAME=$(/opt/bin/uname -n)
MSG="<b>$ROUTER_NAME</b>: $@"
MSG2=${MSG// /%20}

infomsg=$($CURL_BIN "https://api.telegram.org/bot$API_TOKEN/sendMessage?chat_id=$CHAT_ID&parse_mode=HTML&text=$MSG2" 2>&1)

 

  • Thanks 1
Link to comment
Share on other sites

Ещё вопрос. bashbot.sh настроил на двух юзеров. У одного (андроид) всегда доступна кнопка дополнительной клавиатуры с командами для роутера, у другого(айфон) клава появляется только если написать /start, соответственно после выбора любой из команд клава пропадает и не появляется даже кнопочки для ее вызова. Почему так происходит?

Link to comment
Share on other sites

  • 1 month later...
В 28.01.2016 в 13:56, Александр Рыжов сказал:

Можно организовать чат с роутером, словно вы находитесь в CLI кинетика.

http://s017.radikal.ru/i433/1601/86/b92d38f5d243.png

Для этого необходимо.

  • Установить необходимые пакеты:
    opkg install bash curl dtach
     

     

  • Скачать bash-скрипт, который будет выполнять функции бота Telegram:
    curl --output /opt/bin/bashbot.sh --insecure https://raw.githubusercontent.com/ryzhovau/telegram-bot-bash/master/opt/bin/bashbot.sh
    curl --output /opt/bin/JSON.sh --insecure https://raw.githubusercontent.com/ryzhovau/telegram-bot-bash/master/opt/bin/JSON.sh
    curl --output /opt/etc/init.d/S51bashbot  --insecure https://raw.githubusercontent.com/ryzhovau/telegram-bot-bash/master/opt/etc/init.d/S51bashbot
    chmod +x /opt/bin/bashbot.sh
    chmod +x /opt/bin/JSON.sh
    chmod +x /opt/etc/init.d/S51bashbot
     

     

  • Попросить робота @BotFather создать нового бота, в ответ получите токен для его авторизации.
  • Вписать полученный токен между одинарными кавычками в строке TOKEN='' файла /opt/bin/bashbot.sh.
  • Заменить в /opt/bin/bashbot.sh строчку
    *) msg="$MESSAGE";;
     

    на строчку

    *) msg=$(ndmq -p "$MESSAGE" -x);;
     

     

  • Запустить на роутере бота, выполнив /opt/etc/init.d/S51bashbot start. Бот будет автоматически стартовать после перезагрузки роутера.

Вопросы безопасности сознательно опускаю. К примеру, вы можете настроить бота так, чтобы он отвечал на сообщения только от определённого пользователя. Все обращению к боту фиксируются в файле /opt/var/log/bashbot.log.

Приведённый пример бота — просто баловство, proof of concept. Если пожелаете, вы можете найти ему более серьёзное применение.

Настроил немного оп другому, но работает.

 

Edited by Playmax
Все получилось
Link to comment
Share on other sites

  • 1 month later...
В 06.02.2022 в 15:10, kilia сказал:

всем привет! Развернут Entware и настроен выборочный обход блокировок. Есть скрипт, который лежит в /opt/bin/unblock_vpn.sh.

Есть ли способ послать команду боту типа /update, а бот запустил этот скрипт?

Я сделал примерно вот так:
 

Скрытый текст
[..]
DOMAIN_LIST='/opt/etc/unblock.txt'
UNBLOCK_UPDATE='/opt/bin/unblock_update.sh'

  [..]
  
  case $MESSAGE in
			'/list') msg="$(cat /opt/etc/unblock.txt)";;
			'/add') msg="Send a hostname without https://";;
			'/remove') msg="Send a hostname without https://";;
			'/add '*) 
				site="${MESSAGE:5}"
				sed -i "/$site/d" $DOMAIN_LIST
				echo "$site" >> $DOMAIN_LIST
				sh $UNBLOCK_UPDATE
				msg="Added $site to the list!"
				;;
			'/remove '*)
				site="${MESSAGE:8}"
				sed -i "/$site/d" $DOMAIN_LIST
				sh $UNBLOCK_UPDATE
				msg="Removed '$site' from the list"
				;;
			'/restart')
				sh $UNBLOCK_UPDATE
				msg="Service has been restarted"
				;;
			*) msg="$MESSAGE";;
		esac
		send_message "$TARGET" "$msg"

 

 

Link to comment
Share on other sites

  • 3 months later...

Всем привет! А можно где-нибудь посмотреть лог запуска и работы бота?

Устанавливал всё по инструкции из первого поста, токен вписал, строчку с message заменил, запускается нормально, по команде /opt/etc/init.d/S51bashbot check пишет alive. Но не реагирует ни на какие стандартные сообщения, /start /top / meminfo - на всё в ответ тишина. Лог с сообщениями в папке /opt/var/log/bashbot.log тоже не появляется.

Может, он на старых роутерах и не должен работать? - keenetic III, 2.11.D.10.0-3

tgsay при этом функционирует исправно, шлёт кое-какие события из стандартного журнала роутера.

Link to comment
Share on other sites

  • 7 months later...

Ребят, знающие и понимающие, помогите, пожалуйста. Да, тема зачахла немного, но, может быть, её кто-то мониторит из старожилов. Бот у меня работает и почти выполняет свои функции.

Задача: сидеть в чате CLI с роутером; сидеть в чате с модемом (at командами); выполнять команды, заранее заготовленным списком. И вот проблема, что в любой из основных задач присутствуют команды на перезагрузку, либо роутера, либо интерфейса, либо модема, для применения. И как только бот выполняет такую задачу, всё идет по одному известному месту. Либо роутер, либо интерфейс, либо модем, падают в бутлуп. Как только бот даст команду на выполнение команды, которая влечет за собой пропадание интернета, он дожидается его восстановления и посылает команду снова. Как это можно обойти? Может как-то можно дать ему условие, что получение результата выполнения команды - не обязательно. Мол получил ответ - замечательно, вывел. Не получил - тоже ничего. Или как-то сделать, что для определенных команд, не требуется подтверждение выполнения?

Буду рад помощи.

Link to comment
Share on other sites

В 23.05.2023 в 19:14, Rodstvennik63 сказал:

Ребят, знающие и понимающие, помогите, пожалуйста. Да, тема зачахла немного, но, может быть, её кто-то мониторит из старожилов. Бот у меня работает и почти выполняет свои функции.

Задача: сидеть в чате CLI с роутером; сидеть в чате с модемом (at командами); выполнять команды, заранее заготовленным списком. И вот проблема, что в любой из основных задач присутствуют команды на перезагрузку, либо роутера, либо интерфейса, либо модема, для применения. И как только бот выполняет такую задачу, всё идет по одному известному месту. Либо роутер, либо интерфейс, либо модем, падают в бутлуп. Как только бот даст команду на выполнение команды, которая влечет за собой пропадание интернета, он дожидается его восстановления и посылает команду снова. Как это можно обойти? Может как-то можно дать ему условие, что получение результата выполнения команды - не обязательно. Мол получил ответ - замечательно, вывел. Не получил - тоже ничего. Или как-то сделать, что для определенных команд, не требуется подтверждение выполнения?

Буду рад помощи.

 вот тут бот немного для другого, но если необходимо его можно допилить для работы выполнения "левых" команд. Просто это с точки зрения безопасности дырка)) 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...