Question

Je vais avoir du mal à obtenir mon bot pour se connecter à une MediaWiki installer sur l'intranet. Je crois qu'il est dû à l'authentification http protection du wiki.

Les faits:

  1. La racine du 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)

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

est ce que j'ai en 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'

Quand 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 alors j'obtiens 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.

Toute aide sur la façon d'obtenir ce travail serait apprécié.

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 urllib2.ulropen appel et il utilise WWW-Authenticate: Negotiate WWW-Authenticate: NTLM. Je devine que urllib2 et donc pywikipedia ne supporte pas cela?

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

Était-ce utile?

La solution

Eh bien, le fait que l'accès login.py tente \ « w » au lieu de votre chemin montre qu'il ya un problème de configuration de la famille.

Votre code est indenté étrangement: est 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 fichier 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()

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

Mise à jour : comment intégrer NTLM dans pywikipedia

Je viens d'avoir un coup d'oeil à l'exemple de base . J'intégrer le code avant de cette ligne dans 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 le tester et l'intégrer directement dans pywikipedia codebase si j'avais une configuration NTLM disponible ...

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

Autres conseils

Je devine le problème que vous avez est que le serveur attend l'authentification de base et vous n'êtes pas la manipulation que dans votre client. Michael Foord a écrit un bon article sur la gestion l'authentification de base en Python .

Vous n'avez pas fourni assez d'informations pour moi d'être sûr à ce sujet, donc si cela ne fonctionne pas, s'il vous plaît fournir des informations supplémentaires, comme dump réseau de vous tentative de connexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top