Ferramentas · No ar

Encurta

Encurte o endereço e veja quem clicou.

Cole um endereço comprido, receba um link curto que não vence e acompanhe os cliques de cada link: por dia, de onde vieram e em que aparelho. Sem conta.

Sobre o projeto

O que é Encurta

O Encurta troca um endereço comprido por um link curto (/e/aB3dE9, com 6 caracteres) e conta quantas pessoas clicaram. Você cola o endereço, recebe o link para mandar por aí e um segundo link, só seu, que abre as estatísticas daquele link. Não precisa de conta nem de programa instalado, e dá para colar sem o https:// na frente.

O link curto não vence e leva direto para o destino. Cada link nasce com um token que só aparece na hora da criação: ele é o que faz o mesmo endereço mostrar as estatísticas (cliques por dia nos últimos 30 dias, de onde as pessoas vieram e em que aparelho) em vez de redirecionar, e é ele que deixa apagar o link na hora. A lista dos seus links, com o token de cada um, fica só no seu navegador.

Das visitas se guarda pouco: o dia (no relógio de Brasília), o nome do site de onde a pessoa veio e se foi celular, tablet ou computador. Nunca o IP, nem o navegador. Os robôs que montam a prévia do link em aplicativos de mensagem não contam. Só se aceitam endereços http e https, e nada que aponte para uma rede interna, porque o navegador de quem clicar é quem visitaria.

Por baixo, a tela usa exatamente a mesma API pública, documentada em OpenAPI 3.1 e com limites por IP. O redirecionamento sai da memória do servidor e os cliques são somados e gravados em lote, no mesmo banco SQLite do ShareSoFast e do Print2Link. Os detalhes estão em Tecnologias, logo abaixo.

Recursos

O que o Encurta faz

Cole e encurte

O endereço comprido vira um link curto de 6 caracteres. Vale colar sem o https:// na frente, e a tela já avisa se o endereço não serve, antes de enviar.

O link não vence

Não tem prazo: o link fica funcionando até quem criou apagar. Apagar é na hora, e o endereço some do arquivo do banco.

Estatísticas de cada link

Cliques no total, o último clique, um gráfico dos últimos 30 dias com versão em tabela, de que sites as pessoas vieram e em que aparelho. A página se atualiza sozinha.

O token só existe com você

Ele aparece uma vez, na criação, e fica no histórico do seu navegador. O servidor guarda só o hash: se você perder o token, ninguém consegue recuperá-lo, mas os links continuam funcionando.

Só endereço seguro de abrir

Só http e https, até 2048 caracteres, sem usuário e senha, sem rede interna (localhost, IPs privados, nomes sem ponto) nem IPv6 puro, e sem encurtar um link do próprio Encurta.

Robôs de prévia não contam

Quem monta a prévia do link no WhatsApp, no Slack ou no Telegram não entra na conta de cliques. Só contam as pessoas.

API aberta

Criar, ver as estatísticas, apagar e conferir vários links de uma vez, com OpenAPI 3.1 e limites por IP (6 links por minuto e 60 por hora). A tela usa a mesma API.

Números abertos

A tela inicial mostra links criados, cliques levados, links no ar agora, apagados, endereços recusados e pedidos barrados, e se atualiza sozinha. São só contagens de todo o período: nunca um endereço.

Tecnologias

Por dentro do Encurta

Mesma base do ShareSoFast e do Print2Link

O Encurta não abre um banco próprio: usa o arquivo, a conexão e a fila de concorrência 1 do ShareSoFast. As tabelas são dele (links, cliques por dia, cliques por origem e aparelho) e os contadores moram na tabela de números que só aumenta, com um prefixo.

Redirecionamento servido da memória

Um código já resolvido fica na memória por 5 minutos, então o clique não pergunta ao banco nem entra na fila. O clique só soma em memória e é gravado em lote a cada 10 segundos e ao encerrar o servidor; quem lê as estatísticas grava antes, para o número estar certo.

Token de 192 bits

Sorteado com o gerador seguro do sistema. O servidor guarda só o hash SHA-256 e compara em tempo constante. Na API vai só em cabeçalho (X-Link-Token ou Bearer); na página vai na query, e por isso o log de acesso nunca registra a query desse endereço.

O destino passa pelo parser do navegador

O endereço é lido pelo mesmo parser de URL que o navegador usa (o que normaliza IPs escritos de formas estranhas, como 0x7f.1 ou 2130706433) e só então comparado. O servidor nunca visita o destino, mas o navegador de quem clicar visitaria o roteador de alguém, por isso rede interna e IPv6 puro ficam de fora.

Estatísticas que guardam pouco

Por link: a contagem por dia (os últimos 90 dias ficam guardados), por nome do site de origem (no máximo 30 sites diferentes; o resto soma em "outras origens") e por classe de aparelho. Nunca o IP, o User-Agent nem o caminho de onde a pessoa veio.

Um esquema só

Operações, limites, mensagens de erro e a regra do endereço moram num módulo puro que o servidor, a tela, o OpenAPI e a tabela desta página importam. Um teste confere que o servidor implementa cada operação e que a tela tem um método para cada uma.

Cliente da API que não conhece o navegador

A tela fala com o servidor por um cliente puro, que recebe o fetch por parâmetro e monta cada pedido a partir do esquema. Erro vira um tipo só, com status, código estável e tempo de espera, e o teste o roda no Node com um fetch de mentira.

Limites por IP

Links novos, leituras de estatísticas, links que não existem e tokens que não conferem têm cada um o seu limite (30 códigos inexistentes por minuto, por exemplo). A API devolve RateLimit-Limit, Remaining e Reset, e o 429 traz Retry-After; a tela espera o tempo pedido, com a contagem no botão.

