Получение данных из сообщения пользователя и запись его в файл

Рейтинг: 0Ответов: 1Опубликовано: 26.04.2023
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from datetime import datetime
import pandas as pd

n_dt = datetime.now()

def get_fio(message):
    global fio
    fio = message.text
    f_log = open('Media/Anketa.txt', 'a')
    f_log.write(f'\n[{n_dt.day}/{n_dt.month}/{n_dt.year}-{n_dt.hour}:{n_dt.minute}] {message.text}')
    f_log.close()
...
#others code
...
#после нажатия кнопки "имя", нужно получить сообщение от пользователя и записать в файл

@dp.message_handler(content_types=['text'])
async def calmenu(message):
        if message.text == 'Имя':
        markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
        await bot.send_message(message.chat.id,'\n🔸🔸🔸🔸⚜️⚜️⚜️🔸🔸🔸🔸\nЗапишите своë имя.\n\n📢Поле обязательно к заполнению!\n\n🔸🔸🔸🔸⚜️⚜️⚜️🔸🔸🔸🔸', reply_markup=markup)
        
        async def message_input_step(message: types.Message):
            message = message.text
            markup=types.ReplyKeyboardMarkup(resize_keyboard=True)
            item1=types.KeyboardButton('Сохранить')
            markup.row(item1)
            await bot.send_message(message.from_user.id, f'🔷Нажмите кнопку "Сохранить"\nи я запишу ваше имя:\n⚜️{message.text}⚜️', reply_markup=markup)
        

        get_fio(message)

Ответы

▲ 0Принят

Такое ощущение что писал не внимательный человек. Ошибка на ошибке и ошибкой погоняет.

  1. утерян декоратор @dp.message_handler() перед async def message_input_step(message: types.Message):,
  2. две одинаковые переменные в message_input_step()
  3. не правильная последовательность вызова message_input_step()
  4. Потерянное состояние confirm_save = State() для того чтобы кнопка заработала и был завершающий этап сохранения имени в файл.

Исправил все, добавил создание директории(если нету), воткнул машину состояний. Исправленный код:

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
from datetime import datetime
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.contrib.fsm_storage.memory import MemoryStorage
import os


n_dt = datetime.now()

bot = Bot(token='6250766662:AAG8OkxQ_0X7LT2sFrpBBWtlVJNx99FdlVE')

storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
fio = ''

class UserInput(StatesGroup):
    message_input_step = State()
    confirm_save = State()

def get_fio(message):
    global fio
    fio = message.text
    f_log = open('Media/Anketa.txt', 'a')
    f_log.write(f'\n[{n_dt.day}/{n_dt.month}/{n_dt.year}-{n_dt.hour}:{n_dt.minute}] {message.text}')
    f_log.close()

@dp.message_handler(content_types=['text'])
async def calmenu(message):
    if message.text == 'Имя':
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
        await bot.send_message(message.chat.id, '\n🔸🔸🔸🔸⚜️⚜️⚜️🔸🔸🔸🔸\nЗапишите своë имя.\n\n📢Поле обязательно к заполнению!\n\n🔸🔸🔸🔸⚜️⚜️⚜️🔸🔸🔸🔸', reply_markup=markup)
        await UserInput.message_input_step.set()

@dp.message_handler(state=UserInput.message_input_step)
async def message_input_handler(message: types.Message, state: FSMContext):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item1 = types.KeyboardButton('Сохранить')
    markup.row(item1)
    await bot.send_message(message.from_user.id, f'🔷Нажмите кнопку "Сохранить"\nи я запишу ваше имя:\n⚜️{message.text}⚜️', reply_markup=markup)

    # сохраняем имя в глобальную переменную
    global fio
    fio = message.text

    # устанавливаем состояние подтверждения
    await UserInput.confirm_save.set()

@dp.message_handler(state=UserInput.confirm_save, content_types=types.ContentTypes.TEXT)
async def confirm_save_handler(message: types.Message, state: FSMContext):
    if message.text == 'Сохранить':
        if not os.path.exists('Media'):
            os.makedirs('Media')
        f_log = open('Media/Anketa.txt', 'a')
        f_log.write(f'\n[{n_dt.day}/{n_dt.month}/{n_dt.year}-{n_dt.hour}:{n_dt.minute}] {fio}')
        f_log.close()
        await bot.send_message(message.from_user.id, "Ваше имя сохранено.")
    else:
        await bot.send_message(message.from_user.id, "Сохранение отменено.")
    await state.finish()



if __name__ == '__main__':
    executor.start_polling(dp)