2009-08-10 12 views
3

Ich habe Probleme mit meinem bieten immer auf eine MediaWiki anmelden installieren im Intranet. Ich glaube, es liegt an der http-Authentifizierung, die das Wiki schützt.pywikipedia bietet mit https und http-Authentifizierung

Fakten:

  1. Die Wiki-Wurzel ist: https://local.example.com/mywiki/
  2. Wenn das Wiki mit einem Web-Browser besuchen, ein Pop-up für Enterprise-Anmeldeinformationen zu fragen kommt (ich nehme an, dies ist HTTP-Authentifizierung)

Dies ist, was ich in meinem user-config.py haben:

mylang = 'en' 
family = 'mywiki' 
usernames['mywiki']['en'] = u'Bot' 
authenticate['local.example.com'] = ('user', 'pass') 

Dies ist, was ich in mywiki_family.py haben:

# -*- coding: utf-8 -*- 
import family, config 

# The Wikimedia family that is known as mywiki 
class Family(family.Family): 
    def __init__(self): 
     family.Family.__init__(self) 
     self.name = 'mywiki' 
     self.langs = { 'en' : 'local.example.com'} 

    def scriptpath(self, code): 
     return '/mywiki' 

    def version(self, code): 
     return '1.13.5' 

    def isPublic(self): 
     return False 

    def hostname(self, code): 
     return 'local.example.com' 

    def protocol(self, code): 
     return 'https' 

    def path(self, code): 
     return '/mywiki/index.php' 

Wenn ich ausführen login.py -v -v, bekomme ich diese:

urllib2.urlopen(urllib2.Request('https://local.example.com/w/index.php?title=Special:Userlogin&useskin=monobook&action=submit', wpSkipCookieCheck=1&wpPassword=XXXX&wpDomain=&wpRemember=1&wpLoginattempt=Aanmelden%20%26%20Inschrijven&wpName=Bot, {'Content-type': 'application/x-www-form-urlencoded', 'User-agent': 'PythonWikipediaBot/1.0'})): 
(Redundant traceback info here) 
urllib2.HTTPError: HTTP Error 401: Unauthorized 

(Ich bin mir nicht sicher, warum es hat ' . local.example.com/w‘anstelle von '/ mywiki')

dachte ich, es könnte zu example.com statt example.com/wiki zu authentifizieren versuchen, so änderte ich die authenticate Linie:

authenticate['local.example.com/mywiki'] = ('user', 'pass') 

Aber dann bekomme ich eine HTTP 401.2 Fehler von IIS zurück:

Sie haben keine Berechtigung dieses Verzeichnis oder Seite mit den Anmeldeinformationen anzuzeigen, die Sie geliefert, weil Ihr Web-Browser ist ein WWW-Authenticate-Header-Feld Senden Der Webserver ist nicht für die Annahme konfiguriert.

Jede Hilfe, wie man das funktioniert, würde geschätzt werden.

aktualisieren Nach meiner Familiendatei Festsetzung, heißt es jetzt:

Informationen für Website mywiki Anfahrt: en ('http Fehler', 401, 'Unerlaubte',) ACHTUNG: konnte nicht geöffnet werden "https://local.example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook". Vielleicht ist der Server oder Ihre Verbindung ausgefallen. Erneuter Versuch in 1 Minute ...

schaute ich auf den HTTP-Header auf einem urllib2.ulropen Rufplan und es ist mit WWW-Authenticate: Verhandeln WWW-Authenticate: NTLM. Ich rate urllib2 und damit pywikipedia unterstützt das nicht?

Update Eine leckere Prämie für die Hilfe bei der Arbeit hinzugefügt. Ich kann mit Python-NTLM authentifizieren. Wie integriere ich das in pywikipedia?

+0

Was Happe ns, wenn Sie in Python/pywikipedia/Ihren Codebasen nach diesen Fehlermeldungen suchen? Zeigt es auf eine Ursache? – hughdbrown

+0

Sie müssen nur einen Urlopener-Handler vor dem Aufruf von Urllib2 registrieren. Meine Antwort wurde aktualisiert. – NicDumZ

Antwort

4

Nun, die Tatsache, dass login.py versucht Zugriff auf '\ w' anstelle Ihres Pfades zeigt, dass es ein Familienkonfigurationsproblem ist.

Ihr Code ist merkwürdig eingerückt: ist scriptpath ein Mitglied der neuen Familienklasse? wie in:

class Family(family.Family): 
    def __init__(self): 
     family.Family.__init__(self) 
     self.name = 'mywiki' 
     self.langs = { 'en' : 'local.example.com'} 

    def scriptpath(self, code): 
     return '/mywiki' 

    def version(self, code): 
     return '1.13.5' 

    def isPublic(self): 
     return False 

    def hostname(self, code): 
     return 'local.example.com' 

    def protocol(self, code): 
     return 'https' 

?

Ich glaube, dass etwas mit Ihrer Familiendatei nicht stimmt. Eine gute Möglichkeit, zu überprüfen, ist in einer Python-Konsole zu tun:

import wikipedia 
site = wikipedia.getSite('en', 'mywiki') 
print site.login_address() 

solange die relative Adresse falsch ist, zeigt ‚/ w‘ anstelle von ‚/ mywiki‘, bedeutet dies, dass die Familie Datei ist noch nicht korrekt konfiguriert, und dass der bot nicht funktioniert :)

