2015-11-25 20 views
11

Sto utilizzando questo client python-instagram con Python 3.4.3 su MacOS.KeyError: "data" con client Python Instagram API

miei passi:

  • ha registrato un nuovo cliente su instagram, ricevuto client_id e client_secret
  • Pip installare python-instagram
  • Copia sample_app.py al mio Mac

ho seguito le istruzioni su Sample app, ho autorizzato con successo la mia app via instagram e ho provato questo list of examples, ma nessuno di loro ha funzionato. Dopo il mio clic l'intestazione <h2> e il contatore delle richieste API cambiano e vedo Remaining API Calls = 486/500.

Se provo a ottenere User Recent Media un'eccezione KeyError: 'data' mostra nel mio terminale. Se cancello la costruzione try - except, lasciando il blocco in try, quando vedrò "Errore: 500 Errore interno del server".

Ecco il traceback:

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' 

Tutto il codice che ho usato è dal campione del client ufficiale di Python API da Instagram.

risposta

21

C'è un open Github issue per questo bug, un fix è stato inviato, ma non è ancora fusa.

Aggiungere la correzione di una riga a models.py sul pacchetto installato.

Apri con sudo:

sudo vi /Library/Python/2.7/site-packages/instagram/models.py # Use relevant python version 

On line 99, aggiungere questo:

if "data" in entry["comments"]: 

indentazione corretta su due righe successive:

 for comment in entry['comments']['data']: 
      new_media.comments.append(Comment.object_from_dictionary(comment)) 
+1

Che ha funzionato per me! Alcuni bug ... L'ho provato su Python 3.4. –

+0

Mi ci è voluto un po 'per scoprire questo bug e "hackerarlo" ma non posso sistemarlo sui nostri dockers perché ottengono build dalle fonti dei pip. Spero davvero che uniscano questa correzione al ramo principale. – anber

+0

Ho anche installato python-instagram via pip, ma ho potuto risolvere il problema dopo l'istruzione @Forge. Se si digita 'pip uninstall python-instagram', il sistema mostrerà un elenco dei file da disinstallare, con le rispettive posizioni, incluso models.py. Dì "n" a "Procedi (y/n)?", Per NON disinstallare python-instagram, e ora sai dove si trova il file. –

5

Sembra che ci sia un bug in models.py. Se commentate le righe 99 e 100 in quel file, la "app di esempio" funzionerà, o almeno sembrerà funzionare. Ovviamente, questa non è una correzione "reale", ma mostra che non è un problema con il programma Python di esempio o Instagram.

Line 99 # for comment in entry['comments']['data']: 
    Line 100 #  new_media.comments.append(Comment.object_from_dictionary(comment)) 
+0

Questa correzione funziona anche per me, ma spero che non sia la soluzione "finale" – Stefano

1

+1 per risposta da @forge

F o gli utenti di docker (come richiesto in un commento), lanciare il repository python-instagram, modificare e quindi installare pip tramite github.

O semplicemente usare qualcun altro bivio con la seguente riga nel vostro Dockerfile:

pip install git+https://github.com/zgazak/python-instagram 

0

Questo non è davvero una risposta solo una soluzione rapida in base alla risposta da @forge quando stai lavorando in ambienti come la finestra mobile o un ambiente che non ha un terminale leggibile.

sed -i '99,100 s/^/#/' /usr/local/lib/python3.5/site-packages/instagram/models.py 
+1

Se è "non proprio una risposta", allora dovresti lasciarlo come commento quando hai abbastanza reputazione per lasciare commenti. –