Как реализовать curl-u в Python?

Я пытаюсь использовать http://developer.github.com/v3/ для извлечения проблем проекта. Это работает:

curl -u "Littlemaple:mypassword" https://api.github.com/repos/MyClient/project/issues

он возвращает все частные вопросы проекта моего клиента. Однако я не могу узнать, как реализовать это в Python. Оба способа я нашел (например,Python urllib2 основная проблема аутентификации) не работает, они возвращают 404 или 403 ошибки:

def fetch(url, username, password):
    """Wonderful method found on forums which does not work.""""
    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, url, username, password)
    urllib2.install_opener(urllib2.build_opener(urllib2.HTTPBasicAuthHandler(passman)))

    req = urllib2.Request(url)
    f = urllib2.urlopen(req)
    return f.read()

...и:

def fetch(url, username, password):
    """Wonderful method found on forums which does not work neither.""""
    request = urllib2.Request(url)
    base64string = base64.encodestring('%s:%s' % (username, password)).replace('n', '')
    request.add_header("Authorization", "Basic %s" % base64string)   
    return urllib2.urlopen(request).read()

какие идеи? Заранее спасибо!

4 ответов


Если это 404, у вас, вероятно, просто неправильный URL. Если это 403, возможно, вы ошибаетесь.

для начала вы передаете URL-адрес add_password, когда на самом деле вы должны передавать только базовый URL-адрес. Кроме того, вместо install_opener вы, вероятно, должны просто создать новый открыватель.

посмотреть этот рецепт для примера:

class NoOpHandler(urllib2.HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newUrl):
        return None

passmanager = urllib2.HTTPPasswordMgrWithDefaultRealm()
passmanager.add_password(None, baseurl, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(passmanager)
opener = urllib2.build_opener(auth_handler, NoOpHandler())

r = requests.get('https://api.github.com', auth=('user', 'pass'))

запросы Python-это путь сюда. Я широко использую запросы на работе и дома для различных взаимодействий с веб-службами. Это радость по сравнению с тем, что было до него. Примечание: ключевое слово auth arg работает на любом вызове, который требует auth. Таким образом, вы можете использовать его экономно, т. е. вам это не нужно для каждого вызова против github, только те, которые требуют Логинов. Например:

r = request.get('https://api.github.com/gists/starred, auth=('user', 'pass'))

логин github документирован здесь:

http://pypi.python.org/pypi/requests/0.6.1


вы также можете сделать это таким образом

 r = requests.get('https://user:pass@api.github.com')

использовать pycurl из который является интерфейсом python для libcurl.