Bot de Twitter que publica palabras del español mediante Supabase Edge Functions.
- ✅ Serverless: Usando Supabase Edge Functions (Deno runtime)
- ✅ API Endpoint: Llama al endpoint para publicar un tweet
- ✅ Autenticación: Protegido con API key
- ✅ Dataset Español: Más de 20 países hispanohablantes
- ✅ Twitter API v2: Usando la última versión de la API
┌─────────────┐ HTTP POST ┌──────────────────┐ OAuth 1.0a ┌─────────────┐
│ Cliente │ ──────────────────> │ Supabase Edge │ ──────────────────> │ Twitter API │
│ (Browser/ │ Bearer Token Auth │ Function │ Firma HMAC-SHA1 │ v2 │
│ Cron Job) │ <────────────────── │ (Deno) │ <────────────────── │ │
└─────────────┘ JSON Response └──────────────────┘ Tweet Response └─────────────┘
git clone <tu-repo>
cd RepipiTwitterbotJS
npm installCopia .env.example a .env y completa tus credenciales:
API_KEY=tu_twitter_api_key
API_SECRET=tu_twitter_api_secret
ACCESS_TOKEN=tu_twitter_access_token
ACCESS_SECRET=tu_twitter_access_secret
API_BOT_KEY=tu_clave_secreta_para_autenticacion# Con Scoop
scoop install supabase
# O con npm
npm install -g supabaseSigue las instrucciones completas en DEPLOYMENT.md
# Login y enlazar proyecto
supabase login
supabase link --project-ref tu-project-ref
# Configurar secrets
supabase secrets set API_KEY=tu_api_key
supabase secrets set API_SECRET=tu_api_secret
supabase secrets set ACCESS_TOKEN=tu_access_token
supabase secrets set ACCESS_SECRET=tu_access_secret
supabase secrets set API_BOT_KEY=tu_clave_secreta
# Desplegar
supabase functions deploy tweet-word# Con curl
curl -X POST https://tu-proyecto.supabase.co/functions/v1/tweet-word `
-H "Authorization: Bearer tu_clave_secreta"// Con JavaScript
const response = await fetch(
'https://tu-proyecto.supabase.co/functions/v1/tweet-word',
{
method: 'POST',
headers: {
'Authorization': 'Bearer tu_clave_secreta'
}
}
);
const data = await response.json();
console.log(data);
// { success: true, word: "...", tweetId: "...", tweetText: "..." }# Ejecutar función localmente
supabase functions serve tweet-word
# En otra terminal, probar el endpoint
node -r ts-node/register scripts/test-endpoint.tsRepipiTwitterbotJS/
├── supabase/
│ └── functions/
│ └── tweet-word/ # Edge Function principal
│ ├── index.ts # Código de la función
│ ├── deno.json # Configuración Deno
│ └── import_map.json # Imports de Deno
├── dataset/ # Archivos de palabras por país
│ ├── ESP.txt
│ ├── MEX.txt
│ └── ...
├── scripts/
│ ├── test-endpoint.ts # Script para probar endpoint
│ └── generate-dataset.ts # Generador de dataset
├── src/ # Código legacy (Express)
│ ├── index.ts
│ └── job.ts
├── .env.example # Ejemplo de variables
├── DEPLOYMENT.md # Guía de deployment
└── README.md # Este archivo
La Edge Function tiene un dataset limitado por defecto. Para usar todas tus palabras:
Opción 1: Editar directamente en la función
Edita supabase/functions/tweet-word/index.ts y actualiza el array SPANISH_WORDS.
Opción 2: Usar Supabase Storage
Sube tu dataset a Supabase Storage y cárgalo dinámicamente.
Opción 3: Usar Supabase Database
Crea una tabla en Supabase y carga las palabras desde allí.
Para que el bot twitee automáticamente:
Crea .github/workflows/tweet-hourly.yml:
name: Tweet Hourly
on:
schedule:
- cron: '0 * * * *' # Cada hora
workflow_dispatch:
jobs:
tweet:
runs-on: ubuntu-latest
steps:
- name: Tweet
run: |
curl -X POST ${{ secrets.SUPABASE_FUNCTION_URL }} \
-H "Authorization: Bearer ${{ secrets.API_BOT_KEY }}"- cron-job.org
- EasyCron
- Uptime Robot (monitoring + cron)
# Ver logs en tiempo real
supabase functions logs tweet-word --tail
# Ver últimos logs
supabase functions logs tweet-wordVer DEPLOYMENT.md para soluciones comunes.
- Deployment Guide - Guía completa de despliegue
- Supabase Edge Functions
- Twitter API v2
- Runtime: Deno (Supabase Edge Functions)
- API: Twitter API v2
- Autenticación: OAuth 1.0a (Twitter) + Bearer Token (Endpoint)
- Hosting: Supabase Edge Functions (Global CDN)
- La versión anterior con Express sigue disponible en
src/ - Las Edge Functions tienen un límite de 60 segundos por invocación
- Las funciones se ejecutan en el edge (baja latencia global)
Creado con Twitter-api-v2 por Raul
[Tu licencia aquí]