Pergunta

Estou tendo problemas para fazer o meu bot para acessar um MediaWiki instalar na intranet. Eu acredito que é devido à proteção do wiki autenticação http.

Fatos:

  1. A raiz wiki é: https://local.example.com/mywiki/
  2. Ao visitar o wiki com um navegador web, um pop-up aparece solicitando credenciais da empresa (I supor que esta é a autenticação de acesso básico)

Isto é o que eu tenho na minha user-config.py:

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

Isto é o que eu tenho em 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 eu executar login.py -v -v, fico com esta:

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

(Eu não sei por que ele tem 'local.example.com/w' em vez de '/ mywiki').

Eu pensei que poderia estar tentando autenticar example.com vez de example.com/wiki, então eu mudei a linha de autenticar-se:

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

Mas então eu recebo um erro de volta HTTP 401.2 do IIS:

Você não tem permissão para exibir este diretório ou página usando as credenciais que você forneceu porque o seu navegador Web está enviando um campo de cabeçalho WWW-Authenticate que o servidor Web não está configurado para aceitar.

Qualquer ajuda sobre como obter esse trabalho seria apreciada.

Atualizar Depois de corrigir o meu arquivo da família, ele agora diz:

Obter informações do sítio de mywiki: en ( 'Http erro', 401, 'não autorizadas',) ATENÇÃO: Não foi possível abrir ' https: // local. example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook '. Talvez o servidor ou sua conexão é baixo. Tentando novamente em 1 minutos ...

Eu olhei para o HTTP cabeçalhos em uma chamada urllib2.ulropen plano e ele está usando WWW-Authenticate: negociar WWW-Authenticate: NTLM. Eu estou supondo urllib2 e assim pywikipedia não suportam isso?

Atualizar Adicionado uma recompensa saborosa para a ajuda em começar este trabalho. Eu posso autenticar usando python-ntlm. Como faço para integrar isso em pywikipedia?

Foi útil?

Solução

Bem, o fato de que tentativas login.py acessando '\ w' em vez de seus programas de caminho que há um problema de configuração familiar.

Seu código é recortado estranhamente: é scriptpath um membro da nova Classe da família? como em:

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'

?

Eu acredito que algo está errado com o seu arquivo de família. Uma boa maneira de verificar é fazer em um console python:

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

contanto que o endereço relativo é errado, mostrando '/ w' em vez de '/ mywiki', isso significa que o arquivo família ainda não está configurado corretamente, e que o bot não vai funcionar:)

Atualizar : como integrar ntlm em pywikipedia

Eu só tinha um olhar para o exemplo básico aqui . Gostaria de integrar o código antes que a linha em login.py:

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

Você quer escrever algo parecido:

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

Gostaria de testar esta e integrá-lo diretamente na base de código pywikipedia se eu tivesse uma configuração ntlm disponível ...

O que quer que aconteça, por favor, não desaparecem com a sua solução: Nós estamos interessados, em pywikipedia, por sua solução:)

Outras dicas

Eu estou supondo que o problema que você tem é que o servidor espera que a autenticação básica e você não está lidando com isso em seu cliente. Michael Foord escreveu um bom artigo sobre como lidar com de autenticação básica em Python .

Você não forneceu informação suficiente para eu ter certeza sobre isso, então se isso não funcionar, por favor, fornecer algumas informações adicionais, como o despejo rede de você tentativa de conexão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top