请查看我们的对比指南:
X API:Enterprise 数据词典
介绍
Enterprise
Post 是构成 X 一切内容的基本原子单元。所有返回 Post 的 X API 都以 JavaScript Object Notation (JSON) 对这些数据进行编码。JSON 基于键值对,由具名属性及其对应的值组成。从 API 检索到的 Post 对象包含 X 用户的“状态更新”,同时转发、回复和引用 Tweet 也都是 Post 对象。若某个 Post 与另一条 Post 存在关联(如转发、回复或引用 Tweet),这些关联都会在该 Post 对象中被标识或嵌入。即使是最简单的原生 X 数据格式的 Post,也会包含嵌套的 JSON 对象,用于表示该 Post 的其他属性,例如作者、被提及的用户、标注的地点位置、话题标签、货币标签符号、媒体或 URL 链接。处理 X 数据时,理解这一点非常重要。你从 X API 接收到的 Post 数据格式取决于收到的 Post 类型、所使用的 X API,以及格式设置。
返回 Post 对象的 Enterprise endpoint 已更新,提供理解 Post 编辑历史所需的 metadata。请在“编辑 Post”基础知识页面了解更多这些 metadata:“Edit Posts” 基础知识。
In native X format, the JSON payload will include of ‘root-level’ attributes, and nested JSON objects (which are represented here with the
{}
notation):
可用的数据格式
请注意:强烈建议在 Enterprise 数据 API 中使用 Enriched Native 格式。Enterprise 数据 API 提供两种不同的格式。与 Standard v1.1 原生格式最接近的 Enterprise 格式是 Enriched Native。传统的 Enterprise 数据格式是 Activity Streams,最初由 Gnip 实施,并作为当时在 X 及其他社交媒体数据提供商之间的规范化格式使用。尽管该格式仍可用,但自 2017 年以来,X 仅在 Enriched Native 格式上投入新功能和开发。 Enriched Native 格式名副其实,既包含原生的 X 对象,也包含适用于 Enterprise 数据产品的额外富化信息,例如 URL 展开 metadata、资料地理信息、投票 metadata 以及更多互动度量。
- Enriched Native 格式包含自 2017 年以来新增的所有 metadata,例如 投票 metadata,以及 reply_count、quote_count 等其他度量。
- 自 2017 年字符更新以来,Activity Streams 格式未再加入新的 metadata 或富化内容。
按数据格式进行对象对比
原生增强 | Activity Streams |
---|---|
链接 Post 对象 | 链接 Activity 对象 |
链接 用户对象 | 链接 Actor 对象 |
链接 Entities 对象 | 链接 X entities 对象 |
链接 Extended entities 对象 | 链接 X extended entities 对象 |
链接 Geo 对象 | 链接 Location 对象 |
n/a | 链接 Gnip 对象 |
解析最佳实践
- X JSON 使用 UTF-8 字符编码。
- 解析器应能从容应对字段顺序的变化。应假定 Post 的 JSON 以未排序的 data 哈希提供。
- 解析器应能容忍添加“new” 字段。
- 由于并非所有字段都会出现在所有 context 中,JSON 解析器必须能容忍“缺失”的字段。
- 通常可以将置为 null 的字段、空集合以及字段缺失视为等同情况
Enterprise 原生扩展型 data 对象
原生增强型 Tweet 对象
想了解原生增强型 data 格式如何映射到 X API v2 格式的更多信息吗? 请参阅我们的对比指南:原生增强型与 X API v2 的比较
Post 对象
id
、created_at
和 text
等基础属性。Post 对象还包含嵌套对象,如 user
、entities
和 extended_entities
。Post 对象还会包含其他嵌套的 Post 对象,例如 retweeted_status、quoted_status 和 extended_tweet。原生增强格式还包含一个 matching_rules 对象。
X 数据字典
属性 | 类型 | 描述 |
---|---|---|
created_at | String | 此 Post 创建时的 UTC 时间。示例: “created_at”: “Wed Oct 10 20:19:24 +0000 2018” |
id | Int64 | 此 Post 唯一标识符的整数表示。此数字大于 53 位,某些编程语言在解释时可能会遇到困难或出现静默缺陷。使用有符号 64 位整数存储此标识符是安全的。为确保安全,请使用 id_str 获取标识符。有关更多信息,请参阅 X IDs。示例:“id”:1050118621198921728 |
id_str | String | 此 Post 唯一标识符的字符串表示。实现时应使用此字段而不是 id 中的大整数。示例:“id_str”:“1050118621198921728” |
text | String | 状态更新的实际 UTF-8 文本。有关当前被认为有效的字符的详细信息,请参阅 X-text。示例: “text”:“To make room for more expression, we will now count all emojis as equal—including those with gender and skin t… https://t.co/MkGjXf9aXm” |
source | String | 用于发布 Post 的工具,以 HTML 格式字符串表示。来自 X 网站的 Post 的 source 值为 web 。示例: “source”:“X Web Client” |
truncated | Boolean | 指示 text 参数的值是否被截断,例如,由于转发超过了原始 Post 文本长度限制 140 个字符。截断的文本将以省略号结尾,如 ... 。由于 X 现在拒绝长 Post 而不是截断它们,绝大多数 Post 将此设置为 false 。请注意,虽然原生转发可能会缩短其顶级 text 属性,但原始文本将在 retweeted_status 对象下可用,并且 truncated 参数将设置为原始状态的值(在大多数情况下为 false )。示例:“truncated”:true |
in_reply_to_status_id | Int64 | 可为空。 如果所表示的 Post 是回复,此字段将包含原始 Post ID 的整数表示。示例: “in_reply_to_status_id”:1051222721923756032 |
in_reply_to_status_id_str | String | 可为空。 如果所表示的 Post 是回复,此字段将包含原始 Post ID 的字符串表示。示例: “in_reply_to_status_id_str”:“1051222721923756032” |
in_reply_to_user_id | Int64 | 可为空。 如果所表示的 Post 是回复,此字段将包含原始 Post 作者 ID 的整数表示。这不一定总是 Post 中直接提及的用户。示例: “in_reply_to_user_id”:6253282 |
in_reply_to_user_id_str | String | 可为空。 如果所表示的 Post 是回复,此字段将包含原始 Post 作者 ID 的字符串表示。这不一定总是 Post 中直接提及的用户。示例: “in_reply_to_user_id_str”:“6253282” |
in_reply_to_screen_name | String | 可为空。 如果所表示的 Post 是回复,此字段将包含原始 Post 作者的用户名。示例: “in_reply_to_screen_name”:“xapi” |
user | 用户对象 | 发布此 Post 的用户。有关属性的完整列表,请参阅用户数据字典。 突出显示选定属性的示例: { “user”: <br/> “id”: 6253282, “id_str”: “6253282”, “name”: “X API”, “screen_name”: “API”, “location”: “San Francisco, CA”, “url”: “https://developer.x.com”, “description”: “The Real X API. Tweets about API changes, service issues and our Developer Platform. Don’t get an answer? It’s on my website.”, “verified”: true, “followers_count”: 6129794, “friends_count”: 12, “listed_count”: 12899, “favourites_count”: 31, “statuses_count”: 3658, “created_at”: “Wed May 23 06:01:13 +0000 2007”, “utc_offset”: null, “time_zone”: null, “geo_enabled”: false, “lang”: “en”, “contributors_enabled”: false, “is_translator”: false, “profile_background_color”: “null”, “profile_background_image_url”: “null”, “profile_background_image_url_https”: “null”, “profile_background_tile”: null, “profile_link_color”: “null”, “profile_sidebar_border_color”: “null”, “profile_sidebar_fill_color”: “null”, “profile_text_color”: “null”, “profile_use_background_image”: null, “profile_image_url”: “null”, “profile_image_url_https”: “https://pbs.twimg.com/profile_images/942858479592554497/BbazLO9L_normal.jpg”, “profile_banner_url”: “https://pbs.twimg.com/profile_banners/6253282/1497491515”, “default_profile”: false, “default_profile_image”: false, “following”: null, “follow_request_sent”: null, “notifications”: null } } |
coordinates | Coordinates | 可为空。 表示用户或客户端应用程序报告的此 Post 的地理位置。内部坐标数组格式为 geoJSON(经度在前,纬度在后)。示例: “coordinates”: <br/> “coordinates”: [ -75.14310264, 40.05701649 ], “type”:“Point” } |
place | Places | 可为空 当存在时,表示该 Post 与某个地点相关联(但不一定来源于该地点)。示例: “place”: <br/> “attributes”:, “bounding_box”: <br/> “coordinates”: [[ [-77.119759,38.791645], [-76.909393,38.791645], [-76.909393,38.995548], [-77.119759,38.995548] ]], “type”:“Polygon” }, “country”:“United States”, “country_code”:“US”, “full_name”:“Washington, DC”, “id”:“01fbe706f872cb32”, “name”:“Washington”, “place_type”:“city”, “url”:“http://api.x.com/1/geo/id/0172cb32.json” } |
quoted_status_id | Int64 | 此字段仅在 Post 为引用 Tweet 时显示。此字段包含被引用 Tweet 的整数值 Post ID。示例: “quoted_status_id”:1050119905717055488 |
quoted_status_id_str | String | 此字段仅在 Post 为引用 Tweet 时显示。这是被引用 Tweet 的字符串表示 Post ID。示例: “quoted_status_id_str”:“1050119905717055488” |
is_quote_status | Boolean | 指示这是否为引用 Tweet。示例: “is_quote_status”:false |
quoted_status | Post | 此字段仅在 Post 为引用 Tweet 时显示。此属性包含被引用的原始 Post 的 Post 对象。 |
retweeted_status | Post | 用户可以通过转发来扩大其他用户创作的 Post 的传播。转发可以通过 retweeted_status 属性的存在与典型 Post 区分开来。此属性包含被转发的原始 Post 的表示。请注意,转发的转发不会显示中间转发的表示,而只显示原始 Post。(用户也可以通过删除其转发来取消转发他们创建的转发。) |
quote_count | Integer | 可为空。 指示此 Post 被 X 用户引用的大致次数。示例: “quote_count”:33 注意:此对象仅在 Premium 和 Enterprise 层级产品中可用。 |
reply_count | Int | 此 Post 被回复的次数。示例: “reply_count”:30 注意:此对象仅在 Premium 和 Enterprise 层级产品中可用。 |
retweet_count | Int | 此 Post 被转发的次数。示例: “retweet_count”:160 |
favorite_count | Integer | 可为空。 指示此 Post 被 X 用户点赞的大致次数。示例: “favorite_count”:295 |
entities | Entities | 从 Post 文本中解析出的实体。另请参阅 X 对象中的实体。示例: “entities”: <br/> “hashtags”:[], “urls”:[], “user_mentions”:[], “media”:[], “symbols”:[] “polls”:[] } |
extended_entities | Extended Entities | 当 Post 中包含一到四张原生照片或一个视频或一个动画 GIF 时,包含一个数组 ‘media’ metadata。这在引用 Tweet 中也可用。另请参阅 X 对象中的实体。示例: “entities”: <br/> “media”:[] } |
favorited | Boolean | 可为空。 指示此 Post 是否已被认证用户点赞。示例: “favorited”:true |
retweeted | Boolean | 指示此 Post 是否已被认证用户转发。示例: “retweeted”:false |
possibly_sensitive | Boolean | 可为空。 此字段指示内容可能被识别为敏感内容。Post 作者可以在其账户偏好设置中选择”将您发布的媒体标记为可能包含敏感材料”,因此之后创建的每个 Post 都会设置此标志。 这也可能由 X 内部支持代理判断和标记。 “possibly_sensitive”:false |
filter_level | String | 指示可以使用的 filter_level 参数的最大值,并且仍然可以流式传输此 Post。因此,medium 值将在 none 、low 和 medium stream 上流式传输。示例: “filter_level”: “low” |
lang | String | 可为空。 当存在时,指示与机器检测到的 Post 文本语言对应的 BCP 47 语言标识符,如果无法检测到语言则为 und 。示例: “lang”: “en” |
edit_history | Object | 唯一标识符,表示 Post 的所有版本。对于未经编辑的 Post,将有一个 ID。对于有编辑历史的 Post,将有多个 ID,按升序排列,反映编辑顺序,最新版本位于数组的最后位置。 Post ID 可用于获取和查看 Post 的先前版本。 示例: edit_history”: <br/> “initial_tweet_id”: “1283764123” “edit_tweet_ids”: [“1283764123”, “1394263866”] } |
edit_controls | Object | 当存在时,表示 Post 仍可编辑的时长以及剩余编辑次数。Post 仅在创建后的前 30 分钟内可编辑,最多可编辑五次。 Post ID 可用于获取和查看 Post 的先前版本。 示例: “edit_controls”: <br/> “editable_until_ms”: 123 “edits_remaining”: 3 } |
editable | Boolean | 当存在时,表示 Post 在发布时是否符合编辑条件。此字段不是动态的,当 Post 达到其可编辑时间限制或最大编辑次数时,不会从 True 切换到 False。以下 Post 功能将导致此字段为 false: _ Post 被推广 _ Post 包含投票 _ Post 是非自我线程回复 _ Post 是转发(请注意引用 Tweet 符合编辑条件) _ Post 是 nullcast _ 社区 Post _ Superfollow Post _ 协作 Post |
matching_rules | Array of Rule Objects | 出现在 X Search 和 PowerTrack 等_过滤_产品中。提供与匹配 Post 的规则关联的 id 和 tag。有关匹配规则的更多信息请参见此处。使用 PowerTrack 时,多个规则可以匹配一个 Post。 示例: “matching_rules”: ” [<br/> “tag”: “xapi emojis”, “id”: 1050118621198921728, “id_str”: “1050118621198921728” }]“ |
其他 Post 属性
属性 | 类型 | 说明 |
---|---|---|
current_user_retweet | Object | 具视角性。仅在支持 include_my_retweet 参数且其值为 true 的方法中出现。提供用户对该 Post 的自身转发(如存在)的 Post ID。示例: “current_user_retweet”: <br/> “id”: 6253282, “id_str”: “6253282” } |
scopes | Object | 一组键值对,用于指示该 Post 的预期上下文投放。目前由 X 的 Promoted Products 使用。示例: “scopes”:{“followers”:false} |
withheld_copyright | Boolean | 当存在且设为 “true” 时,表示该内容因 DMCA 投诉 而被屏蔽。示例: “withheld_copyright”: true |
withheld_in_countries | Array of String | 当存在时,表示一个以大写形式呈现的两位国家/地区代码列表,指明内容被屏蔽的国家/地区。X 对此字段支持以下非国家值: “XX” — 内容在所有国家/地区被屏蔽;“XY” — 内容因 DMCA 请求被屏蔽。 示例: “withheld_in_countries”: [“GR”, “HK”, “MY”] |
withheld_scope | String | 当存在时,指示被屏蔽的对象是 “status” 还是 “user”。 示例: “withheld_scope”: “status” |
已弃用的属性
字段 | 类型 | 说明 |
geo | Object | 已弃用。 可为 null。 请改用 coordinates 字段。该已弃用属性的坐标格式为 [lat, long],而其他所有 Post 的地理信息均为 [long, lat] 格式。 |
嵌套的 Post 对象
引用 Tweet
扩展 Post
原生增强型用户对象
用户数据词典
属性 | 类型 | 描述 |
---|---|---|
id | Int64 | 此用户唯一标识符的整数表示。此数字大于 53 位,某些编程语言在解释时可能会遇到困难/静默缺陷。使用有符号 64 位整数存储此标识符是安全的。使用 id_str 获取标识符以确保安全。有关更多信息,请参阅 X IDs。示例:“id”: 6253282 |
id_str | String | 此用户唯一标识符的字符串表示。实现应使用此字段而不是 id 中可能无法处理的大整数。示例:“id_str”: “6253282” |
name | String | 用户定义的姓名。不一定是真实姓名。通常限制为 50 个字符,但可能会发生变化。示例: “name”: “API” |
screen_name | String | 此用户标识自己的屏幕名称、用户名或别名。screen_names 是唯一的但可能会发生变化。尽可能使用 id_str 作为用户标识符。通常最多 15 个字符长,但某些历史账户可能存在更长的名称。示例:“screen_name”: “api” |
location | String | 可为空。此账户个人资料的用户定义位置。不一定是位置,也不一定可被机器解析。此字段偶尔会被搜索服务模糊解释。示例: “location”: “San Francisco, CA” |
derived | Arrays of Enrichment Objects | 仅限 Enterprise API 为用户派生的丰富元数据集合。提供 Profile Geo 丰富元数据。有关更多信息(包括 JSON 数据字典),请参阅相关文档。示例: “derived”:“locations”: [“country”:“United States”,“country_code”:“US”,“locality”:“Denver”] |
url | String | 可为空。用户在其个人资料中提供的 URL。示例: “url”: “https://developer.x.com” |
description | String | 可为空。用户定义的描述其账户的 UTF-8 字符串。示例: “description”: “The Real X API.” |
protected | Boolean | 当为 true 时,表示此用户已选择保护其 Post。请参阅 关于公开和受保护的 Post。示例: “protected”: true |
verified | Boolean | 当为 true 时,表示用户拥有已验证账户。请参阅 已验证账户。示例: “verified”: false |
followers_count | Int | 此账户当前拥有的关注者数量。在某些压力情况下,此字段将暂时显示”0”。示例: “followers_count”: 21 |
friends_count | Int | 此账户正在关注的用户数量(即其”关注数”)。在某些压力情况下,此字段将暂时显示”0”。示例: “friends_count”: 32 |
listed_count | Int | 此用户所属的公开列表数量。示例: “listed_count”: 9274 |
favourites_count | Int | 此用户在账户生命周期内点赞的 Post 数量。字段名称使用英式拼写是出于历史原因。示例: “favourites_count”: 13 |
statuses_count | Int | 用户发布的 Post 数量(包括转发)。示例: “statuses_count”: 42 |
created_at | String | 用户账户在 X 上创建的 UTC 日期时间。示例: “created_at”: “Mon Nov 29 21:18:15 +0000 2010” |
profile_banner_url | String | 指向用户上传的个人资料横幅标准网页表示的基于 HTTPS 的 URL。通过在 URL 末尾添加路径元素,可以获得针对特定显示优化的不同图像尺寸。有关尺寸变体,请参阅 用户个人资料图像和横幅。 示例: “profile_banner_url”: “https://si0.twimg.com/profile_banners/819797/1348102824” |
profile_image_url_https | String | 指向用户个人资料图像的基于 HTTPS 的 URL。示例: “profile_image_url_https”: “https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png” |
default_profile | Boolean | 当为 true 时,表示用户未更改其用户个人资料的主题或背景。示例: “default_profile”: false |
default_profile_image | Boolean | 当为 true 时,表示用户未上传自己的个人资料图像,而是使用默认图像。示例: “default_profile_image”: false |
不再支持(已弃用)的属性
字段 | 类型 | 说明 |
---|---|---|
utc_offset | null | 值将被设置为 null。仍可通过 GET account/settings 获取 |
time_zone | null | 值将被设置为 null。仍可通过 GET account/settings 以 tzinfo_name 获取 |
lang | null | 值将被设置为 null。仍可通过 GET account/settings 以 language 获取 |
geo_enabled | null | 值将被设置为 null。仍可通过 GET account/settings 获取。当前用户在使用 POST statuses/update 附加地理数据时,该字段必须为 true |
following | null | 值将被设置为 null。仍可通过 GET friendships/lookup 获取 |
follow_request_sent | null | 值将被设置为 null。仍可通过 GET friendships/lookup 获取 |
has_extended_profile | null | 已弃用。值将被设置为 null。 |
notifications | null | 已弃用。值将被设置为 null。 |
profile_location | null | 已弃用。值将被设置为 null。 |
contributors_enabled | null | 已弃用。值将被设置为 null。 |
profile_image_url | null | 已弃用。值将被设置为 null。注意:头像仅可通过 profile_image_url_https 字段获取。 |
profile_background_color | null | 已弃用。值将被设置为 null。 |
profile_background_image_url | null | 已弃用。值将被设置为 null。 |
profile_background_image_url_https | null | 已弃用。值将被设置为 null。 |
profile_background_tile | null | 已弃用。值将被设置为 null。 |
profile_link_color | null | 已弃用。值将被设置为 null。 |
profile_sidebar_border_color | null | 已弃用。值将被设置为 null。 |
profile_sidebar_fill_color | null | 已弃用。值将被设置为 null。 |
profile_text_color | null | 已弃用。值将被设置为 null。 |
profile_use_background_image | null | 已弃用。值将被设置为 null。 |
is_translator | null | 已弃用。值将被设置为 null。 |
is_translation_enabled | null | 已弃用。值将被设置为 null。 |
translator_type | null | 已弃用。值将被设置为 null。 |
示例用户对象:
原生增强地理对象
place
对象始终存在。Place 是具有相应地理坐标的特定、具名位置。当用户决定为其 Post 指定位置时,他们会看到一个候选 X Place 列表。使用 API 发帖时,可以在发布时通过指定 place_id 来附加一个 X Place。与 Place 关联的 Post 不一定发布自该位置,也可能是关于该位置。
仅当 Post 被分配了精确位置时,geo 和 coordinates
对象才会出现(非空)。如果提供了精确位置,coordinates
对象将提供一个包含地理坐标的 [long, lat] 数组,并会分配与该位置相对应的一个 X Place。
地点数据字典
字段 | 类型 | 描述 |
---|---|---|
id | String | 表示此地点的 id。注意这是字符串而非整数。示例: “id”:“01a9a39529b27f36” |
url | String | 指向此地点的附加 place metadata 的位置的 URL。示例: “url”:“https://api.x.com/1.1/geo/id/01a9a39529b27f36.json” |
place_type | String | 此地点所代表的位置类型。示例: “place_type”:“city” |
name | String | 此地点名称的简短、人类可读形式。示例: “name”:“Manhattan” |
full_name | String | 此地点名称的完整、人类可读形式。示例: “full_name”:“Manhattan, NY” |
country_code | String | 表示包含此地点的国家/地区的简写国家/地区代码。示例: “country_code”:“US” |
country | String | 包含此地点的国家/地区名称。示例: “country”:“United States” |
bounding_box | Object | 围绕此地点的坐标边界框。示例: “bounding_box”: “coordinates”: [ [ [ -74.026675, 40.683935 ], [ -74.026675, 40.877483 ], [ -73.910408, 40.877483 ], [ -73.910408, 40.3935 ] ] ], “type”: “Polygon” |
attributes | Object | 在使用 PowerTrack、30-Day 和 Full-Archive Search API 以及 Volume Streams 时,此 hash 为 null。示例: “attributes”: |
字段 | 类型 | 描述 |
coordinates | Array of Array of Array of Float | 一系列经纬度点,定义一个将包含与此边界框相关 Place 实体的矩形区域。每个点为形如 [longitude, latitude] 的数组。每个边界框对应一组点数组。为兼容多边形表示法,边界框数组外再包裹一层数组。示例: “coordinates”: [ [ [ -74.026675, 40.683935 ], [ -74.026675, 40.877483 ], [ -73.910408, 40.877483 ], [ -73.910408, 40.3935 ] ] ] |
type | String | coordinates 属性中编码的数据类型。边界框为“Polygon”,具有精确坐标的 Post 为“Point”。示例: “type”:“Polygon” |
Geo 对象数据字典
字段 | 类型 | 说明 |
coordinates | Float 集合 | Post 所在位置的经纬度,按 [latitude, longitude](纬度、经度)的顺序组成的集合。示例: ** “geo”: “type”:** “Point”, ** “coordinates”: [ 54.27784, -0.41068 ] ** |
type | String | coordinates 属性所编码的数据类型。对于 Post 坐标 fields,该值为“Point”。示例: “type”: “Point” |
字段 | 类型 | 说明 |
coordinates | Float 集合 | Post 所在位置的经纬度,按 [longitude, latitude](经度、纬度)的顺序组成的集合。示例: ** “coordinates”: “type”:** “Point”, ** “coordinates”: [ -0.41068, 54.27784 ] ** |
type | String | coordinates 属性所编码的数据类型。对于 Post 坐标 fields,该值为“Point”。示例: “type”: “Point” |
派生位置
字段 | 类型 | 描述 |
derived | locations object | 基于个人资料的地理信息增强得到的位置 “derived”: “locations”: [ ** “country”:** “United Kingdom”, “country_code”: “GB”, “locality”: “Yorkshire”, “region”: “England”, “full_name”: “Yorkshire, England, United Kingdom”, ** “geo”: “coordinates”: [ -1.5, 54 ], “type”:** “point” ** ] ** |
示例:
X 实体
跳转到本页 简介 entities 对象 - hashtag 对象 - media 对象 - media 尺寸对象 - URL 对象 - 用户提及对象 - symbol 对象 - 投票对象 转发与引用 Tweet 详情 用户对象中的 entities 私信中的 entities 后续步骤介绍
entities
部分包含 Posts 中常见元素的数组:hashtags、用户提及、链接、股票代码(symbols)、X 投票,以及所附媒体。由于 X 实际上已对文本正文进行了预处理(预解析),这些数组便于开发者在摄取 Posts 时使用。开发者无需在 Post 正文中显式检索这些实体,解析器可直接读取该 JSON 部分。
除了提供解析便利外,entities
部分还提供有用的“增值”metadata。比如,如果你使用了Enhanced URLs enrichment,URL metadata 会包含完整展开的 URL,以及关联的网站标题和描述。再比如,当存在用户提及时,entities metadata 会包含数值型用户 id,这在调用许多 X API 时很有用。
每个 Post 的 JSON 负载都会包含一个 entities
部分,至少包含 hashtags
、urls
、user_mentions
和 symbols
属性,即使这些实体并未出现在该 Post 消息中也是如此。比如,如果你查看一个正文为“Hello World!”且未附带媒体的 Post 的 JSON,Post 的 JSON 仍会包含如下内容,其中的实体数组为空(包含零项):
- 仅当该类内容属于 Post 的一部分时,才会出现 media 和 polls 实体。
- 如果你正在处理原生媒体(照片、视频或 GIF),建议使用 Extended Entities object。
Entities 对象
entities
和 extended_entities
部分均由实体对象数组组成。下面将逐一说明这些实体对象,并提供数据字典,描述对象的属性名称、类型及简要说明。我们还会指出哪些 PowerTrack Operators 可匹配这些属性,并附上一些示例 JSON 载荷。
这是一个在 Post 中常见的实体集合,包括话题标签、链接和用户提及。entities
对象确实包含 media
属性,但其在 entities
部分中的实现仅对包含单张照片的 Post 完全准确。对于包含多张照片、视频或动画 GIF 的 Post,请参阅 extended_entities
部分。
Entities 数据字典
entities
对象用于承载由其他实体子对象组成的数组。在说明 entities
的结构后,我们将提供这些子对象的数据字典,以及与之匹配的运算符(Operators)。
字段 | 类型 | 描述 |
---|---|---|
hashtags | Hashtag Objects 数组 | 表示从 Post 文本中解析出的话题标签。示例: “hashtags”: [ “indices”: [ 32, 38 ], “text”: “nodejs” ] |
media | Media Objects 数组 | 表示与 Post 一起上传的媒体元素。示例: “media”: [ “display_url”: “pic.x.com/5J1WJSRCy9”, “expanded_url”: “https://x.com/nolan_test/status/930077847535812610/photo/1”, “id”: 9.300778475358126e17, “id_str”: “930077847535812610”, “indices”: [ 13, 36 ], “media_url”: “http://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg”, “media_url_https”: “https://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg” “sizes”: “thumb”: “h”: 150, “resize”: “crop”, “w”: 150 , “large”: “h”: 1366, “resize”: “fit”, “w”: 2048 , “medium”: “h”: 800, “resize”: “fit”, “w”: 1200 , “small”: “h”: 454, “resize”: “fit”, “w”: 680 , “type”: “photo”, “url”: “https://t.co/5J1WJSRCy9”, ] |
urls | URL Objects 数组 | 表示 Post 文本中包含的 URL。 示例(未启用增强 URL 功能): “urls”: [ “indices”: [ 32, 52 ], “url”: “http://t.co/IOwBrTZR”, “display_url”: “youtube.com/watch?v=oHg5SJ…”, “expanded_url”: “http://www.youtube.com/watch?v=oHg5SJYRHA0” ] 示例(启用增强 URL 功能): “urls”: [ “url”: “https://t.co/D0n7a53c2l”, “expanded_url”: “http://bit.ly/18gECvy”, “display_url”: “bit.ly/18gECvy”, “unwound”: “url”: “https://www.youtube.com/watch?v=oHg5SJYRHA0”, “status”: 200, “title”: “RickRoll’D”, “description”: “http://www.facebook.com/rickroll548 As long as trolls are still trolling, the Rick will never stop rolling.” , “indices”: [ 62, 85 ] ] |
user_mentions | User Mention Objects 数组 | 表示在 Post 文本中提及的其他 X 用户。示例: “user_mentions”: [ “name”: “X API”, “indices”: [ 4, 15 ], “screen_name”: “xapi”, “id”: 6253282, “id_str”: “6253282” ] |
symbols | Symbol Objects 数组 | 表示 Post 文本中包含的符号,即 $cashtags。示例: “symbols”: [ “indices”: [ 12, 17 ], “text”: “twtr” ] |
polls | Poll Objects 数组 | 表示 Post 中包含的 X 投票。示例: “polls”: [ “options”: [ “position”: 1, “text”: “I read documentation once.” , “position”: 2, “text”: “I read documentation twice.” }, “position”: 3, “text”: “I read documentation over and over again.” } ], “end_datetime”: “Thu May 25 22:20:27 +0000 2017”, “duration_minutes”: 60 ] |
Hashtag 对象
entities
部分包含一个 hashtags
数组,其中为 Post 正文中出现的每个 hashtag 提供一个对象;如果没有 hashtag,则该数组为空。
PowerTrack #
运算符用于匹配 text
属性。has:hashtags
运算符在数组中至少有一项时匹配。
字段 | 类型 | 说明 |
indices | Int 数组 | 一个整数数组,表示 hashtag 在 Post 文本中的起止偏移位置。第一个整数是 Post 文本字符串中 # 字符的位置。第二个整数是 hashtag 之后的第一个字符的位置。因此,这两个数字的差值等于 hashtag 名称的长度再加一(用于“#”字符)。示例: “indices”:[32,38] |
text | 字符串 | hashtag 的名称(不包含前导“#”字符)。示例: “text”:“nodejs” |
媒体对象
如果有任何媒体对象“附加”到 Post,entities
部分将包含一个 media
数组,其中只有一个媒体对象。如果未附加原生媒体,则 entities
中不会包含 media
数组。基于以下原因,应使用 extended_entities
部分来处理 Post 的原生媒体:
- 即使附加的是视频或 GIF,媒体的
type
也始终会显示为“photo”。 - 即使最多可附加四张照片,
entities
部分中也只会列出第一张。
has:media
运算符将匹配。
字段 | 类型 | 描述 |
display_url | String | 向客户端显示的媒体 URL。示例: “display_url”:“pic.x.com/rJC5Pxsu” |
expanded_url | String | display_url 的扩展版本。链接到媒体显示页面。示例: “expanded_url”: “http://x.com/yunorno/status/114080493036773378/photo/1” |
id | Int64 | 以 64 位整数表示的媒体 ID。示例: “id”:114080493040967680 |
id_str | String | 以字符串表示的媒体 ID。示例: “id_str”:“114080493040967680” |
indices | Array of Int | 整数数组,指示 URL 在 Post 文本中的起始和结束偏移量。第一个整数表示 URL 在 Post 文本中第一个字符的位置。第二个整数表示 URL 后第一个非 URL 字符的位置(如果 URL 是 Post 文本的最后部分,则为字符串的结尾)。示例: “indices”:[15,35] |
media_url | String | 直接指向上传媒体文件的 http:// URL。示例: “media_url”:“http://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg” 对于私信中的媒体, media_url 与 media_url_https 是相同的 https URL,必须使用 OAuth 1.0a 通过用户的 access token 签名请求来访问。无法通过已认证的 x.com 会话访问图像。请访问此页面了解如何应对这些最新变化。 您无法直接在网页中嵌入这些图像。 请参阅照片媒体 URL 格式了解如何根据可用的 sizes 格式化照片的 URL(如 media_url_https )。 |
media_url_https | String | 直接指向上传媒体文件的 https:// URL,用于在 https 页面中嵌入。示例: “media_url_https”:“https://p.twimg.com/AZVLmp-CIAAbkyy.jpg” 对于私信中的媒体,必须使用 OAuth 1.0a 通过用户的 access token 签名请求来访问 media_url_https 。无法通过已认证的 x.com 会话访问图像。请访问此页面了解如何应对这些最新变化。 您无法直接在网页中嵌入这些图像。 请参阅照片媒体 URL 格式了解如何根据可用的 sizes 格式化照片的 URL(如 media_url_https )。 |
sizes | Size Object | 显示媒体文件可用尺寸的对象。示例: “sizes”: “thumb”: “h”: 150, “resize”: “crop”, “w”: 150 }, “large”: “h”: 1366, “resize”: “fit”, “w”: 2048 }, “medium”: “h”: 800, “resize”: “fit”, “w”: 1200 }, “small”: “h”: 454, “resize”: “fit”, “w”: 680 } } } 请参阅照片媒体 URL 格式了解如何根据可用的 sizes 格式化照片的 URL(如 media_url_https )。 |
source_status_id | Int64 | 可为空。对于包含原本与不同 Post 关联的媒体的 Post,此 ID 指向原始 Post。示例: “source_status_id”: 205282515685081088 |
source_status_id_str | Int64 | 可为空。对于包含原本与不同 Post 关联的媒体的 Post,此基于字符串的 ID 指向原始 Post。示例: “source_status_id_str”: “205282515685081088” |
type | String | 上传媒体的类型。可能的类型包括 photo、video 和 animated_gif。示例: “type”:“photo” |
url | String | 媒体链接的包装 URL。这对应于直接嵌入到原始 Post 文本中的 URL,以及 indices 参数的值。示例:“url”:“http://t.co/rJC5Pxsu” |
媒体尺寸对象
Sizes 对象
字段 | 类型 | 说明 |
thumb | Size Object | 缩略图尺寸的媒体信息。示例: “thumb”:“h”:150, “resize”:“crop”, “w”:150} 缩略图尺寸的照片媒体将被限制为在 150×150 边界内填充并裁剪(fill)。 |
large | Size Object | 大尺寸的媒体信息。示例: “large”:“h”:454, “resize”:“fit”, “w”:680} 大尺寸的照片媒体将被限制为在 680×680 边界内适配(fit)。 |
medium | Size Object | 中等尺寸的媒体信息。示例: “medium”:“h”:800, “resize”:“fit”, “w”:1200} 中等尺寸的照片媒体将被限制为在 1200×1200 边界内适配(fit)。 |
small | Size Object | 小尺寸的媒体信息。示例: “small”:“h”:1366, “resize”:“fit”, “w”:2048} 小尺寸的照片媒体将被限制为在 2048×2048 边界内适配(fit)。 |
Size 对象
字段 | 类型 | 说明 |
w | Int | 此尺寸的宽度(像素)。示例: “w”:150 |
h | Int | 此尺寸的高度(像素)。示例: “h”:150 |
resize | String | 获取该尺寸所使用的调整方式。取值 fit 表示在保持原始纵横比的前提下按单一维度进行缩放;取值 crop 表示为满足特定分辨率而进行裁剪。示例: “resize”:“crop” |
照片媒体 URL 格式
media_url
或 media_url_https
也可以加载,默认会加载 medium 变体。但在可能的情况下,优先提供完整格式的照片媒体 URL。
照片媒体 URL 由三部分组成:
Base URL | Base URL 是去掉文件扩展名的媒体 URL。 例如: “media_url_https”: “https://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg”, 则 Base URL 为: https://pbs.twimg.com/media/DOhM30VVwAEpIHq |
Format | Format 是图像所采用的照片格式。可用格式为 jpg 或 png,由媒体 URL 的扩展名给出。 例如: “media_url_https”: “https://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg”, 则格式为:jpg |
Name | Name 是要加载的尺寸字段名。 例如: “sizes”: “thumb”: “h”: 150, “resize”: “crop”, “w”: 150 , “large”: “h”: 1366, “resize”: “fit”, “w”: 2048 }, “medium”: “h”: 800, “resize”: “fit”, “w”: 1200 }, “small”: “h”: 454, “resize”: “fit”, “w”: 680 } } } 当加载大尺寸照片时,Name 为:large |
Legacy format | 旧版格式已弃用。所有照片媒体的加载应迁移到现代格式。 <base_url>.<format>:<name> 例如: https://pbs.twimg.com/media/DOhM30VVwAEpIHq.jpg:large |
Modern format | 在 X,加载照片的现代格式于 2015 年确立,并自 2017 年起成为事实标准。所有照片媒体的加载都应迁移到此格式。 <base_url>?format=<format>&name=<name> 例如: https://pbs.twimg.com/media/DOhM30VVwAEpIHq?format=jpg&name=large 注意:照片媒体 URL 中 query(查询)字符串的各项按字母顺序排列。若媒体加载新增任何 query 项,仍必须保持字母顺序。例如,若新增一个名为 preferred_format 的假设性 query 项,应在 query 字符串中排在 format 和 name 之后。 |
URL 对象
entities
部分包含一个 urls
数组,其中为 Post 正文中每个链接提供一个对象;如果没有链接,则为一个空数组。
当数组中至少有一项时,has:links
运算符会匹配。url:
运算符用于匹配 expanded_url
属性。如果你使用 Expanded URL enrichment,则 url:
运算符用于匹配 unwound.url
(完全展开的 URL)属性。如果你使用 Enhanced URL enrichment,则使用 url_title:
和 url_description:
运算符分别匹配 unwound.title
和 unwound.description
属性。
字段 | 类型 | 说明 |
display_url | String | 粘贴/输入到 Post 中的 URL。示例: “display_url”:“bit.ly/2so49n2” |
expanded_url | String | display_url 的展开版本。示例:“expanded_url”:“http://bit.ly/2so49n2” |
indices | Array of Int | 整数数组,表示 URL 在 Post 文本中的起止偏移。第一个整数表示该 URL 在 Post 文本中第一个字符的位置;第二个整数表示该 URL 结束后第一个非 URL 字符的位置。示例: “indices”:[30,53] |
url | String | 包装后的 URL,对应直接嵌入原始 Post 文本的值及 indices 参数的取值。示例: “url”:“https://t.co/yzocNFvJuL” |
unwound
属性下:
字段 | 类型 | 说明 |
url | String | Post 中所含链接的完全展开版本。示例: “url”:“https://blog.x.com/en_us/topics/insights/2016/using-twitter-as-a-go-to-communication-channel-during-severe-weather-events.html” |
status | Int | 展开过程的最终 HTTP 状态,200 表示成功。示例: 200 |
title | String | 链接的 HTML 标题。示例: “title”:“Using X as a ‘go-to’ communication channel during severe weather” |
description | String | 链接的 HTML 描述。示例: “description”:“Using X as a ‘go-to’ communication channel during severe weather” |
用户提及对象
entities
部分包含一个 user_mentions
数组,其中每个元素对应 Post 正文中的一次用户提及;如果没有用户提及,则该数组为空。
PowerTrack 的 @
运算符用于匹配 screen_name
属性。has:mentions
运算符在数组中至少存在一项时匹配。
Field | Type | Description |
id | Int64 | 被提及用户的 ID(整数)。示例: “id”:6253282 |
id_str | String | 被提及用户的 ID(字符串)。示例: “id_str”:“6253282” |
indices | Array of Int | 整数数组,表示该用户引用在 Post 文本中的起止偏移。第一个整数为该次用户提及中‘@’字符的位置,第二个整数为紧随该提及之后的第一个非 screen_name 字符的位置。示例: “indices”:[4,15] |
name | String | 被引用用户的显示名称。示例: “name”:“API” |
screen_name | String | 被引用用户的用户名(screen_name)。示例: “screen_name”:“api” |
符号对象
entities
部分将包含一个 symbols
数组,其中为 Post 正文中包含的每个 $cashtag 提供一个对象;如果没有符号,则为一个空数组。
PowerTrack $
运算符用于匹配 text
属性。has:symbols
运算符在数组中至少有一项时匹配。
字段 | 类型 | 描述 |
indices | Array of Int | 一个整数数组,表示该符号/cashtag 在 Post 文本中的起始与结束偏移。第一个整数表示 Post 文本字符串中 ”字符)。示例: “indices”:[12,17] |
text | String | cashtag 的名称,不包含前导“$”字符。示例: “text”:“twtr” |
Poll 对象
entities
部分将包含一个 polls
数组,内含单个 poll
对象。若未包含投票,则 entities
部分中不会有 polls
数组。
请注意,这些 Poll 元数据仅可通过以下 Enterprise API 获取:
- Volume streams(Decahose)
- Real-time PowerTrack
- X Search APIs(Full-Archive Search 和 30-Day Search)
字段 | 类型 | 说明 |
options | Array of Option Object | 选项数组,每个选项包含一个位置编号以及该位置对应的文本。示例: “options”: [ “position”: 1, “text”: “I read documentation once.” } ] } |
end_datetime | String | 投票结束时间戳(UTC)。示例: “end_datetime”: “Thu May 25 22:20:27 +0000 2017” |
duration_minutes | String | 投票持续时间(分钟)。示例: “duration_minutes”: 60 |
转发与引用 Tweet 详情
转发













