User:Lowercase sigmabot II/Source.py: Difference between revisions

Content deleted Content added
Updating source) (bot
m Replaced deprecated <source> tags with <syntaxhighlight>
 
(37 intermediate revisions by 5 users not shown)
Line 1:
Source as of 09:37, 28 December 2014 (UTC).
 
Source as of 01:33, 3 May 2012 (UTC).
 
== Sandbot1.py ==
Line 18 ⟶ 17:
If the template is present, it does nothing.
 
<sourcesyntaxhighlight lang="python">
#!/usrhome/sigma/.local/bin/pythonpython3
# -*- coding: utf-8 -*-
# LGPLv2+ license, look it up
 
"""
This sandbot reinserts the sandbox header every 60 seconds.
"""
 
from wikibot import WikiBot
import sys
import os
import builtins
 
import ceterach
def revision_user(page):
import passwords
query = {"action":"query", "prop":"revisions", "titles":page, "rvprop":"user"}
res = api.call(query)["query"]["pages"]
pageid = res.keys()[0]
return res[pageid]["revisions"][0]["user"]
 
import mwparserfromhell as mwparser
def templates_on_page(page):
query = {"action":"query", "prop":"templates", "tllimit":500, "tlnamespace":10, "titles":page}
res = api.call(query)["query"]["pages"]
pageid = res.keys()[0]
for template in res[pageid]["templates"]:
yield template
 
builtins.print = lambda *args, **kwargs: None
def heading_is_gone(box):
templates_on_sandbox = templates_on_page(box)
if "Template:Sandbox heading" not in templates_on_sandbox:
return True
return False
 
def runmain():
global api
for sandbox in sandboxes:
api = ceterach.api.MediaWiki("https://en.wikipedia.org/w/api.php")
if revision_user(sandbox) == "Lowercase sigmabot II":
api.login("Lowercase sigmabot II", passwords.lcsb2)
continue
api.set_token("edit")
elif heading_is_gone(sandbox):
bot = SandBot1(api)
api.prepend(sandbox, reinsert, summary="Reinserting sandbox header", minor=False, bot=True, force=True)
bot.run()
print sandbox, "had a heading reinserted"
 
class SandBot1:
user = "Lowercase sigmabot II"
REINSERT = "{{Please leave this line alone (SB)}}\n\n"
pw_file = open(os.path.expanduser("~/wikibot/password.txt"), "r")
SANDBOXES = {"Wikipedia:Sandbox",
pw = pw_file.read().replace("\n", ""); pw_file.close(); del pw_file;
"Wikipedia:Tutorial/Editing/sandbox",
api = WikiBot("http://en.wikipedia.org/w/api.php")
"Wikipedia:Tutorial/Formatting/sandbox",
api.login(user, pw)
"Wikipedia:Tutorial/Wikipedia links/sandbox",
api.set_all()
"Wikipedia:Tutorial/Citing sources/sandbox",
reinsert = "{{Sandbox heading}} <!-- Please leave this line alone! -->\n\n"
sandboxes = ("Wikipedia:Sandbox", "Wikipedia:Tutorial/Editing/sandbox", "Wikipedia:Tutorial/Formatting/sandbox", "Wikipedia:Tutorial/Wikipedia links/sandbox", "Wikipedia:Tutorial/Citing sources/sandbox", "Wikipedia:Tutorial/Keep in mind/sandbox")
}
templates = ("Template:Please leave this line alone (sandbox talk heading)", "Template:Please leave this line alone (Sandbox heading)", "Template:Sandbox heading/noedit", "Template:Please leave this line alone (sandbox talk heading)/noedit", "Template:Sandbox header (do not remove)", "Template:PLTLA (SH)", "Template:Please leave this line alone (sandbox heading)", "Template:Please leave this line alone (sandbox heading)/noedit")
TEMPLATES = {"Template:Please leave this line alone (Sandbox heading)",
run()
"Template:Sandbox heading/noedit",
api.logout()
"Template:Sandbox header (do not remove)",
"Template:PLTLA (SH)",
"Template:Please leave this line alone (sandbox heading)",
"Template:Sandbox heading"
}
 
def __init__(self, api, shutoff="User:Lowercase sigmabot II/Shutoff"):
</source>
self.api = api
self.shutoff_page = api.page(shutoff)
 
@property
def is_allowed(self):
return self.shutoff_page.content.lower() == "true" #or True
 
def check_if_heading_is_gone(self, box):
tl = self.api.iterator(500, prop="templates", tlnamespace=10, tllimit=500, titles=box.title)
res = {x['title'] for x in next(tl).get("templates", "")}
return not res & self.TEMPLATES
 
def run(self):
if not self.is_allowed:
return
for sandbox in self.SANDBOXES:
box = self.api.page(sandbox)
if box.revision_user.name == "Lowercase sigmabot II":
continue
if self.check_if_heading_is_gone(box):
box.prepend(self.REINSERT, summary="Reinserting sandbox header) (bot", bot=True)
print("\thad a header reinserted!")
 
if __name__ == "__main__":
main()
 
</syntaxhighlight>
 
== Sandbot2.py ==
Line 82 ⟶ 98:
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■--></pre>
 
<sourcesyntaxhighlight lang="python">
#!/usrhome/sigma/.local/bin/pythonpython3
# -*- coding: utf-8 -*-
# LGPLv2+ license, look it up
 
from wikibot import WikiBot
from datetime import datetime, timedelta
from threading import Thread
import time
import sys
import os
import sys
import pickle
import threading
 
import arrow
user = "Lowercase sigmabot II"
 
pwfile = open(os.path.expanduser("~/wikibot/password.txt"), "r")
import ceterach
pw = pwfile.read().replace("\n", ""); pwfile.close(); del pwfile;
import passwords
api = WikiBot("http://en.wikipedia.org/w/api.php")
 
api.login(user, pw)
reset_text = "{{subst:Sandbox reset}}"
api.set_all()
reset_texttpl_reset_text = """{{Pleasesubst:Template leave this line alone (sandbox heading)reset}}<!--"
* Welcome to the sandbox! *
def main():
* Please leave this part alone *
global api
* The page is cleared regularly *
api = ceterach.api.MediaWiki("https://en.wikipedia.org/w/api.php")
* Feel free to try your editing skills below *
with open("opener.pkl", 'rb') as fp:
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-->
api.opener = pickle.load(fp)
"""
bot = SandBot2(api)
bot.run()
 
class SandBot2:
SANDBOXES = ("Wikipedia:Sandbox",
"Wikipedia:Tutorial/Editing/sandbox",
"Wikipedia:Tutorial/Formatting/sandbox",
"Wikipedia:Tutorial/Wikipedia links/sandbox",
"Wikipedia:Tutorial/Citing sources/sandbox",
"Wikipedia:Tutorial/Keep in mind/sandbox"
)
SANDBOXES = {"Wikipedia:Sandbox",
"Wikipedia:Tutorial/Editing/sandbox",
"Wikipedia:Tutorial/Formatting/sandbox",
"Wikipedia:Tutorial/Wikipedia links/sandbox",
"Wikipedia:Tutorial/Citing sources/sandbox",
"Wikipedia:Tutorial/Keep in mind/sandbox",
"Wikipedia talk:Sandbox",
"Wikipedia talk:Tutorial/Editing/sandbox",
"Wikipedia talk:Tutorial/Formatting/sandbox",
"Wikipedia talk:Tutorial/Wikipedia links/sandbox",
"Wikipedia talk:Tutorial/Citing sources/sandbox",
"Wikipedia talk:Tutorial/Keep in mind/sandbox",
"User:Sandbox",
"Template:Template sandbox",
}
 
def __init__(self, api, shutoff="User:Lowercase sigmabot II/Shutoff"):
threads_exist = 0
self.api = api
sandboxes = ("Wikipedia:Sandbox", "Wikipedia:Tutorial/Editing/sandbox", "Wikipedia:Tutorial/Formatting/sandbox", "Wikipedia:Tutorial/Wikipedia links/sandbox", "Wikipedia:Tutorial/Citing sources/sandbox", "Wikipedia:Tutorial/Keep in mind/sandbox")
self.shutoff_page = api.page(shutoff)
 
@property
def should_be_reset(box):
def is_allowed(self):
curtime = datetime.utcnow()
return self.shutoff_page.content.lower() == "true"
three_min = timedelta(seconds=180)
query = api.call({"action":"query", "prop":"revisions", "titles":box, "rvprop":"timestamp"})["query"]["pages"]
pageid = query.keys()[0]
box_stamp = api.parse_date(query[pageid]["revisions"][0]["timestamp"])
if box_stamp < curtime - three_min:
return True
return False
 
def revision_userwait(pageself, box):
for __ in range(3):
query = {"action":"query", "prop":"revisions", "titles":page, "rvprop":"user"}
# Sleep for 3 minutes
res = api.call(query)["query"]["pages"]
print("3 minute sleep on {!r}".format(box.title))
pageid = res.keys()[0]
time.sleep(60 * 3)
return res[pageid]["revisions"][0]["user"]
if self.box_needs_reset(box):
break
# After the bot sleeps on this box for 9 minutes, it
# will clear the box regardless.
print("Done with sleeping, clearing {!r}".format(box.title))
self.api.login("Lowercase sigmabot II", passwords.lcsb2)
self.api.set_token("edit")
text = tpl_reset_text if box.namespace == 10 else reset_text
box.edit(text, "Clearing sandbox) (bot", bot=True, force=True)
 
def sandbox_waitparse_date(boxself, date):
return arrow.Arrow.strptime(date, '%Y-%m-%dT%H:%M:%SZ')
for blah in xrange(3):
time.sleep(60*3)
if should_be_reset(box):
break
# After it sleeps for 9 minutes without clearing the sandbox, it will be cleared regardless.
api.edit(box, reset_text, "Clearing sandbox) (bot", True, True, force=True)
return None
 
def box_needs_reset(self, box):
for sandbox in sandboxes:
now = arrow.utcnow()
if revision_user(sandbox) == "Lowercase sigmabot II":
three_min = arrow.util.timedelta(seconds=60 * 3)
continue
# there's probably a way to use MediaWiki.iterator(), but too lazy
elif should_be_reset(sandbox):
res = self.api.call(action="query", prop="revisions", titles=box.title, rvprop="timestamp", limit="2")
api.edit(sandbox, reset_text, "Clearing sandbox) (bot", True, True, force=True)
str_stamp = next(iter(res["query"]["pages"].values()))["revisions"][0]["timestamp"]
else:
threads_existbox_stamp = 1self.parse_date(str_stamp)
if box_stamp < (now - three_min):
Thread(target=sandbox_wait, args=sandbox).start()
return True
return False
 
def run(self):
if threads_exist == 1:
if not self.is_allowed:
print "Threads exist"
print("Check the shutoff page")
else:
api.logout() return
for sandbox in self.SANDBOXES:
</source>
box = self.api.page(sandbox)
if box.revision_user.name in ("Lowercase sigmabot II", "Hazard-Bot") or\
box.content == reset_text:
continue
if self.box_needs_reset(box):
print("Clearing {!r}".format(sandbox))
print(box.edit(reset_text, "Clearing sandbox) (bot", bot=True, force=True))
else:
# The bot will fork, and continue on to the next sandbox
# while the child process waits 3 to 9 minutes
# if os.fork() == 0: # Child process
# self.wait(box) # Wait takes place in the child process
# os._exit(0) # Exit the child process
threading.Thread(target=self.wait, args=(box,)).start()
 
if __name__ == "__main__":
== wikibot.py ==
main()
 
</syntaxhighlight>
The framework is located at [[user:lowercase sigmabot/Source.py]]. It requires the 'pycountry', 'BeautifulSoup', 'kitchen' and 'simplemediawiki' python modules to run.