Microservicio REST para enviar mensajes de Telegram a números de teléfono usando Telethon (Telegram Client API).
- Envío de mensajes a números de teléfono (no requiere que sean contactos)
- API REST simple y fácil de integrar
- Soporte para envío individual y en lote
- Manejo de errores y logs detallados
- Compatible con n8n y otras herramientas de automatización
- Python 3.8 o superior
- Cuenta de Telegram activa
- Credenciales de aplicación de Telegram (API ID y API Hash)
- Visita https://my.telegram.org/apps
- Inicia sesión con tu número de teléfono
- Crea una nueva aplicación
- Guarda tu
api_idyapi_hash
cd python-telegram-api-service
# Crear entorno virtual (recomendado)
python3 -m venv venv
source venv/bin/activate # En Windows: venv\Scripts\activate
# Instalar dependencias
pip install -r requirements.txt# Copiar el archivo de ejemplo
cp .env.example .env
# Editar .env con tus credenciales
nano .envConfigura las siguientes variables:
TELEGRAM_API_ID=12345678
TELEGRAM_API_HASH=abcdef1234567890abcdef1234567890
TELEGRAM_PHONE_NUMBER=+5491112345678
SESSION_NAME=telegram_session
PORT=5000IMPORTANTE: Ejecuta este paso solo la primera vez:
python first_login.pyEste script:
- Te enviará un código de verificación a tu teléfono
- Te pedirá que ingreses el código
- Creará un archivo de sesión (
telegram_session.session) - Si tienes verificación en dos pasos, te pedirá tu contraseña
Guarda el archivo .session en un lugar seguro. Este archivo contiene tu sesión autenticada.
# Modo desarrollo
python app.py
# Modo producción (con gunicorn)
# IMPORTANTE: Usar solo 1 worker porque SQLite no soporta concurrencia
gunicorn -w 1 -b 0.0.0.0:5000 app:appEl servidor estará disponible en http://localhost:5000
Verifica que el servicio esté funcionando.
GET /healthRespuesta:
{
"status": "ok",
"service": "python-telegram-api-service",
"version": "1.0.0"
}Envía un mensaje a un número de teléfono.
POST /send-message
Content-Type: application/json
{
"phone_number": "+5491112345678",
"message": "Hola, este es un mensaje de prueba"
}Respuesta exitosa:
{
"success": true,
"phone_number": "+5491112345678",
"message_id": 12345,
"date": "2025-11-17T14:30:00"
}Respuesta con error:
{
"success": false,
"error": "invalid_phone",
"message": "Número de teléfono inválido: +123"
}Envía múltiples mensajes en una sola petición.
POST /send-batch
Content-Type: application/json
{
"messages": [
{
"phone_number": "+5491112345678",
"message": "Mensaje para el usuario 1"
},
{
"phone_number": "+5491187654321",
"message": "Mensaje para el usuario 2"
}
]
}Respuesta:
{
"success": true,
"total": 2,
"sent": 2,
"failed": 0,
"results": [
{
"success": true,
"phone_number": "+5491112345678",
"message_id": 12345,
"date": "2025-11-17T14:30:00"
},
{
"success": true,
"phone_number": "+5491187654321",
"message_id": 12346,
"date": "2025-11-17T14:30:01"
}
]
}| Código de Error | Descripción |
|---|---|
invalid_phone |
Número de teléfono inválido o no existe en Telegram |
privacy_restricted |
El usuario no permite mensajes de desconocidos |
send_failed |
Error general al enviar el mensaje |
missing_data |
Faltan datos en la petición |
internal_error |
Error interno del servidor |
- En tu workflow de n8n, reemplaza el nodo "Telegram" con "HTTP Request"
- Configura el nodo así:
- Method: POST
- URL:
http://localhost:5000/send-message(o la URL de tu servidor) - Body Content Type: JSON
- Body:
{ "phone_number": "={{ $json.telefono }}", "message": "Hola, este es un mensaje automático desde nuestro sistema." }
Crea un servicio systemd:
sudo nano /etc/systemd/system/telegram-api.serviceContenido:
[Unit]
Description=Telegram API Microservice
After=network.target
[Service]
Type=simple
User=tu_usuario
WorkingDirectory=/ruta/a/python-telegram-api-service
Environment="PATH=/ruta/a/python-telegram-api-service/venv/bin"
ExecStart=/ruta/a/python-telegram-api-service/venv/bin/gunicorn -w 1 -b 0.0.0.0:5000 app:app
Restart=always
[Install]
WantedBy=multi-user.targetIniciar el servicio:
sudo systemctl enable telegram-api
sudo systemctl start telegram-api
sudo systemctl status telegram-apiEste proyecto incluye configuración completa de Docker. Ver DEPLOYMENT.md para instrucciones detalladas.
Inicio rápido:
# 1. Autenticarse primero (genera telegram_session.session)
python first_login.py
# 2. Configurar variables de entorno
cp .env.example .env
nano .env
# 3. Ejecutar con Docker Compose
docker-compose up -dImportante: El archivo .session debe generarse ANTES de usar Docker.
- Sube el código a un repositorio Git
- Conecta el repositorio a Render
- Configura las variables de entorno en Render
- IMPORTANTE: Sube el archivo
.sessionmanualmente al servidor de Render
-
Protege tu archivo .session: Este archivo contiene tu sesión autenticada. No lo compartas ni lo subas a repositorios públicos.
-
Usa HTTPS en producción: Nunca expongas el servicio en HTTP en producción.
-
Implementa autenticación: Agrega autenticación con API Keys:
API_KEY = os.getenv('API_KEY') @app.before_request def check_api_key(): if request.endpoint != 'health_check': api_key = request.headers.get('X-API-Key') if api_key != API_KEY: return jsonify({'error': 'Unauthorized'}), 401
-
Rate limiting: Implementa límites de tasa para evitar abuso.
-
Firewall: Restringe el acceso al puerto 5000 solo a IPs autorizadas.
- Ejecuta
python first_login.pynuevamente - Verifica que el archivo
.sessionexista y tenga permisos correctos
- Telegram tiene límites de envío de mensajes
- Espera el tiempo indicado antes de enviar más mensajes
- Considera implementar colas y throttling
- Verifica que el número esté en formato internacional (+código_país + número)
- Asegúrate de que el número tenga Telegram instalado
- Verifica la configuración de privacidad del usuario
- Algunos usuarios solo aceptan mensajes de contactos
MIT
Para problemas o preguntas, abre un issue en el repositorio.