def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ options = {} gen = None local_args = pywikibot.handle_args(args) # 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(positional_arg_name='page') for arg in local_args: option, sep, value = arg.partition(':') if option == '-xml': filename = value or pywikibot.input( "Please enter the XML dump's filename:") gen = TableXmlDumpPageGenerator(filename) elif option == '-auto': issue_deprecation_warning('The usage of "-auto"', '-always', 1, ArgumentDeprecationWarning) options['always'] = True elif option in ['-always', '-quiet', '-skipwarning']: options[option[1:]] = True else: if option in ['-sql', '-mysqlquery']: if not (has_module('oursql') or has_module('MySQLdb')): raise NotImplementedError( 'Neither "oursql" nor "MySQLdb" library is installed.') if option == '-sql': issue_deprecation_warning('The usage of "-sql"', '-mysqlquery', 1, ArgumentDeprecationWarning) query = value or """ SELECT page_namespace, page_title FROM page JOIN text ON (page_id = old_id) WHERE old_text LIKE '%<table%' """ arg = '-mysqlquery:' + query genFactory.handleArg(arg) if gen: gen = pagegenerators.NamespaceFilterPageGenerator( gen, genFactory.namespaces) else: gen = genFactory.getCombinedGenerator() if gen: if not genFactory.nopreload: gen = pagegenerators.PreloadingGenerator(gen) bot = Table2WikiRobot(generator=gen, **options) bot.run() return True else: suggest_help(missing_generator=True) return False
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ generator = None local_args = pywikibot.handle_args(args) site = pywikibot.Site() if site.code != 'commons' or site.family.name != 'commons': pywikibot.warning( 'This script is primarily written for Wikimedia ' 'Commons, but has been invoked with site {0}. It ' 'might work for other sites but there is no ' 'guarantee that it does the right thing.'.format(site)) choice = pywikibot.input_choice( 'How do you want to continue?', (('Continue using {0}'.format(site), 'c'), ('Switch to Wikimedia Commons', 's'), ('Quit', 'q')), automatic_quit=False) if choice == 's': site = pywikibot.Site('commons', 'commons') elif choice == 'q': return False gen_factory = pagegenerators.GeneratorFactory(site) for arg in local_args: param_arg, sep, param_value = arg.partition(':') if param_value == '': param_value = None if arg.startswith('-yesterday'): generator = uploadedYesterday(site) issue_deprecation_warning('The usage of "-yesterday"', '-logevents:"upload,,YYYYMMDD,YYYYMMDD"', 2, ArgumentDeprecationWarning, since='20160305') elif arg.startswith('-recentchanges'): if param_value is None: arg = arg + ':120,70' issue_deprecation_warning('-recentchanges without parameters', '-recentchanges:offset,duration', 2, ArgumentDeprecationWarning, since='20160320') gen_factory.handleArg(arg) else: gen_factory.handleArg(arg) generator = gen_factory.getCombinedGenerator(gen=generator, preload=True) if not generator: pywikibot.bot.suggest_help(missing_generator=True) else: site.login() for page in generator: pywikibot.output(page.title()) if page.exists() and (page.namespace() == 6) \ and (not page.isRedirectPage()): if isUncat(page): addUncat(page)
key=attrgetter('name')) # sort params by name for index, param in enumerate(first_tmp.params): # enforce spacing conventions param.value = ' ' + param.value.strip() + '\n' + \ ('' if index == len(first_tmp.params) - 1 else ' ') removed = [tmp_link(page.site, name) for name in set(removed)] new = unicode(code) comment = i18n.translate( page.site.lang, {'it': u'unione di %(templates)s in %(into)s'}, { 'templates': page.site.list_to_text(removed), 'into': tmp_link(page.site, unified) }) # comment = reason.format(comment) self.userPut(page, page.text, new, comment=comment) if __name__ == "__main__": local_args = pywikibot.handleArgs() genFactory = pagegenerators.GeneratorFactory() for arg in local_args: genFactory.handleArg(arg) gen = genFactory.getCombinedGenerator() if gen: gen = pagegenerators.PreloadingGenerator(gen) bot = RugbyBot(gen) bot.run() else: pywikibot.showHelp()
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ # the option that's always selected when the bot wonders what to do with # a link. If it's None, the user is prompted (default behaviour). always = None alternatives = [] getAlternatives = True dnSkip = False generator = None primary = False main_only = False # For sorting the linked pages, case can be ignored minimum = 0 local_args = pywikibot.handle_args(args) generator_factory = pagegenerators.GeneratorFactory( positional_arg_name='page') for arg in local_args: if arg.startswith('-primary:'): primary = True getAlternatives = False alternatives.append(arg[9:]) elif arg == '-primary': primary = True elif arg.startswith('-always:'): always = arg[8:] elif arg.startswith('-pos:'): if arg[5] != ':': mysite = pywikibot.Site() page = pywikibot.Page(pywikibot.Link(arg[5:], mysite)) if page.exists(): alternatives.append(page.title()) else: if pywikibot.input_yn( u'Possibility %s does not actually exist. Use it ' 'anyway?' % page.title(), default=False, automatic_quit=False): alternatives.append(page.title()) else: alternatives.append(arg[5:]) elif arg == '-just': getAlternatives = False elif arg == '-dnskip': dnSkip = True elif arg == '-main': main_only = True elif arg.startswith('-min:'): minimum = int(arg[5:]) elif arg.startswith('-start'): try: generator = pagegenerators.CategorizedPageGenerator( pywikibot.Site().disambcategory(), start=arg[7:], namespaces=[0]) except pywikibot.NoPage: pywikibot.output( 'Disambiguation category for your wiki is not known.') raise else: generator_factory.handleArg(arg) site = pywikibot.Site() generator = generator_factory.getCombinedGenerator(generator) if not generator: pywikibot.bot.suggest_help(missing_generator=True) return False site.login() bot = DisambiguationRobot(always, alternatives, getAlternatives, dnSkip, generator, primary, main_only, minimum=minimum) bot.run()
def main(*args: Tuple[str, ...]) -> None: """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments """ # If none, the var is set only for check purpose. summary = None addText = None regexSkipUrl = None always = False textfile = None talkPage = False reorderEnabled = True # Put the text above or below the text? up = False # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() # Loading the arguments for arg in local_args: option, sep, value = arg.partition(':') if option == '-textfile': textfile = value or pywikibot.input( 'Which textfile do you want to add?') elif option == '-text': addText = value or pywikibot.input('What text do you want to add?') elif option == '-summary': summary = value or pywikibot.input( 'What summary do you want to use?') elif option == '-excepturl': regexSkipUrl = value or pywikibot.input('What text should I skip?') elif option == '-except': new_arg = ''.join(['-grepnot', sep, value]) issue_deprecation_warning(arg, new_arg, 2, ArgumentDeprecationWarning, since='20201224') genFactory.handle_arg(new_arg) elif option == '-up': up = True elif option == '-noreorder': reorderEnabled = False elif option == '-always': always = True elif option in ('-talk', '-talkpage'): talkPage = True else: genFactory.handle_arg(arg) if textfile and not addText: with codecs.open(textfile, 'r', config.textfile_encoding) as f: addText = f.read() generator = genFactory.getCombinedGenerator() additional_text = '' if addText else "The text to add wasn't given." if pywikibot.bot.suggest_help(missing_generator=not generator, additional_text=additional_text): return if talkPage: generator = pagegenerators.PageWithTalkPageGenerator(generator, True) for page in generator: (_, newtext, _) = add_text(page, addText, summary, regexSkipUrl=regexSkipUrl, always=always, up=up, reorderEnabled=reorderEnabled, create=talkPage)
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: unicode """ template_title = None # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) gen = pg.GeneratorFactory() current_args = [] fields = {} options = {} for arg in local_args: if arg.startswith('-template'): if len(arg) == 9: template_title = pywikibot.input( 'Please enter the template to work on:') else: template_title = arg[10:] elif arg.startswith('-create'): options['create'] = True elif gen.handleArg(arg): if arg.startswith('-transcludes:'): template_title = arg[13:] else: optional = arg.startswith('-') complete = len(current_args) == 3 if optional: needs_second = len(current_args) == 1 if needs_second: break # will stop below arg, sep, value = arg[1:].partition(':') if len(current_args) == 0: assert not fields options[arg] = value or True else: assert complete current_args[2][arg] = value or True else: if complete: handler = PropertyOptionHandler(**current_args[2]) fields[current_args[0]] = (current_args[1], handler) del current_args[:] current_args.append(arg) if len(current_args) == 2: current_args.append({}) # handle leftover if len(current_args) == 3: handler = PropertyOptionHandler(**current_args[2]) fields[current_args[0]] = (current_args[1], handler) elif len(current_args) == 1: pywikibot.error('Incomplete command line param-property pair.') return False if not template_title: pywikibot.error( 'Please specify either -template or -transcludes argument') return generator = gen.getCombinedGenerator(preload=True) if not generator: gen.handleArg('-transcludes:' + template_title) generator = gen.getCombinedGenerator(preload=True) bot = HarvestRobot(generator, template_title, fields, **options) bot.run()
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ options = {} message_properties = {} generator = None protections = {} default_level = 'sysop' default_summaries = { 'cat': 'category', 'links': 'links', 'ref': 'ref', 'imageused': 'images', 'file': 'simple', } # read command line parameters local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() site = pywikibot.Site() generator_type = None protection_levels = set(site.protection_levels()) protection_types = site.protection_types() if '' in protection_levels: protection_levels.add('all') for arg in local_args: if arg == '-always': options['always'] = True elif arg.startswith('-summary'): if len(arg) == len('-summary'): # fill dummy value to prevent automatic generation options['summary'] = None else: options['summary'] = arg[len('-summary:'):] elif arg.startswith('-expiry'): if len(arg) == len('-expiry'): options['expiry'] = pywikibot.input( 'Enter a protection expiry:') else: options['expiry'] = arg[len('-expiry:'):] elif arg.startswith('-images'): pywikibot.output( color_format('\n{lightred}-image option is deprecated. ' 'Please use -imagelinks instead.{default}\n')) local_args.append('-imagelinks' + arg[7:]) elif arg.startswith('-unprotect'): default_level = 'all' elif arg.startswith('-default'): if len(arg) == len('-default'): default_level = 'sysop' else: default_level = arg[len('-default:'):] else: is_p_type = False if arg.startswith('-'): delimiter = arg.find(':') if delimiter > 0: p_type_arg = arg[1:delimiter] level = arg[delimiter + 1:] if p_type_arg in protection_types: protections[p_type_arg] = level is_p_type = True if not is_p_type: if not genFactory.handleArg(arg): raise ValueError('Unknown parameter "{0}"'.format(arg)) found = arg.find(':') if found: message_properties.update({ 'cat': arg[found + 1:], 'page': arg[found + 1:] }) if 'summary' not in options: generator_type = arg[1:found] if found > 0 else arg[1:] if generator_type in default_summaries: message_type = default_summaries[generator_type] if message_type == 'simple' or message_properties: if default_level == 'all': options['summary'] = i18n.twtranslate( site, 'unprotect-{0}'.format(message_type), message_properties) else: options['summary'] = i18n.twtranslate( site, 'protect-{0}'.format(message_type), message_properties) generator = genFactory.getCombinedGenerator() # We are just protecting pages, so we have no need of using a preloading # page generator to actually get the text of those pages. if generator: if default_level: default_level = check_protection_level('Default level', default_level, protection_levels) # set the default value for all # None (not the string 'none') will be ignored by Site.protect() combined_protections = { p_type: default_level for p_type in protection_types } for p_type, level in protections.items(): level = check_protection_level(p_type, level, protection_levels, default_level) # '' is equivalent to 'all' if level == 'none' or level == '': level = 'all' combined_protections[p_type] = level if not options.get('summary'): options['summary'] = pywikibot.input( u'Enter a reason for the protection change:') bot = ProtectionRobot(generator, combined_protections, site, **options) bot.run() return True else: pywikibot.bot.suggest_help(missing_generator=True) return False
def main(): gen = None singlePageTitle = [] xmlFilename = None # Which namespaces should be processed? # default to [] which means all namespaces will be processed namespaces = [] HTTPignore = [] day = 7 # Process global args and prepare generator args parser local_args = pywikibot.handleArgs() genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-talk': config.report_dead_links_on_talk = True elif arg == '-notalk': config.report_dead_links_on_talk = False elif arg.startswith('-namespace:'): try: namespaces.append(int(arg[11:])) except ValueError: namespaces.append(arg[11:]) elif arg == '-repeat': gen = RepeatPageGenerator() elif arg.startswith('-ignore:'): HTTPignore.append(int(arg[8:])) elif arg.startswith('-day:'): day = int(arg[5:]) elif arg.startswith('-xmlstart'): if len(arg) == 9: xmlStart = pywikibot.input( u'Please enter the dumped article to start with:') else: xmlStart = arg[10:] elif arg.startswith('-xml'): if len(arg) == 4: xmlFilename = i18n.input('pywikibot-enter-xml-filename') else: xmlFilename = arg[5:] else: if not genFactory.handleArg(arg): singlePageTitle.append(arg) if singlePageTitle: singlePageTitle = ' '.join(singlePageTitle) page = pywikibot.Page(pywikibot.Site(), singlePageTitle) gen = iter([page]) if xmlFilename: try: xmlStart except NameError: xmlStart = None gen = XmlDumpPageGenerator(xmlFilename, xmlStart, namespaces) if not gen: gen = genFactory.getCombinedGenerator() if gen: if namespaces != []: gen = pagegenerators.NamespaceFilterPageGenerator(gen, namespaces) # fetch at least 240 pages simultaneously from the wiki, but more if # a high thread number is set. pageNumber = max(240, config.max_external_links * 2) gen = pagegenerators.PreloadingGenerator(gen, step=pageNumber) gen = pagegenerators.RedirectFilterPageGenerator(gen) bot = WeblinkCheckerRobot(gen, HTTPignore, day) try: bot.run() finally: waitTime = 0 # Don't wait longer than 30 seconds for threads to finish. while countLinkCheckThreads() > 0 and waitTime < 30: try: pywikibot.output(u"Waiting for remaining %i threads to " u"finish, please wait..." % countLinkCheckThreads()) # wait 1 second time.sleep(1) waitTime += 1 except KeyboardInterrupt: pywikibot.output(u'Interrupted.') break if countLinkCheckThreads() > 0: pywikibot.output(u'Remaining %i threads will be killed.' % countLinkCheckThreads()) # Threads will die automatically because they are daemonic. if bot.history.reportThread: bot.history.reportThread.shutdown() # wait until the report thread is shut down; the user can # interrupt it by pressing CTRL-C. try: while bot.history.reportThread.isAlive(): time.sleep(0.1) except KeyboardInterrupt: pywikibot.output(u'Report thread interrupted.') bot.history.reportThread.kill() pywikibot.output(u'Saving history...') bot.history.save() else: pywikibot.showHelp()
def main(*args) -> None: """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ options = {} # type: Dict[str, Any] gen_options = {} # type: Dict[str, Any] # what the bot should do (either resolve double redirs, or process broken # redirs) action = None source = set() gen_factory = pagegenerators.GeneratorFactory() local_args = pywikibot.handle_args(args) for argument in local_args: arg, sep, value = argument.partition(':') option = arg.partition('-')[2] # bot options if arg == 'do': action = 'double' elif arg == 'br': action = 'broken' elif arg in ('both', 'broken', 'double'): action = arg elif option in ('always', 'delete'): options[option] = True elif option == 'sdtemplate': options['sdtemplate'] = value or pywikibot.input( 'Which speedy deletion template to use?') # generator options elif option in ('fullscan', 'moves'): gen_options[option] = True source.add(arg) elif option == 'xml': gen_options[option] = value or i18n.input( 'pywikibot-enter-xml-filename') source.add(arg) elif option == 'offset': gen_options[option] = int(value) elif option in ('start', 'until'): gen_options[option] = value elif option == 'limit': options['limit'] = gen_options['limit'] = int(value) elif gen_factory.handle_arg(argument): pass else: pywikibot.output('Unknown argument: ' + arg) if len(source) > 1: problem = 'You can only use one of {0} options.'.format( ' or '.join(source)) pywikibot.bot.suggest_help(additional_text=problem, missing_action=not action) return if not action: pywikibot.bot.suggest_help(missing_action=True) return gen = None if not gen_factory.gens: if gen_factory.namespaces: gen_options['namespaces'] = gen_factory.namespaces gen = RedirectGenerator(action, **gen_options) options['generator'] = gen_factory.getCombinedGenerator(gen=gen) bot = RedirectRobot(action, **options) bot.run()
def main(*args): """Process command line arguments and invoke PatrolBot.""" # 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. usercontribs = None recentchanges = False newpages = False repeat = False options = {} # Parse command line arguments local_args = pywikibot.handle_args(args) site = pywikibot.Site() gen_factory = pagegenerators.GeneratorFactory(site) for arg in local_args: if arg.startswith('-ask'): options['ask'] = True elif arg.startswith('-autopatroluserns'): options['autopatroluserns'] = True elif arg.startswith('-repeat'): repeat = True elif arg.startswith('-newpages'): newpages = True elif arg.startswith('-recentchanges'): recentchanges = True elif arg.startswith('-usercontribs:'): usercontribs = arg[14:] elif arg.startswith('-versionchecktime:'): versionchecktime = arg[len('-versionchecktime:'):] options['versionchecktime'] = int(versionchecktime) elif arg.startswith('-whitelist:'): options['whitelist'] = arg[len('-whitelist:'):] else: generator = gen_factory.handle_arg(arg) if not generator: if ':' in arg: m = arg.split(':') options[m[0]] = m[1] if usercontribs: user = pywikibot.User(site, usercontribs) if user.isAnonymous() or user.isRegistered(): pywikibot.output('Processing user: {}'.format(usercontribs)) else: pywikibot.warning('User {} does not exist on site {}.' .format(usercontribs, site)) # default behaviour if not any((newpages, recentchanges, usercontribs)): if site.family.name == 'wikipedia': newpages = True else: recentchanges = True if isinstance(mwparserfromhell, ImportError): suggest_help(missing_dependencies=('mwparserfromhell',)) return if newpages or usercontribs: pywikibot.output('Newpages:') gen = site.newpages feed = api_feed_repeater(gen, delay=60, repeat=repeat, user=usercontribs, namespaces=gen_factory.namespaces, recent_new_gen=False) bot = PatrolBot(site=site, generator=feed, **options) bot.treat_page_type = dict bot.run() if recentchanges or usercontribs: pywikibot.output('Recentchanges:') gen = site.recentchanges feed = api_feed_repeater(gen, delay=60, repeat=repeat, namespaces=gen_factory.namespaces, user=usercontribs) bot = PatrolBot(site=site, generator=feed, **options) bot.treat_page_type = dict bot.run()
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: unicode """ options = {} # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) gen_factory = pagegenerators.GeneratorFactory() for arg in local_args: opt, _, value = arg.partition(':') if opt == '-setlang': options[opt[1:]] = value elif arg in ('-always', '-never'): options[opt[1:]] = True else: gen_factory.handleArg(arg) if not options.get('setlang'): pywikibot.error('No -setlang parameter given.') return site = pywikibot.Site() specialpages = site.siteinfo['specialpagealiases'] specialpagelist = {item['realname'] for item in specialpages} allowedlanguages = site._paraminfo.parameter(module='setpagelanguage', param_name='lang')['type'] # Check if the special page PageLanguage is enabled on the wiki # If it is not, page languages can't be set, and there's no point in # running the bot any further if 'PageLanguage' not in specialpagelist: pywikibot.error("This site doesn't allow changing the " 'content languages of pages; aborting.') return # Check if the account has the right to change page content language # If it doesn't, there's no point in running the bot any further. if 'pagelang' not in site.userinfo['rights']: pywikibot.error("Your account doesn't have sufficient " 'rights to change the content language of pages; ' "aborting.\n\nYou must have the 'pagelang' right " 'in order to use this script.') return # Check if the language you are trying to set is allowed. if options['setlang'] not in allowedlanguages: pywikibot.error('"{}" is not in the list of allowed language codes; ' 'aborting.\n\n The following is the list of allowed ' 'languages. Using "default" will unset any set ' 'language and use the default language for the wiki ' 'instead.\n\n'.format(options['setlang']) + ', '.join(allowedlanguages)) return gen = gen_factory.getCombinedGenerator(preload=True) if gen: bot = ChangeLangBot(generator=gen, **options) bot.run() else: pywikibot.bot.suggest_help(missing_generator=True)
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ # If none, the var is setted only for check purpose. summary = None addText = None regexSkip = None regexSkipUrl = None always = False textfile = None talkPage = False reorderEnabled = True # Put the text above or below the text? up = False # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() # Loading the arguments for arg in local_args: if arg.startswith('-textfile'): if len(arg) == 9: textfile = pywikibot.input( u'Which textfile do you want to add?') else: textfile = arg[10:] elif arg.startswith('-text'): if len(arg) == 5: addText = pywikibot.input(u'What text do you want to add?') else: addText = arg[6:] elif arg.startswith('-summary'): if len(arg) == 8: summary = pywikibot.input(u'What summary do you want to use?') else: summary = arg[9:] elif arg.startswith('-excepturl'): if len(arg) == 10: regexSkipUrl = pywikibot.input(u'What text should I skip?') else: regexSkipUrl = arg[11:] elif arg.startswith('-except'): if len(arg) == 7: regexSkip = pywikibot.input(u'What text should I skip?') else: regexSkip = arg[8:] elif arg == '-up': up = True elif arg == '-noreorder': reorderEnabled = False elif arg == '-always': always = True elif arg == '-talk' or arg == '-talkpage': talkPage = True else: genFactory.handleArg(arg) if textfile and not addText: with codecs.open(textfile, 'r', config.textfile_encoding) as f: addText = f.read() generator = genFactory.getCombinedGenerator() if not generator: pywikibot.bot.suggest_help(missing_generator=True) return False if not addText: pywikibot.error("The text to add wasn't given.") return if talkPage: generator = pagegenerators.PageWithTalkPageGenerator(generator, True) for page in generator: (text, newtext, always) = add_text(page, addText, summary, regexSkip, regexSkipUrl, always, up, True, reorderEnabled=reorderEnabled, create=talkPage)
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ templateNames = [] templates = {} options = {} # If xmlfilename is None, references will be loaded from the live wiki. xmlfilename = None user = None skip = False timestamp = None # read command line parameters local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-remove': options['remove'] = True elif arg == '-subst': options['subst'] = True elif arg == '-assubst': options['subst'] = options['remove'] = True elif arg == '-always': options['always'] = True elif arg.startswith('-xml'): if len(arg) == 4: xmlfilename = pywikibot.input( u'Please enter the XML dump\'s filename: ') else: xmlfilename = arg[5:] elif arg.startswith('-category:'): options['addedCat'] = arg[len('-category:'):] elif arg.startswith('-summary:'): options['summary'] = arg[len('-summary:'):] elif arg.startswith('-user:'******'-user:'******'-skipuser:'******'-skipuser:'******'-timestamp:'): timestamp = arg[len('-timestamp:'):] else: if not genFactory.handleArg(arg): templateNames.append( pywikibot.Page(pywikibot.Site(), arg, ns=10).title(withNamespace=False)) if not templateNames: pywikibot.showHelp() return if options.get('subst', False) ^ options.get('remove', False): for templateName in templateNames: templates[templateName] = None else: try: for i in range(0, len(templateNames), 2): templates[templateNames[i]] = templateNames[i + 1] except IndexError: pywikibot.output( u'Unless using solely -subst or -remove, you must give an even number of template names.' ) return oldTemplates = [] for templateName in templates.keys(): oldTemplate = pywikibot.Page(pywikibot.Site(), templateName, ns=10) oldTemplates.append(oldTemplate) if xmlfilename: gen = XmlDumpTemplatePageGenerator(oldTemplates, xmlfilename) else: gen = genFactory.getCombinedGenerator() if not gen: gens = [ pagegenerators.ReferringPageGenerator(t, onlyTemplateInclusion=True) for t in oldTemplates ] gen = pagegenerators.CombinedPageGenerator(gens) gen = pagegenerators.DuplicateFilterPageGenerator(gen) if user: gen = UserEditFilterGenerator(gen, user, timestamp, skip, max_revision_depth=100) if not genFactory.gens: # make sure that proper namespace filtering etc. is handled gen = genFactory.getCombinedGenerator(gen) preloadingGen = pagegenerators.PreloadingGenerator(gen) bot = TemplateRobot(preloadingGen, templates, **options) bot.run()
def main(*args: Tuple[Any, ...]) -> None: command_option: CommandOptionTypedDict = deepcopy(COMMAND_OPTION) bot_option: BotOptionTypedDict = {} history_path: str = "" has_history_path: bool = False local_args = pywikibot.handle_args(args) generator_factory = pagegenerators.GeneratorFactory() for arg in local_args: key, seperator, value = arg.partition(":") stripped_value = value.strip() if key == "-config-type": config_type = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter config type:").strip()) command_option["config_type"] = ConfigType(config_type.lower()) elif key == "-config-path": config_path = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter config file path:").strip()) command_option["config_path"] = config_path elif key == "-config-page-title": config_page_title = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter config page title:").strip()) command_option["config_page_title"] = config_page_title elif key == "-history-path": history_path = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter history file path:").strip()) command_option["history_path"] = history_path has_history_path = True elif key == "-max-add": max_add = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter max add:").strip()) command_option["max_add"] = int(max_add) elif key == "-group": group = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter group:").strip()) command_option["group"] = int(group) elif key == "-proxy": proxy = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter proxy:").strip()) command_option["proxy"] = proxy elif key == "-http-proxy": http_proxy = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter HTTP proxy:").strip()) command_option["http_proxy"] = http_proxy elif key == "-https-proxy": https_proxy = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter HTTPS proxy:").strip()) command_option["https_proxy"] = https_proxy elif key == "-proxies-path": proxies_path = (stripped_value if len(stripped_value) > 0 else pywikibot.input("Enter proxies file path:").strip()) command_option["proxies_path"] = proxies_path else: generator_factory.handleArg(arg) source_config: SourceConfigDataType = get_source_config(command_option) history: HistoryDataType = (fetch_history_file(history_path) if has_history_path else {}) title_entries: TitleEntriesDataType = get_title_entries(source_config, history, command_option["max_add"]) page_entries: PageEntriesDataType = {} site = pywikibot.Site() generator = generator_factory.getCombinedGenerator( pagegenerators.PreloadingGenerator( PageEntryGenerator(site=site, title_entries=title_entries, page_entries=page_entries), groupsize=command_option["group"] ) ) if generator is None: pywikibot.bot.suggest_help(missing_generator=True) return bot = FeedExternalLinksBot(site, generator, title_entries, page_entries, history, **bot_option) # type: ignore bot.run() is_simulation: bool = pywikibot.config.simulate if has_history_path and not is_simulation: write_history_file(history_path, history)
def main(*args): templateNames = [] templates = {} subst = False remove = False namespaces = [] editSummary = '' addedCat = '' acceptAll = False genFactory = pagegenerators.GeneratorFactory() # If xmlfilename is None, references will be loaded from the live wiki. xmlfilename = None user = None skip = False timestamp = None # read command line parameters for arg in pywikibot.handleArgs(*args): if arg == '-remove': remove = True elif arg == '-subst': subst = True elif arg == '-assubst': subst = remove = True elif arg == ('-always'): acceptAll = True elif arg.startswith('-xml'): if len(arg) == 4: xmlfilename = pywikibot.input( u'Please enter the XML dump\'s filename: ') else: xmlfilename = arg[5:] elif arg.startswith('-category:'): addedCat = arg[len('-category:'):] elif arg.startswith('-summary:'): editSummary = arg[len('-summary:'):] elif arg.startswith('-user:'******'-user:'******'-skipuser:'******'-skipuser:'******'-timestamp:'): timestamp = arg[len('-timestamp:'):] else: if not genFactory.handleArg(arg): templateNames.append( pywikibot.Page(pywikibot.Site(), arg, ns=10).title(withNamespace=False)) if subst ^ remove: for templateName in templateNames: templates[templateName] = None else: try: for i in range(0, len(templateNames), 2): templates[templateNames[i]] = templateNames[i + 1] except IndexError: pywikibot.output( u'Unless using solely -subst or -remove, you must give an even number of template names.' ) return oldTemplates = [] ns = pywikibot.Site().template_namespace() for templateName in templates.keys(): oldTemplate = pywikibot.Page(pywikibot.Site(), templateName, ns=10) oldTemplates.append(oldTemplate) if xmlfilename: gen = XmlDumpTemplatePageGenerator(oldTemplates, xmlfilename) else: gen = genFactory.getCombinedGenerator() if not gen: gens = [] gens = [ pagegenerators.ReferringPageGenerator(t, onlyTemplateInclusion=True) for t in oldTemplates ] gen = pagegenerators.CombinedPageGenerator(gens) gen = pagegenerators.DuplicateFilterPageGenerator(gen) if user: gen = UserEditFilterGenerator(gen, user, timestamp, skip) preloadingGen = pagegenerators.PreloadingGenerator(gen) bot = TemplateRobot(preloadingGen, templates, subst, remove, editSummary, acceptAll, addedCat) bot.run()
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ exists_arg = '' commandline_claims = list() # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) gen = pagegenerators.GeneratorFactory() for arg in local_args: # Handle args specifying how to handle duplicate claims if arg.startswith('-exists:'): exists_arg = arg.split(':')[1].strip('"') continue # Handle page generator args if gen.handleArg(arg): continue commandline_claims.append(arg) if len(commandline_claims) % 2: raise ValueError # or something. claims = list() repo = pywikibot.Site().data_repository() for i in range(0, len(commandline_claims), 2): claim = pywikibot.Claim(repo, commandline_claims[i]) if claim.type == 'wikibase-item': target = pywikibot.ItemPage(repo, commandline_claims[i + 1]) elif claim.type == 'string': target = commandline_claims[i + 1] elif claim.type == 'globe-coordinate': coord_args = [ float(c) for c in commandline_claims[i + 1].split(',') ] if len(coord_args) >= 3: precision = coord_args[2] else: precision = 0.0001 # Default value (~10 m at equator) target = pywikibot.Coordinate(coord_args[0], coord_args[1], precision=precision) else: raise NotImplementedError( "%s datatype is not yet supported by claimit.py" % claim.type) claim.setTarget(target) claims.append(claim) generator = gen.getCombinedGenerator() if not generator: # show help text from the top of this file pywikibot.showHelp() return bot = ClaimRobot(generator, claims, exists_arg) bot.run()
}, }, } for project in tp_map.keys(): lang, family = project.split('|', 1) if len(do_only) > 0 and lang + family not in do_only and family not in do_only: continue if lang + family in dont_do or family in dont_do: continue site = pywikibot.Site(lang, family) pywikibot.output('Doing %s%s' % (lang, family)) site.login() genFactory = pagegenerators.GeneratorFactory(site=site) for ns in (0, 14, 100): if family != 'wikisource' and ns == 100: # fixme: cswikiquote continue if family == 'wikisource' and ns == 0: continue genFactory.handleArg('-ns:%i' % ns) genFactory.handleArg('-unconnectedpages') generator = genFactory.getCombinedGenerator(preload=True) for page in generator: if page.namespace() != 14 and page.isDisambig(): continue for template, fields in textlib.extract_templates_and_params(page.text): if first_lower(template) not in tp_map[project]:
def main(*args): options = {} local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if genFactory.handleArg(arg): continue # nothing to do here arg, sep, value = arg.partition(':') option = arg[1:] if option in ('summary', 'text'): if not value: pywikibot.input('Please enter a value for ' + arg) options[option] = value elif option in ('method'): if not value: options[option] = 'all' else: options[option] = value else: options[option] = True gen = genFactory.getCombinedGenerator() if gen: gen = pagegenerators.PreloadingGenerator(gen) bot = HujiBot(gen, **options) bot.run() return True else: conn = mysqldb.connect("fawiki.web.db.svc.wikimedia.cloud", db="fawiki_p", read_default_file="~/replica.my.cnf") cursor = conn.cursor() sql = """ SELECT DISTINCT concat('کاربر:', page_title) AS title FROM page JOIN revision ON rev_page = page_id AND rev_id = page_latest JOIN categorylinks ON page_id = cl_from WHERE page_namespace = 2 AND page_title like '%/صفحه_تمرین' AND rev_timestamp < DATE_FORMAT( DATE_SUB(NOW(), INTERVAL 1 YEAR), '%Y%m%d000000' ) ORDER BY rev_timestamp """ cursor.execute(sql.encode('utf-8')) results = cursor.fetchall() print(len(results), ' rows will be processed') for rowid in range(len(results)): row = results[rowid] title = row[0] page = pywikibot.Page(pywikibot.Site(), title.decode('utf-8')) page.put(NEWTEXT, SUMMARY) return True
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: unicode """ oldName = None options = {} fromToPairs = [] # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-pairs' or arg.startswith('-pairs:'): issue_deprecation_warning( '-pairs', '-pairsfile', 2, ArgumentDeprecationWarning, since='20160304') elif arg.startswith('-pairsfile'): if len(arg) == len('-pairsfile'): filename = pywikibot.input( 'Enter the name of the file containing pairs:') else: filename = arg[len('-pairsfile:'):] oldName1 = None for page in pagegenerators.TextfilePageGenerator(filename): if oldName1: fromToPairs.append([oldName1, page.title()]) oldName1 = None else: oldName1 = page.title() if oldName1: pywikibot.warning( 'file {0} contains odd number of links'.format(filename)) elif arg == '-noredirect': options['noredirect'] = True elif arg == '-notalkpage': options['movetalkpage'] = False elif arg == '-always': options['always'] = True elif arg == '-skipredirects': options['skipredirects'] = True elif arg.startswith('-from:'): if oldName: pywikibot.warning('-from:{0} without -to:'.format(oldName)) oldName = arg[len('-from:'):] elif arg.startswith('-to:'): if oldName: fromToPairs.append([oldName, arg[len('-to:'):]]) oldName = None else: pywikibot.warning('{0} without -from'.format(arg)) elif arg.startswith('-prefix'): if len(arg) == len('-prefix'): options['prefix'] = pywikibot.input('Enter the prefix:') else: options['prefix'] = arg[8:] elif arg.startswith('-summary'): if len(arg) == len('-summary'): options['summary'] = pywikibot.input('Enter the summary:') else: options['summary'] = arg[9:] else: genFactory.handleArg(arg) if oldName: pywikibot.warning('-from:{0} without -to:'.format(oldName)) site = pywikibot.Site() for pair in fromToPairs: page = pywikibot.Page(site, pair[0]) bot = MovePagesBot(None, **options) bot.moveOne(page, pair[1]) gen = genFactory.getCombinedGenerator(preload=True) if gen: bot = MovePagesBot(gen, **options) bot.run() return True if not fromToPairs: pywikibot.bot.suggest_help(missing_generator=True) return False else: return True
def main(*args) -> None: """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ exists_arg = '' commandline_claims = [] # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) gen = pagegenerators.GeneratorFactory() for arg in local_args: # Handle args specifying how to handle duplicate claims if arg.startswith('-exists:'): exists_arg = arg.split(':')[1] continue # Handle page generator args if gen.handle_arg(arg): continue commandline_claims.append(arg) if len(commandline_claims) % 2: pywikibot.error('Incomplete command line property-value pair.') return claims = [] repo = pywikibot.Site().data_repository() for i in range(0, len(commandline_claims), 2): claim = pywikibot.Claim(repo, commandline_claims[i]) if claim.type == 'wikibase-item': target = pywikibot.ItemPage(repo, commandline_claims[i + 1]) elif claim.type == 'string': target = commandline_claims[i + 1] elif claim.type == 'globe-coordinate': coord_args = [ float(c) for c in commandline_claims[i + 1].split(',') ] if len(coord_args) >= 3: precision = coord_args[2] else: precision = 0.0001 # Default value (~10 m at equator) target = pywikibot.Coordinate(coord_args[0], coord_args[1], precision=precision) else: raise NotImplementedError( '{} datatype is not yet supported by claimit.py'.format( claim.type)) claim.setTarget(target) claims.append(claim) generator = gen.getCombinedGenerator() if not generator: pywikibot.bot.suggest_help(missing_generator=True) return bot = ClaimRobot(generator, claims, exists_arg) bot.run()
def main(): """ Main Function """ # Loading the comments global categoryToCheck, project_inserted # always, define a generator to understand if the user sets one, # defining what's genFactory always = False generator = False show = False moveBlockCheck = False protectedpages = False protectType = 'edit' namespace = 0 # To prevent Infinite loops errorCount = 0 # Process global args and prepare generator args parser local_args = pywikibot.handleArgs() genFactory = pagegenerators.GeneratorFactory() # Process local args for arg in local_args: if arg == '-always': always = True elif arg == '-move': moveBlockCheck = True elif arg == '-show': show = True elif arg.startswith('-protectedpages'): protectedpages = True if len(arg) > 15: namespace = int(arg[16:]) elif arg.startswith('-moveprotected'): protectedpages = True protectType = 'move' if len(arg) > 14: namespace = int(arg[15:]) else: genFactory.handleArg(arg) if config.mylang not in project_inserted: pywikibot.output(u"Your project is not supported by this script.\n" u"You have to edit the script and add it!") return site = pywikibot.Site() site.login() if protectedpages: generator = site.protectedpages(namespace=namespace, type=protectType) # Take the right templates to use, the category and the comment TSP = pywikibot.translate(site, templateSemiProtection) TTP = pywikibot.translate(site, templateTotalProtection) TSMP = pywikibot.translate(site, templateSemiMoveProtection) TTMP = pywikibot.translate(site, templateTotalMoveProtection) TNR = pywikibot.translate(site, templateNoRegex) TU = pywikibot.translate(site, templateUnique) categories = pywikibot.translate(site, categoryToCheck) commentUsed = i18n.twtranslate(site, 'blockpageschecker-summary') if not generator: generator = genFactory.getCombinedGenerator() if not generator: generator = list() pywikibot.output(u'Loading categories...') # Define the category if no other generator has been setted for CAT in categories: cat = pywikibot.Category(site, CAT) # Define the generator gen = pagegenerators.CategorizedPageGenerator(cat) for pageCat in gen: generator.append(pageCat) pywikibot.output(u'Categories loaded, start!') # Main Loop preloadingGen = pagegenerators.PreloadingGenerator(generator, step=60) for page in preloadingGen: pagename = page.title(asLink=True) pywikibot.output('Loading %s...' % pagename) try: text = page.text except pywikibot.NoPage: pywikibot.output("%s doesn't exist! Skipping..." % pagename) continue except pywikibot.IsRedirectPage: pywikibot.output("%s is a redirect! Skipping..." % pagename) if show: showQuest(page) continue """ # This check does not work : # PreloadingGenerator cannot set correctly page.editRestriction # (see bug #1949476 ) if not page.canBeEdited(): pywikibot.output("%s is sysop-protected : this account can't edit " "it! Skipping..." % pagename) continue """ restrictions = page.protection() try: editRestr = restrictions['edit'] except KeyError: editRestr = None if not page.canBeEdited(): pywikibot.output(u"%s is protected: " u"this account can't edit it! Skipping..." % pagename) continue # Understand, according to the template in the page, what should be the # protection and compare it with what there really is. TemplateInThePage = understandBlock(text, TTP, TSP, TSMP, TTMP, TU) # Only to see if the text is the same or not... oldtext = text # keep track of the changes for each step (edit then move) changes = -1 if not editRestr: # page is not edit-protected # Deleting the template because the page doesn't need it. if TU: replaceToPerform = u'|'.join(TTP + TSP + TU) else: replaceToPerform = u'|'.join(TTP + TSP) text, changes = re.subn( '<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('(%s)' % replaceToPerform, '', text) msg = u'The page is editable for all' if not moveBlockCheck: msg += u', deleting the template..' pywikibot.output(u'%s.' % msg) elif editRestr[0] == 'sysop': # total edit protection if (TemplateInThePage[0] == 'sysop-total' and TTP) or \ (TemplateInThePage[0] == 'unique' and TU): msg = 'The page is protected to the sysop' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: pywikibot.output( u'The page is protected to the sysop, but the ' u'template seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[1], text) elif TSP or TU: # implicitely editRestr[0] = 'autoconfirmed', edit-Semi-protection if TemplateInThePage[0] == 'autoconfirmed-total' or \ TemplateInThePage[0] == 'unique': msg = 'The page is editable only for the autoconfirmed users' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: pywikibot.output(u'The page is editable only for the ' u'autoconfirmed users, but the template ' u'seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[0], text) if changes == 0: # We tried to fix edit-protection templates, but it did not work. pywikibot.warning('No edit-protection template could be found') if moveBlockCheck and changes > -1: # checking move protection now try: moveRestr = restrictions['move'] except KeyError: moveRestr = False changes = -1 if not moveRestr: pywikibot.output(u'The page is movable for all, deleting the ' u'template...') # Deleting the template because the page doesn't need it. if TU: replaceToPerform = u'|'.join(TSMP + TTMP + TU) else: replaceToPerform = u'|'.join(TSMP + TTMP) text, changes = re.subn( '<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('(%s)' % replaceToPerform, '', text) elif moveRestr[0] == 'sysop': # move-total-protection if (TemplateInThePage[0] == 'sysop-move' and TTMP) or \ (TemplateInThePage[0] == 'unique' and TU): pywikibot.output(u'The page is protected from moving to ' u'the sysop, skipping...') if TU: # no changes needed, better to revert the old text. text = oldtext else: pywikibot.output(u'The page is protected from moving to ' u'the sysop, but the template seems not ' u'correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[3], text) elif TSMP or TU: # implicitely moveRestr[0] = 'autoconfirmed', # move-semi-protection if TemplateInThePage[0] == 'autoconfirmed-move' or \ TemplateInThePage[0] == 'unique': pywikibot.output(u'The page is movable only for the ' u'autoconfirmed users, skipping...') if TU: # no changes needed, better to revert the old text. text = oldtext else: pywikibot.output(u'The page is movable only for the ' u'autoconfirmed users, but the template ' u'seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[2], text) if changes == 0: # We tried to fix move-protection templates, but it did not work pywikibot.warning('No move-protection template could be found') if oldtext != text: # Ok, asking if the change has to be performed and do it if yes. pywikibot.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title()) pywikibot.showDiff(oldtext, text) if not always: choice = pywikibot.inputChoice( u'Do you want to accept these ' u'changes?', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N') if choice == 'a': always = True if always or choice == 'y': while True: try: page.put(text, commentUsed, force=True) except pywikibot.EditConflict: pywikibot.output(u'Edit conflict! skip!') break except pywikibot.ServerError: # Sometimes there is this error that's quite annoying # because can block the whole process for nothing. errorCount += 1 if errorCount < 5: pywikibot.output(u'Server Error! Wait..') time.sleep(3) continue else: # Prevent Infinite Loops raise pywikibot.ServerError(u'Fifth Server Error!') except pywikibot.SpamfilterError as e: pywikibot.output(u'Cannot change %s because of ' u'blacklist entry %s' % (page.title(), e.url)) break except pywikibot.PageNotSaved as error: pywikibot.output(u'Error putting page: %s' % (error.args, )) break except pywikibot.LockedPage: pywikibot.output(u'The page is still protected. ' u'Skipping...') break else: # Break only if the errors are one after the other errorCount = 0 break
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: unicode """ add_cat = None gen = None # summary message edit_summary = '' # Array which will collect commandline parameters. # First element is original text, second element is replacement text. commandline_replacements = [] # A list of 2-tuples of original text and replacement text. replacements = [] # Don't edit pages which contain certain texts. exceptions = { 'title': [], 'text-contains': [], 'inside': [], 'inside-tags': [], 'require-title': [], # using a separate requirements dict needs some } # major refactoring of code. # Should the elements of 'replacements' and 'exceptions' be interpreted # as regular expressions? regex = False # Predefined fixes from dictionary 'fixes' (see above). fixes_set = [] # the dump's path, either absolute or relative, which will be used # if -xml flag is present xmlFilename = None useSql = False sql_query = None # will become True when the user presses a ('yes to all') or uses the # -always flag. acceptall = False # Will become True if the user inputs the commandline parameter -nocase caseInsensitive = False # Will become True if the user inputs the commandline parameter -dotall dotall = False # Will become True if the user inputs the commandline parameter -multiline multiline = False # Do all hits when they overlap allowoverlap = False # Do not recurse replacement recursive = False # Between a regex and another (using -fix) sleep some time (not to waste # too much CPU sleep = None # Request manual replacements even if replacements are already defined manual_input = False # Replacements loaded from a file replacement_file = None replacement_file_arg_misplaced = False # Read commandline parameters. local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if genFactory.handleArg(arg): continue if arg == '-regex': regex = True elif arg.startswith('-xmlstart'): if len(arg) == 9: xmlStart = pywikibot.input( 'Please enter the dumped article to start with:') else: xmlStart = arg[10:] elif arg.startswith('-xml'): if len(arg) == 4: xmlFilename = i18n.input('pywikibot-enter-xml-filename') else: xmlFilename = arg[5:] elif arg.startswith(('-sql', '-mysqlquery')): if arg.startswith('-sql'): issue_deprecation_warning('The usage of "-sql"', '-mysqlquery', 1, ArgumentDeprecationWarning, since='20180617') useSql = True sql_query = arg.partition(':')[2] elif arg.startswith('-excepttitle:'): exceptions['title'].append(arg[13:]) elif arg.startswith('-requiretitle:'): exceptions['require-title'].append(arg[14:]) elif arg.startswith('-excepttext:'): exceptions['text-contains'].append(arg[12:]) elif arg.startswith('-exceptinside:'): exceptions['inside'].append(arg[14:]) elif arg.startswith('-exceptinsidetag:'): exceptions['inside-tags'].append(arg[17:]) elif arg.startswith('-fix:'): fixes_set += [arg[5:]] elif arg.startswith('-sleep:'): sleep = float(arg[7:]) elif arg == '-always': acceptall = True elif arg == '-recursive': recursive = True elif arg == '-nocase': caseInsensitive = True elif arg == '-dotall': dotall = True elif arg == '-multiline': multiline = True elif arg.startswith('-addcat:'): add_cat = arg[8:] elif arg.startswith('-summary:'): edit_summary = arg[9:] elif arg.startswith('-automaticsummary'): edit_summary = True elif arg.startswith('-allowoverlap'): allowoverlap = True elif arg.startswith('-manualinput'): manual_input = True elif arg.startswith('-replacementfile'): issue_deprecation_warning('-replacementfile', '-pairsfile', 2, ArgumentDeprecationWarning, since='20160304') elif arg.startswith('-pairsfile'): if len(commandline_replacements) % 2: replacement_file_arg_misplaced = True if arg == '-pairsfile': replacement_file = pywikibot.input( 'Please enter the filename to read replacements from:') else: replacement_file = arg[len('-pairsfile:'):] else: commandline_replacements.append(arg) site = pywikibot.Site() if len(commandline_replacements) % 2: pywikibot.error('Incomplete command line pattern replacement pair.') return False if replacement_file_arg_misplaced: pywikibot.error('-pairsfile used between a pattern replacement pair.') return False if replacement_file: try: with codecs.open(replacement_file, 'r', 'utf-8') as f: # strip newlines, but not other characters file_replacements = f.read().splitlines() except (IOError, OSError) as e: pywikibot.error('Error loading {0}: {1}'.format( replacement_file, e)) return False if len(file_replacements) % 2: pywikibot.error( '{0} contains an incomplete pattern replacement pair.'.format( replacement_file)) return False # Strip BOM from first line file_replacements[0].lstrip('\uFEFF') commandline_replacements.extend(file_replacements) if not (commandline_replacements or fixes_set) or manual_input: old = pywikibot.input('Please enter the text that should be replaced:') while old: new = pywikibot.input('Please enter the new text:') commandline_replacements += [old, new] old = pywikibot.input( 'Please enter another text that should be replaced,' '\nor press Enter to start:') # The summary stored here won't be actually used but is only an example single_summary = None for i in range(0, len(commandline_replacements), 2): replacement = Replacement(commandline_replacements[i], commandline_replacements[i + 1]) if not single_summary: single_summary = i18n.twtranslate( site, 'replace-replacing', { 'description': ' (-{0} +{1})'.format(replacement.old, replacement.new) }) replacements.append(replacement) # Perform one of the predefined actions. missing_fixes_summaries = [] # which a fixes/replacements miss a summary generators_given = bool(genFactory.gens) for fix_name in fixes_set: try: fix = fixes.fixes[fix_name] except KeyError: pywikibot.output('Available predefined fixes are: {0}'.format( ', '.join(fixes.fixes.keys()))) if not fixes.user_fixes_loaded: pywikibot.output('The user fixes file could not be found: ' '{0}'.format(fixes.filename)) return if not fix['replacements']: pywikibot.warning('No replacements defined for fix ' '"{0}"'.format(fix_name)) continue if 'msg' in fix: if isinstance(fix['msg'], basestring): set_summary = i18n.twtranslate(site, str(fix['msg'])) else: set_summary = i18n.translate(site, fix['msg'], fallback=True) else: set_summary = None if not generators_given and 'generator' in fix: gen_args = fix['generator'] if isinstance(gen_args, basestring): gen_args = [gen_args] for gen_arg in gen_args: genFactory.handleArg(gen_arg) replacement_set = ReplacementList(fix.get('regex'), fix.get('exceptions'), fix.get('nocase'), set_summary, name=fix_name) # Whether some replacements have a summary, if so only show which # have none, otherwise just mention the complete fix missing_fix_summaries = [] for index, replacement in enumerate(fix['replacements'], start=1): summary = None if len(replacement) < 3 else replacement[2] if not set_summary and not summary: missing_fix_summaries.append('"{0}" (replacement #{1})'.format( fix_name, index)) if chars.contains_invisible(replacement[0]): pywikibot.warning('The old string "{0}" contains formatting ' 'characters like U+200E'.format( chars.replace_invisible(replacement[0]))) if (not callable(replacement[1]) and chars.contains_invisible(replacement[1])): pywikibot.warning('The new string "{0}" contains formatting ' 'characters like U+200E'.format( chars.replace_invisible(replacement[1]))) replacement_set.append( ReplacementListEntry( old=replacement[0], new=replacement[1], fix_set=replacement_set, edit_summary=summary, )) # Exceptions specified via 'fix' shall be merged to those via CLI. if replacement_set: replacements.extend(replacement_set) if replacement_set._exceptions is not None: for k, v in replacement_set._exceptions.items(): if k in exceptions: exceptions[k] = list(set(exceptions[k]) | set(v)) else: exceptions[k] = v if len(fix['replacements']) == len(missing_fix_summaries): missing_fixes_summaries.append( '"{0}" (all replacements)'.format(fix_name)) else: missing_fixes_summaries += missing_fix_summaries if ((not edit_summary or edit_summary is True) and (missing_fixes_summaries or single_summary)): if single_summary: pywikibot.output('The summary message for the command line ' 'replacements will be something like: ' + single_summary) if missing_fixes_summaries: pywikibot.output('The summary will not be used when the fix has ' 'one defined but the following fix(es) do(es) ' 'not have a summary defined: ' '{0}'.format(', '.join(missing_fixes_summaries))) if edit_summary is not True: edit_summary = pywikibot.input( 'Press Enter to use this automatic message, or enter a ' 'description of the\nchanges your bot will make:') else: edit_summary = '' # Set the regular expression flags flags = re.UNICODE if caseInsensitive: flags = flags | re.IGNORECASE if dotall: flags = flags | re.DOTALL if multiline: flags = flags | re.MULTILINE # Pre-compile all regular expressions here to save time later for replacement in replacements: replacement.compile(regex, flags) precompile_exceptions(exceptions, regex, flags) if xmlFilename: try: xmlStart except NameError: xmlStart = None gen = XmlDumpReplacePageGenerator(xmlFilename, xmlStart, replacements, exceptions, site) elif useSql: if not sql_query: whereClause = 'WHERE (%s)' % ' OR '.join([ "old_text RLIKE '%s'" % prepareRegexForMySQL(old_regexp.pattern) for (old_regexp, new_text) in replacements ]) if exceptions: exceptClause = 'AND NOT (%s)' % ' OR '.join([ "old_text RLIKE '%s'" % prepareRegexForMySQL(exc.pattern) for exc in exceptions ]) else: exceptClause = '' query = sql_query or """ SELECT page_namespace, page_title FROM page JOIN text ON (page_id = old_id) %s %s LIMIT 200""" % (whereClause, exceptClause) gen = pagegenerators.MySQLPageGenerator(query) gen = genFactory.getCombinedGenerator(gen, preload=True) if not gen: pywikibot.bot.suggest_help(missing_generator=True) return False bot = ReplaceRobot(gen, replacements, exceptions, allowoverlap, recursive, add_cat, sleep, edit_summary, always=acceptall, site=site) site.login() bot.run() # Explicitly call pywikibot.stopme(). It will make sure the callback is # triggered before replace.py is unloaded. pywikibot.stopme() pywikibot.output('\n{0} pages changed.'.format(bot.changed_pages))
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ local_args = pywikibot.handle_args(args) fromsite = pywikibot.Site() tolang = fromsite.code tofamily = fromsite.family.name prefix = '' overwrite = False gen_args = [] genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if genFactory.handleArg(arg): gen_args.append(arg) continue if arg.startswith('-tofamily'): tofamily = arg[len('-tofamily:'):] elif arg.startswith('-tolang'): tolang = arg[len('-tolang:'):] elif arg.startswith('-prefix'): prefix = arg[len('-prefix:'):] elif arg == "-overwrite": overwrite = True tosite = pywikibot.Site(tolang, tofamily) if fromsite == tosite: raise TargetSiteMissing('Target site not different from source site') gen = genFactory.getCombinedGenerator() if not gen: raise TargetPagesMissing('Target pages not specified') gen_args = ' '.join(gen_args) pywikibot.output(u""" Page transfer configuration --------------------------- Source: %(fromsite)r Target: %(tosite)r Pages to transfer: %(gen_args)s Prefix for transferred pages: %(prefix)s """ % locals()) for page in gen: summary = "Moved page from %s" % page.title(asLink=True) targetpage = pywikibot.Page(tosite, prefix + page.title()) edithistpage = pywikibot.Page(tosite, prefix + page.title() + "/edithistory") if targetpage.exists() and not overwrite: pywikibot.output( u"Skipped %s (target page %s exists)" % (page.title(asLink=True), targetpage.title(asLink=True))) continue pywikibot.output( u"Moving %s to %s..." % (page.title(asLink=True), targetpage.title(asLink=True))) pywikibot.log("Getting page text.") text = page.get(get_redirect=True) text += "<noinclude>\n\n<small>This page was moved from %s. It's edit history can be viewed at %s</small></noinclude>" % ( page.title(asLink=True, insite=targetpage.site), edithistpage.title(asLink=True, insite=targetpage.site)) pywikibot.log("Getting edit history.") historytable = page.getVersionHistoryTable() pywikibot.log("Putting page text.") targetpage.put(text, comment=summary) pywikibot.log("Putting edit history.") edithistpage.put(historytable, comment=summary)
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ xmlFilename = None options = {} namespaces = [] generator = None # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg.startswith('-namespace:'): try: namespaces.append(int(arg[11:])) except ValueError: namespaces.append(arg[11:]) elif arg.startswith('-summary:'): options['summary'] = arg[9:] elif arg == '-always': options['always'] = True elif arg == '-ignorepdf': options['ignorepdf'] = True elif arg.startswith('-limit:'): options['limit'] = int(arg[7:]) elif arg.startswith('-xmlstart'): if len(arg) == 9: xmlStart = pywikibot.input( u'Please enter the dumped article to start with:') else: xmlStart = arg[10:] elif arg.startswith('-xml'): if len(arg) == 4: xmlFilename = pywikibot.input( u'Please enter the XML dump\'s filename:') else: xmlFilename = arg[5:] else: genFactory.handleArg(arg) if xmlFilename: try: xmlStart except NameError: xmlStart = None generator = XmlDumpPageGenerator(xmlFilename, xmlStart, namespaces) if not generator: generator = genFactory.getCombinedGenerator() if not generator: pywikibot.bot.suggest_help(missing_generator=True) return False generator = pagegenerators.PreloadingGenerator(generator, step=50) generator = pagegenerators.RedirectFilterPageGenerator(generator) bot = ReferencesRobot(generator, **options) bot.run() return True
def main(*args): """Process command line arguments and invoke PatrolBot.""" # 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. usercontribs = None gen = None recentchanges = False newpages = False repeat = False genFactory = pagegenerators.GeneratorFactory() options = {} # Parse command line arguments for arg in pywikibot.handle_args(args): if arg.startswith('-ask'): options['ask'] = True elif arg.startswith('-autopatroluserns'): options['autopatroluserns'] = True elif arg.startswith('-repeat'): repeat = True elif arg.startswith('-newpages'): newpages = True elif arg.startswith('-recentchanges'): recentchanges = True elif arg.startswith('-usercontribs:'): usercontribs = arg[14:] elif arg.startswith('-versionchecktime:'): versionchecktime = arg[len('-versionchecktime:'):] options['versionchecktime'] = int(versionchecktime) elif arg.startswith("-whitelist:"): options['whitelist'] = arg[len('-whitelist:'):] else: generator = genFactory.handleArg(arg) if not generator: if ':' in arg: m = arg.split(':') options[m[0]] = m[1] site = pywikibot.Site() site.login() if usercontribs: user = pywikibot.User(site, usercontribs) if user.isAnonymous() or user.isRegistered(): pywikibot.output('Processing user: {}'.format(usercontribs)) else: pywikibot.warning('User {} does not exist on site {}.'.format( usercontribs, site)) # default behaviour if not any((newpages, recentchanges, usercontribs)): if site.family.name == 'wikipedia': newpages = True else: recentchanges = True bot = PatrolBot(**options) if newpages or usercontribs: pywikibot.output(u'Newpages:') gen = site.newpages feed = api_feed_repeater(gen, delay=60, repeat=repeat, user=usercontribs, namespaces=genFactory.namespaces, recent_new_gen=False) bot.run(feed) if recentchanges or usercontribs: pywikibot.output(u'Recentchanges:') gen = site.recentchanges feed = api_feed_repeater(gen, delay=60, repeat=repeat, namespaces=genFactory.namespaces, user=usercontribs) bot.run(feed) pywikibot.output(u'%d/%d patrolled' % (bot.patrol_counter, bot.rc_item_counter))
def main(*args): """ Process command line arguments and perform task. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ # Loading the comments global categoryToCheck, project_inserted # always, define a generator to understand if the user sets one, # defining what's genFactory always = False generator = False show = False moveBlockCheck = False protectedpages = False protectType = 'edit' namespace = 0 # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() # Process local args for arg in local_args: option, sep, value = arg.partition(':') if option == '-always': always = True elif option == '-move': moveBlockCheck = True elif option == '-show': show = True elif option in ('-protectedpages', '-moveprotected'): protectedpages = True if option == '-moveprotected': protectType = 'move' if value: namespace = int(value) else: genFactory.handleArg(arg) if config.mylang not in project_inserted: pywikibot.output('Your project is not supported by this script.\n' 'You have to edit the script and add it!') return site = pywikibot.Site() if protectedpages: generator = site.protectedpages(namespace=namespace, type=protectType) # Take the right templates to use, the category and the comment TSP = i18n.translate(site, templateSemiProtection) TTP = i18n.translate(site, templateTotalProtection) TSMP = i18n.translate(site, templateSemiMoveProtection) TTMP = i18n.translate(site, templateTotalMoveProtection) TNR = i18n.translate(site, templateNoRegex) TU = i18n.translate(site, templateUnique) categories = i18n.translate(site, categoryToCheck) commentUsed = i18n.twtranslate(site, 'blockpageschecker-summary') if not generator: generator = genFactory.getCombinedGenerator() if not generator: generator = [] pywikibot.output('Loading categories...') # Define the category if no other generator has been set for CAT in categories: cat = pywikibot.Category(site, CAT) # Define the generator gen = pagegenerators.CategorizedPageGenerator(cat) for pageCat in gen: generator.append(pageCat) pywikibot.output('Categories loaded, start!') # Main Loop if not genFactory.nopreload: generator = pagegenerators.PreloadingGenerator(generator, groupsize=60) for page in generator: pagename = page.title(as_link=True) pywikibot.output('Loading %s...' % pagename) try: text = page.text except pywikibot.NoPage: pywikibot.output("%s doesn't exist! Skipping..." % pagename) continue except pywikibot.IsRedirectPage: pywikibot.output('{} is a redirect! Skipping...'.format(pagename)) if show: showQuest(page) continue # FIXME: This check does not work : # PreloadingGenerator cannot set correctly page.editRestriction # (see bug T57322) # if not page.has_permission(): # pywikibot.output( # "%s is sysop-protected : this account can't edit " # "it! Skipping..." % pagename) # continue restrictions = page.protection() try: editRestr = restrictions['edit'] except KeyError: editRestr = None if not page.has_permission(): pywikibot.output('%s is protected: ' "this account can't edit it! Skipping..." % pagename) continue # Understand, according to the template in the page, what should be the # protection and compare it with what there really is. TemplateInThePage = understandBlock(text, TTP, TSP, TSMP, TTMP, TU) # Only to see if the text is the same or not... oldtext = text # keep track of the changes for each step (edit then move) changes = -1 if not editRestr: # page is not edit-protected # Deleting the template because the page doesn't need it. if not (TTP or TSP): raise pywikibot.Error( 'This script is not localized to use it on \n{0}. ' 'Missing "templateSemiProtection" or' '"templateTotalProtection"'.format(site.sitename)) if TU: replaceToPerform = '|'.join(TTP + TSP + TU) else: replaceToPerform = '|'.join(TTP + TSP) text, changes = re.subn( '<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('(%s)' % replaceToPerform, '', text) msg = 'The page is editable for all' if not moveBlockCheck: msg += ', deleting the template..' pywikibot.output(msg + '.') elif editRestr[0] == 'sysop': # total edit protection if (TemplateInThePage[0] == 'sysop-total' and TTP) or \ (TemplateInThePage[0] == 'unique' and TU): msg = 'The page is protected to the sysop' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: if not TNR or TU and not TNR[4] or not (TU or TNR[1]): raise pywikibot.Error( 'This script is not localized to use it on \n{0}. ' 'Missing "templateNoRegex"'.format(site.sitename)) pywikibot.output('The page is protected to the sysop, but the ' 'template seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[1], text) elif TSP or TU: # implicitly editRestr[0] = 'autoconfirmed', edit-Semi-protection if TemplateInThePage[0] == 'autoconfirmed-total' or \ TemplateInThePage[0] == 'unique': msg = 'The page is editable only for the autoconfirmed users' if not moveBlockCheck: msg += ', skipping...' pywikibot.output(msg) else: if not TNR or TU and not TNR[4] or not (TU or TNR[1]): raise pywikibot.Error( 'This script is not localized to use it on \n{0}. ' 'Missing "templateNoRegex"'.format(site.sitename)) pywikibot.output('The page is editable only for the ' 'autoconfirmed users, but the template ' 'seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[0], text) if changes == 0: # We tried to fix edit-protection templates, but it did not work. pywikibot.warning('No edit-protection template could be found') if moveBlockCheck and changes > -1: # checking move protection now try: moveRestr = restrictions['move'] except KeyError: moveRestr = False changes = -1 if not moveRestr: pywikibot.output('The page is movable for all, deleting the ' 'template...') # Deleting the template because the page doesn't need it. if TU: replaceToPerform = '|'.join(TSMP + TTMP + TU) else: replaceToPerform = '|'.join(TSMP + TTMP) text, changes = re.subn( '<noinclude>(%s)</noinclude>' % replaceToPerform, '', text) if changes == 0: text, changes = re.subn('({})'.format(replaceToPerform), '', text) elif moveRestr[0] == 'sysop': # move-total-protection if (TemplateInThePage[0] == 'sysop-move' and TTMP) or \ (TemplateInThePage[0] == 'unique' and TU): pywikibot.output('The page is protected from moving to ' 'the sysop, skipping...') if TU: # no changes needed, better to revert the old text. text = oldtext else: pywikibot.output('The page is protected from moving to ' 'the sysop, but the template seems not ' 'correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[3], text) elif TSMP or TU: # implicitly moveRestr[0] = 'autoconfirmed', # move-semi-protection if TemplateInThePage[0] == 'autoconfirmed-move' or \ TemplateInThePage[0] == 'unique': pywikibot.output('The page is movable only for the ' 'autoconfirmed users, skipping...') if TU: # no changes needed, better to revert the old text. text = oldtext else: pywikibot.output('The page is movable only for the ' 'autoconfirmed users, but the template ' 'seems not correct. Fixing...') if TU: text, changes = re.subn(TemplateInThePage[1], TNR[4], text) else: text, changes = re.subn(TemplateInThePage[1], TNR[2], text) if changes == 0: # We tried to fix move-protection templates but it did not work pywikibot.warning('No move-protection template could be found') if oldtext != text: # Ok, asking if the change has to be performed and do it if yes. pywikibot.output( color_format('\n\n>>> {lightpurple}{0}{default} <<<', page.title())) pywikibot.showDiff(oldtext, text) if not always: choice = pywikibot.input_choice( 'Do you want to accept these ' 'changes?', [('Yes', 'y'), ('No', 'n'), ('All', 'a')], 'n') if choice == 'a': always = True if always or choice == 'y': save_page(page, text, commentUsed)
def main(*args): """Process command line arguments and invoke bot.""" always = False category = '' delete_after_done = False # Load a lot of default generators local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-always': always = True elif arg.startswith('-setcat:'): category = arg[len('-setcat:'):] elif arg == '-delete': delete_after_done = True else: genFactory.handleArg(arg) pregenerator = genFactory.getCombinedGenerator(preload=True) if not pregenerator: pywikibot.bot.suggest_help(missing_generator=True) return load_global_archivo() for page in pregenerator: if not page.exists() or page.namespace() != 6 or page.isRedirectPage(): continue imagepage = pywikibot.FilePage(page.site, page.title()) # First do autoskip. if doiskip(imagepage.get()): pywikibot.output('Skipping ' + page.title()) continue # The first upload is last in the list. try: username = imagepage.latest_file_info.user except NotImplementedError: # No API, using the page file instead (datetime, username, resolution, size, comment) = imagepage.get_file_history().pop() skip = False if always: newname = imagepage.title(with_ns=False) CommonsPage = pywikibot.Page(pywikibot.Site('commons', 'commons'), 'File:' + newname) if CommonsPage.exists(): continue else: while True: # Do TkdialogIC to accept/reject and change the name newname, skip = TkdialogIC( imagepage.title(with_ns=False), imagepage.get(), username, imagepage.permalink(with_protocol=True), imagepage.templates()).getnewname() if skip: pywikibot.output('Skipping this image') break # Did we enter a new name? if not newname: # Take the old name newname = imagepage.title(with_ns=False) else: newname = newname.decode('utf-8') # Check if the image already exists CommonsPage = pywikibot.Page(imagepage.site.image_repository(), 'File:' + newname) if not CommonsPage.exists(): break pywikibot.output('Image already exists, pick another name or ' 'skip this image') # We don't overwrite images, pick another name, go to # the start of the loop if not skip: imageTransfer(imagepage, newname, category, delete_after_done).start() pywikibot.output('Still ' + str(threading.activeCount()) + ' active threads, lets wait') for openthread in threading.enumerate(): if openthread != threading.currentThread(): openthread.join() pywikibot.output('All threads are done')
def main(*args): """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: list of unicode """ gen = None xmlFilename = None HTTPignore = [] if isinstance(memento_client, ImportError): warn('memento_client not imported: %s' % memento_client, ImportWarning) # Process global args and prepare generator args parser local_args = pywikibot.handle_args(args) genFactory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-talk': config.report_dead_links_on_talk = True elif arg == '-notalk': config.report_dead_links_on_talk = False elif arg == '-repeat': gen = RepeatPageGenerator() elif arg.startswith('-ignore:'): HTTPignore.append(int(arg[8:])) elif arg.startswith('-day:'): config.weblink_dead_days = int(arg[5:]) elif arg.startswith('-xmlstart'): if len(arg) == 9: xmlStart = pywikibot.input( u'Please enter the dumped article to start with:') else: xmlStart = arg[10:] elif arg.startswith('-xml'): if len(arg) == 4: xmlFilename = i18n.input('pywikibot-enter-xml-filename') else: xmlFilename = arg[5:] else: genFactory.handleArg(arg) if xmlFilename: try: xmlStart except NameError: xmlStart = None gen = XmlDumpPageGenerator(xmlFilename, xmlStart, genFactory.namespaces) if not gen: gen = genFactory.getCombinedGenerator() if gen: if not genFactory.nopreload: # fetch at least 240 pages simultaneously from the wiki, but more # if a high thread number is set. pageNumber = max(240, config.max_external_links * 2) gen = pagegenerators.PreloadingGenerator(gen, groupsize=pageNumber) gen = pagegenerators.RedirectFilterPageGenerator(gen) bot = WeblinkCheckerRobot(gen, HTTPignore, config.weblink_dead_days) try: bot.run() finally: waitTime = 0 # Don't wait longer than 30 seconds for threads to finish. while countLinkCheckThreads() > 0 and waitTime < 30: try: pywikibot.output(u"Waiting for remaining %i threads to " u"finish, please wait..." % countLinkCheckThreads()) # wait 1 second time.sleep(1) waitTime += 1 except KeyboardInterrupt: pywikibot.output(u'Interrupted.') break if countLinkCheckThreads() > 0: pywikibot.output(u'Remaining %i threads will be killed.' % countLinkCheckThreads()) # Threads will die automatically because they are daemonic. if bot.history.reportThread: bot.history.reportThread.shutdown() # wait until the report thread is shut down; the user can # interrupt it by pressing CTRL-C. try: while bot.history.reportThread.isAlive(): time.sleep(0.1) except KeyboardInterrupt: pywikibot.output(u'Report thread interrupted.') bot.history.reportThread.kill() pywikibot.output(u'Saving history...') bot.history.save() return True else: pywikibot.bot.suggest_help(missing_generator=True) return False
def main(*args) -> None: """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. @param args: command line arguments @type args: str """ page_name = '' summary = None options = {} # read command line parameters local_args = pywikibot.handle_args(args) gen_factory = pagegenerators.GeneratorFactory() mysite = pywikibot.Site() for arg in local_args: if arg == '-always': options['always'] = True elif arg.startswith('-summary'): if len(arg) == len('-summary'): summary = pywikibot.input('Enter a reason for the deletion:') else: summary = arg[len('-summary:'):] elif arg.startswith('-images'): warn('-image option is deprecated. Please use -imageused instead.', exceptions.ArgumentDeprecationWarning) local_args.append('-imageused' + arg[7:]) elif arg.startswith('-undelete'): options['undelete'] = True elif arg.startswith('-isorphan'): options['isorphan'] = int(arg[10:]) if arg[10:] != '' else 0 if options['isorphan'] < 0: options['isorphan'] = False elif arg.startswith('-orphansonly'): if arg[13:]: namespaces = mysite.namespaces.resolve(arg[13:].split(',')) else: namespaces = mysite.namespaces options['orphansonly'] = namespaces else: gen_factory.handleArg(arg) found = arg.find(':') + 1 if found: page_name = arg[found:] if not summary: un = 'un' if 'undelete' in options else '' if page_name: if arg.startswith(('-cat', '-subcats')): summary = i18n.twtranslate(mysite, 'delete-from-category', {'page': page_name}) elif arg.startswith('-links'): summary = i18n.twtranslate(mysite, un + 'delete-linked-pages', {'page': page_name}) elif arg.startswith('-ref'): summary = i18n.twtranslate(mysite, 'delete-referring-pages', {'page': page_name}) elif arg.startswith('-imageused'): summary = i18n.twtranslate(mysite, un + 'delete-images', {'page': page_name}) elif arg.startswith('-file'): summary = i18n.twtranslate(mysite, un + 'delete-from-file') generator = gen_factory.getCombinedGenerator() # We are just deleting pages, so we have no need of using a preloading # page generator to actually get the text of those pages. if generator: if summary is None: summary = pywikibot.input( 'Enter a reason for the {}deletion:'.format( ['', 'un'][options.get('undelete', False)])) bot = DeletionRobot(generator, summary, **options) bot.run() else: pywikibot.bot.suggest_help(missing_generator=True)
def main(*args: str) -> None: """ Process command line arguments and invoke bot. If args is an empty list, sys.argv is used. :param args: command line arguments """ template_names = [] templates = {} options = {} # If xmlfilename is None, references will be loaded from the live wiki. xmlfilename = None user = None skip = False timestamp = None # read command line parameters local_args = pywikibot.handle_args(args) site = pywikibot.Site() gen_factory = pagegenerators.GeneratorFactory() for arg in local_args: if arg == '-remove': options['remove'] = True elif arg.startswith('-subst'): options['subst'] = arg[len('-subst:'):] + 'subst' assert options['subst'] in ('subst', 'safesubst') elif arg == '-assubst': options['subst'] = 'subst' options['remove'] = True elif arg == '-always': options['always'] = True elif arg.startswith('-xml'): if len(arg) == 4: xmlfilename = pywikibot.input( "Please enter the XML dump's filename: ") else: xmlfilename = arg[5:] elif arg.startswith('-addcat:'): options['addcat'] = arg[len('-addcat:'):] elif arg.startswith('-summary:'): options['summary'] = arg[len('-summary:'):] elif arg.startswith('-onlyuser:'******'-onlyuser:'******'-skipuser:'******'-skipuser:'******'-timestamp:'): timestamp = arg[len('-timestamp:'):] else: if not gen_factory.handle_arg(arg): template_name = pywikibot.Page(site, arg, ns=10) template_names.append(template_name.title(with_ns=False)) if not template_names: pywikibot.bot.suggest_help(missing_parameters=['templates']) return if bool(options.get('subst', False)) ^ options.get('remove', False): for template_name in template_names: templates[template_name] = None else: try: for i in range(0, len(template_names), 2): templates[template_names[i]] = template_names[i + 1] except IndexError: pywikibot.output('Unless using solely -subst or -remove, ' 'you must give an even number of template names.') return old_templates = [ pywikibot.Page(site, template_name, ns=10) for template_name in templates ] if xmlfilename: builder = textlib.MultiTemplateMatchBuilder(site) predicate = builder.search_any_predicate(old_templates) gen = XMLDumpPageGenerator(xmlfilename, site=site, text_predicate=predicate) else: gen = gen_factory.getCombinedGenerator() if not gen: gens = (t.getReferences(only_template_inclusion=True, follow_redirects=False) for t in old_templates) gen = roundrobin_generators(*gens) gen = filter_unique(gen, key=lambda p: '{}:{}:{}'.format(*p._cmpkey())) if user: gen = pagegenerators.UserEditFilterGenerator(gen, user, timestamp, skip, max_revision_depth=100, show_filtered=True) if not gen_factory.gens: # make sure that proper namespace filtering etc. is handled gen = gen_factory.getCombinedGenerator(gen) if not gen_factory.nopreload: gen = pagegenerators.PreloadingGenerator(gen) bot = TemplateRobot(gen, templates, site=site, **options) bot.run()