Integración de APIs para conectar agentes con Facebook y Twitter
En la era del customer experience omnicanal, los agentes de soporte deben poder interactuar de forma fluida con los usuarios donde estos se encuentren: Facebook y Twitter son los canales más habituales. Este artículo muestra cómo conectar dichos canales mediante sus APIs y Python, cubriendo autenticación, código de ejemplo, buenas prácticas, seguridad y comparativas de rendimiento.
¿Por qué integrar Facebook y Twitter?
- Omnicanalidad: Un único panel de control para responder mensajes, menciones y comentarios.
- Automatización: Respuestas rápidas, clasificación de tickets y generación de informes.
- Escalabilidad: APIs oficiales garantizan alta disponibilidad y cumplimiento de políticas de la plataforma.
Visión general de las APIs
Facebook Graph API
Permite gestionar páginas, publicar contenido, leer mensajes y suscribirse a webhooks para recibir notificaciones en tiempo real. Requiere una App de Facebook, permisos pages_manage_posts, pages_read_engagement y pages_messaging.
- Endpoint principal:
https://graph.facebook.com/v17.0/<PAGE_ID>/feed - Límites de tasa: 200 llamadas por hora por token de acceso.
- Formato de respuesta: JSON.
Twitter API v2
Proporciona acceso a tweets, menciones, mensajes directos y streams en tiempo real. Necesita una Project y App en el Developer Portal, con permisos Tweet.read, Tweet.write y DM.read/DM.write según el caso.
- Endpoint principal:
https://api.twitter.com/2/tweets - Límites de tasa: 300 tweets por 15 min (standard); 1 000 000 tweets por mes (elevated).
- Formato de respuesta: JSON.
Autenticación segura (OAuth 2.0)
Ambas plataformas utilizan OAuth 2.0. La recomendación es emplear tokens de acceso de corta vida y renovarlos mediante refresh tokens. En Python, la librería requests-oauthlib simplifica el flujo.
import os
from requests_oauthlib import OAuth2Session
# Variables de entorno (mantener seguras)
CLIENT_ID = os.getenv('FB_CLIENT_ID')
CLIENT_SECRET = os.getenv('FB_CLIENT_SECRET')
REDIRECT_URI = 'https://miapp.com/callback'
AUTH_URL = 'https://www.facebook.com/v17.0/dialog/oauth'
TOKEN_URL = 'https://graph.facebook.com/v17.0/oauth/access_token'
fb = OAuth2Session(CLIENT_ID, redirect_uri=REDIRECT_URI, scope=[
'pages_manage_posts',
'pages_read_engagement',
'pages_messaging'
])
authorization_url, state = fb.authorization_url(AUTH_URL)
print('Visita esta URL y autoriza la app:', authorization_url)
# Después de la redirección, captura el código y obtén el token
code = input('Introduce el código de autorización: ')
token = fb.fetch_token(TOKEN_URL, client_secret=CLIENT_SECRET, code=code)
print('Token de acceso:', token['access_token'])
Para Twitter el proceso es similar, pero con el endpoint https://api.twitter.com/oauth2/token. Se recomienda usar la librería tweepy que ya incorpora la lógica de refresco.
Ejemplos prácticos en Python
Publicar una publicación en una página de Facebook
import requests, os
PAGE_ID = os.getenv('FB_PAGE_ID')
ACCESS_TOKEN = os.getenv('FB_ACCESS_TOKEN')
message = '🚀 ¡Nuestro nuevo chatbot está listo! #IA #Soporte'
url = f'https://graph.facebook.com/v17.0/{PAGE_ID}/feed'
payload = {
'message': message,
'access_token': ACCESS_TOKEN
}
resp = requests.post(url, data=payload)
if resp.status_code == 200:
print('Publicación exitosa:', resp.json()['id'])
else:
print('Error:', resp.status_code, resp.text)
Enviar un tweet mediante la API v2
import tweepy, os
client = tweepy.Client(
bearer_token=os.getenv('TWITTER_BEARER'),
consumer_key=os.getenv('TWITTER_API_KEY'),
consumer_secret=os.getenv('TWITTER_API_SECRET'),
access_token=os.getenv('TWITTER_ACCESS_TOKEN'),
access_token_secret=os.getenv('TWITTER_ACCESS_SECRET')
)
response = client.create_tweet(text='🤖 Bot de soporte activado! #CustomerCare')
print('Tweet ID:', response.data['id'])
Webhooks y procesamiento en tiempo real
Para que los agentes reciban notificaciones instantáneas, configure webhooks en ambas plataformas.
- Facebook: Suscripción a
messagesymessaging_postbacksmediantePOST /{PAGE_ID}/subscribed_apps. - Twitter: Uso de Account Activity API o Filtered Stream endpoint para menciones y DMs.
Ejemplo de endpoint Flask que recibe eventos de Facebook:
from flask import Flask, request, abort
import hmac, hashlib, json, os
app = Flask(__name__)
VERIFY_TOKEN = os.getenv('FB_VERIFY_TOKEN')
APP_SECRET = os.getenv('FB_APP_SECRET')
def verify_signature(sig, payload):
expected = 'sha1=' + hmac.new(APP_SECRET.encode(), payload, hashlib.sha1).hexdigest()
return hmac.compare_digest(expected, sig)
@app.route('/fb/webhook', methods=['GET', 'POST'])
def fb_webhook():
if request.method == 'GET':
# Verificación de suscripción
if request.args.get('hub.verify_token') == VERIFY_TOKEN:
return request.args.get('hub.challenge')
return 'Invalid token', 403
# POST – eventos
signature = request.headers.get('X-Hub-Signature')
if not verify_signature(signature, request.data):
abort(403)
data = request.get_json()
# Procesar mensajes
for entry in data.get('entry', []):
for messaging in entry.get('messaging', []):
sender_id = messaging['sender']['id']
if 'message' in messaging:
text = messaging['message'].get('text')
# Aquí se delega al motor de tickets o a un chatbot
print(f'Nuevo mensaje de {sender_id}: {text}')
return 'OK', 200
if __name__ == '__main__':
app.run(port=5000, debug=True)
Para Twitter, la lógica es similar usando Flask + tweepy.StreamingClient.
Comparativa rápida: Facebook vs Twitter
| Característica | |
|---|---|
| Tipo de contenido | Publicaciones, historias, mensajes, comentarios |
| Límite de caracteres | 63 206 (texto) – sin límite para imágenes |
| Autenticación | OAuth 2.0 (token de página) |
| Webhooks | Mensajes, reacciones, comentarios, leads |
| Rate limit | 200 llamadas/hora por token |
| Coste | Gratuito (sujeto a cuotas de uso) |
| Característica | |
|---|---|
| Tipo de contenido | Tweets, hilos, respuestas, DMs, polls |
| Límite de caracteres | 280 caracteres (texto) |
| Autenticación | OAuth 2.0 + OAuth 1.0a (para DMs) |
| Webhooks | Account Activity API, filtered stream |
| Rate limit | 300 tweets/15 min (standard) |
| Coste | Gratuito (plan Elevated para mayor volumen) |
Mejores prácticas y seguridad
- Almacena los tokens en un vault (HashiCorp Vault, AWS Secrets Manager). Nunca los incluyas en código ni repositorios.
- Usa HTTPS y valida firmas (X‑Hub‑Signature para Facebook, JWT para Twitter).
- Implementa retry exponencial ante errores 5xx o 429 (rate‑limit). Ejemplo con
tenacity:
from tenacity import retry, wait_exponential, stop_after_attempt
@retry(wait=wait_exponential(multiplier=1, min=2, max=60), stop=stop_after_attempt(5))
def post_fb(message):
# lógica de publicación (ver ejemplo anterior)
pass
- Limita los scopes a lo estrictamente necesario (principio de menor privilegio).
- Monitorea los logs de auditoría: cada llamada a la API debe quedar registrada con timestamp, endpoint y código de respuesta.
- Configura alertas de uso de cuota para evitar bloqueos inesperados.
- Versiona tus contratos de API (p. ej., usa
v17.0en Graph API) y revisa los deprecation notices trimestrales.
Troubleshooting frecuente
| Síntoma | Causa típica | Solución |
|---|---|---|
| 401 Unauthorized (Facebook) | Token expirado o sin permisos | Renueva el token mediante refresh token y verifica los scopes en la App Dashboard. |
| 429 Too Many Requests (Twitter) | Límite de tasa excedido | Implementa back‑off exponencial y revisa la cuota en Twitter Dev Portal. |
| Webhook no recibe eventos | Firma inválida o URL no accesible | Comprueba que el certificado SSL sea válido y que la verificación HMAC coincida. |
| Errores de codificación de caracteres | UTF‑8 no especificado | Asegura que los headers incluyan Content-Type: application/json; charset=utf-8. |
Escalabilidad y despliegue
Para entornos de producción con alto volumen de mensajes, considera:
- Contenedores Docker o Podman para aislar la aplicación.
- Orquestación con Kubernetes y Horizontal Pod Autoscaler basado en la métrica
requests_per_secondde la API. - Colas de mensajes (
RabbitMQoKafka) para desacoplar la ingestión de webhook y el procesamiento de tickets. - Logs estructurados (JSON) enviados a ELK Stack o Grafana Loki para análisis en tiempo real.
Conclusión
Integrar los agentes de soporte con Facebook y Twitter mediante sus APIs permite crear una experiencia de cliente fluida, automatizada y medible. Con los ejemplos de Python presentados, la gestión segura de tokens, la implementación de webhooks y las mejores prácticas de rendimiento, estás listo para diseñar una solución robusta y preparada para el futuro.
© 2025 TechInsights Blog – Todos los derechos reservados.