A modern Python library for automating WhatsApp Web using Playwright
Project description
WhatsPlay 🚀
Automatización avanzada de WhatsApp Web usando Playwright y Python.
Permite interactuar con mensajes no leídos, autenticar mediante código QR y realizar acciones complejas a través de eventos personalizados y filtrado de mensajes.
✨ Características
- Eventos asíncronos: escucha eventos como
on_start,on_auth,on_unread_chat. - Persistencia de sesión: guarda datos de autenticación en un directorio local para no escanear el QR cada vez.
- Apertura de chat por nombre o teléfono: si no conocés el
chat_nameexacto, pasá el número de teléfono completo (con prefijo de país). - Envío y recepción de mensajes (texto y multimedia).
- Filtros personalizados para procesar solo los mensajes que te interesen.
- Extracción automática de código QR para autenticación.
- Compatibilidad con servidores sin GUI gracias a Playwright en modo headless.
- Detección robusta de mensajes no leídos con múltiples heurísticas (aria-labels, badges, font-weight).
- Búsqueda mejorada con estrategias de fallback para máxima compatibilidad.
- Selectores actualizados compatibles con WhatsApp Web 2024-2025.
📦 Arquitectura
- Modularidad: cada componente (cliente, gestor de chats, filtros, autenticación) está separado.
- Mantenibilidad: componentes independientes y bien definidos.
- Testabilidad: cada módulo puede probarse por separado.
- Reutilización: los módulos pueden usarse en otros proyectos.
🛠 Instalación
Prerrequisitos
- Python 3.8 o superior
Instalación desde PyPI
pip install whatsplay
Después de instalar la librería, descargá los navegadores de Playwright con:
python -m playwright install
▶️ Ejemplos de uso
WhatsPlay está construido sobre asyncio, por lo que todas las operaciones son asíncronas.
A continuación se muestra un ejemplo básico para iniciar sesión, escuchar eventos y enviar un mensaje.
Nota: siempre usá funciones async def como manejadores de eventos, ya que el sistema de eventos los invoca de forma asíncrona.
import asyncio
from pathlib import Path
from whatsplay import Client
from whatsplay.auth import LocalProfileAuth
async def main() -> None:
data_dir = Path.home() / "Documents" / "whatsapp_session"
data_dir.mkdir(parents=True, exist_ok=True)
auth = LocalProfileAuth(data_dir)
client = Client(auth=auth, headless=False)
@client.event("on_start")
async def on_start():
print("✅ Cliente iniciado")
@client.event("on_auth")
async def on_auth():
print("📸 Mostrando QR en pantalla")
@client.event("on_unread_chat")
async def on_unread_chat(chat_name, messages):
# Si no conocés el nombre exacto, podés usar el número de teléfono
await client.send_message(chat_name, "Hola, este es un mensaje automático!")
await client.start()
if __name__ == "__main__":
asyncio.run(main())
📚 Ejemplos Adicionales
La carpeta /examples incluye varios scripts de ejemplo para diferentes casos de uso:
simple_example.py: Ejemplo básico con eventos y auto-respuesta a mensajes no leídosopen_example.py: Cómo abrir un chat específico programáticamentesearch_example.py: Búsqueda de conversaciones con resultados detalladoswsp.py: Herramienta CLI para envío rápido de mensajes desde terminal
Consulta la documentación completa en src/DOCUMENTACION.md para instrucciones detalladas de cada ejemplo.
📦 Dependencias
Principales
playwright– Automatización de navegador
Desarrollo
pytest– Framework de testingpytest-asyncio– Soporte para pruebas asíncronasblack– Formateador de códigoflake8– Lintermypy– Verificación de tiposrequests– Uso en entornos de desarrollo y pruebas
🤝 Contribuciones
- Hacé un fork del repositorio.
- Creá una rama (
git checkout -b feature/nueva-funcionalidad). - Commit de tus cambios (
git commit -am 'Agrega nueva funcionalidad'). - Push (
git push origin feature/nueva-funcionalidad). - Abrí un Pull Request.
🗺 Roadmap
Completado ✅
- [✅] Soporte para mensajes multimedia (imágenes, videos, audios)
- [✅] Filtros para mensajes (MessageFilter)
- [✅] Detección robusta de chats no leídos
- [✅] Búsqueda mejorada con múltiples estrategias
- [✅] Selectores actualizados para WhatsApp Web 2024-2025
- [✅] Soporte para listas virtualizadas
En desarrollo 🚧
- Mejoras en detección de tipos de mensajes específicos
- API para envío de archivos multimedia
- Soporte para mensajes con reacciones
Planificado 🔮
- Integración con webhooks
- Dashboard web de monitoreo
- Soporte para múltiples cuentas simultáneas
❓ FAQ
¿Es seguro usar WhatsPlay? Usa la interfaz oficial de WhatsApp Web; es tan seguro como usar WhatsApp en un navegador.
¿Puede ser detectado por WhatsApp? Siempre hay riesgo al automatizar servicios web. Úsalo bajo tu responsabilidad.
¿Funciona sin GUI? Sí, gracias al modo headless de Playwright.
🐞 Reporte de bugs
Abrí un issue con:
- Descripción del problema
- Pasos para reproducirlo
- Versión de Python y dependencias
- Logs relevantes
📄 Licencia
Licencia Apache 2.0.
⭐ Dejá una estrella si te resultó útil
Hecho con ❤️ por Markbusking
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whatsplay-2.0.0.tar.gz.
File metadata
- Download URL: whatsplay-2.0.0.tar.gz
- Upload date:
- Size: 49.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f5252901d4183a70334f3bfe09b9bb697bb36d49f5734c39671ba958374386d
|
|
| MD5 |
1e29357e487e4c4fa98b12e8ea8c25c1
|
|
| BLAKE2b-256 |
1c2f6a789f817dd8bb5d1782bf54842fe1cb288ab1f2dc7878fd158600074af1
|
File details
Details for the file whatsplay-2.0.0-py3-none-any.whl.
File metadata
- Download URL: whatsplay-2.0.0-py3-none-any.whl
- Upload date:
- Size: 45.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fb96c00ecc37d2b2d954a410873d3d07a28fa33285fb3ebf81a0b59729a3a06
|
|
| MD5 |
0c75b1dad6efb88154cd8efeaee7212d
|
|
| BLAKE2b-256 |
ad5129d2bcf5cfed740dd619d0e803974150d52b34d714df404df108c9e552ed
|