├── .DS_Store ├── README.md ├── busca_automatica_google ├── .DS_Store ├── README.md ├── busca_google.py └── screen.png ├── decifra_base64.py ├── instagrambot ├── README.md ├── geckodriver ├── instagram_curtir_fotos.py ├── instagrambot.py ├── instagrambot_baixa_seguidores.py ├── instagrambot_segue_following.py └── instagrambot_seguidores_lista_excel_mais_que_1_comentario.py ├── whatsappbot ├── README.md ├── whasappbot-listadecontato-EXCEL.py ├── whatsappbot-listadecontatos.py └── whatsappbot.py └── wppmessage ├── README.md ├── imagens ├── wppmessage-error.png ├── wppmessage.png ├── wppmessagemulti-screen.png └── wppmessagemultiplosnumeros.png ├── versao1_0_single_number ├── README.md ├── imagens │ ├── wppmessage-error.png │ └── wppmessage.png ├── wppmessage.py └── wppmessage_rc.py └── versao1_1_multiple_numbers ├── README.md ├── formatacao-planilha-de-numeros.xlsx ├── wppmessage.py └── wppmessage_rc.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

PROJETOS UTILIZANDO A LINGUAGEM PYTHON

9 | 10 | 11 | 12 | ## Sobre 13 | 14 | [![tela inicial][product-screenshot]]() 15 | 16 | Nesse repositório estarei deixando toda aplicação feita com esta linguagem. 17 | 18 | 19 | 20 | ## Contato 21 | 22 | Flávio Oliveira - [LinkedIn](https://www.linkedin.com/in/fladoliveira/) 23 | 24 | Link do Projeto: [https://github.com/oliveiradeflavio/python](https://github.com/oliveiradeflavio/python) 25 | 26 | 27 | 28 | 29 | 30 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 31 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 32 | [product-screenshot]: https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 33 | -------------------------------------------------------------------------------- /busca_automatica_google/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/busca_automatica_google/.DS_Store -------------------------------------------------------------------------------- /busca_automatica_google/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

FAZENDO BUSCAS AUTOMÁTICAS NO GOOGLE

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | [![tela inicial][product-screenshot]]() 15 | 16 | Busca automática no Google. O Bot irá fazer uma busca por palavras chaves pré-definidas 17 | 18 | ### Construído com 19 | 20 | * [Python](https://www.python.org/) 21 | * [Selenium](https://www.selenium.dev/documentation/webdriver/getting_started/install_library/) 22 | 23 | 24 | 25 | 26 | ## Começando 27 | 28 | O bot irá logar no site www.google.com.br, e irá fazer uma busca pelas palavras chaves que está configurado no código. Após localizar o item corretor, ele irá clicar nesse item. Em seguida, ele irá acessar um servidor proxy, e novamente fazer a busca, utilizando as palavras chaves. Esse processo irá ficar em looping até ser interrompido. 29 | 30 | ### Pré-requisitos 31 | 32 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 33 | * python 34 | ```sh 35 | https://www.python.org/ 36 | ``` 37 | 38 | ### Instalação de bibliotecas 39 | 40 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 41 | ```sh 42 | pip install selenium 43 | ``` 44 | ```sh 45 | pip install webdriver-manager 46 | ``` 47 | 48 | 49 | ## Demo 50 | 51 | ![Apresentação](https://youtu.be/P0WvLTcUFbg) 52 | 53 | 54 | 55 | ## Contato 56 | 57 | Flávio Oliveira - [LinkedIn](https://www.linkedin.com/in/fladoliveira/) 58 | 59 | Link do Projeto: [https://github.com/oliveiradeflavio/python/tree/master/busca_automatica_google](https://github.com/oliveiradeflavio/python/tree/master/busca_automatica_google) 60 | 61 | 62 | 63 | 64 | 65 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 66 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 67 | [product-screenshot]: https://github.com/oliveiradeflavio/python/blob/master/busca_automatica_google/screen.png?raw=true 68 | -------------------------------------------------------------------------------- /busca_automatica_google/busca_google.py: -------------------------------------------------------------------------------- 1 | # import das bibs 2 | from random import random 3 | from select import select 4 | from selenium import webdriver 5 | from selenium.webdriver.chrome.options import Options 6 | from webdriver_manager.chrome import ChromeDriverManager 7 | from selenium.webdriver.common.by import By 8 | from selenium.webdriver.common.keys import Keys 9 | from selenium.webdriver.support.ui import Select 10 | import time 11 | import requests 12 | import random 13 | from selenium.common.exceptions import NoSuchElementException 14 | 15 | class Busca: 16 | def __init__(self, url, palavra, quero_esse_link, total_paginas_busca): 17 | self.url = url 18 | self.palavra = palavra 19 | self.quero_esse_link = quero_esse_link 20 | self.total_paginas_busca = total_paginas_busca 21 | 22 | #start no google chrome maximizado, Configurando as opções dos drivers do Selenium 23 | chrome_options = Options() 24 | chrome_options.add_argument("--start-maximized") 25 | chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) 26 | #chrome_options.add_argument("--headless") 27 | chrome_options.add_argument("--no-sandbox") 28 | chrome_options.add_argument("--disable-dev-shm-usage") 29 | chrome_options.add_argument("--disable-gpu") 30 | chrome_options.add_argument("--disable-extensions") 31 | chrome_options.add_argument("--disable-notifications") 32 | self.driver = webdriver.Chrome(ChromeDriverManager().install(), options=chrome_options) 33 | 34 | def pesquisar(self): 35 | driver = self.driver 36 | #mostrando IP externo de conexão com a internet 37 | try: 38 | ip_publico = requests.get("https://api.ipify.org").text 39 | print("IP externo: " + ip_publico) 40 | print("--------------------------") 41 | except: 42 | print("Não foi possível obter o IP externo") 43 | 44 | driver.get(self.url) 45 | time.sleep(3) 46 | 47 | try: 48 | driver.switch_to.frame(driver.find_element_by_id("yDmH0d")) 49 | driver.find_element_by_id("yDmH0d").send_keys(Keys.ESCAPE) 50 | except: 51 | pass 52 | 53 | campo_pesquisa_google = driver.find_element_by_tag_name("textarea") 54 | campo_pesquisa_google.click() 55 | campo_pesquisa_google.clear() 56 | 57 | palavra_random = random.choice(self.palavra) # escolhendo uma palavra randomica do array 58 | 59 | campo_pesquisa_google.send_keys(palavra_random) 60 | campo_pesquisa_google.send_keys(Keys.RETURN) 61 | time.sleep(3) 62 | 63 | # verifica se o texto existe na página e se exister vou clicar nele, isso se ele for igual a variavel quero_esse_link 64 | if self.existe_texto(self.quero_esse_link): 65 | links = driver.find_elements_by_tag_name("a") 66 | for link in links: 67 | if self.quero_esse_link in link.text: 68 | link.click() 69 | time.sleep(5) # tempo para carregar a página 70 | break 71 | 72 | print("Busca finalizada sem proxy") 73 | #aqui vou começar novamente a busca + trocando o servidor de conexão com a internet usando um proxy 74 | self.proxy() 75 | else: 76 | print("Não encontrei o texto. Procurando nas próximas páginas") 77 | for i in range(self.total_paginas_busca): # procurando nas próximas páginas 78 | driver.execute_script( 79 | "window.scrollTo(0, document.body.scrollHeight);") 80 | time.sleep(3) 81 | try: 82 | if(driver.find_element(By.ID, "pnnext")): 83 | driver.find_element(By.ID, "pnnext").click() 84 | time.sleep(3) 85 | if self.existe_texto(self.quero_esse_link): 86 | links = driver.find_elements_by_tag_name("a") 87 | for link in links: 88 | if self.quero_esse_link in link.text: 89 | link.click() 90 | time.sleep(5) # tempo para o link carregar 91 | break 92 | break 93 | else: 94 | continue 95 | except NoSuchElementException: 96 | print("Não encontrei mais paginas para procurar") 97 | continue 98 | 99 | print("Busca finalizada sem proxy") 100 | #aqui vou começar novamente a busca com o proxy 101 | self.proxy() 102 | 103 | def proxy(self): 104 | driver = self.driver 105 | driver.get('https://www.proxysite.com/pt/') # abre a página do proxy 106 | time.sleep(5) 107 | select = Select(driver.find_element_by_class_name('server-option')) # seleciona o servidor 108 | 109 | # select.select_by_value('us1') # seleciona o servidor 110 | todos_servidores = [x.get_attribute('value') for x in select.options] # pega todos os servidores 111 | #print(todos_servidores) 112 | numero_servidor = random.randint(1,20) # numero do servidor 113 | nome_servidor = 'us' 114 | 115 | # aqui vou testar qual Servidor está no select, se não estiver ele vai para o próximo. As vezes o servidor us1 não tá na lista, ai ele vai para o próximo us2. 116 | # Depois que o numero de servidor chegar a 20, mudo o nome do servidor para eu e reseto o numero de servidor para 1 117 | for servidor in todos_servidores: 118 | if numero_servidor == 21: 119 | nome_servidor = "eu" 120 | numero_servidor = 1 121 | 122 | if servidor == nome_servidor+str(numero_servidor): 123 | select.select_by_value(servidor) 124 | break 125 | numero_servidor += 1 126 | 127 | campo_proxy_input = driver.find_element_by_tag_name("input")# seleciona o campo de input do proxy 128 | campo_proxy_input.click() 129 | campo_proxy_input.clear() 130 | campo_proxy_input.send_keys(self.url) 131 | campo_proxy_input.send_keys(Keys.RETURN) 132 | time.sleep(3) 133 | 134 | #depedendo do servidor escolhido, o google irá pedir para aceitar alguns termos de cookies. Geralmente é servidores da França 135 | #neses caso, não continuo a busca, volto a escolher outro servidor e tento novamente 136 | if self.existe_texto("Avant d'accéder à Google"): 137 | time.sleep(2) 138 | driver.find_element(By.ID, "L2AGLb").click() 139 | time.sleep(5) 140 | self.proxy() 141 | time.sleep(5) 142 | 143 | campo_pesquisa_google = driver.find_element_by_css_selector('[title="Search"]') 144 | campo_pesquisa_google.click() 145 | campo_pesquisa_google.clear() 146 | 147 | palavra_random = random.choice(self.palavra) # escolhendo uma palavra randomica do array 148 | 149 | campo_pesquisa_google.send_keys(palavra_random) 150 | campo_pesquisa_google.send_keys(Keys.RETURN) 151 | time.sleep(3) 152 | 153 | if self.existe_texto("Go to Google Home"): 154 | 155 | # verifica se o texto existe na página e se exister vou clicar nele, isso se ele for igual a variavel quero_esse_link 156 | if self.existe_texto(self.quero_esse_link): 157 | links = driver.find_elements_by_tag_name("a") 158 | for link in links: 159 | if self.quero_esse_link in link.text: 160 | link.click() 161 | time.sleep(5) # espera 5 segundos para carregar a página 162 | break 163 | 164 | print("Busca finalizada com proxy") 165 | #aqui vou começar novamente a busca + trocando o servidor de conexão com a internet usando um proxy 166 | self.proxy() 167 | else: 168 | print("Não encontrei o texto. Procurando nas próximas páginas") 169 | for i in range(self.total_paginas_busca): # procurando nas próximas páginas 170 | driver.execute_script( 171 | "window.scrollTo(0, document.body.scrollHeight);") 172 | time.sleep(3) 173 | try: 174 | driver.find_element(By.ID, "pnnext").click() 175 | time.sleep(3) 176 | if self.existe_texto(self.quero_esse_link): 177 | links = driver.find_elements_by_tag_name("a") 178 | for link in links: 179 | if self.quero_esse_link in link.text: 180 | link.click() 181 | time.sleep(5) #tempo para carregar o site quando é encontrado 182 | break 183 | break 184 | else: 185 | continue 186 | except NoSuchElementException: 187 | print("Não tem mais páginas para procurar") 188 | break 189 | else: 190 | print("Estou na página errada") 191 | self.proxy() 192 | 193 | print("Busca finalizada com proxy") 194 | #aqui vou começar novamente a busca + trocando o servidor de conexão com a internet usando um proxy 195 | self.proxy() 196 | 197 | 198 | # procura dentro da página algum texto 199 | def existe_texto(self, text): 200 | return str(text) in self.driver.page_source 201 | 202 | 203 | # fazendo a busca no google 204 | url = "https://www.google.com.br/" 205 | 206 | # um array de palavras a ser buscada no google (para buscar algumas palavras, basta adicionar mais palavras no array) 207 | palavra = ["que horas tem ônibus + flavio oliveira + serra negra", "horário de ônibus em serra negra + flavio oliveira", "ônibus em serra negra que horas tem ônibus + flavio oliveira"] 208 | #palavra = ["me guia serra negra flavio oliveira guiaserranegra.com.br ", "guia online serra negra me guia serra negra guiaserranegra.com.br ", "ponto turístico serra negra me guia serra negra flavio oliveira"] 209 | #palavra = ['farmacia de plantao em serra negra farmaciadeplantaosn flavio oliveira', 'farmacia de plantao farmaciadeplantaosn', 'farmacias de plantão serra negra farmaciadeplantaosn'] 210 | 211 | # o link exato que quero que seja clicado 212 | quero_esse_link = "https://www.quehorastemonibus.com.br" 213 | #quero_esse_link = "https://www.guiaserranegra.com.br" 214 | #quero_esse_link = "https://www.farmaciadeplantaosn.com.br" 215 | 216 | # quantas páginas de busca quero que seja feita 217 | total_paginas_busca = 3 218 | 219 | buscarPalavra = Busca(url, palavra, quero_esse_link, total_paginas_busca) 220 | buscarPalavra.pesquisar() -------------------------------------------------------------------------------- /busca_automatica_google/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/busca_automatica_google/screen.png -------------------------------------------------------------------------------- /decifra_base64.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python3 2 | #-*- encoding: utf-8 -*- 3 | 4 | #Programa para decodificar string na base64 5 | 6 | import os 7 | import base64 8 | 9 | def intro(): 10 | print("\nFlávio Oliveira - Decifra Base64") 11 | print("www.github.com/oliveiradeflavio\n") 12 | 13 | def decifra(): 14 | while True: 15 | 16 | try: 17 | 18 | recebe = input("Digite a frase codificada (0 para sair): ") 19 | if recebe == str(0): 20 | print("saindo") 21 | break 22 | decodifica = base64.b64decode(recebe) 23 | print("\nFrase Decodificada: ", decodifica) 24 | input("Qualquer tecla continua") 25 | os.system("sleep 0.5") 26 | os.system("clear") 27 | intro() 28 | 29 | except: 30 | print("Frase não está na base64") 31 | os.system("sleep 1") 32 | os.system("clear") 33 | intro() 34 | 35 | intro() 36 | decifra() 37 | -------------------------------------------------------------------------------- /instagrambot/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

