Enviar mensajes a Whatsapp desde Flask

Enviar mensajes a Whatsapp desde Flask

Ponerle la función a Flask de enviar mensajes a grupos o contactos de Whatsapp, puede ser un reto si no se usa la API propia de Facebook. Más aún hacerlo a través del navegador, porque Whatsapp web solo admite una pestaña por navegador. Por eso te explico cómo enviar mensajes a Whatsapp desde Flask.

La librería que nos proporciona la funcionalidad de enviar mensajes a Whatsapp con Python, es la librería pywhatkit. Lo que hacemos con esta librería es armar la información con el número de celular del contacto y el mensaje, para pasarsela a Whatsapp web por medio del navegador prederminado del sistema.

Pero como en nuestro caso Flask está un ambiente productivo, ejecutado por Apache web server, así que necesitamos de otra librería llamada ‘python-xlib‘, que nos ayuda a pasar la información desde Flask a Whatsapp web. La librería ‘python-xlib‘ sirve de interfaz entre Python y la biblioteca Xlib de Linux, así logramos que Flask abra el navegador para usar Whatsapp web.

Enviar mensajes a Whatsapp desde Flask


Este es mi esquema general:

Lo primero, instalamos las librerías ‘pywhatkit’ y ‘python-xlib‘ (además de tkinter para el manejo del mouse por parte de pywhatkit):

sudo pip install python-xlib
pip install pywhatkit
sudo apt install python3-tk python3-dev

Pongo el código repartido entre dos archivos y lo explico brevemente:

El main.py (Flask)

from flask import Flask, request, Response, render_template, redirect, flash, url_for, make_response
import os

app = Flask(__name__, template_folder="templates")

@app.route("/mibot", methods=["GET"])
def mibot():
    linea_celular = request.args.get("numero")
    cmd = "export DISPLAY=:1002; /var/www/botwhatsapp/whatsapp.py {0} &".format(linea_celular)
    os.system(cmd)

    return render_template("notifica_wsp.html")

if __name__ == '__name__':
    app.run()

El whatsapp.py (pywhatkit)

#!/usr/bin/env python3.8
import pywhatkit as pwk
import sys
#Recibimos el número de contacto como parámetro de este script
contacto = str(int(sys.argv[1]))
contacto = "+57"+contacto

try:
# Enviamos el mensaje a una línea de Colombia (+57) a las 8:42 pm
pwk.sendwhatmsg(contacto, "Hola, cómo vas?", 20, 42)

# aviso de error
except:
print("Error enviando el mensaje")

Y como te abrás imaginado, la URL que le entrega el número de contacto a Python es la siguiente:

http://192.168.0.170/botwhatsapp/mibot?numero=3178751154

Explicación


En la línea 9 del ‘main.py‘ armamos el comando que vamos a pasarle a Linux por medio de la librería ‘os‘ de Python, para que lo ejecute en la sesión gráfica iniciada en el sistema, y así poder abrir el navegador con Whatsapp web. El comando del sistema ‘export DISPLAY:1002‘ es el que realmente envía el script ‘whatsapp.py‘ al ambiente gráfico para abrir el navegador. El número que X le asignó a esa sesión, que en mi caso es la 1002, la podemos verificar ese número con cualquiera de los siguientes comandos:

env | grep DISPLAY
echo $DISPLAY

Enviar mensaje de Whatsapp con la forma de subprocess


Otra forma de ejecutar el script ‘whatsapp.py‘ desde Flask, es con la librería subprocess. Este su esquema general:

Su código:

from flask import Flask, request, Response, render_template, redirect, flash, url_for, make_response
import shlex
import subprocess

app = Flask(__name__, template_folder="templates")

def start(command):
    subprocess.run(shlex.split(command))


@app.route("/mibot", methods=["GET"])
def mibot():
    #linea_celular = request.args.get("numero")
    cmd = "/var/www/pocket/portal/botwhatsapp/envia_mensaje.py 573178751154 &"

    start(cmd)

    return render_template("notifica_wsp.html")


if __name__ == '__name__':
    app.run()

La línea 8 que contiene la función ‘subprocess.run()‘, es la que ejecuta el script que envía el mensaje a Whatsapp. Pero verás que ese punto representa una dificultad adicional, y es que no, no admite el comando ‘export DISPLAY‘ de Linux. Por eso, he creado un nuevo script llamado ‘envia_mensaje.py‘ que puede ser ejecutado por la función ‘subprocess.run()‘, y entonces el script ‘envia_mensaje.py‘ ejecuta a su vez el script ‘whatsapp.py‘, para finalmente enviar el mensaje a Whatsapp.

Oportunidad de mejora


Debido a que Whatsapp web solo admite una pestaña por navegador, podría verse afectada la eficacia de esta solución si Flask recibe númerosas solicitudes sin margén de tiempo, para enviar mensajes. Debido a eso, deberíamos implementar en el archivo ‘whatsapp.py‘ (o con cualquier otro) un mecanismo que lleve el control del turno, o implementar un proceso en Python que controle el flujo de mensajes con una cola de prioridad FIFO.

 


Valora este artículo:

Enviar mensajes a Whatsapp desde Flask
5,0 rating based on 12.345 ratings
Overall rating: 5 out of 5 based on 1 reviews.
Name
Email
Review Title
Rating
Review Content

Elegante profe

★★★★★
Está muy interesante, hasta solo lo podía usar ejecutando python en lamisma sesión.
- Yeison Balanta
Comparte esto en
Publicado en Desarrollo Web.