我如何使用 python 3 下载具有基本身份验证的 Teamcity 工件

how can I use python 3 to download a Teamcity artifact with basic auth

我正在尝试使用 python 3 从 teamcity 下载一个 zip 工件,但运气不佳。

在浏览器中我通常会这样做: http://USERNAME:PWD@SERVER/httpAuth/repository/downloadAll/dood_dad/latest.lastSuccessful

但是如果我用 urllib.request.urlretrieve 尝试这个,我会得到一个关于无效端口的异常 - 因为它不知道附加在前面的用户名和密码url 并在 ':' 之后作为端口进行解析 - 足够公平。

所以我想我需要使用 teamcitys httpAuth 东西并使用 url http://SERVERNAME/httpAuth/repository/downloadAll/dood_dad/latest.lastSuccessful

当我尝试时,我得到了 404 Unauthorized,这是我所期望的,因为我需要提供用户名和密码。

但我想不通。

我添加了这个:

auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(None,
                          uri=url_to_open,
                          user='userame',
                          passwd='password')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
local_filename, headers = urllib.request.urlretrieve(url)

但我仍然收到 HTTP 错误 401:未经授权

TIA。

您可以使用像 requests 这样的库,让我们将基本身份验证作为参数,在此处查看更多信息:http://docs.python-requests.org/en/latest/user/authentication/#basic-authentication

import requests
from requests.auth import HTTPBasicAuth
import shutil

response = requests.get('http://...', auth=HTTPBasicAuth('user', 'pass'), stream=True)

with open('filename.zip', 'wb') as out_file:
    shutil.copyfileobj(response.raw, out_file)

这工作正常:

import urllib
from urllib.request import HTTPPasswordMgrWithDefaultRealm

pwdmgr = HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None, uri=url, user='XXXX', passwd='XXXX')
auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
local_filename, headers = urllib.request.urlretrieve(url)

我不完全确定为什么新代码可以替代旧代码。

仅供参考:请求代码也没有用

response = requests.get('http://...', auth=HTTPBasicAuth('user', 'pass'), stream=True)

我一直收到未经授权的 http 错误

Obtaining Artifacts from a Build Script

import getpass
import subprocess

USERNAME = getpass.getuser()
PWD = getpass.getpass(prompt='PWD:', stream=None)
subprocess.run(['wget','http://'+USERNAME+':'+'PWD'+'@SERVER/httpAuth/repository/downloadAll/dood_dad/latest.lastSuccessful'])