Bot automático de Twitter que publica estadísticas de aviación argentina usando datos de la API de Aviadata.
- Cronograma automático: 14 tipos de tweets distribuidos a lo largo del mes
- Recuperación automática: Detecta y publica tweets perdidos
- Logs persistentes: SQLite para tracking de tweets enviados
- Detección de nuevos meses: Se actualiza automáticamente cuando hay datos nuevos
- Rate limit handling: Manejo inteligente de límites de Twitter
- Contenido variado: Tweets humanizados con múltiples variaciones
| Día | Tipo de Post | Descripción |
|---|---|---|
| 0 | Resumen mensual | KPIs generales del mes nuevo |
| 2 | Top aerolíneas | Ranking de aerolíneas por vuelos |
| 4 | Rutas transitadas | Rutas más populares |
| 6 | Aeropuertos activos | Aeropuertos con más movimiento |
| 8 | Destinos internacionales | Top países de destino |
| 10 | Evolución histórica | Comparativa últimos 4 meses |
| 12 | Ocupación promedio | Porcentaje de ocupación por aerolínea |
| 14 | Comparativa aeropuertos | Análisis de aeropuertos principales |
| 16 | Récords y curiosidades | Datos curiosos del mes |
| 18 | Aerolíneas inusuales | Vuelos poco comunes |
| 20 | Comparativa mensual | Vs mes anterior |
| 22 | Rutas internacionales | Top rutas internacionales |
| 24 | Promedios por clase | Análisis por clase de vuelo |
| 26 | Recap gráfico | Resumen visual del mes |
# Si tienes git
git clone <tu-repo>
cd twitter-bot-standalone
# O simplemente descarga los archivos:
# - bot.py
# - requirements.txt
# - README.md
# - .env.examplepip install -r requirements.txtCopia el archivo de ejemplo y completa con tus credenciales:
cp .env.example .envEdita .env y completa:
TWITTER_API_KEY=tu_api_key_real
TWITTER_API_SECRET=tu_api_secret_real
TWITTER_ACCESS_TOKEN=tu_access_token_real
TWITTER_ACCESS_SECRET=tu_access_secret_real
TWITTER_BEARER_TOKEN=tu_bearer_token_real
AVIADATA_API_URL=https://tu-backend-aviadata.com- Ve a Twitter Developer Portal
- Crea una nueva App o selecciona una existente
- Ve a "Keys and tokens"
- Genera y copia:
- API Key →
TWITTER_API_KEY - API Secret →
TWITTER_API_SECRET - Bearer Token →
TWITTER_BEARER_TOKEN - Access Token →
TWITTER_ACCESS_TOKEN - Access Secret →
TWITTER_ACCESS_SECRET
- API Key →
Nota: Este bot usa Twitter API v2. Necesitas al menos acceso "Elevated" (gratuito) o "Basic" ($100/mes) para publicar tweets.
python bot.py| Variable | Descripción | Requerida | Default |
|---|---|---|---|
TWITTER_API_KEY |
API Key de Twitter | ✅ Sí | - |
TWITTER_API_SECRET |
API Secret de Twitter | ✅ Sí | - |
TWITTER_ACCESS_TOKEN |
Access Token de Twitter | ✅ Sí | - |
TWITTER_ACCESS_SECRET |
Access Secret de Twitter | ✅ Sí | - |
TWITTER_BEARER_TOKEN |
Bearer Token de Twitter (API v2) | ✅ Sí | - |
AVIADATA_API_URL |
URL de la API de Aviadata | ✅ Sí | - |
DATA_DIR |
Directorio para logs SQLite | ❌ No | . (directorio actual) |
- Ve a Twitter Developer Portal
- Crea una nueva App
- Ve a "Keys and Tokens"
- Genera:
- API Key (TWITTER_API_KEY)
- API Secret (TWITTER_API_SECRET)
- Bearer Token (TWITTER_BEARER_TOKEN)
- Access Token (TWITTER_ACCESS_TOKEN)
- Access Secret (TWITTER_ACCESS_SECRET)
python bot.pyEl bot se ejecutará hasta que lo detengas con Ctrl+C.
# Crear archivo de servicio
sudo nano /etc/systemd/system/aviadata-twitter-bot.service
# Contenido del archivo:
[Unit]
Description=Aviadata Twitter Bot
After=network.target
[Service]
Type=simple
User=tu-usuario
WorkingDirectory=/ruta/al/bot
EnvironmentFile=/ruta/al/bot/.env
ExecStart=/usr/bin/python3 bot.py
Restart=always
[Install]
WantedBy=multi-user.target
# Activar servicio
sudo systemctl enable aviadata-twitter-bot
sudo systemctl start aviadata-twitter-bot
sudo systemctl status aviadata-twitter-bot- Abre Task Scheduler
- Create Basic Task
- Trigger: "When the computer starts"
- Action: "Start a program"
- Program:
python - Arguments:
C:\\ruta\\al\\bot.py - Start in:
C:\\ruta\\al\\directorio\\del\\bot
# Crear Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY bot.py .
CMD ["python", "bot.py"]
# Build y run
docker build -t aviadata-twitter-bot .
docker run -d --name bot \
--env-file .env \
aviadata-twitter-botSetup inicial:
-
Crear proyecto en Railway:
- Ve a railway.app
- Create New Project → Deploy from GitHub repo
- Selecciona tu repo
aviadata-tw
-
Agregar volumen persistente:
- En tu servicio → Settings → Volumes
- Click "New Volume"
- Mount path:
/data - Esto permite que la base de datos SQLite persista entre redeploys
-
Configurar variables de entorno:
- En Variables, agregar:
TWITTER_API_KEY=tu_key TWITTER_API_SECRET=tu_secret TWITTER_ACCESS_TOKEN=tu_token TWITTER_ACCESS_SECRET=tu_access_secret TWITTER_BEARER_TOKEN=tu_bearer AVIADATA_API_URL=https://aviadata-backend-production-8fa2.up.railway.app
- En Variables, agregar:
-
Deploy:
- Railway auto-detecta Python y ejecuta
bot.py - El bot usará automáticamente
/datapara la DB SQLite - Cada redeploy mantiene el estado (tweets enviados, mes actual, etc.)
- Endpoints disponibles:
GET /status→ Próximo tweet pendiente y listado de pendientesPOST /force-next→ Fuerza el próximo tweet pendientePOST /forcecon JSON{ "dia": 2, "mes": "2025-11" }→ Fuerza uno específico
- Si Railway requiere puerto explícito, agrega
PORT=8000en Variables
- Railway auto-detecta Python y ejecuta
Ventajas de Railway:
- ✅ Persistencia automática con volumen
/data - ✅ No se pierde el cronograma en redeploys
- ✅ Logs centralizados en Railway dashboard
- ✅ Auto-restart si el bot crashea
- ✅ Deploy automático en cada push a GitHub
- ✅ Control vía endpoints sin acceder al volumen
# El bot imprime logs en stdout
python bot.py
# Para guardar logs en archivo
python bot.py > bot.log 2>&1El bot crea twitter_bot_logs.db (SQLite) con:
- tweets_log: Todos los tweets enviados con timestamps, IDs, errores
- bot_state: Estado interno del bot (mes actual, etc.)
# Instalar sqlite3 si no lo tienes
sqlite3 twitter_bot_logs.db
# Ver últimos tweets
.headers on
.mode table
SELECT date_posted, tipo_post, status, mes_relacionado FROM tweets_log ORDER BY date_posted DESC LIMIT 10;
# Ver estado del bot
SELECT * FROM bot_state;# Crear test.py
from bot import TwitterBot
bot = TwitterBot()
# Test 1: API de Aviadata
data = bot.api_client.make_request("/vuelos/kpis", {"months": ["2025-09"], "all_periods": False})
print("API OK:" if data else "API ERROR")
# Test 2: Twitter
success = bot.send_tweet("🤖 Test del bot", "test", "test")
print("Twitter OK" if success else "Twitter ERROR")# Crear force_tweet.py
from bot import TwitterBot
bot = TwitterBot()
# Forzar resumen de septiembre 2025
success = bot.execute_scheduled_post(0, "2025-09") # día 0 = resumen mensual
print("Tweet enviado:" if success else "Error")# Borrar logs para empezar de cero
rm twitter_bot_logs.db
python bot.py- Verifica que todas las 4 variables de entorno estén configuradas
- Revisa que no tengan espacios extra o caracteres especiales
- Verifica que las credenciales sean válidas en Twitter Developer Portal
- Verifica que
AVIADATA_API_URLsea correcta - Test manual:
curl https://aviadata-backend-production-8fa2.up.railway.app/vuelos/kpis - El bot tiene timeout de 120 segundos, si falla es problema del servidor
- Normal, el bot espera automáticamente
- Twitter permite ~300 tweets cada 15 minutos
- Con el cronograma (1 tweet cada 2-3 días) nunca debería pasar
- Verifica que
/aeropuertos/rango-mesesretornemes_maximo - Check logs: "🆕 Nuevo mes detectado"
- Manualmente:
UPDATE bot_state SET value='2025-10' WHERE key='current_publishing_month';
- El bot verifica automáticamente tweets existentes
- Si hay duplicados, verifica la BD:
SELECT * FROM tweets_log WHERE tipo_post='resumen_mensual';
✅ Bot de Twitter inicializado
✅ Scheduler del bot iniciado
🆕 Nuevo mes detectado: 2025-10
📝 Ejecutando post: resumen_mensual para mes 2025-10
✅ Post resumen_mensual enviado exitosamente
❌ Error en API request: [timeout/connection]
❌ Error de Twitter: [rate limit/credentials]
❌ No se pudo generar contenido para [tipo_post]
- Inicio: Bot verifica credenciales y se conecta a APIs
- Scheduler: Cada 3 horas verifica posts pendientes
- Nuevo mes: Cada 6 horas verifica si hay datos nuevos
- Posts: Ejecuta tweets según cronograma (día 0, 2, 4, etc.)
- Recovery: Si falla un tweet, lo reintenta en la siguiente verificación
- Logs: Todo se registra en SQLite para auditoría
# 1. Setup rápido
git clone <repo>
cd twitter-bot-standalone
pip install -r requirements.txt
# 2. Configurar credenciales
cp .env.example .env
# Edita .env con tus credenciales reales
# 3. Test rápido
python -c "from bot import TwitterBot; bot = TwitterBot(); print('Bot OK')"
# 4. Ejecutar
python bot.py¡El bot está listo para usar! 🚀