2010-10-19 13 views
9

en rizo hago esto:código Python como rizo

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

¿Cómo puedo hacer esto mismo en Python?

+1

Ver [Python urllib2 autenticación básica Problema ] (http: // stackoverflow .com/questions/2407126/python-urllib2-basic-auth-problem), que trata de usar Basic Auth con Foursquare en Python. –

Respuesta

4

"El problema podría ser que las bibliotecas de Python, por HTTP estándar, enviar primero una solicitud no autenticado, y sólo si se respondió con un reintento 401, se envían las credenciales correctas Si. los servidores de Foursquare no hacen "totalmente autenticación estándar", entonces las bibliotecas no funcionarán

Trate de usar cabeceras para realizar la autenticación:".

tomando desde 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

Uso pycurl

Hay una discusión sobre SO tutoriales

un ejemplo típico:

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

Puede usar 'pycurl', pero no es obligatorio. Es bastante posible usar la biblioteca estándar. Vea la pregunta que he vinculado anteriormente. –

6

Aquí es el equivalente en 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

estoy más cómodo correr el rizo línea de comandos a través de subproceso. Esto evita todos los dolores de cabeza posibles de coincidencia de versión de python, pycurl y libcurl. La observación de que pycurl no se ha tocado en 2 años, y solo aparece como compatible a través de Python 2.5, me hizo desconfiar. - 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

si el uso human_curl puede escribir algún código

human_curl importación como lanzan

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

datos JSON en r.content