Разработки проекта PuppyRus > Программирование и компиляция
Телеграм бот на bash
imp:
Дело было вечером, делать было нечего.
Сделано ради интереса и в пику одному товарищу, который говорил, что на bash это нельзя сделать.
Собственно - фильтр мата в групповом чате по словарю dict.txt
--- Код ---
#!/bin/bash
message_delete() {
curl -s "$api_url/$bot_id/deleteMessage?chat_id=$chat_id&message_id=$message_id" >/dev/null
let update_id=$update_id+1
curl -s "$api_url/$bot_id/getUpdates?offset=$update_id" >/dev/null
}
filter() {
for i in $(echo "$message_body")
do
o=$(grep "$i" dict.txt)
[[ "$o" = "" ]] && continue || message_delete
done
}
get_update() {
last_message=$(curl -s $api_url/$bot_id/getUpdates | tail -1)
update_id=$(curl -s $api_url/$bot_id/getUpdates | grep -Eo '\"update_id\":[0-9]*' | cut -f2 -d':' | sed 's/ /\n/g' | tail -1)
chat_id=$(echo $last_message | grep -oE '\"chat\":{\"id\":[-]?[0-9]*' | grep -oE '[-]?[0-9]+')
message_id=$(echo $last_message | grep -oE '\"message_id\":[-]?[0-9]*' | grep -oE '[-]?[0-9]+')
message_body=$(echo -e $last_message | cut -f16 -d':' | tr -d ']' | tr -d '}' | sed 's/^.//' | sed 's/.$//')
}
api_url="https://api.telegram.org"
bot_id="токен:бота"
while [ 1 ]
do
get_update
filter
done
--- Конец кода ---
krasnyh:
Про сам скрипт ничего не скажу, куда мне с моим пониманием bash. )
Но позанудствую насчет for i in $(echo "$message_body"). И без echo должно работать for i in "$message_body".
Это не вопрос ошибки, ее там нет, это скорее оптимизация, по утверждению shellcheck.net. )
Кстати, безотносительно к данному скрипту, как то натыкался на этом ресурсе и на неприятие излишнего использования cat, с обоснованием статьей википедии.
imp:
--- Цитата: krasnyh от 13 Май 2023, 22:17:31 ---Но позанудствую насчет for i in $(echo "$message_body"). И без echo должно работать for i in "$message_body".
--- Конец цитаты ---
Попробовал. Да, работает. Спасибо
o=$(grep "$i" dict.txt) заменил на
o=$(grep -io "$i" dict.txt)
-i чтобы от регистра не зависело.
-o чтобы полное совпадение искало, а то совсем люто режет.
Вообще, целью было доказательство, что бот вполне может работать на bash, а не сам фильтр.
imp:
На данный момент опробовал методы
getMe - информация о боте.
getUpdates - обновление информации (сообщения, действия в чатах)
sendMessage - отправка сообщения
deleteMessage - удаление сообщения
Столкнулся с приколами - нужно в тексте сообщения менять пробелы на +, иначе curl не отпраляет.
Также после удаления делаю getUpdates?offset=ид_последнего_обновления+1, а то в чате сообщение удаляется, в getUpdates же остается.
Данные предоставляются в json.
Таким образом, прихожу к выводу, что из сообщения надо формировать картинку и тогда отправлять. Почитать про update. Найти способ проще работать с json.
Кому интересно:
https://tlgrm.ru/docs/bots/api
imp:
Давно написал, что интересовало, но тут не отписывался. Скорее всего, это неактуально. Все же поделюсь шаблоном
--- Цитата: imp от 15 Май 2023, 10:51:06 ---Столкнулся с приколами - нужно в тексте сообщения менять пробелы на +, иначе curl не отпраляет.
--- Конец цитаты ---
Решение
--- Код ---
sender() {
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d chat_id="$chat_id" \
-d text="$MESSAGA" \
-d parse_mode="Markdown"
}
MESSAGA="Произвольный текст"
sender
--- Конец кода ---
--- Цитата: imp от 15 Май 2023, 10:51:06 ---Найти способ проще работать с json.
--- Конец цитаты ---
Нашелся jq
--- Код ---
get_update() {
TOKEN="токен"
# делаем getupdates с офсетом
response=$(curl -s "https://api.telegram.org/bot$TOKEN/getUpdates?offset=$OFFSET")
message=$(echo "$response" | jq -r '.result[-1].message.text')
chat_id=$(echo "$response" | jq -r '.result[-1].message.chat.id')
OFFSET=$(echo "$response" | jq -r '.result[-1].update_id + 1')
[ "$message" = "/че_нам_надо" ] && функция_че_нам_надо
}
while [ 1 ]
do
get_update
done
--- Конец кода ---
Навигация
Перейти к полной версии