Aggiornamento dello stato di conservazione delle varie sottospecie modifica

Questo bot serve per inserire e correggere i parametri |statocons= e |statocons_versione= del template {{tassobox}} nelle specie delle varie forme di vita; inoltre aggiunge e corregge la bibliografia inserendo il riferimento alla pagina corretta IUCN Red List tramite il template {{IUCN}}. Esempio

iucn.py
# -*- coding: utf-8 -*-
"""
Questo  bot visualizza il nome di tutte le pagine reindirizzate con questi metodi:

-file        - Lavora su tutte le pagine in date da un file locale.
               Legge ogni [[wiki link]] e usa quei articoli.
               L'argomento passato come "-file:filename".
-cat         - Lavora in tutte le pagine di una specifica categoria.
               L'argomento passato come "-cat:categoryname".
-page        - Edita solamente una specifica pagina.
               L'argomento passato come  "-page:pagetitle". Si può passare l'argomento più volte, una per ogni pagina 
-ref         - Lavora su tutte le pagine linkate verso una certa pagina - come ad esempio [[Speciale:PuntanoQui]].
               L'argomento passato come "-ref:referredpagetitle".

-filelinks   - Lavora su tutte le pagine che linkano su un certo file.
               L'argomento passato come "-filelinks:ImageName".
-links       - Lavora su tutte le pagine linkate all'interno di una certa pagina.
               L'argomento passato come "-links:linkingpagetitle".
-start       - Lavora su tutte le pagine di wiki. partendo da una pagina data. Scegliere
               "-start:!" per partire dalla prima pagina.
-namespace:n - Numero dei namespace su cui lavorare. Il parametro può essere usato più volte.
               Lavora in combinazione con tutti gli altri parametri, eccetto il parametro -start.
               Se si vuole per esempio iterare tutte le pagine a partire da User:M, usare -start:User:M.
"""
#
# (C) Brodo, 2007
#
# Distributed under the terms of the GPL license.
#


from __future__ import generators
import wikipedia, pagegenerators

import re, urllib2, sys

# Imports predefined replacements tasks from fixes.py
from fixes import fixes

def main():
	gen=None
	# Which namespaces should be processed?
	# default to [] which means all namespaces will be processed
	namespaces = []
	PageTitles = []
	
	genFactory = pagegenerators.GeneratorFactory()
	for arg in wikipedia.handleArgs():
		if arg.startswith('-namespace:'):
			namespaces.append(int(arg[11:]))
		elif arg.startswith('-page'):
			if len(arg) == 5:
				PageTitles.append(wikipedia.input(u'Which page do you want to change?'))
        		else:
				PageTitles.append(arg[6:])
		else:
			generator = genFactory.handleArg(arg)
			if generator:
				gen = generator
	
	if PageTitles:
	        pages = [wikipedia.Page(wikipedia.getSite(), PageTitle) for PageTitle in PageTitles]
	        gen = iter(pages)

	if not gen:
        	# syntax error, show help text from the top of this file
        	wikipedia.showHelp()
        	wikipedia.stopme()
        	sys.exit()
	if namespaces != []:
		gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
	generator = pagegenerators.PreloadingGenerator(gen, pageNumber = 500)
	
	
	#page=wikipedia.input(u'Inserisci la pagina da modificare:')
	for page in generator:
		try:
			action ='';
			txt = page.get()
			
			
			if cosasono(txt,page) == 'specie' or cosasono(txt,page) == 'sottospecie' :
				newtxt=fixIUCN(txt,page)
			else:
				newtxt=txt
			if txt != newtxt:
				action =action + 'fix IUCN - '
				
			#newtxt=fixAltriprogetti(txt,page);
			#if txt != newtxt:
			#	action =action + 'fix /* Altri progetti */ - '
			if txt != newtxt:
				wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
				wikipedia.showDiff(txt, newtxt)
				choice = wikipedia.inputChoice(u'Modifico la pagina?',  [u'Yes', u'No'], [u'y', u'N'], u'N')
				if choice in [u'Y', u'y']:
					wikipedia.setAction(u'%s' % (action))
					page.put(newtxt)
			else:
				wikipedia.output(u'nessuna modifica necessaria in %s'% page.title())
  		except wikipedia.NoPage:
                	wikipedia.output(u'Page %s not found' % page.title());
			wikipedia.stopme();
		except wikipedia.IsRedirectPage:
			wikipedia.output(u'Page %s is a redirect' % page.title());

	
