commit 047643e230ea058c052e03819254ebbb2c2e6f98 Author: Сафия Мухамадиева Date: Thu Dec 26 23:10:44 2024 +0400 Загрузить файлы в «/» diff --git a/bot.py b/bot.py new file mode 100644 index 0000000..96658bd --- /dev/null +++ b/bot.py @@ -0,0 +1,198 @@ +from telegram import Update, ReplyKeyboardMarkup, ReplyKeyboardRemove +from telegram.ext import ( + Application, CommandHandler, MessageHandler, filters, ConversationHandler, +) +import os +import logging + +# Настройка логирования +logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") +logger = logging.getLogger(__name__) + +# Токен бота +TOKEN = "7693731498:AAG1HUwrk_vSpnaS5ivsqREOBsEP_wC6RV4" + +# Состояния для диалога +WELCOME, NAME, TITLE, PHONE, EMAIL, WORK, SUBMITTED = range(7) + +# Путь к папке на рабочем столе +DESKTOP_PATH = os.path.join(os.path.expanduser("~"), "Desktop") +FOLDER_NAME = "Ульяновск.Искусство" +FOLDER_PATH = os.path.join(DESKTOP_PATH, FOLDER_NAME) + +# Создание папки на рабочем столе, если она не существует +if not os.path.exists(FOLDER_PATH): + os.makedirs(FOLDER_PATH) + +# Обработчик команды /start +async def start(update: Update, context): + logger.info(f"Пользователь {update.effective_user.id} начал диалог.") + await update.message.reply_text( + "Привет! 👋\n" + "Мы рады приветствовать вас в нашем боте, посвящённом городу Ульяновск!\n\n" + "Ульяновск — это город с богатой историей, красивыми памятниками и уютными улочками. " + "Мы проводим конкурс на лучшую фотографию нашего города. Присоединяйтесь!\n\n" + "Чтобы принять участие, нажмите кнопку ниже:", + reply_markup=ReplyKeyboardMarkup([["Добавить работу"]], one_time_keyboard=True, resize_keyboard=True), + ) + return WELCOME + +# Обработчик нажатия на кнопку "Добавить работу" +async def add_work(update: Update, context): + logger.info(f"Пользователь {update.effective_user.id} нажал на кнопку 'Добавить работу'.") + await update.message.reply_text( + "Отлично! 🎉\n" + "Для начала введите ваше имя и фамилию:", + reply_markup=ReplyKeyboardRemove(), + ) + return NAME + +# Обработчик ввода имени и фамилии +async def get_name(update: Update, context): + name = update.message.text + context.user_data["name"] = name + logger.info(f"Пользователь {update.effective_user.id} ввел имя: {name}") + await update.message.reply_text("Теперь введите название вашей работы:") + return TITLE + +# Обработчик ввода названия работы +async def get_title(update: Update, context): + title = update.message.text + context.user_data["title"] = title + logger.info(f"Пользователь {update.effective_user.id} ввел название работы: {title}") + await update.message.reply_text("Введите ваш номер телефона:") + return PHONE + +# Обработчик ввода номера телефона +async def get_phone(update: Update, context): + phone = update.message.text + context.user_data["phone"] = phone + logger.info(f"Пользователь {update.effective_user.id} ввел номер телефона: {phone}") + await update.message.reply_text("Введите вашу электронную почту:") + return EMAIL + +# Обработчик ввода электронной почты +async def get_email(update: Update, context): + email = update.message.text + context.user_data["email"] = email + logger.info(f"Пользователь {update.effective_user.id} ввел email: {email}") + await update.message.reply_text("Отправьте вашу работу (файл в формате JPEG или PNG):") + return WORK + +# Обработчик отправки файла +async def get_work(update: Update, context): + try: + if update.message.photo: + photo = update.message.photo[-1] + name = context.user_data["name"] + title = context.user_data["title"] + phone = context.user_data["phone"] + email = context.user_data["email"] + + # Создаем папку участника + participant_folder = os.path.join(FOLDER_PATH, name) + if not os.path.exists(participant_folder): + os.makedirs(participant_folder) + + # Сохраняем файл в папку участника + file_path = os.path.join(participant_folder, f"{title}.jpg") + file = await photo.get_file() + await file.download_to_drive(file_path) + + # Сохраняем контактные данные в текстовый файл + contact_info = f"Имя: {name}\nНомер телефона: {phone}\nЭлектронная почта: {email}" + contact_file_path = os.path.join(participant_folder, "contact_info.txt") + with open(contact_file_path, "w", encoding="utf-8") as file: + file.write(contact_info) + + await update.message.reply_text( + f"Спасибо, {name}! Ваша работа '{title}' сохранена.\n\n" + "Удачи в конкурсе! 🍀" + ) + return SUBMITTED + + elif update.message.document: + document = update.message.document + if document.mime_type in ["image/jpeg", "image/png"] and document.file_name.lower().endswith((".jpg", ".jpeg", ".png")): + name = context.user_data["name"] + title = context.user_data["title"] + phone = context.user_data["phone"] + email = context.user_data["email"] + + # Создаем папку участника + participant_folder = os.path.join(FOLDER_PATH, name) + if not os.path.exists(participant_folder): + os.makedirs(participant_folder) + + # Сохраняем файл в папку участника + file_path = os.path.join(participant_folder, f"{title}.{document.file_name.split('.')[-1]}") + file = await document.get_file() + await file.download_to_drive(file_path) + + # Сохраняем контактные данные в текстовый файл + contact_info = f"Имя: {name}\nНомер телефона: {phone}\nЭлектронная почта: {email}" + contact_file_path = os.path.join(participant_folder, "contact_info.txt") + with open(contact_file_path, "w", encoding="utf-8") as file: + file.write(contact_info) + + await update.message.reply_text( + f"Спасибо, {name}! Ваша работа '{title}' сохранена.\n\n" + "Удачи в конкурсе! 🍀" + ) + return SUBMITTED + else: + await update.message.reply_text("Пожалуйста, отправьте файл в формате JPEG или PNG.") + return WORK + + else: + await update.message.reply_text("Пожалуйста, отправьте только файл в формате JPEG или PNG.") + return WORK + except Exception as e: + logger.error(f"Ошибка при загрузке файла: {e}") + await update.message.reply_text("Произошла ошибка при загрузке файла. Пожалуйста, попробуйте снова.") + return WORK + +# Обработчик состояния SUBMITTED +async def submitted(update: Update, context): + reply_keyboard = [["Посмотреть свою работу", "Изменить свою работу"], ["Удалить работу", "Отказаться от участия"]] + await update.message.reply_text( + "Вы уже отправили свою работу. Выберите действие:", + reply_markup=ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True), + ) + return SUBMITTED + +# Обработчик команды /cancel +async def cancel(update: Update, context): + await update.message.reply_text("Отправка работы отменена. Вы можете начать снова, отправив команду /start.") + return ConversationHandler.END + +# Основная функция +def main(): + application = Application.builder().token(TOKEN).build() + + # Определяем ConversationHandler + conv_handler = ConversationHandler( + entry_points=[CommandHandler("start", start)], + states={ + WELCOME: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_work)], + NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_name)], + TITLE: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_title)], + PHONE: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_phone)], + EMAIL: [MessageHandler(filters.TEXT & ~filters.COMMAND, get_email)], + WORK: [ + MessageHandler(filters.PHOTO | filters.Document.ALL, get_work), + MessageHandler(filters.TEXT & ~filters.COMMAND, lambda update, context: update.message.reply_text("Пожалуйста, отправьте файл.") or WORK), + ], + SUBMITTED: [MessageHandler(filters.TEXT & ~filters.COMMAND, submitted)], + }, + fallbacks=[CommandHandler("cancel", cancel)], + ) + + # Добавляем обработчик + application.add_handler(conv_handler) + + # Запуск бота + application.run_polling() + +if __name__ == "__main__": + main() \ No newline at end of file