2012-11-02 20 views
5

Próbuję pobrać informacje z adresu URL wymagającego logowania NTLM.Python NTLM zaloguj się

Pierwotnie otrzymałem błąd 401 i po kilku poprawkach udało się wyciągnąć stronę z informacją, że wprowadziłem nieprawidłowe dane uwierzytelniające.

Nazwa użytkownika i hasło są prawidłowe, ale nie mogę ominąć strony z nieprawidłowymi danymi logowania.

Lgn2.py:

import urllib2 
import HTTPNtlmAuthHandler 

login = open('c:/temp/login.txt') 
open = login.read() 
to = open.split() 
user = str(to[0]) 
password = str(to[1]) 

url = "http://INSERT URL HERE.com/" 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 


opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 


response = urllib2.urlopen(url) 
print(response.read()) 

Mam użytkownika zawierający \ stosując metodę powyżej nie dostać podwójny ukośnik w nazwie podczas drukowania. Czy powinienem trzymać go tam, gdzie druk będzie miał podwójny ukośnik odwrotny w nazwie, tak samo jak plik txt ma zapisaną nazwę użytkownika?

Plik txt jest tylko dokumentem txt zawierającym tylko: domena \ użytkownik \ nazwa hasło.

Drugi ukośnik odwrotny w środku nazwy użytkownika będzie częścią nazwy użytkownika.

Każda pomoc zostanie doceniona.

+0

http://code.google.com/p/python-ntlm/ ma nazwę użytkownika, który wygląda jak „domena \ użytkownik”. Czy Twoja nazwa użytkownika zawiera domenę? –

+0

tak bez domeny zwróci 401 –

+1

Jakiego rodzaju mechanizmu uwierzytelniania używa Twoja strona internetowa? Jeśli nie można ustawić podstawowego uwierzytelnienia, musisz użyć skrótu - zobacz rozszerzony przykład na http://code.google.com/p/python-ntlm/ – Seth

Odpowiedz

2

Może nie używać raw string:

ile na „R” lub przedrostek „R” jest obecny, sekwencje w ciągi są interpretowane zgodnie z zasadami podobnymi do tych stosowanych przez Standard C .

>>> 'domain\user' 
    File "<stdin>", line 1 
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 6-7: truncated \uXXXX escape 
>>> r'domain\user' 
'domain\\user' 

To działa na mnie (w Pythonie 2, a nie 3):

from ntlm import HTTPNtlmAuthHandler 
import urllib2 

user = r'domain\user' 
password = "passphrase" 
passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, "http://projects/", user, password) 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 
opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 

url = "http://projects/_vti_bin/owssvr.dll?Cmd=Display&List=etc" 
response = urllib2.urlopen(url) 
headers = response.info() 
print("headers: {}".format(headers)) 
body = response.read() 
print("response: " + body) 
+0

Twój wpis jest bardzo pomocny, chciałem też dodać nagłówek uwierzytelniania w ntlm, którego nazwa zmiennej to Userauth, pomóż mi –

+0

Dziękuję za to! – bernie

6

Nasza firma ma serwer proxy i korzysta z NTLM. Aby połączyć bez konieczności umieszczania poświadczeń w skrypcie użyłem:

import win32com.client 

url = 'https://...' 

h = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1') 
h.SetAutoLogonPolicy(0) 
h.Open('GET', url, False) 
h.Send() 
result = h.responseText 
result 
+0

Gdzie używasz winreg w tym? – Garan

+0

Mogłem używać Winreg dla czegoś innego w moim kodzie. Nie pamiętam. Nie sądzę, aby powyższe zadziałało. Daj mi znać, jak sobie z tym radzisz. – toasteez

+0

Cóż, udało się otworzyć strony ... Ale potem okazało się, że musimy uruchomić nasz program na Linuksie i od tego czasu nie sprawdzałem. – Garan