python api upload imgur

python - imgur api



Cómo crear una solicitud anónima para APIv3 de Imgur (2)

Hace un tiempo, hice una función de python que tomaba una URL de una imagen y la pasaba a Imgur''s API v2. Dado que me han notificado que la API v2 va a estar en desuso, he intentado hacerlo usando API v3.

Como dicen en la documentación de Imgur API:

[Enviar] un encabezado de autorización con su client_id junto con sus [...] solicitudes también funciona si desea cargar imágenes de forma anónima (sin que la imagen esté vinculada a una cuenta). Esto nos permite saber qué aplicación está accediendo a la API. **

Autorización: ID de cliente YOURCLIENTID

No está claro para mí (especialmente con las cursivas que ponen) si quieren decir que el encabezado debe ser {''Authorization'': ''Client-ID '' + clientID} , o {''Authorization: Client-ID '': clientID} , o {''Authorization:'', ''Client-ID '' + clientID} , o alguna otra variación ...

De cualquier manera, lo intenté y esto es lo que obtuve (usando Python 2.7.3):

def sideLoad(imgURL): img = urllib.quote_plus(imgURL) req = urllib2.Request(''https://api.imgur.com/3/image'', urllib.urlencode([(''image'', img), (''key'', clientSecret)])) req.add_header(''Authorization'', ''Client-ID '' + clientID) response = urllib2.urlopen(req) return response.geturl()

Esto me parece que hace todo lo que Imgur quiere que haga: tengo el punto final correcto, pasando los datos a urllib2.Request lo hace una solicitud POST de acuerdo con los documentos de Python, estoy pasando el parámetro de imagen con la forma- URL codificada, también intenté darle el secreto de mi cliente como un parámetro POST ya que recibí un error que decía que necesitaba una identificación (aunque no mencioné la necesidad de usar el secreto de mi cliente en ninguna parte de la documentación relevante). Agrego el encabezado Authorization y parece ser el formulario correcto, así que ... ¿por qué recibo un error 400: Bad Request?

Pregunta lateral: Podría ser capaz de depurarlo si pudiera ver el error real que devuelve Imgur, pero como devuelve un estado HTTP erróneo, Python muere y me da uno de esos trazos de pila nauseabundos. ¿Hay alguna manera de que Python pueda dejar de lloriquear y darme el mensaje de error JSON que sé que Imgur devuelve?


Bueno, estaré condenado. Traté de sacar las funciones de codificación y simplemente formando la cuerda, y lo hice funcionar. Supongo que la API de Imgur espera la URL no codificada en la forma?

Oh ... ¿o fue porque utilicé tanto quote_plus () como url_encode (), codificando la URL dos veces? Eso parece aún más probable ...

Esta es mi solución de trabajo, por fin, para algo que me llevó un día en el que pensé que me llevaría una hora como máximo:

def sideLoad(imgURL): img = urllib.quote_plus(imgURL) req = urllib2.Request(''https://api.imgur.com/3/image'', ''image='' + img) req.add_header(''Authorization'', ''Client-ID '' + clientID) response = urllib2.urlopen(req) response = json.loads(response.read()) return str(response[u''data''][u''link''])

No es una versión final, claro, todavía carece de algunas pruebas (veré si puedo deshacerme de quote_plus (), o si es preferible usar url_encode solo) así como de manejar errores (especialmente para grandes gifs, el caso más frecuente de falla).

¡Espero que esto ayude! Busqué en Google, Imgur y y la información sobre el uso anónimo de APIv3 fue confusa (y se ahogó en un mar de cosas terriblemente horripilantes de OAuth2).


En python 3.4 usando urllib, pude hacerlo así:

import urllib.request import json opener = urllib.request.build_opener() opener.addheaders = [("Authorization", "Client-ID"+ yourClientId)] jsonStr = opener.open("https://api.imgur.com/3/image/"+pictureId).read().decode("utf-8") jsonObj = json.loads(jsonStr) #jsonObj is a python dictionary of the imgur json response.