Executando verificação de segurança...
10
MrJ
3 min de leitura ·

🖥️ Criei um Desklet do TabNews para Linux Mint (e como bypassar o Cloudflare)

Fala pessoal! Recentemente decidi trazer o conteúdo do TabNews direto para o meu desktop no Linux Mint (Cinnamon). Queria algo nativo, sem ter que ficar com o navegador aberto o tempo todo.

O resultado foi o TabNews Reader, e queria compartilhar os desafios técnicos que encontrei — principalmente como contornei o bloqueio da API — e pedir um feedback da comunidade sobre algumas implementações.

🚀 O Projeto

A ideia era simples: um widget na área de trabalho que lista os posts Relevantes e Recentes.
O Cinnamon usa GJS (Gnome JavaScript), então a estrutura é basicamente JS, CSS e JSON.

A estrutura ficou assim:

  • desklet.js: A lógica que puxa os dados e monta a UI.
  • stylesheet.css: O visual "Dark Mode" inspirado no TabNews.
  • settings-schema.json: Onde criei a opção de Múltiplas Instâncias. Dá para ter um desklet só de "Relevantes" e outro de "Recentes" lado a lado, cada um com sua config.

Há opções para personalizar tudo.

🚧 O Problema: Erro 403 e Cloudflare

Aqui foi onde o filho chorou e a mãe não viu. Tentei usar a lib padrão Soup do Gnome para fazer o GET na API.
Resultado: 403 Forbidden.

O Cloudflare barra requisições que não têm a "impressão digital" (TLS fingerprint) de um navegador real. O User-Agent padrão do Cinnamon é bloqueado na hora.

🛠️ A Solução: curl-impersonate

Em vez de tentar reinventar a roda simulando headers na mão, fui para o brute force inteligente. Integrei o curl-impersonate no projeto.

Basicamente, o desklet não faz a requisição direta. Ele roda um subprocesso que chama esse binário modificado, que simula perfeitamente um Chrome:

// Trecho simplificado do desklet.js
let args = [
    'curl-impersonate-chrome', 
    '-s', '-L', 
    url_da_api
];
// O Desklet lê o JSON que volta no stdout

Funcionou liso. Agora o TabNews "acha" que é um Chrome acessando.

🛠️ Instalação

Tem dois jeitos de instalar: o rápido (script que faz tudo) e o manual (pra quem gosta de saber o que tá rodando).

Opção 1: Automática (Recomendado)

Só rodar esse comando no terminal. Ele já baixa a dependência (curl-impersonate) e instala o desklet na pasta certa.

bash <(curl -s https://raw.githubusercontent.com/MrJc01/crom-desklets/main/install.sh)

🔮 O que vem por aí (Ajuda?)

O projeto está funcional, mas estou travado em uma feature: Sempre no Topo.
O Cinnamon desenha os desklets na camada do fundo (desktop). Tentei usar z-index e raise_top(), mas ele só fica acima de outros desklets, não de janelas.

Se alguém manjar de GJS/Cinnamon e souber como injetar o ator na camada chromeGroup (overlay), aceito PRs!

O código está aberto aqui: github.com/MrJc01/crom-desklets


☕ Apoie o Desenvolvimento open-source do seu país(Não falo só de mim aqui)

Manter o desenvolvimento de ferramentas open-source exige tempo, dedicação e, claro, muito ☕ para alguns, e muito 🍀 para outros. Se você gostou desse projeto, achou a ferramenta útil ou simplesmente quer incentivar a continuidade do projeto, qualquer apoio é bem-vindo.

Estou trabalhando em um módulo de doações dedicado na Crom (a organização por trás do projeto), mas enquanto ele não fica pronto, estou aceitando apoios via PIX:

Chave:
[email protected]

⚠️ Importante:
Se você fizer uma doação, por favor, envie o comprovante com uma mensagem (pode ser só seu usuário do GitHub ou TabNews) para o e-mail: [email protected]

Assim que eu finalizar e lançar a implementação oficial de donate/invest da Crom, farei questão de migrar e disponibilizar esses apoios lá como créditos, badges de apoiadores, ou minimamente agradecimentos pelo valor investido.

Muito obrigado pela sua atenção! 🗿🍷

Carregando publicação patrocinada...
2