pywikipedia bot https和http身份验证
-
12-09-2019 - |
题
我有麻烦了,我的机器人登录到修订安装在内联网上。我相信这是由于http认证的保护。
事实:
- Wiki根源是: https://local.example.com/mywiki/
- 在访问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写了一篇好文章有关处理 基本的认证,在蟒蛇.
你没有提供足够的信息,我可以肯定的关于这一点,所以如果这不起作用,请提供一些额外信息,如网络转储你连接的企图。