2014-05-10 6 views
6

Mit Python und ich versuche, diese https://updates.opendns.com/nic/update?hostname= zu verwenden, wenn Sie an die URL gelangen, wird es einen Benutzernamen und ein Passwort eingeben. Ich habe mir um, und ich fand etwas über Passwort-Manager, so kam ich mit auf den Punkt:Python Umgang Benutzername und Passwort für die 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()) 

Das alles funktioniert, aber es wird aufgefordert den Benutzernamen und das Passwort über die Kommandozeile, erfordert die Interaktion des Benutzers. Ich möchte, dass diese Werte automatisch eingegeben werden. Was mache ich falsch?

Antwort

2

Ihre Anfrage url wird "RESTRICTED".

Wenn Sie diesen Code versuchen, wird es Ihnen sagen:

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'] 

Sie sollten Berechtigungs Header hinzufügen. Weitere Einzelheiten finden Sie in: http://www.voidspace.org.uk/python/articles/authentication.shtml

Und ein anderer Codebeispiel ist: http://code.activestate.com/recipes/305288-http-basic-authentication/

Wenn Sie POST-Anfrage zu senden, versuchen Sie es:

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 

Hinweis: dies ist nur ein Beispiel für das Senden einer POST-Anfrage an die URL.

+0

Ya, das hat nicht funktioniert ... es gab mir einen 401 Fehler ... –

+0

@AnthonyHonciano vorsichtig sein Benutzername und Passwort (dict keys) sollte der Name Ihrer Eingabeelemente sein. und hat deine Form ein anderes Feld? Können Sie Ihren Formularcode in Ihren Status einfügen? (Aktualisiere deinen Status). 401 bedeutet nicht autorisiert. – Mortezaipo

+0

Es gibt kein Formular, nur das. Ich baue gerade eine persönliche Updater-App für mich selbst. Also lasse ich das Skript wie diesen Lauf laufen Ich führe das Python-Skript aus. Auch ja, ich weiß, dass "Benutzername und Passwort" müssen die tatsächlichen Kontoinformationen abweichen. –

1

Ich habe nicht mit Python in eine Weile gespielt, aber versuchen Sie dies:

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

Ya, Python nicht mag, weil die Symbole ... ich so viele Methoden versucht hat, diese URL zu verwenden, die Art und Weise .. Kein Erfolg –

+0

Dies funktionierte gut für mich. – Banjocat

+2

Es ist eine unsichere Methode, ein Skript hinzuzufügen, da das Kennwort für den Leser geöffnet ist. Bei einigen Skripten, die ich in einem internen Netzwerk ausgeführt habe, funktionierte das jedoch wie ein Zauber. – Arjun

7

Sie könnten stattdessen requests verwenden. Der Code ist so einfach wie:

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