def fixIUCN(txt,page):
	try:
		if cosasono(txt,page) == 'specie':
			regex1 = re.compile(u'<A HREF="details.php/(.*)/summ">%s' % page.title());
			urlpage = re.search(u'(.*) (.*)',page.title()).group(1) + '+' + re.search(u'(.*) (.*)',page.title()).group(2);
			pagina=urllib2.urlopen('http://www.iucnredlist.org/search/search.php?freetext=%s&modifier=starts&criteria=wholedb&taxa_species=1&Submit.x=87&Submit.y=14&redlistCategory[]=all&redlistAssessyear[]=all&country[]=all&aquatic[]=all&regions[]=all&habitats[]=all&threats[]=all' % urlpage).read()
			tsumm = re.search(regex1,pagina)
		elif cosasono(txt,page) == 'sottospecie':
			urlpage = re.search(u'(.*) (.*) (.*)',page.title()).group(1) + '+' + re.search(u'(.*) (.*) (.*)',page.title().decode('latin-1')).group(2)
			urltitle= re.search(u'(.*) (.*) (.*)',page.title()).group(1) + ' ' + re.search(u'(.*) (.*) (.*)',page.title()).group(2) + ' ssp.' + re.search(u'(.*) (.*) (.*)',page.title()).group(3)
			regex1 = re.compile(u'<A HREF="details.php/(.*)/summ">%s' % urltitle);
			pagina=urllib2.urlopen('http://www.iucnredlist.org/search/search.php?freetext=%s&modifier=all&criteria=wholedb&taxa_subspc=1&Submit.x=87&Submit.y=14&redlistCategory[]=all&redlistAssessyear[]=all&country[]=all&aquatic[]=all&regions[]=all&habitats[]=all&threats[]=all' % urlpage).read()
			tsumm = re.search(regex1,pagina)
		else:
			return txt;
		if not tsumm:
			wikipedia.output(u'%s non trovato sul sito IUCN' % page.title())
			return txt
		summ=tsumm.group(1)
		try:
			regex2 = re.compile(u' *(..(/..)?) (.* )?(.*) &nbsp;&nbsp; <A HREF=(.*)/info/categories_criteria(....)#categories.><SPAN CLASS=.linksmall.>ver&nbsp;(.*)&nbsp;(...)');
			
			
			pagina = urllib2.urlopen('http://www.iucnredlist.org/search/details.php/%s/summ' % summ).read();
			statocons = re.search(regex2,pagina).group(1);
			statocons_versione = re.search(regex2,pagina).group(7);
			autore= re.search(u'<TD>(.*)\.  <I>.*</I>\.  In: IUCN 200.\. <I>200. IUCN Red List of Threatened Species\. </I>&lt;<A HREF="http://www.iucnredlist.org">www.iucnredlist.org</A>&gt;\.  Downloaded on', pagina).group(1);
			autore = re.sub(r'</?(I|i)>',r"''",autore)
			#autore = re.sub(u'</i>',u'\'\'',autore)
			autore = re.sub(u'&amp;',u'&',autore)

			if statocons == 'EX' or statocons == 'EW':
				if re.search(u'\| *statocons *=.* *( *\| *dataestinzione=.*)',txt):
					statocons=statocons + re.search(u'\| *statocons *=.* *( *\| *dataestinzione=.*)',txt).group(1)
							 
			if re.search(r'\| *statocons *= *%s' % (statocons),txt) and re.search(r'\| *statocons_versione *= *iucn%s' % (statocons_versione),txt) and (re.search(r'\{\{IUCN\|summ=%s\|autore= *%s *\}\}' % (summ,autore),txt) or re.search(r'\{\{IUCN\|autore= *%s *\|summ=%s\}\}' % (autore,summ),txt)):
				return txt
			if re.search(u'\| ?stato(cons)? ?= ?.*',txt):
				if re.search(u'\| ?statocons_versione ?= ?.*',txt):
					newtxt=re.sub(u'\| ?stato(cons)? ?= ?.*',u'|statocons=%s' % (statocons),txt);
					newtxt=re.sub(u'\| ?statocons_versione ?= ?.*',u'|statocons_versione=iucn%s' % (statocons_versione),newtxt);
				else: 
					newtxt=re.sub(u'\| ?stato(cons)? ?= ?.*',u'|statocons=%s\n|statocons_versione=iucn%s' % (statocons,statocons_versione),txt);
			elif re.search(u'\| *nome *=.*',txt):
				lnome=re.search(u'\| *nome *=(.*)',txt)
				if lnome:
					nome=lnome.group(1)
				else:
					nome=''
				print nome
				newtxt=re.sub(u'\| *nome *= *.*',u'|nome=%s\n|statocons=%s\n|statocons_versione=iucn%s' % (nome,statocons,statocons_versione), txt)
			else:
				print 'error'
				return txt
			
			if re.search(u'\{\{IUCN(\|(summ|autore)=.*\|(summ|autore)=.*)?\}\}',newtxt):
				newtxt=re.sub(u'\{\{IUCN.*\}\}',u'{{IUCN|summ=%s|autore=%s}}' % (summ,autore.decode('latin-1')),newtxt)
			elif re.search(u'== *Bibliografia *==',newtxt):
				newtxt=re.sub(u'== *Bibliografia *==',u'== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}' % (summ,autore.decode('latin-1')),newtxt)
			elif re.search(u'== *Altri progetti *==',newtxt):
				newtxt=re.sub(u'== *Altri progetti *==',u'== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}\n\n== Altri progetti ==' % (summ,autore.decode('latin-1')),newtxt);
			elif re.search(u'== *Collegamenti esterni *==',newtxt):
				newtxt=re.sub(u'== *Collegamenti esterni *==',u'== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}\n\n== Collegamenti esterni ==' % (summ,autore.decode('latin-1')),newtxt);
			else:
				 newtxt = newtxt + u'\n== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}' % (summ,autore.decode('latin-1'))
			return newtxt
			
		except AttributeError: 
			wikipedia.output(u'%s non trovato sul sito IUCN' % page.title());
			return txt;
		  
	except AttributeError:
		wikipedia.output(u'Impossibile inserire IUCN %s poichè non è una specie' % page.title());
		return txt;
		
