Squeak.ru - шаблоны программирования

UnicodeDecodeError при попытке отправить фото через python-telegram-bot

Я использую python-telegram-bot с Python 2.7. Как следует из документации, я использую этот метод для отправки фотографии с диска:

bot.sendPhoto(update.message.chat_id, photo=open(card.image.path, 'rb'))

Где card.image.path - это полный путь к файлу JPG. При выполнении этого метода я получаю ошибку UnicodeDecode. Пожалуйста, смотрите полную трассировку ниже.

Traceback (most recent call last):
  File "/projects/gcards/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/projects/gcards/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/django/views/generic/base.py", line 88, in dispatch
    return handler(request, *args, **kwargs)
  File "./frontend/telegram/views/callback.py", line 31, in post
    bot_commands.send_card(bot, update, card=card)
  File "./frontend/telegram/views/commands.py", line 22, in send_card
    post_message = bot.sendPhoto(update.message.chat_id, photo=open(card.image.path, 'rb'))
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/bot.py", line 128, in decorator
    result = func(self, *args, **kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/bot.py", line 145, in decorator
    return Bot._post_message(url, data, kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/bot.py", line 175, in _post_message
    network_delay=network_delay)
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/utils/request.py", line 77, in decorator
    return func(*args, **kwargs)
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/utils/request.py", line 165, in post
    data=data.to_form(),
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/inputfile.py", line 147, in to_form
    return InputFile._parse(form)
  File "/projects/gcards/venv/lib/python2.7/site-packages/telegram/inputfile.py", line 165, in _parse
    return '\r\n'.join(form)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

Я исследовал библиотеку и, насколько я понял, она не может декодировать загруженный файл. Я пробовал такие вещи, как:

with io.open(card.image.path, 'r', encoding='utf8') as photo:
            bot.sendPhoto(update.message.chat_id, photo=photo.read())

Но это привело к другой ошибке кодирования иного рода. Есть идеи, как мне загрузить фотографию?

ОБНОВЛЕНИЕ

Насколько я понял - sendPhoto () помещает chat_id и photo в data dict, а вот библиотечные методы с конца трассировки:

Тот, который используется в data.to_form ()

def to_form(self):
        """
        Returns:
            str:
        """
        form = []
        form_boundary = '--' + self.boundary

        # Add data fields
        for name, value in self.data.items():
            form.extend([
                form_boundary,
                'Content-Disposition: form-data; name="%s"' % name,
                '',
                str(value)
            ])

        # Add input_file to upload
        form.extend([
            form_boundary,
            'Content-Disposition: form-data; name="%s"; filename="%s"' % (
                self.input_name, self.filename
            ),
            'Content-Type: %s' % self.mimetype,
            '',
            self.input_file_content
        ])

        form.append('--' + self.boundary + '--')
        form.append('')

        return InputFile._parse(form)

И InputFile._parse (форма)

def _parse(form):
    """
    Returns:
        str:
    """
    if sys.version_info > (3,):
        # on Python 3 form needs to be byte encoded
        encoded_form = []
        for item in form:
            try:
                encoded_form.append(item.encode())
            except AttributeError:
                encoded_form.append(item)

        return b'\r\n'.join(encoded_form)
    return '\r\n'.join(form)

  • Используя Python 2.x или 3.x ?? Кодирование в Python 2.x - это боль ... 19.04.2016
  • Ах, спасибо, я уже читал это из трассировки ошибок. Давайте найдем решение для этого ... 20.04.2016
  • Хм, метод sendPhoto() ожидает файловый объект или строку ?? В первом примере вы используете open(), что приводит к файловому объекту, а во втором примере кода вы передаете строку (возвращаемую из _3 _) ... 20.04.2016
  • ну, похоже, ожидается файл, поскольку спецификация предлагает загрузить новую фотографию с использованием multipart / form-data 20.04.2016
  • поэтому моя попытка с photo.read (), вероятно, просто вводила в заблуждение 20.04.2016
  • Вы можете попробовать оба фрагмента кода с передачей файлового объекта с помощью open(). У вас бывают ошибки, они разные? Я бы попробовал использовать функцию file() вместо open(), что помогло мне, когда я получил ошибки кодирования в Python 2.7 ... 21.04.2016

Ответы:


1

Проверьте, нет ли в вашем card.image.path символов Unicode, в случае их наличия я бы рекомендовал кодировать в UTF-8. Посетите эту ссылку для получения дополнительной информации.

29.05.2016
  • Да, вот в чем проблема. 21.06.2016
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...