Revision: 7355 Author: siebrand Date: 2009-10-02 09:46:09 +0000 (Fri, 02 Oct 2009)
Log Message: ----------- [ #2818283 ] script to manage statistics. Contributed by almaghi.
Added Paths: ----------- trunk/pywikipedia/statistics_in_wikitable.py
Added: trunk/pywikipedia/statistics_in_wikitable.py =================================================================== --- trunk/pywikipedia/statistics_in_wikitable.py (rev 0) +++ trunk/pywikipedia/statistics_in_wikitable.py 2009-10-02 09:46:09 UTC (rev 7355) @@ -0,0 +1,163 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +""" + + +\03{lightyellow}This bot renders statistics provided by [[Special:Statistics]] in a table on a wiki page.\03{default} +Thus it creates and updates a Statistics wikitable. + +The following parameters are supported: + +\03{lightred}-screen\03{default} If True, doesn't do any changes, but only shows the statistics. + +\03{lightgreen}-page\03{default} On what page statistics are rendered. + If not existing yet, it is created. + If existing, it is updated. +""" +__version__ = '$Id$' +import wikipedia, pagegenerators, query +import simplejson, time + +# This is the title of the wikipage where to render stats. +your_page = "Logstats" + +summary_update = { + 'en':u'Updating some statistics.', + } +summary_creation = { + 'en':u'Creating statistics log page.', + } + + +class StatisticsBot: + def __init__ (self, screen, your_page): + """ + Constructor. Parameter: + * screen - If True, doesn't do any real changes, but only shows + some stats. + """ + self.screen = screen + self.your_page = your_page + self.dict = self.getdata() # Try to get data. + + def run(self): + if self.screen: + wikipedia.output("Bot is running to output stats.") + self.idle(1) # Run a function to idle + self.outputall() + if not self.screen: + self.outputall() # Output all datas on screen. + wikipedia.output("\nBot is running. Going to treat \03{lightpurple}%s\03{default}..." % self.your_page ) + self.idle(2) + self.treat() + + def getdata(self): # getdata() returns a dictionnary of the query to api.php?action=query&meta=siteinfo&siprop=statistics + # This method return data in a dictionnary format. + # View data with: api.php?action=query&meta=siteinfo&siprop=statistics&format=jsonfm + params = { + 'action' :'query', + 'meta' :'siteinfo', + 'siprop' :'statistics', + } + wikipedia.output("\nQuerying api for json-formatted data...") + try: + data = query.GetData(params, + useAPI = True, encodeTitle = False) + except: + site = wikipedia.getSite() + url = site.protocol() + '://' + site.hostname() + site.api_address() + wikipedia.output("The query has failed. Have you check the API? Cookies are working?") + wikipedia.output(u"\n>> \03{lightpurple}%s\03{default} <<" % url) + if data != None: + wikipedia.output("Extracting statistics...") + data = data['query'] # "query" entry of data. + dict = data['statistics'] # "statistics" entry of "query" dict. + return dict + + def treat(self): + site = wikipedia.getSite() + page = wikipedia.Page(site, self.your_page) + if page.exists(): + wikipedia.output(u'\nWikitable on \03{lightpurple}%s\03{default} will be completed with:\n' % self.your_page ) + text = page.get() + newtext = self.newraw() + wikipedia.output(newtext) + choice = wikipedia.inputChoice(u'Do you want to add these on wikitable?', ['Yes', 'No'], ['y', 'N'], 'N') + text = text[:-3] + newtext + summ = wikipedia.translate(site, summary_update) + if choice == 'y': + try: + page.put(u''.join(text), summ) + except: + wikipedia.output(u'Impossible to edit. It may be an edit conflict... Skipping...') + else: + wikipedia.output(u'\nWikitable on \03{lightpurple}%s\03{default} will be created with:\n' % self.your_page ) + newtext = self.newtable()+self.newraw() + wikipedia.output(newtext) + summ = wikipedia.translate(site, summary_creation) + choice = wikipedia.inputChoice(u'Do you want to accept this page creation?', ['Yes', 'No'], ['y', 'N'], 'N') + if choice == 'y': + try: + page.put(newtext, summ) + except wikipedia.LockedPage: + wikipedia.output(u"Page %s is locked; skipping." % title) + except wikipedia.EditConflict: + wikipedia.output(u'Skipping %s because of edit conflict' % title) + except wikipedia.SpamfilterError, error: + wikipedia.output(u'Cannot change %s because of spam blacklist entry %s' % (title, error.url)) + + def newraw(self): + newtext = ('\n|----\n!'''+ self.date() +'''') # new raw for date and stats + for name in self.dict: + newtext += '\n|'+str(abs(self.dict[name])) + newtext += '\n|----\n|}' + return newtext + + def newtable(self): + newtext = ('\n{| class=wikitable style=text-align:center\n!'+ "date") # create table + for name in self.dict: + newtext += '\n|'+name + return newtext + + def date(self): + rightime = time.localtime(time.time()) + year = str(rightime[0]) + month = str(rightime[1]) + day = str(rightime[2]) + date = year+'/'+month+'/'+day + return date + def outputall(self): + list = self.dict.keys() + list.sort() + for name in self.dict: + wikipedia.output("There are "+str(self.dict[name])+" "+name) + def idle(self, retry_idle_time): + time.sleep(retry_idle_time) + wikipedia.output(u"Starting in %i second..." % retry_idle_time) + time.sleep(retry_idle_time) + +def main(your_page): + screen = False # If True it would not edit the wiki, only output statistics + _page = None + + wikipedia.output("\nBuilding the bot...") + for arg in wikipedia.handleArgs(): # Parse command line arguments + if arg.startswith('-page'): + if len(arg) == 5: + _page = wikipedia.input(u'On what page do you want to add statistics?') + else: + _page = arg[6:] + if arg.startswith("-screen"): + screen = True + if not _page: + _page = your_page + if not screen: + wikipedia.output("The bot will add statistics on %s.\n" % _page ) + bot = StatisticsBot(screen, _page) # Launch the instance of a StatisticsBot + bot.run() # Execute the 'run' method + +if __name__ == "__main__": + try: + main(your_page) + finally: + wikipedia.stopme()
Property changes on: trunk/pywikipedia/statistics_in_wikitable.py ___________________________________________________________________ Added: svn:keywords + Id Added: svn:eol-style + native