def cosasono(txt,page):
	r = re.search(u'(.*) \(.*\)',page.title())
	if r:
		pagesenzadisambigua=r.group(1)
	else:
		pagesenzadisambigua=page.title()
	r=re.search(u'\|(dominio|regno|sottoregno|superphylum|phylum|subphylum|infraphylum|microphylum|nanophylum|superclasse|classe|sottoclasse|infraclasse|superordine|ordine|sottordine|infraordine|superfamiglia|famiglia|sottofamiglia|trib.|genere|sottogenere|specie|sottospecie) *= *.*%s.*' % (pagesenzadisambigua), txt)
	if r:
		return r.group(1)
	else:
		r=re.search(u'(.)(.*) (.*) (.*)',pagesenzadisambigua)
		if r:
			if re.search(u'×',pagesenzadisambigua):
				return 'none'
			return 'sottospecie'
		else:
			r=re.search(u'(.)(.*) (.*)',pagesenzadisambigua)
			if r:
				return 'specie'
			else:
				return 'none'
	
	

if __name__ == "__main__":
    try:
        main()
#    except KeyboardInterrupt:
#        wikipedia.stopme()
#        sys.exit()
    finally:
        wikipedia.stopme()
        sys.exit()

Inserimento e correzione del template {{interprogetto}} nelle forme di vita modifica

Scopo di questo bot è di inserire e correggere il template {{interprogetto}} all'interno delle varie forme di vita inserendo un link a commons e a wikispecies, potrebbe non funzionare correttamente se esistono link a ad altri progetti wikimedia. Esempio

altriprogetti.py
# -*- coding: utf-8 -*-
"""
Questo  bot visualizza il nome di tutte le pagine reindirizzate con questi metodi:

-file        - Lavora su tutte le pagine in date da un file locale.
               Legge ogni [[wiki link]] e usa quei articoli.
               L'argomento passato come "-file:filename".
-cat         - Lavora in tutte le pagine di una specifica categoria.
               L'argomento passato come "-cat:categoryname".
-page        - Edita solamente una specifica pagina.
               L'argomento passato come  "-page:pagetitle". Si può passare l'argomento più volte, una per ogni pagina 
-ref         - Lavora su tutte le pagine linkate verso una certa pagina - come ad esempio [[Speciale:PuntanoQui]].
               L'argomento passato come "-ref:referredpagetitle".
-filelinks   - Lavora su tutte le pagine che linkano su un certo file.
               L'argomento passato come "-filelinks:ImageName".
-links       - Lavora su tutte le pagine linkate all'interno di una certa pagina.
               L'argomento passato come "-links:linkingpagetitle".
-start       - Lavora su tutte le pagine di wiki. partendo da una pagina data. Scegliere
               "-start:!" per partire dalla prima pagina.
-namespace:n - Numero dei namespace su cui lavorare. Il parametro può essere usato più volte.
               Lavora in combinazione con tutti gli altri parametri, eccetto il parametro -start.
               Se si vuole per esempio iterare tutte le pagine a partire da User:M, usare -start:User:M.
"""
#
# (C) Brodo, 2007
#
# Distributed under the terms of the GPL license.
#


from __future__ import generators
import wikipedia, pagegenerators

import re, urllib2, sys

# Imports predefined replacements tasks from fixes.py
from fixes import fixes

def main():
	gen=None
	# Which namespaces should be processed?
	# default to [] which means all namespaces will be processed
	namespaces = []
	PageTitles = []
	
	genFactory = pagegenerators.GeneratorFactory()
	for arg in wikipedia.handleArgs():
		if arg.startswith('-namespace:'):
			namespaces.append(int(arg[11:]))
		elif arg.startswith('-page'):
			if len(arg) == 5:
				PageTitles.append(wikipedia.input(u'Which page do you want to change?'))
        		else:
				PageTitles.append(arg[6:])
		else:
			generator = genFactory.handleArg(arg)
			if generator:
				gen = generator
	
	if PageTitles:
	        pages = [wikipedia.Page(wikipedia.getSite(), PageTitle) for PageTitle in PageTitles]
	        gen = iter(pages)

	if not gen:
        	# syntax error, show help text from the top of this file
        	wikipedia.showHelp()
        	wikipedia.stopme()
        	sys.exit()
	if namespaces != []:
		gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
	generator = pagegenerators.PreloadingGenerator(gen, pageNumber = 50)
	
	
	#page=wikipedia.input(u'Inserisci la pagina da modificare:')
	for page in generator:
		try:
			action ='';
			txt = page.get()
			
			
			#if cosasono(txt,page) == 'specie' or cosasono(txt,page) == 'sottospecie' :
			#	newtxt=fixIUCN(txt,page)
			#else:
			#	newtxt=txt
			#if txt != newtxt:
			#	action =action + 'fix IUCN - '
				
			newtxt=fixAltriprogetti(txt,page);
			if txt != newtxt:
				action =action + 'fix /* Altri progetti */ - '
				
			if txt != newtxt:
				wikipedia.output(u"\n\n>>> \03{lightpurple}%s\03{default} <<<" % page.title())
				wikipedia.showDiff(txt, newtxt)
				choice = wikipedia.inputChoice(u'Modifico la pagina?',  [u'Yes', u'No'], [u'y', u'N'], u'N')
				if choice in [u'Y', u'y']:
					wikipedia.setAction(u'%s' % (action))
					page.put(newtxt)
			else:
				wikipedia.output(u'nessuna modifica necessaria in %s'% page.title())
  		except wikipedia.NoPage:
                	wikipedia.output(u'Page %s not found' % page.title());
			wikipedia.stopme();
		except wikipedia.IsRedirectPage:
			wikipedia.output(u'Page %s is a redirect' % page.title());

	
