2010-10-19 13 views
9

a ricciolo faccio questo:codice Python come ricciolo

curl -u email:password http://api.foursquare.com/v1/venue.json?vid=2393749 

Come posso fare la stessa cosa in Python?

+1

Sede [Python urllib2 Auth di base Problema ] (http: // StackOverflow .com/questions/2407126/python-urllib2-basic-auth-problem), che riguarda l'uso di Basic Auth con Foursquare su Python. –

risposta

4

"Il problema potrebbe essere che le librerie Python, per HTTP-standard, prima di inviare una richiesta non autenticata, e solo se è risposto con un 401 tentativi, sono le credenziali corrette inviata se. i server di Foursquare non fanno "l'autenticazione del tutto normale", quindi le librerie non funzioneranno

Provare a utilizzare le intestazioni di fare l'autenticazione:."

taked dalla Python urllib2 Basic Auth Problem

import urllib2 
import base64 

req = urllib2.Request('http://api.foursquare.com/v1/venue.json?vid=%s' % self.venue_id) 
req.add_header('Authorization: Basic ',base64.b64encode('email:password')) 
res = urllib2.urlopen(req) 
0

Usa pycurl

C'è una discussione su SO per i tutorial

un esempio tipico:

import sys 
import pycurl 

class ContentCallback: 
     def __init__(self): 
       self.contents = '' 

     def content_callback(self, buf): 
       self.contents = self.contents + buf 

t = ContentCallback() 
curlObj = pycurl.Curl() 
curlObj.setopt(curlObj.URL, 'http://www.google.com') 
curlObj.setopt(curlObj.WRITEFUNCTION, t.content_callback) 
curlObj.perform() 
curlObj.close() 
print t.contents 
+0

Puoi usare 'pycurl', ma non è necessario. È abbastanza possibile usare la libreria standard. Vedi la domanda che ho linkato sopra. –

6

Ecco l'equivalente in pycurl:

import pycurl 
from StringIO import StringIO 

response_buffer = StringIO() 
curl = pycurl.Curl() 

curl.setopt(curl.URL, "http://api.foursquare.com/v1/venue.json?vid=2393749") 

curl.setopt(curl.USERPWD, '%s:%s' % ('youruser', 'yourpassword')) 

curl.setopt(curl.WRITEFUNCTION, response_buffer.write) 

curl.perform() 
curl.close() 

response_value = response_buffer.getvalue() 
3

Sono più a suo agio in esecuzione il ricciolo riga di comando attraverso il sottoprocesso. Ciò evita tutte le possibili mal di testa corrispondenti alla versione di python, pycurl e libcurl. L'osservazione che pycurl non è stata toccata in 2 anni, ed è elencata solo come suppportata attraverso Python 2.5, mi ha reso cauto. - John

import subprocess 

    def curl(*args): 
     curl_path = '/usr/bin/curl' 
     curl_list = [curl_path] 
     for arg in args: 
      curl_list.append(arg) 
     curl_result = subprocess.Popen(
        curl_list, 
        stderr=subprocess.PIPE, 
        stdout=subprocess.PIPE).communicate()[0] 
     return curl_result 

    answer = curl('-u', 'email:password', 'http://api.foursquare.com/v1/venue.json?vid=2393749') 
1

se l'uso human_curl è possibile scrivere del codice

importazione human_curl come scagliare

r = hurl.get('http://api.foursquare.com/v1/venue.json?vid=2393749', auth=('email','password')) 

dati JSON in r.content