3

ボットがイントラネット上の MediaWiki インストールにログインするのに問題があります。ウィキを保護する http 認証によるものだと思います。

事実:

  1. wiki ルートはhttps://local.example.com/mywiki/です。
  2. Web ブラウザーで Wiki にアクセスすると、企業の資格情報を求めるポップアップが表示されます (これは基本的なアクセス認証だと思います)。

これは私の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」ではなく「local.example.com/w」になっている理由がわかりません。)

example.com/wiki ではなく example.com に対して認証しようとしているのではないかと考えたので、認証行を次のように変更しました。

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

しかし、IIS から HTTP 401.2 エラーが返されます。

Web サーバーが受け入れるように構成されていない WWW-Authenticate ヘッダー フィールドを Web ブラウザーが送信しているため、指定した資格情報を使用してこのディレクトリまたはページを表示する権限がありません。

これを機能させる方法についての助けをいただければ幸いです。

更新家族ファイルを修正した後、次のように表示されます。

サイト mywiki:en の情報を取得しています ('http エラー', 401, '無許可', ) 警告: 「https://local.example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=を開けませんでした」モノブック」。サーバーまたは接続がダウンしている可能性があります。1 分後に再試行しています...

プランの urllib2.ulropen 呼び出しで HTTP ヘッダーを調べたところ、WWW-Authenticate: Negotiate WWW-Authenticate: NTLM を使用しています。私はurllib2を推測しているので、pywikipediaはこれをサポートしていませんか?

更新これを機能させるのに役立つおいしい報奨金を追加しました。python-ntlm を使用して認証できます。これをpywikipediaに統合するにはどうすればよいですか?

4

2 に答える 2

4

パスの代わりに「\w」にアクセスしようとするという事実login.pyは、ファミリ構成の問題があることを示しています。

あなたのコードは奇妙にインデントされています: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' が表示されている限り、ファミリー ファイルがまだ正しく構成されておらず、ボットが機能しないことを意味します :)

更新: pywikipedia に ntlm を統合する方法は?

ここで基本的な例を見ました。その行の前にコードを統合します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))

これをテストして、利用可能な ntlm セットアップがあれば、pywikipedia コードベースに直接統合します...

何が起こっても、あなたのソリューションで消えないでください:私たちはpywikipediaであなたのソリューションに興味があります:)

于 2009-08-11T07:29:46.580 に答える
0

あなたが抱えている問題は、サーバーが基本認証を期待していて、クライアントでそれを処理していないことだと思います。Michael Foord は、 Python での基本認証の処理に関する優れた記事を書きました。

これについて確認するのに十分な情報が提供されていないため、それが機能しない場合は、接続試行のネットワーク ダンプなどの追加情報を提供してください。

于 2009-08-10T22:31:59.273 に答える