Script para normalizar contatos para o Office 365

Fiz esse script para juntar arquivos de contatos (*.csv) e deixar pronto para envio para o Office 365, ele corrige erros de codificação e também corrige o erro “Nome não está disponível”. Para executá-lo, salve em um arquivo script.php, baixe o PHP 8.3 e rode:

php -q script.php

<?php

$arquivoSaida = 'contatos_final_unificado.csv';
$primeiroArquivo = true;
$emailsProcessados = [];

$fpOut = fopen($arquivoSaida, 'w');

// BOM para Office 365
fprintf($fpOut, chr(0xEF).chr(0xBB).chr(0xBF));

$arquivos = glob("./*.csv");

function ultraFix($text) {
    if (empty($text)) return "";

    // 1. Dicionário de Prioridade (Trata primeiro os erros MAIS LONGOS)
    $map = [
        // Erros Triplos (ex: ACESSOCAR)
        'Ç' => 'Ç', 'ç' => 'ç', 'ã' => 'ã', 'õ' => 'õ',
        'á' => 'á', 'é' => 'é', 'í' => 'í', 'ó' => 'ó',
        'ú' => 'ú', 'â' => 'â', 'ê' => 'ê', 'ô' => 'ô',
        
        // Erros de codificação que você enviou por último (ex: Tradição)
        'çã' => 'ção', 'ç' => 'ç', 'ã' => 'ã', 'ó' => 'ó', 
        'é' => 'é', 'á' => 'á', 'í' => 'í', 'õ' => 'õ',
        'â' => 'â', 'ê' => 'ê', 'ô' => 'ô', 'ú' => 'ú',
        'Ç' => 'Ç', 'À' => 'À',
        
        // Padrões residuais de caracteres corrompidos por navegadores/sistemas
        'Ã?â?¡' => 'Ç', 'Ã?§' => 'ç', 'Ã?£' => 'ã'
    ];

    // Executa a substituição baseada no mapa acima
    $text = str_replace(array_keys($map), array_values($map), $text);
    
    // 2. Tenta uma conversão final caso ainda existam bytes de ISO-8859-1 escondidos
    // Mas apenas se ainda houver o caractere 'Ã' seguido de algo, indicando erro
    if (strpos($text, 'Ã') !== false) {
        $attempt = @mb_convert_encoding($text, 'UTF-8', 'ISO-8859-1');
        if (mb_check_encoding($attempt, 'UTF-8')) {
            $text = $attempt;
        }
    }

    return trim(preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $text));
}

foreach ($arquivos as $arquivo) {
    if (basename($arquivo) == $arquivoSaida || strpos($arquivo, '.php') !== false) continue;

    if (($handle = fopen($arquivo, "r")) !== FALSE) {
        $cabecalho = fgetcsv($handle);

        if ($primeiroArquivo && $cabecalho) {
            fputcsv($fpOut, $cabecalho);
            $primeiroArquivo = false;
        }

        while (($data = fgetcsv($handle)) !== FALSE) {
            $linha = array_map('ultraFix', $data);
            
            // Pega o Display Name (5) e o E-mail (9 ou 25)
            $displayName = $linha[5] ?? '';
            $email = !empty($linha[9]) ? $linha[9] : ($linha[25] ?? '');

            // Se o nome estiver vazio, usa o e-mail como emergência
            if (empty($displayName)) {
                $displayName = $email;
            }

            // COPIA Display Name para First Name (índice 1)
            $linha[5] = $displayName;
            $linha[1] = $displayName;

            // Filtro de Duplicados
            if (!empty($email)) {
                if (isset($emailsProcessados[$email])) continue;
                $emailsProcessados[$email] = true;
            }

            fputcsv($fpOut, $linha);
        }
        fclose($handle);
    }
}

fclose($fpOut);
echo "Arquivo unificado com sucesso e pronto para o OFFICE 365!\n";

WP – Compactar HTML

Esta rotina eu utilizava até hoje no site da PARKEER para compactar o HTML a ser exibido pelo WordPress. Embora não tenha maiores aprimoramentos, funciona muito bem.

