如何在Python中实现curl -u?

14 投票
4 回答
8208 浏览
提问于 2025-04-16 18:46

我正在尝试使用 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登录的详细说明可以在这里找到:

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

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())

撰写回答