Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Срочно aiogram машина состояний

. . Ученик (85), на голосовании 5 дней назад
Каким образом мне засунуть данные, которые ввёл человек в боте, в bot.forward_message??? Если кто-то не понял: у бота есть репоай кнопка, на которую он нажимает и вводит данные, а дальше эти данные должны скинуться мне в специальный чат. Например: человек нажал на клавишу "a", которая попросила его отправить фото и описать его, после чего, сохранив эти данные бот перекинул мне в группу, как это реализовать? На помощь, гении!!
Голосование за лучший ответ
CNN шкїебєдзз трїїїлєт Знаток (430) 1 месяц назад
contract.gosuslugi.ru
Социальная реклама
18+
Заключи контракт
Единовременная федеральная выплата 400 тыс+до 1,9 млн. может составить выплата в регионах.
артема)) Профи (665) 1 месяц назад
io dota2 у меня аркана на сф
tuer weniag Мудрец (10234) 1 месяц назад
Вот тебе пример:

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

API_TOKEN = 'твой_токен'
GROUP_ID = -100123456789 # ID группы

bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class Form(StatesGroup):
waiting_for_photo = State()
waiting_for_description = State()

@dp.message_handler(commands='start')
async def start(message: types.Message):
keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(KeyboardButton("a"))
await message.answer("Нажми 'a', чтобы отправить фото и описание.", reply_markup=keyboard)

@dp.message_handler(lambda message: message.text == "a")
async def ask_photo(message: types.Message):
await Form.waiting_for_photo.set()
await message.reply("Отправь фото.")

@dp.message_handler(content_types=types.ContentType.PHOTO, state=Form.waiting_for_photo)
async def save_photo(message: types.Message, state: FSMContext):
await state.update_data(photo_id=message.photo[-1].file_id)
await Form.waiting_for_description.set()
await message.reply("Теперь опиши фото.")

@dp.message_handler(state=Form.waiting_for_description)
async def save_description(message: types.Message, state: FSMContext):
data = await state.get_data()
photo_id = data['photo_id']
description = message.text

# Отправка фото и описания в группу
await bot.send_photo(chat_id=GROUP_ID, photo=photo_id, caption=description)

await state.finish()
await message.reply("Фото и описание отправлены в группу!")

if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Александр Ахметов Мудрец (17975) 1 месяц назад
Для реализации такой логики в aiogram с использованием машины состояний, можно сделать следующее:

Пошаговое решение:
Создаём машину состояний:
Машина состояний позволит поэтапно обрабатывать ввод данных от пользователя.
Сохраняем данные пользователя:
Данные, которые пользователь вводит (фото, текст), можно сохранять в state.
Отправляем данные в специальный чат:
Используем метод bot.forward_message или bot.send_message для пересылки или отправки данных в указанный чат.
Пример кода:
from aiogram import Bot, Dispatcher, types
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor

API_TOKEN = 'Ваш_токен_бота'
GROUP_CHAT_ID = 'ID_группы' # Укажите ID вашей группы/чата

bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

# Клавиатура для команды "a"
keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(KeyboardButton("a"))

# Определяем состояния
class UserState(StatesGroup):
waiting_for_photo = State()
waiting_for_description = State()

# Обрабатываем команду /start
@dp.message_handler(commands="start")
async def start_command(message: types.Message):
await message.answer("Нажмите 'a', чтобы начать", reply_markup=keyboard)

# Обрабатываем нажатие кнопки "a"
@dp.message_handler(lambda message: message.text == "a")
async def handle_a(message: types.Message):
await message.answer("Пожалуйста, отправьте фото.")
await UserState.waiting_for_photo.set()

# Получаем фото от пользователя
@dp.message_handler(content_types=["photo"], state=UserState.waiting_for_photo)
async def handle_photo(message: types.Message, state: FSMContext):
# Сохраняем фото ID в состояние
await state.update_data(photo_id=message.photo[-1].file_id)
await message.answer("Отлично! Теперь отправьте описание.")
await UserState.waiting_for_description.set()

# Получаем описание от пользователя
@dp.message_handler(state=UserState.waiting_for_description)
async def handle_description(message: types.Message, state: FSMContext):
# Сохраняем описание в состояние
await state.update_data(description=message.text)

# Получаем все данные из состояния
user_data = await state.get_data()
photo_id = user_data["photo_id"]
description = user_data["description"]

# Отправляем фото и описание в группу
await bot.send_photo(chat_id=GROUP_CHAT_ID, photo=photo_id, caption=f"Описание: {description}")

# Завершаем состояние
await state.finish()
await message.answer("Ваши данные успешно отправлены!")

# Запуск бота
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
Что делает этот код:
Машина состояний:
Пользователь поочерёдно отправляет фото и текст.
Данные сохраняются в FSMContext.
Пересылка данных:
Фото пересылается через bot.send_photo.
Описание отправляется в виде текста в caption.
Группа для отправки:
Все данные отправляются в чат с GROUP_CHAT_ID.
Примечания:
Замените API_TOKEN на токен вашего бота.
Замените GROUP_CHAT_ID на ID вашей группы. Чтобы получить ID, добавьте бота в группу и используйте команду /get_chat_id.
Если нужно пересылать сообщение (а не создавать новое), замените bot.send_photo на bot.forward_message.
CausonQ Мудрец (13842) 1 месяц назад
А почему именно forward_message?
Используй send_copy. И все, что пользователь напишет, бот перешлет туда, куда ты укажешь
Похожие вопросы