2014-05-10 15 views
6

Przesyłanie wiadomości za pomocą Pythona i próbuję użyć tego https://updates.opendns.com/nic/update?hostname=, gdy dojdziesz do adresu URL, wyświetli się nazwa użytkownika i hasło. Szukałem wokół i znalazłem coś o menedżerów haseł, więc wpadłem na to:Python obsługujący nazwę użytkownika i hasło dla adresu URL

urll = "http://url.com" 
username = "username" 
password = "password" 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 

passman.add_password(None, urll, username, password) 

authhandler = urllib2.HTTPBasicAuthHandler(passman) 

urllib2 = urllib2.build_opener(authhandler) 

pagehandle = urllib.urlopen(urll) 

print (pagehandle.read()) 

To wszystko działa, ale to skłoniło nazwę użytkownika i hasło za pomocą wiersza poleceń, co wymaga interakcji użytkownika. Chcę, żeby automatycznie wprowadzał te wartości. Co ja robię źle?

Odpowiedz

2

Żądanie url jest „zastrzeżone”.

Jeśli spróbujesz ten kod powie to:

import urllib2 
theurl = 'https://updates.opendns.com/nic/update?hostname=' 
req = urllib2.Request(theurl) 
try: 
    handle = urllib2.urlopen(req) 
except IOError, e: 
    if hasattr(e, 'code'): 
     if e.code != 401: 
      print 'We got another error' 
      print e.code 
     else: 
      print e.headers 
      print e.headers['www-authenticate'] 

Należy dodać nagłówki autoryzacji. Aby uzyskać więcej informacji zajrzyj na: http://www.voidspace.org.uk/python/articles/authentication.shtml

I kolejny przykład kodu jest: http://code.activestate.com/recipes/305288-http-basic-authentication/

Jeśli chcesz wysłać żądanie POST, spróbuj go:

import urllib 
import urllib2 
username = "username" 
password = "password" 
url = 'http://url.com/' 
values = { 'username': username,'password': password } 
data = urllib.urlencode(values) 
req = urllib2.Request(url, data) 
response = urllib2.urlopen(req) 
result = response.read() 
print result 

Uwaga: to tylko przykład, jak wysłać żądanie POST do adresu URL.

+0

Ya, to nie działało ... dało mi to błąd 401 ... –

+0

@AnthonyHonciano bądź ostrożny nazwa użytkownika i hasło (klawisze dyktowane) powinny być nazwą elementów wejściowych. a czy twoja forma ma inne pole? czy możesz wkleić swój kod formularza w swoim statusie? (Zaktualizuj swój status). 401 oznacza Nieautoryzowane. – Mortezaipo

+0

Nie ma formy, tylko to. Po prostu buduję osobiście aplikację aktualizującą dla siebie. Tak więc uruchomię skrypt w taki sposób, w jaki uruchamiam skrypt Pythona. Również tak, wiem, że "nazwa użytkownika i hasło" będą musiały być różne od rzeczywistych informacji o koncie. –

1

nie grałem z Pythona na chwilę, ale spróbuj tego:

urllib.urlopen("http://username:[email protected]/path") 
+0

Ya, pyton nie lubi, bo z symboli ... Próbowałem tak wiele sposobów, aby korzystać z tego adresu URL w ten sposób .. No sukces –

+0

To działało w porządku dla mnie. – Banjocat

+2

Jest to niezabezpieczona metoda dodawania do skryptu, ponieważ hasło jest otwarte dla czytelnika do wyświetlenia. Jednak działało to jak wdzięk dla niektórych skryptów, których używałem w sieci wewnętrznej. – Arjun

7

Zamiast tego można użyć requests. Kod jest tak proste, jak:

import requests 
url = 'https://updates.opendns.com/nic/update?hostname=' 
username = 'username' 
password = 'password' 
print(requests.get(url, auth=(username, password)).content)