BOT PARA INSTAGRAM

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | A aplicação irá fazer o login no Instagram, irá escolher uma hashtag e irá comentar nas fotos baseado nessa hastag. 15 | A segunda aplicação bot para sorteio irá baixar os seguidores e no sorteio escolhido irá fazer o comentário usando o @ dos seguidores baixado. 16 | 17 | ### Construído com 18 | 19 | * [Python](https://www.python.org/) 20 | * [PySimpleGUI](https://pysimplegui.readthedocs.io) 21 | * [Selenium](https://www.selenium.dev/) 22 | * [Geckodriver](https://github.com/mozilla/geckodriver/releases) 23 | 24 | 25 | 26 | ## Começando 27 | 28 | A aplicação disponivel para mac OS, Linux e Windows. Seguir os passos abaixo para poder fazer a instalação. 29 | 30 | 31 | ### Pré-requisitos 32 | 33 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 34 | * python 35 | ```sh 36 | https://www.python.org/ 37 | ``` 38 | 39 | Antes de executar o código, seu whatsapp Web precisa estar conectado no celular e logado no navegador Chrome, no meu teste usei o Chrome. Depois que estiver executando a aplicação, não mexer no mouse. 40 | 41 | ### Instalação de bibliotecas 42 | 43 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 44 | ```sh 45 | https://github.com/mozilla/geckodriver/releases 46 | ``` 47 | ```sh 48 | pip install selenium 49 | ``` 50 | ```sh 51 | pip install PySimpleGUI 52 | ``` 53 | 54 | ### Demo 55 | 56 | [BOT_COMENTANDO](https://www.linkedin.com/posts/fladoliveira_pythondeveloper-activity-6798436536032489472-o5Kb) 57 | 58 | [BOT_COMENTANDO_EM_SORTEIO](https://www.linkedin.com/posts/fladoliveira_ai-python-instagram-activity-6800643572522610688-1R06) 59 | 60 | 61 | 62 | 63 | ## Roadmap 64 | 65 | Veja os [problemas abertos] (https://github.com/oliveiradeflavio/python/issues) para uma lista de recursos propostos (e problemas conhecidos). 66 | 67 | 68 | 69 | ## Contato 70 | 71 | Flávio Oliveira - [LinkedIn](https://www.linkedin.com/in/fladoliveira/) 72 | 73 | Link do Repositório: [https://github.com/oliveiradeflavio/python](https://github.com/oliveiradeflavio/pythone) 74 | 75 | 76 | 77 | 78 | 79 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 80 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 81 | 82 | -------------------------------------------------------------------------------- /instagrambot/geckodriver: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/instagrambot/geckodriver -------------------------------------------------------------------------------- /instagrambot/instagram_curtir_fotos.py: -------------------------------------------------------------------------------- 1 | """ 2 | Curtir fotos 3 | O teste foi feito em um instagram que possui a autenticação 2 fatores, 4 | por isso temos a parte de digitação da verificação de código. 5 | 6 | Flávio Oliviera - 2021 7 | www.flaviodeoliveira.com.br 8 | """ 9 | 10 | #importação de lib 11 | from selenium import webdriver 12 | from selenium.webdriver.common.keys import Keys 13 | import time 14 | import random 15 | from PySimpleGUI import PySimpleGUI as sg 16 | 17 | class instagramBot: 18 | def __init__(self, username, password, hashtag_procurar, verificacaoCodigo): 19 | self.username = username 20 | self.password = password 21 | self.hashtag_procurar = hashtag_procurar 22 | self.verificacaoCodigo = verificacaoCodigo 23 | self.driver = webdriver.Firefox(executable_path="/Users/foliveira/github/python/instagrambot/geckodriver") #caminho de onde está a biblioteca geckodriver 24 | 25 | def login(self): 26 | driver = self.driver 27 | driver.get("https://www.instagram.com") 28 | #input[@name=username] = login inspecionado na pagina instagram 29 | #input[@name=password] = senha inspecionado na pagina instagram 30 | #input[@name=verificationCode] = verificaçao de codigo em autenticaçao de dois fatores 31 | time.sleep(3) 32 | campo_usuario = driver.find_element_by_xpath("//input[@name='username']") 33 | campo_usuario.click() 34 | campo_usuario.clear() 35 | campo_usuario.send_keys(self.username) 36 | campo_senha = driver.find_element_by_xpath("//input[@name='password']") 37 | campo_senha.clear() 38 | campo_senha.send_keys(self.password) 39 | campo_senha.send_keys(Keys.RETURN) 40 | time.sleep(3) 41 | campo_verificacao_codigo = driver.find_element_by_xpath("//input[@name='verificationCode']") 42 | campo_verificacao_codigo.click() 43 | campo_verificacao_codigo.clear() 44 | campo_verificacao_codigo.send_keys(self.verificacaoCodigo) 45 | campo_verificacao_codigo.send_keys(Keys.RETURN) 46 | time.sleep(3) 47 | self.curtir_fotos(self.hashtag_procurar) 48 | 49 | def curtir_fotos(self, hashtag): 50 | driver = self.driver 51 | driver.get("https://www.instagram.com/explore/tags/"+ hashtag + "/") 52 | time.sleep(3) 53 | 54 | #navegando página 55 | for i in range(1,10): 56 | driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') 57 | time.sleep(5) 58 | 59 | #pegando os link das imagens que estão nas páginas 60 | hrefs = driver.find_elements_by_tag_name('a') 61 | imagem_hrefs = [elem.get_attribute('href') for elem in hrefs] 62 | [href for href in imagem_hrefs if hashtag in href] 63 | print('Hashtag: ' + hashtag + ' QNT Fotos: ' + str(len(imagem_hrefs))) 64 | qnt_likes = 1 65 | for imagem_href in imagem_hrefs: 66 | driver.get(imagem_href) 67 | driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') 68 | try: 69 | time.sleep(5) 70 | curtir_post = driver.find_element_by_xpath("//span[@class='_aamw']") 71 | curtir_post.click() #CURTI FOTO 72 | print("Quantidade de Likes: " + str(qnt_likes)) 73 | qnt_likes = qnt_likes + 1 74 | time.sleep(2) 75 | time.sleep(random.randint(2,5)) 76 | 77 | except Exception as e: 78 | print(e) 79 | time.sleep(5) 80 | 81 | #Layout 82 | sg.theme('Reddit') 83 | layout = [ 84 | [sg.Text('Username'),sg.Input(key='username', size=(30, 4))], 85 | [sg.Text('Password'),sg.Input(key='password',password_char='*', size=(30,4))], 86 | [sg.Text('hashtag'),sg.Input(key='hashtag', size=(30,4))], 87 | [sg.Text('Verificação 2 Fatores'),sg.Input(key='vefificacaoCodigo', size=(30,4))], 88 | [sg.Button('Logar')], 89 | [sg.Output(size=(50,20))] 90 | ] 91 | 92 | #Janela 93 | janela = sg.Window('BOT INSTAGRAM CURTIR FOTOS', layout) 94 | 95 | #ler os eventos 96 | while True: 97 | eventos, valores = janela.read() 98 | if eventos == sg.WINDOW_CLOSED: 99 | break 100 | if eventos == 'Logar': 101 | if valores['username'] == '' or valores['password'] == '' or valores['hashtag'] == '' or valores['vefificacaoCodigo'] == '': 102 | sg.Popup('Há campos vazios a serem preenchidos', title='Atenção') 103 | else: 104 | flavioBot = instagramBot(valores['username'], valores['password'], valores['hashtag'], valores['vefificacaoCodigo'] ) 105 | flavioBot.login() 106 | 107 | #verificacaoCodigo = input("Digite o código de verificação: ") 108 | #flavioBot = instagramBot("SEU_USERNAME", "SEU_PASSWORD", verificacaoCodigo ) 109 | #flavioBot.login() -------------------------------------------------------------------------------- /instagrambot/instagrambot.py: -------------------------------------------------------------------------------- 1 | """ 2 | Comentários em fotos através da pesquisa 3 | de hashtag. 4 | O teste foi feito, foi em um instagram que possui a autenticação 2 fatores, 5 | por isso temos a parte de digitação da verificação de código. 6 | 7 | Flávio Oliviera - 2021 8 | https://www.github.com/oliveiradeflavio 9 | """ 10 | 11 | 12 | #importação de lib 13 | from typing import Sized 14 | from selenium import webdriver 15 | from selenium.webdriver.common.keys import Keys 16 | import time 17 | import random 18 | from PySimpleGUI import PySimpleGUI as sg 19 | 20 | class instagramBot: 21 | def __init__(self, username, password, hashtag_procurar, verificacaoCodigo): 22 | self.username = username 23 | self.password = password 24 | self.hashtag_procurar = hashtag_procurar 25 | self.verificacaoCodigo = verificacaoCodigo 26 | self.driver = webdriver.Firefox(executable_path="/Users/foliveira/github/python/instagrambot/geckodriver") #caminho de onde está a biblioteca geckodriver 27 | 28 | def login(self): 29 | driver = self.driver 30 | driver.get("https://www.instagram.com") 31 | #input[@name=username] = login inspecionado na pagina instagram 32 | #input[@name=password] = senha inspecionado na pagina instagram 33 | #input[@name=verificationCode] = verificaçao de codigo em autenticaçao de dois fatores 34 | time.sleep(3) 35 | campo_usuario = driver.find_element_by_xpath("//input[@name='username']") 36 | campo_usuario.click() 37 | campo_usuario.clear() 38 | campo_usuario.send_keys(self.username) 39 | campo_senha = driver.find_element_by_xpath("//input[@name='password']") 40 | campo_senha.clear() 41 | campo_senha.send_keys(self.password) 42 | campo_senha.send_keys(Keys.RETURN) 43 | time.sleep(3) 44 | campo_verificacao_codigo = driver.find_element_by_xpath("//input[@name='verificationCode']") 45 | campo_verificacao_codigo.click() 46 | campo_verificacao_codigo.clear() 47 | campo_verificacao_codigo.send_keys(self.verificacaoCodigo) 48 | campo_verificacao_codigo.send_keys(Keys.RETURN) 49 | time.sleep(3) 50 | self.comentar_nas_fotos_com_hastag(self.hashtag_procurar) 51 | 52 | #digitando os comentário na velocidade humanos, as vezes acelerando as vezes um pouco mais lento. 53 | @staticmethod 54 | def digitando_como_humano(frase, onde_digitar): 55 | for letra in frase: 56 | onde_digitar.send_keys(letra) 57 | time.sleep(random.randint(1,5)/30) 58 | 59 | def comentar_nas_fotos_com_hastag(self, hashtag): 60 | driver = self.driver 61 | driver.get("https://www.instagram.com/explore/tags/"+ hashtag + "/") 62 | time.sleep(3) 63 | 64 | #navegando até a terceira página 65 | for i in range(1,8): 66 | driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') 67 | time.sleep(5) 68 | 69 | #pegando os link das imagens que estão nas páginas 70 | hrefs = driver.find_elements_by_tag_name('a') 71 | imagem_hrefs = [elem.get_attribute('href') for elem in hrefs] 72 | [href for href in imagem_hrefs if hashtag in href] 73 | print('Hashtag: ' + hashtag + ' QNT Fotos: ' + str(len(imagem_hrefs))) 74 | 75 | for imagem_href in imagem_hrefs: 76 | driver.get(imagem_href) 77 | driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') 78 | #class="Ypffh" = campo de comentário foto 79 | try: 80 | time.sleep(5) 81 | comentarios = ["Caramba! Tá top!🤖","Essa foto ficou demais viu!🤖", "Só fooootão🤖","Curti muito essa foto!🤖","Que fotão!!!!🤖","Tooooop!!!🤖","Eitaaaaaa que foto =D🤖"] 82 | #driver.find_element_by_class_name('_aaoa').click() //abre a opção de emoticons 83 | curtir_post = driver.find_element_by_xpath("//span[@class='_aamw']") 84 | curtir_post.click() 85 | print("Like") 86 | time.sleep(2) 87 | #campo_comentario = driver.find_element_by_class_name('_aaoa') 88 | driver.find_element_by_css_selector("[placeholder='Adicione um comentário...']").click() 89 | campo_comentario = driver.find_element_by_css_selector("[placeholder='Adicione um comentário...']") 90 | time.sleep(random.randint(2,5)) 91 | #chama a função para que seja digitando mais lento ou mais rapido "como humano e não um bot" 92 | self.digitando_como_humano(random.choice(comentarios), campo_comentario) 93 | #o ideal é colocar um valor maior, para que não seja identificado como bot. 94 | time.sleep(random.randint(10,20)) 95 | #driver.find_element_by_xpath("//button[contains(text(), 'Publicar')]").click() 96 | campo_comentario.send_keys(Keys.RETURN) 97 | time.sleep(3) 98 | except Exception as e: 99 | print(e) 100 | time.sleep(5) 101 | 102 | #Layout 103 | sg.theme('Reddit') 104 | layout = [ 105 | [sg.Text('Username'),sg.Input(key='username', size=(30, 4))], 106 | [sg.Text('Password'),sg.Input(key='password',password_char='*', size=(30,4))], 107 | [sg.Text('hashtag'),sg.Input(key='hashtag', size=(30,4))], 108 | [sg.Text('Verificação 2 Fatores'),sg.Input(key='vefificacaoCodigo', size=(30,4))], 109 | [sg.Button('Logar')] 110 | ] 111 | 112 | #Janela 113 | janela = sg.Window('BOT INSTAGRAM', layout) 114 | 115 | #ler os eventos 116 | while True: 117 | eventos, valores = janela.read() 118 | if eventos == sg.WINDOW_CLOSED: 119 | break 120 | if eventos == 'Logar': 121 | if valores['username'] == '' or valores['password'] == '' or valores['hashtag'] == '' or valores['vefificacaoCodigo'] == '': 122 | sg.Popup('Há campos vazios a serem preenchidos', title='Atenção') 123 | else: 124 | flavioBot = instagramBot(valores['username'], valores['password'], valores['hashtag'], valores['vefificacaoCodigo'] ) 125 | flavioBot.login() 126 | 127 | #verificacaoCodigo = input("Digite o código de verificação: ") 128 | #flavioBot = instagramBot("SEU_USERNAME", "SEU_PASSWORD", verificacaoCodigo ) 129 | #flavioBot.login() -------------------------------------------------------------------------------- /instagrambot/instagrambot_baixa_seguidores.py: -------------------------------------------------------------------------------- 1 | """ 2 | Esse bot irá pegar os seguidores da conta e fazer o comentário com esses seguidores (username) 3 | em um post de sorteio do instagram 4 | 5 | Flávio Oliviera - 2021 6 | https://www.github.com/oliveiradeflavio 7 | """ 8 | 9 | 10 | #importação de lib 11 | from http.server import executable 12 | from typing import Sized 13 | from selenium import webdriver 14 | from selenium.webdriver.common.keys import Keys 15 | import time 16 | import random 17 | from PySimpleGUI import PySimpleGUI as sg 18 | from datetime import datetime 19 | from selenium.webdriver.support.ui import WebDriverWait 20 | from selenium.webdriver.support import expected_conditions as EC 21 | from selenium.webdriver.common.by import By 22 | 23 | 24 | class instagramBot: 25 | def __init__(self, username, password, verificacaoCodigo): 26 | self.username = username 27 | self.password = password 28 | self.verificacaoCodigo = verificacaoCodigo 29 | self.lista_seguidores = [] 30 | #self.driver = webdriver.Firefox(executable_path="C:\geckodriver") #caminho de onde está a biblioteca geckodriver 31 | self.driver = webdriver.Firefox(executable_path="/Users/foliveira/github/python/instagrambot/geckodriver") #caminho de onde está a biblioteca geckodriver 32 | 33 | def login(self): 34 | driver = self.driver 35 | driver.get("https://www.instagram.com") 36 | #input[@name=username] = login inspecionado na pagina instagram 37 | #input[@name=password] = senha inspecionado na pagina instagram 38 | #input[@name=verificationCode] = verificaçao de codigo em autenticaçao de dois fatores 39 | time.sleep(3) 40 | campo_usuario = driver.find_element_by_xpath("//input[@name='username']") 41 | campo_usuario.click() 42 | campo_usuario.clear() 43 | campo_usuario.send_keys(self.username) 44 | campo_senha = driver.find_element_by_xpath("//input[@name='password']") 45 | campo_senha.clear() 46 | campo_senha.send_keys(self.password) 47 | campo_senha.send_keys(Keys.RETURN) 48 | time.sleep(3) 49 | 50 | ''' #verificaçao de autenticaçao de dois fatores, caso sua conta não tenha, basta comentar até o último time.sleep()''' 51 | # campo_verificacao_codigo = driver.find_element_by_xpath("//input[@name='verificationCode']") 52 | # campo_verificacao_codigo.click() 53 | # campo_verificacao_codigo.clear() 54 | # campo_verificacao_codigo.send_keys(self.verificacaoCodigo) 55 | # campo_verificacao_codigo.send_keys(Keys.RETURN) 56 | # time.sleep(3) 57 | 58 | self.seguidores(self.username) 59 | 60 | #digitando os comentário na velocidade humanos, as vezes acelerando as vezes um pouco mais lento. 61 | @staticmethod 62 | def digitando_como_humano(frase, onde_digitar): 63 | for letra in frase: 64 | onde_digitar.send_keys(letra) 65 | time.sleep(random.randint(1,5)/30) 66 | 67 | def seguidores(self, perfil_instagram): 68 | driver = self.driver 69 | driver.get("https://www.instagram.com/"+ perfil_instagram) 70 | time.sleep(3) 71 | page = 'followers' # para seguidores followers || para seguindo following 72 | if page == 'followers': 73 | sessao_total_seguidores = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div/div[1]/div/div/div[1]/div[1]/section/main/div/header/section/ul/li[2]/a/div/span') 74 | if page == 'following': 75 | sessao_total_seguidores = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div/div[1]/div/div/div[1]/div[1]/section/main/div/header/section/ul/li[3]/a/div/span') 76 | 77 | total_seguidores = sessao_total_seguidores.text 78 | print(total_seguidores) 79 | total_seguidores = total_seguidores.replace("seguidores", "") 80 | 81 | driver.get("https://www.instagram.com/"+ perfil_instagram + "/" + page) 82 | time.sleep(5) 83 | print(total_seguidores) 84 | 85 | 86 | for i in range(1, int(total_seguidores)): 87 | time.sleep(3) 88 | sessao_nomes_seguidores = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div/div[2]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div/div[2]/ul/div/li/div/div[2]/div[1]/div/div/span/a/span') 89 | #sessao_nomes_seguidores = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/div/div[2]/div/div/div[1]/div/div[2]/div/div/div/div/div/div/div/div[2]/ul/div/li[%s]/div/div[2]/div/div/div/span/a/span' % i) 90 | driver.execute_script("arguments[0].scrollIntoView();", sessao_nomes_seguidores) 91 | time.sleep(1) 92 | texto = sessao_nomes_seguidores.text 93 | lista_seguidores_extraida = texto.split() 94 | self.lista_seguidores.append(lista_seguidores_extraida[0]) 95 | 96 | print(self.lista_seguidores) 97 | self.comentar_no_sorteio() 98 | 99 | def comentar_no_sorteio(self): 100 | driver = self.driver 101 | driver.get("https://www.instagram.com/p/CO6ipgjrhzV") 102 | time.sleep(2) 103 | #curti o post do sorteio 104 | curtir_post = driver.find_element_by_xpath("//span[@class='_aamw']") 105 | curtir_post.click() 106 | print("Like") 107 | time.sleep(2) 108 | try: 109 | contador = 0 110 | 111 | #a cada username dentro da lista, irá ser um comentário a ser publicado no post de sorteio. 112 | for perfil_seguidores in self.lista_seguidores: 113 | time.sleep(5) 114 | driver.find_element_by_css_selector("[placeholder='Adicione um comentário...']").click() 115 | campo_comentario = driver.find_element_by_css_selector("[placeholder='Adicione um comentário...']") 116 | time.sleep(random.randint(2,5)) 117 | self.digitando_como_humano('@'+str(perfil_seguidores), campo_comentario) 118 | time.sleep(random.randint(10,20)) 119 | campo_comentario.send_keys(Keys.RETURN) 120 | time.sleep(5) 121 | #quando o contador atingir o valor 50, o sistema irá pausar no comentário 122 | #e contador será zerado.A ssim tentamos evitar o bloqueio da conta. 123 | contador = contador + 1 124 | driver.refresh() 125 | if contador == 50: 126 | contador = 0 127 | print('Sistema em espera, voltará a comentar em 30 minutos. Última pausa feita: ', datetime.now().hour,datetime.now().minute) 128 | time.sleep(1800) #30minutos 129 | 130 | print("Comentarios Enviados. ", datetime.now().hour,datetime.now().minute) 131 | 132 | except Exception as e: 133 | print(e) 134 | time.sleep(5) 135 | 136 | #Layout 137 | sg.theme('Reddit') 138 | layout = [ 139 | [sg.Text('Username'),sg.Input(key='username', size=(30, 4))], 140 | [sg.Text('Password'),sg.Input(key='password',password_char='*', size=(30,4))], 141 | [sg.Text('Verificação 2 Fatores'),sg.Input(key='vefificacaoCodigo', size=(30,4))], 142 | [sg.Button('Logar')] 143 | ] 144 | 145 | #Janela 146 | janela = sg.Window('BOT INSTAGRAM SORTEIO', layout) 147 | 148 | #ler os eventos 149 | while True: 150 | eventos, valores = janela.read() 151 | valores['username'] = 'flavio_tech' 152 | valores['password'] = '102030qwerty.,' 153 | valores['vefificacaoCodigo'] = 'login' 154 | 155 | if eventos == sg.WINDOW_CLOSED: 156 | break 157 | if eventos == 'Logar': 158 | 159 | 160 | if valores['username'] == '' or valores['password'] == '' or valores['vefificacaoCodigo'] == '': 161 | sg.Popup('Há campos vazios a serem preenchidos', title='Atenção') 162 | else: 163 | valores['username'] = 'flavio_tech' 164 | valores['password'] = '102030qwerty.,' 165 | valores['verificaacao'] = 'login' 166 | flavioBot = instagramBot(valores['username'], valores['password'], valores['vefificacaoCodigo'] ) 167 | flavioBot.login() 168 | -------------------------------------------------------------------------------- /instagrambot/instagrambot_segue_following.py: -------------------------------------------------------------------------------- 1 | """ 2 | Esse bot irá clicar no botão seguir dos seguindos da conta especifica. 3 | Irá navegar até o perfil da conta, clicar nos seguindos e nesse modal que abrir, irá clicar no botão seguir de cada username. 4 | 5 | Flávio Oliviera - 2021 6 | https://www.github.com/oliveiradeflavio 7 | """ 8 | 9 | 10 | #importação de lib 11 | from typing import Sized 12 | from selenium import webdriver 13 | from selenium.webdriver.common.keys import Keys 14 | import time 15 | import random 16 | from PySimpleGUI import PySimpleGUI as sg 17 | from datetime import datetime 18 | 19 | 20 | class instagramBot: 21 | def __init__(self, username, password, verificacaoCodigo): 22 | self.username = username 23 | self.password = password 24 | self.verificacaoCodigo = verificacaoCodigo 25 | self.lista_seguidores = [] 26 | self.perfil = 'sorteiode_premios' #perfil do insta onde vai ser preciso seguir os seguindos 27 | #self.driver = webdriver.Firefox(executable_path="C:\geckodriver") #caminho de onde está a biblioteca geckodriver pasta windows 28 | self.driver = webdriver.Firefox(executable_path="/Users/foliveira/github/python/instagrambot/geckodriver") #caminho de onde está a biblioteca geckodriver pasta macOS 29 | 30 | def login(self): 31 | driver = self.driver 32 | driver.get("https://www.instagram.com") 33 | #input[@name=username] = login inspecionado na pagina instagram 34 | #input[@name=password] = senha inspecionado na pagina instagram 35 | #input[@name=verificationCode] = verificaçao de codigo em autenticaçao de dois fatores 36 | time.sleep(3) 37 | campo_usuario = driver.find_element_by_xpath("//input[@name='username']") 38 | campo_usuario.click() 39 | campo_usuario.clear() 40 | campo_usuario.send_keys(self.username) 41 | campo_senha = driver.find_element_by_xpath("//input[@name='password']") 42 | campo_senha.clear() 43 | campo_senha.send_keys(self.password) 44 | campo_senha.send_keys(Keys.RETURN) 45 | time.sleep(3) 46 | campo_verificacao_codigo = driver.find_element_by_xpath("//input[@name='verificationCode']") 47 | campo_verificacao_codigo.click() 48 | campo_verificacao_codigo.clear() 49 | campo_verificacao_codigo.send_keys(self.verificacaoCodigo) 50 | campo_verificacao_codigo.send_keys(Keys.RETURN) 51 | time.sleep(3) 52 | self.seguindo(self.perfil) 53 | 54 | def seguindo(self, perfil_instagram): 55 | driver = self.driver 56 | driver.get("https://www.instagram.com/"+ perfil_instagram) 57 | time.sleep(3) 58 | #seguidores = driver.find_elements_by_xpath('//li[contains(@class,"Y8-fY")]') 59 | #seguidores[1].click() 60 | 61 | page = 'following' # para seguidores followers || para seguindo following 62 | driver.find_element_by_xpath('//a[contains(@href, "%s")]' % page).click() 63 | sessao_total_seguindo = driver.find_element_by_xpath('//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a') 64 | total_seguindo = sessao_total_seguindo.text 65 | print(total_seguindo) 66 | total_seguindo = total_seguindo.replace("seguindo", "") 67 | 68 | 69 | for i in range(1, int(total_seguindo)): 70 | time.sleep(3) 71 | i = i + 3 #a cada usuário o scroll do modal vai abaixando, 72 | sessao_nomes_seguindo = driver.find_element_by_xpath('/html/body/div[6]/div/div/div[2]/ul/div/li[%s]' % i) #captura o nome do seguidor 73 | driver.execute_script("arguments[0].scrollIntoView();", sessao_nomes_seguindo) 74 | driver.switch_to_active_element 75 | seguindo = driver.find_elements_by_xpath('//*[contains(text(), "Seguir")]') 76 | seguindo[1].click() #clica no botão para seguir #### TESTEI ATÉ O VALOR 48, QUE SERIA 48 SEGUIDORES #### 77 | i = i - 3 # preciso voltar ao valor original, para que possa fazer o laço novamente e o seguir os @ do modal sem pular 78 | print(i) 79 | time.sleep(1) 80 | 81 | #Layout 82 | sg.theme('Reddit') 83 | layout = [ 84 | [sg.Text('Username'),sg.Input(key='username', size=(30, 4))], 85 | [sg.Text('Password'),sg.Input(key='password',password_char='*', size=(30,4))], 86 | [sg.Text('Verificação 2 Fatores'),sg.Input(key='vefificacaoCodigo', size=(30,4))], 87 | [sg.Button('Logar')] 88 | ] 89 | 90 | #Janela 91 | janela = sg.Window('BOT INSTAGRAM SEGUE SEGUIDORES', layout) 92 | 93 | #ler os eventos 94 | while True: 95 | eventos, valores = janela.read() 96 | if eventos == sg.WINDOW_CLOSED: 97 | break 98 | if eventos == 'Logar': 99 | if valores['username'] == '' or valores['password'] == '' or valores['vefificacaoCodigo'] == '': 100 | sg.Popup('Há campos vazios a serem preenchidos', title='Atenção') 101 | else: 102 | flavioBot = instagramBot(valores['username'], valores['password'], valores['vefificacaoCodigo'] ) 103 | flavioBot.login() 104 | -------------------------------------------------------------------------------- /instagrambot/instagrambot_seguidores_lista_excel_mais_que_1_comentario.py: -------------------------------------------------------------------------------- 1 | """ 2 | Esse bot irá pegar os seguidores da conta e fazer o comentário com esses seguidores (username) 3 | em um post de sorteio do instagram 4 | 5 | Flávio Oliviera - 2021 6 | https://www.github.com/oliveiradeflavio 7 | """ 8 | 9 | 10 | #importação de lib 11 | from selenium import webdriver 12 | from selenium.webdriver.common.keys import Keys 13 | import time 14 | import random 15 | from PySimpleGUI import PySimpleGUI as sg 16 | from datetime import datetime 17 | import pandas as pd 18 | 19 | class instagramBot: 20 | def __init__(self, username, password, verificacaoCodigo): 21 | self.username = username 22 | self.password = password 23 | self.verificacaoCodigo = verificacaoCodigo 24 | self.driver = webdriver.Firefox(executable_path=" ") #caminho de onde está a biblioteca geckodriver 25 | 26 | def login(self): 27 | driver = self.driver 28 | driver.get("https://www.instagram.com") 29 | #input[@name=username] = login inspecionado na pagina instagram 30 | #input[@name=password] = senha inspecionado na pagina instagram 31 | #input[@name=verificationCode] = verificaçao de codigo em autenticaçao de dois fatores 32 | time.sleep(3) 33 | campo_usuario = driver.find_element_by_xpath("//input[@name='username']") 34 | campo_usuario.click() 35 | campo_usuario.clear() 36 | campo_usuario.send_keys(self.username) 37 | campo_senha = driver.find_element_by_xpath("//input[@name='password']") 38 | campo_senha.clear() 39 | campo_senha.send_keys(self.password) 40 | campo_senha.send_keys(Keys.RETURN) 41 | time.sleep(3) 42 | campo_verificacao_codigo = driver.find_element_by_xpath("//input[@name='verificationCode']") 43 | campo_verificacao_codigo.click() 44 | campo_verificacao_codigo.clear() 45 | campo_verificacao_codigo.send_keys(self.verificacaoCodigo) 46 | campo_verificacao_codigo.send_keys(Keys.RETURN) 47 | time.sleep(3) 48 | self.comentar_no_sorteio() 49 | 50 | #digitando os comentário na velocidade humanos, as vezes acelerando as vezes um pouco mais lento. 51 | @staticmethod 52 | def digitando_como_humano(frase, onde_digitar): 53 | for letra in frase: 54 | onde_digitar.send_keys(letra) 55 | time.sleep(random.randint(1,5)/30) 56 | 57 | def comentar_no_sorteio(self): 58 | driver = self.driver 59 | driver.get("https://www.instagram.com/p/CO6ipgjrhzV") 60 | time.sleep(3) 61 | #curti o post do sorteio 62 | curtir_post = driver.find_element_by_xpath("//span[@class='_aamw']") 63 | curtir_post.click() 64 | print("Like") 65 | time.sleep(2) 66 | try: 67 | contador = 0 68 | #irá pegar os username do insta na lista do excel 69 | self.lista_seguidores = pd.read_excel(r" ") #caminho onde está o arquivo Excel. 70 | #a cada username dentro da lista, irá a ser publicado no post de sorteio. 71 | 72 | tamanho = len(self.lista_seguidores['username']) # para publicar 2 comentário ou mais mude a variavel 2 do range 73 | for perfil_seguidores in range(0, tamanho, 2): #nesse caso estamos publicando 2 comentários por vez 74 | time.sleep(5) 75 | campo_comentario = driver.find_element_by_css_selector("[placeholder='Adicione um comentário...']") 76 | time.sleep(random.randint(2,5)) 77 | #para comentar mais que 2 comentário, altere a variavel 2 do range(0, tamanho, 2) para o número de comentário que você deseja 78 | #adicione a quantidade correspondente ao número de comentários self.lista_seguidores['username'][perfil_seguidores+1] na função digitando_como_humano 79 | self.digitando_como_humano('@'+self.lista_seguidores["username"][perfil_seguidores] + ' @'+self.lista_seguidores["username"][perfil_seguidores+1], campo_comentario) 80 | time.sleep(random.randint(10,20)) 81 | campo_comentario.send_keys(Keys.RETURN) 82 | time.sleep(5) 83 | #quando o contador atingir o valor 50, o sistema irá pausar no comentário 84 | #e contador será zerado.A ssim tentamos evitar o bloqueio da conta. 85 | contador = contador + 1 86 | print("Usernames Comentados: " + self.lista_seguidores["username"][perfil_seguidores] + ' '+self.lista_seguidores["username"][perfil_seguidores+1]) 87 | driver.refresh() 88 | if contador == 50: 89 | contador = 0 90 | print('Sistema em espera, voltará a comentar em 1 hora. Última pausa feita: ', datetime.now().hour,datetime.now().minute) 91 | time.sleep(3600) #1 hora 92 | 93 | print("Comentarios Enviados. ", datetime.now().hour,datetime.now().minute) 94 | 95 | except Exception as e: 96 | print(e) 97 | time.sleep(5) 98 | 99 | #Layout 100 | sg.theme('Reddit') 101 | layout = [ 102 | [sg.Text('Username'),sg.Input(key='username', size=(30, 4))], 103 | [sg.Text('Password'),sg.Input(key='password',password_char='*', size=(30,4))], 104 | [sg.Text('Verificação 2 Fatores'),sg.Input(key='vefificacaoCodigo', size=(30,4))], 105 | [sg.Button('Logar')] 106 | #[sg.Output(size=(50,20))] 107 | ] 108 | 109 | #Janela 110 | janela = sg.Window('BOT INSTAGRAM SORTEIO LISTA EXCEL', layout) 111 | 112 | #ler os eventos 113 | while True: 114 | eventos, valores = janela.read() 115 | if eventos == sg.WINDOW_CLOSED: 116 | break 117 | if eventos == 'Logar': 118 | if valores['username'] == '' or valores['password'] == '' or valores['vefificacaoCodigo'] == '': 119 | sg.Popup('Há campos vazios a serem preenchidos', title='Atenção') 120 | else: 121 | flavioBot = instagramBot(valores['username'], valores['password'], valores['vefificacaoCodigo'] ) 122 | flavioBot.login() -------------------------------------------------------------------------------- /whatsappbot/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

ENVIANDO MENSAGEM AUTOMATICAMENTE PARA: USUÁRIO, GRUPOS OU USANDO UMA LISTA DE CONTATOS

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | A aplicação irá fazer o disparo automático e agendado de mensagens para o app WhatsApp. Esse bot não foi feito uma interface gráfica. Há um outro repositório chamado wppmessage, essa aplicação está com interface. 15 | 16 | ### Construído com 17 | 18 | * [Python](https://www.python.org/) 19 | * [PyWhatkit](https://github.com/Ankit404butfound/PyWhatKit) 20 | * [Selenium](https://www.selenium.dev/) 21 | 22 | 23 | 24 | ## Começando 25 | 26 | A aplicação disponivel para mac OS, Linux e Windows. Seguir os passos abaixo para poder fazer a instalação. Importante verificar o link abaixo, onde comento no repositório da biblioteca PyWhatKit. Caso você tenha o mesmo problema no sistema macOS. PyWhatKit é uma biblioteca Python com vários recursos úteis. É uma biblioteca fácil de usar que não requer configuração adicional. 27 | 28 | Problemas enfrentado com a lib, comentei na discussão abaixo 29 | https://github.com/Ankit404butfound/PyWhatKit/issues/20 30 | 31 | Link direto de um dos meus testes junto com a solução do desenvolvedor. 32 | https://github.com/Ankit404butfound/PyWhatKit/issues/20#issuecomment-830842688 33 | 34 | 35 | 36 | ### Pré-requisitos 37 | 38 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 39 | * python 40 | ```sh 41 | https://www.python.org/ 42 | ``` 43 | 44 | Antes de executar o código, seu whatsapp Web precisa estar conectado no celular e logado no navegador Chrome, no meu teste usei o Chrome. Depois que estiver executando a aplicação, não mexer no mouse. 45 | 46 | ### Instalação de bibliotecas 47 | 48 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 49 | ```sh 50 | pip install pywhatkit 51 | ``` 52 | ```sh 53 | pip install selenium 54 | ``` 55 | 56 | 57 | ## Roadmap 58 | 59 | Veja os [problemas abertos] (https://github.com/oliveiradeflavio/python/issues) para uma lista de recursos propostos (e problemas conhecidos). 60 | 61 | 62 | 63 | ## Contato 64 | 65 | Flávio Oliveira - [LinkedIn](https://www.linkedin.com/in/fladoliveira/) 66 | 67 | Link do Repositório: [https://github.com/oliveiradeflavio/python](https://github.com/oliveiradeflavio/pythone) 68 | 69 | 70 | 71 | 72 | 73 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 74 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 75 | 76 | -------------------------------------------------------------------------------- /whatsappbot/whasappbot-listadecontato-EXCEL.py: -------------------------------------------------------------------------------- 1 | """ 2 | Flávio Oliveira - 2021 3 | https://github.com/oliveiradeflavio 4 | """ 5 | 6 | """ 7 | Antes de executar o código, seu whatsapp Web precisa estar conectado no celular 8 | e logado no navegador Chrome, no meu teste usei o Chrome. Depois que estiver 9 | executando a aplicação, não mexer no mouse. 10 | """ 11 | 12 | #importar as bibliotecas 13 | import pywhatkit 14 | import keyboard 15 | import pandas as pd 16 | import time 17 | from datetime import datetime 18 | 19 | #importar contatos da planilha do excel, colocar o caminho onde se encontra o xlsx. 20 | contatos = pd.read_excel(r"/Users/foliveira/Desenvolvimento Local/Python/celular.xlsx") 21 | 22 | #definindo mensagem 23 | mensagem = "VAMO AUTOMATIZAR TUDO! Acesse o site https://www.flaviodeoliveira.com.br" 24 | 25 | #definindo intervalo de envio. Lembrando que o nome da coluna do excel nesse exemplo é 26 | #celular. Se for outro nome, precisa ser alterado. 27 | for i in contatos["celular"]: 28 | pywhatkit.sendwhatmsg("+55"+str(i), mensagem, datetime.now().hour, datetime.now().minute + 1, 3) 29 | keyboard.press_and_release('ctrl + w') -------------------------------------------------------------------------------- /whatsappbot/whatsappbot-listadecontatos.py: -------------------------------------------------------------------------------- 1 | """ 2 | Flávio Oliveira - 2021 3 | https://github.com/oliveiradeflavio 4 | """ 5 | 6 | """ 7 | Antes de executar o código, seu whatsapp Web precisa estar conectado no celular 8 | e logado no navegador Chrome, no meu teste usei o Chrome. Depois que estiver 9 | executando a aplicação, não mexer no mouse. 10 | """ 11 | 12 | #importar as bibliotecas 13 | import pywhatkit 14 | import keyboard 15 | import time 16 | from datetime import datetime 17 | 18 | #definir para quais contatos ou de uma lista de excel 19 | contatos = ["+5519999999999", "+5519999999999", "+5519999999999", "+5519999999999"] 20 | 21 | #definindo intervalo de envio 22 | while len(contatos) >= 1: 23 | #envia mensagem 24 | pywhatkit.sendwhatmsg(contatos[0], 'Olá, eu sou uma mensagem automática', datetime.now().hour,datetime.now().minute + 1) 25 | del contatos[0] 26 | keyboard.press_and_release('ctrl + w') 27 | -------------------------------------------------------------------------------- /whatsappbot/whatsappbot.py: -------------------------------------------------------------------------------- 1 | """ 2 | Flávio Oliveira - 2021 3 | https://github.com/oliveiradeflavio 4 | """ 5 | #importar as bibliotecas 6 | from selenium import webdriver 7 | import time 8 | from webdriver_manager.chrome import ChromeDriverManager 9 | from selenium.webdriver.common.keys import Keys 10 | 11 | #navegar até o whatsApp Web 12 | #ch_option.add_argument, para usar o profile do google com cache, assim evita de ficar pedindo o qrcode. 13 | ch_options = webdriver.ChromeOptions() 14 | ch_options.add_argument("--user-data-dir=endereço url perfil chrome") 15 | driver = webdriver.Chrome(ChromeDriverManager().install(), options=ch_options) 16 | driver.get('https://web.whatsapp.com/') 17 | time.sleep(10) 18 | 19 | #definir contatos e grupos e mensagem a ser enviadas 20 | contatos = ['nome contato', 'nome do contato'] 21 | mensagem = 'Olá, eu sou um bot whatsApp.' 22 | 23 | #buscar contatos ou grupos 24 | #campo de pesquisa 'copyable-text selectable-text' 25 | #campo digitar mensagem 'copyable-text selectable-text' 26 | def buscar_contato(contato): 27 | campo_pesquisa = driver.find_element_by_xpath('//div[contains(@class,"copyable-text selectable-text")]') 28 | #time.sleep(3) 29 | campo_pesquisa.click() 30 | campo_pesquisa.send_keys(contato) 31 | campo_pesquisa.send_keys(Keys.ENTER) 32 | 33 | def enviar_mensagem(mensagem): 34 | campo_mensagem = driver.find_elements_by_xpath('//div[contains(@class,"copyable-text selectable-text")]') 35 | campo_mensagem[1].click() 36 | campo_mensagem[1].send_keys(mensagem) 37 | campo_mensagem[1].send_keys(Keys.ENTER) 38 | 39 | for contato in contatos: 40 | buscar_contato(contato) 41 | enviar_mensagem(mensagem) -------------------------------------------------------------------------------- /wppmessage/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

