MarshalX / yandex-music-api

Неофициальная Python библиотека для работы с API сервиса Яндекс.Музыка
https://yandex-music.rtfd.io
GNU Lesser General Public License v3.0
944 stars 81 forks source link

Ошибка AttributeError при инициализации библиотеки #610

Closed DmitryKolyadin closed 1 year ago

DmitryKolyadin commented 1 year ago

Описание При инициализации библиотеки ошибка AttributeError: 'str' object has no attribute 'copy'

Воспроизведение Шаги для воспроизведения бага:

Ожидаемое поведение Ожидалась инициализации библиотеки и корректная работа.

Логи

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/client.py", line 70, in wrapper
    result = method(*args, **kwargs)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/client.py", line 156, in init
    self.me = self.account_status()
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/client.py", line 70, in wrapper
    result = method(*args, **kwargs)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/client.py", line 177, in account_status
    return Status.de_json(result, self)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/status.py", line 76, in de_json
    data['subscription'] = Subscription.de_json(data.get('subscription'), client)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/subscription.py", line 64, in de_json
    data['operator'] = Operator.de_list(data.get('operator'), client)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/operator.py", line 71, in de_list
    return [cls.de_json(operator, client) for operator in data]
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/operator.py", line 71, in <listcomp>
    return [cls.de_json(operator, client) for operator in data]
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/operator.py", line 51, in de_json
    data['deactivation'] = Deactivation.de_list(data.get('deactivation'), client)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/deactivation.py", line 62, in de_list
    return [cls.de_json(deactivation, client) for deactivation in data]
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/deactivation.py", line 62, in <listcomp>
    return [cls.de_json(deactivation, client) for deactivation in data]
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/account/deactivation.py", line 44, in de_json
    data = super(Deactivation, cls).de_json(data, client)
  File "/home/devdk/.local/lib/python3.8/site-packages/yandex_music/base.py", line 59, in de_json
    data = data.copy()
AttributeError: 'str' object has no attribute 'copy'

Дополнительная информация

Предыстория Я активный пользователь тг бота @music_yandex_bot. Примерно месяц назад бот полностью перестал отвечать на любые мои команды. Вчера мне надоело пользоваться костылями и я написал @MarshalX о проблеме, получил совет использовать третий аккаунт:( Решил сам посмотреть работает ли библиотека. Получил новый токен, запустил и увидел это ошибку.

Проблема как я понял кроется в том что ЯМ АПИ возвращает в одном из методов лист в виде строки. Ошибку получают не многие пользователи, наверное, из-за того что ошибка возникает при обработке информации о подписке через мобильного оператора. (Добавил принтов в функции десериализации)

{
  "operator": [
    {
      "product_id": "beeline-ru-standalone-cpa-plus-stable.684000005",
      "phone": "",
      "payment_regularity": "Списание средств производится автоматически каждый месяц",
      "deactivation": "[{'method':'ussd','instructions':'Для отключения перейдите в Личный Кабинет билайн'}]",
      "title": "Специальное предложение",
      "suspended": false
    }
  ],
  ...
}

Библиотека пытается десериализовать данные и начинает фором проходится по строке "[{'method':'ussd','instructions':'Для отключения перейдите в Личный Кабинет билайн'}]" и из-за этого возникает ошибка.

У себя, локально, починил с помощью проверки на тип (yandex_music/account/deactivation.py:61)

if isinstance(data, str):
    data = json.loads(data)