Vés al contingut

Usuari Discussió:GerardBot/codi

El contingut de la pàgina no s'admet en altres llengües.
De la Viquipèdia, l'enciclopèdia lliure

Ieps, @Gerardduenas:, crec que hi ha alguns errors

pel que veig al codi de core

def NewpagesPageGenerator(
   get_redirect=False, # això es diuen keywordarguments (kwargs) i es diferencies dels arguments (args) perque li assignen un valor a una variable, d'aquesta manera quan crides la funció ja té arguments per defecte
   site=None, # Això vol dir que quan crides la funció pots canviar els kwargs que hi ha per defecte, però si no els canvies agafa els kwargs com a arguments per defecte
   namespaces=[0, ], # Aquest indica sobre quin namespaces treballarà, per tant, no cal cridar aquesta funció dins NamespaceFilterPageGenerator perquè aquesta funció ja te'ls filtra
   step=None,
   total=None): # És possible que aquest total sigui el nombre total de pàgines que et mostrarà

   if site is None: # que és el valor per defecte
        site = pywikibot.Site() # ja et crida la mateixa funció el site() que tens al bot, no et cal assignar-lo tampoc
    for item in site.recentchanges(showRedirects=get_redirect,
                                   changetype="new", namespaces=namespaces,
                                   step=step, total=total):
        yield pywikibot.Page(pywikibot.Link(item["title"], site)) # yield enlloc de return indica que serà un generador i et passarà els valors cada cop que cridis next().
# has de tenir en compte que els valors que retorna són del tipus class Page() i que per tenir el text de la pàgina
# has de cridar la instància de la class Page().get()
# ja t'ho explico en el codi d'abaix


Jo diria que hauria de quedar una cosa així:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#

import sys

sys.path.append("/home/gerardduenas/core")

import pywikibot
from pywikibot import pagegenerators as pg # això et permet fer variables més curtes i no haver d'escriure tant ;)
# site = pywikibot.Site() podem ometre això perquè hem vist que per defecte la funció que vols cridar ja ho fa ;)
from pywikibot import bot #obtenim funcions d'input (introducció de dades a la consola) i output (sortida de dades a la consola)
def main(n):
	gen = pg.NewpagesPageGenerator(total=n) # Només cal passar-li el kwarg que no volem per defecte

	try: # serveix per fer que no s'aturi l'script en cas d'haver-hi error, en aquest cas hi haurà un error quan cridi next() i no trobi més pàgines
		while True:
			pag = gen.next()
			text = pag.get() # la funció que cridem i ens ho retorna a la nostra variable gen són del tipus class Page i hem de cridar la instància get() per que ens doni el wiki-text de la pàgina
		if "<ref" not in text and u"Referències" not in text and u"{{FVA" not in text and u"{{Falta verificar admissibilitat" not in text and u"{{falta verificar admissibilitat" not in text and  u"{{Falten referències" not in text and  u"{{falten referències" not in text and u"{{FR" not in text and u"desambiguació" not in text and u"Desambiguació" not in text: # per fer-ho més petit cal aprendre regex... tot un món ;)
			print u"Processant", pag
			text = u"{{FR}} %s" % text # %s és la forma pythonica d'encadenar stings, %i-> enters %.2f float de dos decimals, si tens diversos % dins un text s'ha de fer amb tupla, ex: u"la cadena %s té %i lletres i ocupen %.2f bytes" % (string,integer,float)
			pag.put(text, u"Bot afegint {{FR}} automàticament. Si us plau revertiu-lo en cas de fals positiu i aviseu a la seva pàgina de discussió") # la instància que ens desa el nou text és put(newtext, comment)
			print u"Processada correctament!"
	except BaseException, err:
		print u"Alguna cosa ha fallat", err
	finally:
		print u"Hem acabat!"

preg = True

if __name__ == "__main__":

	while preg:
		n = bot.input(u"Quantes pàgines farem?")
		try:
			n = int(n)
			main(n)
		except:
			bot.output(u"Com no posis un nombre estarem aquí fins demà")
			
		resp = bot.input("Seguim?\n[Y/n]")
		if resp in ("","s","si","y"):
			preg = True
		else:
			preg = False
	bot.output(u"Ara sí que hem acabat")
	pywikibot.stopme()

De totes maneres hi ha tantes formes de programar com gent que programa ;) no hi ha una forma de fer-ho, però les funcions sí que s'han de cridar bé func(args, kwargs) vinga, fins demà --Anskar (disc.) 00:31, 30 juny 2014 (CEST)[respon]

Permeteu-me afegir que en compat és important acabar a l'escript amb wikipedia.stopme(). No sé si el core ho requerix però en tot cas serà pywikibot.stopme(). Si no m'equivoque és per un tema de sincronització amb el servidor i les tasques pendents. –Cœt · mascletà 03:31, 30 juny 2014 (CEST)[respon]
He fet alguna modificació a la proposta d'Anskar, però aquí tens la meua,a mb regexp inclosa i eliminant els comentaris anteriors. L'iteració que empre per al pagegenerator és emprant l'intrucció for.
import re, sys

