Objetivo: Automatizar el envío de mensajes de Instagram Direct a uno o varios usuarios, exponiendo una API REST con FastAPI y una UI de escritorio con Flet, utilizando Selenium + ChromeDriver para controlar el navegador y PostgreSQL para persistir información de los chats.
git clone <URL_DEL_REPO>
cd <carpeta_del_repo>
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
sudo apt update
sudo apt install -y postgresql postgresql-contrib
sudo -u postgres psql -c "CREATE USER YOUR_DB_USER WITH PASSWORD 'YOUR_DB_PASSWORD';"
sudo -u postgres psql -c "CREATE DATABASE instagram_bot OWNER YOUR_DB_USER;"
cp .env.example .env
Editar .env con tus valores:
IG_USERNAME=YOUR_IG_USERNAME
IG_PASSWORD=YOUR_IG_PASSWORD
CHROME_BINARY=/usr/bin/google-chrome-stable
DATABASE_URL=postgresql+psycopg2://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot
cd ~/Descargas
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt -f install
which google-chrome-stable
chmod +x chromedriver
sudo mv chromedriver /usr/local/bin/chromedriver
chromedriver --version
chromedriver --port=9515
cd <carpeta_del_repo>
source .venv/bin/activate
python main.py
La API queda disponible en:
- API base:
http://127.0.0.1:8000 - Swagger UI:
http://127.0.0.1:8000/docs
cd <carpeta_del_repo>
source .venv/bin/activate
python ui_flet.py
La aplicación automatiza el envío de mensajes por Instagram Direct a uno o varios usuarios.
Proporciona:
- Una API REST (FastAPI) para disparar el proceso desde HTTP (Swagger, scripts, etc.).
- Una interfaz gráfica con Flet para cargar destinatarios, mensajes y archivos.
- Un motor de automatización basado en Selenium + ChromeDriver, que controla el navegador y ejecuta las acciones en Instagram como si fuera un usuario humano.
-
FastAPI
Expone el endpoint:
POST /api/sendque recibe un payload con:recipients: lista de usernames othread_id.messages: lista de textos a enviar.attachments: rutas de archivos (en desarrollo desde la UI).
-
Selenium + ChromeDriver
- Inicia sesión en Instagram usando
IG_USERNAME/IG_PASSWORD. - Usa URLs directas hacia los chats (por ejemplo
https://ig.me/m/<username>yhttps://www.instagram.com/direct/t/<thread_id>/), evitando depender de hacer clic en todos los elementos de la UI.
- Inicia sesión en Instagram usando
-
PostgreSQL + SQLAlchemy
- Mantiene una tabla
threadsdonde se guarda:username(ej.usuariosin@).thread_iddel chat.- contador de mensajes enviados (
messages_sent).
- Mantiene una tabla
-
Flet
- UI de escritorio para:
- Cargar destinatarios.
- Escribir mensajes.
- Disparar el endpoint del backend desde un formulario.
- UI de escritorio para:
- Login en Instagram (una vez al inicio de la ejecución).
- Para cada destinatario:
- Si se recibe un username:
- Se busca primero en la tabla
threads. - Si no existe, se abre
https://ig.me/m/<username>para que Instagram cree/abra el chat. - Se extrae el
thread_idde la URL final y se guarda en la base.
- Se busca primero en la tabla
- Si se recibe directamente un
thread_idnumérico, se usa tal cual.
- Si se recibe un username:
- Se navega a
https://www.instagram.com/direct/t/<thread_id>/. - Se cierra el popup “Turn on Notifications” haciendo clic en “Not Now”.
- Se localiza el área de texto del chat y se envían los mensajes.
- Se actualiza el contador
messages_senten la tablathreads.
- Linux (Ubuntu, Zorin u otra distribución basada en Debian).
- Python 3.11+
- PostgreSQL 14+ (servidor y cliente
psql) - Google Chrome instalado desde paquete
.deb. - ChromeDriver compatible con la versión de Chrome instalada.
- Git (para clonar el repositorio).
git clone <URL_DEL_REPO>
cd <carpeta_del_repo>
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
sudo apt update
sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
psql --version
Crear usuario y base (ajusta nombres propios):
sudo -u postgres psql -c "CREATE USER YOUR_DB_USER WITH PASSWORD 'YOUR_DB_PASSWORD';"
sudo -u postgres psql -c "CREATE DATABASE instagram_bot OWNER YOUR_DB_USER;"
Probar conexión:
psql postgresql://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot
cp .env.example .env
Editar con tus datos:
IG_USERNAME=YOUR_IG_USERNAME
IG_PASSWORD=YOUR_IG_PASSWORD
CHROME_BINARY=/usr/bin/google-chrome-stable
DATABASE_URL=postgresql+psycopg2://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot
Instalar Chrome desde el .deb descargado:
cd ~/Descargas
sudo dpkg -i google-chrome-stable_current_amd64.deb
sudo apt -f install
which google-chrome-stable
Instalar ChromeDriver:
chmod +x chromedriver
sudo mv chromedriver /usr/local/bin/chromedriver
chromedriver --version
Terminal 1 (ChromeDriver):
chromedriver --port=9515
Terminal 2 (API):
cd <carpeta_del_repo>
source .venv/bin/activate
python main.py
Terminal 3 (UI Flet, opcional):
cd <carpeta_del_repo>
source .venv/bin/activate
python ui_flet.py
IG_USERNAME: usuario de Instagram que se usará para iniciar sesión.IG_PASSWORD: contraseña de Instagram.CHROME_BINARY: ruta al ejecutable de Chrome en Linux.DATABASE_URL: cadena de conexión a PostgreSQL, formato:
postgresql+psycopg2://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot
El módulo app.config:
- Lee el archivo
.env. - Valida la existencia de
IG_USERNAME,IG_PASSWORDyDATABASE_URL. - Configura la ruta de
CHROME_BINARYpara Selenium.
La aplicación crea una tabla equivalente a:
CREATE TABLE IF NOT EXISTS threads (
id SERIAL PRIMARY KEY,
username TEXT NOT NULL UNIQUE,
thread_id TEXT NOT NULL UNIQUE,
messages_sent INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
Uso de columnas:
username: nombre de usuario de Instagram (normalizado, sin@).thread_id: identificador del chat (parte numérica de la URL/direct/t/...).messages_sent: contador simple de mensajes enviados a ese usuario.
Probar conexión a la base:
psql postgresql://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot -c "SELECT now();"
Ver la tabla threads:
psql postgresql://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot -c "\d+ threads"
Ver últimos registros:
psql postgresql://YOUR_DB_USER:YOUR_DB_PASSWORD@localhost:5432/instagram_bot -c "SELECT * FROM threads ORDER BY id DESC LIMIT 10;"
POST /api/send— envía mensajes a uno o varios destinatarios.
curl -X POST "http://127.0.0.1:8000/api/send" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"recipients": ["@usuario1", "@usuario2"],
"messages": ["Hola, este es un mensaje automatizado"],
"attachments": []
}'
Respuesta esperada (200 OK):
{
"success": true,
"detail": "Mensajes enviados correctamente."
}
- Abrir
http://127.0.0.1:8000/docs. - Seleccionar
POST /api/send. - Click en Try it out.
- Completar el JSON con tus destinatarios y mensajes.
- Ejecutar con Execute para disparar la automatización.
Objetivo: alta cohesión y bajo acoplamiento. Cada módulo tiene una responsabilidad clara para facilitar mantenimiento y evolución.
.
├─ main.py # Punto de entrada de la API (inicia FastAPI/Uvicorn)
├─ ui_flet.py # Frontend Flet (formulario gráfico)
├─ app/
│ ├─ __init__.py
│ ├─ api/
│ │ ├─ main.py # Crea instancia de FastAPI y monta el router
│ │ └─ routes.py # Define el endpoint /api/send
│ ├─ core/
│ │ └─ instagram_bot.py # Lógica Selenium: login, ig.me, thread_id, envío
│ ├─ db.py # SQLAlchemy: engine, SessionLocal, Base
│ ├─ models.py # Modelo Thread (username, thread_id, stats)
│ └─ config.py # Carga de .env y variables de configuración
├─ requirements.txt # Dependencias de Python del proyecto
├─ .env.example # Plantilla de configuración de entorno
└─ README.md # Documentación técnica
-
app/api/Capa HTTP (FastAPI); solo recibe requests, valida y delega en la lógica del bot.
-
app/core/Lógica de negocio y automatización con Selenium (login, navegación, envío de mensajes).
-
app/db.pyyapp/models.pyCapa de persistencia con SQLAlchemy + PostgreSQL.
-
ui_flet.pyInterfaz de usuario para no depender únicamente de Swagger o
curl.
Algunas ideas para siguientes iteraciones del proyecto:
- Terminar y robustecer el flujo de adjuntar imágenes/archivos directamente desde Flet.
- Manejar tamaños máximos, tipos de archivo permitidos y errores de carga.
- Soporte para 2FA, códigos de seguridad o flujos de verificación adicionales.
- Detección de bloqueos temporales y reintentos controlados.
- Tests para la lógica de obtención de
thread_id. - Tests para normalización de usernames.
- Tests de integración simulando respuestas de la API de FastAPI.
- Dockerizar:
- API FastAPI.
- PostgreSQL.
- Chrome + ChromeDriver (por ejemplo, imagen Selenium standalone).
- Añadir
docker-compose.ymlpara levantar todo el entorno con un solo comando.
- Endpoint o vista para ver:
- Cuántos mensajes se enviaron por usuario.
- Qué cuentas ya tienen
thread_idguardado. - Historial básico de envíos.
- Nunca incluyas credenciales reales en el repositorio.
- Usa siempre el archivo
.envlocal y no lo subas a Git.
- Usa siempre el archivo
- Las credenciales de Instagram (
IG_USERNAMEyIG_PASSWORD) deben ser propias de quien ejecute la herramienta. - Respetar siempre los Términos y Condiciones de Instagram:
- No hacer spam.
- No automatizar acciones en cuentas que no te hayan autorizado.
- No usar el bot con fines maliciosos.
- El proyecto está pensado para:
- Aprendizaje.
- Demostración técnica.
- Uso controlado en contexto de portfolio.