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.