User:RonBot/1/Source1
from wikitools import *
import time
import datetime
import urllib
import json
import userpassbot #Bot password
import warnings
import re
import mwparserfromhell
import datetime
site = wiki.Wiki() #Tell Python to use the English Wikipedia's API
site.login(userpassbot.username, userpassbot.password) #login
#routine to autoswitch some of the output - as filenames in, say, filep.unprefixedtitle have accented chars!
def pnt(s):
try:
print(s)
except UnicodeEncodeError:
print(s.encode('utf-8'))
#Find pages to delete
def findpages():
#parameters for API request
params = {'action':'query',
'list':'categorymembers',
#'cmtitle':'Category:RonBotTest',
'cmtitle':'Category:Non-free files with orphaned versions more than 7 days old',
'cmlimit':'max'
}
print "findpages.params"
req = api.APIRequest(site, params) #Set the API request
print "findpages.req"
res = req.query(False) #Send the API request and store the result in res
print "findpages.res",res
touse = pagelist.listFromQuery(site, res['query']['categorymembers']) #Make a list
print "findpages.touse"
return touse
def versiontodelete(page):
params = {'action':'query',
'prop':'imageinfo',
'titles':page.unprefixedtitle,
'iiprop':'archivename',
'iilimit':'max',
'formatversion':'2',
}
print "versiontodelete.params"
req = api.APIRequest(site, params)
print "versiontodelete.req"
res = req.query(False)
print "versiontodelete.res"
whattodel = res['query']['pages'][0]['imageinfo'][1:] #Go into specifics, ignore first result (DatBot's reduced version)
print "versiontodelete.whattodel", whattodel
for result in whattodel:
print "versiontodelete.for loop", result
if 'filehidden' in result:
print "versiontodelete.for loop delete", result
del result ['filehidden'] #Remove any "filehidden" results param1
del result ['archivename'] #Remove any "filehidden" results param2
whattodel = filter(None, whattodel) # Remove empty results
print "versiontodelete.whattodel2", whattodel
return whattodel
def deletefile(page, version, token):
params = {'action':'revisiondelete',
'target':page.unprefixedtitle,
'type':'oldimage',
'hide':'content',
'ids':version,
'token':token,
'reason':'Orphaned non-free file revision(s) deleted per [[WP:F5|F5]] ([[User:RonBot/1/Run|disable]])'
}
print "deletefile.params"
print "page.unprefixedtitle"#,page.unprefixedtitle
print "version", version
print "token", token
api.APIRequest(site, params).query() #Actually delete it (DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
print "deletefile.finish"
return #Stop the function, ready for the next
def abusechecks(page):
params = {'action':'query',
'prop':'revisions',
'titles':page.unprefixedtitle,
'rvlimit':'10'
}
print "abusechecks.params"
req = api.APIRequest(site, params)
print "abusechecks.req"
res = req.query(False)
print "abusechecks.res"
pageid = res['query']['pages'].keys()[0]
print "abusechecks.pageid"
timestamp = res['query']['pages'][pageid]['revisions'][1]['timestamp']
print "abusechecks.timestamp"
comment = res['query']['pages'][pageid]['revisions'][1]['comment']
print "abusechecks.comment"
pnt(comment)
if 'uploaded a new version of' in comment:
print "abusechecks.if"
timestamp = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%SZ')
print "abusechecks.timestamp2", "*";datetime.datetime.utcnow();"*", "*";timestamp;"*"
print
if timestamp < datetime.datetime.utcnow()-datetime.timedelta(days=7):
print 'abusereturn yes'
return "Yes"
else:
print 'abusereturn no 1'
print timestamp
print datetime.datetime.utcnow()
print datetime.datetime.utcnow()-datetime.timedelta(days=7)
return "No"
else:
print 'abusereturn no 2'
return "No"
def checksize(page):
params = {'action':'query',
'prop':'imageinfo',
'titles':page.unprefixedtitle,
'formatversion':'2',
'iiprop':'size'
}
print "checksize.params"
req = api.APIRequest(site, params)
print "checksize.req"
res = req.query(False)
print "checksize.res"
print res
print "width = ",res['query']['pages'][0]['imageinfo'][0]['width']
print "height = ",res['query']['pages'][0]['imageinfo'][0]['height']
pixel = res['query']['pages'][0]['imageinfo'][0]['width'] * res['query']['pages'][0]['imageinfo'][0]['height']
print pixel
if pixel > 105000:
#if (res['query']['pages'][0]['imageinfo'][0]['width'] > 400) and (res['query']['pages'][0]['imageinfo'][0]['height'] > 400):
print 'chacksize manual'
return "Manual"
else:
return True
def addmanual(pagetext): #Just makes it a bit shorter
print "addmanual"
pnt (pagetext)
print "SUB1"
pagetext = re.sub(r'[Nn]on-free reduced', 'Orphaned non-free revisions', pagetext)
pnt (pagetext)
print "SUB2"
pagetext = re.sub(r'(?P<Main>\{\{(?:[Oo]rphaned non-free revisions|[Nn]on-free reduced).*?(?=}}))', r'\g<Main>|human=yes', pagetext)
pnt (pagetext)
print "SUBEND"
return pagetext
def main():
tobreak = "no"
pages = findpages()
print "main.pages"
for filep in pages: #For page in the list
print "main.for filp"
#print(filep.unprefixedtitle)
if tobreak == "yes":
break
try: #Try to delete the old revision(s)
if filep.unprefixedtitle == "Category:Non-free files with orphaned versions more than 7 days old needing human review": #Skip category thing
continue
todelete = versiontodelete(filep)
print "main.todelete"
firstversion="yes"
print todelete
for version in todelete:
print version
version = re.sub(r'([^!]*)!.*', r'\1', version['archivename'])
print version
print "main.for version"
go = startAllowed() #Check if task is enabled
if go == "no":
tobreak = "yes"
print tobreak
break
if firstversion == "yes":
pagepage = page.Page(site, filep.unprefixedtitle) #Hacky workaround since File and Page are different types in the module
print "main.pagepage"
pagetext = pagepage.getWikiText()
#Stop if there's nobots
allow_bots(pagetext, "RonBot")
print "main.allowbots"
skipcategories = page.Page(site, 'User:RonBot/1/FreeCategory').getWikiText().split("|")
check = abusechecks(filep) #Check if file was uploaded 2 days ago
if any(skipcategory in pagepage.getCategories() for skipcategory in skipcategories):
print "One of the potentially free categories were found. Skipping."
check="No"
print "main.check",check
print pagetext.find('|human=yes')
if pagetext.find('|human=yes')>0:
print 'Manual already set - no more to do'
break
if check == "No":
print 'handle check=no'
pagetext = addmanual(pagetext)
print "main.no.pagetext", pagetext
pagepage.edit(text=pagetext, bot=True, summary="(Task 1) Requesting manual review ([[User:RonBot/1/Run|disable]])") #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
break #- leave for loop as we only want one entry - there may be multple versions to delete
if checksize(filep) == "Manual":
print 'handle checksize manual'
pagetext = addmanual(pagetext)
print "main.manual.pagetext", pagetext
pagepage.edit(text=pagetext, bot=True, summary="(Task 1) Requesting manual review ([[User:RonBot/1/Run|disable]])") #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
break #- leave for loop as we only want one entry - there may be multple versions to delete
#Get a token
params = { 'action':'query', 'meta':'tokens' }
print "main.params"
token = api.APIRequest(site, params).query()['query']['tokens']['csrftoken']
print "main.token", token
#Delete the revision
deletefile(filep, version, token)
print "main.deletefile"
#Remove tag
pagetext = re.sub(r'\n*\{\{(?:[Oo]rphaned non-free revisions|[Nn]on-free reduced).*}}', '', pagetext)
pagetext=pagetext.lstrip()
print "main.pagetext"
pagepage.edit(text=pagetext, bot=True, summary="(Task 1) Orphaned non-free file(s) deleted per [[WP:F5|F5]] ([[User:RonBot/1/Run|disable]])") #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
pnt ("Done for %s" % filep.unprefixedtitle) #For debugging
print
firstversion="no"
else:
pagepage = page.Page(site, filep.unprefixedtitle) #Hacky workaround since File and Page are different types in the module
print "main.pagepage"
pagetext = pagepage.getWikiText()
pagetext = re.sub(r'\n*\{\{(?:[Oo]rphaned non-free revisions|[Nn]on-free reduced).*}}', '', pagetext)
pagetext=pagetext.lstrip()
print "main.pagetext"
pagepage.edit(text=pagetext, bot=True, summary="(Task 1) Remove banner - nothing to delete ([[User:RonBot/1/Run|disable]])") #(DO NOT UNCOMMENT UNTIL BOT IS APPROVED)
except Exception as e: #If there's an error, ignore the file
print e
pass
def startAllowed():
textpage = page.Page(site, "User:RonBot/1/Run").getWikiText()
if textpage == "Run":
return "run"
else:
return "no"
def allow_bots(pagetext, username):
user = username.lower().strip()
text = mwparserfromhell.parse(pagetext)
for tl in text.filter_templates():
if tl.name in ('bots', 'nobots'):
break
else:
return True
for param in tl.params:
bots = [x.lower().strip() for x in param.value.split(",")]
if param.name == 'allow':
if ''.join(bots) == 'none': return False
for bot in bots:
if bot in (user, 'all'):
return True
elif param.name == 'deny':
if ''.join(bots) == 'none': return True
for bot in bots:
if bot in (user, 'all'):
return False
return True
if __name__ == "__main__":
with warnings.catch_warnings():
warnings.simplefilter("ignore", FutureWarning)
main()
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.