discord.py : Объект ‘JpegImageFile’ не имеет атрибута ‘startswith’

#python #python-requests #python-imaging-library #discord.py #discord.py-rewrite

#python #python-запросы #python-imaging-library #discord.py

Вопрос:

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

  Traceback (most recent call last):
  File "C:UsersPCAppDataRoamingPythonPython37site-packagesdiscordclient.py", line 218, in _run_event
    await coro(*args, **kwargs)
  File "D:Documentspython projectsvotingbot.py", line 84, in on_message
    await message.guild.create_custom_emoji(name=emoji_name, image=img)
  File "C:UsersPCAppDataRoamingPythonPython37site-packagesdiscordguild.py", line 1202, in create_custom_emoji
    img = utils._bytes_to_base64_data(image)
  File "C:UsersPCAppDataRoamingPythonPython37site-packagesdiscordutils.py", line 264, in _bytes_to_base64_data
    mime = _get_mime_type_for_image(data)
  File "C:UsersPCAppDataRoamingPythonPython37site-packagesdiscordutils.py", line 251, in _get_mime_type_for_image
    if data.startswith(b'x89x50x4Ex47x0Dx0Ax1Ax0A'):
AttributeError: 'JpegImageFile' object has no attribute 'startswith'
  

Вот мой код:

 import discord
import asyncio
from urllib.request import urlretrieve
from PIL import Image
import requests
from io import BytesIO
# obviously the setup stuff like def on_message is cut out for brevity

url = message.attachments[0].url
response = requests.get(url)
img = Image.open(BytesIO(response.content))
emoji_name = message.content.replace("!addemojipoll ","")
await message.guild.create_custom_emoji(name=emoji_name, image=img)
  

Это потому, что img это не байтоподобный объект, как того требует create_custom_emoji ?

Ответ №1:

Ошибка сообщает вам, что в какой-то момент discord.py получил JpegImageFile объект, ожидая объект, который поддерживает .startswith(b'x89x50x4Ex47x0Dx0Ax1Ax0A') . Это, как вы уже догадались, объект, подобный байтам.

Поэтому вам следует использовать bytes объект вместо объекта PIL; и это даже упрощает ваш код, потому что у вас с самого начала был объект bytes:

 response = requests.get(url)
img = response.content
await message.guild.create_custom_emoji(name=emoji_name, image=img)