Ответы пользователя по тегу Боты
  • Как избежать повторения функции при получении коложа фотографий?

    @Wolfengo Автор вопроса
    Я ещё зелёный, сильно не душите
    Я нашёл решение этого вопроса. Я сделал так, чтобы через content_types=["text", "photo"]
    бот пересылал медиагруппу вместе с подписью (если не нужно, можно убрать), если 1 фото, то 1 фото с подписью и если текст, то перешлёт текст.

    Долее код подбивайте под ваши нужды

    import asyncio
    from typing import List, Union
    
    from aiogram import Bot, Dispatcher, executor, types
    from aiogram.dispatcher.handler import CancelHandler
    from aiogram.dispatcher.middlewares import BaseMiddleware
    
    bot = Bot(token="")
    dp = Dispatcher(bot)
    
    
    class AlbumMiddleware(BaseMiddleware):
    
        album_data: dict = {}
    
        def __init__(self, latency: Union[int, float] = 0.01):
            self.latency = latency
            super().__init__()
    
        async def on_process_message(self, message: types.Message, data: dict):
            if not message.media_group_id:
                self.album_data[message.from_user.id] = [message]
    
                message.conf["is_last"] = True
                data["album"] = self.album_data[message.from_user.id]
                await asyncio.sleep(self.latency)
            else:
                try:
                    self.album_data[message.media_group_id].append(message)
                    raise CancelHandler()
                except KeyError:
                    self.album_data[message.media_group_id] = [message]
                    await asyncio.sleep(self.latency)
    
                    message.conf["is_last"] = True
                    data["album"] = self.album_data[message.media_group_id]
    
        async def on_post_process_message(self, message: types.Message):
            if not message.media_group_id:
                if message.from_user.id and message.conf.get("is_last"):
                    del self.album_data[message.from_user.id]
            else:
                if message.media_group_id and message.conf.get("is_last"):
                    del self.album_data[message.media_group_id]
    
    
    @dp.message_handler(content_types=['text', 'photo'])
    async def handle_albums(message: types.Message, album: List[types.Message]):
        if not message.media_group_id:
            if message.photo:
                await bot.send_photo(chat_id=message.chat.id, photo=message.photo[-1].file_id, caption=message.caption)
            else:
                await bot.send_message(message.chat.id, message.text)
        else:
            media_group = types.MediaGroup()
            for obj in album:
                if obj.photo:
                    file_id = obj.photo[-1].file_id
                    caption = album[0].caption
                else:
                    file_id = obj[obj.content_type].file_id
    
                try:
                    media_group.attach({"media": file_id, "type": obj.content_type})
                    media_group.media[0]["caption"] = caption
                except ValueError:
                    return await message.answer("Этот тип не поддерживается aiogram.")
    
            await message.answer_media_group(media_group)
    
    
    if __name__ == "__main__":
        dp.middleware.setup(AlbumMiddleware())
        executor.start_polling(dp, skip_updates=True)
    Ответ написан
    Комментировать
  • Ошибка при выполнение команды, как её исправить?

    @Wolfengo
    Я ещё зелёный, сильно не душите
    ты используешь 2 библиотеки для написания бота? telebot и telethon, это разные библиотеки и брать "типы" тебе нужно не из telethon, а из telebot
    Ответ написан
    Комментировать
  • Как заставить бота услышать другого бота в группе Telegram?

    @Wolfengo Автор вопроса
    Я ещё зелёный, сильно не душите
    Пересылаю ответ из комментов.

    Проблема не в библиотеке, проблема в API.
    Общаться с ботами можно с помощью клиентского API (смотреть в сторону библиотеки telethon).

    Если получится реализовать, то дам знать конкретно
    Ответ написан
    Комментировать
  • Telebot, как зная ID сделать ссылку на пользователя?

    @Wolfengo Автор вопроса
    Я ещё зелёный, сильно не душите
    Я нашёл решение через "mem = message.from_user.username", он возвращает имя юзера, если его нету, то None.
    Как я понял, сделать ссылку на контакт (t.me/...) человека не возможно, если у него нет имени юзера, так что это будет, наверное, единственным решением
    Я сделал:
    bot.send_message(***id_admin***,
    f'Покупатель сделал покупку!\n'
    f'Покупатель: @{mem}\n'
    f'Выбор: {last_take_buy[-1]}',
    )
    Ответ написан
    Комментировать