AGENDANDO MENSAGENS E ENVIANDO PELO WHATSAPP ATRAVÉS DO WPPMESSAGE

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | [![tela inicial][product-screenshot]]() 15 | 16 | A aplicação irá fazer o disparo automático e agendado de mensagens para o app WhatsApp. 17 | 18 | ### Construído com 19 | 20 | * [Python](https://www.python.org/) 21 | * [PyWhatkit](https://github.com/Ankit404butfound/PyWhatKit) 22 | * [QT Desginer](https://build-system.fman.io/qt-designer-download) 23 | 24 | 25 | 26 | 27 | ## Começando 28 | 29 | A aplicação disponivel para mac OS, Linux e Windows. Seguir os passos abaixo para poder fazer a instalação. Importante verificar o link abaixo, 30 | onde comento no repositório da biblioteca PyWhatKit. Caso você tenha o mesmo problema no sistema macOS. 31 | 32 | Problemas enfrentado com a lib, comentei na discussão abaixo 33 | https://github.com/Ankit404butfound/PyWhatKit/issues/20 34 | 35 | Link direto de um dos meus testes junto com a solução do desenvolvedor. 36 | https://github.com/Ankit404butfound/PyWhatKit/issues/20#issuecomment-830842688 37 | 38 | ### Pré-requisitos 39 | 40 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 41 | * python 42 | ```sh 43 | https://www.python.org/ 44 | ``` 45 | 46 | ### Instalação de bibliotecas 47 | 48 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 49 | ```sh 50 | pip install pandas 51 | ``` 52 | ```sh 53 | pip install xlrd 54 | ``` 55 | ```sh 56 | pip install openpyxl 57 | ``` 58 | ```sh 59 | pip install pywhatkit 60 | ``` 61 | 62 | PyWhatKit é uma biblioteca Python com vários recursos úteis. É uma biblioteca fácil de usar que não requer configuração adicional. 63 | 64 | 65 | Frontend desenvolvido com QTDesign 66 | https://build-system.fman.io/qt-designer-download 67 | 68 | 69 | Para Windows users pode ser preciso instalar o PyQT5. 70 | ```sh 71 | pip install PyQt5 72 | ``` 73 | 74 | 75 | ## Demo 76 | 77 | ![Programa aberto](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage.png) 78 | 79 | ![Mensagem de erro](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage-error.png) 80 | 81 | ![Wpp Message envio multiplo tela](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessagemulti-screen.png) 82 | 83 | 84 | [Wpp Message Envio para 1 número](https://www.linkedin.com/posts/fladoliveira_interface-usei-o-qtdesign-e-a-linguagem-python-ugcPost-6794717202772721664-qER6) 85 | 86 | [Wpp Message Envio para Vários Números](https://www.linkedin.com/posts/fladoliveira_python-programming-activity-6795549380347871232-fbPz) 87 | 88 | 89 | 90 | ## Roadmap 91 | 92 | Veja os [problemas abertos] (https://github.com/oliveiradeflavio/python/issues) para uma lista de recursos propostos (e problemas conhecidos). 93 | 94 | 95 | 96 | ## Contato 97 | 98 | Flávio Oliveira - [LinkedIn](https://www.linkedin.com/in/fladoliveira/) 99 | 100 | Link do Projeto: [https://github.com/oliveiradeflavio/python/tree/master/wppmessage](https://github.com/oliveiradeflavio/python/tree/master/wppmessage) 101 | 102 | 103 | 104 | 105 | 106 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 107 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 108 | [product-screenshot]: https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage.png?raw=true 109 | -------------------------------------------------------------------------------- /wppmessage/imagens/wppmessage-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/imagens/wppmessage-error.png -------------------------------------------------------------------------------- /wppmessage/imagens/wppmessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/imagens/wppmessage.png -------------------------------------------------------------------------------- /wppmessage/imagens/wppmessagemulti-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/imagens/wppmessagemulti-screen.png -------------------------------------------------------------------------------- /wppmessage/imagens/wppmessagemultiplosnumeros.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/imagens/wppmessagemultiplosnumeros.png -------------------------------------------------------------------------------- /wppmessage/versao1_0_single_number/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

AGENDANDO MENSAGENS E ENVIANDO PELO WHATSAPP ATRAVÉS DO WPPMESSAGE

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | [![tela inicial][product-screenshot]]() 15 | 16 | A aplicação irá fazer o disparo automático e agendado de mensagens para o app WhatsApp. 17 | 18 | ### Construído com 19 | 20 | * [Python](https://www.python.org/) 21 | * [PyWhatkit](https://github.com/Ankit404butfound/PyWhatKit) 22 | * [QT Desginer](https://build-system.fman.io/qt-designer-download) 23 | 24 | 25 | 26 | 27 | ## Começando 28 | 29 | A aplicação disponivel para mac OS, Linux e Windows. Seguir os passos abaixo para poder fazer a instalação. Importante verificar o link abaixo, 30 | onde comento no repositório da biblioteca PyWhatKit. Caso você tenha o mesmo problema no sistema macOS. 31 | 32 | Problemas enfrentado com a lib, comentei na discussão abaixo 33 | https://github.com/Ankit404butfound/PyWhatKit/issues/20 34 | 35 | Link direto de um dos meus testes junto com a solução do desenvolvedor. 36 | https://github.com/Ankit404butfound/PyWhatKit/issues/20#issuecomment-830842688 37 | 38 | ### Pré-requisitos 39 | 40 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 41 | * python 42 | ```sh 43 | https://www.python.org/ 44 | ``` 45 | 46 | ### Instalação de bibliotecas 47 | 48 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 49 | ```sh 50 | pip install pandas 51 | ``` 52 | ```sh 53 | pip install xlrd 54 | ``` 55 | ```sh 56 | pip install openpyxl 57 | ``` 58 | ```sh 59 | pip install pywhatkit 60 | ``` 61 | 62 | PyWhatKit é uma biblioteca Python com vários recursos úteis. É uma biblioteca fácil de usar que não requer configuração adicional. 63 | 64 | 65 | Frontend desenvolvido com QTDesign 66 | https://build-system.fman.io/qt-designer-download 67 | 68 | 69 | Para Windows users pode ser preciso instalar o PyQT5. 70 | ```sh 71 | pip install PyQt5 72 | ``` 73 | 74 | 75 | ## Demo 76 | 77 | ![Programa aberto](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage.png) 78 | 79 | ![Mensagem de erro](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage-error.png) 80 | 81 | ![Wpp Message envio multiplo tela](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessagemulti-screen.png) 82 | 83 | 84 | [Wpp Message Envio para 1 número](https://www.linkedin.com/posts/fladoliveira_interface-usei-o-qtdesign-e-a-linguagem-python-ugcPost-6794717202772721664-qER6) 85 | 86 | [Wpp Message Envio para Vários Números](https://www.linkedin.com/posts/fladoliveira_python-programming-activity-6795549380347871232-fbPz) 87 | 88 | 89 | 90 | ## Roadmap 91 | 92 | Veja os [problemas abertos] (https://github.com/oliveiradeflavio/python/issues) para uma lista de recursos propostos (e problemas conhecidos). 93 | 94 | 95 | 96 | ## Contato 97 | 98 | Flávio Oliveira - [site](http://www.flaviodeoliveira.com.br) - fl.deoliveira@hotmail.com 99 | 100 | Link do Projeto: [https://github.com/oliveiradeflavio/python/tree/master/wppmessage](https://github.com/oliveiradeflavio/python/tree/master/wppmessage) 101 | 102 | 103 | 104 | 105 | 106 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 107 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 108 | [product-screenshot]: https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage.png?raw=true 109 | -------------------------------------------------------------------------------- /wppmessage/versao1_0_single_number/imagens/wppmessage-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/versao1_0_single_number/imagens/wppmessage-error.png -------------------------------------------------------------------------------- /wppmessage/versao1_0_single_number/imagens/wppmessage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/versao1_0_single_number/imagens/wppmessage.png -------------------------------------------------------------------------------- /wppmessage/versao1_0_single_number/wppmessage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'wppmessage.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.15.4 6 | # 7 | # WARNING: Any manual changes made to this file will be lost when pyuic5 is 8 | # run again. Do not edit this file unless you know what you are doing. 9 | # 10 | # Flávio Oliveira - 2021 - Versão 1.0 11 | # https://github.com/oliveiradeflavio 12 | 13 | import pywhatkit as kit 14 | 15 | from PyQt5 import QtCore, QtGui, QtWidgets 16 | 17 | 18 | class Ui_MainWindow(object): 19 | 20 | #stylesheet frameok mensagem ok ou error 21 | stylePopupError = ("background-color: rgb(252, 2, 20); border-radius: 10px;") 22 | stylePopupOk = ("background-color: rgb(0, 25, 123); border-radius: 10px;") 23 | 24 | #stylesheet 25 | styleLineEditOk = ("QLineEdit{\n" 26 | " border: 2px solid rgb(45,45,45);\n" 27 | " border: rgb(45,45,45);\n" 28 | " border-radius: 10px;\n" 29 | " padding: 15px;\n" 30 | " background-color: rgb(238, 238, 238);\n" 31 | " color: rgb(0, 0, 0);\n" 32 | "}\n" 33 | "QLineEdit:hover{\n" 34 | " border: 2px solid rgb(45,45,45);\n" 35 | "}\n" 36 | "QLineEdit:focus{\n" 37 | " border: 2px solid rgb(55,55,55);\n" 38 | "}") 39 | 40 | stylePlainTextOk = ("QPlainTextEdit{\n" 41 | " border: 2px solid rgb(45,45,45);\n" 42 | " border: rgb(45,45,45);\n" 43 | " border-radius: 10px;\n" 44 | " padding: 15px;\n" 45 | " background-color: rgb(238, 238, 238);\n" 46 | " color: rgb(0, 0, 0);\n" 47 | "}\n" 48 | "QPlainTextEdit:hover{\n" 49 | " border: 2px solid rgb(45,45,45);\n" 50 | "}\n" 51 | "QPlainTextEdit:focus{\n" 52 | " border: 2px solid rgb(55,55,55);\n" 53 | "}") 54 | 55 | stylePlainTextError = ("QPlainTextEdit{\n" 56 | " border: 2px solid rgb(255,85,127);\n" 57 | " border: rgb(255,85,127);\n" 58 | " border-radius: 10px;\n" 59 | " padding: 15px;\n" 60 | " background-color: rgb(255,85,127);\n" 61 | " color: rgb(0, 0, 0);\n" 62 | "}\n" 63 | "QPlainTextEdit:hover{\n" 64 | " border: 2px solid rgb(255,85,127);\n" 65 | "}\n" 66 | "QPlainTextEdit:focus{\n" 67 | " border: 2px solid rgb(255,85,127);\n" 68 | "}") 69 | 70 | 71 | styleLineEditError = ("QLineEdit{\n" 72 | " border: 2px solid rgb(255,85,127);\n" 73 | " border: rgb(255,85,127);\n" 74 | " border-radius: 10px;\n" 75 | " padding: 15px;\n" 76 | " background-color: rgb(255,85,127);\n" 77 | " color: rgb(0, 0, 0);\n" 78 | "}\n" 79 | "QLineEdit:hover{\n" 80 | " border: 2px solid rgb(255,85,127);\n" 81 | "}\n" 82 | "QLineEdit:focus{\n" 83 | " border: 2px solid rgb(255,85,127);\n" 84 | "}") 85 | 86 | #validando campos 87 | def checandoCampos(self): 88 | textNumero = "" 89 | textMensagem = "" 90 | textHorario = "" 91 | 92 | #limparcampos 93 | def limpaCampos(self): 94 | self.lineEdit_Numero.setText("") 95 | self.plainTextEdit_Mensagem.setPlainText("") 96 | self.lineEdit_Horario.setText("") 97 | 98 | def showMessage(message): 99 | self.frame_error.show() 100 | self.label_error.setText(message) 101 | 102 | #checar número 103 | if not self.lineEdit_Numero.text(): 104 | textNumero = "Número vazio " 105 | self.lineEdit_Numero.setStyleSheet(self.styleLineEditError) 106 | else: 107 | textNumero = "" 108 | self.lineEdit_Numero.setStyleSheet(self.styleLineEditOk) 109 | 110 | #checar MENSAGEM 111 | if not self.plainTextEdit_Mensagem.toPlainText(): 112 | textMensagem = "Mensagem vazio" 113 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextError) 114 | else: 115 | textMensagem = "" 116 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextOk) 117 | 118 | #checar horário 119 | if not self.lineEdit_Horario.text(): 120 | textHorario = " Horário vazio" 121 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditError) 122 | else: 123 | textHorario = "" 124 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditOk) 125 | 126 | #checando campos 127 | if textNumero + textMensagem + textHorario != "": 128 | text = textNumero + textMensagem + textHorario 129 | showMessage(text) 130 | self.frame_error.setStyleSheet(self.stylePopupError) 131 | else: 132 | numero = "+55" + self.lineEdit_Numero.text() 133 | mensagem = self.plainTextEdit_Mensagem.toPlainText() 134 | horario = self.lineEdit_Horario.text() 135 | 136 | #magia, o comando sendwhatmsg precisa de horário em int. Então estou fatiando as string para que eu possa tratar 137 | #quando o usuário digita o minuto em 0. Exemplo: 21:01, esse 01 preciso tratar e remover o 0 (zero). 138 | h = horario[0:2] 139 | m = horario[3:5] 140 | 141 | if int(m[0]) == 0: 142 | m = horario[4] 143 | kit.sendwhatmsg(numero, mensagem, int(h),int(m),3) 144 | showMessage("Mensagem Enviada") 145 | self.frame_error.setStyleSheet(self.stylePopupOk) 146 | limpaCampos(self) 147 | 148 | else: 149 | kit.sendwhatmsg(numero, mensagem, int(h),int(m),3) 150 | showMessage("Mensagem Enviada") 151 | self.frame_error.setStyleSheet(self.stylePopupOk) 152 | limpaCampos(self) 153 | 154 | 155 | def setupUi(self, MainWindow): 156 | MainWindow.setObjectName("MainWindow") 157 | MainWindow.resize(664, 700) 158 | MainWindow.setMinimumSize(QtCore.QSize(500, 700)) 159 | MainWindow.setStyleSheet("background-color: rgb(41,175,135);") 160 | self.centralwidget = QtWidgets.QWidget(MainWindow) 161 | self.centralwidget.setObjectName("centralwidget") 162 | self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) 163 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 164 | self.verticalLayout.setSpacing(0) 165 | self.verticalLayout.setObjectName("verticalLayout") 166 | self.top_bar = QtWidgets.QFrame(self.centralwidget) 167 | self.top_bar.setMaximumSize(QtCore.QSize(16777215, 40)) 168 | self.top_bar.setStyleSheet("") 169 | self.top_bar.setFrameShape(QtWidgets.QFrame.NoFrame) 170 | self.top_bar.setFrameShadow(QtWidgets.QFrame.Raised) 171 | self.top_bar.setObjectName("top_bar") 172 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.top_bar) 173 | self.horizontalLayout_2.setContentsMargins(0, 5, 0, 0) 174 | self.horizontalLayout_2.setSpacing(0) 175 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 176 | self.frame_error = QtWidgets.QFrame(self.top_bar) 177 | self.frame_error.setMaximumSize(QtCore.QSize(400, 16777215)) 178 | self.frame_error.setStyleSheet(self.stylePopupError) 179 | self.frame_error.setFrameShape(QtWidgets.QFrame.NoFrame) 180 | self.frame_error.setFrameShadow(QtWidgets.QFrame.Raised) 181 | self.frame_error.setObjectName("frame_error") 182 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_error) 183 | self.horizontalLayout_3.setContentsMargins(10, 3, 10, 3) 184 | self.horizontalLayout_3.setSpacing(6) 185 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 186 | self.label_error = QtWidgets.QLabel(self.frame_error) 187 | self.label_error.setAlignment(QtCore.Qt.AlignCenter) 188 | self.label_error.setObjectName("label_error") 189 | self.horizontalLayout_3.addWidget(self.label_error) 190 | self.pushButton_closepopup = QtWidgets.QPushButton(self.frame_error) 191 | self.pushButton_closepopup.setMaximumSize(QtCore.QSize(20, 20)) 192 | self.pushButton_closepopup.setStyleSheet("QPushButton{\n" 193 | " border-radius: 5px\n" 194 | "}\n" 195 | "QPushButton:hover{\n" 196 | " background-color: rgb(50,50,50);\n" 197 | " color: rgb(200,200,200);\n" 198 | "}\n" 199 | "QPushButton:pressed{\n" 200 | " background-color: rgb(35,35,35);\n" 201 | " color: rgb(200,200,200);\n" 202 | "}") 203 | self.pushButton_closepopup.setObjectName("pushButton_closepopup") 204 | self.horizontalLayout_3.addWidget(self.pushButton_closepopup) 205 | self.horizontalLayout_2.addWidget(self.frame_error) 206 | self.verticalLayout.addWidget(self.top_bar) 207 | self.content = QtWidgets.QFrame(self.centralwidget) 208 | self.content.setStyleSheet("") 209 | self.content.setFrameShape(QtWidgets.QFrame.NoFrame) 210 | self.content.setFrameShadow(QtWidgets.QFrame.Raised) 211 | self.content.setObjectName("content") 212 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.content) 213 | self.horizontalLayout.setObjectName("horizontalLayout") 214 | self.login_area = QtWidgets.QFrame(self.content) 215 | self.login_area.setMaximumSize(QtCore.QSize(450, 550)) 216 | self.login_area.setStyleSheet("background-color: rgb(255, 255, 255);") 217 | self.login_area.setFrameShape(QtWidgets.QFrame.NoFrame) 218 | self.login_area.setFrameShadow(QtWidgets.QFrame.Raised) 219 | self.login_area.setObjectName("login_area") 220 | self.label_Agende = QtWidgets.QLabel(self.login_area) 221 | self.label_Agende.setGeometry(QtCore.QRect(60, 20, 121, 31)) 222 | font = QtGui.QFont() 223 | font.setFamily("Muna") 224 | font.setPointSize(13) 225 | self.label_Agende.setFont(font) 226 | self.label_Agende.setLayoutDirection(QtCore.Qt.LeftToRight) 227 | self.label_Agende.setStyleSheet("color: rgb(0, 0, 0);") 228 | self.label_Agende.setAlignment(QtCore.Qt.AlignCenter) 229 | self.label_Agende.setObjectName("label_Agende") 230 | self.lineEdit_Numero = QtWidgets.QLineEdit(self.login_area) 231 | self.lineEdit_Numero.setGeometry(QtCore.QRect(70, 100, 321, 50)) 232 | self.lineEdit_Numero.setStyleSheet(self.styleLineEditOk) 233 | self.lineEdit_Numero.setMaxLength(11) 234 | self.lineEdit_Numero.setObjectName("lineEdit_Numero") 235 | 236 | 237 | # 238 | # self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.login_area) 239 | # self.dateTimeEdit.setGeometry(QtCore.QRect(70, 400, 321, 51)) 240 | # self.dateTimeEdit.setStyleSheet("QDateTimeEdit{\n" 241 | # " border: 2px solid rgb(45,45,45);\n" 242 | # " border: rgb(92, 147, 30);\n" 243 | # " border-radius: 10px;\n" 244 | # " padding: 15px;\n" 245 | # " background-color: rgb(238, 238, 238);\n" 246 | # " color: rgb(0, 0, 0);\n" 247 | # "}\n" 248 | # "QDateTimeEdit:hover{\n" 249 | # " border: 2px solid rgb(55,55,55);\n" 250 | # "}\n" 251 | # "QDateTimeEdit:focus{\n" 252 | # " border: 2px solid rgb(55,55,55);\n" 253 | # "}") 254 | # self.dateTimeEdit.setObjectName("dateTimeEdit") 255 | 256 | self.lineEdit_Horario = QtWidgets.QLineEdit(self.login_area) 257 | self.lineEdit_Horario.setGeometry(QtCore.QRect(70, 400, 321, 51)) 258 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditOk) 259 | 260 | self.lineEdit_Horario.setMaxLength(5) 261 | self.lineEdit_Horario.setObjectName("lineEdit_Horario") 262 | 263 | self.plainTextEdit_Mensagem = QtWidgets.QPlainTextEdit(self.login_area) 264 | self.plainTextEdit_Mensagem.setGeometry(QtCore.QRect(70, 160, 321, 221)) 265 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextOk) 266 | self.plainTextEdit_Mensagem.setObjectName("plainTextEdit_Mensagem") 267 | self.pushButton_Enviar = QtWidgets.QPushButton(self.login_area) 268 | self.pushButton_Enviar.setGeometry(QtCore.QRect(70, 480, 331, 51)) 269 | self.pushButton_Enviar.setStyleSheet("QPushButton{\n" 270 | " border: 2px solid rgb(45,45,45);\n" 271 | " border: rgb(45,45,45);\n" 272 | " border-radius: 10px;\n" 273 | " padding: 15px;\n" 274 | " background-color: rgb(41,175,135);\n" 275 | " color: rgb(255, 255, 255);\n" 276 | "}\n" 277 | "QPushButton:hover{\n" 278 | " border: 3px solid rgb(55,55,55);\n" 279 | "}\n" 280 | "") 281 | self.pushButton_Enviar.setObjectName("pushButton_Enviar") 282 | self.label_Agende_2 = QtWidgets.QLabel(self.login_area) 283 | self.label_Agende_2.setGeometry(QtCore.QRect(70, 50, 321, 31)) 284 | font = QtGui.QFont() 285 | font.setFamily("Muna") 286 | font.setPointSize(10) 287 | self.label_Agende_2.setFont(font) 288 | self.label_Agende_2.setLayoutDirection(QtCore.Qt.LeftToRight) 289 | self.label_Agende_2.setStyleSheet("color: rgb(209, 209, 209);") 290 | self.label_Agende_2.setAlignment(QtCore.Qt.AlignCenter) 291 | self.label_Agende_2.setObjectName("label_Agende_2") 292 | self.horizontalLayout.addWidget(self.login_area) 293 | self.verticalLayout.addWidget(self.content) 294 | self.bottom = QtWidgets.QFrame(self.centralwidget) 295 | self.bottom.setMaximumSize(QtCore.QSize(16777215, 35)) 296 | self.bottom.setStyleSheet("") 297 | self.bottom.setFrameShape(QtWidgets.QFrame.NoFrame) 298 | self.bottom.setFrameShadow(QtWidgets.QFrame.Raised) 299 | self.bottom.setObjectName("bottom") 300 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.bottom) 301 | self.verticalLayout_2.setObjectName("verticalLayout_2") 302 | self.label_flavio = QtWidgets.QLabel(self.bottom) 303 | self.label_flavio.setMinimumSize(QtCore.QSize(0, 10)) 304 | self.label_flavio.setStyleSheet("QLabel{\n" 305 | " color: rgb(255, 255, 255);\n" 306 | "}\n" 307 | "\n" 308 | "") 309 | self.label_flavio.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 310 | self.label_flavio.setObjectName("label_flavio") 311 | self.verticalLayout_2.addWidget(self.label_flavio) 312 | self.verticalLayout.addWidget(self.bottom) 313 | MainWindow.setCentralWidget(self.centralwidget) 314 | self.menubar = QtWidgets.QMenuBar(MainWindow) 315 | self.menubar.setGeometry(QtCore.QRect(0, 0, 664, 22)) 316 | self.menubar.setObjectName("menubar") 317 | MainWindow.setMenuBar(self.menubar) 318 | 319 | 320 | #button fechar do frame error, ocultado o frame_error 321 | self.pushButton_closepopup.clicked.connect(lambda: self.frame_error.hide()) 322 | 323 | #ocultando frame Error 324 | self.frame_error.hide() 325 | 326 | #botão enviar MENSAGEM 327 | self.pushButton_Enviar.clicked.connect(self.checandoCampos) 328 | 329 | self.retranslateUi(MainWindow) 330 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 331 | 332 | 333 | 334 | def retranslateUi(self, MainWindow): 335 | _translate = QtCore.QCoreApplication.translate 336 | MainWindow.setWindowTitle(_translate("MainWindow", "WPP Message")) 337 | self.label_error.setText(_translate("MainWindow", "Error")) 338 | self.pushButton_closepopup.setText(_translate("MainWindow", "X")) 339 | self.label_Agende.setText(_translate("MainWindow", "WPPMESSAGE")) 340 | self.lineEdit_Numero.setInputMask(_translate("MainWindow", "00000000009")) 341 | self.lineEdit_Numero.setPlaceholderText(_translate("MainWindow", "DDD+Número")) 342 | self.plainTextEdit_Mensagem.setPlaceholderText(_translate("MainWindow", "Digite sua mensagem ...")) 343 | self.lineEdit_Horario.setInputMask(_translate("MainWindow", "00:09")) 344 | self.lineEdit_Horario.setPlaceholderText(_translate("MainWindow", "Horário: 00:00")) 345 | self.pushButton_Enviar.setText(_translate("MainWindow", "ENVIAR MENSAGEM")) 346 | self.label_Agende_2.setText(_translate("MainWindow", "Agende o envio de mensagem para o WhatsApp")) 347 | self.label_flavio.setText(_translate("MainWindow", "Flávio Oliveira")) 348 | import wppmessage_rc 349 | 350 | 351 | if __name__ == "__main__": 352 | import sys 353 | app = QtWidgets.QApplication(sys.argv) 354 | MainWindow = QtWidgets.QMainWindow() 355 | ui = Ui_MainWindow() 356 | ui.setupUi(MainWindow) 357 | MainWindow.show() 358 | sys.exit(app.exec_()) 359 | -------------------------------------------------------------------------------- /wppmessage/versao1_1_multiple_numbers/README.md: -------------------------------------------------------------------------------- 1 | 2 | [![LinkedIn][linkedin-shield]][linkedin-url] 3 | ![GitHub forks](https://img.shields.io/github/forks/oliveiradeflavio/python?style=for-the-badge) 4 | ![GitHub User's stars](https://img.shields.io/github/stars/oliveiradeflavio?style=for-the-badge) 5 | ![GitHub followers](https://img.shields.io/github/followers/oliveiradeflavio?style=for-the-badge) 6 | 7 | 8 |

