请注意: 我们已在 X API v2 中发布新版的搜索 Post和Post 计数。建议你查看 X API v2 的更新内容。 这些端点已更新,现包含 Post 编辑相关的元数据。了解更多,请参阅 “编辑 Posts” 基础知识页面。
概览
Enterprise
企业版 API 仅在我们的受管访问级别内提供。要使用这些 API,您必须先与我们的企业销售团队开通账户。了解更多请参见此处。
您可以在此处查看所有 X API 的 Post 搜索产品。
有两种企业搜索 API:
- 30 天搜索 API 提供过去 30 天的数据。
- 全量存档搜索 API 提供对 X 全量数据语料库的完整且即时访问,可追溯至 2006 年 3 月的第一条 Post。
请求类型
搜索请求(data)
计数请求(Post 计数)
可用运算符
| 基于 Post 内容的匹配: | 基于目标账号的匹配: | Post 属性: | 地理空间运算符: |
| * 关键字 * “引用的短语” * “keyword1 keyword2”~N * # * @ * $ * url: * lang: | * from: * to: * retweets_of: | * is:retweet * has:mentions * has:hashtags * has:media * has:videos * has:images * has:links * has:symbols * is:verified * -is:nullcast(仅用于取反的运算符) | * bounding_box:[west_long south_lat east_long north_lat] * point_radius:[lon lat radius] * has:geo * place: * place_country: * has:profile_geo * profile_country: * profile_region: * profile_locality: |
数据可用性 / 重要日期
- 首条 Post:3/21/2006
- 首次原生转发(Native Retweets):11/6/2009
- 首条地理标注的 Post:11/19/2009
- 首次为 URL 建立可用于过滤的索引:8/27/2011
- 增强的 URL 展开元数据(网页标题与描述):12/1/2014
- 个人资料地理信息富化元数据及过滤:2/17/2015
数据更新与可变性
- 用户对象元数据:
- 用户的 @handle(数字 id 永不改变)
- 个人简介
- 计数:statuses、followers、friends、favorites、lists
- 资料所在地
- 其他信息,例如时区和语言
- Post 统计数据——即可由用户在平台上的操作改变的任何内容(如下所示):
- Favorites 计数
- Retweet 计数
单线程与多线程请求
maxResults 为 500)才能获取所有 data。假设每个响应耗时 2 秒,那么通过单线程按顺序/串行拉取全部 data 需要 4,000 秒(或略多于一小时)(使用上一个响应的“next” 令牌以每秒 1 个请求的速度)。不错!
现在考虑使用 12 个并行线程来获取 data 的情况。假设这一百万条 Post 在一年内均匀分布,你可以将请求拆分为 12 个并行线程(多线程),从而在单个“作业”中更充分地利用每秒速率限制。换句话说,你可以为每个感兴趣的月份各运行一个线程,这样数据检索速度可提升 12 倍(约 6 分钟)。
这个多线程示例同样适用于 counts 端点。比如,如果你想获取两年期间的 Post 计数,你可以发起单线程请求,并以每次回溯 31 天的方式分页获取计数。假设每个响应耗时 2 秒,那么发出 24 次 API 请求并检索完整的计数集大约需要 48 秒。不过,你也可以选择同时发出多个按月的请求。当以每秒 12 个请求的速率发起请求时,完整的计数集大约可在 2 秒内检索完成。
重试逻辑
- 缩小请求的时间范围后重试;如仍失败,逐步将时间窗口缩小至 6 小时并重试。
- 如果你通过 OR 将大量检索词连接在一起,请将它们拆分为多条独立规则,并分别重试。
- 如果规则中包含大量排除条件,请减少规则中的否定项后重试。
快速入门
开始使用企业版 Search Posts:30-Day API
- [企业版账户]https://developer.x.com/en/products/x-api/enterprise
- 你的用户名、密码和账户名称
- 与你的搜索端点关联的标签(label),如在 console.gnip.com 所示
访问 data 端点
from: 和 lang: 运算符来查找来自 @XDevelopers 且为英语的 Post。更多运算符点击此处。
- cURL
- cURL example
cURL 是一种使用 URL 语法获取或发送文件的命令行工具。在按需修改以下内容后,将下面的 cURL 请求复制到你的命令行中:
-
Username
<USERNAME>,例如email@domain.com -
Account name
<ACCOUNT-NAME>,例如john-doe -
Label
<LABEL>,例如prod -
fromDate 与 toDate,例如
"fromDate":"201811010000", "toDate":"201811122359"
Data 端点响应载荷
访问 counts 端点
day 分组,检索由 @XDevelopers 账号发布的英文 Post 数量。
- cURL
- cURL example
cURL 是一款使用 URL 语法获取或发送文件的命令行工具。按以下说明进行替换后,将下面的 cURL 请求复制到命令行中:
-
Username
<USERNAME>,例如email@domain.com -
Account name
<ACCOUNT-NAME>,例如john-doe -
Label
<LABEL>,例如prod -
fromDate 和 toDate,例如
"fromDate":"201811010000", "toDate":"201811122359"
Counts 端点响应载荷
参考文章
开始使用企业版 Search Posts:Full-Archive API
- 企业版账户
- 你的用户名、密码和账户名称
- 与你的搜索端点关联的标签(可在 console.gnip.com 查看)
访问 data 端点
from: 和 lang: 运算符来查找来自 @XDevelopers 且为英文的 Post。有关更多运算符 请点击此处。
- cURL
- cURL example
cURL 是一款使用 URL 语法获取或发送文件的命令行工具。根据以下项目完成替换后,将下面的 cURL 请求复制到你的命令行中:
-
Username
<USERNAME>,例如email@domain.com -
Account name
<ACCOUNT-NAME>,例如john-doe -
Label
<LABEL>,例如prod -
fromDate 和 toDate 例如
"fromDate":"201802010000", "toDate":"201802282359"
数据端点响应载荷
你从 API 请求中获得的载荷将以 JSON 格式返回,如下所示。访问 counts 端点
day 分组,检索 @XDevelopers 账号发布的英文 Post 数量。
- cURL
- cURL example
cURL 是一款使用 URL 语法获取或发送文件的命令行工具。请在完成以下替换后,将下面的 cURL 请求复制到命令行中:
-
Username
<USERNAME>,例如email@domain.com -
Account name
<ACCOUNT-NAME>,例如john-doe -
Label
<LABEL>,例如prod -
fromDate 和 toDate,例如
"fromDate":"201802010000", "toDate":"201802282359"
计数端点的响应载荷
你通过 API 请求获得的载荷将以 JSON 格式返回,如下所示。参考文章
指南
构建搜索查询
企业版运算符
- 企业版 30 天搜索 API
- 企业版 全量存档搜索 API
| 操作符 | 描述 | |
|---|---|---|
| 关键字 | 匹配 Post 正文或 URL 中的分词关键字。这是一种分词匹配,即您的关键字字符串将与 Post 正文的已分词文本进行匹配——分词基于标点符号、符号和分隔符 Unicode 基本平面字符。例如,文本为“I like coca-cola”的 Post 将被拆分为以下分词:I, like, coca, cola。这些分词随后将与您规则中使用的关键字字符串进行比较。要匹配包含标点符号(例如,coca-cola)、符号或分隔符字符的字符串,您必须使用下面描述的带引号精确匹配。 **注意:**使用 Search API 时,带重音的字符和特殊字符会被标准化为标准的拉丁字符,这可能会在外国语言中改变含义或返回意外结果: 例如,“音乐”将匹配“music”,反之亦然 例如,常见的短语如”新年快乐!“在西班牙语中,会被索引为”新年快乐”, 这会改变短语的含义。 **注意:**此运算符将匹配帖子中的 URL 和展开 URL。 | |
| emoji | 匹配 Post 正文中的表情符号。表情符号匹配是基于分词的,这意味着您的表情符号将与 Post 正文的分词文本进行匹配——分词基于标点符号、符号/表情符号以及分隔符等 Unicode 基本平面字符。例如,一个文本为“我喜欢”的 Post” 将被拆分为以下标记:I, like,. 这些令牌随后将与您规则中使用的表情符号进行比较。请注意,如果表情符号有变体,您必须使用“引号”将其添加到规则中。 | |
| “精确短语匹配”精确短语匹配” | 匹配帖子正文或 URL 中的分词且有序短语。这是一种分词匹配,即您的关键字字符串将与帖子正文的 分词文本 进行匹配——分词基于标点符号、符号和分隔符的 Unicode 基本平面字符。 **注意:**标点符号不会被分词,而是被视为空白字符。 例如,带引号的“#hashtag”将匹配“hashtag”,但不匹配#hashtag(使用不带引号的#hashtag操作符来匹配实际的hashtag)。 例如,带引号的“cashtag(要匹配实际的 cashtag,请使用不带引号的 cashtag $ 操作符)。 例如,“爱雪”将匹配”#love #snow”exact phrase match” | 在推文的正文或 URL 中匹配分词后的有序短语。这是一种基于分词的匹配方式,即您的关键字字符串将与推文正文的令牌化文本进行匹配——分词基于标点符号、符号以及分隔 Unicode 基本平面的字符。 注意: 标点符号不会被分词,而是被视为空白字符。 例如,带引号的“#hashtag”将匹配“hashtag”,但不会匹配 #hashtag(使用不带引号的 hashtag # 操作符来匹配实际的 hashtag)。 例如,带引号的“cashtag(使用不带引号的 cashtag $ 操作符来匹配实际的 cashtag)。 例如,“Love Snow”将匹配“#love #snow” 例如,“#Love #Snow”将匹配“love snow” 注意: 此操作符将在推文中的 URL 和展开 URL 上进行匹配。 例如,“#爱 #雪”将匹配”爱雪” **注意:**此运算符将同时匹配帖子中的 URL 和展开的 URL。 |
| “keyword1 keyword2”~N | 通常称为邻近运算符,它会匹配关键词之间相距不超过 N 个标记的 Post。 如果关键字的顺序相反,则它们之间不能相距超过 N-2 个令牌。可以将任意数量的关键字置于引号中。N 不能大于 6。 请注意,此运算符仅在 企业版搜索 API。 | |
| 从: | 匹配特定用户发布的任何 Post。 该值必须是用户的 X 数字账户 ID 或用户名(不包括 @ 字符)。参见此处或此处有关查找数字 X 账户 ID 的方法。 | |
| 至: | 匹配任何回复特定用户的帖子。 该值必须是用户的数字账户 ID 或用户名(不包括 @ 字符)。请参阅此处用于查找数字 X 账号 ID 的方法。 | |
| url: | 在帖子的扩展 URL 上执行分词(关键字/短语)匹配(类似于 url_包含)。包含标点符号或特殊字符的标记和短语应使用双引号括起。例如,url:“/developer”。 虽然通常不推荐,但如果您想匹配特定协议,请用双引号将其括起来:url:“https://developer.x.com”。 **注意:**在使用 PowerTrack 或 Historical PowerTrack 时,此操作符将匹配引用帖子所引用的原始帖子中包含的 URL。例如,如果您的规则包含 url:“developer.x.com”, 并且如果某个 Post 包含该 URL,则该 Post 的任何 Quote Tweets 都会包含在结果中。使用 Search API 时则不然。 | |
| # | 匹配任何带有指定标签的 Post。 此操作符执行精确匹配,而非分词匹配。这意味着规则“2016”将匹配带有精确标签“2016”的帖子,但不会匹配带有标签“2016election”的帖子。 注意:hashtag 操作符依赖于 X’使用 X 的实体提取来匹配 hashtag,而不是从推文主体本身提取 hashtag。参见此处有关 X Entities JSON 属性的更多信息。 | |
| @ | 匹配任何提及指定用户名的帖子。 to: 操作符返回 @mention 操作符匹配结果的子集。 | |
| $ | 匹配任何包含指定“cashtag”(其标记以“$”开头)的 Post。 请注意,cashtag 操作符依赖于 X’使用 ‘symbols’ 实体提取来匹配 cashtags,而不是尝试从正文本身提取 cashtag。 参见此处有关 X 实体 JSON 属性的更多信息。 请注意,此运算符仅在 企业版搜索 API。 | |
| 转推_of: | 可用别名: 转推_的_用户: 匹配对指定用户进行转发的 Post。接受用户名和数值型 X 账户 ID(非 Post 状态 ID)。参见这里用于查找数值型 X 账号 id 的方法。 | |
| lang: | 匹配由 X 归类为特定语言的 Post(且仅在该 Post 已被归类的情况下)。请注意,每个 Post 目前只会被归为一种语言,因此将多个语言条件使用 AND 组合不会得到任何结果。 **注意:**如果無法進行語言分類,則結果為 ‘und’(表示未定義)。 下方列表列出了当前支持的语言及其对应的 BCP 47 语言标识符: |
| 阿姆哈拉语: am | 德语: de | 马拉雅拉姆语: ml | 斯洛伐克语: sk |
| 阿拉伯语: ar | 希腊语: el | 迪维希语: dv | 斯洛文尼亚语: sl |
| 亚美尼亚语: hy | 古吉拉特语: gu | 马拉地语: mr | 索拉尼库尔德语: ckb |
| 巴斯克语: eu | 海地克里奥尔语: ht | 尼泊尔语: ne | 西班牙语: es |
| 孟加拉语: bn | 希伯来语: iw | 挪威语: no | 瑞典语: sv |
| 波斯尼亚语: bs | 印地语: hi | 奥迪亚语: or | 他加禄语: tl |
| 保加利亚语: bg | 拉丁化印地语: hi-Latn | 旁遮普语: pa | 泰米尔语: ta |
| 缅甸语: my | 匈牙利语: hu | 普什图语: ps | 泰卢固语: te |
| 克罗地亚语: hr | 冰岛语: is | 波斯语: fa | 泰语: th |
| 加泰罗尼亚语: ca | 印尼语: in | 波兰语: pl | 藏语: bo |
| 捷克语: cs | 意大利语: it | 葡萄牙语: pt | 繁体中文: zh-TW |
| 丹麦语: da | 日语: ja | 罗马尼亚语: ro | 土耳其语: tr |
| 荷兰语: nl | 卡纳达语: kn | 俄语: ru | 乌克兰语: uk |
| 英语: en | 高棉语: km | 塞尔维亚语: sr | 维吾尔语: ug |
| 爱沙尼亚语: et | 韩语: ko | 简体中文: zh-CN | 越南语: vi |
| 芬兰语: fi | 老挝语: lo | 信德语: sd | 威尔士语: cy |
| 法语: fr | 拉脱维亚语: lv | 僧伽罗语: si | |
| 格鲁吉亚语: ka | 立陶宛语: lt |
| place: | 匹配带有指定位置或 X place ID 标签的 Post(见示例)。多词地点名称(“New York City”“Palo Alto”)应加引号。 **注意:**请参阅公开 API 端点 GET geo/search 了解如何获取 X place ID。 **注意:**此运算符不会匹配转发(Retweets),因为转发的地点附加在原始 Post 上。引用转发(Quote Tweet)也不会匹配其所引用的原始 Post 上附加的地点。 |
| place_country: | 匹配与被标记的place关联的国家/地区代码与给定 ISO Alpha-2 字符代码一致的 Post。 可在此处查询有效的 ISO 代码:http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 **注意:**此运算符不会匹配转发(Retweets),因为转发的地点附加在原始 Post 上。引用转发(Quote Tweet)也不会匹配其所引用的原始 Post 上附加的地点。 |
| point_radius:[lon lat radius] | 当存在时,匹配 Post 的精确位置(x, y);在 X 中,还会匹配“Place”地理多边形,前提是该 Place 完全包含在定义的区域内。 * 支持的半径单位为英里(mi)和公里(km)。 * 半径必须小于 25 mi。 * 经度范围为 ±180。 * 纬度范围为 ±90。 * 所有坐标均为十进制度。 * 规则参数置于方括号内,使用空格分隔。 **注意:**此运算符不会匹配转发(Retweets),因为转发的地点附加在原始 Post 上。引用转发(Quote Tweet)也不会匹配其所引用的原始 Post 上附加的地点。 |
| bounding_box:[west_long south_lat east_long north_lat] | 可用别名:geo_bounding_box: 当存在时,匹配 Post 的精确位置(long, lat);在 X 中,还会匹配“Place”地理多边形,前提是该 Place 完全包含在定义的区域内。 * west_long 和 south_lat 表示边界框的西南角,其中 west_long 为该点的经度,south_lat 为该点的纬度。 * east_long 和 north_lat 表示边界框的东北角,其中 east_long 为该点的经度,north_lat 为该点的纬度。 * 边界框的宽度和高度必须小于 25 mi。 * 经度范围为 ±180。 * 纬度范围为 ±90。 * 所有坐标均为十进制度。 * 规则参数置于方括号内,使用空格分隔。 **注意:**此运算符不会匹配转发(Retweets),因为转发的地点附加在原始 Post 上。引用转发(Quote Tweet)也不会匹配其所引用的原始 Post 上附加的地点。 |
| profile_country: | 对 Profile Geo 增强数据中 “address” 对象的 “countryCode” 字段进行精确匹配。 使用基于 ISO-3166-1-alpha-2 规范的标准化两字母国家/地区代码。为简洁起见,本运算符用于替代对 “address” 对象中 “country” 字段的运算符。 |
| profile_region: | 匹配 Profile Geo 增强数据中 “address” 对象的 “region” 字段。 这是精确的完整字符串匹配。无需使用反斜杠进行转义。例如,若要匹配包含斜杠的内容,使用 “one/two”,而非 “one/two”。对包含空格或标点的子字符串使用双引号。 |
| profile_locality: | 匹配 Profile Geo 增强数据中 “address” 对象的 “locality” 字段。 这是精确的完整字符串匹配。无需使用反斜杠进行转义。例如,若要匹配包含斜杠的内容,使用 “one/two”,而非 “one/two”。对包含空格或标点的子字符串使用双引号。 |
注意: 在使用 Search API 时,is: 和 has: 运算符不能单独使用,必须与其他子句结合使用。例如,@XDeevelopers has:links
| has:geo | 匹配包含 X 提供的帖子特定地理位置数据的帖子。这可以是“geo”纬度-经度坐标,或一个“location”,以 X 的形式“地点”,带有对应的显示名称、地理多边形以及其他字段。 **注意:**在使用 Search API 时,此运算符必须与其他运算符结合使用,这些运算符不’不包括 is:或has:. | |
| has:profile_地理 | 可用别名:has:derived_用户_地理 匹配具有任何的帖子个人资料地理位置元数据,无论实际值如何。 **注意:**在使用 Search API 时,必须将此运算符与未包含 is: 或 has: 的其他运算符一同使用’不包括is:或has:has:profile_geo | 可用别名:has:derived_user_geo 匹配包含任何 Profile Geo 元数据的推文,无论实际值如何。 **注意:**在使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 |
| has:links | 此运算符匹配消息正文中包含链接的帖子。 **注意:**在使用 Search API 时,此操作符必须与其他 don 的操作符结合使用此操作符匹配帖子正文中包含链接的帖子。 注意: 使用搜索 API 时,此操作符必须与其他不包含 is: 或 has: 的操作符结合使用。不包含is:或has:此运算符匹配正文包含链接的帖子。注意: 使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 | |
| is:retweet | 仅交付匹配规则的明确转推。也可以使用否定形式,从交付中排除匹配规则的转推,从而仅交付原创内容。 此运算符仅查找真正的转推,这些转推使用 X’的转推功能。不使用 X 的转推功能的引用型 Tweet 和经修改的帖子将不会被此运算符匹配’此运算符不会匹配 s retweet 功能。 **注意:**在使用 Search API 时,此操作符必须与其他不包含 is: 或 has: 的操作符结合使用’不包含is:或has:is:retweet | 仅返回匹配规则的明确转推。可以否定以排除匹配规则的转推,并仅返回原始内容。 此操作符仅匹配使用 X 转推功能的真实转推。引用推文以及未使用 X 转推功能的修改帖子不会被此操作符匹配。 注意: 使用搜索 API 时,此操作符必须与其他不包含 is: 或 has: 的操作符结合使用。 |
| is:reply | 一个用于根据帖子是否为对帖子的回复或非回复来过滤帖子的操作符。仅传递匹配规则的明确回复。也可以取反,以从传递中排除匹配规则的回复。 请注意,此运算符仅适用于付费高级版和企业版搜索,在 Sandbox 开发环境中不可用。 **注意:**在使用 Search API 时,此运算符必须与其他运算符结合使用,这些运算符不’不包含 is:或has:is:reply | 一个用于根据帖子是否为对其他帖子的回复来过滤帖子的操作符。只返回匹配条件的明确回复帖子。也可以使用否定形式排除匹配条件的回复,从而仅返回非回复内容。 请注意,此操作符适用于付费的高级搜索和企业搜索,不适用于 Sandbox 开发环境。 注意: 使用 Search API 时,此操作符必须与其他不包含 is: 或 has: 的操作符结合使用。 |
| is:quote | 仅返回引用推文,或引用另一个推文的推文,由”是_引述_状态”:true 在 Post 的负载中。也可以否定以排除引用推文。 **注意:**使用搜索 API 时,必须将此运算符与其他不…的运算符配合使用’不包括 is:或has:is:quote | 返回引用推文,即那些引用其他推文的推文。这些推文通过推文负载中的 “is_quote_status”: true 来标识。也可以使用否定形式来排除引用推文。 **注意:**在使用 Search API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 |
| is:已验证 | 仅返回作者被 X 验证的帖子。也可以否定以排除作者被验证的帖子。 **注意:**使用 Search API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。‘不包含is:或has:is:verified | 仅返回来自已由 X 验证作者的帖子。可通过否定来排除已验证作者的帖子。 **注意:**在使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 |
| has:mentions | 匹配提及其他 X 用户的帖子。 **注意:**使用 Search API 时,必须将此运算符与其他不…的运算符结合使用’不包括 is:或has:has:mentions | 匹配提及其他 X 用户的帖子。 注意: 使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 |
| has:hashtags | 匹配包含标签的帖子。 **注意:**在使用 Search API 时,该运算符必须与其他不…的运算符结合使用’不包括 is:或has:匹配包含标签的帖子。注意: 使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 | |
| has:media | 可用别名: has:media_链接 匹配包含由 X 分类的媒体 URL 的帖子。例如,pic.x.com。 **注意:**在使用 Search API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。‘不包括is:或has:has:media | Available alias: has:media_link 匹配包含 X 托管媒体 URL 的帖子。例如,pic.x.com。 注意: 在使用搜索 API 时,此运算符必须与其他不包含 is: 或 has: 的运算符结合使用。 |
| has:images | 匹配包含由 X 归类的媒体 URL 的 Post。例如:pic.x.com。 **注意:**在使用 Search API 时,此运算符必须与不包含 is: 或 has: 的其他运算符一起使用’不包含is:或has:。 | |
| has:videos | 可用的别名: has:video_链接 匹配包含原生 X 视频(直接上传到 X)的 Post。不匹配使用 Vine、Periscope 创建的视频,或包含指向其他视频托管网站链接的 Post。 **注意:**在使用搜索 API 时,此运算符必须与不——的其他运算符配合使用’不包括 is:或has:。 | |
| has:symbols | 匹配包含股票代号符号(以“tag)的 Posts。请注意,此运算符仅在企业版搜索 API。注意在使用 Search API 时,必须将此运算符与不包含 is: 或 has: 的其他运算符一起使用’不包含is:或has:。 |
产品概览
元数据时间线
to: 和 in_reply_to_status_id: PowerTrack 操作符。
此处提供的信息是使用 Full-Archive Search(数百次搜索的结果)生成的。此时间线并非 100% 完整或精确。如果您发现另一个与您的用例相关的过滤/元数据“诞生日期”基本信息,请告知我们。
请注意,底层搜索索引可能会被重建。因此,这些时间线细节可能会发生变化。
2006
- 3月26日 -
lang:. 一个生成搜索索引时回填帖子元数据的示例。 - 7月13日 -
has:mentions开始匹配。 - 10月6日 -
has:symbols。用于讨论股票符号的 slang)。 - 10月26日 -
has:links开始匹配。 - 11月23日 -
has:hashtags开始匹配。
2007
- 1月30日 - 首个一流 @reply(in_reply_to_user_id),
reply_to_status_id:开始匹配。 - 8月23日 - 标签作为组织主题和对话的常见约定出现。一周后首次实际使用。
2009
- 5月15日 -
is:retweet。请注意,此运算符从官方转推的“beta”版本发布及其“Via @”模式开始匹配。在此 beta 期间,帖子的动词为“post”,原始帖子不包含在负载中。 - 8月13日 - 官方转推的最终版本发布,采用“RT @”模式,动词设置为“share”,以及包含原始帖子的“retweet_status”属性(从而使 JSON 负载大小大约加倍)。
2010
- 3月6日 -
has:geo、bounding_box:和point_radius:地理运算符开始匹配。 - 8月28日 -
has:videos(直到2015年2月,此运算符匹配包含指向特定视频托管网站(如 youtube.com、vimeo.com 和 vivo.com)链接的帖子)。
2011
- 7 月 20 日 -
has:media和has:images开始匹配。原生照片于 2010 年 8 月 9 日正式宣布。
2014
- 12 月 3 日 - (大约) 某些 增强的 URL 元数据 带有 HTML 标题和描述开始出现在负载中。增强元数据在 2016 年 5 月更全面地引入。
2015
- 2月10日 -
has:videos开始匹配“原生”X视频。 - 2月17日 -
has:profile_geo、profile_country:、profile_region:、profile_locality:个人资料地理位置 操作符开始匹配。 - 2月17日 -
place_country:和place:帖子地理位置操作符开始匹配。
2016
- 5月1日 - 增强型 URL 元数据 更全面可用,并作为 2016 年 8 月 Gnip 2.0 发布 的一部分正式宣布。这些元数据在 Search APIs 中没有相关的 Operators。
2017
- 2月22日 - 投票元数据开始以丰富的原生格式提供可用。这些元数据没有相关的 Operators。
2022
- 9月27日 - 自该日期起创建的所有 Post 对象均包含“已编辑 Post”相关的元数据。自该日期起,所有提供 Post 对象的 企业版 端点均已更新以返回此类元数据。所提供的编辑元数据包括 edit_history 和 edit_controls 对象。对于 2022 年 9 月 27 日之前创建的 Posts,将不会返回这些元数据。目前,没有可用的 企业版 Operator 与这些元数据相匹配。要进一步了解编辑 Post 的元数据,请参阅 Edit Posts 基础 页面。
2022
- 9 月 29 日 - 自该日期起创建的所有 Post 对象均提供“已编辑 Post”元数据。自该日期起,所有返回 Post 对象的 企业版 端点均已更新以提供此元数据。提供的编辑元数据包括 edit_history 和 edit_controls 对象。对于 2022 年 9 月 27 日之前创建的 Post,不会返回这些元数据。目前,没有可用的 企业版 运算符与这些元数据相匹配。要了解有关编辑 Post 元数据的更多信息,请参阅 Edit Posts 基础 页面。
过滤提示
- 某些元数据具有“生效起始”日期,因此过滤器可能产生_假阴性_。这类搜索依赖的 Operators 基于在搜索区间内全部或部分时间并不存在的元数据。比如,如果你使用
has:imagesOperator 搜索 Post,那么在 2011 年 7 月之前不会有任何匹配。这是因为该 Operator 仅匹配_原生_照片(通过 X 用户界面附加到 Post)。若要获得更完整的照片分享 Post 数据集,针对 2011 年 7 月之前的过滤器需要加入匹配常见图片托管服务 URL 的规则子句。 - 有些元数据是在 Post 发布到 X_之后_才被回填的。
- X Profiles
- 原创或转发的 Post
- Post 语言分类
- 地理标注的 Post
- 分享链接的媒体
X 个人资料
原始 Post 与转发
_is:retweet_ 运算符可用于包含或排除转发。使用该运算符的用户在处理 2009 年 8 月之前的数据时,需要针对转发匹配(或不匹配)采取两种策略。对于 2009 年 8 月之前的数据,需要检查 Post 消息本身,并使用精确短语匹配来查找与“@RT ”模式的匹配(实际上,如果你在筛选 2009 年 5 月至 8 月期间的转发,还应包含 “Via @” 模式)。对于 2009 年 8 月之后的时间段,可以使用 _is:retweet_ 运算符。
Post 语言分类
为 Post 进行地理参照
- Post 文本中的地理提及。 基于 Post 文本中的地理提及进行匹配,尽管通常最具挑战性,因为它依赖于本地知识,但适用于整个 Post 存档。此处是一个 2006 年的地理参照匹配示例,基于“golden gate”过滤器,针对旧金山地区。
-
用户为 Post 添加的地理标签。 通过搜索 API,自 2010 年 3 月起即可使用部分 Geo Operators 对 Post 进行匹配,另一些自 2015 年 2 月起提供:
- 2010 年 3 月 6 日:
has:geo、bounding_box:、point_radius: - 2015 年 2 月 17 日:
place_country:、place:
- 2010 年 3 月 6 日:
-
用户在账号资料中设置的“home”位置。 Profile Geo Operators 在 Historical PowerTrack 和 Search APIs 中均可用。对于 Search APIs,这些 Profile Geo 元数据自 2015 年 2 月起可用。对于 Profile Geo 元数据可用之前发布的 Post,可使用
bio_location:运算符匹配非规范化的用户输入。
- 2006 年 10 月 26 日 -
has:links - 2011 年 7 月 20 日 -
has:images和has:media - 2011 年 8 月 -
url:,配合Expanded URLs 增强。最早在 2006 年 9 月,(url:"spotify.com" OR url:gnip OR url:microsoft OR url:google OR url:youtube)就能匹配 http://x.com/Adam/statuses/16602,尽管在 twitter_entities 和 gnip 对象中没有 urls[] 元数据。“youtube.com” 是一条消息内容的示例,即使没有任何 urls[] 元数据,也能匹配 url:youtube。 - 2015 年 2 月 10 日 - 原生视频的
has:videos。在 2010/08/28 至 2015/02/10 之间,该运算符会匹配带有指向特定视频托管站点(如 youtube.com、vimeo.com 和 vivo.com)链接的 Posts。 - 2016 年 5 月 1 日 - 基于Enhanced URLs 增强 的
url_title:和url_description:,普遍可用。首批增强 URL 元数据自 2014 年 12 月开始出现。
常见问题(FAQ)
常见的 Search Post API 问题
我通过 data 端点获取的 Post 数量与 counts 端点统计的 Post 数量不一致。为什么会这样?
我通过 data 端点获取的 Post 数量与 counts 端点统计的 Post 数量不一致。为什么会这样?
counts 端点与 data 端点返回的结果之间存在已知差异。您可能会发现结果不一致,因为 counts 端点是在合规处理之前生成的(因此不会计入已删除的 Post、scrub geo 等),而 data 端点在交付时符合合规要求,并会纳入所有合规事件。
为什么我没有收到与我的查询相匹配的 Post?
为什么我没有收到与我的查询相匹配的 Post?
这可能发生的原因有几种,包括:
- 你预期看到的 Post 来自受保护的账户
- data 端点会纳入所有合规事件(这意味着已删除的 Post、已清除的地理信息等将不会包含在响应中)。
我的查询匹配到了一个 Post,但其中包含了我排除的关键词。为什么会这样?
我的查询匹配到了一个 Post,但其中包含了我排除的关键词。为什么会这样?
这很可能是由于对我们的高级规则与过滤功能的不当使用造成的。请查看我们的文档此处,并确保你了解构建规则时的各项限制。
是否有可用的库,可帮助我开始使用 Search Post API?
是否有可用的库,可帮助我开始使用 Search Post API?
是的,包括:
- Tweepy - 适合使用标准搜索/Post 产品(Python)
- X API - 适合使用标准 Search Post API(Python)
- Search Posts Python 和 Search Posts Ruby - 可用于企业版(以及 v2!)Search Post API 的两款优秀工具
在向该数据端点发出请求时,如果我设置了 `maxResults` 的值,实际返回的 Post 数量是否可能少于该值?
在向该数据端点发出请求时,如果我设置了 `maxResults` 的值,实际返回的 Post 数量是否可能少于该值?
是的。我们的 data 端点会在达到指定的
maxResults 上限或经过 30 天后进行分页。例如,如果在某个 30 天周期内你有 800 条 Post,你需要发起两次请求才能获取完整结果,因为每次请求最多可返回 500 条 Post(maxResults)。再比如,如果你在第一个月只有 400 条 Post,第二个月有 100 条 Post,你同样需要发起两次请求才能获取完整结果;因为即使第一次请求返回的 Post 少于指定的 maxResults,分页仍会在 30 天后进行。匹配的 Post 按何种顺序返回?
匹配的 Post 按何种顺序返回?
Post 按时间倒序返回。例如,第一页的结果会显示与查询匹配的最新 Post;随后将通过分页继续返回,直到结果中的发布时间追溯到最初请求的
fromDate 为止。编辑 Post 会如何影响我的用量和计费?
编辑 Post 会如何影响我的用量和计费?
只有原始的 Post 会计入计费。任何后续编辑将被忽略,不计入你的整体活动计数。
企业版我想进一步了解企业版 Search Post API 的定价,并申请使用该产品。该如何办理?
我想进一步了解企业版 Search Post API 的定价,并申请使用该产品。该如何办理?
我们的企业版解决方案可按需定制,并提供可预测的定价,以满足您的业务需求。请在此处提交申请以获取更多信息。
如何构建符合我用例的规则集?
如何构建符合我用例的规则集?
本月我的请求配额/上限已用完,但我还需要获取更多数据,我该怎么办?
本月我的请求配额/上限已用完,但我还需要获取更多数据,我该怎么办?
请联系你在 X 的客户经理,他们可以协助处理此事。
错误排查指南
- 请确保为各个端点使用正确的参数(例如,
buckets字段只能与 counts 端点配合使用,不能用于 data 端点) - 请再次核对
:product、:account_name和:label字段是否正确。您可以在 GNIP Console 中找到您的:label字段(仅限企业版客户)。
API 参考文档
企业搜索 API
- 30-Day Search API - 提供过去 30 天内发布的 Tweet。
- Full-Archive Search API - 提供最早可追溯至 2006 年的 Tweet,起始于 2006 年 3 月发布的第一条 Tweet。
- 请求 Tweet 数据与计数的方法
- 认证
- 分页
- API 请求参数与请求示例
- API 响应 JSON 负载与响应示例
- HTTP 响应代码
方法
https://gnip-api.x.com/search/。
| 方法 | 说明 |
|---|---|
| POST /search/:product/accounts/:account_name/:label | 检索过去 30 天内与指定 PowerTrack 规则匹配的 Tweet。 |
| POST /search/:product/accounts/:account_name/:label/counts | 检索过去 30 天内与指定 PowerTrack 规则匹配的 Tweet 数量。 |
:product表示你发起请求的搜索端点,可为30day或fullarchive。:account_name是与你的账户关联的名称(区分大小写),如在 console.gnip.com 上所示。:label是与你的搜索端点关联的标签(区分大小写),如在 console.gnip.com 上所示。
- 数据端点:https://gnip-api.x.com/search/30day/accounts/TwitterDev/prod.json
- 计数端点:https://gnip-api.x.com/search/30day/accounts/TwitterDev/prod/counts.json
:product、:account_name 和 :label 的 URL。要使用这些示例,请务必将这些 URL 中的占位符替换为你的详细信息。
认证
请求/响应行为
fromDate 和 toDate 参数,您可以请求 API 所支持的任意时间段。30-Day 搜索 API 提供最近 31 天内的 Tweet(尽管称为“30-Day”API,但它提供 31 天的数据,以便用户可以发起整月范围的请求)。Full-Archive 搜索 API 提供可追溯到第一条 Tweet(2006 年 3 月 21 日)的结果。然而,单个响应会受限于您指定的 maxResults 或 31 天中较小的那个。如果匹配的 data 或您的时间范围超过您指定的 maxResults 或 31 天,您将收到一个“next”令牌,您应使用它对剩余的指定时间范围进行分页。
例如,假设您使用 Full-Archive 搜索,想要获取 2017 年 1 月 1 日到 2017 年 6 月 30 日期间与您的查询匹配的所有 Tweet。您将在请求中使用 fromDate 和 toDate 参数指定这整整六个月的时间段。搜索 API 将返回第一“页”的 Tweet,其数量与您的 maxResults 参数(默认 100)相匹配。假设还有更多的 Tweet(很可能会有),API 还会提供一个“next”令牌,使您能够请求下一“页”的 data。该过程会重复,直到 API 不再返回“next”令牌。有关更多详细信息,请参见下一节。
分页
数据分页
maxResults 参数的默认值为 100,可设置为 10–500 的范围。如果你的查询匹配的 Tweet 数量超过请求中使用的 maxResults 参数,响应会包含一个 next 令牌(作为根级 JSON 属性)。此 next 令牌用于后续请求,以检索该查询下一部分匹配的 Tweet(即下一“页”)。系统会持续返回 next 令牌,直到到达该查询结果的最后一“页”,此时将不再提供 next 令牌。
要请求下一“页”数据,你必须发起与原始请求完全相同的查询,包括(若使用)query、toDate 和 fromDate 参数,并包含一个 next 请求参数,其值设为前一个响应返回的值。可通过 GET 或 POST 请求使用该机制。但在 GET 请求的情况下,必须对 next 参数进行 URL 编码。
你可以持续传入上一次查询中的 next 元素,直至获取到查询所覆盖时间段内的所有 Tweet。当收到的响应未包含 next 元素时,表示你已到达最后一页,且在指定的查询与时间范围内不再有其他可用数据。
计数分页
其他说明
- 在搜索请求中使用 fromDate 或 toDate 时,您只能获得位于该时间范围内的结果。当到达该时间范围内的最后一组结果时,您将不会收到“next”令牌。
- “next”元素可与 10–500 范围内任意 maxResults 值搭配使用(默认值为 100)。maxResults 决定每个响应返回的 Tweet 数量,但不会阻止您最终获取全部结果。
- “next”元素不会过期。使用相同“next”查询的多个请求,无论何时发出,都会收到相同的结果。
- 使用“next”参数对结果进行分页时,您可能会在查询边界处遇到重复项。您的应用应能够容忍这些情况。
数据端点
POST /search/:product/:label
端点模式:
数据请求参数
| 参数 | 说明 | 是否必需 | 示例值 |
|---|---|---|---|
| query | 相当于一条 PowerTrack 规则,最多可包含 2,048 个字符(对正向和负向子句的数量不设限)。 此参数应包含该 PowerTrack 规则的全部内容,包括所有运算符;规则的任何部分都不应拆分到查询的其他参数中。 注意: 并非所有 PowerTrack 运算符都受支持。受支持的运算符列于此处。 | 是 | (snow OR cold OR blizzard) weather |
| tag | 可使用标签将规则及其匹配的数据划分为不同的逻辑组。若提供规则标签,该标签将包含在 matching_rules 属性中。 建议为规则标签分配规则专属的 UUID,并在客户端维护所需的映射关系。 | 否 | 8HYG54ZGTU |
| fromDate | 提供 Tweets 的最早 UTC 时间戳(使用全档案搜索可追溯至 2006/3/21)。时间戳粒度为分钟,且为包含式(例如 12:00 包含第 00 分钟)。 已指定: 仅使用 fromDate 而不提供 toDate 参数,将返回从现在起向过去直至 fromDate 的查询结果。 未指定: 若未指定 fromDate,API 将返回从现在起或指定的 toDate(若提供)起往前 30 天内的所有结果。 若 fromDate 与 toDate 参数均未使用,API 将返回最近 30 天内的所有结果,起始于请求发起时间,按时间倒序返回。 | 否 | 201207220000 |
| toDate | 提供 Tweets 的最新(最近)UTC 时间戳。时间戳粒度为分钟,且为不包含式(例如 11:59 不包含该小时第 59 分钟)。 已指定: 仅使用 toDate 而不提供 fromDate 参数,将返回 toDate 之前最近 30 天的数据。 未指定: 若未指定 toDate,API 将返回从现在起开始、按时间倒序直至 fromDate 的所有查询结果。 若 fromDate 与 toDate 参数均未使用,API 将返回整个 30 天索引内的所有结果,起始于请求发起时间,按时间倒序返回。 | 否 | 201208220000 |
| maxResults | 单个请求可返回的最大搜索结果数。取值在 10 与系统上限(当前为 500)之间。默认情况下,请求响应将返回 100 条结果。 | 否 | 500 |
| next | 用于获取下一“页”结果的参数,详见此处。该参数的取值直接来自 API 返回的响应,不应修改。 | 否 | NTcxODIyMDMyODMwMjU1MTA0 |
其他详细信息
| 可用时间范围 | 30 天:最近 31 天 完整存档:2006 年 3 月 21 日至今 |
| 查询格式 | 等同于一条 PowerTrack 规则,最多可包含 2,048 个字符(正向和负向子句数量不设上限)。 **注意:**并非所有 PowerTrack 运算符均受支持。请参阅可用运算符以获取受支持的运算符列表。 |
| 速率限制 | 合作伙伴将在分钟级和秒级两个粒度受到速率限制。每分钟的速率限制将按合同约定因合作伙伴而异。但这些每分钟速率限制并非用于一次性突发。无论您的每分钟速率限制如何,所有合作伙伴对所有 data 和/或计数请求的总量,每秒最多限制为 20 个请求。 |
| 合规性 | 通过 Full-Archive Search API 交付的所有 data 在交付时均符合合规要求。 |
| 实时可用性 | 在 X 平台生成后的 30 秒内,data 即会进入索引并可用 |
示例 data 请求与响应
示例 POST 请求
- 如下所示,POST 请求的请求参数通过 JSON 格式的请求体发送。
- 要查询的 PowerTrack 规则的所有部分(例如关键词、以及像 bounding_box: 这样的其他运算符)都应放入 ‘query’ 参数中。
- 不要将规则的各个部分拆分为查询 URL 中的独立参数。
示例 GET 请求
- 在 GET 请求中,请求参数会采用标准 URL 编码并附加到 URL 中。
- 查询的 PowerTrack 规则的所有部分(如关键词、其他运算符,例如 bounding_box:)都应放在 ‘query’ 参数中。
- 不要在查询 URL 中将规则的各部分拆分为单独的参数。
示例 data 响应
计数接口
/search/:stream/counts
端点模式:
/search/fullarchive/accounts/:account_name/:label/counts.json
此端点返回指定查询的计数(数据量)。如果未指定时间范围,时间参数将默认为过去 30 天。数据量将以带时间戳的数组返回,粒度可为按日、按小时(默认)或按分钟。
注意: 也可通过使用 GET 请求而非 POST 请求来实现此功能,只需将下文所述参数编码到 URL 中即可。
计数请求参数
| 参数 | 描述 | 是否必需 | 示例值 |
|---|---|---|---|
| query | 相当于一条 PowerTrack 规则,最多 2,048 个字符(正向和负向子句数量不受限制)。 此参数应包含该 PowerTrack 规则的全部内容,包括所有运算符;不要将规则的任何部分拆分到其他查询参数中。 注意: 并非所有 PowerTrack 运算符都受支持。请参阅可用运算符了解受支持的运算符列表。 | 是 | (snow OR cold OR blizzard) weather |
| fromDate | 提供 Tweet 的最早 UTC 时间戳(可最早回溯至 2006/3/21)。时间戳精确到分钟且为包含(例如 12:00 包含第 00 分钟)。 已指定: 仅提供 fromDate 而不提供 toDate 时,API 将从现在起向前回溯至 fromDate,返回该查询的计数(data 量)。如果 fromDate 早于当前时间 31 天之前,将返回 next 令牌以分页检索。 未指定: 如未指定 fromDate,API 将返回从当前时间起向前 30 天(或若指定了 toDate,则为 toDate 之前 30 天)的计数(data 量)。 如果既未提供 fromDate 也未提供 toDate,API 将返回最近 30 天的计数(data 量),从发起请求时刻起向前回溯。 | 否 | 201207220000 |
| toDate | 提供 Tweet 的最新 UTC 时间戳。时间戳精确到分钟且为不包含(例如 11:59 不包含该小时的第 59 分钟)。 已指定: 仅提供 toDate 而不提供 fromDate 时,将返回 toDate 之前 30 天内的最新计数(data 量)。 未指定: 如未指定 toDate,API 将返回从现在起向前至 fromDate 的该查询计数(data 量)。如果 fromDate 早于当前时间 31 天之前,将返回 next 令牌以分页检索。 如果既未提供 fromDate 也未提供 toDate,API 将返回最近 30 天的计数(data 量),从发起请求时刻起向前回溯。 | 否 | 201208220000 |
| bucket | 计数数据的时间粒度。可在请求的时间范围内按天、小时或分钟返回计数数据。默认按小时返回。可选值:‘day’、‘hour’、‘minute’ | 否 | minute |
| next | 用于按此处所述获取下一“页”结果。该参数所用的值直接取自 API 的响应,且不应修改。 | 否 | NTcxODIyMDMyODMwMjU1MTA0 |
其他详细信息
| 可用时间范围 | 30 天:过去 31 天 完整存档:2006 年 3 月 21 日至今 |
| 查询格式 | 相当于一条 PowerTrack 规则,最长 2,048 个字符。 **注意:**并非所有 PowerTrack 运算符均受支持。请参阅可用运算符获取受支持运算符列表。 |
| 速率限制 | 合作伙伴将在分钟级和秒级两个粒度上受到速率限制。每分钟的速率限制将按合同约定,因合作伙伴而异。但这些每分钟速率限制并非用于单次突发使用。无论您的每分钟速率限制如何,所有合作伙伴每秒最多 20 个请求,该上限在所有 data 和/或计数请求间汇总计算。 |
| 计数精度 | 通过此端点提供的计数反映实际发生的 Tweet 数量,不包含后续合规事件(删除、地理信息清理)产生的影响。由于用户的合规操作,被计入的某些 Tweet 可能无法通过 data 端点获取。 |
计数请求和响应示例
示例 POST 请求
- 在 POST 请求中,请求参数通过 JSON 格式的请求体发送,如下所示。
- 要查询的 PowerTrack 规则的所有组成部分(例如关键词、以及如 bounding_box: 等其他运算符)都应放入 query 参数中。
- 请勿将规则的部分拆分为单独参数置于查询 URL 中。
示例 GET 请求
- GET 请求的参数会使用标准 URL 编码并包含在 URL 中
- 要查询的 PowerTrack 规则的所有组成部分(例如关键字、以及如 bounding_box: 之类的其他运算符)都应放在 query 参数中
- 不要将规则的部分拆分为查询 URL 中的独立参数
示例计数响应
HTTP 响应代码
| 状态 | 文本 | 描述 |
|---|---|---|
| 200 | OK | 请求成功。JSON 响应将类似如下: |
| 400 | Bad Request | 通常因请求中包含无效的 JSON,或请求未发送任何 JSON 负载而返回此响应。 |
| 401 | Unauthorized | 因凭证无效导致 HTTP 认证失败。请使用你的凭证登录 console.gnip.com,确认在请求中正确使用。 |
| 404 | Not Found | 在请求发送到的 URL 未找到资源,可能是因为 URL 不正确。 |
| 422 | Unprocessable Entity | 因查询参数无效而返回,例如无效的 PowerTrack 规则。 |
| 429 | Unknown Code | 你的应用已超出连接请求的限制。相应的 JSON 消息将类似如下: |
| 500 | Internal Server Error | 服务器端发生错误。请使用指数退避策略重试请求。 |
| 502 | Proxy Error | 服务器端发生错误。请使用指数退避策略重试请求。 |
| 503 | Service Unavailable | 服务器端发生错误。请使用指数退避策略重试请求。 |