Userscript para remover usuários de grupos do Facebook

Já faz algum tempo que o Facebook tem um bug nas listas de membros dos grupos. As listas não mostram todos os membros do grupo. Mais: os membros que não aparecem na lista nem mesmo podem ser encontrados pelo formulário de busca de nomes. Quando você é administrador de um grupo, isso pode ser um grande inconveniente, porque na interface padrão do Facebook a lista de membros é o único lugar onde é possível excluir usuários de um grupo. Ou seja, os usuários que não aparecem lá são indeletáveis!

Só ali na lista de membros aparece esses X para excluir os membros do grupo.

Há alguns meses, escrevi um user script para o GreaseMonkey (extensão para o Firefox que permite que você crie esses pequenos scripts para serem rodados em páginas específicas) que busca ajudar os administradores de grupos a removerem esses membros fantasmas.

Não havia publicado até agora por vergonha (o script é bem feio, tanto o código como o resultado). Porém, acho que não pretendo perfumá-lo tão cedo, então resolvi liberá-lo aqui até pra inspirar quem quiser fazer coisas mais bonitas.

O funcionamento dele é muito simples: quando você entra num grupo (sendo ou não administrador — porque nem distingui isso no código), ele cria botões X do lado dos links para os perfis dos usuários que estão nessa página (e só nesses — outra coisa que nem me preocupei no script). Se você for administrador do grupo em questão, quando clica no X o Facebook abre aquela caixa perguntando se você quer mesmo excluir o membro em questão (e se quer baní-lo permanentemente).

Com o script, tem X em todo o lugar! (até onde não deve… hehe)

Sem mais enrolação, eis aqui o código para (des-)apreciação e aprimoramentos (por favor! :)):

// ==UserScript==
// @name Remove users from Facebook groups
// @description Remove usuarios que postam no grupo sem precisar procurar na lista de membros
// @author  Tiago Madeira <madeira@juntos.org.br>
// @include http*://www.facebook.com/groups/*
// @version 1.32
// ==/UserScript==

(function () {
  var as = document.getElementsByTagName("a");
  var gid = "";

  for (var i = 0; i < as.length; i++) {
    var a = as[i];
    var hovercard = a.getAttribute("data-hovercard");
    if (hovercard != null && hovercard != "") {
      uid = hovercard.replace(/.*id=/, "");
      if (gid != "") {
        var button =
          '<a class="mhm auxiliaryButton closeButton uiCloseButton" ' +
          'title="Remove" rel="dialog-post" ' +
          'href="/ajax/groups/members/remove.php?group_id=' +
          gid +
          "&uid=" +
          uid +
          '"></a>';
        a.innerHTML = a.innerHTML + " " + button;
      }
    }
    var pattern = new RegExp("(^| )groupsCleanProfilePic( |$)");
    if (pattern.test(a.className)) {
      gid = a.getAttribute("href").replace(/.*id=/, "");
    }
  }
})();

Ou o link direto para download (ou instalação no GreaseMonkey):

fb.group.remove.user.js (1.08kb)

Problemas ao comentar?

Duas pessoas reportaram que este blog não está aceitando comentários. Eu acabei de testar e não tive problemas, porém acho estranho que ele esteja há cinco dias sem receber comentários (ou nem tanto, já que as pessoas também vivem fora da internet e os últimos quatro dias foram de Páscoa) e duas pessoas diferentes não conseguiram comentar.

Se você não está conseguindo comentar, favor deixar um comentário para eu investigar o problema.

No mais, estou temporariamente sem internet em casa (e espero que ela volte hoje), motivo pelo qual estou ausente na internet.

PHP: Array de Caracteres != String

Já não é a primeira vez que eu vou fazer uma aplicação em PHP e quero usar uma função de arrays numa string. Como um bom dicípulo da linguagem C, aprendi que uma string é um array de chars. O PHP tenta fazer algo parecido com isso, aceitando que possamos acessar caracteres da string com $string[indice]; porém, não sei por quê, não podemos usar funções de array nas strings e vice-versa.

Vamos supor que eu queira fazer algo simples: usar a função shuffle() numa string (criar um anagrama qualquer de uma string). Aí o PHP me força a fazer isso aqui:

<?php
        $mensagem="anagrama";
        $array=Array();
        for ($i=0; $i<strlen($mensagem); $i++) {
                $array[]=$mensagem[$i];
        }
        shuffle($array);
        $mensagem="";
        for ($i=0; $i<count($array); $i++) {
                $mensagem.=$array[$i];
        }
?>

Pô… É um código muito feio! Quer dizer… Se o C tivesse a função shuffle() (ou o PHP “soubesse” que strings não passam de array de chars), bastaria fazer:

<?php
$mensagem="anagrama";
shuffle($mensagem);
?>

Economia de cérebro, de banda, de código, de dedos… De tudo!

Então, cheguei a conclusão de que eu é que devo estar entendendo algo errado. Alguém conhece uma maneira do PHP tratar strings como arrays? Andei procurando no manual e achei a função settype(), mas ela não faz o que eu quero, porque converte uma string para um array de strings!

Only variables can be passed by reference

Instalei o PHP 5.0.5 no servidor do Colégio Salesiano na semana passada. E descobri que criaram um novo erro agora (do tipo fatal) para quando eu passo uma função como argumento de outra. “Fatal Error: Only variables can be passed by reference”. Bom… Uma função nada mais é que uma variável, afinal é pra isso que serve o seu retorno. Mas agora o PHP nos força, por exemplo, a fazer:

<?php
$variavel2=str_replace("a", "b", $variavel);
$variavel3=funcao($variavel2);
?>

… ao invés de fazer como eu sempre fiz para economizar linhas:

<?php
$variavel3=funcao(str_replace("a", "b", $variavel));
?>

Realmente não entendi o porquê da mudança. Pra mim tava muito bom do jeito anterior… E não sou só eu que faço isso. Os caras que fizeram o phpBB também passaram várias vezes funções como argumentos de outras e isso fez com que eu perdesse algum tempo hoje trocando todos as funções dessa maneira que mostrei acima no fórum do Colégio…

Alguém entende esses caras?

© 2005–2020 Tiago Madeira