первая часть кода
import logging
import os
from telegram import (
Update,
KeyboardButton,
ReplyKeyboardMarkup,
)
from telegram.constants import ChatAction
from telegram.ext import (
ApplicationBuilder,
CommandHandler,
MessageHandler,
ConversationHandler,
ContextTypes,
filters,
)
# Настройка логирования
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
level=logging.INFO)
# Токен бота (не забудьте заменить на ваш токен)
BOT_TOKEN = '7395880107:AAFLRPFRXinMy-wPmKZeV2Jd3FoQ7iQgPq4'
# ID канала
CHANNEL_ID = '@test22558811'
# Состояния для ConversationHandler
ADD_PHOTO, ADD_TEXT = range(2)
# Хэндлер для команд "/start" и "/help"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await
context.bot .send_chat_action(update.message.chat.id, ChatAction.TYPING)
await
context.bot .send_message(update.message.chat.id, text="Привет! Это бот для рассылки сообщений в Telegram каналы.")
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await
context.bot .send_chat_action(update.message.chat.id, ChatAction.TYPING)
await
context.bot .send_message(update.message.chat.id, text="Команды:\\\\n/start - запуск бота\\\\n/help - помощь\\\\n/add - добавление рекламы")
# Хэндлер для текстовых сообщений
async def message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await
context.bot .send_chat_action(update.message.chat.id, ChatAction.TYPING)
await
context.bot .send_message(CHANNEL_ID, text=update.message.text)
await
context.bot .send_message(update.message.chat.id, text="Сообщение отправлено в канал.")
вторая часть кода
# Хэндлер для добавления рекламы
async def add_advertisement(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
keyboard = [[KeyboardButton('Добавить фото'), KeyboardButton('Добавить текст')]]
reply_markup = ReplyKeyboardMarkup(keyboard, one_time_keyboard=True)
await
context.bot .send_message(update.message.chat.id, text="Выберите действие:", reply_markup=reply_markup)
return ADD_PHOTO
# Хэндлер для добавления фото
async def add_photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
await
context.bot .send_chat_action(update.message.chat.id, ChatAction.TYPING)
if update.message.photo:
photo = update.message.photo[-1]
file = await
context.bot .get_file(photo.file_id)
# Проверяем размер
if photo.file_size > 5242880:
await
context.bot .send_message(update.message.chat.id, text="Фотография слишком большая. Пожалуйста, отправьте фото размером не более 5 МБ.")
return ADD_PHOTO
# Сохраняем фото на сервере или отправляем в канал
await
file.download (f'photo_{photo.file_id}.jpg') # Сохранение файла (можно изменить на отправку в канал)
context.user_data['photo'] = f'photo_{photo.file_id}.jpg'
await
context.bot .send_message(update.message.chat.id, text="Фотография добавлена.")
else:
await
context.bot .send_message(update.message.chat.id, text="Пожалуйста, отправьте фото.")
return ADD_PHOTO
return ADD_TEXT
# Хэндлер для добавления текста
async def add_text(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
context.user_data['text'] = update.message.text
await
context.bot .send_message(update.message.chat.id, text="Текст добавлен.")
третья часть кода
# Отправка фото и текста в канал
if 'photo' in context.user_data:
with open(context.user_data['photo'], 'rb') as photo_file:
await
context.bot .send_photo(CHANNEL_ID, photo=photo_file, caption=context.user_data['text'])
else:
await
context.bot .send_message(CHANNEL_ID, text=context.user_data['text'])
return ConversationHandler.END
# Хэндлер для отмены
async def cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
await
context.bot .send_message(update.message.chat.id, text="Отмена.")
return ConversationHandler.END
# Основная функция для запуска бота
async def main() -> None:
app = ApplicationBuilder().token(BOT_TOKEN).build()
# Добавление хэндлеров
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_command))
app.add_handler(CommandHandler("add", add_advertisement))
# Обработчик текстовых сообщений
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, message))
# Обработчик для разговоров
conv_handler = ConversationHandler(
entry_points=[CommandHandler("add", add_advertisement)],
states={
ADD_PHOTO: [MessageHandler(filters.PHOTO, add_photo)],
ADD_TEXT: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_text)],
},
fallbacks=[CommandHandler("cancel", cancel)],
)
app.add_handler(conv_handler)
# Запуск бота
await
app.run _polling()
if __name__== '__main__':
import asyncio
asyncio.run (main())
/usr/local/lib/python3.10/dist-packages/telegram/ext/_application.py in __run(self, updater_coroutine, stop_signals, close_loop)
1078 try:
-> 1079 loop.run _until_complete(self.initialize())
1080 if self.post _init:
10 frames
RuntimeError: This event loop is already running
During handling of the above exception, another exception occurred:
RuntimeError Traceback (most recent call last)
RuntimeError: This event loop is already running
During handling of the above exception, another exception occurred:
RuntimeError Traceback (most recent call last)
/usr/lib/python3.10/asyncio/selector_events.py in close(self)
82 def close(self):
83 if self.is _running():
---> 84 raise RuntimeError("Cannot close a running event loop")
85 if self.is _closed():
86 return
RuntimeError: Cannot close a running event loop