Prefect
Crea flujos de trabajo programados de búsqueda de Twitter, perfiles, líneas de tiempo y tendencias en Python con tareas de solo lectura de Prefect y TwexAPI.
Prefect es un orquestador de flujos de trabajo de código abierto para Python. Usa prefect-x-api-scraper para búsquedas de tweets repetibles, consultas de perfiles, actualizaciones de líneas de tiempo y verificaciones de tendencias.
La colección es de solo lectura. Proporciona seis tareas asíncronas de Prefect. Cada tarea devuelve la respuesta JSON canónica de TwexAPI como un diccionario de Python.
Buscar tweets
Busca palabras clave, hashtags, cuentas, fechas y operadores de consulta de X.
Consultar tweets
Obtén un tweet público a partir de su ID numérico.
Buscar perfiles
Encuentra cuentas públicas de X por nombre, nombre de usuario o tema.
Consultar perfiles
Recupera un perfil público por screen name.
Actualizar líneas de tiempo
Obtén tweets recientes de una página de línea de tiempo de usuario.
Rastrear tendencias
Recupera tweets en tendencia global por país, tema y etiqueta de contenido.
Usa esta colección para investigación, enriquecimiento, dashboards, alertas e indexación. Usa REST directo, el Python SDK o MCP para escrituras, paginación de seguidores y exportaciones.
Instalación
Usa Python 3.10 o posterior.
python -m pip install "prefect>=3.0.0" "prefect-x-api-scraper"
Registra el bloque de credenciales después de instalar Prefect:
prefect block register -m prefect_x_api_scraper
Guarda la API key de TwexAPI
Crea una API key desde el panel de TwexAPI. Guárdala dentro de un bloque TwexApiCredentials.
from prefect_x_api_scraper import TwexApiCredentials
credentials = TwexApiCredentials(
api_key="YOUR_API_KEY",
base_url="https://api.twexapi.io",
timeout_seconds=30,
)
credentials.save("twexapi", overwrite=True)
Los bloques de Prefect almacenan configuración tipada entre flujos y despliegues. Nunca coloques API keys en YAML de despliegue, parámetros de flujo, logs o repositorios.
Elige la tarea de Prefect correcta
search_tweets
Llama a POST /twitter/advanced_search/page. Acepta query, cursor, sort_by y campos de paginación.
get_tweet
Llama a POST /v2/tweet/detail. Pasa un ID numérico de tweet.
search_users
Llama a GET /twitter/search-user/{keyword}/{target_count}. Acepta una consulta de perfil.
get_user
Llama a GET /twitter/{screen_name}/about. Acepta screen names con o sin @.
get_user_tweets
Llama a POST /twitter/{screen_name}/timeline/page. Soporta cursores y tamaño de página.
get_trends
Llama a GET /twitter/global-trending/tweets. Acepta country, topic, content y count.
Construye un flujo de automatización de Twitter en Python
Este flujo busca publicaciones recientes y normaliza filas de tweets. Conserva IDs, autores, marcas de tiempo, métricas, URLs y estado de paginación.
from __future__ import annotations
from typing import Any
from prefect import flow, task
from prefect_x_api_scraper import TwexApiCredentials, search_tweets
@task
async def normalize_tweet_page(page: dict[str, Any]) -> list[dict[str, Any]]:
rows: list[dict[str, Any]] = []
for tweet in page.get("data", {}).get("tweets", page.get("tweets", [])):
if not isinstance(tweet, dict):
continue
author = tweet.get("author") or tweet.get("user")
rows.append(
{
"tweet_id": tweet.get("id") or tweet.get("tweet_id"),
"text": tweet.get("text") or tweet.get("full_text"),
"created_at": tweet.get("created_at") or tweet.get("createdAt"),
"author": author if isinstance(author, dict) else {},
"like_count": tweet.get("like_count") or tweet.get("likeCount"),
"repost_count": tweet.get("retweet_count") or tweet.get("retweetCount"),
"reply_count": tweet.get("reply_count") or tweet.get("replyCount"),
}
)
return rows
@flow(name="TwexAPI Twitter Search")
async def social_signal_flow() -> dict[str, Any]:
credentials = TwexApiCredentials.load("twexapi")
page = await search_tweets(
credentials,
'"workflow orchestration" lang:en -filter:retweets',
sort_by="Latest",
)
rows = await normalize_tweet_page(page)
return {
"tweet_rows": rows,
"has_more": page.get("has_more") or page.get("has_next_page", False),
"next_cursor": page.get("next_cursor") or page.get("nextCursor"),
}
Ejecútalo con asyncio:
import asyncio
result = asyncio.run(social_signal_flow())
Escribe consultas de búsqueda de tweets enfocadas
Frase exacta
Usa "workflow orchestration" para una frase exacta.
Filtro de cuenta
Usa from:PrefectIO para tweets de una cuenta.
Búsqueda por hashtag
Usa #prefect #python para hashtags coincidentes.
Ventana de fechas
Usa fechas since: y until: dentro de una consulta.
Excluir reposts
Usa -filter:retweets cuando importen las publicaciones originales.
Usa sort_by="Latest" para monitoreo cronológico. Usa sort_by="Top" para descubrimiento ordenado por engagement. Persiste los IDs de tweet porque los rankings pueden cambiar.
Programa el pipeline de búsqueda de Twitter
Usa .serve() para un proceso local de larga duración.
from prefect.schedules import Cron
if __name__ == "__main__":
social_signal_flow.serve(
name="twexapi-social-signals",
schedule=Cron("0 * * * *", timezone="UTC"),
)
Usa un despliegue con work pool para workers de Docker, Kubernetes o serverless.
prefect deploy social_signal_flow.py:social_signal_flow \
--name twexapi-social-signals \
--pool production
Pagina resultados de tweets y perfiles
La paginación por cursor continúa búsquedas grandes sin adivinar números de página. Mantén la solicitud original sin cambios. Pasa solo el cursor devuelto.
from typing import Any, Optional
from prefect import flow
from prefect_x_api_scraper import TwexApiCredentials, search_tweets
@flow
async def collect_tweet_pages(query: str) -> list[dict[str, Any]]:
credentials = TwexApiCredentials.load("twexapi")
rows_by_id: dict[str, dict[str, Any]] = {}
cursor: Optional[str] = None
while True:
page = await search_tweets(
credentials,
query=query,
sort_by="Latest",
cursor=cursor,
)
tweets = page.get("data", {}).get("tweets", page.get("tweets", []))
for tweet in tweets:
if isinstance(tweet, dict):
tweet_id = tweet.get("id") or tweet.get("tweet_id")
if tweet_id:
rows_by_id[str(tweet_id)] = tweet
cursor_value = page.get("next_cursor") or page.get("nextCursor")
has_more = bool(page.get("has_more") or page.get("has_next_page", False))
if not has_more or not cursor_value:
break
cursor = str(cursor_value)
return list(rows_by_id.values())
No decodifiques cursores. Trátalos como cadenas opacas. Guarda cada cursor después de persistir su página.
Haz que las ejecuciones programadas sean idempotentes
Identidad de tweet
Haz upsert de filas de tweets por tweet_id. No uses el texto como clave.
Identidad de perfil
Haz upsert de filas de perfil por ID numérico de usuario.
Checkpoint de cursor
Guarda has_more y next_cursor después de cada página confirmada.
Reintenta solo fallos transitorios
Prefect soporta retrasos de reintento, jitter y reintentos condicionales. No reintentes entradas inválidas sin cambios.
from prefect_x_api_scraper import search_tweets
search_recent_tweets = search_tweets.with_options(
name="Search Recent Tweets",
retries=4,
retry_delay_seconds=[5, 15, 45, 120],
)
Enruta errores documentados
| Estado | Acción |
|---|---|
400 |
Corrige consultas faltantes o entrada malformada. No reintentes sin cambios. |
401 |
Carga una API key válida desde el bloque de credenciales. |
403 |
Resuelve el acceso a la cuenta o los créditos antes de la siguiente ejecución. |
404 |
Verifica IDs de tweet, nombres de usuario y screen names. |
429 |
Reduce la frecuencia del horario y reintenta con retrasos con jitter. |
Consulta Error Handling y Rate Limits para orientación completa de recuperación.
| 5xx | Reintenta fallos transitorios con un límite. |
Alternativa de planificación con MCP
Usa Twexapi MCP durante la planificación para descubrir endpoints, luego codifica la ruta seleccionada en tareas de Prefect o llamadas REST.
Prompt de planificación sugerido:
Use Twexapi MCP explore to choose the best endpoint for daily AI trend collection.
Return the exact method, relative path, query parameters, pagination fields, expected response fields, and retry guidance.
Do not execute write endpoints.
Colección de Prefect o API directa de TwexAPI
Elige prefect-x-api-scraper por sus seis lecturas compatibles. Proporciona bloques, llamadas asíncronas, validación y metadatos de tareas.
Usa REST directo, el Python SDK o MCP para:
- Acciones de tweet, respuesta, cita, like, follow o DM
- Exportaciones de seguidores y following
- Listas y comunidades
Para verificaciones recurrentes, programa flujos de Prefect o paginación REST en lugar de endpoints de monitor nativos. TwexAPI no expone trabajos de extracción CSV/JSON asíncronos como un producto separado.
Mantén las escrituras detrás de aprobación explícita. Guarda IDs confirmados antes de reintentar cualquier acción de escritura.