Szerkesztő:Tgr/contribs.py

A Wikipédiából, a szabad enciklopédiából
#!/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()