function start_ob() {
ob_start('pk_compress_html');
}
function end_ob() {
ob_end_flush();
}

function pk_compress_html($output) {

$search = array(
'/\>[^\S ]+/s',     // strip whitespaces after tags, except space
'/[^\S ]+\</s',     // strip whitespaces before tags, except space
'/(\s)+/s',         // shorten multiple whitespace sequences
'/<!--(.|\s)*?-->/' // Remove HTML comments
);
$replace = array(
'>',
'<',
'\\1',
''
);
$output = preg_replace($search, $replace, $output);

$output = trim($output);
$output = preg_replace('/^[ \t]*[\r\n]+/m', '', $output);
return $output;
}
add_action('get_header', 'start_ob');
add_action('shutdown', 'end_ob', 999);

Como acabar com o SPAM em formulários – Solução simples com HTML

É fato que muitos dos formulários, como de contato, cadastro, entre outros, são diariamente alvos de bots (robôs) pré-programados para espalharem SPAM pela internet. Uma vez que seu site esteja indexado nos buscadores, seu site se torna alvo fácil deste tipo de ataque, não se apavore, isso é algo corriqueiro de acontecer, com todo mundo.

Infelizmente, hoje, a solução adotada por grande maioria (e até por mim, até conhecer essa) era de incluir um captcha, mas os bots já conseguem interpretar as letras e números oriundos da imagem através de um processo de OCR, logo, dificultamos, colocando somas e divisões simples, o que resolveu o problema, mas acabou com a usabilidade.

Esta solução, encontrei no blog DA2K, já apliquei em um site pessoal, e realmente funcionou, pretendo começar a utilizar mais seguidamente dela, vou tornar a publicação um pouco mais didática do que a original e mostrar como a solução funciona como um todo.

Resumo

Na verdade, é muito simples: Trata-se de criar um campo no formulário em questão que seja invisível visualmente (NOTA: Você precisa utilizar um “alpha” ou “opacity” para isto, um campo do tipo “hidden” não irá funcionar), como esses bots trabalham processando somente o HTML e não o formulário visual, sempre preencherá este campo. No caso de uma pessoa, como o campo é invisível, essa pessoa não o preencherá. O outro lado da solução, se dá no backend (no processador da linguagem, seja PHP, ASP, ou o que for), basta que façamos a validação se este campo invisível foi preenchido ou não.

Origem

Segundo o autor da publicação original, ele percebeu esta solução na ferramenta MailChimp, e não é por menos, o pessoal de lá tem colaborado exponencialmente com a comunidade de desenvolvedores.

Explicando melhor

Como mencionei anteriormente, basta criarmos no nosso formulário um campo “fantasma” que não receberá nenhum valor (passará pela validação), quando um bot interpretar o HTML do formulário, tentará preencher todos os campos, inclusive este, desta forma, não passará pela nossa validação.

como-acabar-spam-formulario

HTML:

<form method="post" ...>
...
<input type="text" id="txtInvisibleValidation" name="txtInvisibleValidation" style="display:block;width:1px;height:1px;border:0;padding:0px;background:transparent;" onfocus="document.getElementById('#txtName').focus();" />
...
</form>

A validação se dará no back-end por maior segurança (isso não quer dizer que você não possa tentar fazer no front), segue um exemplo escrito em PHP:

<?php

$nome = $_POST['txtName'];
$mail = $_POST['txtMail'];
$mensage = $_POST['txtMensage'];
$validation = $_POST['txtInvisibleValidation'];

if ($validation != '') { die('Error on validate form: you are human?!'); }

...

?>

Gostou?

Deixe seu comentário abaixo e me motive a escrever mais artigos. Se gostou muito, compartilhe.

WP – Alterar a URL do site ou blog

UPDATE wp_options SET option_value = replace(option_value, 'http://www.antigo-dominio.com.br', 'http://www.novo-dominio.com.br') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET guid = replace(guid, 'http://www.antigo-dominio.com.br','http://www.novo-dominio.com.br');
UPDATE wp_posts SET post_content = replace(post_content, 'http://www.antigo-dominio.com.br', 'http://www.novo-dominio.com.br');