2009-08-10 3 views
3

У меня возникли проблемы с подключением моего бота к входу в MediaWiki для интранета. Я считаю, что это связано с http-аутентификацией, защищающей wiki.pywikipedia bot с https и http-аутентификацией

Факты:

  1. Корень вики: https://local.example.com/mywiki/
  2. При посещении вики с помощью веб-браузера, всплывающее окно появляется просят ввести учетные данные предприятия (я предполагаю, что это базовая аутентификация доступа)

Это то, что у меня в user-config.py:

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

Это то, что я имею в 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' 

Когда я исполняю login.py -v -v, я получаю это:

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 

(я не знаю, почему он имеет " . local.example.com/w»вместо„/ MyWiki“)

Я думал, что это, возможно, пытается проверить подлинность example.com вместо example.com/wiki, поэтому я изменил AUTHENTICATE строку:

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

Но тогда я получаю HTTP 401,2 ошибка назад от IIS:

У вас нет разрешения на просмотр этого каталога или страницы, используя учетные данные, поставляемые потому, что ваш веб-браузер посылает поле заголовка WWW-Authenticate что веб-сервер не настроен на прием.

Любая помощь в том, как получить эту работу, будет оценена по достоинству.

Update После исправления моей семьи файл, теперь он говорит:

Получение информации для сайта MyWiki: ан ('ошибка HTTP', 401 'Несанкционированное') ВНИМАНИЕ: Не удалось открыть 'https://local.example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook'. Возможно, сервер или ваше соединение не работает. Повторная попытка 1-й минуте ...

Я смотрел на HTTP заголовки на план urllib2.ulropen вызова и он использует WWW-Authenticate: согласование WWW-Authenticate: NTLM. Я угадываю urllib2, и поэтому pywikipedia не поддерживает это?

Обновление Добавлена ​​вкусная награда за помощь в ее работе. Я могу аутентифицироваться с помощью python-ntlm. Как интегрировать это в pywikipedia?

+0

Что Happe ns, когда вы grep для этих сообщений об ошибках в python/pywikipedia/your codebases? Означает ли это причину? – hughdbrown

+0

вам просто нужно зарегистрировать обработчик urlopener перед вызовом urllib2. Обновлен мой ответ. – NicDumZ

ответ

4

Ну, факт, что login.py пытается получить доступ к '\ w' вместо вашего пути, показывает, что проблема с конфигурацией семьи.

Ваш код имеет отступы странно: есть scriptpath член нового класса семьи? как в:

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' 

?

Я считаю, что что-то не так с вашим семейным файлом. Хороший способ проверить это сделать в консоли питона:

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

до тех пор, как относительный адрес является неправильным, показывая «/ ш» вместо «/ MyWiki», это означает, что семья файл по-прежнему не правильно сконфигурирован и что бот не будет работать :)

Обновление: как интегрировать ntlm в pywikipedia?

Я просто взглянул на основной пример here. Я хотел бы интегрировать код до этой строки в login.py:

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

Вы хотите написать что-то подобное:

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

Я бы проверить это и интегрировать его непосредственно в pywikipedia кодовую если только я имел доступно NTLM установка ...

Что бы ни случилось, пожалуйста, не исчезают с вашего решения: мы заинтересованы, в pywikipedia, по вашему решению :)

+0

Это было частью проблемы, +1. Я пропустил строку «def path (self, code)» в семейной части кода. По-видимому, раздел «scriptpath» не делал этого. – Jake

+0

Я нашел строку, которая задыхается: f = uo.open (url, data) в методе getUrl. После того, как я заставил его использовать authenticateUrlOpener (и представил обработчик ntlm), он бросает исключение «индекс индекса вне диапазона», когда я иду, чтобы открыть его. URL-адрес выглядит отлично, а данные - None, поэтому не уверен, почему он волнуется здесь. – Jake

+0

Я не могу помочь, если вы не дадите мне полную трассу ... – NicDumZ

0

Я предполагаю, что проблема заключается в том, что сервер ожидает базовой аутентификации, и вы не обрабатываете это в своем клиенте. Майкл Фоорд написал хорошую статью об обработке basic authentication in Python.

Вы не предоставили достаточную информацию для меня, чтобы быть уверенным в этом, поэтому, если это не сработает, предоставьте дополнительную информацию, например, сетевой сброс попытки подключения.

+0

нет? :) pywikipedia обрабатывает правильную аутентификацию. Вам просто нужно настроить его правильно :) – NicDumZ

Смежные вопросы