AGENDANDO MENSAGENS E ENVIANDO PELO WHATSAPP ATRAVÉS DO WPPMESSAGE

9 | 10 | 11 | 12 | ## Sobre o Projeto 13 | 14 | [![tela inicial][product-screenshot]]() 15 | 16 | A aplicação irá fazer o disparo automático e agendado de mensagens para o app WhatsApp usando uma lista de números que está em uma planilha do Excel. 17 | 18 | ### Construído com 19 | 20 | * [Python](https://www.python.org/) 21 | * [PyWhatkit](https://github.com/Ankit404butfound/PyWhatKit) 22 | * [QT Desginer](https://build-system.fman.io/qt-designer-download) 23 | 24 | 25 | 26 | 27 | ## Começando 28 | 29 | A aplicação disponivel para mac OS, Linux e Windows. Seguir os passos abaixo para poder fazer a instalação. Importante verificar o link abaixo, 30 | onde comento no repositório da biblioteca PyWhatKit. Caso você tenha o mesmo problema no sistema macOS. 31 | 32 | Problemas enfrentado com a lib, comentei na discussão abaixo 33 | https://github.com/Ankit404butfound/PyWhatKit/issues/20 34 | 35 | Link direto de um dos meus testes junto com a solução do desenvolvedor. 36 | https://github.com/Ankit404butfound/PyWhatKit/issues/20#issuecomment-830842688 37 | 38 | ### Pré-requisitos 39 | 40 | Antes de tudo você precisa ter o Python instalado no seu computador. Então vá até o site e baixe a versão 3.9 ou superior. 41 | * python 42 | ```sh 43 | https://www.python.org/ 44 | ``` 45 | Precisará também de uma lista de números salvo em uma planilha de Excel, no formato xlsx. No projeto tem uma planilha em excel, onde tem o modelo de como deve estar configurado os número de whatsApp. 46 | 47 | ### Instalação de bibliotecas 48 | 49 | Instalar as bibliotecas abaixo é obrigado para o funcionamento do script. 50 | ```sh 51 | pip install pandas 52 | ``` 53 | ```sh 54 | pip install xlrd 55 | ``` 56 | ```sh 57 | pip install openpyxl 58 | ``` 59 | ```sh 60 | pip install pywhatkit 61 | ``` 62 | ```sh 63 | pip install platform 64 | ``` 65 | ```sh 66 | pip install keyboard 67 | ``` 68 | 69 | PyWhatKit é uma biblioteca Python com vários recursos úteis. É uma biblioteca fácil de usar que não requer configuração adicional. 70 | 71 | 72 | Frontend desenvolvido com QTDesign 73 | https://build-system.fman.io/qt-designer-download 74 | 75 | 76 | Para Windows users pode ser preciso instalar o PyQT5. 77 | ```sh 78 | pip install PyQt5 79 | ``` 80 | 81 | 82 | ## Demo 83 | 84 | ![Programa aberto](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage.png) 85 | 86 | ![Mensagem de erro](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessage-error.png) 87 | 88 | ![Wpp Message envio multiplo tela](https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessagemulti-screen.png) 89 | 90 | 91 | [Wpp Message Envio para 1 número](https://www.linkedin.com/posts/fladoliveira_interface-usei-o-qtdesign-e-a-linguagem-python-ugcPost-6794717202772721664-qER6) 92 | 93 | [Wpp Message Envio para Vários Números](https://www.linkedin.com/posts/fladoliveira_python-programming-activity-6795549380347871232-fbPz) 94 | 95 | 96 | 97 | ## Roadmap 98 | 99 | Veja os [problemas abertos] (https://github.com/oliveiradeflavio/python/issues) para uma lista de recursos propostos (e problemas conhecidos). 100 | 101 | 102 | 103 | ## Contato 104 | 105 | Flávio Oliveira - [site](http://www.flaviodeoliveira.com.br) - fl.deoliveira@hotmail.com 106 | 107 | Link do Projeto: [https://github.com/oliveiradeflavio/python/tree/master/wppmessage](https://github.com/oliveiradeflavio/python/tree/master/wppmessage) 108 | 109 | 110 | 111 | 112 | 113 | [linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 114 | [linkedin-url]: https://www.linkedin.com/in/fladoliveira/ 115 | [product-screenshot]: https://github.com/oliveiradeflavio/python/blob/master/wppmessage/imagens/wppmessagemultiplosnumeros.png?raw=true 116 | -------------------------------------------------------------------------------- /wppmessage/versao1_1_multiple_numbers/formatacao-planilha-de-numeros.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/oliveiradeflavio/python/92cbe07af5367dfab8d46c9bca85e07f679d9ea3/wppmessage/versao1_1_multiple_numbers/formatacao-planilha-de-numeros.xlsx -------------------------------------------------------------------------------- /wppmessage/versao1_1_multiple_numbers/wppmessage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Form implementation generated from reading ui file 'wppmessage.ui' 4 | # 5 | # Created by: PyQt5 UI code generator 5.15.4 6 | # 7 | # WARNING: Any manual changes made to this file will be lost when pyuic5 is 8 | # run again. Do not edit this file unless you know what you are doing. 9 | # 10 | # Flávio Oliveira - 2021 - Versão 1.0 11 | # https://github.com/oliveiradeflavio 12 | 13 | import pywhatkit as kit 14 | import pandas as pd 15 | import keyboard 16 | from sys import platform 17 | 18 | from PyQt5 import QtCore, QtGui, QtWidgets 19 | 20 | class Ui_MainWindow(object): 21 | 22 | #stylesheet frameok mensagem ok ou error 23 | stylePopupError = ("background-color: rgb(252, 2, 20); border-radius: 10px;") 24 | stylePopupOk = ("background-color: rgb(0, 25, 123); border-radius: 10px;") 25 | 26 | #stylesheet 27 | styleLineEditOk = ("QLineEdit{\n" 28 | " border: 2px solid rgb(45,45,45);\n" 29 | " border: rgb(45,45,45);\n" 30 | " border-radius: 10px;\n" 31 | " padding: 15px;\n" 32 | " background-color: rgb(238, 238, 238);\n" 33 | " color: rgb(0, 0, 0);\n" 34 | "}\n" 35 | "QLineEdit:hover{\n" 36 | " border: 2px solid rgb(45,45,45);\n" 37 | "}\n" 38 | "QLineEdit:focus{\n" 39 | " border: 2px solid rgb(55,55,55);\n" 40 | "}") 41 | 42 | stylePlainTextOk = ("QPlainTextEdit{\n" 43 | " border: 2px solid rgb(45,45,45);\n" 44 | " border: rgb(45,45,45);\n" 45 | " border-radius: 10px;\n" 46 | " padding: 15px;\n" 47 | " background-color: rgb(238, 238, 238);\n" 48 | " color: rgb(0, 0, 0);\n" 49 | "}\n" 50 | "QPlainTextEdit:hover{\n" 51 | " border: 2px solid rgb(45,45,45);\n" 52 | "}\n" 53 | "QPlainTextEdit:focus{\n" 54 | " border: 2px solid rgb(55,55,55);\n" 55 | "}") 56 | 57 | stylePlainTextError = ("QPlainTextEdit{\n" 58 | " border: 2px solid rgb(255,85,127);\n" 59 | " border: rgb(255,85,127);\n" 60 | " border-radius: 10px;\n" 61 | " padding: 15px;\n" 62 | " background-color: rgb(255,85,127);\n" 63 | " color: rgb(0, 0, 0);\n" 64 | "}\n" 65 | "QPlainTextEdit:hover{\n" 66 | " border: 2px solid rgb(255,85,127);\n" 67 | "}\n" 68 | "QPlainTextEdit:focus{\n" 69 | " border: 2px solid rgb(255,85,127);\n" 70 | "}") 71 | 72 | 73 | styleLineEditError = ("QLineEdit{\n" 74 | " border: 2px solid rgb(255,85,127);\n" 75 | " border: rgb(255,85,127);\n" 76 | " border-radius: 10px;\n" 77 | " padding: 15px;\n" 78 | " background-color: rgb(255,85,127);\n" 79 | " color: rgb(0, 0, 0);\n" 80 | "}\n" 81 | "QLineEdit:hover{\n" 82 | " border: 2px solid rgb(255,85,127);\n" 83 | "}\n" 84 | "QLineEdit:focus{\n" 85 | " border: 2px solid rgb(255,85,127);\n" 86 | "}") 87 | 88 | #validando campos 89 | def checandoCampos(self): 90 | textNomeColunaNumeros = "" 91 | textMensagem = "" 92 | textHorario = "" 93 | textCaminhoExcel = "" 94 | 95 | #limparcampos 96 | def limpaCampos(self): 97 | self.lineEdit_NomeColunaNumero.setText("") 98 | self.lineEdit_MultiplosNumeros.setText("") 99 | self.plainTextEdit_Mensagem.setPlainText("") 100 | self.lineEdit_Horario.setText("") 101 | 102 | def showMessage(message): 103 | self.frame_error.show() 104 | self.label_error.setText(message) 105 | 106 | 107 | #checa nome da coluna que tem os números 108 | if not self.lineEdit_NomeColunaNumero.text(): 109 | textNomeColunaNumeros = " Nome coluna vazio" 110 | self.lineEdit_NomeColunaNumero.setStyleSheet(self.styleLineEditError) 111 | else: 112 | textNomeColunaNumeros = "" 113 | self.lineEdit_NomeColunaNumero.setStyleSheet(self.styleLineEditOk) 114 | 115 | #checar horario excel 116 | if not self.lineEdit_Horario.text(): 117 | textHorario = " Horario Vazio " 118 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditError) 119 | else: 120 | textHorario = "" 121 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditOk) 122 | 123 | #checar caminho da planilha excel 124 | if not self.lineEdit_MultiplosNumeros.text(): 125 | textCaminhoExcel = " Diretório vazio" 126 | self.lineEdit_MultiplosNumeros.setStyleSheet(self.styleLineEditError) 127 | else: 128 | textCaminhoExcel = "" 129 | self.lineEdit_MultiplosNumeros.setStyleSheet(self.styleLineEditOk) 130 | 131 | #checar MENSAGEM 132 | if not self.plainTextEdit_Mensagem.toPlainText(): 133 | textMensagem = " Mensagem vazio" 134 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextError) 135 | else: 136 | textMensagem = "" 137 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextOk) 138 | 139 | 140 | #checando campos 141 | if textNomeColunaNumeros + textCaminhoExcel + textMensagem + textHorario != "": 142 | text = textNomeColunaNumeros + textCaminhoExcel + textMensagem + textHorario 143 | showMessage(text) 144 | self.frame_error.setStyleSheet(self.stylePopupError) 145 | else: 146 | nomeColunaNumeros = self.lineEdit_NomeColunaNumero.text() 147 | nomeColunaNumeros = nomeColunaNumeros.lower() 148 | multiploNumeros = self.lineEdit_MultiplosNumeros.text() 149 | caminhoPlanilha = pd.read_excel(multiploNumeros) 150 | mensagem = self.plainTextEdit_Mensagem.toPlainText() 151 | horario = self.lineEdit_Horario.text() 152 | 153 | #magia, o comando sendwhatmsg precisa de horário em int. Então estou fatiando as string para que eu possa tratar 154 | #quando o usuário digita o minuto em 0. Exemplo: 21:01, esse 01 preciso tratar e remover o 0 (zero). 155 | h = horario[0:2] 156 | m = horario[3:5] 157 | 158 | if int(m[0]) == 0: 159 | m = horario[4] 160 | for i in caminhoPlanilha[nomeColunaNumeros]: 161 | kit.sendwhatmsg("+55"+str(i), mensagem, int(h),int(m),1) 162 | m = int(m) + 1 163 | print(m) 164 | if platform == 'win32' or platform == 'linux': 165 | keyboard.press_and_release('ctrl + w') 166 | else: 167 | keyboard.press_and_release('command + w') 168 | showMessage("Mensagem Enviada") 169 | self.frame_error.setStyleSheet(self.stylePopupOk) 170 | limpaCampos(self) 171 | else: 172 | for i in caminhoPlanilha[nomeColunaNumeros]: 173 | kit.sendwhatmsg("+55"+str(i), mensagem, int(h),int(m),1) 174 | m = int(m) + 1 175 | print(m) 176 | if platform == 'win32' or platform == 'linux': 177 | keyboard.press_and_release('ctrl + w') 178 | else: 179 | keyboard.press_and_release('command + w') 180 | showMessage("Mensagem Enviada") 181 | self.frame_error.setStyleSheet(self.stylePopupOk) 182 | limpaCampos(self) 183 | 184 | 185 | def setupUi(self, MainWindow): 186 | MainWindow.setObjectName("MainWindow") 187 | MainWindow.resize(664, 700) 188 | MainWindow.setMinimumSize(QtCore.QSize(500, 700)) 189 | MainWindow.setStyleSheet("background-color: rgb(41,175,135);") 190 | self.centralwidget = QtWidgets.QWidget(MainWindow) 191 | self.centralwidget.setObjectName("centralwidget") 192 | self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget) 193 | self.verticalLayout.setContentsMargins(0, 0, 0, 0) 194 | self.verticalLayout.setSpacing(0) 195 | self.verticalLayout.setObjectName("verticalLayout") 196 | self.top_bar = QtWidgets.QFrame(self.centralwidget) 197 | self.top_bar.setMaximumSize(QtCore.QSize(16777215, 40)) 198 | self.top_bar.setStyleSheet("") 199 | self.top_bar.setFrameShape(QtWidgets.QFrame.NoFrame) 200 | self.top_bar.setFrameShadow(QtWidgets.QFrame.Raised) 201 | self.top_bar.setObjectName("top_bar") 202 | self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.top_bar) 203 | self.horizontalLayout_2.setContentsMargins(0, 5, 0, 0) 204 | self.horizontalLayout_2.setSpacing(0) 205 | self.horizontalLayout_2.setObjectName("horizontalLayout_2") 206 | self.frame_error = QtWidgets.QFrame(self.top_bar) 207 | self.frame_error.setMaximumSize(QtCore.QSize(400, 16777215)) 208 | self.frame_error.setStyleSheet(self.stylePopupError) 209 | self.frame_error.setFrameShape(QtWidgets.QFrame.NoFrame) 210 | self.frame_error.setFrameShadow(QtWidgets.QFrame.Raised) 211 | self.frame_error.setObjectName("frame_error") 212 | self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_error) 213 | self.horizontalLayout_3.setContentsMargins(10, 3, 10, 3) 214 | self.horizontalLayout_3.setSpacing(6) 215 | self.horizontalLayout_3.setObjectName("horizontalLayout_3") 216 | self.label_error = QtWidgets.QLabel(self.frame_error) 217 | self.label_error.setAlignment(QtCore.Qt.AlignCenter) 218 | self.label_error.setObjectName("label_error") 219 | self.horizontalLayout_3.addWidget(self.label_error) 220 | self.pushButton_closepopup = QtWidgets.QPushButton(self.frame_error) 221 | self.pushButton_closepopup.setMaximumSize(QtCore.QSize(20, 20)) 222 | self.pushButton_closepopup.setStyleSheet("QPushButton{\n" 223 | " border-radius: 5px\n" 224 | "}\n" 225 | "QPushButton:hover{\n" 226 | " background-color: rgb(50,50,50);\n" 227 | " color: rgb(200,200,200);\n" 228 | "}\n" 229 | "QPushButton:pressed{\n" 230 | " background-color: rgb(35,35,35);\n" 231 | " color: rgb(200,200,200);\n" 232 | "}") 233 | self.pushButton_closepopup.setObjectName("pushButton_closepopup") 234 | self.horizontalLayout_3.addWidget(self.pushButton_closepopup) 235 | self.horizontalLayout_2.addWidget(self.frame_error) 236 | self.verticalLayout.addWidget(self.top_bar) 237 | self.content = QtWidgets.QFrame(self.centralwidget) 238 | self.content.setStyleSheet("") 239 | self.content.setFrameShape(QtWidgets.QFrame.NoFrame) 240 | self.content.setFrameShadow(QtWidgets.QFrame.Raised) 241 | self.content.setObjectName("content") 242 | self.horizontalLayout = QtWidgets.QHBoxLayout(self.content) 243 | self.horizontalLayout.setObjectName("horizontalLayout") 244 | self.login_area = QtWidgets.QFrame(self.content) 245 | self.login_area.setMaximumSize(QtCore.QSize(450, 550)) 246 | self.login_area.setStyleSheet("background-color: rgb(255, 255, 255);") 247 | self.login_area.setFrameShape(QtWidgets.QFrame.NoFrame) 248 | self.login_area.setFrameShadow(QtWidgets.QFrame.Raised) 249 | self.login_area.setObjectName("login_area") 250 | self.label_Agende = QtWidgets.QLabel(self.login_area) 251 | self.label_Agende.setGeometry(QtCore.QRect(60, 20, 121, 31)) 252 | font = QtGui.QFont() 253 | font.setFamily("Muna") 254 | font.setPointSize(13) 255 | self.label_Agende.setFont(font) 256 | self.label_Agende.setLayoutDirection(QtCore.Qt.LeftToRight) 257 | self.label_Agende.setStyleSheet("color: rgb(0, 0, 0);") 258 | self.label_Agende.setAlignment(QtCore.Qt.AlignCenter) 259 | self.label_Agende.setObjectName("label_Agende") 260 | self.lineEdit_NomeColunaNumero = QtWidgets.QLineEdit(self.login_area) 261 | self.lineEdit_NomeColunaNumero.setGeometry(QtCore.QRect(70, 160, 321, 50)) 262 | self.lineEdit_NomeColunaNumero.setStyleSheet(self.styleLineEditOk) 263 | # self.lineEdit_NomeColunaNumero.setMaxLength(11) 264 | self.lineEdit_NomeColunaNumero.setObjectName("lineEdit_NomeColunaNumero") 265 | 266 | 267 | # 268 | # self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.login_area) 269 | # self.dateTimeEdit.setGeometry(QtCore.QRect(70, 400, 321, 51)) 270 | # self.dateTimeEdit.setStyleSheet("QDateTimeEdit{\n" 271 | # " border: 2px solid rgb(45,45,45);\n" 272 | # " border: rgb(92, 147, 30);\n" 273 | # " border-radius: 10px;\n" 274 | # " padding: 15px;\n" 275 | # " background-color: rgb(238, 238, 238);\n" 276 | # " color: rgb(0, 0, 0);\n" 277 | # "}\n" 278 | # "QDateTimeEdit:hover{\n" 279 | # " border: 2px solid rgb(55,55,55);\n" 280 | # "}\n" 281 | # "QDateTimeEdit:focus{\n" 282 | # " border: 2px solid rgb(55,55,55);\n" 283 | # "}") 284 | # self.dateTimeEdit.setObjectName("dateTimeEdit") 285 | 286 | self.lineEdit_Horario = QtWidgets.QLineEdit(self.login_area) 287 | self.lineEdit_Horario.setGeometry(QtCore.QRect(70, 400, 321, 51)) 288 | self.lineEdit_Horario.setStyleSheet(self.styleLineEditOk) 289 | 290 | self.lineEdit_Horario.setMaxLength(5) 291 | self.lineEdit_Horario.setObjectName("lineEdit_Horario") 292 | self.label_Agende_3 = QtWidgets.QLabel(self.login_area) 293 | self.label_Agende_3.setGeometry(QtCore.QRect(110, 80, 321, 61)) 294 | self.label_Agende_3.setObjectName("label_Agende_3") 295 | self.label_Agende_3.setStyleSheet("color: rgb(0,0,0);") 296 | self.lineEdit_MultiplosNumeros = QtWidgets.QLineEdit(self.login_area) 297 | self.lineEdit_MultiplosNumeros.setGeometry(QtCore.QRect(70, 220, 321, 50)) 298 | self.lineEdit_MultiplosNumeros.setStyleSheet("QLineEdit{\n" 299 | " border: 2px solid rgb(45,45,45);\n" 300 | " border: rgb(45,45,45);\n" 301 | " border-radius: 10px;\n" 302 | " padding: 15px;\n" 303 | " background-color: rgb(238, 238, 238);\n" 304 | " color: rgb(0, 0, 0);\n" 305 | "}\n" 306 | "QLineEdit:hover{\n" 307 | " border: 2px solid rgb(45,45,45);\n" 308 | "}\n" 309 | "QLineEdit:focus{\n" 310 | " border: 2px solid rgb(55,55,55);\n" 311 | "}") 312 | #self.lineEdit_MultiplosNumeros.setMaxLength(11) 313 | self.lineEdit_MultiplosNumeros.setObjectName("lineEdit_MultiplosNumeros") 314 | 315 | self.plainTextEdit_Mensagem = QtWidgets.QPlainTextEdit(self.login_area) 316 | self.plainTextEdit_Mensagem.setGeometry(QtCore.QRect(70, 290, 321, 91)) 317 | self.plainTextEdit_Mensagem.setStyleSheet(self.stylePlainTextOk) 318 | self.plainTextEdit_Mensagem.setObjectName("plainTextEdit_Mensagem") 319 | self.pushButton_Enviar = QtWidgets.QPushButton(self.login_area) 320 | self.pushButton_Enviar.setGeometry(QtCore.QRect(70, 480, 331, 51)) 321 | self.pushButton_Enviar.setStyleSheet("QPushButton{\n" 322 | " border: 2px solid rgb(45,45,45);\n" 323 | " border: rgb(45,45,45);\n" 324 | " border-radius: 10px;\n" 325 | " padding: 15px;\n" 326 | " background-color: rgb(41,175,135);\n" 327 | " color: rgb(255, 255, 255);\n" 328 | "}\n" 329 | "QPushButton:hover{\n" 330 | " border: 3px solid rgb(55,55,55);\n" 331 | "}\n" 332 | "") 333 | self.pushButton_Enviar.setObjectName("pushButton_Enviar") 334 | self.label_Agende_2 = QtWidgets.QLabel(self.login_area) 335 | self.label_Agende_2.setGeometry(QtCore.QRect(70, 50, 321, 31)) 336 | font = QtGui.QFont() 337 | font.setFamily("Muna") 338 | font.setPointSize(10) 339 | self.label_Agende_2.setFont(font) 340 | self.label_Agende_2.setLayoutDirection(QtCore.Qt.LeftToRight) 341 | self.label_Agende_2.setStyleSheet("color: rgb(209, 209, 209);") 342 | self.label_Agende_2.setAlignment(QtCore.Qt.AlignCenter) 343 | self.label_Agende_2.setObjectName("label_Agende_2") 344 | self.horizontalLayout.addWidget(self.login_area) 345 | self.verticalLayout.addWidget(self.content) 346 | self.bottom = QtWidgets.QFrame(self.centralwidget) 347 | self.bottom.setMaximumSize(QtCore.QSize(16777215, 35)) 348 | self.bottom.setStyleSheet("") 349 | self.bottom.setFrameShape(QtWidgets.QFrame.NoFrame) 350 | self.bottom.setFrameShadow(QtWidgets.QFrame.Raised) 351 | self.bottom.setObjectName("bottom") 352 | self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.bottom) 353 | self.verticalLayout_2.setObjectName("verticalLayout_2") 354 | self.label_flavio = QtWidgets.QLabel(self.bottom) 355 | self.label_flavio.setMinimumSize(QtCore.QSize(0, 10)) 356 | self.label_flavio.setStyleSheet("QLabel{\n" 357 | " color: rgb(255, 255, 255);\n" 358 | "}\n" 359 | "\n" 360 | "") 361 | self.label_flavio.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 362 | self.label_flavio.setObjectName("label_flavio") 363 | self.verticalLayout_2.addWidget(self.label_flavio) 364 | self.verticalLayout.addWidget(self.bottom) 365 | MainWindow.setCentralWidget(self.centralwidget) 366 | self.menubar = QtWidgets.QMenuBar(MainWindow) 367 | self.menubar.setGeometry(QtCore.QRect(0, 0, 664, 22)) 368 | self.menubar.setObjectName("menubar") 369 | MainWindow.setMenuBar(self.menubar) 370 | 371 | 372 | #button fechar do frame error, ocultado o frame_error 373 | self.pushButton_closepopup.clicked.connect(lambda: self.frame_error.hide()) 374 | 375 | #ocultando frame Error 376 | self.frame_error.hide() 377 | 378 | #botão enviar MENSAGEM 379 | self.pushButton_Enviar.clicked.connect(self.checandoCampos) 380 | 381 | self.retranslateUi(MainWindow) 382 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 383 | 384 | def retranslateUi(self, MainWindow): 385 | _translate = QtCore.QCoreApplication.translate 386 | MainWindow.setWindowTitle(_translate("MainWindow", "WPP Message")) 387 | self.label_error.setText(_translate("MainWindow", "Error")) 388 | self.pushButton_closepopup.setText(_translate("MainWindow", "X")) 389 | self.label_Agende.setText(_translate("MainWindow", "WPPMESSAGE")) 390 | # self.lineEdit_NomeColunaNumero.setInputMask(_translate("MainWindow", "00000000009")) 391 | self.lineEdit_NomeColunaNumero.setPlaceholderText(_translate("MainWindow", "Nome da coluna do excel que contém os nº")) 392 | self.plainTextEdit_Mensagem.setPlaceholderText(_translate("MainWindow", "Digite sua mensagem ...")) 393 | self.lineEdit_Horario.setInputMask(_translate("MainWindow", "00:09")) 394 | self.lineEdit_Horario.setPlaceholderText(_translate("MainWindow", "Horário: 00:00")) 395 | self.label_Agende_3.setText(_translate("MainWindow", ' A cada disparo será incrementado\n1 minuto no horário de agendamento')) 396 | self.pushButton_Enviar.setText(_translate("MainWindow", "ENVIAR MENSAGEM")) 397 | self.label_Agende_2.setText(_translate("MainWindow", "Agende o envio de mensagem para o WhatsApp")) 398 | # self.lineEdit_MultiplosNumeros.setInputMask(_translate("MainWindow", "00000000009")) 399 | self.lineEdit_MultiplosNumeros.setPlaceholderText(_translate("MainWindow", "Caminho planiha Excel")) 400 | self.label_flavio.setText(_translate("MainWindow", "Flávio Oliveira")) 401 | import wppmessage_rc 402 | 403 | 404 | if __name__ == "__main__": 405 | import sys 406 | app = QtWidgets.QApplication(sys.argv) 407 | MainWindow = QtWidgets.QMainWindow() 408 | ui = Ui_MainWindow() 409 | ui.setupUi(MainWindow) 410 | MainWindow.show() 411 | sys.exit(app.exec_()) 412 | --------------------------------------------------------------------------------