Как реализовать curl -u в Python? - PullRequest
9 голосов
/ 01 июня 2011

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

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

Возвращает все личные проблемы проекта моего клиента.Однако я не могу выяснить, как реализовать это в Python.Оба найденных мной способа (например, Python urllib2 Basic Auth Problem ) не работают, они возвращают 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 ]

9 голосов
/ 11 декабря 2011
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

5 голосов
/ 01 июня 2011

Если это 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())
1 голос
/ 16 марта 2017

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

 r = requests.get('https://user:pass@api.github.com')
0 голосов
/ 01 июня 2011

Используйте pycurl , который является интерфейсом Python для libcurl .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...