2013-06-28 16 views
11

Desidero scrivere un'app per abbreviare l'URL. Questo è il mio codice:come utilizzare l'API Shortener di Google con Python

import urllib, urllib2 
import json 
def goo_shorten_url(url): 
    post_url = 'https://www.googleapis.com/urlshortener/v1/url' 
    postdata = urllib.urlencode({'longUrl':url}) 
    headers = {'Content-Type':'application/json'} 
    req = urllib2.Request(
     post_url, 
     postdata, 
     headers 
     ) 
    ret = urllib2.urlopen(req).read() 
    return json.loads(ret)['id'] 

quando si esegue il codice per ottenere un URL molto piccolo, viene generata un'eccezione: urllib2.HTTPError: HTTP Error 400: Bad Requests. Cosa c'è di sbagliato con questo codice?

risposta

16

ho provato il codice e non poteva farlo funzionare neanche, così ho scritto con requests:

import requests 
import json 

def goo_shorten_url(url): 
    post_url = 'https://www.googleapis.com/urlshortener/v1/url' 
    payload = {'longUrl': url} 
    headers = {'content-type': 'application/json'} 
    r = requests.post(post_url, data=json.dumps(payload), headers=headers) 
    print r.text 

Edit: il codice a lavorare con urllib:

def goo_shorten_url(url): 
    post_url = 'https://www.googleapis.com/urlshortener/v1/url' 
    postdata = {'longUrl':url} 
    headers = {'Content-Type':'application/json'} 
    req = urllib2.Request(
     post_url, 
     json.dumps(postdata), 
     headers 
    ) 
    ret = urllib2.urlopen(req).read() 
    print ret 
    return json.loads(ret)['id'] 
+0

grazie per il vostro reply.The API di urllib e urllib2 è davvero ugly.actually, ho scritto il app con richieste e funziona anche, ma perché dovrei sostituire urllib.urlencode con json.dumps? – YuYang

+0

perché 'urlencode' passa chiave: valore separato da & e che cosa si aspetta l'API di google è un json come data {chiave: valore}. [urlencode] (http://docs.python.org/2/library/urllib.html#urllib.urlencode) – PepperoniPizza

+0

forse dovrei leggere il documento API più attentamente. Grazie mille .... – YuYang

2

So che questa domanda è vecchio ma è alto su Google.

Un'altra cosa da provare è la libreria pyshorteners che è molto semplice da implementare.

Questo è il link:

https://pypi.python.org/pypi/pyshorteners

2

Con una chiave API:

import requests 
import json 

def shorten_url(url): 
    post_url = 'https://www.googleapis.com/urlshortener/v1/url?key={}'.format(API_KEY) 
    payload = {'longUrl': url} 
    headers = {'content-type': 'application/json'} 
    r = requests.post(post_url, data=json.dumps(payload), headers=headers) 
    return r.json()