Код Python вроде curl - PullRequest
       31

Код Python вроде curl

9 голосов
/ 20 октября 2010

в curl я делаю это:

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

Как я могу сделать то же самое в Python?

Ответы [ 5 ]

6 голосов
/ 20 октября 2010

Вот эквивалент в 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()
4 голосов
/ 04 ноября 2010

"Проблема может заключаться в том, что библиотеки Python в соответствии со стандартом HTTP сначала отправляют запрос без проверки подлинности, а затем, только если он отвечает с помощью повторной попытки 401, отправляются правильные учетные данные. Если серверы Foursquare этого не делают" полностью стандартная аутентификация ", тогда библиотеки не будут работать.

Попробуйте использовать заголовки для аутентификации: "

взято из Python urllib2 Основная проблема с аутентификацией

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)
3 голосов
/ 23 октября 2010

Мне удобнее запускать командную строку curl через подпроцесс.Это позволяет избежать всех потенциальных проблем с совпадением версий Python, Pycurl и libcurl.Наблюдение, что pycurl не затрагивался в течение 2 лет, и только перечислено как поддерживаемое через Python 2.5, заставило меня насторожиться.- Джон

   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 голос
/ 14 апреля 2012

если вы используете human_curl, вы можете написать некоторый код

импортировать human_curl как HURL

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

JSON-данные в r.content

0 голосов
/ 20 октября 2010

Используйте pycurl

Существует обсуждение SO для учебных пособий

Типичный пример:

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
...