@TheDigitalMadness
Программист

Как получить альбом фотографий в pyTelegramBotApi?

Я сделал бота. Он должен принимать фото и отправлять их мне в ответ (пока). С одним фото он прекрасно справляется. 66545f1b896ee485459711.png
Однако, когда я шлю несколько фото альбомом, он берет 1 из них, при том почему-то в 1-ом случае альбома он взял 2-ую по счету фото, а во 2-ом случае - 1-ую.
66545f57537a6130665441.png
66545f5fe6b91316126107.png

Вот часть кода, отвечающая за прием и отправку фото:
import telebot
import json
from Database import Database


class Bot(telebot.Telebot):
    @staticmethod
    def get_photos_id_list(message):
        database = Database('user_database.db')
        database.execute(f'SELECT data_storage FROM users WHERE user_id = {message.from_user.id}')

        data_storage_str = database.get_result()[0][0]
        photos_id_list = json.loads(data_storage_str)[1]

        return photos_id_list


    def text_command_send_message_action(self, message):
        database = Database('user_database.db')
        database.execute(f"UPDATE users SET menu = 'MAIN_MENU' WHERE user_id = {message.from_user.id}")

        markup = self.make_main_menu_markup(user_id=message.from_user.id, admins_list=self.__admins)

        self.send_message(message.from_user.id, 'Работа успешно отправлена', reply_markup=markup)

        database.execute('SELECT user_id FROM users WHERE ban_status = 0')
        users_id = database.get_result()
        for user in users_id:
            try:
                user = user[0]
                self.send_message(user, self.make_description(message=message))

                photos_id_list = self.get_photos_id_list(message=message)
                for photo_id in photos_id_list:
                    self.send_photo(user, photo_id)
            except:
                pass  # Предположительно: ошибка отправки, бот заблокирован пользователем

        database.execute(f"""UPDATE users SET data_storage = '[[], []]' WHERE user_id = {message.from_user.id}""")


    @staticmethod
    def add_photo_to_data_storage(message):
        photo_id = message.photo[-1].file_id

        database = Database('user_database.db')
        database.execute(f'SELECT data_storage FROM users WHERE user_id = {message.from_user.id}')

        data_storage_str = database.get_result()[0][0]
        data_storage = json.loads(data_storage_str)
        data_storage[1].append(photo_id)
        data_storage_json = json.dumps(data_storage)

        database.execute(f"""UPDATE users SET data_storage = '{data_storage_json}' WHERE user_id = {message.from_user.id}""")


    def message_get(self, message):
        # .....
        if message.text is not None:  # Добавление текста в рассылку
            self.add_text_to_data_storage(message=message)
        if message.photo is not None:  # Добавление фото в рассылку
            self.add_photo_to_data_storage(message=message)
        if message.caption is not None:  # Добавление описания фото в рассылку
            self.add_photos_text_to_data_storage(message=message)


Интернет подходящих решений не выдаёт. Надеюсь на вашу помощь
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
@tor_tik96
import os
photo_file_id = []
num = 1
@bot.message_handler(content_types=['photo', 'text'])
def handler_file(message):
    user_id = message.from_user.id
    data = 1 #Количество фотографий для загрузки
    global num
    num = 1 #Название фотографии
    media = []
    photos = message.photo[-1]
    photo_file_id.append(photos.file_id) #Добавляем file_id фотографии для скачивания
    bot.send_message(user_id, f"Загружено {len(photo_file_id)}/{data} фото \nОсталось загрузить {int(data) - len(photo_file_id)} фото")

     if len(photo_file_id) == int(data): #Скачивание всех фотографий начнётся когда количество значений в массиве photo_file_id будет равно количеству фотографий
        Path(f'files/{user_id}}').mkdir(parents=True, exist_ok=True)
        for photo in photo_file_id:
            try:
                file_id = photo
                file_name = f"files/{user_id}/{num}.jpg"
                download_photo(file_id, file_name)
                pic = open(file_name, "rb")
                media.append(pic)
                num += 1
            except Exception as e:
                print(e)
            num = 1
            bot.send_message(user_id, "Все фотографии загружены, спасибо!")
            #Здесь можно добавить свою логику для отправки сообщений самому главному например:
            creators = [] #Тут будут условно id самых главных
            for i in creators:
                bot.send_media_group(i, media)
            os.rmdir(f"files/{user_id}") #В конце удаляем папку чтобы при следующем скачивании не было ошибок
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы