Jump to content
tiagoban

Whatsapp em python

Recommended Posts

Estou testando o envio de mensagem para whatsapp via Python, queria testar enviar imagem tambem, porem nao sei qual o codigo usar, alguem sabe como proceder?

Segue o codigo utilizado até o momento.

 

from time import sleep
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
import socket

client = Client()

message_text='Oi, esta é uma mensagem automatica criada.' # message
no_of_message=1 # no. of time
moblie_no_list=[554899999999] # list of phone number

def element_presence(by,xpath,time):
    element_present = EC.presence_of_element_located((By.XPATH, xpath))
    WebDriverWait(driver, time).until(element_present)

def is_connected():
    try:
        # connect to the host -- tells us if the host is actually
        # reachable
        socket.create_connection(("www.google.com", 80))
        return True
    except :
        is_connected()
driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("http://web.whatsapp.com")
sleep(10) #wait time to scan the code in second

def send_whatsapp_msg(phone_no,text):
    driver.get("https://web.whatsapp.com/send?phone={}&source=&data=#".format(phone_no))
    try:
        driver.switch_to_alert().accept()
    except Exception as e:
        pass

    try:
        element_presence(By.XPATH,'//*[@id="main"]/footer/div[1]/div[2]/div/div[2]',30)
        txt_box=driver.find_element(By.XPATH , '//*[@id="main"]/footer/div[1]/div[2]/div/div[2]')
        global no_of_message
        for x in range(no_of_message):
            txt_box.send_keys(text)
            txt_box.send_keys("\n")

    except Exception as e:
        print("invailid phone no :"+str(phone_no))
for moblie_no in moblie_no_list:
    try:
        send_whatsapp_msg(moblie_no,message_text)

    except Exception as e:
        sleep(10)
        is_connected()

Share this post


Link to post
Share on other sites

Veja, se para fazer o envio o programa usa as leituras de XPATH do navegador via selenium, você precisará encontrar os XPATHs referentes ao envio da mensagem.

 

Faça simulações!

Pegue o fluxo dos seus cliques "humanizados" e então crie o fluxo "automatizado" via selenium!

 

1º passo

Abrir janela de conversa

 

2º passo

Clicar no icone de clips para abrir opções de anexos

 

3º passo

Clicar no icone de adicionar midia

 

4º passo

Buscar o local da imagem

 

5º passo

Adicionar uma legenda (ou nao) a foto e então clicar para enviar

 

Você terá que encontrar todos os XPATHs para esses processos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Claudia França
      https://gestaotecc.com.br/ebook/nomedoarvio.pdf      ==== === =======> esse é o link do e-book 
       
      {"email":"Subscriber Already Exists","convertkit":"Inactive","drip":"Inactive","activeCampaign":"Inactive","campaignMonitor":"Inactive","getResponse":"Inactive","aweber":"Inactive","markethero":"Inactive","SendinBlue":"Inactive","MailPoet":"Inactive","ConstantContact":"Inactive","mailchimp":"Inactive","WebHook":"Inactive","database":"Subscriber Already Exists"}  =============> é o erro depois que preenche o formulário. Eu recebo os dados e preciso que o link do arquivo carregue direto. 

      https://gestaotecc.com.br/wp-admin/admin-ajax.php?action=ulpb_formBuilderEmail_ajax               é o caminho de  onde eu devo por o código mas não sei exatamente onde pr as instruções. 
       
       
      ou aceito alguma outra ideia para resolver o problema para quando o usuário preencher o formulário o arquivo de downloads carregar automaticamente. 
    • By marcosAUG
      Crie uma classe que defina um vetor no plano. Crie métodos para permitir obter o versor, módulo e somar ao vetor uma série de outros vetores (usando *args), calcular o produto escalar e produto vetorial

      Uma duvida é de como usar a função *args nos métodos que o enunciado pede, e se tenho que mudar os métodos e atributos anteriores?
      class Vetor: def __init__(self, x, y, *args): self.__x = x self.__y = y def modulo(self): return (self.__x**2 + self.__y**2 )**(1/2) def versor(self): v1 = (self.__x)/(self.__x**2 + self.__y**2 )**(1/2) v2 = (self.__y)/(self.__x**2 + self.__y**2 )**(1/2) return v1, v2 def soma(self): pass def produto_escalar(self): pass def produto_vetorial(self): pass vetorA = Vetor(4,3) print("Modulo: ", vetorA.modulo()) print("Versor: ", vetorA.versor()) print("Soma: " )  
    • By FabianoSouza
      Na minha aplicação tem um código que usa a API do Whatsapp para enviar mensagem pelo PC...até aqui sem novidade.
      Tudo sempre funcionou no Firefox.
       
      Mas comecei a enfrentar problemas quando resolvi usar a versão Chromium do Edge.
      Notei que caso a mensagem exceda uma quantidade de caracteres, a API não lança o aplicativo desktop.
      O mesmo problema ocorre no Google Chrome.
       
      Comecei a fazer testes e conclui que, se a mensagem tiver mais do que 1.300 caracteres (incluindo espaços e quebra de linha), simples não funciona no Chrome e no Edge, mas funciona no Firefox.
      Reduzindo a quantidade de caracteres da mensagem, funciona nos dois navegadores.
       
      Quero saber o seguinte:
      1) Os colegas tem conhecimento sobre essa limitação ou é algo em meu ambiente de desenvolvimento ou na minha aplicação?
      2) Se isso for realmente uma limitação dos navegadores (que parece ser o mais provável), como faça para contornar?
       
       
      Obrigado.
    • By DoVale
      Olá,
       
      To concluindo uma aplicação com django que gera certificado em pdf..
       
      Tava tudo certo até fazer deploy no heroku e ter que criar um s3 na amazom para colocar os arquivos staticos
       
      Tenho um html com o template do certificado que recebe os dados dos alunos tranquilo, o background (template do certificado) não está carregando, quando estava localhost, com o caminho da pasta, tava funcionando, mas agora não.
       
      A tag img funciona tranquilamente, mas o background por css não.
      Aqui o código do template:
      <meta charset="utf-8" /> {% load static %} <style type="text/css"> @page { size: 1122.52px 1587.4px ; /*size: A4 landscape;*/ margin: 0cm; background-image: url({{bg_front}}); height: 1588; } </style> <page backimgx="{{bg_front}}"> <!-- <page_header> ... </page_header> <page_footer> ... </page_footer> --> <img src="{{bg_front}}"> <div class="front"><br><br> <p style="margin-top: 35px; margin-left: 900px; font-size: 22px; line-height: 150%;"> <b text-align='center'>{{cpf}}</b> </p> <br /><br /><br /><br /><br /><br /><br /><br /><br /> <!-- <center><h4 style="font-size: 23px;">Certificado</h4></center> --> <p style="margin: 60px ;margin-left: 140px; font-size: 22px; line-height: 150%;">{{text_front}}</p> </div> <p style="margin-top: 1120px ;margin-left: 518px; font-size: 22px; line-height: 150%;"> {{cpf}} </p> </div> </page> </div> Abaixo o trecho do código em python 
      class ViewPDF(View): def get(self, request, *args, **kwargs): data = {} pdf = True if kwargs['pk']: # # CARREGAR DADOS DO ALUNO # try: participant = Participant.objects.get(pk=kwargs['pk']) print(participant.cpf) if participant.name: certificate = Certificate.objects.get(pk=participant.certificate.pk) pathBack = str(certificate.template.template_back.url) pathFront = str(certificate.template.template_front.url) print(pathFront) # # CONFIGURA OS BACKGROUNDS E TEXTO # data['bg_front'] = pathFront data['bg_back'] = pathBack setting = certificate.template.settings start_date = datetime.strftime(certificate.start_date,'%d/%m/%Y') end_date = datetime.strftime(certificate.start_date,'%d/%m/%Y') data['text_front'] = setting.replace('<<nome>>',participant.name).replace('<<cpf>>',str(participant.cpf)).replace('<<ch>>',str(certificate.ch)).replace('<<instituicao>>',str(certificate.institution)).replace('<<DataInicio>>',start_date).replace('<<DataFim>>',end_date) data['cpf'] = participant.cpf pdf = render_to_pdf('app_certificates/body_front_pdf.html', data) return HttpResponse(pdf, content_type='application/pdf') except TypeError as e: return HttpResponse(e) Já tentei várias coisas, o problema me parece ser com o css, pois funciona na tag img
       
       
    • By klonder
      Olá a todos(as)!
      Estava há 3 dias pesquisando sobre como resolver um problema que estava enfrentando em meu sistema, que consistia no seguinte:
      Implantar um Combobox com dados vindos do banco. Esse combobox deveria ser editável e apresentar os valores em seu popup suspenso. À medida em que o usuário fosse digitando, o autocomplete faria a busca em todos os valores já cadastrados e mostraria os compatíveis (procedimento até então comum em qualquer autocomplete). Todavia, o combobox só poderia perder o foco caso o texto inserido fosse exatamente igual a um dos valores existentes no popup, ou seja, não poderia ser  inserido nada que já não estivesse cadastrado anteriormente e presente na lista de valores.
      Após muito pesquisar, cheguei a um resultado muito satisfatório que compartilho com vocês, visto que varri a internet inteira à procura desse código e não encontrei em lugar nenhum. PyQt5 é extremamente pobre em tutoriais, principalmente em português.
       
      Segue o código que poderá ajudar quem precise:
      from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QComboBox, QLineEdit, QCompleter from PyQt5.QtCore import QSize, Qt, QSortFilterProxyModel, QStringListModel class Ui_Autocomplete(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 200, 800, 600) self.setWindowTitle('Autocomplete com combobox') self.cboxEstado = QComboBox(self) self.cboxEstado.move(50, 50) self.cboxEstado.addItem("Acre") self.cboxEstado.addItem("Amazonas") self.cboxEstado.addItem("Amapá") self.cboxEstado.addItem("Pará") self.cboxEstado.addItem("Rondônia") self.cboxEstado.addItem("Roraima") self.cboxEstado.addItem("Tocantins") self.cboxEstado.addItem("Distrito Federal") self.cboxEstado.addItem("Goiás") self.cboxEstado.addItem("Mato Grosso") self.cboxEstado.addItem("Mato Grosso do Sul") self.cboxEstado.addItem("Alagoas") self.cboxEstado.addItem("Bahia") self.cboxEstado.addItem("Ceará") self.cboxEstado.addItem("Maranhão") self.cboxEstado.addItem("Piauí") self.cboxEstado.addItem("Pernambuco") self.cboxEstado.addItem("Paraíba") self.cboxEstado.addItem("Rio Grande do Norte") self.cboxEstado.addItem("Sergipe") self.cboxEstado.addItem("Paraná") self.cboxEstado.addItem("Rio Grande do Sul") self.cboxEstado.addItem("Santa Catarina") self.cboxEstado.addItem("Espírito Santo") self.cboxEstado.addItem("Minas Gerais") self.cboxEstado.addItem("São Paulo") self.cboxEstado.addItem("Rio de Janeiro") self.cboxEstado.setEditable(True) self.cboxEstado.completer().setCompletionMode(QCompleter.PopupCompletion) self.cboxEstado.completer().setFilterMode(Qt.MatchContains) self.cboxEstado.completer().setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.cboxEstado.focusOutEvent = self.pedeuFoco self.leRegiao = QLineEdit(self) self.leRegiao.move(250,50) self.leRegiao.resize(200, 22) def pedeuFoco(self,event): occur = 0 for i in range(len(self.cboxEstado)): if self.cboxEstado.currentText() == self.cboxEstado.itemText(i): occur = occur+1 if occur == 0: self.cboxEstado.lineEdit().setFocus() self.cboxEstado.lineEdit().selectAll() else: #Retira o cursor do widget QComboBox.focusOutEvent(self.cboxEstado,event) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = Ui_Autocomplete() mainWin.show() sys.exit(app.exec_())  
       
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.