如何在Python中实现curl -u?
我正在尝试使用 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 个回答
3
你也可以这样做
r = requests.get('https://user:pass@api.github.com')
19
r = requests.get('https://api.github.com', auth=('user', 'pass'))
在这里,使用Python的requests
库是最合适的选择。我在工作和家里都经常使用requests
来与各种网络服务进行交互。相比之前的工具,它使用起来真是太舒服了。需要注意的是,auth
这个参数只在需要身份验证的请求中使用。因此,你可以根据需要来用它,也就是说,并不是每次调用GitHub都需要它,只有那些需要登录的请求才需要。例如:
r = requests.get('https://api.github.com/gists/starred', auth=('user', 'pass'))
关于GitHub登录的详细说明可以在这里找到:
6
如果出现404错误,那可能是你输入的链接不对。如果是403错误,可能是你设置的权限范围有问题。
首先,你传给add_password的链接是完整的,但其实你只需要传基础链接就可以了。另外,不用用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())