Instruções para aquisição

Instale o zBot (para Windows). Rode este sistema no seu computador e vários outros que podem ser baixados diretamente pelo zBot ou criados por você mesmo(a)!

Detalhes do Sistema

Envio de mensagens para grupos

09/12/2023 | Build: 107
Do pacote: Gestão de grupos Whats

Descrição: Funções para obter a lista de grupos que você participa, identificar grupos que você não participa mais ou foi removido. Também tem funções para facilitar o envio de mensagens para seus grupos

Tutorial em Vídeo

Código do script

Este script também pode ser baixado diretamente pelo software zBot
&CriarBotao("(1) Abrir Whats Web";"abrir whatsapp web")
&CriarBotao("(2) Exibir grupos";"exibir lista grupos")
//&CriarBotao("abrir grupo";"abrir grupo")
&CriarBotaoPopup("Configurações...";"Configurações, Abrir grupo atual, Eliminar repetidos, Zerar status"; "configurações, abrir grupo, eliminar repetidos, zerar status")
//&CriarBotao("Extrair lista de grupos";"extrair todos os grupos")
&CriarBotaoPopup("Extrair...";"Configurações, Extrair lista de seus grupos, Extrair links de grupo da página aberta";"configurações, extrair todos os grupos, extrair dados";100)
&CriarBotaoPopup("Enviar...";"Definir mensagem, Enviar mensagem para todos, Efetuar teste (navega nos grupos mas não submete a mensagem, Zerar status dos seus grupos)";"definir mensagem, enviar produção, enviar teste, zerar status";100)
//&CriarBotao("Eliminar repetidos";"eliminar repetidos")
//&CriarBotao("obter nome grupo";"obter nome grupo")
//&CriarBotao("Definir mensagem";"definir mensagem";200) //*
//&CriarBotao("Enviar mensagem";"efetuar envios";200) //*


#enviar teste
   [teste] = "sim"
   &BlocoExec("efetuar envios")[0] //*
#

#enviar produção
   [teste] = "não"
   &BlocoExec("efetuar envios")[0] //*
#

#zerar status
   &TbComando("primeiro")[0]
   &marcador("loop zerar")
   &TbValorDefinir("status"; "")[0] //*
   &TbComando("próximo")[0]
   &Se([último resultado];igual;"OK")
      &VaiPara("loop zerar")
   .fimse   
   &TbComando("primeiro")[0]
#

// Função principal que:
// 1- Envia a mensagem
// 2- vai para o próximo grupo
// O que importa é o seguinte: com uma busca, manda para um grupo. Qualquer que seja o grupo usado para o envio, não será repetido
#efetuar envios   
   [envios] = 0
   [lista enviados] = ""
   [erros] = 0
   &TbComando("primeiro")[0]
   [qtd_zerar] = 0
   
   &Marcador("loop envios")    
   
   &Se([qtd_zerar];#-/=;3)
      [qtd_zerar] = 0
      &StatusInserir("Reiniciando navegador para não ficar pesado...";"preto")[0]
      &BlocoExec("abrir whatsapp web")[20] //*
      &BlocoExec("exibir lista grupos")[3] //*
      &StatusInserirExtra("OK";"sucesso")[0]      
   .fimse   
    
   //* Pega o nome do grupo atualmente aberto
   [nome do grupo] = ""
   &TbLerCampo("nome")[0] //*
   
   //* Se erros #-/ 5, vai para o próximo grupo
   &Se([erros];maior;5)
      [erros] = 0
      &StatusInserir("Desisti do grupo [nome]. Indo para o próximo...";"erro")[0]
      &VaiPara("continuar")
   .fimse  
   
   //* se status não é vazio ou se ativo = não. Pula o grupo
   &TbLerCampo("status")[0] //*
   &Se([status];diferente;"")
      &StatusInserir("Só há envio quando status é vazio";"erro")[0]
      &VaiPara("continuar")   
   .fimse
   
   //* se status não é vazio ou se ativo = não. Pula o grupo
   &TbLerCampo("ativo")[0] //*
   &Se([ativo];igual;"não")
      &StatusInserir("O grupo [nome] está desativado na tabela";"erro")[0]
      &VaiPara("continuar")   
   .fimse           
   
   //* Abre o grupo selecionado na tabela
   &StatusInserir("Abrindo grupo [nome]...";"preto")[0]
   &BlocoExec("abrir grupo")[2] //* Abre o grupo atual da tabela
   
   // abrir grupo seta a variável falha abrir
   &Se([falha abrir];igual;"sim")      
      &StatusInserir("Abertura não detectada: [nome]";"erro")[0]      
      &StatusInserir("Pulando para o próximo grupo";"alerta")[0]
      &VaiPara("continuar")
   .fimse
   
   &StatusInserirExtra("texto";"cor")[0] //* cor: erro, sucesso, alerta, preto, cinza, importante
   &StatusInserirExtra("OK";"sucesso")[0]
   
   &ValorInc("qtd_zerar";1)[0] //*
   
   &StatusInserir("Verificando nome do grupo...";"preto")[0]
   &BlocoExec("obter nome grupo")[0] //* obtém o nome do grupo aberto e coloca em "nome do grupo"
   &StatusInserirExtra("OK";"sucesso")[0]      
   &Se([nome do grupo];igual;"")
      &ValorInc("erros";1)[0] //*
      &StatusInserir("Nome vazio. Tentando novamente... ([erros])";"erro")[0]
      //&StatusInserir("Pausa de 5 segundos para aguardar carregamento de dados...";"alerta")[5]            
      &VaiPara("loop envios")[2] //* Se for vazio, tenta novamente... Pode ser só questão de espaerar mais                
   .fimse    
   
   // Verifica se o "nome do grupo" já foi processado
   &TextoTemValorLista([nome do grupo];[lista enviados];"resultado")[0] //* Retorna sim | não
   &Se([resultado];igual;"sim")
      &ValorInc("erros";1)[0] //*
      &StatusInserir("Já processou [nome do grupo]. Indo para o próximo";"erro")[0]
      //&Mensagem([lista enviados])      
      [erros] = 0
      &VaiPara("continuar")
   .senao  
      &StatusInserir("Enviando para: [nome do grupo]";"importante")[0]    
      &ValorInserirLinha("lista enviados";[nome do grupo])[2] //*
            
      &Se([teste];igual;"não")      
         // Faz o envio do texto ou da imagem         
         &Se([local imagem];diferente;"")            
            &BlocoExec("enviar imagem")[0] //*
            &StatusInserir("Imagem enviada!";"sucesso")[0]
         .senao            
            &BlocoExec("enviar texto")
            &StatusInserir("Texto enviado!";"sucesso")[0]
         .fimse
      .senao
         &StatusInserir("Está em modo teste (mensagem não enviada)";"preto")[1]
         &StatusInserir("Neste ponto a mensagem seria enviada!";"sucesso")[1]          
      .fimse   
      // // //  
      
            
      [erros] = 0
      &ValorInc("envios";1)[0] //*        
      
      &TextoObterDataHora("hoje")[0] //*
      &TbValorDefinir("status"; [hoje])[0] //*     
   .fimse  
   
   // Vai para próximo registro da linha e continua o envio se houver mais
   &Marcador("continuar")
   &TbComando("próximo")[0]
   &Se([último resultado];igual;"OK")
      &VaiPara("loop envios")
   .fimse 
   &StatusInserir("Fim da tabela";"preto")[0]                                     
#

#abrir grupo
   [falha abrir] = "não"
   [tentativas] = 0
   &TbLerCampo("nome")[0] //*
   &NavegadorClicarPerguntar(11209140247319;"local do campo de pesquisa")[1] //*
   &DigitarEsc()[0.5]
   &NavegadorClicarPerguntar(11209140247319;"local do campo de pesquisa")[1] //*
   &ColarTexto([nome])[2.5]
   &Pausar([pausa extra])
   &DigitarID(40)[2] //* seta para baixo    
   
   // Agora aguarda até o grupo abrir
   [tentativas]=1
   &Marcador("loop abrir grupo")
   &NavegadorTextoObter("texto navegador")[0] //*
   
   &TextoTem([texto navegador];"para o grupo porque";"retorno")[0] //* Retorna sim | não
   &Se([retorno];igual;"sim")
      &StatusInserir("Você não está mais neste grupo";"erro")[0]
      [falha abrir] = "sim"
      &TbValorDefinir("ativo"; "não")[0] //*
      &TbValorDefinir("obs"; "Você não está neste grupo")[0] //*
      &VaiPara("sair abrir")        
   .fimse
   
   &TextoTem([texto navegador];"você não participa mais";"retorno")[0] //* Retorna sim | não
   &Se([retorno];igual;"sim")
      &StatusInserir("Você não está mais neste grupo";"erro")[0]
      [falha abrir] = "sim"
      &TbValorDefinir("ativo"; "não")[0] //*
      &TbValorDefinir("obs"; "Você não está neste grupo")[0] //*
      &VaiPara("sair abrir")        
   .fimse   
   
   &TextoTem([texto navegador];"omente admin";"retorno")[0] //* Retorna sim | não
   &Se([retorno];igual;"sim")
      &StatusInserir("Só admins podem enviar mensagem neste grupo";"erro")[0]
      [falha abrir] = "sim"
      &TbValorDefinir("ativo"; "não")[0] //*
      &TbValorDefinir("obs"; "Só admins podem enviar mensagem")[0] //*
      &VaiPara("sair abrir")   
   .fimse
   
   &TextoTem([texto navegador];"Digite uma mensagem";"retorno")[0] //* Retorna sim | não
   &Se([retorno];igual;"não")
      &StatusInserir("Aguardando grupo abrir... [tentativas]";"alerta")[0]      
      &Se([tentativas];menor;5)
         &ValorInc("tentativas";1)[2] //*
         &VaiPara("loop abrir grupo")      
      .senao   
         [falha abrir] = "sim"
         &StatusInserir("Não foi detectada a abertura do grupo";"erro")[0]                     
      .fimse   
   .fimse  
   
   &Marcador("sair abrir")             
#


#definir mensagem
   &ValorPedirVarios("Mensagem para enviar no grupo"; "local imagem, mensagem")[0] //*
#
#eliminar repetidos
   &TbExcluirRepetidos("nome")[0] //*
#

//* Pega o nome do grupo abrindo os detalhes no painel direito
#obter nome grupo
   [nome do grupo] = ""
   &Pausar([pausa extra])
   &NavegadorClicarPerguntar(11209122038686;"Local do nome do grupo no painel direito")[1.5] //*
   &NavegadorTextoObter("texto navegador")[0] //*
   &TextoEntre([texto navegador];"Dados do grupo";"Grupo · Membros:";"nome do grupo")[0] //*   
   &NavegadorClicarPerguntar(11209122038687;"Local para fechar os dados do grupo")[1] //*
#

#abrir whatsapp web
   [whatsapp_url] = "https://web.whatsapp.com/send?phone="
   &NavegadorIr([whatsapp_url])[1] //*
   &NavegadorPosicionar(5;5;925;675)[0] //* topo, esquerda, largura, altura
   &MonitorEscala("escala") //* retorna 100, 125, 150 etc.
   &Se([escala];diferente;100)
      &NavegadorPosicionar(5;5;1155;775)[0]
   .fimse
#

#configurações
   &ValorPedirVarios("Configurações";"Qtd. rolar lista de grupos, pausa extra")[0] //*      
#

// pega a lista de grupos possível na listagem atual
#obter lista grupos  
   &StatusInserir("Obtendo texto do Whatsapp web...";"preto")[0]
   &NavegadorFonteObter("texto navegador")[0] //*
   &StatusInserirExtra("OK";"sucesso")[0]  
      
   &StatusInserir("Localizando nomes dos grupos...";"preto")[0]  
   &TextoExtrairEntre([texto navegador];"#-\span dir=auto title=";" aria";"lista grupos") [0]
   &StatusInserirExtra("OK";"sucesso")[0]    
#

// comandos para listar os grupos no Whatsapp web
#exibir lista grupos
   &NavegadorClicarPerguntar(11205164212535;"Botão 'Filtrar'")[1] //*
   &NavegadorClicarPerguntar(11205164406862;"Opção 'Grupos'")[0.5] //*
   &NavegadorClicarPerguntar(11205164406862;"Opção 'Grupos'")[1] //*
   &NavegadorClicarPerguntar(11205164406863;"Local do primeiro resultado")[0] //*       
#


// usa a variável [lista final] para colocar os grupos inéditos na tabela
#inserir grupos na tabela
   &TextoEliminarRepetidos([lista final];"lista final")[0] //*
   &TextoSubstituir([lista final]; " *pontoevirgula*"; " "; "lista final")[0] //*
   &TextoDecodificarHTML([lista final]; "lista final")[0] //*

   &TextoQtdLinhas([lista final]; "qtd")[0] //*   
   &Repetir([qtd]) //* a variável _indice terá o número do ciclo atual
      [grupo atual] = [lista final*[_indice]]
      [linha] = ""                 
      &TbLocalizar("nome";[grupo atual]; "linha")[0] //*            
      &Se([linha*nome];diferente;[grupo atual])                                  
         &TbInserir("nome";"[grupo atual]")[0] //*
      .fimse
   .fimrepetir
#


// ***
// Função principal para extrair os grupos listados
// usa #exibir lista grupos, #obter lista grupos, #inserir grupos na tabela
#extrair todos os grupos
   //&BlocoExec("exibir lista grupos")[0] //*
   &BlocoExec("obter lista grupos")[0] //*
   &Repetir([Qtd. rolar lista de grupos]) //* a variável _indice terá o número do ciclo atual
      &ValorInserirLinha("lista final";[lista grupos]")[0] //*
      &NavegadorClicarPerguntar(11209093941608;"local para rolar a lista de grupos")[2] //*
   .fimrepetir
   //[lista final] = [lista grupos]
   &BlocoExec("inserir grupos na tabela")[0] //*
#


// Extrai emails e telefones da variável "dados" e insere na tabela os que não existirem
#extrair dados
    &TextoGerarIdUnico("id único")[0] //*
    &TextoObterDataHora("hoje")[0] //*
    &TextoDataInfo([hoje]; "secao_data"; "hoje")[0] //*  

    // obtém os links contendo chat.whatsapp do texto fornecido   
    &NavegadorTextoObter("conteúdo")[0] //*
    &TextoExtrairContendo([conteúdo]; "chat.whatsapp.com"; "dados"; "")[0] //*        
        
    &TextoQtdLinhas([dados]; "qtd")[0] //*
    &Repetir([qtd])
      [info] = [dados*[_indice]]      
      &Se([info];diferente;"") 
         &TextoTemValorLista([info];[ignorar se tiver];"localizou")[0] //* Retorna sim | não
         &Se([localizou];diferente;"sim")  
            &TbLocalizar("url";[info]; "localizou")[0] //*         
            &Se([localizou*url];diferente;[info])    
               // monta a url final do convite de chat
               [info] = "https:[info]"
               
               // Elimina links inválidos
               &TextoTerminaCom([info];".";"retorno")[0] //* Retorna sim | não
               &Se([retorno];igual;"sim")
                  &VaiPara("saiu")
               .fimse
               
               &TextoTem([info];"https://chat.whatsapp.com";"retorno")[0] //* Retorna sim | não
               &Se([retorno];diferente;"sim")
                  &VaiPara("saiu")
               .fimse      
               
               &Se([info];igual;"https://chat.whatsapp.com")
                  &VaiPara("saiu")
               .fimse                            
                                                  
               // insere os links na tabela
               &TbInserir("url,data_cadastro,id_unico";"[info],[hoje],[id único]")[0] //*
               &ValorInc("inseridos";1)[0] //*
               &StatusInserir("Inserido: [info] (total: [inseridos])";"sucesso")[0]
               
               &Marcador("saiu")
            .senao
               &StatusInserir("Já tem no banco: [info]";"erro")[0]   
            .fimse
         .senao
            &StatusInserir("Lista de exclusão: [info]";"erro")[0]         
         .fimse      
      .fimse       
    .fimrepetir
#


#enviar texto
&Se([mensagem];"diferente";"") //* teste -#-/ igual, diferente, contém, não contém, começa, não começa, termina, não termina
    &NavegadorClicarPerguntar(20231115151639400;"Indique o local do campo onde digita a mensagem")[0.5] //*
    &ColarTexto([mensagem])[1] //* Cola um valor definido no parâmetro
    &Pausar([pausa operacional extra])
    &NavegadorClicarPerguntar(20231115151639401;"Local do botão para enviar a mensagem")[2] //*
.fimse
#

#enviar imagem
&Se([local imagem];"diferente";"") //* teste -#-/ igual, diferente, contém, não contém, começa, não começa, termina, não termina
    &NavegadorClicarPerguntar(20231115151639400;"Indique o local do campo onde digita a mensagem")[0.5] //*
    &ColarArquivo([local imagem])[5] //*
    &Pausar([pausa operacional extra])
    &Se([mensagem];"diferente";"")
        &NavegadorClicarPerguntar(20231115151639402;"Local do campo de legenda")[1] //*
        &ColarTexto([mensagem])[1] //* Cola um valor definido no parâmetro       
    .fimse
    &NavegadorClicarPerguntar(20231115151639403;"Local do botão para enviar a imagem")[2] //*
    &Pausar([pausa operacional extra])    
.fimse
#

Termos gerais dos scripts

Os scritps gratuitos ou pagos tem como objetivo disponibilizar funções ou demonstrar possíveis aplicações que podem ser criadas usando a linguagem de programação de scripts do zBot.
Seu código-fonte é fornecido e pode ser livremente estudado, adaptado ou alterado pelo usuário que o adquire. Eventualmente são usados links ou exemplos de funções interagindo com sistemas ou sites populares, mas o zBot não tem nenhum vínculo, propriedade nem parceria com quaisquer produtos de terceiros, nem se responsabiliza por nenhuma consequência de sua utilização, cabendo exclusivamente ao usuário a total responsabilidade sobre isso, sempre levando em conta a licitide de sua aplicação e eventuais termos de uso ou propriedade de terceiros que devam ser considerados.
 Fale conosco