Как отправить сгенерированный штрих код в телеграмм при помощи бота на python

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

не могу выполнить задачу, у меня есть алгоритм который генерирует штрих код, но мне нужно, чтобы код генерировался из сообщения, который присылает пользователь в телеграмм бота и по этому коду генерировалось изображение штрих-кода в формате png и отправлялось обратно в бота. Помогите.

def generate_ean13():
    digits = [random.randint(0, 9) for _ in range(12)]

    odd_sum = sum(digits[0::2])
    even_sum = sum(digits[1::2])
    control_sum = (odd_sum * 3 + even_sum) % 10
    control_sum = (10 - control_sum) if control_sum != 0 else 0

    barcode = digits + [control_sum]

    barcode_str = ''.join(map(str, barcode))

    return barcode_str


barcode = generate_ean13()
print(barcode)

data = barcode
barcode_gen = EAN13(data)
with open("EAN-13.png", "wb") as f:
    EAN13(barcode, writer=ImageWriter()).write(f)

Ответы

▲ 0Принят

Вы можете использовать BytesIO и aiogram вот так:

from aiogram import Bot, Dispatcher, types
from aiogram.types import InputFile
from aiogram.utils import executor
from pybarcodes import EAN13
from io import BytesIO

bot = Bot(token="ТВОЙ_ТОКЕН")
dp = Dispatcher(bot)


def generate_ean13(digits):
    odd_sum = sum(digits[0::2])
    even_sum = sum(digits[1::2])
    control_sum = (odd_sum * 3 + even_sum) % 10
    control_sum = (10 - control_sum) if control_sum != 0 else 0

    barcode = digits + [control_sum]

    barcode_str = ''.join(map(str, barcode))

    return barcode_str


def generate_image_barcode(code):
    barcode = generate_ean13(code)
    data = barcode
    barcode_gen = EAN13(data)
    file = BytesIO()
    file.name = 'code.png'
    barcode_gen.image.save(file, 'PNG')
    file.seek(0)
    return file


@dp.message_handler(commands=["start"])
async def start(message: types.Message):
    await message.answer("Отправь 12 цифр от 0 до 9.")


@dp.message_handler()
async def generate(message: types.Message):
    if message.text.isnumeric() and len(message.text) == 12:
        digits = [int(s) for s in message.text]
        photo = InputFile(generate_image_barcode(digits))
        await message.answer_photo(photo)
    else:
        await message.answer("Отправь 12 цифр от 0 до 9.")


if __name__ == "__main__":
    executor.start_polling(dp)
▲ 0

Task exception was never retrieved future: <Task finished name='Task-12' coro=<Dispatcher._process_polling_updates() done, defined at C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py:407> exception=AttributeError("'ImageDraw' object has no attribute 'textsize'")> Traceback (most recent call last): File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 415, in _process_polling_updates for responses in itertools.chain.from_iterable(await self.process_updates(updates, fast)): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 235, in process_updates return await asyncio.gather(*tasks) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify response = await handler_obj.handler(*args, **partial_data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\dispatcher.py", line 256, in process_update return await self.message_handlers.notify(update.message) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\aiogram\dispatcher\handler.py", line 117, in notify response = await handler_obj.handler(*args, **partial_data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55.1\test_bot.py", line 44, in generate photo = InputFile(generate_image_barcode(digits)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55.1\test_bot.py", line 30, in generate_image_barcode barcode_gen.image.save(file, 'PNG') ^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\pybarcodes\barcode.py", line 46, in image return self._get_barcode_image() ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\1\OneDrive\Рабочий стол\55\venv\Lib\site-packages\pybarcodes\barcode.py", line 153, in _get_barcode_image text_width, _ = draw.textsize(self.code, font) ^^^^^^^^^^^^^ AttributeError: 'ImageDraw' object has no attribute 'textsize'