12 min de leitura

WhatsApp no BlackBerry antigo: guia prático com J2ME

Volte a trocar mensagens no BlackBerry clássico: hospede a ponte Baileys, compile o WhatsApp J2ME pelo navegador e conecte sua conta por QR code.

Digitar uma mensagem no teclado de um BlackBerry tem uma sensação que a tela de toque nunca substituiu muito bem. Se você ainda guarda um desses aparelhos, o WhatsApp J2ME é uma forma experimental de colocar esse teclado para trabalhar de novo.

A configuração tem duas partes: o whatsapp-j2me, cliente Java ME instalado no celular, e o baileys-j2me, a ponte que você hospeda em um computador ou servidor. Seu Android ou iPhone atual autoriza a conexão com a conta do WhatsApp por QR code. O BlackBerry se comunica com essa ponte.

É um projeto independente, sem vínculo com WhatsApp ou Meta. Ele não restaura o aplicativo oficial do BlackBerry. Compatibilidade e recursos dependem do aparelho, firmware, rede e servidor; encare como uma experiência de computação retrô, sem depender dele como única forma de receber mensagens.

Primeiro, confira qual é o seu BlackBerry

O foco aqui são aparelhos com BlackBerry OS clássico capazes de executar aplicativos Java ME, e não modelos com BlackBerry 10, como Q10, Z10 ou Passport. Ter o nome BlackBerry na carcaça não garante que o aparelho instale um MIDlet.

Antes de compilar, confirme que seu modelo aceita aplicativos MIDP 2.0 / CLDC 1.1, tem acesso à internet e permite instalar um par JAR/JAD. Uma conexão Wi-Fi funcionando é um bom ponto de partida. Um plano de dados antigo ou uma página abrindo no navegador não prova que os aplicativos Java conseguem acessar seu servidor.

Você também precisa de uma conta atual do WhatsApp no Android ou iOS, um computador ou servidor Linux que permaneça ligado e um endereço acessível pelo BlackBerry. Celulares Symbian com o suporte Java ME necessário podem seguir a mesma ideia, mas instalação, permissões, certificados e limites de memória variam conforme o modelo.

1. Hospede a ponte Baileys J2ME

A ponte mantém a conexão moderna com o WhatsApp e oferece uma API que o cliente antigo consegue utilizar. Ela precisa ficar ligada enquanto você quiser trocar mensagens pelo BlackBerry.

Dê ao seu BlackBerry um servidor próprio

Quer manter a ponte funcionando sem deixar o computador de casa ligado? Um Droplet da DigitalOcean oferece um servidor Linux para essa parte da configuração. Crie o seu primeiro e volte aqui quando ele estiver pronto para receber a ponte.

Você pode criar um Droplet na DigitalOcean pelo meu link de indicação.

Posso receber crédito por cadastros que atendam às condições do programa. Confira os preços atuais antes de criar seu servidor; a hospedagem é cobrada separadamente da minha assinatura.

  1. Acesse o link acima e crie sua conta ou faça login.
  2. Crie um Droplet com uma imagem Ubuntu LTS ainda mantida. Escolha uma região próxima de você e um plano com memória suficiente para compilar o Rust e executar a ponte Node; a compilação pode exigir mais memória que o serviço em execução.
  3. Adicione sua chave pública SSH durante a criação e mantenha a chave privada no seu computador. Dê um nome fácil de identificar, como blackberry-bridge.
  4. Configure o firewall da nuvem: permita SSH apenas pelo seu IP administrativo e libere o HTTPS do proxy para seus dispositivos ou sua rede autorizada. Mantenha a porta 8085 fechada para a internet pública.
  5. Aguarde o fim da criação e copie o IP público do Droplet. Você poderá apontar o hostname da ponte para esse endereço ao configurar o DNS mais adiante.

Quando o Droplet estiver pronto, abra um terminal no seu computador e conecte-se, substituindo o endereço de exemplo pelo IP do Droplet:

ssh root@IP_DO_SEU_DROPLET

Se você configurou outro usuário administrativo, use esse nome no lugar de root. Na primeira conexão, confira a chave de identificação SSH do servidor por um canal confiável. Prepare um usuário de serviço sem privilégios e instale os pré-requisitos Linux abaixo antes de iniciar a ponte; o serviço mostrado mais adiante roda como baileys.

Já tem um servidor Linux? Continue com as mesmas etapas de instalação. A ponte não depende da DigitalOcean.

Instale e inicie a ponte

Em uma máquina Linux com Git, Rust/Cargo e uma versão do Node.js ainda mantida e compatível com as dependências da ponte:

git clone https://github.com/mateuslacorte/baileys-j2me.git
cd baileys-j2me
npm --prefix node-bridge ci
cargo build --release
PORT=8085 NODE_PATH="$(command -v node)" ./target/release/baileys-j2me

Execute a partir da pasta do repositório. O binário inicia o processo Node por node-bridge/bridge.js, então copiar apenas o executável Rust não basta. Também são necessárias as dependências Node e uma pasta sessions/ com permissão de escrita. Se a compilação apontar bibliotecas de sistema ausentes, instale os pacotes de desenvolvimento exigidos pela crate indicada para sua distribuição.

