бот pywikipedia с аутентификацией https и http - PullRequest
3 голосов
/ 10 августа 2009

У меня не получается заставить моего бота войти в систему для установки MediaWiki в интрасети. Я считаю, что это происходит из-за 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

(я не уверен, почему вместо «/mywiki» вместо «/mywiki» указано «local.example.com/w»).

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

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

Но затем я получаю ошибку HTTP 401.2 от IIS:

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

Буду признателен за любую помощь в получении этой работы.

Обновление После исправления файла моей семьи теперь написано:

Получение информации для сайта mywiki: en («Ошибка 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?

Ответы [ 2 ]

4 голосов
/ 11 августа 2009

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

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

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'

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

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

до тех пор, пока относительный адрес неверен, вместо '/ mywiki' отображается '/ w', это означает, что файл семейства все еще не настроен правильно, и бот не будет работать

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

Я только что посмотрел на базовый пример здесь . Я бы интегрировал код перед этой строкой в ​​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 голосов
/ 11 августа 2009

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

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

...