Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adição de função para reconhecer número do contato do chat aberto #59

Open
JulioC354R opened this issue Dec 20, 2023 · 0 comments
Open

Comments

@JulioC354R
Copy link

Olá caro Lucas, eu estou fazendo um projeto de chatbot no whatsapp web e como mencionei, consegui criar uma função para reconhecer o número do contato isso enquanto o chat estiver aberto, e também para reconhecer o número de uma pessoa no grupo, na verdade o número da pessoa a mandar a ultima mensagem. Pretendo usar isso para saber com quem o bot tá falando, no meu caso para dar permissão de certas coisas apenas a n;úmeros específicos e também para usar o número como um ID para indentificar os players do meu RPG.

Vou mostrar o meu código e explicar por partes, pode ser um pouco confuso porque sou um iniciante mas acredito que dê pra entender, se puder comentar algo que devo melhorar apenas dizer.

def get_number(self):
        '''Pega o numero da ultima mensagem do chat/grupo que está aberto por meio dos xpaths'''
        time.sleep(0.25)
        try:
            try:
                #pega todos os elementos (aquele nome em do contato que fica na mensagem no grupo)
                #no whatsapp pt-br ele fica com esse texto dentro do elemento da classe _3B19s, acredito que dê pra adaptar pra inglês
                xpath_numero = "//div[@class='_3B19s']//*[contains(@aria-label, 'Abrir os dados da conversa com')]"
                elements = self.browser.find_elements(By.XPATH, xpath_numero)
                #clica no último, sendo assim, clica no elemento da ultima mensagem.
                last = elements[-1]
                last.click()
                time.sleep(0.5)
                
                
            except:
                #xpath da caixa de contato, a que fica em cima do chat e tem os detalhes do contato
                details = self.browser.find_element(By.CLASS_NAME, '_2au8k')
                details.click()
                time.sleep(0.5)
                # Inicializa uma lista de XPath a serem tentados em ordem, esses Xpaths são onde tem o número de telefone
                # os xpaths são diferentes pois no whatsapp ele difere de contato salvo, não salvo e comercial assim os números ficam em lugares diferentes
                
            xpath_list = [
                '//span[@class="_11JPr selectable-text copyable-text"]//span[@class="enbbiyaj e1gr2w1z hp667wtd"]',
                '//div[@class="Mk0Bp _30scZ"]/span[@class="l7jjieqr cw3vfol9 _11JPr selectable-text copyable-text"]',
                '//span[@class="_11JPr selectable-text copyable-text"]//span[@class="fe5nidar fs7pz031 tl2vja3b e1gr2w1z"]']
            # Inicializa uma lista para armazenar os números de telefone encontrados
            numeros_de_telefone = []

            # Itera sobre os XPath
            for xpath_numero in xpath_list:
                try:
                    #se achar nesses xpath um texto que tenha a formatação de um número de telefone (atualmente só funcionou pra números PT-BR)
                    #ele vai colocar dentro da lista e se achar algum ele para  o loop
                    
                    elemento_numero = self.browser.find_element(By.XPATH, xpath_numero)
                    texto_numero = elemento_numero.text
                    # Define a expressão regular para extrair números de telefone
                    padrao_telefone = re.compile(r'\+\d{2} \d{2} \d{4,5}-\d{4}')
                    # Encontra números de telefone usando a expressão regular
                    numeros_de_telefone = padrao_telefone.findall(texto_numero)
                    # Se encontrou o número, sai do loop
                    if numeros_de_telefone:
                        break

                except:
                    # Se não encontrou o elemento, continua para o próximo XPath
                    continue

            #números de telefone encontrados
            number = numeros_de_telefone[0]


            xpath_botao_fechar = self.browser.find_element(By.XPATH, '//div[@role="button" and @aria-label="Fechar"]')
            xpath_botao_fechar.click()
            
            return number`

Explicando de onde tirei os xpaths:

Pra pegar o número de alguém que mandou a ultima mensagem no grupo eu peguei a classe do chat todo, no caso somente onde tem as mensagens e procuro pelo elemento que possua na aria-label 'Abrir os dados da conversa com', que cai diretamente no ícone onde tem a foto ou a letra inicial do contato/número, sendo ele conhecido ou não, o comando faz com que ele procure todos esses ícones e ao clicar abre a área de dados do contato que mandou a ultima mensagem.

image

Se ele não conseguir achar o ícone no chat quer dizer que a conversa é privada, então ao dar except (ele não encontrou nenhum ícone) ele vai clicar na área onde tem os detalhes do contato, a região em cima como você já fez no def que pega dados do contato.

Eu utilizei isso também para fazer o bot reconhecer qual conversa é privada ou em grupo, pode ser útil.

try:
      #pega todos os elementos (aquele nome em do contato que fica na mensagem no grupo)
      #no whatsapp pt-br ele fica com esse texto dentro do elemento da classe _3B19s, acredito que dê pra adaptar pra inglês
      xpath_numero = "//div[@class='_3B19s']//*[contains(@aria-label, 'Abrir os dados da conversa com')]"
      elements = self.browser.find_elements(By.XPATH, xpath_numero)
      #clica no último, sendo assim, clica no elemento da ultima mensagem.
      last = elements[-1]
      last.click()
      time.sleep(0.5)
                
                
except:
    #xpath da caixa de contato, a que fica em cima do chat e tem os detalhes do contato
    details = self.browser.find_element(By.CLASS_NAME, '_2au8k')
    details.click()
    time.sleep(0.5)
    # Inicializa uma lista de XPath a serem tentados em ordem, esses Xpaths são onde tem o número de telefone
    # os xpaths são diferentes pois no whatsapp ele difere de contato salvo, não salvo e comercial assim os números ficam em lugares diferentes

Depois disso eu tenho a parte dos xpaths_list.
Basicamente no whatsapp web o número fica em 3 lugares e em 3 tipos de contato, o contato conhecido, o desconhecido e o comercial, esses xpaths são dos três, ao abrir os dados do contato ele vai procurar pelo texto que se enquadre no número de telefone nesses três lugares até achar o número.

Contato conhecido:

image

Contato Desconhecido

image

Contato Comercial

image

Agora o programa vai pra parte onde ele verifica cada um desses 3 lugares procurando pelo número.

Depois fiz ele clicar no botão fechar passando o xpath

xpath_botao_fechar = self.browser.find_element(By.XPATH, '//div[@role="button" and @aria-label="Fechar"]') xpath_botao_fechar.click()

Por enquanto é isso, eu não utilizo o AWP porque quis fazer por mim mesmo mas me inspiro no teu projeto, forças mano e um grande abraço.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant