载荷、代币检测与 OCR
TweetStream 提醒数据结构与丰富化能力的完整参考
推文生命周期
对于 tweet 事件,TweetStream 会先发送基础内容消息,然后可能发送更新消息,丰富化完成后再发送 meta 消息:
content- 推文文本、作者与媒体(先到)update- 可选的引用上下文或 URL 扩展更新meta- 丰富化数据:OCR 结果、检测到的代币与市场(稍后到)
消息族
TweetStream 的实时事件共用一套 WebSocket 包裹格式,历史回放则使用单独的响应结构:
tweet- tweet 包裹承载 content、update 与 meta 事件account- account 包裹承载 profile_update 与 follow 事件control- control 包裹承载 twitter_handles_result 这类账号管理结果/api/history- 历史接口返回的每一行都包含 tweetId、body、time、receivedTime、link、messageType、twitterHandle、twitterId、content,以及可选的 meta
推文内容类型
type VerifiedType = 'blue' | 'business' | 'government' | 'none';
type TweetAuthor = {
id?: string;
handle?: string;
name?: string;
platform?: 'twitter' | 'truth_social';
profileImage?: string;
followersCount?: number;
verifiedType?: VerifiedType;
};
type Media = {
url: string;
type?: 'image' | 'video' | 'gif';
thumbnail?: string;
};
type TweetContent = {
tweetId: string;
text: string;
createdAt: number;
author: TweetAuthor;
link?: string;
media?: Media[];
ref?: {
type: 'reply' | 'quote' | 'retweet';
tweetId?: string;
text?: string;
author?: TweetAuthor;
media?: Media[];
};
};Truth Social 帖子沿用同一套 tweet 内容结构,可通过 author.platform 区分它与 X/Twitter 帖子。
账号事件类型
资料更新和关注通知都使用 account 消息族,并共享下面这些更丰富的 actor 字段:
type AccountEventActor = TweetAuthor & {
banner?: string;
bio?: string;
location?: string;
url?: string;
websiteUrl?: string;
followingCount?: number;
};
type ProfileUpdateEvent = {
kind: 'PROFILE';
eventId: string;
observedAt: number;
actor: AccountEventActor;
changes: {
avatar?: string;
banner?: string;
bio?: string;
handle?: string;
location?: string;
name?: string;
};
previous?: {
avatar?: string;
banner?: string;
bio?: string;
handle?: string;
location?: string;
name?: string;
};
};
type FollowEvent = {
kind: 'FOLLOW';
eventId: string;
observedAt: number;
actor: AccountEventActor;
target: AccountEventActor;
};推文元数据类型
meta 载荷包含全部丰富化数据:
type TweetMeta = {
tweetId: string;
ocr?: {
text: string;
};
detected?: {
tokens?: Array<{
symbol?: string;
name?: string;
contract?: string;
chain?: string;
networkId?: number;
priceUsd?: number;
sources: Array<'text' | 'ocr'>;
}>;
cex?: Array<{
exchange: 'bybit' | 'binance' | 'hyperliquid';
symbol?: string;
priceUsd?: number;
url?: string;
baseAsset?: string;
quoteAsset?: string;
sources: Array<'text' | 'ocr'>;
}>;
prediction?: Array<{
exchange: 'polymarket' | 'kalshi';
marketId?: string;
title?: string;
priceUsd?: number;
url?: string;
sources: Array<'text' | 'ocr'>;
}>;
};
};历史响应类型
历史回放会把 tweet、profile 与 follow 行放进同一响应结构中,并回显你使用过的过滤参数。
type VerifiedType = 'blue' | 'business' | 'government' | 'none';
type TweetAuthor = {
id?: string;
handle?: string;
name?: string;
platform?: 'twitter' | 'truth_social';
profileImage?: string;
followersCount?: number;
verifiedType?: VerifiedType;
};
type AccountEventActor = TweetAuthor & {
banner?: string;
bio?: string;
location?: string;
url?: string;
websiteUrl?: string;
followingCount?: number;
};
type ProfileUpdateEvent = {
kind: 'PROFILE';
eventId: string;
observedAt: number;
actor: AccountEventActor;
changes: {
avatar?: string;
banner?: string;
bio?: string;
handle?: string;
location?: string;
name?: string;
};
previous?: {
avatar?: string;
banner?: string;
bio?: string;
handle?: string;
location?: string;
name?: string;
};
};
type FollowEvent = {
kind: 'FOLLOW';
eventId: string;
observedAt: number;
actor: AccountEventActor;
target: AccountEventActor;
};
type TweetMeta = {
tweetId: string;
ocr?: {
text: string;
};
detected?: {
tokens?: Array<{
symbol?: string;
name?: string;
contract?: string;
chain?: string;
networkId?: number;
priceUsd?: number;
sources: Array<'text' | 'ocr'>;
}>;
cex?: Array<{
exchange: 'bybit' | 'binance' | 'hyperliquid';
symbol?: string;
priceUsd?: number;
url?: string;
baseAsset?: string;
quoteAsset?: string;
sources: Array<'text' | 'ocr'>;
}>;
prediction?: Array<{
exchange: 'polymarket' | 'kalshi';
marketId?: string;
title?: string;
priceUsd?: number;
url?: string;
sources: Array<'text' | 'ocr'>;
}>;
};
};
type HistoryMedia = {
url: string;
type?: 'image' | 'video' | 'gif';
};
type TweetContent = {
tweetId: string;
text: string;
createdAt: number;
author: TweetAuthor;
link?: string;
media?: HistoryMedia[];
ref?: {
type: 'reply' | 'quote' | 'retweet';
tweetId?: string;
text?: string;
author?: TweetAuthor;
media?: HistoryMedia[];
};
};
type HistoricalContent = TweetContent | ProfileUpdateEvent | FollowEvent;
type HistoricalTweetResponse = {
tweetId: string;
twitterId: string;
twitterHandle: string | null;
body: string;
time: string;
receivedTime: string;
link: string;
messageType: 'TWEET' | 'PROFILE' | 'FOLLOW';
content: HistoricalContent;
meta?: TweetMeta;
};
type HistoryResult = {
data: HistoricalTweetResponse[];
metadata: {
count: number;
handle?: string;
handles?: string[];
startDate?: string;
endDate?: string;
type?: 'TWEET' | 'PROFILE' | 'FOLLOW';
};
};控制事件类型
账号管理结果会通过 control 消息族返回。当你通过 WebSocket 发送 follow 或 unfollow 命令后,就会收到这类响应。
type TwitterHandlesResult = {
action: 'follow' | 'unfollow';
requestId: string | null;
results: Array<{
input: string;
normalizedHandle?: string;
twitterId?: string;
state: string;
message?: string;
}>;
error: string | null;
};代币检测
TweetStream 自动从多个来源检测代币:
| 来源 | 示例 |
|---|---|
| $TICKER 符号 | $BTC, $ETH, $SOL |
| 合约地址 | 0x...(EVM), pump...(Solana) |
| DEX 链接 | dexscreener.com, birdeye.so |
| OCR 文本 | 图片中的 ticker 与地址 |
OCR 文本提取
会自动从推文附带图片中提取文本,包括:
- 交易终端与图表截图
- 包含代币信息的图片
- 公告与宣传图
OCR 结果会写入 meta.ocr.text字段,并用于代币检测。
预测市场
系统会检测并富化 Polymarket 市场引用,并附带实时赔率。detected.prediction数组,包含:
- 市场 ID 与标题
- 当前价格(概率)
- 市场直达链接
示例:content 包裹
{
"v": 1,
"t": "tweet",
"op": "content",
"ts": 1702500000000,
"d": {
"tweetId": "1234567890",
"text": "MAKE AMERICA WEALTHY AGAIN!",
"createdAt": 1702500000000,
"author": {
"id": "25073877",
"handle": "realDonaldTrump",
"name": "Donald J. Trump",
"platform": "truth_social",
"followersCount": 9800000,
"verifiedType": "government"
},
"link": "https://truthsocial.com/@realDonaldTrump/posts/114338322578075372"
}
}示例:meta 包裹
{
"v": 1,
"t": "tweet",
"op": "meta",
"ts": 1702500001000,
"d": {
"tweetId": "1234567890",
"ocr": {
"text": "Chart showing SOL breakout at $100"
},
"detected": {
"tokens": [
{
"symbol": "SOL",
"name": "Solana",
"priceUsd": 98.50,
"sources": ["text", "ocr"]
}
]
}
}
}示例:account 包裹
{
"v": 1,
"t": "account",
"op": "profile_update",
"ts": 1744156801000,
"d": {
"kind": "PROFILE",
"eventId": "profile_1",
"observedAt": 1744156800000,
"actor": {
"id": "123",
"handle": "tracked",
"name": "Tracked Account",
"profileImage": "https://pbs.twimg.com/profile_images/new-avatar_normal.jpg",
"followersCount": 125000,
"followingCount": 321,
"verifiedType": "business",
"websiteUrl": "https://tracked.example",
"location": "New York, NY"
},
"changes": {
"avatar": "https://pbs.twimg.com/profile_images/new-avatar_normal.jpg",
"bio": "Now watching markets 24/7"
},
"previous": {
"avatar": "https://pbs.twimg.com/profile_images/old-avatar_normal.jpg",
"bio": "Old bio"
}
}
}示例:control 包裹
{
"v": 1,
"t": "control",
"op": "twitter_handles_result",
"ts": 1744156802000,
"d": {
"action": "follow",
"requestId": "req_123",
"results": [
{
"input": "newaccount",
"normalizedHandle": "newaccount",
"twitterId": "456",
"state": "FOLLOWING",
"message": "Now tracking @newaccount"
}
],
"error": null
}
}示例:历史响应
{
"data": [
{
"tweetId": "follow_1",
"twitterId": "123",
"twitterHandle": "tracked",
"body": "Followed @newaccount",
"time": "2026-04-09T01:00:00.000Z",
"receivedTime": "2026-04-09T01:00:00.500Z",
"link": "https://x.com/newaccount",
"messageType": "FOLLOW",
"content": {
"kind": "FOLLOW",
"eventId": "follow_1",
"observedAt": 1744160400000,
"actor": {
"id": "123",
"handle": "tracked",
"name": "Tracked Account",
"followersCount": 125000,
"followingCount": 321,
"verifiedType": "business"
},
"target": {
"id": "456",
"handle": "newaccount",
"name": "New Account",
"profileImage": "https://pbs.twimg.com/profile_images/newaccount_normal.jpg",
"websiteUrl": "https://newaccount.example"
}
}
}
],
"metadata": {
"count": 1,
"handle": "tracked",
"handles": ["tracked"],
"startDate": "2026-04-01T00:00:00.000Z",
"endDate": "2026-04-30T23:59:59.999Z",
"type": "FOLLOW"
}
}立即开启实时 Twitter WebSocket 提醒
内置 WebSocket 交付、OCR 与代币检测的 Twitter API 替代方案。
开始 7 天试用起价 $199/月 · Basic/Elite 含 7 天试用 · OCR + 代币检测