sys.path.append("/home/gerardduenas/core")

import pywikibot
from pywikibot import pagegenerators as pg
from pywikibot import bot 
def main(n):
	gen = pg.NewpagesPageGenerator(total=n) 
	try: 
		for pag in gen:
			text = pag.get() 
			bot.output(u"Processant %s" % pag.title(asLink=True)) 
			if not re_pag.search(text):
				text = u"{{FR}} %s" % text 
				pag.put(text, u"Bot afegint {{FR}} automàticament. Si us plau revertiu-lo en cas de fals positiu i aviseu a la seva pàgina de discussió") # la instància que ens desa el nou text és put(newtext, comment)
				bot.output(u"\tProcessada correctament!")
			else:
				bot.output(u"\tconté %s" % re_pag.search(text).group(1))
	except BaseException, err:
		bot.output(u"Alguna cosa ha fallat %r" % err)
	finally:
		bot.output(u"Hem acabat!")



if __name__ == "__main__":
	preg = True
	re_pag = re.compile(ur"(<ref|Referències|{{(?:FVA|Falta verificar admissibilitat|[Ff]alten referències|FR)|[Dd]esambiguació)")
	while preg:
		n = bot.input(u"Quantes pàgines farem?")

		try:
			n = int(n)
			main(n)
		except:
			bot.output(u"Com no posis un nombre estarem aquí fins demà")

		resp = bot.input("Seguim?\n[S/n]")
		if resp.lower() in ("","s","si","y"):
			preg = True
		else:
			preg = False
	bot.output(u"Ara sí que hem acabat")
	pywikibot.stopme()

Espere no marejar-te massa... –Cœt · mascletà 04:59, 30 juny 2014 (CEST)[respon]

@Anskar, Coet: Aquesta versió funciona i es la que presento per la petició. Aquesta tarda quan arribi a casa provaré d'incloure parts d'aquests dos codia de manera que pugui específicar el nombre d'edicions que vull fer (no sé si tot el que m'heu posat aquí ho entén el corefa l'ullet). Gràcies per tot --gerardduenasparlem-ne 07:55, 30 juny 2014 (CEST)[respon]
Jo l'he fet anar amb el core. Que conste que el primer script en core que prove és el teu ;) –Cœt · mascletà 10:15, 30 juny 2014 (CEST)[respon]

amb llista

[modifica]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import re,sys

sys.path.append("/home/eolic/Projectes/wikipedia/core/")
del sys.path[sys.path.index('/home/eolic/Projectes/wikipedia/pywikipedia')]

import pywikibot
from pywikibot import pagegenerators
from pywikibot import bot
import bz2, pickle


def pag_vist():
	bot.output("pag vist")
	try:
		try:
			f = bz2.BZ2File('llista.bin', "r")
		except:
			f = bz2.BZ2File('llista.bin', "w")
			f.close()
			pag_vist()

		pag_list = pickle.load(f)
		f.close()
		bot.output(pag_list)
		return pag_list
	except:
		return "!"

def main(n):
	start_page = pag_vist()
	gen = pagegenerators.AllpagesPageGenerator(start=start_page,total=n)
	bot.output("main")
	try:
		for pag in gen:
			text = pag.text
			bot.output(u"Processant %s" % pag.title(asLink=True))
			if pag.title() in start_page:
				continue
			elif not re_pag.search(text):
				pag.text = u"{{FR}} %s" % text
				pag.save(u"Bot afegint {{FR}} automàticament. Si us plau revertiu-lo en cas de fals positiu i aviseu a la seva pàgina de discussió")
				bot.output(u"\tProcessada correctament!")
			else:
				bot.output(u"\tconté %s" % re_pag.search(text).group(1))
			pag_list = pag.title()
	except BaseException, err:
		bot.output(u"Alguna cosa ha fallat %r" % err)
	finally:
		bot.output(u"Hem acabat!")
		bot.output(pag_list)
		return pag_list

if __name__ == '__main__':
        preg = True
	re_pag = re.compile(ur"(<ref|Referències|{{(?:FVA|Falta verificar admissibilitat|[Ff]alten referències|FR)|[Dd]esambiguació|\#REDIRECT)")
	while preg:
		n = bot.input(u"Quantes pàgines farem?")
		if n == "":
			main(None)
		try:
			n = int(n)
			pag_list = main(n)
			bot.output(pag_list)
			f = bz2.BZ2File('llista.bin', "w")
			bot.output(pag_list)
			pickle.dump(pag_list, f, protocol=pickle.HIGHEST_PROTOCOL)
			bot.output(pag_list)
			f.close()
			bot.output(pag_list)
		except:
			bot.output(u"Com no posis un nombre estarem aquí fins demà")
			pag_list = ""

		resp = bot.input("Seguim?\n[S/n]")
		if resp.lower() in ("","s","si","y"):
			preg = True
		else:
			preg = False
	bot.output(u"Ara sí que hem acabat")
	pywikibot.stopme()