Update: wie ntlm in pywikipedia zu integrieren?

Ich habe mir gerade das Basisbeispiel here angesehen. Ich würde den Code vor der Zeile in login.py integrieren:

response = urllib2.urlopen(urllib2.Request(self.site.protocol() + '://' + self.site.hostname() + address, data, headers)) 

Sie etwas ähnliches schreiben wollen:

from ntlm import HTTPNtlmAuthHandler 

user = 'DOMAIN\User' 
password = "Password" 
url = self.site.protocol() + '://' + self.site.hostname() 

passman = urllib2.HTTPPasswordMgrWithDefaultRealm() 
passman.add_password(None, url, user, password) 
# create the NTLM authentication handler 
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman) 

# create and install the opener 
opener = urllib2.build_opener(auth_NTLM) 
urllib2.install_opener(opener) 

response = urllib2.urlopen(urllib2.Request(self.site.protocol() + '://' + self.site.hostname() + address, data, headers)) 

Ich würde dies testen und es direkt in pywikipedia Code-Basis zu integrieren, wenn ich nur eine hatte verfügbar ntlm Setup ...

Was auch immer Sie geschieht nicht verschwinden mit Ihrer Lösung: wir sind daran interessiert, bei pywikipedia, indem Sie Ihre Lösung :)

+0

Dies war ein Teil des Problems, +1. Mir fehlte die Zeile "Def path (self, code)" im Familienteil des Codes. Anscheinend hat der Abschnitt "scriptpath" das nicht getan. – Jake

+0

Ich fand die Zeile, die es erstickt: f = uo.open (URL, Daten) in der Methode getUrl. Nachdem ich es gezwungen habe, den authenticateUrlOpener zu verwenden (und den ntlm-Handler eingeführt habe), löst es eine Exception "list index out of range" aus, wenn ich es öffne. Die URL sieht gut aus und die Daten sind Keine, also nicht sicher, warum es hier ausflippt. – Jake

+0

Ich kann nicht helfen, wenn Sie mir den kompletten Traceback nicht geben ... – NicDumZ

0

Ich vermute, das Problem, das Sie haben, ist, dass der Server die Standardauthentifizierung erwartet und Sie sind Handling nicht, dass in Ihrem Client. Michael Foord schrieb einen guten Artikel über den Umgang mit basic authentication in Python.

Sie haben nicht genügend Informationen zur Verfügung gestellt, damit ich mich dessen sicher sein kann. Wenn das nicht funktioniert, geben Sie bitte einige zusätzliche Informationen an, z. B. Netzwerk-Dump von Verbindungsversuch.

+0

nein? :) pywikipedia behandelt die Authentifizierung korrekt. Sie müssen es nur richtig konfigurieren :) – NicDumZ