def fixIUCN(txt,page):
	try:
		if cosasono(txt,page) == 'specie':
			urlpage = re.search(u'(.*) (.*)',page.title()).group(1) + '+' + re.search(u'(.*) (.*)',page.title()).group(2);
			pagina=urllib2.urlopen('http://www.iucnredlist.org/search/search.php?freetext=%s&modifier=starts&criteria=wholedb&taxa_species=1&Submit.x=87&Submit.y=14&redlistCategory[]=all&redlistAssessyear[]=all&country[]=all&aquatic[]=all&regions[]=all&habitats[]=all&threats[]=all' % urlpage).read()
		elif cosasono(txt,page) == 'sottospecie':
			urlpage = re.search(u'(.*) (.*) (.*)',page.title()).group(1) + '+' + re.search(u'(.*) (.*) (.*)',page.title()).group(2) + '+' + re.search(u'(.*) (.*) (.*)',page.title()).group(3)
			pagina=urllib2.urlopen('http://www.iucnredlist.org/search/search.php?freetext=%s&modifier=all&criteria=wholedb&taxa_subspc=1&Submit.x=87&Submit.y=14&redlistCategory[]=all&redlistAssessyear[]=all&country[]=all&aquatic[]=all&regions[]=all&habitats[]=all&threats[]=all' % urlpage).read()
		else:
			return txt;
		try:
			regex1 = re.compile(u'<A HREF="details.php/(.*)/summ">');
			regex2 = re.compile(u'<FONT FACE="Verdana" SIZE="2" COLOR="maroon">(..(/..)?) (.* )?(.*) &nbsp;&nbsp; <A HREF=(.*)ver&nbsp;(.*)(.*)&nbsp;(.*)');
			summ = re.search(regex1,pagina).group(1);
			statocons = re.search(regex2,pagina).group(1);
			statocons_versione = re.search(regex2,pagina).group(6);
			pagina = urllib2.urlopen('http://www.iucnredlist.org/search/details.php/%s/summ' % summ).read();
			autore= re.search(u'<TD>(.*)\.  <I>.*</I>\.  In: IUCN 200.\. <I>2006 IUCN Red List of Threatened Species\. </I>&lt;<A HREF="http://www.iucnredlist.org">www.iucnredlist.org</A>&gt;\.  Downloaded on', pagina).group(1);
			
			# modifico la pagina 
			if re.search(r'\|statocons=%s' % (statocons),txt) and re.search(r'\|statocons_versione=iucn%s' % (statocons_versione),txt) and re.search(r'\{\{IUCN\|summ=%s\|autore=%s\}\}' % (summ,autore),txt) :
				return txt
			if re.search(u'\| ?stato(cons)? ?= ?.*',txt):
				if re.search(u'\| ?statocons_versione ?= ?.*',txt):
					newtxt=re.sub(u'\| ?stato(cons)? ?= ?.*',u'|statocons=%s' % (statocons),txt);
					newtxt=re.sub(u'\| ?statocons_versione ?= ?.*',u'|statocons_versione=iucn%s' % (statocons_versione),newtxt);
				else:
					newtxt=re.sub(u'\| ?stato(cons)? ?= ?.*',u'|statocons=%s\n|statocons_versione=iucn%s' % (statocons,statocons_versione),txt);
			
			if re.search(u'\{\{IUCN(\|(summ|autore)=.*\|(summ|autore)=.*)?\}\}',newtxt):
				newtxt=re.sub(u'\{\{IUCN(\|(summ|autore)=.*\|(summ|autore)=.*)?\}\}',u'{{IUCN|summ=%s|autore=%s}}' % (summ,autore),newtxt);
			elif re.search(u'== *Bibliografia *==',newtxt):
				newtxt=re.sub(u'== *Bibliografia *==',u'== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}' % (summ,autore),newtxt)
			elif re.search(u'== *Altri progetti *==',newtxt):
				newtxt=re.sub(u'== *Altri progetti *==',u'==Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}\n\n== Altri progetti ==' % (summ,autore),newtxt);
			elif re.search(u'== *Collegamenti esterni *==',newtxt):
				newtxt=re.sub(u'== *Collegamenti esterni *==',u'==Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}\n\n== Collegamenti esterni ==' % (summ,autore),newtxt);
			else:
				 newtxt = newtxt + u'\n== Bibliografia ==\n*{{IUCN|summ=%s|autore=%s}}' % (summ,autore)
			return newtxt
			
		except AttributeError: 
			wikipedia.output(u'%s non trovato sul sito IUCN' % page.title());
			return txt;
		  
	except AttributeError:
		wikipedia.output(u'Impossibile inserire IUCN %s poichè non è una specie' % page.title());
		return txt;
		
def cosasono(txt,page):
	r = re.search(u'(.*) \(.*\)',page.title())
	if r:
		pagesenzadisambigua=r.group(1)
	else:
		pagesenzadisambigua=page.title()
	r=re.search(u'\|(dominio|regno|sottoregno|superphylum|phylum|subphylum|infraphylum|microphylum|nanophylum|superclasse|classe|sottoclasse|infraclasse|superordine|ordine|sottordine|infraordine|superfamiglia|famiglia|sottofamiglia|trib.|genere|sottogenere|specie|sottospecie) *= *.*%s.*' % (pagesenzadisambigua), txt)
	if r:
		return r.group(1)
	else:
		r=re.search(u'(.)(.*) (.*) (.*)',pagesenzadisambigua)
		if r:
			return 'sottospecie'
		else:
			r=re.search(u'(.)(.*) (.*)',pagesenzadisambigua)
			if r:
				return 'specie'
			else:
				return 'none'
	


def fixAltriprogetti(txt,page):
	
	
	s=wikipedia.Site('species', 'species')
	speciesfile=wikipedia.Page(s, page.title());
		
	c=wikipedia.Site('commons','commons')
	commonsfile=wikipedia.Page(c, page.title());
	
	commonsexists=mexists(commonsfile)
	if not commonsexists:
		c=wikipedia.Site('commons','commons')
		commonsfile=wikipedia.Page(c,u'Category:%s' % (page.title()));
		commonsexists=mexists(commonsfile);
	
	speciesexists=mexists(speciesfile);
	
	if commonsexists and commonsfile.title() == page.title():
		if speciesexists:
			if re.search(u'\{\{interprogetto\|commons\|wikispecies\}\}',txt) or re.search(u'\{\{interprogetto\|wikispecies\|commons\}\}',txt):
				return txt
		else:
			if re.search(u'\{\{interprogetto\|commons\}\}',txt):
				return txt
	elif commonsexists and commonsfile.title() == 'Category:' + page.title():
		if speciesexists:
			if re.search(u'\{\{interprogetto\|commons=%s\|wikispecies\}\}' % (commonsfile.title()),txt) or re.search(u'\{\{interprogetto\|wikispecies\|commons=%s\}\}' % (commonsfile.title()),txt):
				return txt
		else:
			if re.search(u'\{\{interprogetto\|commons=%s\}\}' % (commonsfile.title()),txt):
				return txt
	elif speciesexists and speciesfile.title() == page.title():
		if re.search(u'\{\{interprogetto\|wikispecies\}\}',txt):
			return txt
	elif not speciesexists and not commonsexists:
		return txt
	
	if re.search(u'\{\{interprogetto\|commons=%s\}\}' % (commonsfile.title()),txt) or re.search(u'\{\{interprogetto\|commons=%s\|wikispecies=%s\}\}' % (commonsfile.title(),speciesfile.title()),txt) or re.search(u'\{\{interprogetto\|wikispecies=%s\}\}' % (speciesfile.title()),txt):
		return txt
	
	
	if re.search(u'{{interprogetto.*',txt):
		if commonsexists :
			if speciesexists:
				newtxt=re.sub(u'{{interprogetto.*',u'{{interprogetto|commons=%s|wikispecies=%s}}' % (commonsfile.title(),speciesfile.title()),txt);
			else:
				newtxt=re.sub(u'{{interprogetto.*',u'{{interprogetto|commons=%s}}' % (commonsfile.title()),txt);
		else:
			if speciesexists:
				newtxt=re.sub(u'{{interprogetto.*',u'{{interprogetto|wikispecies=%s}}' % (speciesfile.title()),txt);
	elif re.search(u'== ?Collegamenti esterni ?==',txt):
		if commonsexists:
			if speciesexists:
				newtxt=re.sub(u'== ?Collegamenti esterni ?==',u'== Altri progetti ==\n{{interprogetto|commons=%s|wikispecies=%s}}\n\n== Collegamenti esterni ==' % (commonsfile.title(),speciesfile.title()),txt);
			else:
				newtxt=re.sub(u'== ?Collegamenti esterni ?==',u'== Altri progetti ==\n{{interprogetto|commons=%s}}\n\n== Collegamenti esterni ==' % (commonsfile.title()),txt);
		else:
			if speciesexists:
				newtxt=re.sub(u'== ?Collegamenti esterni ?==',u'== Altri progetti ==\n{{interprogetto|wikispecies=%s}}\n\n== Collegamenti esterni ==' % (speciesfile.title()),txt);
	else:
		if commonsexists:
			if speciesexists:
				newtxt= txt + u'\n== Alri progetti ==\n{{interprogetto|commons=%s|wikispecies=%s}}' % (commonsfile.title(),speciesfile.title());
			else:
				newtxt= txt + u'\n== Alri progetti ==\n{{interprogetto|commons=%s}}' % (commonsfile.title());
		else:
			if speciesexists:
				newtxt= txt + u'\n== Alri progetti ==\n{{interprogetto|wikispecies=%s}}' % (speciesfile.title());
	if newtxt == txt:
		return txt;
	else:
		return newtxt;
	 
def mexists(page):
	"""
	True if the page exists, even if it's a redirect.

	If the title includes a section, False if this section isn't found.
	
	Questa funzione va a sostituire Page.exists() poichè la funzione soprascritta attiva una funzione di sleeping che preferisco rimanga disattivata
	"""
	
	try:
		page.get(throttle = False)
	except wikipedia.NoPage:
		return False
	except wikipedia.IsRedirectPage:
		return True
	except wikipedia.SectionError:
		return False
	return True
		
		
if __name__ == "__main__":
    try:
        main()
#    except KeyboardInterrupt:
#        wikipedia.stopme()
#        sys.exit()
    finally:
        wikipedia.stopme()
        sys.exit()

Creazione dei fringuelli di Darwin modifica

uccelliDarwin.py
# -*- coding: utf-8 -*-

import wikipedia
import re

list = [
	['Geospiza conirostris','Fringuello terricolo grosso dei cactus','[[Robert Ridgway|Ridgway]]', '1890'],
	['Geospiza difficilis','Fringuello terricolo beccotagliente','[[Richard Bowdler Sharpe|Sharpe]]', '1888'],
	['Geospiza fortis','Fringuello terricolo medio','[[John Gould|Gould]]', '1837'],
	['Geospiza fuliginosa','Fringuello terricolo piccolo','[[John Gould|Gould]]', '1837'],
	['Geospiza magnirostris','Fringuello terricolo grosso','[[John Gould|Gould]]', '1837'],
	['Geospiza scandens','Fringuello terricolo dei cactus','([[John Gould|Gould]]', '1837)'],
	['Camarhynchus crassirostris','Fringuello arboricolo beccogrosso','[[John Gould|Gould]]', '1837'],
	['Camarhynchus heliobates','Fringuello delle mangrovie','([[Robert Evans Snodgrass|Snodgrass]] & [[Edmund Heller|Heller]]', '1901)'],	
	['Camarhynchus pallidus','Fringuello picchio','([[Philip Sclater|Sclater]] & [[Osbert Salvin|Salvin]]', '1870)'],	
	['Camarhynchus parvulus','Fringuello arboricolo insettivoro piccolo','([[John Gould|Gould]]', '1837)'],
	['Camarhynchus pauper','Fringuello arboricolo di Charles','[[Robert Ridgway|Ridgway]]', '1890'],
	['Camarhynchus psittacula','Fringuello arboricolo grosso ','[[John Gould|Gould]]', '1837'],
]

wikipedia.handleArgs()
for m in list:
 print m[0]
 i=wikipedia.Page(wikipedia.getSite(), m[0])
 if i.exists(): #or i.title().find(u'Immagine') != -1 or i.title().find(u'Image') != -1 or i.title().find(u'idae') != -1:
  continue
 regex = re.compile(u'\[\[%s\]\]\'\' *\|\| *(.*) *\|\|' % i.title())
 nomecomune = m[1]
 scient = re.search(u'(.+?) (.+)', i.title())
 genere = scient.group(1)
 specie = genere[0] + u'. ' + scient.group(2)
 biautore= m[2]
 bidata = m[3]
 testopagina = u"{{s|uccelli}}\n{{Tassobox\n|colore=pink\n|nome=%s\n|statocons=\n|immagine=[[Immagine:Missing.png|220px]]\n|didascalia=''{{subst:PAGENAME}}''\n|<!-- CLASSIFICAZIONE -->\n|dominio=\n|regno=[[Animalia]]\n|sottoregno=\n|superphylum=\n|phylum=[[Chordata]]\n|subphylum=[[Vertebrata]]\n|infraphylum=\n|microphylum=\n|nanophylum=\n|superclasse=\n|classe=[[Aves]]\n|sottoclasse=\n|infraclasse=\n|superordine=\n|ordine=[[Passeriformes]]\n|sottordine=\n|infraordine=\n|superfamiglia=\n|famiglia=[[Emberizidae]]\n|sottofamiglia=\n|genere=[[%s]]\n|specie='''%s'''\n<!--NOMENCLATURA BINOMIALE-->\n|binome={{subst:PAGENAME}}\n|biautore=%s\n|bidata=%s\n}}\nIl '''{{subst:lc:%s}}''' (''{{subst:PAGENAME}}'',%s %s) è un [[Aves|uccello]] della [[famiglia (tassonomia)|famiglia]] degli [[Emberizidae]], [[Endemismo|endemico]] dell' [[Ecuador]].\n\n\n== Descrizione==\n\n== Bibliografia ==\n*{{IUCN}}\n==Altri progetti==\n{{interprogetto|wikispecies}}\n\n==Collegamenti esterni==\n*{{avibase}}\n[[Categoria:Specie (uccelli)]]\n\n[[en:{{subst:PAGENAME}}]]" % (nomecomune,genere,specie,biautore,bidata,nomecomune,biautore,bidata)
 print testopagina.encode('utf-8')
 choice = wikipedia.inputChoice(u'Creo la pagina?',  [u'Yes', u'No'], [u'y', u'N'], u'N')
 if choice in [u'Y', u'y']:
  wikipedia.setAction(u'Stub uccelli generato da [[Utente:Brodobot|Brodobot]].')
  i.put(testopagina)
  redirect=wikipedia.Page(wikipedia.getSite(),nomecomune)
  if not redirect.exists() or redirect.isRedirectPage():
    redirect.put(u'#REDIRECT [[%s]]\n[[Categoria:Nomi comuni specifici (uccelli)]]' % i.title())
wikipedia.stopme()

Creazione di pagine tramite avibase modifica

Scopo di questo bot è di creare pagine ricavandole dal sito [1]

pagefromavibase.py
# -*- coding: utf-8 -*-
"""
Questo  bot visualizza il nome di tutte le pagine reindirizzate con questi metodi:

-file        - Lavora su tutte le pagine in date da un file locale.
               Legge ogni [[wiki link]] e usa quei articoli.
               L'argomento passato come "-file:filename".
-cat         - Lavora in tutte le pagine di una specifica categoria.
               L'argomento passato come "-cat:categoryname".
-page        - Edita solamente una specifica pagina.
               L'argomento passato come  "-page:pagetitle". Si può passare l'argomento più volte, una per ogni pagina 
-ref         - Lavora su tutte le pagine linkate verso una certa pagina - come ad esempio [[Speciale:PuntanoQui]].
               L'argomento passato come "-ref:referredpagetitle".
-filelinks   - Lavora su tutte le pagine che linkano su un certo file.
               L'argomento passato come "-filelinks:ImageName".
-links       - Lavora su tutte le pagine linkate all'interno di una certa pagina.
               L'argomento passato come "-links:linkingpagetitle".
-start       - Lavora su tutte le pagine di wiki. partendo da una pagina data. Scegliere
               "-start:!" per partire dalla prima pagina.
-namespace:n - Numero dei namespace su cui lavorare. Il parametro può essere usato più volte.
               Lavora in combinazione con tutti gli altri parametri, eccetto il parametro -start.
               Se si vuole per esempio iterare tutte le pagine a partire da User:M, usare -start:User:M.
"""
#
# (C) Brodo, 2007
#
# Distributed under the terms of the GPL license.
#


from __future__ import generators
import wikipedia, pagegenerators

import re, urllib2, sys

# Imports predefined replacements tasks from fixes.py
from fixes import fixes

def main():
	gen=None
	# Which namespaces should be processed?
	# default to [] which means all namespaces will be processed
	namespaces = []
	PageTitles = []
	
	
	genFactory = pagegenerators.GeneratorFactory()
	for arg in wikipedia.handleArgs():
		if arg.startswith('-namespace:'):
			namespaces.append(int(arg[11:]))
		elif arg.startswith('-page'):
			if len(arg) == 5:
				PageTitles.append(wikipedia.input(u'Which page do you want to change?'))
        		else:
				PageTitles.append(arg[6:])
		else:
			generator = genFactory.handleArg(arg)
			if generator:
				gen = generator
	
	if PageTitles:
	        pages = [wikipedia.Page(wikipedia.getSite(), PageTitle) for PageTitle in PageTitles]
	        gen = iter(pages)

	if not gen:
        	# syntax error, show help text from the top of this file
        	wikipedia.showHelp()
        	wikipedia.stopme()
        	sys.exit()
	if namespaces != []:
		gen =  pagegenerators.NamespaceFilterPageGenerator(gen, namespaces)
	generator = pagegenerators.PreloadingGenerator(gen, pageNumber = 500)
	
	
	#page=wikipedia.input(u'Inserisci la pagina da modificare:')
	for page in generator:
		try:
			action ='';
			txt = ''
			
			if page.exists() or page.title().find(u'Immagine') != -1 or page.title().find(u'Image') != -1: #or i.title().find(u'idae') != -1:
				continue
			txt=paginafromavibase(txt,page)
			
			#if txt == '':
			#	continue
			
			find=re.compile(u'{{-start-}}(.*){{-stop-}}(.*)',re.DOTALL)
			nomecomune=re.search(find, txt).group(1)
			wikipedia.output(nomecomune.encode('utf-8'))
			testopagina=re.search(find, txt).group(2)
			print testopagina.encode('utf-8')
			
			#newtxt=fixAltriprogetti(txt,page);
			#if txt != newtxt:
			#	action =action + 'fix /* Altri progetti */ - '
			choice = wikipedia.inputChoice(u'Creo la pagina?',  [u'Yes', u'No'], [u'y', u'N'], u'N')
			if choice in [u'Y', u'y']:
				wikipedia.setAction(u'Stub uccelli generato da [[Utente:Brodobot|Brodobot]].')
				page.put(testopagina)
				redirect=wikipedia.Page(wikipedia.getSite(),nomecomune)
				if not redirect.exists() or redirect.isRedirectPage():
					wikipedia.setAction(u'')
					redirect.put(u'#REDIRECT [[%s]]\n[[Categoria:Nomi comuni specifici (uccelli)]]' % page.title())
		except wikipedia.NoPage:
			wikipedia.output(u'Page %s not found' % page.title());
			wikipedia.stopme();
		except wikipedia.IsRedirectPage:
			wikipedia.output(u'Page %s is a redirect' % page.title());


def paginafromavibase(txt,page):
	
	avibasepage=getpage(page.title())
	if avibasepage == 0:
		 return ''
	
	avicomp=re.compile('<b>Ordine:</b><br> &nbsp;&nbsp;(.*)<br>')
	ordine=getre(avicomp,avibasepage)
	if ordine == 0:
		 return ''
	
	avicomp=re.compile('<b>Famiglia:</b><br> &nbsp;&nbsp;(.*)<br>')
	famiglia=getre(avicomp,avibasepage)
	if famiglia == 0:
		 return ''
	
	avicomp=re.compile('\(<I>%s</I>\) (.*), (.*)</td>' % page.title())
	biautore=getre(avicomp,avibasepage)
	if biautore == 0:
		 return ''
	
	avicomp=re.compile('\(<I>%s</I>\) \%s\, (.*)</td>' % (page.title(),biautore))
	bidata=getre(avicomp,avibasepage)
	if bidata== 0:
		 bidata = ''
	
	avicomp=re.compile('<br><b>Italiano: </b>(.*?)<br><b>')
	nomecomunelist=getre(avicomp,avibasepage)
	if nomecomunelist == 0:
		 nomecomunelist = ''
	nomecomunelist = re.sub(u',',u'<br />',nomecomunelist)
	
	avicomp=re.compile('<b>Italiano:</b><br> &nbsp;&nbsp;(.*)<br>')
	nomecomune=getre(avicomp,avibasepage)
	if nomecomune == 0:
		 return ''
	
	articolo=getarticolo(nomecomune)
	
	scient = re.search(u'(.+?) (.+)', page.title())
	genere = scient.group(1)
	specie = genere[0] + u'. ' + scient.group(2)
	
	print u'\nNome comune: %s %s\nNome scientifico: %s\nOrdine: %s\nFamiglia: %s\nAutore: %s\nData: %s\nNomi comuni: %s\n' % (articolo, nomecomune, page.title(),famiglia,ordine, biautore, bidata, nomecomunelist)
	txt =  u"{{-start-}}%s{{-stop-}}{{s|uccelli}}\n{{Tassobox\n|colore=pink\n|nome=%s\n|statocons=\n|immagine=[[Immagine:Missing.png|220px]]\n|didascalia=''{{subst:PAGENAME}}''\n|<!-- CLASSIFICAZIONE -->\n|dominio=\n|regno=[[Animalia]]\n|sottoregno=\n|superphylum=\n|phylum=[[Chordata]]\n|subphylum=[[Vertebrata]]\n|infraphylum=\n|microphylum=\n|nanophylum=\n|superclasse=\n|classe=[[Aves]]\n|sottoclasse=\n|infraclasse=\n|superordine=\n|ordine=[[%s]]\n|sottordine=\n|infraordine=\n|superfamiglia=\n|famiglia=[[%s]]\n|sottofamiglia=\n|genere=[[%s]]\n|specie='''%s'''\n<!--NOMENCLATURA BINOMIALE-->\n|binome={{subst:PAGENAME}}\n|biautore=%s\n|bidata=%s\n<!-- ALTRO -->\n|nomicomuni=%s}}\n%s '''{{subst:lc:%s}}''' (''{{subst:PAGENAME}}'', %s %s) è un [[Aves|uccello]] della [[famiglia (tassonomia)|famiglia]] [[%s]].\n== Descrizione==\n\n== Bibliografia ==\n*{{IUCN}}\n==Altri progetti==\n{{interprogetto|wikispecies}}\n\n==Collegamenti esterni==\n*{{avibase}}\n[[Categoria:Specie (uccelli)]]\n\n[[en:{{subst:PAGENAME}}]]" % (nomecomune,nomecomune,ordine,famiglia,genere,specie,biautore,bidata,nomecomunelist,articolo,nomecomune,biautore,bidata,famiglia)
	
	#print txt.encode('utf-8')
	return txt
	
def getpage(titolo):

	urlpage = re.search(u'(.*) (.*)',titolo).group(1) + '+' + re.search(u'(.*) (.*)',titolo).group(2)
	
	try:
		avibasepage =  urllib2.urlopen('http://www.bsc-eoc.org/avibase/avibase.jsp?pg=search&qstr=%s&qlang=' % urlpage).read()
	except AttributeError: 
		wikipedia.output(u'error in avibase per %s' % titolo);
		return 0
	try:
		aviregex = re.compile(u'\'summary\',\'..\', *\'(.*)\', \'(.*)\'\)\">%s</a></td>' % titolo)
		avibaseid = re.search(aviregex,avibasepage).group(1)
		avibasets = re.search(aviregex,avibasepage).group(2)
	except AttributeError: 
		wikipedia.output(u'%s non trovato sul sito avibase' % titolo);
		return 0
	try:
		avibasepage =  urllib2.urlopen('http://www.bsc-eoc.org/avibase/avibase.jsp?pg=summary&lang=IT&id=%s&ts=%s' % (avibaseid,avibasets)).read()
		return avibasepage
	except AttributeError: 
		wikipedia.output(u'error in avibase per %s' % titolo);
		return 0
	return 0

def getarticolo(nomecomune):
	first  = re.search(u'(.).*',nomecomune).group(1)
	if (first == 'A') or (first == 'E') or (first == 'I') or (first == 'O') or (first == 'U'):
		return 'L\''
	else:
		choice = wikipedia.inputChoice(u'Qual\'è il sesso del nome "%s"' % nomecomune,  [u'Male', u'Female'], [u'M', u'F'])
		if choice in [u'M', u'm']:
			return 'Il'
		else:
			return 'La'
	return ''
	
def getre(avicomp,avibasepage):
	try:
		string=re.search(avicomp,avibasepage).group(1)
		return string
	except AttributeError: 
		wikipedia.output(u'error in avibase per la ricerca');
		return 0


if __name__ == "__main__":
    try:
        main()
#    except KeyboardInterrupt:
#        wikipedia.stopme()
#        sys.exit()
    finally:
        wikipedia.stopme()
        sys.exit()