Разработки проекта PuppyRus > Программирование и компиляция

Телеграм бот на bash

(1/2) > >>

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
--- Конец кода ---

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии