2016-10-24 4 views
1

Я использую urllib.request в python, чтобы попытаться загрузить некоторую информацию о сборке из Teamcity. Этот запрос работал без имени пользователя и пароля, однако последнее изменение безопасности означает, что я должен использовать имя пользователя и пароль. Таким образом, я изменил пытался каждый из этих двух решений ниже:Ошибка HTTP 401: Несанкционированное использование urllib.request.urlopen

Покушение 1)

url = 'http://<domain>/httpAuth/app/rest/buildTypes/<buildlabel>/builds/running:false?count=1&start=0' 

# create a password manager 
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() 

# Add the username and password. 
top_level_url = "http://<domain>/httpAuth/app/rest/buildTypes/id:<buildlabel>/builds/running:false?count=1&start=0" 
password_mgr.add_password(None, top_level_url, username, password) 

handler = urllib.request.HTTPBasicAuthHandler(password_mgr) 

# create "opener" (OpenerDirector instance) 
opener = urllib.request.build_opener(handler) 

# use the opener to fetch a URL 
opener.open(url) 

Попытка 2

url = 'http://<username>:<password>@<domain>/httpAuth/app/rest/buildTypes/id:buildlabel/builds/running:false?count=1&start=0' 
rest_api = urllib.request.urlopen(url) 

Оба эти возвращения "HTTP Error 401: Несанкционированный". Однако, если я должен был напечатать «url» и скопировать этот вывод в браузер, ссылка работает отлично. Но при использовании через python я получаю вышеуказанную ошибку.

Я использую что-то очень похожее в другом скрипте Perl, и это отлично работает.

* решаемые НИЖЕ *

+0

сервер может проверить другие элементы - как HTTP-заголовки, печенье, и т. д. Вы можете использовать DevTools в Chrome/Firefox, чтобы проверить, что браузер отправляет серверу - то есть. Заголовки HTTP. – furas

ответ

1

решаемые с помощью этого.

credentials(url, username, password) 
rest_api = urllib2.urlopen(url) 
latest_build_info = rest_api.read() 
latest_build_info = latest_build_info.decode("UTF-8") 
# Then parse this xml for the information I want. 

def credentials(self, url, username, password): 
    p = urllib2.HTTPPasswordMgrWithDefaultRealm() 
    p.add_password(None, url, username, password) 
    handler = urllib2.HTTPBasicAuthHandler(p) 
    opener = urllib2.build_opener(handler) 
    urllib2.install_opener(opener) 

Как примечание стороны, я тогда хочу, чтобы загрузить файл ..

credentials(url, username, password) 
urllib2.urlretrieve(url, downloaded_file) 

Где Ссылка:

http://<teamcityServer>/repository/download/<build Label>/<BuildID>:id/Filename.zip 
+0

Урлиб2 не имеет метода urlretrieve? Это было бы ясно, – Yusufk

Смежные вопросы