2009-08-10 10 views
3

Je n'arrive pas à faire en sorte que mon robot se connecte à une installation MediaWiki sur l'intranet. Je crois que c'est dû à l'authentification http protégeant le wiki.bot pywikipedia avec authentification https et http

faits:

  1. La racine wiki est: https://local.example.com/mywiki/
  2. Lorsque vous visitez le wiki avec un navigateur web, une fenêtre contextuelle apparaît en demandant des informations d'identification d'entreprise (je suppose que cela est l'authentification d'accès de base)

C'est ce que j'ai dans mon user-config.py:

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

C'est ce que j'ai dans mywiki_family.py:

# -*- 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' 

Lorsque j'exécute login.py -v -v, je reçois ceci:

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 

(Je ne sais pas pourquoi il a ' . local.example.com/w » au lieu de «/mywiki »)

Je pensais qu'il pourrait essayer d'authentifier auprès example.com au lieu de example.com/wiki, alors j'ai changé la ligne de authentifier à:

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

Mais je reçois une erreur HTTP 401.2 retour de IIS:

Vous n'êtes pas autorisé à afficher ce répertoire ou une page en utilisant les informations d'identification que vous avez fournies parce que votre navigateur Web envoie un champ d'en-tête WWW-Authenticate que le serveur Web n'est pas configuré pour accepter.

Nous vous saurions gré de nous aider à obtenir ce résultat.

Mise à jour Après avoir résolu mon dossier de la famille, il dit maintenant:

Obtenir des informations pour le site mywiki: en ('erreur http', 401, 'non autorisée',) AVERTISSEMENT: Impossible d'ouvrir 'https://local.example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook'. Peut-être que le serveur ou votre connexion est en panne. Nouvelle tentative en 1 minutes ...

Je regardais les en-têtes HTTP sur un plan appel urllib2.ulropen et il utilise WWW-Authenticate: Negotiate WWW-Authenticate: NTLM. Je devine urllib2 et donc pywikipedia ne supporte pas cela?

Mise à jour Ajout d'une prime savoureuse pour obtenir de l'aide pour que cela fonctionne. Je peux m'authentifier en utilisant python-ntlm. Comment puis-je l'intégrer dans pywikipedia?

+0

Qu'est-ce que happe ns quand vous grep pour ces messages d'erreur dans python/pywikipedia/vos bases de code? Cela indique-t-il une cause? – hughdbrown

+0

vous avez juste besoin d'enregistrer un gestionnaire urlopener avant l'appel urllib2. Mise à jour ma réponse – NicDumZ

Répondre

4

Eh bien, le fait que login.py essaie d'accéder à '\ w' au lieu de votre chemin montre qu'il y a un problème de configuration de la famille.

Votre code est indenté étrangement: scriptpath un membre de la nouvelle classe de famille? comme dans:

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' 

?

Je crois que quelque chose ne va pas avec votre dossier de famille. Une bonne façon de vérifier est de faire dans une console python:

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

aussi longtemps que l'adresse relative est erronée, montrant «/w » au lieu de «/mywiki », cela signifie que le fichier de la famille est toujours pas configuré correctement, et que le bot ne fonctionnera pas :)

Mise à jour: comment intégrer ntlm dans pywikipedia?

Je viens de jeter un oeil à l'exemple de base here. J'intégrer le code avant de cette ligne login.py:

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

Vous voulez écrire quelque chose comme ça:

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)) 

je serais le tester et l'intégrer directement dans pywikipedia codebase si seulement j'avais une disponible configuration NTLM ...

Quoi qu'il arrive, s'il vous plaît ne disparaît pas avec votre solution: nous sommes intéressés à pywikipedia, par votre solution :)

+0

Cela faisait partie du problème, +1. Il me manquait la ligne "def path (self, code)" dans la partie famille du code. Apparemment, la section "scriptpath" ne le faisait pas. – Jake

+0

J'ai trouvé la ligne sur laquelle il s'étouffe: f = uo.open (url, data) dans la méthode getUrl. Après l'avoir forcé à utiliser l'authenticateUrlOpener (et introduit le gestionnaire ntlm), il lance une exception "list list out of range" quand je vais l'ouvrir. L'URL semble bien et les données sont None, donc je ne sais pas pourquoi c'est flippant ici. – Jake

+0

Je ne peux pas vous aider si vous ne me donnez pas le retraçage complet ... – NicDumZ

0

Je suppose que le problème que vous avez est que le serveur attend une authentification de base et que vous ne la manipulez pas dans votre client. Michael Foord a écrit un bon article sur la manipulation basic authentication in Python.

Vous n'avez pas fourni suffisamment d'informations pour que je puisse être sûr de cela, donc si cela ne fonctionne pas, veuillez fournir quelques informations supplémentaires, comme un vidage réseau de votre tentative de connexion.

+0

non? :) pywikipedia gère correctement l'authentification. Vous avez juste besoin de le configurer correctement :) – NicDumZ

Questions connexes