Usuário(a):Nuno Tavares/Scripts
Robots
editar- Para o bot do WikiProjecto:Cidades do Mundo, veja Usuário:Nuno Tavares/Perlbot
Domínio Especial
editar<?php header('Content-Type: text/html; charset=utf-8'); ?> <html> Lista de paginas sem categoria: <ul> <?php if ( $_GET["namespace"] != "" ) { $namespace = $_GET["namespace"]; } else { $namespace = 0; } $q = "select cur_title, cur_id " ." from cur left join categorylinks on cur_id=cl_from " ." where cl_from is null " ." and cur_namespace=$namespace " ." and length(cur_text)>0 and " ." not cur_is_redirect ORDER BY cur_title;"; //print $q; $prefix='http://pt.wiki.x.io/wiki/'; mysql_select_db("database", mysql_pconnect("server","login","password")); //faz marcacao if ( $_GET["marca"] != "" ) { $res = mysql_query("INSERT INTO categorylinks VALUES(".$_GET[marca].", 'especial.php', 'especial.php', '')"); print "marcou!\n"; } else { $cont = 0; print "<i>Depois de categorizar o artigo, utilize o '''MARCAR''' para elimina-lo da lista</i><p>"; $rst_semcat = mysql_query($q); while ($row = mysql_fetch_row($rst_semcat)) { print "<li> <font size=1>[<a href=\"especial.php?marca=".$row[1]."\">MARCAR</a>]</font> <a href=\"".$prefix.$row[0]."\">".$row[0]."</a>\n"; $cont++; } print "<p>\nRegistos: $cont\n"; } ?> </ul> </html>
interwiki.php
editar<?php header("Content-Type: text/html; charset=UTF-8"); ?> <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Lista de paginas sem interwikis: <ul> <?php if ($_GET["limit"] != "") { $limit = $_GET["limit"]; } else { $limit = 5000; } $q = "select cur_title, cur_id " . " from cur " . " where cur_namespace=0 " . " and not cur_is_redirect ". " and length(cur_text)>0 " . " AND cur_text NOT LIKE \"%[[__:%\"". " AND cur_text NOT LIKE \"%[[___:%\"". " AND cur_text NOT LIKE \"%[[categoria:freguesias]]%\"". " AND cur_text NOT LIKE \"%[[categoria:munic_pios %\"". " AND cur_text NOT LIKE \"%[[Categoria:MunicÃpios %\"". " AND cur_title NOT LIKE \"Rio_%\"". " ORDER BY cur_title LIMIT ".$limit; //print $q; $prefix='http://pt.wiki.x.io/wiki/'; mysql_select_db("database", mysql_pconnect("server","login","password")); //faz marcacao if ($_GET["marca"] != "") { $res = mysql_query("SELECT cur_title, cur_text FROM cur WHERE cur_id=".$_GET["marca"].";"); if ( $row = mysql_fetch_row($res) ) { print "marcou: ".$row[0]."\n"; $txt = $row[1]."\n"."[[zz:interwiki.php]]\n"; $res = mysql_query("UPDATE cur SET cur_text = \"".$txt."\" WHERE cur_id = ".$_GET["marca"]); } } else if ($_GET["esconde"] != "") { $res = mysql_query("SELECT cur_title, cur_text FROM cur WHERE cur_id=".$_GET["esconde"].";"); if ( $row = mysql_fetch_row($res) ) { print "ESCONDEU: ".$row[0]."\n"; $txt = $row[1]."\n"."[[zz:hidden-interwiki.php]]\n"; $res = mysql_query("UPDATE cur SET cur_text = \"".$txt."\" WHERE cur_id = ".$_GET["esconde"]); } } else { $cont = 0; // print "<i>Depois de categorizar o artigo, utilize o '''MARCAR''' para elimina-lo da lista</i><p><ol>"; print "adicione \"<i>?limit=XXXX</i>\" para listar apenas as primeiras XXXX paginas."; print "* depois de colocar os interwikis, use o MARCAR para eliminar da listagem.<br>\n"; print "* use o ESCONDER para esconder registos cujo interwiki seja pouco provavel de encontrar a medio prazo\n"; print "<p><ol>\n"; $rst_semcat = mysql_query($q); while ($row = mysql_fetch_row($rst_semcat)) { print "<li> <font size=1>[<a href=\"interwiki.php?esconde=".$row[1]."\">ESCONDE</a>] [<a href=\"interwiki.php?marca=".$row[1]."\">MARCAR</a>]</font> <a href=\"".$prefix.$row[0]."\">".$row[0]."</a>\n"; // print "<li> <a href=\"".$prefix.$row[0]."\">".$row[0]."</a>\n"; $cont++; } print "</ol><p>\nRegistos: $cont\n"; } ?> </ul> </html>
ranking.pl
editar#!/usr/bin/perl sub mysort { return ($usuarios{$b}[2] <=> $usuarios{$a}[2]); } $weblist = `wget 'http://pt.wiki.x.io/w/index.php?title=Wikipedia:Lista_de_wikipedistas_por_n%C3%BAmero_de_edi%C3%A7%C3%B5es&action=raw' -q --no-cache -O -`; @webusers = split /\n/,$weblist; $grabbing = 0; foreach $webuser (@webusers) { if ( $webuser =~ / \*+ LISTASCRIPT \*+/ ) { $grabbing = 1; } elsif ( $webuser =~ / \*+ FIM DA LISTASCRIPT \*+/ ) { $grabbing = 0; } elsif ($grabbing) { push @usuarios, $webuser; # print "Got $webuser\n"; } } @limites = ( [ 50000, "+50.000 edições" ], [ 30000, "+30.000 edições" ], [ 20000, "+20.000 edições" ], [ 10000, "+10.000 edições" ], [ 5000, "+5.000 edições" ], [ 4000, "+4.000 edições" ], [ 3000, "+3.000 edições" ], [ 2000, "+2.000 edições" ], [ 1000, "+1.000 edições" ], [ 900, "Quase... (+900)" ] ); $li = 0; &doit(); sub doit { $data = `date +"%d-%m-%Y"`; chomp $data; foreach $bacanow (@usuarios) { ($bacano, $obs) = split /\,/,$bacanow,2; $bacanoweb = $bacano; $bacanoweb =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; # print "Fetching $bacano/$bacanoweb. Obs: $obs\n"; $url = "http://tools.wikimedia.de/~kate/cgi-bin/count_edits?user=$bacanoweb&dbname=ptwiki_p&machread=1"; @dados = `wget "$url" -q --no-cache -O -`; @editsd = grep (/^(?!\#)/, @dados); foreach $editsd_l (@editsd) { chomp($editsd_l); ($var, $vals) = split /\s/, $editsd_l, 2; $user_params{$var} = $vals; } # tratamento da data if ( $user_params{"FIRST_EDIT"} =~ /^(\d\d\d\d)(\d\d)(\d\d)\d+/ ) { $firstedit = "$3-$2-$1"; } $res_url = $url; $res_url =~ s/\&machread=1$//g; # print "$bacano - ".$user_params{"TOTAL_EDITS"}." - ".$user_params{"DELETED_EDITS"}." = ".($user_params{"TOTAL_EDITS"}+$user_params{"DELETED_EDITS"})."\n"; $usuarios{$bacano} = [ $user_params{"TOTAL_EDITS"}, $user_params{"DELETED_EDITS"}, $user_params{"TOTAL_EDITS"}+$user_params{"DELETED_EDITS"}, $firstedit, $res_url, $obs ]; } &get_admins(); $i = 1; print "{| id=\"toc\" style=\"margin: 0 2em 0 2em;\" align=\"center\" width=\"90%\" border=\"0\" cellpadding=\"1\" cellspacing=\"1\" border=1\n" . "!Posição\n" . "![[Wikipedia:Wikipedistas|Wikipedista]]\n" . "!Total de edições (***)\n" . "!1<sup>a</sup> contribuição\n" . "!Actualização\n" . "!Observações\n"; print "|----\n|colspan=\"7\" bgcolor=\"#00BFFF\" | ".$limites[0]->[1]."\n"; foreach $yo (sort mysort keys %usuarios) { if ( $usuarios{$yo}->[2] < $limites[$li]->[0] ) { print "|----\n|colspan=\"7\" bgcolor=\"#00BFFF\" | ".$limites[++$li]->[1]."\n"; } if ( defined($admins{$yo}) ) { $hl = "'''"; } else { $hl = ""; } print "|----\n" . "| align=\"center\" | ".$i++."\n" . "|".$hl."[[User:$yo|$yo]]".$hl."\n|".$usuarios{$yo}->[2]." (".$usuarios{$yo}->[0]."+".$usuarios{$yo}->[1].")\n" . "|".$usuarios{$yo}->[3]."\n" . "|[".$usuarios{$yo}->[4]." $data]\n" . "| ".$usuarios{$yo}->[5]."\n"; } print "|}\n"; } sub get_admins { my $msg = `wget -q -O - 'http://pt.wiki.x.io/w/index.php?title=Especial:Listusers/sysop'`; my @lines = split /\r*\n/,$msg; foreach my $linha (@lines) { if ( $linha =~ /<li><a href=\"\/wiki\/Usu%C3%A1rio\:.*?\" title=\"Usu.+?rio\:(.*?)\">.*?<\/a> \(<a href=\"\/wiki\/Wikipedia:Administradores/ ) { $admins{$1} = 1; } } }
autoiw.pl
editarEste bot analisa dois títulos entre duas línguas diferentes (pt: e en:) e tenta verificar, por meio de um algoritmo simples, se os artigos falam do mesmo, para que possam ser trocados os interwikis. Pede-se ajuda na optimização e novos algoritmos de verificação. Segue uma explicação do algoritmo actual:
Algoritmo 1
editar- Estaremos comparando TITULO1; Saca-se pt:TITULO1 e en:TITULO1.
- Constróiem-se duas listas dos interlinks de cada um (links_TITULO1_pt e links_TITULO1_en, respectivamente);
- Para cada elemento de links_TITULO1_en, obtêm-se os interwikis pt:, se existirem, e colocam-se numa terceira lista: interwikis_TITULO1_en.
- A ideia, neste momento, é comparar se o total de interwikis pt: em interwikis_TITULO1_en coincide com alguns dos links em links_TITULO1_pt, e em que medida. Para calcular uma percentagem:
- Pode-se escolher o menor número de interlinks entre pt:TITULO1 e en:TITULO1 — seria incorrecto comparar um artigo mínimo português com um artigo completo em inglês, pois a percentagem daria um valor muito baixo;
- Ou o número total de interlinks em en:TITULO1 com interwikis pt: — esses é que me parecem ser os artigos que poderiam (eventualmente) estar ligados a partir de pt:TITULO1, já que os que não têm interwiki pt: podem nem sequer existir.
Segue-se um exemplo:
[nmct@mybox autoiw]$ ./autoiw.pl Chiquimula get_article_links: pt:Chiquimula get_article_links: en:Chiquimula Found [[pt:Guatemala]] at [[en:Guatemala]] Redirect found. Following: Chiquimula (department)... Found [[pt:Chiquimula]] at [[en:Chiquimula (department)]] Found [[pt:MunicÃpio]] at [[en:municipality]] Found [[pt:Cidade da Guatemala]] at [[en:Guatemala City]] Found [[pt:Categoria:Cidades da Guatemala]] at [[en:Category:Cities in Guatemala]] pt:Chiquimula: 16 wikilinks en:Chiquimula: 6 wikilinks, 3/8 of which have pt: interwikis here is one: Categoria:Cidades da Guatemala -> Category:Cities in Guatemala here is one: Chiquimula -> Chiquimula (department) here is one: Guatemala -> Guatemala this one was a link at pt:Chiquimula here is one: MunicÃpio -> municipality here is one: Cidade da Guatemala -> Guatemala City Report: 1 link(s) were found from 6 possible links at the smallest article: [[en:Chiquimula]]. Success was 0.166666666666667.
- Conclusão
Note-se a percentagem Sucess. Pela minha experiência, todos os valores acima de 10% são confiáveis em mínimos. A baixa percentagem deve-se, neste caso, a que muitos dos artigos linkados não têm, também, interwikis.
Desambiguador-assistido
editardatas.php
editar<?php if ( strlen($_POST["text"]) <= 0 ) { ?> <html> Introduza o texto com datas no formato ingles: <form action="datas.php" method="post"> <textarea rows=10 cols=80 name="text"> </textarea> <input type="submit"> </form> </html> <?php } else { header('Content-type: text/plain; charset=ISO-8859-1'); $text = $_POST["text"]; $searchpat = array ( '/\[\[January (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[January (\d+)\]\]/', '/\[\[(\d+) January\]\]/', '/\[\[February (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[February (\d+)\]\]/', '/\[\[(\d+) February\]\]/', '/\[\[March (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[March (\d+)\]\]/', '/\[\[(\d+) March\]\]/', '/\[\[April (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[April (\d+)\]\]/', '/\[\[(\d+) April\]\]/', '/\[\[May (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[May (\d+)\]\]/', '/\[\[(\d+) May\]\]/', '/\[\[June (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[June (\d+)\]\]/', '/\[\[(\d+) June\]\]/', '/\[\[July (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[July (\d+)\]\]/', '/\[\[(\d+) July\]\]/', '/\[\[August (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[August (\d+)\]\]/', '/\[\[(\d+) August\]\]/', '/\[\[September (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[September (\d+)\]\]/', '/\[\[(\d+) September\]\]/', '/\[\[October (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[October (\d+)\]\]/', '/\[\[(\d+) October\]\]/', '/\[\[November (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[November (\d+)\]\]/', '/\[\[(\d+) November\]\]/', '/\[\[December (\d+)\]\],* \[\[(\d+)\]\]/', '/\[\[December (\d+)\]\]/', '/\[\[(\d+) December\]\]/' ); $replacepat = array ( '[[\1 de Janeiro]] de [[\2]]', '[[\1 de Janeiro]]', '[[\1 de Janeiro]]', '[[\1 de Fevereiro]] de [[\2]]','[[\1 de Fevereiro]]', '[[\1 de Fevereiro]]', '[[\1 de Março]] de [[\2]]', '[[\1 de Março]]', '[[\1 de Março]]', '[[\1 de Abril]] de [[\2]]', '[[\1 de Abril]]', '[[\1 de Abril]]', '[[\1 de Maio]] de [[\2]]', '[[\1 de Maio]]', '[[\1 de Maio]]', '[[\1 de Junho]] de [[\2]]', '[[\1 de Junho]]', '[[\1 de Junho]]', '[[\1 de Julho]] de [[\2]]', '[[\1 de Julho]]', '[[\1 de Julho]]', '[[\1 de Agosto]] de [[\2]]', '[[\1 de Agosto]]', '[[\1 de Agosto]]', '[[\1 de Setembro]] de [[\2]]', '[[\1 de Setembro]]', '[[\1 de Setembro]]', '[[\1 de Outubro]] de [[\2]]', '[[\1 de Outubro]]', '[[\1 de Outubro]]', '[[\1 de Novembro]] de [[\2]]', '[[\1 de Novembro]]', '[[\1 de Novembro]]', '[[\1 de Dezembro]] de [[\2]]', '[[\1 de Dezembro]]', '[[\1 de Dezembro]]', ); $newtext = preg_replace($searchpat, $replacepat, $text); print $newtext; } ?>
Script para extrair os dados de: Futebol Português em Números
Classificação
editar#!/usr/bin/perl $txt = `wget '$ARGV[0]' -q -O -`; print "{{Futebol/Classificação/18|\n"; $i=1; if ( $txt =~ /<PRE>(.*?)Tabela de Resultados/s ) { @lines = split /\n/, $1; foreach $line (@lines) { if ( $line =~ /\d+ (.*?)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*-\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*-\s*(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s*-\s*(\d+)/ ) { # print "$1-$2-$3-$4-$5-$6/$7-$8-$9-$10-$11-$12/$13-$14-$15-$16-$17/$18\n"; print "<!-- ".($i++)."⩝ lugar -->\n"; print "| [[$1]] | $8 | $2\n"; print "| $3 | $4 | $5 | $6-$7\n"; print "| $9 | $10 | $11 | $12-$13\n"; print "| $14 | $15 | $16 | $17-$18\n"; } } } print "| <!-- Notas: -->\n:<small>''Fonte: [http://desportoluso.no.sapo.pt/Camphist2002-03.html Futebol Português em Números]</small>''\n|\n}}\n";
Pedidos
editar- Script para verificar links-para-redirect e links-para-desambig em artigos;
- Script para verificar quais artigos de determinada categoria não estão inscritos numa página de Biografias.