User:EdwardsBot/Configuration
Appearance
From Wikipedia, the free encyclopedia
deliverybot-2.py
[edit ]#! /usr/bin/env python # Public domain; MZMcBride, bjweeks; 2011 importcodecs importos importre importtime importwikitools importsettings # Define variables directory = settings.directory username = settings.username user_namespace = settings.user_namespace access_list = user_namespace + ':' + username + '/' + settings.access_list log = user_namespace + ':' + username + '/' + settings.log status_page = user_namespace + ':' + username + '/' + settings.status spam = user_namespace + ':' + username + '/' + settings.spam wiki = wikitools.Wiki(settings.apiurl); wiki.setMaxlag(-1) # Functions to do various tasks deflog_in(): wiki.login(settings.username, settings.password) return defkill_self(): os._exit(0) defcheck_status(page): status_page_obj = wikitools.Page(wiki, status_page, followRedir=False) return status_page_obj.getWikiText().lower() defchange_status(status_message): status_page_obj = wikitools.Page(wiki, status_page, followRedir=False) status_page_obj.edit(status_message, summary='[[WP:BOT|Bot]]: Updated status.', bot=1) log.write('will edit with content: %s\n' % status_message) return deftop_user(wiki, page): params = {'action' : 'query', 'prop' : 'revisions', 'rvprop' : 'user', 'titles' : page} req = wikitools.api.APIRequest(wiki, params) response = req.query() latest_editor = response[u'query'][u'pages'].popitem()[1][u'revisions'][0][u'user'] return latest_editor deftrusted_users(wiki, page): trusted_users = [] params = {'action' : 'query', 'prop' : 'links', 'titles' : page, 'pllimit' : 500, 'plnamespace' : 2} req = wikitools.api.APIRequest(wiki, params) response = req.query() users = response[u'query'][u'pages'].popitem()[1][u'links'] for entry in users: trusted_users.append(entry[u'title'].split(':', 1)[1]) return trusted_users defexcluded_users(wiki, username): excluded_users = [] params = {'action' : 'query', 'prop' : 'links', 'titles' : '|'.join(['Wikipedia:Bots/Opt-out', 'Wikipedia:Bots/Opt-out/%s' % username]), 'pllimit' : 500, 'plnamespace' : 2} req = wikitools.api.APIRequest(wiki, params) response = req.query() pages = response[u'query'][u'pages'] for k,v in pages.iteritems(): try: users = v[u'links'] for entry in users: excluded_users.append(entry[u'title'].split(':', 1)[1]) except KeyError: pass return excluded_users defretrieve_config(page): spam_page = wikitools.Page(wiki, spam, followRedir=False) spam_page_text = spam_page.getWikiText() spam_page_text_parts = re.search(r'''\<source lang="text" enclose="div"> # KEY(.+) # RECIPIENTS \(PAGE LIST\)(.+) # SUBJECT(.+) # BODY(.+) </source>''', spam_page_text, re.I|re.U|re.M|re.DOTALL) return { 'key': spam_page_text_parts.group(1), 'recip_page': spam_page_text_parts.group(2), 'subject': spam_page_text_parts.group(3), 'body': spam_page_text_parts.group(4) } defread_keys(): f = open(directory+'deliverybot-keys.txt', 'r') keys = f.read().strip('\n').split('\n') f.close() return list(keys) defadd_key(key): f = open(directory+'deliverybot-keys.txt', 'a') f.write('%s\n' % key) f.close() return defpage_list_targets(wiki, full_page_title): page_list_targets = set() params = {'action' : 'query', 'prop' : 'links', 'titles' : full_page_title, 'pllimit' : 500, 'plnamespace' : '2|3'} req = wikitools.api.APIRequest(wiki, params) response = req.query() users = response[u'query'][u'pages'].popitem()[1][u'links'] for entry in users: page_list_targets.add(entry[u'title'].split(':', 1)[1]) return page_list_targets defedit_talk_page(user_talk): global excluded_users user_talk = wikitools.Page(wiki, 'User talk:%s' % target, followRedir=True) try: page_text = user_talk.getWikiText() except: page_text = '' try: if target in excluded_users: log.write('Excluded user: %s\n' % target) elif not re.search(r'(<!-- %s%s -->)' % (username, current_key), page_text, re.I|re.U): user_talk.edit(text=body_text_final, summary=subject_line, section='new', bot=1, skipmd5=True) log.write('Edited: %s\n' % target) else: log.write('Skipped: %s\n' % target) except: time.sleep(2) try: try: page_text = user_talk.getWikiText() except: page_text = '' if target in excluded_users: log.write('Excluded user: %s\n' % target) elif not re.search(r'(<!-- %s%s -->)' % (username, current_key), page_text, re.I|re.U): user_talk.edit(text=body_text_final, summary=subject_line, section='new', bot=1, skipmd5=True) log.write('Edited: %s\n' % target) else: log.write('Skipped: %s\n' % target) except: log.write('WTF1 %s\n' % target) pass log.write('WTF2 %s\n' % target) pass return defstrip_cruft(str): str = re.sub(r'^(\s|\n)*', '', str) str = re.sub(r'(\s|\n)*$', '', str) return str # Start actually doing something status = check_status(status_page) log = codecs.open(directory+'deliverybot-log.txt', 'a', 'utf-8') if status in ('start', 'run', 'really start', 'restart'): log_in() top_user = top_user(wiki, spam) trusted_users = trusted_users(wiki, access_list) excluded_users = excluded_users(wiki, username) old_keys = read_keys() configuration = retrieve_config(spam) current_key = strip_cruft(configuration['key']) input_page = strip_cruft(configuration['recip_page']) subject_line = strip_cruft(configuration['subject']) body_text = strip_cruft(configuration['body']) body_text_final = body_text + '\n<!-- %s%s -->' % (username, current_key) log.write('status is fine, let\'s edit\n') if top_user in trusted_users: log.write('auth is fine, let\'s edit\n') if current_key not in old_keys or status in ('really start', 'restart'): log.write('key is fine, let\'s edit\n') if len(subject_line) > 245: log.write('subject line is too large, edit status page indicating so and die\n') change_status('Error: Subject line is too long') kill_self() else: if input_page != '': log.write('use the page list\n') change_status('Running') for target in page_list_targets(wiki, input_page): # Edit here! edit_talk_page(target) add_key(current_key) change_status('Completed run successfully') else: log.write('key is old, edit status page to indicate such and die\n') change_status('Error: Key is invalid') kill_self() else: log.write('user not authorized to use bot; edit status page to indicate such and die\n') change_status('Error: User [[%s|not authorized]] to use bot' % access_list) kill_self() log.close()
crontab
[edit ]0,5,10,15,20,25,30,35,40,45,50,55 * * * * PYTHONPATH=$HOME/scripts python $HOME/scripts/deliverybot/deliverybot-2.py