как вывести определенному пользователю то, что другой юзер написал в тг бота?

Рейтинг: 0Ответов: 1Опубликовано: 16.05.2023

Сделал бота с FSM, но не понимаю как вывести своему другу то, что другой напишет в бота, подскажите пожалуйста.

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

TOKEN = '*******'

bot = Bot(TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class Shop(StatesGroup):
    step1 = State()
    step2 = State()
    step3 = State()
    step4 = State()


@dp.message_handler(commands=['start'], state=None)
async def start(message: types.Message):
    await bot.send_message(message.chat.id, 'Здравствуйте, какой продукт вы хотите преобрести?')

    await Shop.step1.set()


@dp.message_handler(state=Shop.step1)
async def step1(message: types.Message, state: FSMContext):
    item = message.text
    await state.update_data(
        {
            'item': item
        }
    )
    await message.answer('В каком количестве?')
    await Shop.next()


@dp.message_handler(state=Shop.step2)
async def step2(message: types.Message, state: FSMContext):
    data = await state.get_data()
    item = data.get

    await message.answer('К какому времени?')
    await Shop.next()


@dp.message_handler(state=Shop.step3)
async def step3(message: types.Message, state: FSMContext):
    data = await state.get_data()
    item = data.get

    await state.finish()

    await message.answer('Ваш заказ отправлен.')


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

Ответы

▲ 0

Для того, чтобы узнать ID пользователя, можно воспользоваться уже готовыми ботами для этого, например @getmy_idbot.

Этого бота необходимо запускать из того Telegram-аккаунта, куда вы будете пересылать сообщения.

Итак, копируете ID пользователя из того бота и вставляете в переменную в Python.

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

TOKEN = 'токен бота'

id = "ID ПОЛЬЗОВАТЕЛЯ ЗДЕСЬ"

bot = Bot(TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class Shop(StatesGroup):
    step1 = State()
    step2 = State()
    step3 = State()
    step4 = State()


@dp.message_handler(commands=['start'], state=None)
async def start(message: types.Message):
    await bot.send_message(message.chat.id, 'Здравствуйте, какой продукт вы хотите преобрести?')

    await Shop.step1.set()


@dp.message_handler(state=Shop.step1)
async def step1(message: types.Message, state: FSMContext):
    item = message.text

    await state.update_data(
        {
            'item': item
        }
    )

    await message.answer('В каком количестве?')
    await Shop.next()


@dp.message_handler(state=Shop.step2)
async def step2(message: types.Message, state: FSMContext):
    # записываем количество заказа в state
    count = message.text

    await state.update_data(
        {
            'count': count
        }
    )

    await message.answer('К какому времени?')
    await Shop.next()


@dp.message_handler(state=Shop.step3)
async def step3(message: types.Message, state: FSMContext):
    # получаем данные заказа
    data = await state.get_data()
    item = data.get("item")
    count = data.get("count")
    time = message.text

    await state.update_data(
        {
            'time': time
        }
    )

    await state.finish()

    await message.answer('Ваш заказ отправлен.')

    # формируем текст сообщения владельцу
    # вы можете написать в переменную абсолютно любой текст, который вы хотите
    orderText = f"""
Пользователь {message.from_user.full_name} заказывает {item} в количестве {count} шт. ко времени {time}.
"""
    # отправляем текст владельцу
    # тут используется переменная `id` - как раз то, что вы узнали на предыдущем этапе
    await bot.send_message(id, orderText)


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

Вы можете свободно экспериментировать с этим кодом.