Por padrão, o servidor escuta em todas as interfaces na porta 8085. Mantenha essa porta fechada para a internet e permita que o proxy reverso a acesse localmente. Configure o usuário e a senha no Nginx conforme os passos abaixo antes de conectar o celular.

Para uma primeira verificação local, abra outro terminal no servidor:

curl http://127.0.0.1:8085/api/device/setup-check/status

Isso cria uma sessão de teste e deve retornar um status em JSON. O teste verifica a ponte Rust/Node, não um login concluído no WhatsApp. Não vincule sua conta a esse ID de teste; o aplicativo gera o próprio identificador.

Mantenha o servidor ligado após sair do terminal

Para uma instalação persistente, coloque o repositório em /opt/baileys-j2me, pertencente a um usuário dedicado e sem privilégios chamado baileys. Instale primeiro o Node e as dependências de compilação; depois, como esse usuário, instale as dependências da ponte e compile o binário nessa pasta. O usuário precisa conseguir gravar em sessions/.

Salve o conteúdo abaixo em /etc/systemd/system/baileys-j2me.service, ajustando o caminho do Node conforme a saída de command -v node:

[Unit]
Description=Baileys J2ME bridge
Wants=network-online.target
After=network-online.target
 
[Service]
Type=simple
User=baileys
WorkingDirectory=/opt/baileys-j2me
ExecStart=/opt/baileys-j2me/target/release/baileys-j2me
Environment=PORT=8085
Environment=NODE_PATH=/usr/bin/node
Restart=on-failure
RestartSec=5
UMask=0077
 
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now baileys-j2me
sudo systemctl status baileys-j2me
sudo journalctl -u baileys-j2me -n 50 --no-pager

Mantenha sessions/ privada. Ela contém credenciais da conta e dados de mensagens; nunca deve ser servida como conteúdo do site nem enviada ao Git. Quem administra a ponte pode acessar as mensagens que passam por ela, então use um servidor sob seu controle e em que você confia.

Crie um endereço que o celular consiga acessar

Use um hostname que resolva para seu servidor. Para acesso fora da rede local, configure DNS e as regras necessárias no roteador ou firewall. Coloque um proxy reverso na frente da ponte, com HTTPS e um certificado aceito pelo aparelho.

Crie primeiro as credenciais do proxy:

sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/baileys.htpasswd bridge-user
sudo chown root:www-data /etc/nginx/baileys.htpasswd
sudo chmod 640 /etc/nginx/baileys.htpasswd

Troque bridge-user pelo seu usuário e informe a senha quando solicitado. Use caracteres ASCII imprimíveis e nenhum dois-pontos no usuário. Ajuste o grupo do arquivo ao grupo dos processos do Nginx (www-data no Debian/Ubuntu). Para trocar uma senha ou adicionar outro usuário depois, omita -c para preservar o arquivo existente.

Dentro de um bloco server do Nginx que já tenha um certificado TLS funcionando, esta configuração encaminha a API pela raiz do domínio:

