├── .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 | 
4 | 
5 | 
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 | 
4 | 
5 | 
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 | 
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 | 
4 | 
5 | 
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 | 
4 | 
5 | 
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 | 
4 | 
5 | 
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 | 
78 |
79 | 
80 |
81 | 
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 | 
4 | 
5 | 
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 | 
78 |
79 | 
80 |
81 | 
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 | 
4 | 
5 | 
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 | 
85 |
86 | 
87 |
88 | 
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 |
--------------------------------------------------------------------------------