2009-08-10 25 views
3

我无法让我的bot登录到Intranet上的MediaWiki安装。我相信这是由于保护wiki的http认证。使用https和http身份验证的pywikipedia bot

事实:

  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 

(我不知道为什么它' )

我以为它可能试图验证example.com而不是example.com/wiki,所以我将认证行更改为:

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

但后来我得到一个HTTP从IIS 401.2错误回:

您没有权限使用您提供,因为您的Web浏览器发送一个WWW身份验证头字段的凭据查看该目录或网页Web服务器未配置为接受。

任何有关如何让这项工作的帮助,将不胜感激。

更新固定我的家人文件后,现在说:

获取信息的网站mywiki:恩 ( 'HTTP错误',401, '未授权') 警告:无法打开'https://local.example.com/mywiki/index.php?title=Non-existing_page&action=edit&useskin=monobook'。也许服务器或连接断开。重试以1分...

我看着一个计划urllib2.ulropen呼叫的HTTP标头和它使用WWW身份验证:协商WWW验证:NTLM。我猜urllib2,因此pywikipedia不支持这个?

更新增加了美味的赏金来帮助获得这项工作。我可以使用python-ntlm进行身份验证。我如何将它整合到pywikipedia中?

+0

什么Happe的当你在Python/pywikipedia /你的代码库中grep这些错误信息?它是否指向一个原因? – hughdbrown 2009-08-11 14:10:03

+0

你只需要在urllib2调用之前注册一个urlopener处理程序。更新了我的答案。 – NicDumZ 2009-08-14 08:03:53

回答

4

那么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() 

,显示出“/ W”,而不是“/ 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)”行。显然,“脚本路径”部分没有这样做。 – Jake 2009-08-11 13:01:35

+0

我发现它在窒息的那一行:f = uo.open(url,data)在方法getUrl中。在我强制它使用authenticateUrlOpener(并引入了ntlm处理程序)之后,当我打开它时,它会抛出一个异常“列表索引超出范围”。该网址看起来很好,数据是无,所以不知道为什么它在这里吓坏了。 – Jake 2009-08-17 15:18:38

+0

如果你不给我完整的回溯,我无法帮助... – NicDumZ 2009-08-20 13:45:06

0

我猜你的问题是服务器期待基本身份验证,并且你没有在客户端处理它。 Michael Foord写了一篇关于处理basic authentication in Python的好文章。

您没有提供足够的信息让我确定这一点,所以如果这样做不起作用,请提供一些额外的信息,例如连接尝试的网络转储。

+0

不可以? :) pywikipedia处理正确的身份验证。你只需要正确配置:) – NicDumZ 2009-08-11 07:20:05