13

我正在尝试使用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

4 回答 4

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

Pythonrequests是这里的必经之路。我一直requests在工作和家庭中广泛使用各种 Web 服务交互。与之前的产品相比,使用它是一种乐趣。注意:auth关键字 arg 适用于任何需要身份验证的调用。因此,您可以谨慎使用它,即您不需要在每次调用 GitHub 时都使用它,只需要那些需要登录的调用。例如:

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

GitHub 登录记录在此处:

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

于 2011-12-11T18:13:01.297 回答
6

如果是 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())
于 2011-06-01T19:25:51.220 回答
3

你也可以这样做

 r = requests.get('https://user:pass@api.github.com')
于 2017-03-16T12:19:45.437 回答
0

使用pycurl,它是libcurl的 python 接口。

于 2011-06-01T17:39:57.810 回答