Gráfico feito à mão em SVG

Colunas finas com a ponta de cima arredondada, grade discreta, o maior dia escrito, dica por coluna que também se lê com as setas do teclado e uma tabela equivalente. A cor da série vem de variáveis do CSS, com o contraste conferido por teste nos temas claro e escuro.

Bloqueio por variável de ambiente

O dono pode barrar nomes de sites sem publicar de novo: o bloqueio vale na criação e também para links que já existem, que passam a responder 410. O cache de 5 minutos faz a mudança, ou a remoção de uma linha no banco, valer em poucos minutos.

Som e movimento em cada ação

Cada clique tem som e animação por um módulo comum que usa os sons de interface do SFX Forge, com botões para desligar os dois, respeito ao pedido de menos movimento do sistema e teto de 24 partículas de confete.

API

Endpoints

Sem chave e sem cadastro: criar um link devolve o link curto, o link das estatísticas e um token que só aparece uma vez. O token vai só em cabeçalho (X-Link-Token ou Authorization: Bearer). Limites por IP: 6 links por minuto e 60 por hora; erros em JSON com código estável e cabeçalhos RateLimit-*.

GET /e/<código> O link curto: redireciona (302) para o endereço de destino. HEAD e robôs de prévia passam sem contar.
GET /e/<código>?token=<token> O mesmo endereço com o token: mostra as estatísticas no navegador em vez de redirecionar, e não conta clique.
POST /projetos/encurta/api/links Encurta um endereço: devolve o link curto, o link das estatísticas e o token (que só aparece nesta resposta).
GET /projetos/encurta/api/links/<código> Estatísticas de um link: cliques, últimos 30 dias, origens e aparelhos.
DELETE /projetos/encurta/api/links/<código> Apaga o link e as estatísticas dele, na hora. O link curto deixa de funcionar.
POST /projetos/encurta/api/mine Cliques de vários links de uma vez (o histórico do navegador): mande o id e o token de cada um. Quem não volta na resposta já não existe.
GET /projetos/encurta/api/stats Números globais do Encurta (só contagens de todo o período).
GET /projetos/encurta/api/usage Os mesmos números no formato da seção "Números abertos" do portfólio.
GET /projetos/encurta/api/openapi.json Esta especificação (OpenAPI 3.1), gerada do esquema.

FAQ

Perguntas frequentes

Preciso criar uma conta?

Não. Cada link nasce com um token, e a lista dos seus links fica só no navegador que você usou. Se limpar os dados do navegador, a lista (e os tokens) some, mas os links continuam funcionando.

O link vence?

Não. Ele fica no ar até quem criou apagar, pelo histórico ou pela página das estatísticas. Quando apaga, o link curto para de funcionar na hora e o endereço some do arquivo do banco e do log de escrita do SQLite.

Como vejo quantas pessoas clicaram?

Pelo link das estatísticas, que é o link curto com ?token=... no fim. Ele aparece quando você cria o link e fica no histórico do navegador. Quem abre o link curto sem o token é só redirecionado.

E se eu perder o token?

Não dá para recuperar: o servidor não o guarda, só um hash dele. Os links continuam funcionando, mas você perde as estatísticas e o jeito de apagá-los.

O que é contado em cada clique?

O dia (no relógio de Brasília), o nome do site de onde a pessoa veio e se foi celular, tablet ou computador. Nunca o IP, o navegador nem o caminho de origem. Cada clique de uma pessoa conta, inclusive o seu e o de quem clica duas vezes; robôs de prévia e requisições HEAD não contam.

Por que tem tanto clique "direto"?

Porque muitos aplicativos de mensagem e navegadores não informam de onde a pessoa veio. O Encurta só sabe a origem quando o navegador a informa, e mostra só o nome do site.

A estimativa de aparelho é confiável?

É uma leitura simples do que o navegador diz ser. O iPad moderno se apresenta como um Mac (conta como computador) e um navegador que esconde essa informação cai em "outro".

Que endereços posso encurtar?

Só http e https, até 2048 caracteres, sem usuário e senha no meio, sem rede interna (localhost, IPs privados e nomes sem ponto) nem IPv6 puro, e não vale encurtar um link do próprio Encurta. O dono também pode barrar nomes de sites.

Alguém consegue adivinhar o meu link?

O código é curto de propósito (6 caracteres de um alfabeto de 57 símbolos, cerca de 35 bits), então trate o link curto como público: quem o tem pode abrir, como com qualquer link. O que é só seu é o token das estatísticas, com 192 bits. Chutar códigos que não existem esbarra em um limite por IP.

Tem API?

Tem, e é a mesma que a tela usa: criar, ver as estatísticas, apagar e conferir vários links, com OpenAPI 3.1. Cada IP cria até 6 links por minuto e 60 por hora, e os cabeçalhos RateLimit-* dizem quanto ainda cabe.

O que os números abertos contam? Eles guardam dados pessoais?

Só contagens: links criados, cliques levados, links no ar agora, apagados por quem criou, endereços recusados e pedidos barrados pelo limite. Nenhum endereço, nenhum IP e nenhum nome entra nessa tabela, e a tela não manda nenhum aviso do navegador para contar o uso.

Por que usa o mesmo banco do ShareSoFast?

Para reaproveitar uma base que já existia (SQLite em modo WAL, fila de concorrência 1, teto de disco) em vez de montar outra. Só as tabelas são separadas. O redirecionamento não passa pela fila: sai da memória, para um clique nunca esperar atrás de um envio de arquivo.

Gostou do Encurta? Dá para apoiar o trabalho:

Continue explorando

Veja também

Todos os projetos