Revision: 4327 Author: wikipedian Date: 2007-09-19 07:31:22 +0000 (Wed, 19 Sep 2007)
Log Message: ----------- give the bot operator the chance to solve the login CAPTCHA
Modified Paths: -------------- trunk/pywikipedia/family.py trunk/pywikipedia/login.py trunk/pywikipedia/userinterfaces/terminal_interface.py trunk/pywikipedia/wikipedia.py
Modified: trunk/pywikipedia/family.py =================================================================== --- trunk/pywikipedia/family.py 2007-09-18 22:24:47 UTC (rev 4326) +++ trunk/pywikipedia/family.py 2007-09-19 07:31:22 UTC (rev 4327) @@ -2516,6 +2516,9 @@ def login_address(self, code): return '%s?title=%s:Userlogin&action=submit' % (self.path(code), self.special_namespace_url(code))
+ def captcha_image_address(self, code, id): + return '%s?title=%s:Captcha/image&wpCaptchaId=%s' % (self.path(code), self.special_namespace_url(code), id) + def watchlist_address(self, code): return '%s?title=%s:Watchlist/edit' % (self.path(code), self.special_namespace_url(code))
Modified: trunk/pywikipedia/login.py =================================================================== --- trunk/pywikipedia/login.py 2007-09-18 22:24:47 UTC (rev 4326) +++ trunk/pywikipedia/login.py 2007-09-19 07:31:22 UTC (rev 4327) @@ -96,7 +96,7 @@ # No bot policies on other return True
- def getCookie(self, remember=True): + def getCookie(self, remember=True, captchaId = None, captchaAnswer = None): """Login to wikipedia.
remember Remember login (default: True) @@ -109,6 +109,9 @@ "wpLoginattempt": "Aanmelden & Inschrijven", # dutch button label seems to work for all wikis "wpRemember": str(int(bool(remember))) } + if captchaId: + predata["wpCaptchaId"] = captchaId + predata["wpCaptchaWord"] = captchaAnswer address = self.site.login_address()
if self.site.hostname() in config.authenticate.keys(): @@ -146,9 +149,15 @@
if len(log_data) == 4: return "\n".join(L) + elif not captchaAnswer: + captchaR = re.compile('<input type="hidden" name="wpCaptchaId" id="wpCaptchaId" value="(?P<id>\d+)" />') + match = captchaR.search(data) + if match: + id = match.group('id') + url = self.site.protocol() + '://' + self.site.hostname() + self.site.captcha_image_address(id) + answer = wikipedia.ui.askForCaptcha(url) + return self.getCookie(remember = remember, captchaId = id, captchaAnswer = answer) else: - if '<input type="hidden" name="wpCaptchaId"' in data: - wikipedia.output(u'There is a CAPTCHA in the server's response.\nPlease wait a while or log in using a graphical web browser to reset the request and try again.') return None
def storecookiedata(self, data): @@ -218,6 +227,9 @@ else: return False
+ def showCaptchaWindow(self, url): + pass + def main(): username = password = None sysop = False
Modified: trunk/pywikipedia/userinterfaces/terminal_interface.py =================================================================== --- trunk/pywikipedia/userinterfaces/terminal_interface.py 2007-09-18 22:24:47 UTC (rev 4326) +++ trunk/pywikipedia/userinterfaces/terminal_interface.py 2007-09-19 07:31:22 UTC (rev 4327) @@ -1,8 +1,8 @@ - __version__ = '$Id$'
import config, transliteration import traceback, re, sys +import wikipedia
try: import ctypes @@ -230,3 +230,12 @@ return text editor = gui.EditBoxWindow() return editor.edit(text, jumpIndex = jumpIndex, highlight = highlight) + + def askForCaptcha(self, url): + try: + import gui + # TODO + raise ImportError + except ImportError, e: + return wikipedia.input('What is the solution of the CAPTCHA at %s ?' % url) +
Modified: trunk/pywikipedia/wikipedia.py =================================================================== --- trunk/pywikipedia/wikipedia.py 2007-09-18 22:24:47 UTC (rev 4326) +++ trunk/pywikipedia/wikipedia.py 2007-09-19 07:31:22 UTC (rev 4327) @@ -4247,6 +4247,9 @@ def login_address(self): return self.family.login_address(self.lang)
+ def captcha_image_address(self, id): + return self.family.captcha_image_address(self.lang, id) + def watchlist_address(self): return self.family.watchlist_address(self.lang)