KeyError: "данные" с клиентом API Python
Я использую этот клиент python-instagram
с Python 3.4.3
на MacOS
.
Мои шаги:
- Зарегистрированный новый клиент на
instagram
, полученный client_id и client_secret
- Пиковая установка python-instagram
- Скопировать sample_app.py в мой mac
Я выполнил инструкции Sample app
, я успешно разрешил свое приложение через instagram и попробовал этот список примеров, но никто из них не работал. После моего клика заголовок <h2>
и счетчик запросов API меняются, и я вижу Remaining API Calls = 486/500
.
Если я попытаюсь получить User Recent Media
, в моем терминале появится исключение KeyError: 'data'
. Если я удалю конструкцию try - except
, оставив блок в try
, когда я увижу "Ошибка: 500 Внутренняя ошибка сервера".
Вот трассировка:
Traceback (most recent call last):
File "/Users/user/.envs/insta/lib/python3.4/site-packages/bottle.py", line 862, in _handle
return route.call(**args)
File "/Users/user/.envs/insta/lib/python3.4/site-packages/bottle.py", line 1732, in wrapper
rv = callback(*a, **ka)
File "sample_app.py", line 79, in on_recent
recent_media, next = api.user_recent_media()
File "/Users/user/.envs/insta/lib/python3.4/site-packages/instagram/bind.py", line 197, in _call
return method.execute()
File "/Users/user/.envs/insta/lib/python3.4/site-packages/instagram/bind.py", line 189, in execute
content, next = self._do_api_request(url, method, body, headers)
File "/Users/user/.envs/insta/lib/python3.4/site-packages/instagram/bind.py", line 151, in _do_api_request
obj = self.root_class.object_from_dictionary(entry)
File "/Users/user/.envs/insta/lib/python3.4/site-packages/instagram/models.py", line 99, in object_from_dictionary
for comment in entry['comments']['data']:
KeyError: 'data'
Весь код, который я использовал, - это образец официального клиента API python от Instagram.
Ответы
Ответ 1
Для этой ошибки существует Github issue
fix
, но он еще не слился.
Добавьте исправление одной строки в models.py
на установленном вами пакете.
Открыть с помощью sudo:
sudo vi /Library/Python/2.7/site-packages/instagram/models.py # Use relevant python version
В строке 99 добавьте следующее:
if "data" in entry["comments"]:
Исправить отступы на следующих двух строках:
for comment in entry['comments']['data']:
new_media.comments.append(Comment.object_from_dictionary(comment))
Ответ 2
Похоже, что в models.py есть ошибка. Если вы прокомментируете строки 99 и 100 в этом файле, "пример приложения" будет работать или, по крайней мере, будет работать. Очевидно, что это не "реальное" исправление, но оно показывает, что это не проблема с образцом программы Python или Instagram.
Line 99 # for comment in entry['comments']['data']:
Line 100 # new_media.comments.append(Comment.object_from_dictionary(comment))
Ответ 3
+1 для ответа от @forge
Для пользователей докеров (как задано в комментарии), разворачивайте репозиторий python-instagram, редактируйте, а затем устанавливайте pip через github.
Или просто используйте чужую вилку со следующей строкой в файле Docker:
pip install git+https://github.com/zgazak/python-instagram
python instagram-api docker
Ответ 4
На самом деле это не просто быстрый подход, основанный на ответе @forge, когда вы работаете в таких средах, как докер или среда, в которой нет читаемого терминала.
sed -i '99,100 s/^/#/' /usr/local/lib/python3.5/site-packages/instagram/models.py