Revision: 7715 Author: siebrand Date: 2009-11-30 11:36:45 +0000 (Mon, 30 Nov 2009)
Log Message: ----------- [ #2894485 ] Basic.py adapted for rewrite branch. Contributed by stanlekub.
Added Paths: ----------- branches/rewrite/scripts/basic.py
Copied: branches/rewrite/scripts/basic.py (from rev 7713, trunk/pywikipedia/basic.py) =================================================================== --- branches/rewrite/scripts/basic.py (rev 0) +++ branches/rewrite/scripts/basic.py 2009-11-30 11:36:45 UTC (rev 7715) @@ -0,0 +1,153 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" +This is not a complete bot; rather, it is a template from which simple +bots can be made. You can rename it to mybot.py, then edit it in +whatever way you want. + +The following parameters are supported: + +¶ms; + +-dry If given, doesn't do any real changes, but only shows + what would have been changed. + +All other parameters will be regarded as part of the title of a single page, +and the bot will only work on that single page. +""" +__version__ = '$Id$' +import pywikibot +from pywikibot import pagegenerators + +# This is required for the text that is shown when you run this script +# with the parameter -help. +docuReplacements = { + '¶ms;': pagegenerators.parameterHelp +} + +class BasicBot: + # Edit summary message that should be used. + # NOTE: Put a good description here, and add translations, if possible! + msg = { + 'ar': u'روبوت: تغيير ...', + 'cs': u'Robot změnil ...', + 'de': u'Bot: Ändere ...', + 'en': u'Robot: Changing ...', + 'fr': u'Robot: Changé ...', + 'ja':u'ロボットによる:編集', + 'ksh': u'Bot: Ännern ...', + 'nds': u'Bot: Änderung ...', + 'nl': u'Bot: wijziging ...', + 'pt': u'Bot: alterando...', + 'sv': u'Bot: Ändrar ...', + 'zh': u'機器人:編輯.....', + } + + def __init__(self, generator, dry): + """ + Constructor. Parameters: + @param generator: The page generator that determines on which pages + to work on. + @type generator: generator. + @param dry: If True, doesn't do any real changes, but only shows + what would have been changed. + @type dry: boolean. + """ + self.generator = generator + self.dry = dry + self.summary = pywikibot.translate(pywikibot.getSite(), self.msg) + + def run(self): + for page in self.generator: + self.treat(page) + + def treat(self, page): + """ + Loads the given page, does some changes, and saves it. + """ + try: + # Load the page + text = page.get() + except pywikibot.NoPage: + pywikibot.output(u"Page %s does not exist; skipping." % page.title(asLink=True)) + return + except pywikibot.IsRedirectPage: + pywikibot.output(u"Page %s is a redirect; skipping." % page.title(asLink=True)) + return + + ################################################################ + # NOTE: Here you can modify the text in whatever way you want. # + ################################################################ + + # If you find out that you do not want to edit this page, just return. + # Example: This puts the text 'Test' at the beginning of the page. + text = 'Test ' + text + + # only save if something was changed + if text != page.get(): + # Show the title of the page we're working on. + # Highlight the title in purple. + pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) + # show what was changed + pywikibot.showDiff(page.get(), text) + if not self.dry: + choice = pywikibot.inputChoice(u'Do you want to accept these changes?', ['Yes', 'No'], ['y', 'N'], 'N') + if choice == 'y': + try: + page.text = text + # Save the page + page.save(comment=self.summary) + except pywikibot.LockedPage: + pywikibot.output(u"Page %s is locked; skipping." % page.title(asLink=True)) + except pywikibot.EditConflict: + pywikibot.output(u'Skipping %s because of edit conflict' % (page.title())) + except pywikibot.SpamfilterError, error: + pywikibot.output(u'Cannot change %s because of spam blacklist entry %s' % (page.title(), error.url)) + + +def main(): + # This factory is responsible for processing command line arguments + # that are also used by other scripts and that determine on which pages + # to work on. + genFactory = pagegenerators.GeneratorFactory() + # The generator gives the pages that should be worked upon. + gen = None + # This temporary array is used to read the page title if one single + # page to work on is specified by the arguments. + pageTitleParts = [] + # If dry is True, doesn't do any real changes, but only show + # what would have been changed. + dry = False + + # Parse command line arguments + for arg in pywikibot.handleArgs(): + if arg.startswith("-dry"): + dry = True + else: + # check if a standard argument like + # -start:XYZ or -ref:Asdf was given. + if not genFactory.handleArg(arg): + pageTitleParts.append(arg) + + if pageTitleParts != []: + # We will only work on a single page. + pageTitle = ' '.join(pageTitleParts) + page = pywikibot.Page(pywikibot.Link(pageTitle, pywikibot.getSite())) + gen = iter([page]) + + if not gen: + gen = genFactory.getCombinedGenerator() + if gen: + # The preloading generator is responsible for downloading multiple + # pages from the wiki simultaneously. + gen = pagegenerators.PreloadingGenerator(gen) + bot = BasicBot(gen, dry) + bot.run() + else: + pywikibot.showHelp() + +if __name__ == "__main__": + try: + main() + finally: + pywikibot.stopme()