bot pywikipedia com https e http autenticação
-
12-09-2019 - |
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:
- A raiz wiki é: https://local.example.com/mywiki/
- 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?
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.