Не однократно в группе была просьба в комментариях сделать бота в ТГ, который мониторил бы иные каналы с целью ловить там промо-коды, акции, скидки, розыгрыши и прочее. Изначально мне было не интересно, но так как спрос на это есть и я уже знаком с API-телеграм application development и ботов, почему бы и нет.



Идея максимально топорная - есть бот, есть список каналов, а также набор ключевых слов. Он должен с момента запуска 24/7 мониторить все посты и выдавать в личные сообщения пересланные посты из каналов. Я взялся за реализацию и был написан код:



import logging

import os

from dotenv import load_dotenv

from telegram import Update

from telegram.ext import (

ApplicationBuilder,

ContextTypes,

MessageHandler,

filters,

)



# Тут я загружаю переменные окружения из файла .env

load_dotenv()



# Настраиваю логирование, чтобы отслеживать работу бота

logging.basicConfig(

format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',

level=logging.INFO

)

logger = logging.getLogger(__name__)



# Получаю токен бота и свой Telegram ID из переменных окружения

TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')

YOUR_TELEGRAM_ID = int(os.getenv('YOUR_TELEGRAM_ID'))



# Определяю список каналов, которые буду мониторить (использую их @username)

MONITORED_CHANNELS = ['@realgachi', '@mgerkom']



# Задаю ключевые слова, по которым буду искать сообщения

KEYWORDS = ['промокод', 'акция', 'розыгрыш', 'раздача']



async def handle_messages(update: Update, context: ContextTypes.DEFAULT_TYPE):

message = update.effective_message

chat = update.effective_chat



# Проверяю, что сообщение поступило из одного из указанных каналов

if chat.username not in MONITORED_CHANNELS:

return



# Ищу наличие хотя бы одного ключевого слова в тексте сообщения

if message.text and any(keyword.lower() in message.text.lower() for keyword in KEYWORDS):

try:

# Пересылаю сообщение себе

await message.forward(chat_id=YOUR_TELEGRAM_ID)

logger.info(f"Сообщение из {chat.username} переслано.")

except Exception as e:

logger.error(f"Ошибка при пересылке сообщения: {e}")



def main():

# Создаю приложение бота с использованием токена

application = ApplicationBuilder().token(TOKEN).build()



# Создаю обработчик для новых сообщений из указанных каналов

message_handler = MessageHandler(

filters.Chat(username=MONITORED_CHANNELS) & filters.TEXT,

handle_messages

)



# Добавляю обработчик в диспетчер приложения

application.add_handler(message_handler)



# Запускаю бота и начинаю получать обновления

logger.info("Бот запущен и готов к работе.")

application.run_polling()



if __name__ == '__main__':

main()




Дописал, обрадовался. Протестировал на своем канале для тестов. Работает - ура. Но вот незадача. У меня не получилось реализовать его работу в чужих каналах.



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



Но у меня все еще есть проблема и мне нужно ее решить.
Буквально вчера я опубликовал пост с десктопным приложением, которое собирает информацию об активности аудитории на любом публичном канале, и делает это исправно. Отсюда и родилась идея. Ботом будет не "бот" Телеграма, а реальная учетная запись пользователя, зарегестрировнная по номеру телефона.



И так, отыскав вторую симку в тумбочке, я приступил к работе. Я снова получил уже на второй номер новые

App api_id:

App api_hash: