Сайт | Скачать | Видео | Wiki

Автор Тема: Телеграм бот на bash  (Прочитано 1358 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • Автор темы
  • /dev/hands < /dev/ass
Телеграм бот на bash
« : 13 Май 2023, 20:34:32 »
Дело было вечером, делать было нечего.
Сделано ради интереса и в пику одному товарищу, который говорил, что на 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
« Последнее редактирование: 13 Май 2023, 21:48:27 от imp »
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн krasnyh

  • Ветеран
  • *****
  • Сообщений: 5359
  • Репутация: +140/-1
Re: Телеграм бот на bash
« Ответ #1 : 13 Май 2023, 22:17:31 »
Про сам скрипт ничего не скажу, куда мне с моим пониманием bash. )

Но позанудствую насчет for i in $(echo "$message_body"). И без echo должно работать  for i in "$message_body".


Это не вопрос ошибки, ее там нет, это скорее оптимизация, по утверждению shellcheck.net. )

Кстати, безотносительно к данному скрипту, как то натыкался на этом ресурсе и на неприятие излишнего использования cat, с обоснованием статьей википедии.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • Автор темы
  • /dev/hands < /dev/ass
Re: Телеграм бот на bash
« Ответ #2 : 13 Май 2023, 22:31:33 »
Но позанудствую насчет 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

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • Автор темы
  • /dev/hands < /dev/ass
Re: Телеграм бот на bash
« Ответ #3 : 15 Май 2023, 10:51:06 »
На данный момент опробовал методы

getMe - информация о боте.
getUpdates - обновление информации (сообщения, действия в чатах)
sendMessage - отправка сообщения
deleteMessage - удаление сообщения

Столкнулся с приколами - нужно в тексте сообщения менять пробелы на +, иначе curl не отпраляет.
Также после удаления делаю getUpdates?offset=ид_последнего_обновления+1, а то в чате сообщение удаляется, в getUpdates же остается.
Данные предоставляются в json.

Таким образом, прихожу к выводу, что из сообщения надо формировать картинку и тогда отправлять. Почитать про update. Найти способ проще работать с json.

Кому интересно:
https://tlgrm.ru/docs/bots/api
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • Автор темы
  • /dev/hands < /dev/ass
Re: Телеграм бот на bash
« Ответ #4 : 25 Декабрь 2023, 08:02:36 »
Давно написал, что интересовало, но тут не отписывался. Скорее всего, это неактуально. Все же поделюсь шаблоном

Столкнулся с приколами - нужно в тексте сообщения менять пробелы на +, иначе 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

Найти способ проще работать с 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
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1725
  • Репутация: +49/-1
  • Автор темы
  • /dev/hands < /dev/ass
Re: Телеграм бот на bash
« Ответ #5 : 25 Декабрь 2023, 08:23:09 »
Тоже игрался

curl -F photo=@/путь/картинка.png "https://api.telegram.org/bot$TOKEN/sendPhoto?chat_id=$chat_id"

curl -F audio=@"/путь/файл.mp3" "https://api.telegram.org/bot$TOKEN/sendAudio?chat_id=$chat_id"
Компьютер имеет то преимущество перед мозгом, что им пользуются.