Domanda

Sto avendo difficoltà a raggiungere il mio bot per accedere a una MediaWiki installare sulla rete intranet. Credo che sia dovuto alla autenticazione HTTP protezione del wiki.

I fatti:

  1. La radice wiki è: https://local.example.com/mywiki/
  2. Quando si visita il wiki con un browser web, un popup viene in su per chiedere credenziali aziendali (Presumo che ciò è l'autenticazione l'accesso di base)

Questo è quello che ho nel mio user-config.py:

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

Questo è quello che ho in 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'

Quando eseguo login.py -v -v, ottengo questo:

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

(non sono sicuro perché ha 'local.example.com/w' invece di '/ mywiki'.)

ho pensato che potrebbe tentare di autenticarsi a example.com invece di example.com/wiki, così ho cambiato la linea di autenticazione a:

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

Ma allora ottengo un HTTP 401,2 errore di ritorno da IIS:

  

Non hai i permessi per visualizzare questa directory o pagina utilizzando le credenziali fornite perché il browser Web è l'invio di un campo di intestazione WWW-Authenticate che il server Web non è configurato per accettare.

Qualsiasi aiuto su come ottenere questo lavoro sarebbe apprezzato.

Aggiorna Dopo aver sistemato la mia file di famiglia, che ora dice:

  

Come ottenere informazioni per il sito mywiki: it   ( 'Errore HTTP', 401, 'non autorizzata',)   ATTENZIONE: Impossibile aprire ' https: // locale. example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook '. Forse il server o la connessione è verso il basso. Nuovo tentativo in 1 minuto ...

Ho guardato le intestazioni HTTP su un piano urllib2.ulropen chiamare e sta usando WWW-Authenticate: Negoziare WWW-Authenticate: NTLM. Sto indovinando urllib2 e quindi pywikipedia non sostenere questo?

Aggiorna Aggiunto un gustoso di taglie per aiutare a ottenere questo al lavoro. Posso autenticazione mediante python-NTLM. Come faccio a integrare questo in pywikipedia?

È stato utile?

Soluzione

Beh, il fatto che login.py cerca accesso '\ w' al posto del tuo percorso mostra che v'è un problema di configurazione di famiglia.

Il codice è rientrato strano: è scriptpath un membro della nuova classe famiglia? come 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'

Credo che qualcosa non va con il file famiglia. Un buon modo per controllare è quello di fare in una console python:

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

fino a quando il relativo indirizzo è sbagliato, mostrando '/ w' invece di '/ mywiki', significa che il file di famiglia non è ancora configurato correttamente, e che il bot non funziona:)

Aggiorna :? Come integrare NTLM in pywikipedia

Ho appena avuto uno sguardo alla esempio di base qui . Vorrei integrare il codice prima che la linea in login.py:

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

Si vuole scrivere qualcosa di simile:

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

ho iniziato ad esaminare questo e integrarlo direttamente nel pywikipedia base di codice se solo avessi avuto un setup NTLM disponibili ...

Qualunque cosa accada, non svaniscono con la vostra soluzione: ci interessa, a pywikipedia, dalla soluzione:)

Altri suggerimenti

Sono indovinando il problema che hai è che il server di autenticazione di base si aspetta e non si gestisce che nel vostro cliente. Michael Foord ha scritto un buon articolo sulla gestione autenticazione di base in Python .

Non hai fornito informazioni sufficienti per me per essere sicuro di questo, quindi, se questo non funziona, si prega di fornire alcune informazioni aggiuntive, come la discarica di rete di voi tentativo di connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top