两行代码拿到一条帖子
没有密钥要传,也没有客户端要配置。构造出来直接调用。
from xcrap import Xcrap
with Xcrap() as xcrap:
tweet = xcrap.tweet("https://x.com/jack/status/20")
print(tweet.text) # just setting up my twttr
print(tweet.metrics.likes) # 308067
XCRAP.CC
同一批 HTTP 接口之上的一层轻薄、带类型的封装。它做的事用 fetch 都能做;它只是省下你重写错误类、重试和格式协商的功夫。
pip install xcrap-sdk
或者,用你实际在用的:
uv add xcrap-sdkpoetry add xcrap-sdkpdm add xcrap-sdk环境要求 · Python 3.9 或更高版本。一个依赖:httpx。
没有要注册的东西,没有要塞进环境变量的东西,也没有谁不小心提交上去之后要轮换的东西。
每个方法、每种响应形状都有完整声明,字段名写错是一条红波浪线,而不是运行时的意外。
一个选项就能把任何响应变成可直接用于提示词的 markdown,并附上它会占用多少上下文的估算。
没有密钥要传,也没有客户端要配置。构造出来直接调用。
from xcrap import Xcrap
with Xcrap() as xcrap:
tweet = xcrap.tweet("https://x.com/jack/status/20")
print(tweet.text) # just setting up my twttr
print(tweet.metrics.likes) # 308067
每个读取方法都接受一个 markdown 选项。响应会以可直接放进提示词的字符串返回,客户端同时记录这段字符串大概要花多少 token,好让你在花掉之前先核对预算。
# Markdown, ready to drop into a prompt.
md = xcrap.tweet("https://x.com/jack/status/20", markdown=True)
# How many tokens that will cost, before you spend them.
print(xcrap.last_meta.markdown_tokens)
长贴会展开并按顺序返回,从第一条而不是最后一条开始。时间线通过游标自动翻页,你不必自己保存它们。
thread = xcrap.thread(
"https://x.com/naval/status/1002103360646823936",
)
print(thread.count) # 31
for post in thread.tweets:
print(post.text)
# And a timeline paginates itself.
for post in xcrap.iter_user_tweets("naval", limit=200):
print(post.id)
按你在 X 里输入的样子传入查询,运算符照写。返回一页结果和下一页的游标。搜索是所有方法中额度最紧的,一个精确的查询胜过五个宽泛的查询。
page = xcrap.search(
"from:nasa mars",
feed="latest", # or "top", "photos", "videos"
since="2026-01-01",
)
for post in page.tweets:
print(post.author.screen_name, post.text)
# The next page, when there is one.
if page.next_cursor:
xcrap.search("from:nasa mars", cursor=page.next_cursor)
每一种失败都是一个可以按名字捕获的类。404 表示帖子被删或不公开,429 带着距离窗口重置还有多少秒,而网络故障和拒绝是可以区分开的。
from xcrap import Xcrap, XcrapNotFound, XcrapRateLimited
try:
xcrap.tweet("https://x.com/jack/status/1")
except XcrapNotFound:
return None
except XcrapRateLimited as error:
# The client already knows when the window resets.
time.sleep(error.retry_after)
raise
它们都接受 format 和 markdown 选项,返回的形状也和 HTTP API 完全一致。
tweet(url, **opts)thread(url, **opts)search(query, **opts)replies(url, **opts)user(handle, **opts)user_tweets(handle, **opts)iter_user_tweets(handle, limit=…)user_history(handle, **opts)followers(handle, **opts)following(handle, **opts)trends(**opts)media(url, **opts)download_media(url, **opts)bulk(urls, **opts)