Hola Pythoniano(a), hoy crearemos un bot para automatizar algunas funciones de Whatsapp, como enviar mensajes a tus contactos, o usarlo como notificaciónes, hay muchas ideas. ;)
¿QUÉ ES SELENIUM?
Selenium es un entorno de pruebas que se utiliza para comprobar si el software que se está desarrollando funciona correctamente. Esta herramienta permite: grabar, editar y depurar casos de pruebas que se pueden automatizar. Lo interesante de Selenium es que se puede editar acciones o crearlas desde cero.
CARACTERÍSTICAS DE SELENIUM
- Las acciones serán ejecutadas punto a punto, si así se considera.
- A la hora de escribir el código tiene la opción de autocompletar.
- Se puede referenciar a objetos DOM: clases, nombre, ID o rutas XPath.
- Ejecutar test complejos que ahorran muchas horas de trabajo.
- Gran depuración y puntos de verificación
- Almacenamiento en varios formatos los test realizados
INSTALACIÓN
Antes de empezar necesitaremos instalar chromedriver
(servidor que se conecta con nuestro navegador Chrome para automatizar pruebas,
puedes descargar la versión compatible con tu navegador web y sistema operativo:
chromedriver
PREPARANDO EL ENTORNO VIRTUAL
Abrimos una consola o terminal (Linux, Windows ó Mac )
# creamos la carpeta bot-whatsapp
$ mkdir bot-whatsapp
# ingresamos en la carpeta
$ cd bot-whatsapp
# instalamos el generador de entornos virtualenv
$ pip install virtualenv
# creamos el entorno virtual "bot-whatsapp"
$ virtualenv bot-whatsapp
# en Linux o Mac activamos el entorno con el comando:
$ source bot-whatsapp/bin/activate
# en Windows activamos el entorno con el comando:
$ .\bot-whatsapp\Scripts\activate
# instalamos Selenium dentro del entorno
(bot-whatsapp)$ pip install selenium
CREAMOS EL MODULO bot_whatsapp.py
Importamos las siguientes librerias:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
Creamos la clase BotWhatsapp con su inicializador y algunos atributos.
- self.path_driver que es la ruta donde se encuentra el servidor chromedriver que descargaste,
en mi caso seria la ruta '/usr/local/bin/chromedriver' en tu caso sera otra. - self.base_url , usaremos la versión web desktop de whatsapp para automatizar nuestro bot.
- self.timeout es el tiempo máximo que espera selenium hasta que aparezcan algunos elementos de la web.
- self.set_paths() es el método que creara los atributos xpath o css para acceder o identificar elementos de la web.
class BotWhatsapp:
def __init__(self):
self.path_driver = '/usr/local/bin/chromedriver'
self.base_url = 'https://web.whatsapp.com/'
self.timeout = 30
self.set_paths()
Bien ahora definimos el método set_paths() con los siguientes atributos.
def set_paths(self):
self.base_input = '._3FRCZ'
self.firs_contact = '//*[@id="pane-side"]/div[1]/div/div/div[1]'
self.base_sent = '/html/body/div/div/div/div[4]/div/footer/div[1]/div[2]/div/div[2]'
Luego creamos el método start_browser() básicamente lo que hace
es configurar el browser que usaremos , que será
google chrome y algunos parámetros extras , recuerda que ahí le seteo
la variable self.path_driver que es la ruta de tu servidor chromedriver.
def start_browser(self):
options = webdriver.ChromeOptions()
options.add_argument('--disable-infobars')
options.add_argument('--disable-extensions')
options.add_argument('--profile-directory=Default')
options.add_argument("--disable-plugins-discovery")
self.browser = webdriver.Chrome(executable_path=self.path_driver,
chrome_options=options)
self.browser.get(self.base_url)
try:
WebDriverWait(self.browser, self.timeout).until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, self.base_input)))
return True
except Exception as e:
print(e)
return False
Continuamos creando el metodo send_message_to_contact() donde le pasamos los argumentos contacto y mensaje con el siguiente proceso:
- Inicia el browser
- Válida si inicio
- Selecciona el contacto
- Valida si seleccionó
- Selecciona la caja de escribir mensajes
- Itera en nuestros mensajes
- Envía el mensaje usando los metodos de selenium send_keys(Keys.ENTER) que básicamente presiona enter en dicha caja.
¿Genial verdad?
def send_message_to_contact(self, contact, message):
start = self.start_browser()
if not start:
return False
user_search = self.search_user_or_group(contact)
if not (user_search or contact or message):
return False
message = message.strip()
try:
send_msg = WebDriverWait(self.browser, self.timeout).until(
EC.presence_of_element_located(
(By.XPATH, self.base_sent)))
except Exception as e:
print(e)
return
messages = message.split("\n")
for msg in messages:
send_msg.send_keys(msg)
send_msg.send_keys(Keys.SHIFT + Keys.ENTER)
sleep(1)
send_msg.send_keys(Keys.ENTER)
print('mensaje enviado.')
return True
El método final search_user_or_group()
para seleccionar el contacto que le pasamos.
def search_user_or_group(self, contact):
search = self.browser.find_element_by_css_selector(self.base_input)
search.clear()
search.send_keys(contact)
try:
vali_ = WebDriverWait(self.browser, 5).until(
EC.presence_of_element_located(
(By.XPATH, self.firs_contact)))
if vali_.is_displayed():
search.send_keys(Keys.ENTER)
return True
except Exception as e:
print(e)
print('No se encontro contacto.')
return False
EJECUTANDO NUESTRO BotWhatsapp
Entonces la mejor parte, cuando ejecutamos nuestro bot malicioso (no usarlo para fines de spam, please) :D
obj = BotWhatsapp()
obj.send_message_to_contact('100000000', 'Hola, Bro)
Puedes decargar el codigo completo aqui:
Código BotWhatsapp
Genial si completaste el post!,
seguro que te sera muy útil este contenido en alguno de tus proyectos
Hasta pronto Pythoniano!