引用推文
用户对象的实体
JSON 示例
X 扩展实体
跳转至本页 介绍 扩展实体对象 示例 Tweets 和 JSON 载荷 - 包含四张原生照片的 Tweet - 包含原生视频的 Tweet - 包含动画 GIF 的 Tweet 后续步骤介绍
extended_entities
JSON 对象。extended_entities
对象包含一个由 media
对象组成的单一 media
数组(其数据字典参见 entities
部分)。extended_entities
部分不包含其他实体类型,例如 hashtags 和 links。extended_entities
部分中的 media
对象在结构上与 entities
部分中的完全相同。
Posts 只能附带一种类型的媒体。照片最多可附加四张;视频和 GIF 只能附加一个。由于 extended_entities
部分中的媒体 type
metadata 能正确标示媒体类型(“photo”、“video” 或 “animated_gif”),且支持最多 4 张照片,因此它是原生媒体的首选 metadata 来源。
示例 Post 与 JSON 负载
以下是该 Post 的
entities
部分:
extented_entities
部分:
含原生视频的 Post
video_info
对象将被 additional_media_info
对象替换。
additional_media_info
将包含发布方提供的额外媒体信息,例如 title
、description
和 embeddable flag
。当 embeddable=false
时,视频内容仅对 X 官方客户端可用。在这种情况下,负载(payload)中提供的所有视频 URL 都将指向 X,因此用户可通过点击链接在 X 自有产品中打开视频。
以下是在这种情况下扩展实体对象的示例:
entities
部分,其中 type
被错误地设为“photo”。同样地,对于所有原生媒体类型(包括 “video” 和 “animated_gif”),应优先使用 extended_entities
部分。
带动画 GIF 的 Post
下面是该带动画 GIF 的 Post 的扩展实体 metadata:
原生增强示例载荷
Post
回复 Post
扩展版 Post
包含 extended_entities 的 Post
转发
引用 Tweet
已转发的引用 Tweet
Enterprise Activity Streams 数据对象
想了解 Activity Streams 数据格式如何映射到 X API v2 格式吗?
请注意:强烈建议在企业数据 API 中使用 Enriched Native 格式。
- Enriched Native 格式包含自 2017 年以来新增的全部 metadata,例如 poll metadata,以及 reply_count、quote_count 等附加度量。
- 自 2017 年字符更新以来,Activity Streams 格式未再新增 metadata 或其他富化内容。
活动对象
数据字典
属性 | 类型 | 描述 |
id | string | Post 的唯一 IRI。详细来说,“tag” 是方案,“search.x.com” 代表方案的域名,2005 是方案的派生年份。 存储 Post 时,应将此作为唯一标识符或主键使用。 “id”: “tag:search.x.com,2005:1050118621198921728” |
objectType | string | 对象类型,始终设置为 “activity” “objectType”: “activity” |
object | object | 表示正在发布或分享的 Post 的对象。 对于转发,这将包含一个完整的 “activity”,其中包含此架构中描述的相关字段。 对于原创 Post,这将包含一个 “note” 对象,其中包含此处描述的字段。 “object”: “object”: “objectType”: “note”, “id”: “object:search.x.com,2005:1050118621198921728”, “summary”: “To make room for more expression, we will now count all emojis as equal—including those with gender and skin t… https://t.co/MkGjXf9aXm”, “link”: “http://x.com/API/statuses/1050118621198921728”, “postedTime”: “2018-10-10T20:19:24.000Z” |
long_object | object | 当 Post 文本超过 140 个字符时,表示完整文本正文的对象。 “long_object”: “body”: “To make room for more expression, we will now count all emojis as equal—including those with gender and skin tone modifiers 👍🏻👍🏽👍🏿. This is now reflected in Twitter-Text, our Open Source library. \n\nUsing Twitter-Text? See the forum post for detail: https://t.co/Nx1XZmRCXA”, “display_text_range”: [ 0, 277 ], “twitter_entities”: “hashtags”: [], “urls”: [ “url”: “https://t.co/Nx1XZmRCXA”, “expanded_url”: “https://devcommunity.x.com/t/new-update-to-the-twitter-text-library-emoji-character-count/114607”, “display_url”: “devcommunity.com/t/new-update-t…”, “indices”: [ 254, 277 ] ], “user_mentions”: [], “symbols”: [] |
display_text_range | array | 当 Post 文本超过 140 个字符时的显示文本范围。 “display_text_range”: [ 0, 142 ] |
verb | string | 用户执行的操作类型。 Post:“post” 转发:“share” 已删除的 Post:“delete” verb 是区分 Tweet 和真正转发的正确方式。但是,这仅适用于真正的转发,不适用于修改或引用的 Tweet,它们不使用 X 转发功能。有关 AS 动词的描述点击此处。 对于删除操作,请注意只会包含有限数量的字段,如下面的示例载荷所示。 “verb”: “post” |
postedTime | date (ISO 8601) | 操作发生的时间,例如 Post 发布的时间。 “postedTime”: “2018-10-10T20:19:24.000Z” |
generator | object | 表示用于发布 Post 的工具的对象。这将包含生成 Post 的源应用程序的名称(“displayName”)和链接(“link”)。 “generator”: “displayName”: “X Web Client”, “link”: “http://x.com” |
provider | object | 表示活动提供者的 JSON 对象。这将包含 objectType(“service”)、提供者名称(“displayName”)和提供者网站链接(“link”)。 “provider”: “objectType”: “service”, “displayName”: “X”, “link”: “http://www.x.com” |
link | string | Post 的永久链接。 “link”: “http://x.com/API/statuses/1050118621198921728” |
body | string | Post 文本。 在转发中,请注意 X 会通过在开头添加 “RT @username” 并截断原始文本并在末尾添加省略号来修改根级别的 body 值。因此,对于转发,您的应用程序应该查看 object.body 以确保提取原始 Post(被转发的)的未修改文本。 “body”: “With Cardiff, Crystal Palace, and Hull City joining the EPL from the Championship it will be a great relegation battle at the end.” |
display_text_range | array | 描述 body 文本中指示显示 Post 的字符范围。带有前导 @mentions 的 Post 将从大于 0 开始,带有附加媒体或超过 140 个字符的 Post 将在 long_object 中指示 display_text_range。 “display_text_range”: [ 14, 42 ] 或 “long_object”: “display_text_range”: [ 0, 277 ]… |
actor | object | 表示发布 Post 的 X 用户的对象。Actor 对象指向 X 用户,并包含与该用户相关的所有 metadata。 查看 actor 对象详情 |
inReplyTo | object | 引用正在回复的 Post 的 JSON 对象(如果适用)。包含指向该 Post 的链接。 “inReplyTo”: “link”: “http://x.com/GOP/statuses/349573991561838593” |
location | object | 表示创建 Post 的 X “Place” 的 JSON 对象。这是从 X 平台传递的对象。 查看 location 对象 |
twitter_entities | object | 来自 X 数据格式的实体对象,包含 URL、提及和话题标签的列表。请参考此处的 X 实体文档。请注意,在转发中,X 可能会截断在根级别提取的实体值。因此,对于转发,您的应用程序应查看 object.twitter_entities 以确保使用非截断值。 查看 twitter_entities 对象详细信息 |
twitter_extended_entities | object | 来自 X 原生数据格式的对象,包含”media”。对于 twitter_entities 对象在”media”字段中存在数据的任何 Post,都会出现此对象,并且会包含 Post 中存在的多张照片。请注意,这是检索多照片 Post 媒体信息的正确位置。 多张照片在”media”数组中以逗号分隔的 JSON 对象表示。 查看 twitter_extended_entities 对象详细信息 |
gnip | object | 添加到活动负载中的对象,用于指示匹配规则,并根据流或产品上活跃的增强功能添加丰富数据。 查看 gnip 对象详细信息 |
edit_history | Object | 指示 Post 所有版本的唯一标识符。对于没有编辑的 Post,将有一个 ID。对于有编辑历史的 Post,将有多个 ID,按升序排列,反映编辑顺序,最新版本位于数组的最后位置。 Post ID 可用于获取和查看 Post 的先前版本。 示例: edit_history”: “initial_tweet_id”: “1283764123” “edit_tweet_ids”: [“1283764123”, “1394263866”] |
edit_controls | Object | 当存在时,指示 Post 仍可编辑的时长和剩余编辑次数。Post 仅在创建后的前 30 分钟内可编辑,最多可编辑五次。 Post ID 可用于获取和查看 Post 的先前版本。 示例: “edit_controls”: “editable_until_ms”: 123 “edits_remaining”: 3 |
editable | Boolean | 当存在时,指示 Post 在发布时是否符合编辑条件。此字段不是动态的,当 Post 达到其可编辑时间限制或最大编辑次数时,不会从 True 切换到 False。以下 Post 功能将导致此字段为 false: _ Post 被推广 _ Post 有投票 _ Post 是非自我线程回复 _ Post 是转发(请注意引用 Tweet 符合编辑条件) _ Post 是 nullcast _ 社区 Post _ Superfollow Post _ 协作 Post |
其他 Post 属性
属性 | 类型 | 描述 |
---|---|---|
twitter_lang | string | |
favoritesCount | int | 可为空。 表示该 Post 被 X 用户 like 的大致次数。 “favoritesCount”:298 |
retweetCount | int | 该 Post 被转发的次数。示例: “retweetCount”:153 |
已弃用的属性
字段 | type | 描述 |
geo | object | 创建该 Post 时的点位置信息。 |
twitter_filter_level | string | 为避免引入破坏性变更而保留的已弃用字段 |
嵌套的 Post 活动对象
type
为 “activity”,verb
为 “note”,用于表示被转发的原始 Post。
{ "id": "tag:search.x.com,2005:222222222222", "objectType": "activity", "verb": "post", "body": "Quoting a Tweet: https://t.co/mxiFJ59FlB", "actor": { "displayName": "TheQuoter2" }, "object": { "objectType": "note", "id": "object:search.x.com,2005:111111111", "summary": "https://t.co/mxiFJ59FlB" }, "twitter_entities": {}, "twitter_extended_entities": {}, "gnip": {}, "twitter_quoted_status": { "id": "tag:search.x.com,2005:111111111", "objectType": "activity", "verb": "post", "body": "console.log('Happy birthday, JavaScript!');", "actor": { "displayName": "TheOriginalTweeter" }, "object": { "objectType": "note", "id": "object:search.x.com,2005:111111111" }, "twitter_entities": {} } }
被转发的引用 Tweet:
Long 对象
Actor 对象
数据字典
属性 | 类型 | 说明 |
---|---|---|
objectType | string | ”objectType”: “person” |
id | string | 此作者唯一标识符的字符串表示。示例: “id:x.com:2244994945” |
link | ”http://www.x.com/XDeveloeprs” | |
displayName | String | 用户自定义的名称。不一定是个人真实姓名。通常上限为 50 个字符,但可能调整。示例: “displayName”: “XDevelopers” |
preferredUsername | string | 此用户用于标识自己的屏幕名、handle 或别名。具有唯一性但可能变更。尽可能使用 id 作为用户标识符。通常最长 15 个字符,但部分历史账号可能更长。示例:“preferredUsername”: “XDevelopers” |
location | object | ** “location”: “objectType”:** “place”, “displayName”: “127.0.0.1” ** }** |
links | array | 可为空。用户在其个人资料中提供的 URL。示例: ** “links”: [ { “href”:** “https://developer.x.com/en/community”, “rel”: “me” ** } ]** |
summary | string | 可为空。用户定义的用于描述其账号的 UTF-8 字符串。示例: “summary”: “The voice of the #XDevelopers team…“ |
protected | Boolean | 为 true 时,表示该用户选择保护其 Posts。参见 About Public and Protected Posts。示例: “protected”: true |
verified | Boolean | 为 true 时,表示该用户的账号已通过验证。参见 Verified Accounts。示例: “verified”: false |
followersCount | Int | 该账号当前的关注者数量。在某些压力情况下,此字段会暂时显示“0”。示例: “followers_count”: 21 |
friendsCount | Int | 该账号正在关注的用户数量(亦称“followings”)。在某些压力情况下,此字段会暂时显示“0”。示例: “friends_count”: 32 |
listedCount | Int | 该用户所属的公共 List 数量。示例: “listed_count”: 9274 |
favoritesCount | Int | 该用户在账号生命周期内 like 的 Posts 数量。字段名采用英式拼写,出于历史原因。示例: “favourites_count”: 13 |
statusesCount | Int | 该用户发布的 Posts 数量(包含转发)。示例: “statuses_count”: 42 |
postedTime | date | 该用户账号在 X 上创建时的 UTC 日期时间。示例: “postedTime”: “2013-12-14T04:35:55.036Z” |
image | string | 指向用户个人资料图片的 HTTPS URL。示例: “image”: “https://pbs.twimg.com/profile_images/1283786620521652229/lEODkLTh_normal.jpg” |
不再支持(已弃用)的属性
字段 | 类型 | 说明 |
---|---|---|
utcOffset | null | 值将设置为 null。仍可通过 GET account/settings 获取 |
twitterTimeZone | null | 值将设置为 null。仍可通过 GET account/settings 以 tzinfo_name 获取 |
languages | null | 值将设置为 null。仍可通过 GET account/settings 以 language 获取 |
示例:
位置对象
位置数据字典
字段 | 类型 | 描述 |
---|---|---|
objectType | string | 有关更详细的信息请参见此处。示例: “objectType”: “place” |
displayName | string | 位置的完整名称。 “displayName”: “United States” |
name | string | 来自 X 的 place JSON 格式中的位置名称。 |
link | string | 指向该地点在 X 中完整 JSON 表示的链接。 “link”: “https://api.x.com/1.1/geo/id/27c45d804c777999.json” |
geo | object | 来自 X 的地理坐标对象,可以是多边形或点。 参见 geo |
countryCode | String | 表示包含该地点的国家/地区的简写国家代码。示例: “countryCode”: “US” |
country | String | 包含该地点的国家/地区名称。示例: “country”: “United States” |
profileLocations 衍生对象
字段 | 类型 | 说明 |
address | object | 位于 gnip object 中 profileLocation 的 location 对象内。由 profile geo enrichment 推导的地点地址。粒度级别可能不同。 “address”: { ** “country”: “United States”, “countryCode”: “US”, “locality”: “Providence”, “region”: “Rhode Island”, “subRegion”: “Providence County” }** |
geo | object | 位于 gnip object 中 profileLocation 的 location 对象内。由 profile geo enrichment 推导的地点质心坐标。 “geo”: { ** “coordinates”: [ -98.5, 39.76 ], “type”: “point” }** |
X 实体对象
示例:
X 扩展实体对象
示例:
Gnip 对象
数据字典
字段 | 类型 | 描述 |
matching_rules | array | 包含一个匹配规则对象的数组,指示该活动所匹配到的规则。 “matching_rules”: [ ** { “tag”: null, “id”:** 1026514022567358500**, “id_str”:** “1026514022567358464” ** } ]** |
urls | array | 包含活动中的链接数组,以及用于“URL 展开增强”的展开 URL 元数据 ** “urls”: [ { “url”:** “https://t.co/tGQqNxxyhU”, “expanded_url”: “https://www.youtube.com/channel/UCwUxW2CV2p5mzjMBqvqLzJA”, “expanded_status”: 200**, “expanded_url_title”:** “Birdys Daughter”, “expanded_url_description”: “Premium, single-origin, handpicked Jamaica Blue Mountain Coffee” ** } ]** |
profileLocations | array of location objects | 包含来自 Profile Geo 增强的派生位置对象 ** “profileLocations”: [ { “address”: { “country”:** “Canada”, “countryCode”: “CA”, “locality”: “Toronto”, “region”: “Ontario” ** }, “displayName”:** “Toronto, Ontario, Canada”, ** “geo”: { “coordinates”: [ -79.4163, 43.70011 ], “type”:** “point” ** }, “objectType”:** “place” ** } ] }** |
示例:
活动 stream 负载示例
twitter_extended_entities
的 Post 活动
Tweet 元数据时间线
引言**
从本质上说,X 是一个公开、实时、全球范围的通信网络。自 2006 年以来,X 的演进既受用户使用模式与惯例的影响,也受新产品功能与增强的推动。如果你使用 X 的数据开展历史研究,了解这一路演进的时间轴,对于从数据存档中筛选出感兴趣的 Post 至关重要。 X 最初作为一款简单的 SMS 移动 App 上线,随后发展为一个完善的通信平台——一个具备完整 API 体系的平台。API 始终是 X 网络的支柱。第一版 API 在 X 上线不久后就发布。2009 年首次引入 Post 的地理标记时,这一能力通过 Geo API 提供(随后,“地理标记”Post 的功能被集成到 X.com 的用户界面中)。如今,X 的 API 驱动着这个双向通信网络,使其成为突发新闻与信息共享的来源。基于这一全球、实时通信通道进行构建的机遇无穷无尽。 X 提供两种历史 API,可访问每一条公开可用的 Post:Historical PowerTrack 和 Full-Archive Search API。这两种 API 都提供一组用于查询与收集目标 Post 的“运算符”。这些运算符可匹配与每条 Post 相关的多种属性——多达数百种,例如 Post 的文本内容、作者的账号名称,以及 Post 中分享的链接。Post 及其属性以 JSON 编码,这是一种常见的基于文本的数据交换格式。因此,随着新功能的引入,会出现新的 JSON 属性,通常也会引入新的 API 运算符以匹配这些属性。如果你的用例需要“倾听”世界在 X 上说过的话,那么越了解各运算符从何时开始具备可供匹配的 JSON metadata,你的 Historical PowerTrack 过滤器就越有效。 接下来,我们将介绍一些关键概念,为理解 Post metadata 的更新如何影响你定位感兴趣的数据信号作铺垫。关键概念**
从用户约定到 X 的一等对象(first-class objects)
Post 的 metadata、可变性、更新与时效性
“原生”媒体
has:videos
、has:images
和 has:media
。它们只会匹配通过 X 内置功能分享的媒体内容。若要匹配托管在 X 平台之外的其他媒体,你需要使用基于 URL metadata 进行匹配的 Operator。
因此,在深入了解 Historical PowerTrack 和 Full-Archive Search 的产品细节之前,我们先来回顾一下 X 作为产品与平台是如何随时间演进的。
X 时间线
下面你将看到一份精选的 X 时间线。多数 X 更新在某种程度上从根本上影响了用户行为、Post 的 JSON 内容、query(查询) Operator,或以上三者兼而有之。将 X 视作一个 API 平台时,下列事件在某种程度上影响了用于编码 Post 的 JSON 负载。反过来,这些 JSON 细节又会影响 X 历史 API 如何对它们进行匹配。
请注意,此时间线列表大体准确但并不详尽。
2006
- 十月
- @replies 成为一种惯例。
- cashtags 于 2012 年 6 月起可点击/可搜索。
- 十一月 - 推出 Favorites。
2007
- 1月 - @replies 成为一级对象,并在界面中提供带有
in_reply_to
metadata 的“回复”按钮。 - 4月 - 转发 成为一种惯例。
- 8月 - #hashtags 成为搜索和组织 Post 的主要工具。
2009
- 2月 - $cashtags 成为讨论股票代码的通用约定。
- 5月 - 推出 Retweet“beta”,在 Post 正文前加上“Via @”。
- 6月 - 推出已验证账号。
- 8月 - Retweet 成为一等对象,采用“RT @”模式,并新增
retweet_status
metadata。 - 10月 - 上线 List 功能。
- 11月 - Post Geotagging API 上线,首次为用户通过第三方应用分享位置提供方法。
2010
- 6月 - 推出 X Places,用于为 Post 添加地理标签。
- 8月 - 网站版 Post 按钮上线,分享链接更便捷。
2011
- 5月 - 推出“关注”按钮,让用户更容易关注与网站关联的账号。
- 8月 - 推出原生图片功能。
2012
- 6 月 - $Cashtags 成为可点击/可搜索的链接。
2014
- 3 月 - 支持照片标注与最多四张照片。引入了扩展版 X Entities metadata。
- 4 月 - X UI 原生支持表情符号。自至少 2008 年起,表情符号已在 Posts 中被广泛使用。
2015
- 4月 - X 的“Post”用户界面设计变更导致带地理标签的 Post 减少。
- 10月 - 推出 X Polls。最初 Polls 支持两个选项,投票期限为 24 小时。到 11 月,Polls 开始支持四个选项,投票期限从 5 分钟到 7 天。投票 metadata 自 2017 年 2 月起提供(仅限增强的原生格式)。
2016
- 2月 - 在 Post 撰写器中原生托管的可搜索 GIF。
- 5月 - 宣布“Doing More with 140”(dmw140),提出了在 Post 的 140 字符限制下处理回复与附加媒体的新方式。
- 6月 - 原生视频支持。
- 6月 - 引用转发全面开放。
- 6月 - 推出可添加到照片中的贴纸。
- 9月 - 引入“原生附件(Native attachments)”,尾随的 URL 不再计入 140 字符(“dmw140,第 1 部分”)。
2017
- 二月 - X 投票 metadata 已包含在 Post metadata 中(仅限增强的原生格式)。
- 四月 - 推出“简化回复”,被回复的账号不计入 140 个字符(“dmw140,第 2 部分”)。
- 五月 - GDPR 更新:user.time_zone 设为 null,user.utc_offset 设为 null,user.profile_background_image_url 设为默认值
- 六月 - 更新quoteTweet 格式变更
- 9 月 29 日 - Post 编辑功能向小规模测试群开放。与编辑相关的 Post metadata 会添加到 Post 对象中,包括 edit_history 和 edit_controls 对象。对于在可编辑功能推出之前创建的 Posts,将不会返回这些 metadata。没有与这些 metadata 关联的 Operators。要了解 Post 编辑的工作方式,请参阅编辑 Post 基础
lang:
Operator 用于匹配指定语言的 Posts。X 提供语言分类服务(支持 50 多种语言),并且 X API 会在每个 Post 生成的 JSON 中提供此 metadata。因此,如果某个 Post 使用西班牙语编写,“lang” JSON 属性将被设置为 “es”。因此,如果你使用 lang:es
子句构建过滤器,它将只匹配被分类为西班牙语的 Post。
时间线信息还可以帮助更好地解读接收到的 Post data。假设你在研究 2008 年和 2012 年夏季奥运会相关内容的传播情况。如果你仅应用 is:retweet
Operator 来匹配转发,2008 年将不会匹配到任何 data。然而,到 2012 年,很可能会有数百万次转发。由此你可能会错误地得出结论:2008 年转发并不是用户惯例,或者根本没人转发关于那届奥运会的内容。由于转发在 2009 年成为一级对象,你需要添加一个 “RT @”
规则子句来帮助在 2008 年识别它们。
转发和 Post 语言分类都是具有悠久历史且包含许多产品细节的 Post 属性示例。下面我们将讨论这些以及其他对匹配和理解 X Data 很重要的属性类别的更多细节。
识别假阴性
has:videos
运算符构建规则(该运算符匹配带有“原生”视频的 Posts),那么这一子句将无法匹配 2015 年之前的任何 Posts。
然而,早在 2015 年之前,在 X 上分享视频就已十分常见。在那之前,用户通常分享指向其他站点所托管视频的链接;而在 2015 年,X 将新的“分享视频”功能直接内置到平台。要查找这些更早的相关 Posts,你可以加入类似 url:"youtube.com"
的规则子句。
注意,对于 Search APIs,随着其索引的重建,存在一些将 metadata “回填”的情况。一个典型例子是 cashtag 运算符之后,Search 索引被重建,在此过程中会从所有 Post 正文中抽取该符号实体,甚至追溯到 2006 年早期——当时“nowoon!”。
识别并按与你用例相关的 Post 属性进行筛选
X 个人资料
原始 Post 和转发
is:retweet
运算符使用户可以包含或排除转发。如果获取的是 2009 年 8 月之前的 data,用户需要采用两种不同的转发匹配(或不匹配)策略。对于 2009 年 8 月之前的时段,需要检查 Post 文本本身,并使用精确短语匹配来匹配“RT @”模式。对于 2009 年 8 月之后的时段,可使用 is:retweet
运算符。
Post 语言分类
lang:
运算符适用于整个 Post 存档。对于 Historical PowerTrack,X 的语言分类 metadata 在存档中自 2013 年 3 月 26 日起可用。
Post 的地理参照
- Post 文本中的地理引用
- 用户为 Post 添加的地理标签
- 用户在账号资料中设置的“Home”位置