我有麻烦了,我的机器人登录到修订安装在内联网上。我相信这是由于http认证的保护。

事实:

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

但是然后我得到一个HTTP401.2错误后从IIS:

你没有权限查看这一目录或网页使用凭证的提供,因为你的网络浏览器发送一个WWW-Authenticate header域网服务器是不构成接受。

任何帮助就如何得到这个工作,将不胜感激。

更新 在固定之后我的家庭文件,它现在说:

获取信息的网站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?

有帮助吗?

解决方案

好吧事实上 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的代码如果只有我有一个提供ntlm设置...

无论发生什么,请不要消失,你的解决方案:我们感兴趣的,在pywikipedia,通过你的解决方案:)

其他提示

我猜你有问题是服务器预计将基本的认证,你是不是处理,在你的客户。迈克尔Foord写了一篇好文章有关处理 基本的认证,在蟒蛇.

你没有提供足够的信息,我可以肯定的关于这一点,所以如果这不起作用,请提供一些额外信息,如网络转储你连接的企图。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top