Загрузить файлы в «/»
This commit is contained in:
commit
047643e230
198
bot.py
Normal file
198
bot.py
Normal file
@ -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()
|
Loading…
x
Reference in New Issue
Block a user