-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbot_module.py
140 lines (121 loc) · 4.57 KB
/
bot_module.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import ElementNotInteractableException, NoSuchElementException
import csv
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
WPP_URL = "https://web.whatsapp.com/"
def le_arquivo(nome_arquivo):
'''
Função que lê o arquivo e retorna seu conteúdo na estrutura de dados adequada
Parâmetro:
nome_arquivo : str
Retorna: list | None
'''
if nome_arquivo == "contatos":
contatos = list()
with open(f"{nome_arquivo}.txt", "r", encoding="utf-8") as f:
contatos = f.read().rstrip().splitlines()
return contatos
elif nome_arquivo == "mensagem":
mensagem = str()
with open(f"{nome_arquivo}.txt", "r", encoding="utf-8") as f:
mensagem = f.read().rstrip().splitlines()
return mensagem
else:
return None
def iniciar_driver(path):
'''
Inicia o ChromeDriver, abre o navegador e retorna uma instância do
ChromeDriver.
Parâmetro:
path : str
'''
driver = webdriver.Chrome(path)
driver.get(WPP_URL)
return driver
def no_remember_me(driver):
'''
Aperta o botão de "rememberMe" para evitar o log-in a longo prazo
Parâmetro: WebDriver object
'''
botao = driver.find_element(By.NAME, "rememberMe")
botao.click()
def barra_de_pesquisa(contato, driver):
'''
Acha a caixa de texto para pesquisar o contato ou nome do grupo e o pesquisa
Parâmetros:
contato : str
driver : WebDriver object
'''
try:
campo_pesquisa = driver.find_element_by_xpath("//div[contains(@class, 'copyable-text selectable-text')]")
campo_pesquisa.click()
campo_pesquisa.send_keys(contato)
campo_pesquisa.send_keys(Keys.ENTER)
except NoSuchElementException:
driver.quit()
def envia_mensagem(mensagem, driver):
'''
Envia a mensagem ao contato
Parâmetros:
mensagem : list
driver : WebDriver object
'''
x_path = "//*[@id='main']/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[2]"
full_x_path = "/html/body/div[1]/div[1]/div[1]/div[4]/div[1]/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[2]"
try:
campo_mensagem = driver.find_elements_by_xpath(full_x_path)
print("Campo mensagem tamanho:" + str(len(campo_mensagem)))
print(campo_mensagem)
#troquei posição 1 por posição 0
campo_mensagem[0].click()
for linha in mensagem:
campo_mensagem[0].send_keys(linha)
campo_mensagem[0].send_keys(Keys.SHIFT, Keys.ENTER)
campo_mensagem[0].send_keys(Keys.ENTER)
except NoSuchElementException:
print(NoSuchElementException)
return
except IndexError:
print(IndexError)
return
def escreve_arquivo_csv(nome, linha):
with open(f"grupos/{nome}.csv", "a", encoding="utf-8", newline="") as f:
escrever = csv.writer(f)
escrever.writerow(linha)
def informacoes_do_grupo(driver, grupo):
'''
Devolve as informações sobre um certo grupo, como nome, descrição
e membros do grupo em um arquivo .csv
Parâmetros:
driver : Webdriver object
grupo : str
'''
# pesquisa o grupo
barra_de_pesquisa(grupo, driver)
barra_nome_do_grupo = driver.find_element_by_xpath("//div[contains(@class, '_2uaUb')]")
barra_nome_do_grupo.click()
# nome completo do grupo
header = ["Nome Grupo", "Descrição"]
nome_grupo = driver.find_element_by_xpath("//div[contains(@class, '_2_1wd')]").get_attribute("textContent")
escreve_arquivo_csv(nome_grupo, header)
try:
# clica botão de mostrar mais
botao_ver_mais = driver.find_element_by_xpath("//span[@class='_1oQqb' and @role='button']")
botao_ver_mais.click()
except ElementNotInteractableException:
pass
finally:
descricao = driver.find_element_by_xpath("//span[contains(@class, '_3-8er')]").get_attribute("textContent")
escreve_arquivo_csv(nome_grupo, [nome_grupo, descricao])
membros = driver.find_element_by_xpath("//span[@class='_7yrSq _3-8er selectable-text copyable-text']")
membros = membros.get_attribute("textContent")
membros = membros.split(", ")
for membro in membros:
escreve_arquivo_csv(nome_grupo, [membro])
def numero_entra_chat(numero, driver):
url = f"https://web.whatsapp.com/send/?phone=%2B{numero[1:]}&text&app_absent=0"
driver.get(url)