WhatsApp — conexão

Pareia o número da empresa com este servidor lendo um QR code, como no WhatsApp Web.

<%# O aviso fica na TELA, não só no código: quem parear precisa saber o que está aceitando. %>

⚠️ Este canal não é oficial.

A conexão por QR usa a porta do WhatsApp Web por engenharia reversa. É gratuita e ilimitada, mas está fora dos Termos do WhatsApp — a Meta pode banir o número sem aviso. Use um chip dedicado, nunca o número principal da operação.

Disparo em rajada é o que mais causa banimento. O intervalo entre mensagens fica em <%= link_to 'Configurações → Notificações', admin_configuracao_notificacao_path, data: { turbo: false }, class: 'underline hover:text-white' %> (hoje: <%= @config.intervalo_envio %>s).

<% if @estado['conectado'] %>

Conectado

Número <%= @estado['numero'] %> <% if @config.whatsapp_conectado_em %> · desde <%= l @config.whatsapp_conectado_em, format: :short rescue @config.whatsapp_conectado_em %><% end %>

<%= form_with url: testar_admin_whatsapp_sessao_path, method: :post, data: { turbo: false }, class: 'flex flex-wrap items-end gap-3' do |f| %>
<%= f.label :numero, 'Enviar teste para', class: 'block text-gray-400 text-sm mb-1' %> <%= f.text_field :numero, placeholder: '(11) 92005-1157', class: 'bg-[#141414] border border-white/10 rounded-xl text-white text-sm px-3 py-2.5 focus:outline-none focus:border-orange-500' %>
<%= f.submit 'Enviar teste', class: 'px-4 py-2.5 rounded-xl text-sm font-semibold bg-orange-500 text-black hover:bg-orange-400 cursor-pointer' %> <% end %> <%= button_to 'Desconectar', desconectar_admin_whatsapp_sessao_path, method: :delete, form: { data: { turbo_confirm: 'Isso encerra a sessão e para TODOS os envios de WhatsApp até você ler o QR de novo. Confirmar?' } }, class: 'text-red-400 hover:text-red-300 text-sm' %>
<% elsif @estado['qr'].present? %>

Leia o QR code

No celular do chip dedicado: WhatsApp → Aparelhos conectadosConectar um aparelho → aponte para o código abaixo.

<%# O QR expira em ~20s e a ponte gera outro — o polling abaixo troca a imagem sozinho, senão o operador ficaria lendo um código morto. %> QR code do WhatsApp

O código se renova sozinho a cada poucos segundos.

<% else %>

Desconectado

<%= @estado['erro'].presence || @estado['ultimo_erro'].presence || 'A ponte ainda não gerou um QR code. Aguarde alguns segundos e recarregue.' %>

<% unless @cliente.configurado? %>

Falta configurar a ponte: defina WHATSAPP_TOKEN no .env (o mesmo valor do container whatsapp) e suba os containers.

<% end %>
<% end %>