location / {
    auth_basic "WhatsApp J2ME bridge";
    auth_basic_user_file /etc/nginx/baileys.htpasswd;
    proxy_set_header Authorization "";
    proxy_pass http://127.0.0.1:8085/;
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_read_timeout 90s;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Aplique suas restrições de acesso de rede também a esse virtual host. Execute sudo nginx -t antes de sudo systemctl reload nginx. Esse trecho inclui Basic Auth; mantenha-o no virtual host HTTPS e redirecione o tráfego HTTP da API para HTTPS.

Nesse cenário, os dados do cliente são host: seu hostname; porta: 443; protocolo: HTTPS; caminho da API: /. Confira se curl -o /dev/null -w '%{http_code}\n' https://seu-hostname/api/device/setup-check/status retorna 401 sem credenciais. Depois execute curl --user bridge-user https://seu-hostname/api/device/setup-check/status, informe a senha quando solicitado e confirme uma resposta JSON com status 200.

Os certificados e o TLS dos BlackBerry antigos podem ser a parte mais trabalhosa. Confira data e hora do celular, cadeia de confiança e suporte ao protocolo negociado. Um certificado que funciona no notebook ainda pode falhar no aparelho. Alguns modelos exigem importar um certificado em formato DER. O README da ponte aborda cenários de certificados e proxies antigos; habilitar TLS obsoleto ou cifras mais fracas reduz a segurança, então isole qualquer endpoint legado necessário. HTTP sem criptografia expõe o tráfego entre o celular e a ponte e deve ficar restrito a uma rede de testes confiável e isolada.

2. Compile o WhatsApp J2ME para o seu servidor

O aplicativo precisa conhecer os dados da sua ponte. Um JAR encontrado por aí pode estar configurado para o servidor de outra pessoa.

O código do WhatsApp J2ME está disponível, e compilar por conta própria continua sendo uma opção. O caminho manual envolve uma cadeia de ferramentas Java ME antiga, pré-verificação de bytecode e empacotamento consistente de JAR/JAD, além dos dados corretos do servidor. Para quem quer usar o celular, preparar tudo isso pode consumir mais tempo do que o próprio aplicativo.

Para essa etapa, mantenho um compilador de WhatsApp J2ME na minha área de membros. Você informa os dados do servidor pelo navegador e compila um aplicativo configurado para aquele endereço, sem montar o ambiente de desenvolvimento antigo. A assinatura apoia meus projetos independentes e é necessária para compilar; dá para experimentar a configuração da conexão antes de assinar. A ferramenta gera o cliente do celular; a hospedagem e a manutenção da ponte continuam com você.

  1. Abra o compilador e informe o hostname ou IP, sem o prefixo de protocolo no campo de host.
  2. Escolha a porta e o protocolo publicados pelo seu proxy.
  3. Use / como caminho da API para a configuração na raiz mostrada acima. Uma instalação em subpasta exige uma rota correspondente no proxy e no cliente.
  4. Escolha o idioma do app e informe o mesmo Usuário da API e a mesma Senha da API criados com htpasswd.
  5. Confira o endereço final; depois entre na conta e ative a assinatura para compilar. As credenciais não ficam no rascunho do navegador; informe-as novamente após entrar.
  6. Baixe e extraia o ZIP com WhatsApp.jar, WhatsApp.jad e MANIFEST.MF.

Se mudar o endereço da ponte ou as credenciais depois, gere e instale uma nova compilação. As credenciais ficam no JAR, então mantenha o ZIP e os arquivos de instalação privados. Use HTTPS nas chamadas autenticadas da API.

3. Instale no BlackBerry

Mantenha o JAR e o JAD gerados juntos. Em um BlackBerry OS compatível, tente abrir o JAD pelo navegador do aparelho em um endereço acessível por ele. O JAD aponta para o JAR, então preserve a localização relativa dos arquivos e não altere o JAR após a compilação: o descritor inclui seu tamanho em bytes.

Se hospedar os arquivos, use text/vnd.sun.j2me.app-descriptor para .jad e application/java-archive para .jar. Mantenha os downloads de instalação privados, pois as compilações personalizadas contêm suas credenciais da API. Use uma pasta de downloads protegida e nunca publique o repositório da ponte ou sessions/. Dependendo do modelo e firmware, a instalação local também pode estar disponível; siga o método aceito pelo seu aparelho. Ter um pacote JAR/JAD não garante que todo BlackBerry vá aceitá-lo.

Autorize o acesso à rede quando o aplicativo solicitar. Políticas corporativas, permissões de aplicativos, configurações de APN e diferenças no transporte de rede podem impedir a conexão mesmo com o app instalado. Teste primeiro pelo Wi-Fi, quando disponível, e investigue os dados móveis separadamente.

4. Conecte sua conta do WhatsApp

Inicie a ponte e abra o aplicativo instalado no BlackBerry. Quando conseguir acessar o servidor, o fluxo de vinculação do app deve exibir um QR code.

No Android ou iPhone que já tem sua conta, abra WhatsApp → Aparelhos conectados → Conectar um aparelho e escaneie o código. Aguarde a conexão da ponte e o carregamento das conversas; depois envie uma mensagem curta para um contato de confiança e confira a resposta.

O celular moderno autoriza a sessão vinculada. Não é um novo cadastro por SMS no BlackBerry, nem exige transferir seu número para o aparelho antigo. O histórico pode ficar incompleto; comece testando mensagens de texto novas, enviadas e recebidas. Não presuma suporte a chamadas ou a todos os recursos do aplicativo oficial só porque existe uma tela correspondente no cliente.

Se o código expirar, atualize o fluxo de QR code. Quando encerrar a experiência, remova a sessão na lista de aparelhos conectados do WhatsApp.

Se alguma etapa falhar

  • O QR code não aparece: confira os logs do serviço, caminho do Node, dependências instaladas e permissão de escrita em sessions/. Verifique se o app foi compilado com host, porta, protocolo e caminho da API corretos.
  • Funciona no computador, mas não no BlackBerry: confira o acesso pela rede do celular, permissões do app, data e hora, confiança do certificado e compatibilidade TLS.
  • A instalação pelo JAD falha: verifique se o JAR indicado está acessível, se seu tamanho corresponde ao descritor e se o aparelho aceita o perfil Java ME do aplicativo.
  • Conectou, mas faltam conversas: aguarde a sincronização e teste uma mensagem de texto nova. Um cliente experimental vinculado pode não reproduzir todo o histórico ou os recursos oficiais.
  • O servidor para ao fechar o SSH: use o serviço systemd e confira a pasta de trabalho, em vez de iniciar o binário apenas em um terminal interativo.

A parte mais legal é a primeira mensagem digitada naquele teclado físico. Com a ponte acessível, configure sua compilação para BlackBerry na área de membros e leve os arquivos de instalação para o celular.

Referências de implementação: whatsapp-j2me, baileys-j2me e Baileys, biblioteca usada pela ponte para se conectar ao WhatsApp. Os projetos podem mudar conforme o protocolo evolui.

Comentários

Vai direto ao ponto — dúvidas, correções e causos de produção são bem-vindos.

Carregando comentários…

Publicado em lacorte.dev