Pregunta

Estoy teniendo problemas para conseguir mi bot para acceder a un MediaWiki instalar en la intranet. Creo que es debido a la autenticación HTTP protección de la wiki.

Datos:

  1. La raíz wiki es: https://local.example.com/mywiki/
  2. Al visitar la wiki con un navegador web, una ventana emergente aparece solicitando credenciales empresariales (supongo que esta es la autenticación de acceso básico)

Esto es lo que tengo en mi user-config.py:

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

Esto es lo que tengo 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'

Cuando ejecuto login.py -v -v, me sale esto:

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

(No estoy seguro de por qué tiene 'local.example.com/w' en lugar de '/ mywiki').

pensé que podría estar tratando de autenticar a example.com en lugar de example.com/wiki, así que cambié la línea de autenticar a:

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

Pero entonces me sale un error HTTP 401.2 de vuelta de IIS:

  

Usted no tiene permiso para ver este directorio o página con las credenciales que proporcionó porque su navegador Web está enviando un campo de cabecera WWW-Authenticate que el servidor Web no está configurado para aceptar.

Cualquier ayuda sobre cómo conseguir este trabajo sería apreciada.

Actualizar Después de la fijación de mi archivo de familia, que ahora dice:

  información

Cómo para mywiki sitio: es   ( 'Error http', 401, 'no autorizada',)   ADVERTENCIA: No se pudo abrir ' https: // local. example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook '. Tal vez el servidor o la conexión es hacia abajo. Intentará de nuevo en 1 minuto ...

Miré las cabeceras HTTP en un plan urllib2.ulropen llamar y se está utilizando WWW-Authenticate: negociar WWW-Authenticate: NTLM. Supongo urllib2 y por lo tanto pywikipedia no apoyar esto?

Actualizar ha añadido una sabrosa recompensa por ayuda para conseguir que esto funcione. Puedo autenticar usando python-NTLM. ¿Cómo se integra esto en pywikipedia?

¿Fue útil?

Solución

Bueno, el hecho de que login.py intenta acceder a '\ w' en lugar de su trayectoria muestra que hay un problema de configuración familiar.

Su código se sangra extraña: es scriptpath un miembro de la nueva clase de la familia? como en:

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'

Creo que algo está mal con su archivo familiar. Una buena manera de comprobar es hacerlo en una consola Python:

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

, siempre y cuando la dirección relativa es incorrecta, mostrando '/ w' en lugar de '/ mywiki', significa que el archivo de la familia todavía no está configurado correctamente y que el robot no funcionará:)

Actualizar :? Cómo integrar NTLM en pywikipedia

Yo sólo tenía un aspecto en el ejemplo básico aquí . Me gustaría integrar el código antes de esa línea en login.py:

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

¿Quieres escribir algo por el estilo:

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

Me gustaría probar esta e integrarlo directamente en código base pywikipedia si tuviera una configuración NTLM disponibles ...

Pase lo que pase, por favor, no desaparecemos con su solución: que nos interesa, en pywikipedia, por su solución:)

Otros consejos

Estoy adivinando el problema que tiene es que el servidor espera la autenticación básica y que no están manejando que en su cliente. Michael Foord escribió un buen artículo sobre el manejo autenticación básica en Python .

Usted no proporcionó suficiente información para mí estar seguro de esto, así que si eso no funciona, por favor proporcione alguna información adicional, como el volcado a la red de que el intento de conexión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top