#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
List contributions of a user.
Usage:
contribs.py -user:<username> [-<option name>:<option value> ...]
Options:
-ns: comma-separated numeric list of namespaces to list
-limit: max number of contributions
-year:
-month:
-day: how many years/months/days to go back
"""
import sys, datetime
import wikipedia, query, pagegenerators
class ContribsBot():
def __init__(self, name, site = None, namespaces = None, limit = None, after = None):
self.name = name
self.site = site or wikipedia.getSite()
self.namespaces = namespaces
self.limit = limit
self.after = after
def filter(self):
seenPages = dict()
for c in self.contribs():
if c['title'] in seenPages:
continue
if self.limit and self.count > self.limit:
return
self.count += 1
seenPages[c['title']] = True
yield c
def contribs(self):
while True:
r = query.GetData(self.params, self.site)
for c in r['query']['usercontribs']:
if self.after and datetime.datetime.strptime(c['timestamp'], '%Y-%m-%dT%H:%M:%SZ').date() < self.after:
return
yield c
if not 'query-continue' in r:
return
listedUntil = r['query-continue']['usercontribs']['ucstart']
if self.after and datetime.datetime.strptime(listedUntil, '%Y-%m-%dT%H:%M:%SZ').date() < self.after:
return
self.params['ucstart'] = listedUntil
def run(self):
self.params = {
'action': 'query',
'list': 'usercontribs',
'ucuser': self.name,
'ucprop': ['ids','title', 'timestamp'],
'uclimit': 500,
'ucdir': 'older',
}
if self.namespaces != None:
self.params['ucnamespace'] = '|'.join(map(str, self.namespaces))
self.count = 0
try:
for c in self.filter():
wikipedia.output(c['title'])
except KeyboardInterrupt:
wikipedia.output(' (interrupted)')
def help():
wikipedia.output(__doc__)
def handleArg(arg, options):
if arg.startswith('-ns:'):
options['namespaces'] = arg[4:].split(',')
return True
if arg.startswith('-user:'):
options['name'] = arg[6:]
return True
if arg.startswith('-limit:'):
options['limit'] = int(arg[7:])
return True
if arg.startswith('-year:'):
d = options['after'] or datetime.date.today()
options['after'] = d.replace(year = d.year - int(arg[6:]))
return True
if arg.startswith('-month:'):
d = options['after'] or datetime.date.today()
options['after'] = d - datetime.timedelta(int(arg[7:]) * 365 / 12)
return True
if arg.startswith('-day:'):
d = options['after'] or datetime.date.today()
options['after'] = d - datetime.timedelta(int(arg[5:]))
return True
else:
wikipedia.output("Unknown argument: " + arg)
return False
def main():
options = {'namespaces': None, 'name': None, 'limit': None, 'after': None}
for arg in wikipedia.handleArgs():
if not handleArg(arg, options):
help()
sys.exit()
if not 'name' in options:
help()
sys.exit()
bot = ContribsBot(**options)
bot.run()
if __name__ == "__main__":
try:
main()
finally:
wikipedia.stopme()