@Gerardduenas: el comentari anterior sense signar és fet per Anskar (disc.contr.) 21:42, 30 juny 2014 (CEST)[respon]

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
import re, sys
 
sys.path.append("/home/gerardduenas/core")

import pywikibot
from pywikibot import pagegenerators as pg
from pywikibot import bot
import bz2, pickle

def pag_vist():
        bot.output("pag vist")
        try:
                try:
                        f = bz2.BZ2File('llista.bin', "r")
                except:
                        f = bz2.BZ2File('llista.bin', "w")
                        f.close()
                        pag_vist()

                pag_list = pickle.load(f)
                f.close()
                bot.output(pag_list)
                return pag_list
        except:
                return "!"
 

def main(n):
	gen = pg.AllpagesPageGenerator(includeredirects=False,total=n) 
	try: 
		for pag in gen:
			text = pag.get() 
			bot.output(u"Processant %s" % pag.title(asLink=True)) 
			if not re_pag.search(text):
				text = u"{{FR}} %s" % text 
				pag.put(text, u"Bot afegint {{FR}} automàticament. Si us plau revertiu-lo en cas de fals positiu i aviseu a la seva pàgina de discussió") # la instància que ens desa el nou text és put(newtext, comment)
				bot.output(u"\tProcessada correctament!")
	except BaseException, err:
		bot.output(u"Alguna cosa ha fallat %r" % err)
	finally:
		bot.output(u"Hem acabat!")
 
 
 
if __name__ == "__main__":
	preg = True
	re_pag = re.compile(ur"(<ref|Referències|{{(?:FVA|Falta verificar admissibilitat|[Ff]alten referències|FR)|[Dd]esambiguació)")
	while preg:
		n = bot.input(u"Quantes pàgines farem?")
 
		try:
			n = int(n)
			main(n)
		except:
			bot.output(u"Com no posis un nombre estarem aquí fins demà")
 
		resp = bot.input("Seguim?\n[S/n]")
		if resp.lower() in ("","s","si","y"):
			preg = True
		else:
			preg = False
	bot.output(u"Ara sí que hem acabat")

Plantilles de desambiguació

[modifica]

Ja he comentat en un altre lloc que no veig aconsellable la feina que ha de fer el bot. Ara bé, sí que podria ser interessant aprofitar part del codi per saber quantes pàgines tenim realment sense referències. Jo ho faria fent-lo córrer per uns centenars de pàgines a l'atzar.

A les condicions de les pàgines que no requereixen referències, crec que hi falten unes quantes variants de la plantilla desambiguació.--Pere prlpz (disc.) 22:17, 30 juny 2014 (CEST)[respon]

@Pere prlpz: Potser no m'he explicat bé a la proposta. El que jo vull que faci el bot és informar al lector que la pàgina no està referenciada. Es pot veure també des del punt de vista del editor que ens ajudarà a saber quantes pàgines tenim sense referenciar, dada inutil (estic amb tu) si en son 80000 els articles que cal arreglar.Si el que no vols és que s'ompli la categoria de "sense referències", potser et convenç que el bot afegís la plantilla amb el parametre NC a no ser que l'article passés d'una llargada determinada. A veure si aconeguim més opinions a la VP:PMB.
D'altra banda, moltes gràcies per avisar que faltaven condicions de desambiguació. N'he afegit les que sé, crec que no n'hi han més. Continuem parlant-ho, --gerardduenasparlem-ne 20:03, 1 jul 2014 (CEST)[respon]
@Gerardduenas: Crec que el tema és més de parlar-lo a la taverna que a la pàgina dels bots, perquè el dubte no és sobre si s'ha de posar la plantilla amb bot sinó si s'ha de posar a tot arreu, com en algun moment ha fet algú a mà i s'ha trobat amb objeccions.
De tota manera, benvingut a la colla dels botaires.--Pere prlpz (disc.) 20:09, 1 jul 2014 (CEST)[respon]
@Pere prlpz: Em sembla molt bé obres tu o jo el fil a la Taverna? Gràcies per la benvinguda, és el primer programa que faig (amb molta ajuda de l'Anskar i el Coet) amb Python.--gerardduenasparlem-ne 20:11, 1 jul 2014 (CEST)[respon]
@Gerardduenas: Jo crec que el consens actual i la pràctica habitual són no posar indiscriminadament aquestes plantilles. Si creus que el consens és un altre o vols mirar de convèncer la comunitat de canviar-lo, pots iniciar tu el fil.--Pere prlpz (disc.) 20:18, 1 jul 2014 (CEST)[respon]