Голосование за лучший ответ
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.