سؤال

أواجه مشكلة في الحصول على بوت لتسجيل الدخول إلى تثبيت MediaWiki على الإنترانت. أعتقد أنه يرجع إلى مصادقة HTTP التي تحمي Wiki.

حقائق:

  1. الجذر Wiki هو: https://local.example.com/mywiki/
  2. عند زيارة 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

(لست متأكدا من السبب في أنه يحتوي على "local.example.com/w" بدلا من "/ mywiki".

اعتقدت أنه قد يحاول المصادقة على example.com بدلا من example.com/wiki، لذلك غيرت خط المصادقة إلى:

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

ولكن ثم أحصل على خطأ HTTP 401.2 مرة أخرى من IIS:

ليس لديك إذن لعرض هذا الدليل أو الصفحة باستخدام بيانات الاعتماد التي توفرها لأن مستعرض الويب الخاص بك يرسل حقل رأس مصادقة WWW للمصادقة لم يتم تكوين خادم الويب لقبوله.

أي مساعدة حول كيفية الحصول على هذا العمل سيكون موضع تقدير.

تحديث بعد إصلاح ملف عائلتي، يقول الآن:

الحصول على معلومات للموقع MyWiki: EN ("خطأ HTTP"، 401، "غير مصرح به"، تحذير: لا يمكن فتح "https://local.example.com/mywiki/index.php؟title=non-existing_page&action=edit&useskin=monobook.". ربما يكون الخادم أو اتصالك إلى أسفل. إعادة المحاولة في 1 دقيقة ...

نظرت إلى رؤوس HTTP على خطة URLLIB2.ULROPEN Call وتستخدم WWW للمصادقة: التفاوض على الوون المصادقة: NTLM. أنا أظن Urllib2 وبالتالي pywikipedia لا تدعم هذا؟

تحديث إضافة باونتي لذيذة للمساعدة في الحصول على هذا للعمل. يمكنني المصادقة باستخدام python-ntlm. كيف يمكنني دمج هذا في Pywikipedia؟

هل كانت مفيدة؟

المحلول

حسنا حقيقة ذلك 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'

?

أعتقد أن هناك خطأ ما في ملف عائلتك. طريقة جيدة للتحقق هي القيام به في وحدة التحكم Python:

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

طالما أن العنوان النسبي مخطئا، تظهر "/ w" بدلا من "/ mywiki"، فهذا يعني أن ملف الأسرة لا يزال غير مكتمل بشكل صحيح، وأن الروبوت لن يعمل :)

تحديث: كيفية دمج 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 CodeBase إذا كان لدي إعداد NTLM متاح ...

ما يحدث، من فضلك لا تختفي مع الحل الخاص بك: نحن مهتمون، في Pywikipedia، حسب الحل الخاص بك :)

نصائح أخرى

أعتقد أن المشكلة التي لديك هي أن الخادم يتوقع المصادقة الأساسية ولا يمكنك التعامل مع ذلك في عميلك. Michael Foord كتب مقال جيد حول التعامل المصادقة الأساسية في بيثون.

لم تقدم معلومات كافية بالنسبة لي للتأكد من ذلك، لذلك إذا لم ينجح ذلك، فيرجى تقديم بعض المعلومات الإضافية، مثل تفريغ الشبكة من محاولة اتصالك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top