Usuário(a):Nuno Tavares/Scripts

Robots editar

Domínio Especial editar

uncategorizedpages.php 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.wikipedia.org/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.wikipedia.org/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

http://republico.estv.ipv.pt/~nmct/wikipedia/ranking/
#!/usr/bin/perl

sub mysort {
  return ($usuarios{$b}[2] <=> $usuarios{$a}[2]);
}


$weblist = `wget 'http://pt.wikipedia.org/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.wikipedia.org/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 editar

Este 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 editar

datas.php editar

 Ver artigo principal: [[1]]
<?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;
}
?>

I Liga editar

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.