Prefect
Prefect ve TwexAPI salt okunur görevleriyle Python'da zamanlanmış Twitter arama, profil, zaman çizelgesi ve trend iş akışları oluşturun.
Prefect, Python kodu için açık kaynaklı bir iş akışı orkestratörüdür. Tekrarlanabilir tweet aramaları, profil sorgulamaları, zaman çizelgesi yenilemeleri ve trend kontrolleri için prefect-x-api-scraper kullanın.
Koleksiyon salt okunurdur. Altı asenkron Prefect görevi sağlar. Her görev kanonik TwexAPI JSON yanıtını Python sözlüğü olarak döndürür.
Tweet arama
Anahtar kelime, hashtag, hesap, tarih ve X sorgu operatörleriyle arama yapın.
Tweet sorgulama
Sayısal kimlikten tek bir herkese açık tweet getirin.
Profil arama
Ad, kullanıcı adı veya konuya göre herkese açık X hesapları bulun.
Profil sorgulama
Ekran adına göre tek bir herkese açık profil getirin.
Zaman çizelgelerini yenileme
Kullanıcı zaman çizelgesi sayfasından son tweet’leri getirin.
Trend takibi
Ülke, konu ve içerik etiketine göre küresel trend tweet’lerini getirin.
Bu koleksiyonu araştırma, zenginleştirme, panolar, uyarılar ve indeksleme için kullanın. Yazma, takipçi sayfalama ve dışa aktarımlar için doğrudan REST, Python SDK veya MCP kullanın.
Kurulum
Python 3.10 veya daha yeni kullanın.
python -m pip install "prefect>=3.0.0" "prefect-x-api-scraper"
Prefect kurulumundan sonra kimlik bilgileri bloğunu kaydedin:
prefect block register -m prefect_x_api_scraper
TwexAPI API anahtarını saklayın
TwexAPI dashboard üzerinden bir API anahtarı oluşturun. TwexApiCredentials bloğu içinde saklayın.
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)
Prefect blokları, akışlar ve dağıtımlar arasında tipli yapılandırma saklar. API anahtarlarını dağıtım YAML’ına, akış parametrelerine, günlüklere veya depolara asla koymayın.
Doğru Prefect görevini seçin
search_tweets
POST /twitter/advanced_search/page çağırır. query, cursor, sort_by ve sayfalama alanlarını kabul eder.
get_tweet
POST /v2/tweet/detail çağırır. Tek bir sayısal tweet kimliği geçirin.
search_users
GET /twitter/search-user/{keyword}/{target_count} çağırır. Profil sorgusu kabul eder.
get_user
GET /twitter/{screen_name}/about çağırır. @ ile veya @ olmadan ekran adlarını kabul eder.
get_user_tweets
POST /twitter/{screen_name}/timeline/page çağırır. İmleç ve sayfa boyutunu destekler.
get_trends
GET /twitter/global-trending/tweets çağırır. country, topic, content ve count kabul eder.
Python’da Twitter otomasyon akışı oluşturun
Bu akış son gönderileri arar ve tweet satırlarını normalleştirir. Kimlikleri, yazarları, zaman damgalarını, metrikleri, URL’leri ve sayfalama durumunu korur.
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"),
}
asyncio ile çalıştırın:
import asyncio
result = asyncio.run(social_signal_flow())
Odaklı tweet arama sorguları yazın
Tam ifade
Tam ifade için "workflow orchestration" kullanın.
Hesap filtresi
Tek hesaptan tweet’ler için from:PrefectIO kullanın.
Hashtag araması
Eşleşen hashtag’ler için #prefect #python kullanın.
Tarih penceresi
Sorgu içinde since: ve until: tarihleri kullanın.
Yeniden gönderileri hariç tut
Orijinal gönderiler önemliyse -filter:retweets kullanın.
Kronolojik izleme için sort_by="Latest" kullanın. Etkileşim sıralı keşif için sort_by="Top" kullanın. Sıralamalar değişebileceği için tweet kimliklerini kalıcı hale getirin.
Twitter arama hattını zamanlayın
Uzun süreli yerel süreç için .serve() kullanın.
from prefect.schedules import Cron
if __name__ == "__main__":
social_signal_flow.serve(
name="twexapi-social-signals",
schedule=Cron("0 * * * *", timezone="UTC"),
)
Docker, Kubernetes veya sunucusuz worker’lar için work-pool dağıtımı kullanın.
prefect deploy social_signal_flow.py:social_signal_flow \
--name twexapi-social-signals \
--pool production
Tweet ve profil sonuçlarını sayfalayın
İmleç sayfalama, sayfa numaralarını tahmin etmeden büyük aramaları sürdürür. Orijinal isteği değiştirmeden tutun. Yalnızca dönen imleci geçirin.
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())
İmleçleri çözmeyin. Opak dizgiler olarak ele alın. Her imleci sayfasını kalıcı hale getirdikten sonra saklayın.
Zamanlanmış çalıştırmaları idempotent yapın
Tweet kimliği
Tweet satırlarını tweet_id ile upsert edin. Anahtar olarak metin kullanmayın.
Profil kimliği
Profil satırlarını sayısal kullanıcı kimliğine göre upsert edin.
İmleç kontrol noktası
Her commit edilen sayfadan sonra has_more ve next_cursor saklayın.
Yalnızca geçici hataları yeniden deneyin
Prefect yeniden deneme gecikmeleri, jitter ve koşullu yeniden denemeleri destekler. Geçersiz girdileri değiştirmeden yeniden denemeyin.
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],
)
Belgelenmiş hataları yönlendirin
| Durum | Eylem |
|---|---|
400 |
Eksik sorguları veya hatalı girdiyi düzeltin. Değiştirmeden yeniden denemeyin. |
401 |
Kimlik bilgileri bloğundan geçerli bir API anahtarı yükleyin. |
403 |
Sonraki çalıştırmadan önce hesap erişimini veya kredileri çözün. |
404 |
Tweet kimliklerini, kullanıcı adlarını ve ekran adlarını kontrol edin. |
429 |
Zamanlamayı yavaşlatın ve jitter’lı gecikmelerle yeniden deneyin. |
5xx |
Geçici hataları sınırlı geri çekilme ile yeniden deneyin. |
Tam kurtarma rehberi için Error Handling ve Rate Limits bölümlerine bakın.
MCP planlama alternatifi
Uç noktaları keşfetmek için planlama sırasında Twexapi MCP kullanın, ardından seçilen rotayı Prefect görevlerinde veya REST çağrılarında kodlayın.
Önerilen planlama prompt’u:
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.
Prefect koleksiyonu mu doğrudan TwexAPI API mi?
Altı desteklenen okuma için prefect-x-api-scraper seçin. Bloklar, asenkron çağrılar, doğrulama ve görev meta verileri sağlar.
Şunlar için doğrudan REST, Python SDK veya MCP kullanın:
- Tweet, yanıt, alıntı, beğeni, takip veya DM eylemleri
- Takipçi ve takip dışa aktarımları
- Listeler ve topluluklar
Tekrarlayan kontroller için yerel monitör uç noktaları yerine Prefect akışlarını veya REST sayfalamasını zamanlayın. TwexAPI asenkron CSV/JSON çıkarma işlerini ayrı bir ürün olarak sunmaz.
Yazma işlemlerini açık onayın arkasında tutun. Herhangi bir yazma işlemini yeniden denemeden önce onaylanmış kimlikleri saklayın.