2010-10-19 10 views
9

w curl zrobić to:kod Python jak curl

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

Jak mogę zrobić to samo w Pythonie?

+1

See [Python urllib2 podstawowe Autentyczna Problem ] (http: // stackoverflow .com/questions/2407126/python-urllib2-basic-auth-problem), który dotyczy korzystania z Basic Auth z Foursquare na Pythonie. –

Odpowiedz

4

„Problem może być, że biblioteki Python, za HTTP-Standard, najpierw wysłać nieuwierzytelniony wniosek, i to tylko wtedy, to odpowiedział 401 ponownego są poprawne poświadczenia wysłana If. Foursquare serwery nie rób „całkowicie standardowego uwierzytelniania”, a następnie biblioteki nie będzie działać

Spróbuj użyć nagłówków zrobić uwierzytelniania.”

stwierdzałem z 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

Zastosowanie pycurl

znajduje się omówienie tak TUTORIALS

typowego przykładu

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

Możesz użyć 'pycurl', ale nie jest to wymagane. Jest całkiem możliwe korzystanie z biblioteki standardowej. Zobacz pytanie, które podałem powyżej. –

6

Oto odpowiednik w 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

jestem bardziej komfortowe prowadzenie zwijania linii poleceń poprzez podproces. W ten sposób unika się wszystkich potencjalnych wersji pasujących do bóle głowy pythona, pycurl i libcurl. Obserwacja, że ​​pycurl nie została dotknięta w ciągu 2 lat i jest wymieniona tylko jako wspierana przez Python 2.5, wzbudziła we mnie ostrożność. - 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

jeśli użycie human_curl można napisać kod

import human_curl jak rzucić

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

danych JSON w r.content