请注意: 我们已在 X API v2 中发布了新版的 Post 搜索 和 Post 计数。我们建议你查看 X API v2 的最新变化。 这些 endpoint 已更新,现包含 Post 编辑 metadata。请在“编辑 Posts” 基础知识页面了解这些 metadata 的详细信息。
概览
Enterprise
Enterprise 级 API 仅在我们的受管访问层级中提供。要使用这些 API,您必须先与我们的 Enterprise 销售团队开立账户。了解更多信息请参见此处。
您可以在此处查看所有 X API 搜索 Post 的产品。
共有两种 Enterprise 搜索 API:
- 30 天搜索 API 提供过去 30 天的数据。
- 全量归档搜索 API 提供对自 2006 年 3 月首条 Post 起至今的完整 X 数据语料库的即时、完整访问。
请求类型
搜索请求(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:2006/3/21
- 首次原生转发:2009/11/6
- 首次带地理标签的 Post:2009/11/19
- 首次为过滤建立 URL 索引:2011/8/27
- 增强的 URL 展开 metadata(网站标题与描述):2014/12/1
- 个人资料地理信息增强 metadata 及过滤:2015/2/17
数据更新与可变性
- 用户对象 metadata:
- 用户的 @handle(数值型 id 永不更改)
- 个人简介
- 计数:statuses、followers、friends、favorites、lists
- 资料位置
- 其他信息,如时区和语言
- Post 统计数据——即可由用户在平台上的操作改变的任何内容(示例如下):
- Favorites 计数
- 转发计数
单线程与多线程请求
重试逻辑
- 缩短请求覆盖的时间范围后重试;如仍不成功,继续缩短,直至最小为 6 小时的时间窗口。
- 如果您将大量术语使用 OR 连接,请将其拆分为多条独立规则,并分别重试。
- 如果您的规则中包含大量排除条件,请减少否定术语的数量后重试。
快速上手
开始使用 Enterprise Search Posts:30-Day API
- Enterprise 账户 https://developer.x.com/en/products/x-api/enterprise
- 你的用户名、密码和账户名称
- 与你的搜索 endpoint 关联的 Label,可在 console.gnip.com 上查看
访问 data endpoint
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 endpoint 的响应载荷
访问 counts endpoint
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 endpoint 响应负载
参考文章
开始使用 Enterprise Search Posts:Full-Archive API
- [一个 Enterprise 账户]https://developer.x.com/en/products/x-api/enterprise
- 你的用户名、密码和账户名称
- 与你的搜索 endpoint 关联的 Label,如在 console.gnip.com 中所示
访问 data endpoint
from:
和 lang:
运算符来查找来自 @XDevelopers 且语言为英文的 Posts。更多运算符请点击此处。
- 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"
数据 endpoint 的响应载荷
访问 counts endpoint
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"
Counts endpoint 响应载荷
参考资料
指南
构建搜索查询
Enterprise 运算符
- Enterprise 30 天搜索 API
- Enterprise 全量归档搜索 API
操作符 | 描述 |
---|---|
keyword | 匹配 Post 正文或 URL 中的分词关键词。这是一种分词匹配,即您的关键词字符串将与 Post 正文的分词文本进行匹配——分词基于标点符号、符号和分隔符 Unicode 基本平面字符。例如,包含文本”I like coca-cola”的 Post 将被分割为以下词元:I、like、coca、cola。然后将这些词元与您规则中使用的关键词字符串进行比较。要匹配包含标点符号(例如 coca-cola)、符号或分隔符字符的字符串,您必须使用下面描述的引号精确匹配。 注意: 在 Search API 中,重音符号和特殊字符会被标准化为标准拉丁字符,这可能会改变外语的含义或返回意外结果: 例如,“músic”将匹配”music”,反之亦然。 例如,西班牙语中的常见短语”Feliz Año Nuevo!”将被索引为”Feliz Ano Nuevo”,这改变了短语的含义。 注意: 此操作符将匹配 Post 中的 URL 和展开的 URL。 |
emoji | 匹配 Post 正文中的表情符号。表情符号是分词匹配,即您的表情符号将与 Post 正文的分词文本进行匹配——分词基于标点符号、符号/表情符号和分隔符 Unicode 基本平面字符。例如,包含文本”I like “的 Post 将被分割为以下词元:I、like、。然后将这些词元与您规则中使用的表情符号进行比较。请注意,如果表情符号有变体,您必须使用”引号”将其添加到规则中。 |
“exact phrase match” | 匹配 Post 正文或 URL 中的分词和有序短语。这是一种分词匹配,即您的关键词字符串将与 Post 正文的分词文本进行匹配——分词基于标点符号、符号和分隔符 Unicode 基本平面字符。 注意: 标点符号不会被分词,而是被视为空白字符。 例如,引号中的”#hashtag”将匹配”hashtag”但不匹配 #hashtag(使用不带引号的 hashtag # 操作符来匹配实际的话题标签)。 例如,引号中的”cashtag"将匹配"cashtag"但不匹配 cashtag(使用不带引号的 cashtag $ 操作符来匹配实际的股票标签)。 例如,“Love Snow”将匹配”#love #snow” 例如,“#Love #Snow”将匹配”love snow” 注意: 此操作符将匹配 Post 中的 URL 和展开的 URL。 |
“keyword1 keyword2”~N | 通常称为邻近操作符,匹配关键词之间不超过 N 个词元的 Post。 如果关键词顺序相反,它们之间不能超过 N-2 个词元。引号中可以包含任意数量的关键词。N 不能大于 6。 请注意,此操作符仅在 enterprise 搜索 API 中可用。 |
from: | 匹配来自特定用户的任何 Post。 该值必须是用户的 X 数字账户 ID 或用户名(不包括 @ 字符)。查找数字 X 账户 ID 的方法请参见此处或此处。 |
to: | 匹配回复特定用户的任何 Post。 该值必须是用户的数字账户 ID 或用户名(不包括 @ 字符)。查找数字 X 账户 ID 的方法请参见此处。 |
url: | 对 Post 的展开 URL 执行分词(关键词/短语)匹配(类似于 url_contains)。包含标点符号或特殊字符的词元和短语应使用双引号。例如,url:“/developer”。虽然通常不建议,但如果您想匹配特定协议,请用双引号括起来:url:“https://developer.x.com"。 注意: 使用 PowerTrack 或 Historical PowerTrack 时,此操作符将匹配引用 Post 原始 Post 中包含的 URL。例如,如果您的规则包含 url:“developer.x.com”,并且某个 Post 包含该 URL,则该 Post 的任何引用 Tweet 都将包含在结果中。使用 Search API 时情况并非如此。 |
# | 匹配包含给定话题标签的任何 Post。 此操作符执行精确匹配,而非分词匹配,即规则”2016”将匹配包含确切话题标签”2016”的 Post,但不匹配包含话题标签”2016election”的 Post 注意:话题标签操作符依赖 X 的实体提取来匹配话题标签,而不是从正文本身提取话题标签。有关 X 实体 JSON 属性的更多信息,请参见此处。 |
@ | 匹配提及给定用户名的任何 Post。 to: 操作符返回 @mention 操作符的子集匹配。 |
$ | 匹配包含指定”股票标签”的任何 Post(其中词元的前导字符是”$“字符)。 请注意,股票标签操作符依赖 X 的”符号”实体提取来匹配股票标签,而不是尝试从正文本身提取股票标签。有关 X 实体 JSON 属性的更多信息,请参见此处。 请注意,此操作符仅在 enterprise 搜索 API 中可用。 |
retweets_of: | 可用别名:retweets_of_user: 匹配指定用户的转发 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 | 乌尔都语: ur |
爱沙尼亚语: et | 韩语: ko | 简体中文: zh-CN | 维吾尔语: ug |
芬兰语: fi | 老挝语: lo | 信德语: sd | 越南语: vi |
法语: fr | 拉脱维亚语: lv | 僧伽罗语: si | 威尔士语: cy |
格鲁吉亚语: ka | 立陶宛语: lt |
place: | 匹配带有指定位置或 X place ID(见示例)标签的 Post。多词地点名称(“New York City”“Palo Alto”)应使用引号括起。 注意:有关如何获取 X place ID,请参阅公共 API endpoint GET geo/search。 注意:此运算符不会匹配转发,因为转发的地点附加在原始 Post 上。对于引用推文的原始 Post 所附加的地点也不会匹配。 |
place_country: | 匹配其所标记的place关联国家/地区代码与给定 ISO 双字母代码相同的 Post。 有效的 ISO 代码可在此处查看:http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 注意:此运算符不会匹配转发,因为转发的地点附加在原始 Post 上。对于引用推文的原始 Post 所附加的地点也不会匹配。 |
point_radius:[lon lat radius] | 在存在时,匹配 Post 的精确位置(x, y);并且在 X 中,匹配“Place”地理多边形,前提是该 Place 完全包含在定义的区域内。 * 支持的半径单位为英里(mi)和千米(km)。 * 半径必须小于 25 mi。 * 经度范围为 ±180。 * 纬度范围为 ±90。 * 所有坐标均为十进制度。 * 规则参数置于方括号内,并以空格分隔。 注意:此运算符不会匹配转发,因为转发的地点附加在原始 Post 上。对于引用推文的原始 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。 * 所有坐标均为十进制度。 * 规则参数置于方括号内,并以空格分隔。 注意:此运算符不会匹配转发,因为转发的地点附加在原始 Post 上。对于引用推文的原始 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提供的Post特定地理位置数据的Post。这可以是”geo”经纬度坐标,或者是X “Place”形式的”location”,包含相应的显示名称、地理多边形和其他字段。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:profile_geo | 可用别名: has:derived_user_geo 匹配包含任何Profile Geo metadata的Post,无论实际值如何。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:links | 此操作符匹配消息正文中包含链接的Post。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
is:retweet | 仅传递匹配规则的显式转发。也可以取反以排除匹配规则的转发,仅传递原创内容。 此操作符仅查找使用X转发功能的真正转发。引用Tweet和不使用X转发功能的修改Post不会被此操作符匹配。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
is:reply | 用于根据Post是否为Post回复来过滤Post的操作符。仅传递匹配规则的显式回复。也可以取反以排除匹配规则的回复。 请注意,此操作符适用于付费高级版和企业搜索,在沙盒开发环境中不可用。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
is:quote | 仅传递引用Tweet,或引用另一个Post的Post,通过Post载荷中的”is_quote_status”:true标识。也可以取反以排除引用Tweet。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
is:verified | 仅传递作者被X”认证”的Post。也可以取反以排除作者已认证的Post。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:mentions | 匹配提及另一个X用户的Post。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:hashtags | 匹配包含话题标签的Post。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:media | 可用别名: has:media_link 匹配包含X分类的媒体url的Post。例如,pic.x.com。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:images | 匹配包含X分类的媒体url的Post。例如,pic.x.com。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:videos | 可用别名: has:video_link 匹配包含直接上传到X的原生X视频的Post。这不会匹配使用Vine、Periscope创建的视频或包含其他视频托管网站链接的Post。 注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
has:symbols | 匹配包含现金标签符号(带有前导’'字符,例如tag)的Post。请注意,此操作符仅在enterprise 搜索API中可用。注意: 使用Search API时,此操作符必须与其他不包含 is: 或has: 的操作符结合使用。 |
产品概览
元数据时间线
to:
和 in_reply_to_status_id:
这类 PowerTrack 运算符。
这里提供的细节是使用 Full-Archive Search(来自数百次搜索的结果)生成的。该时间线并非 100% 完整或精确。如果你发现了对你的用例至关重要的其他过滤/元数据“诞生日”,请告知我们。
请注意,底层的搜索索引可能会被重建。因此,这些时间线细节可能会发生变化。
2006
- 3月26日 -
lang:
。在生成搜索索引时回填 Post metadata 的示例。 - 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日 - Hashtag 作为组织主题和会话的通用约定出现。一周后首次得到实际应用。
2009
- 5月15日 -
is:retweet
。请注意,此运算符从官方转发功能的“beta”发布版本及其“Via @”模式开始匹配。在该 beta 期间,Post 的动词为“post”,且原始 Post 不包含在有效负载中。 - 8月13日 - 官方转发功能的最终版本发布,采用“RT @”模式,动词设为“share”,并引入包含原始 Post 的“retweet_status”属性(因此 JSON 有效负载的大小大约翻倍)。
2010
- 3月6日 -
has:geo
、bounding_box:
和point_radius:
地理运算符开始生效并可用于匹配。 - 8月28日 -
has:videos
(截至2015年2月,该运算符匹配包含指向特定视频托管网站(如 youtube.com、vimeo.com 和 vivo.com)链接的 Post)。
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:
Profile Geo 运算符开始生效。 - 2月17日 -
place_country:
和place:
Post 地理运算符开始生效。
2016
- 5月1日 - 增强的 URL metadata 更广泛地开放使用,并在 2016 年 8 月的 Gnip 2.0 发布 中正式宣布。对于这些 metadata,Search APIs 不提供相关的 Operators。
2017
- 2 月 22 日 - 投票 metadata 以增强的原生格式提供。对此类 metadata 无对应的 Operators。
2022
- 9月27日 - 自该日期起创建的所有 Post 对象均包含可用的“已编辑 Post”元数据。自该日期起,所有提供 Post 对象的 Enterprise endpoint 均已更新以提供此元数据。所提供的编辑元数据包括 edit_history 和 edit_controls 对象。对于 2022 年 9 月 27 日之前创建的 Posts,将不会返回这些元数据。目前,没有可用的 Enterprise Operator 与这些元数据匹配。要了解有关编辑 Post 元数据的更多信息,请参阅 Edit Posts fundamentals 页面。
2022
- 9月29日 - 自该日期起创建的所有 Post 对象均提供已编辑 Post 的 metadata。自该日期起,所有返回 Post 对象的 Enterprise endpoint 也已更新以提供此 metadata。提供的编辑 metadata 包含 edit_history 和 edit_controls 对象。对于在 2022 年 9 月 27 日之前创建的 Posts,将不会返回这些 metadata。目前,没有可用的 Enterprise Operators 可与这些 metadata 匹配。要了解有关 Edit Post metadata 的更多信息,请参阅 Edit Posts fundamentals 页面。
过滤技巧
- 某些 metadata 带有“生效起始”日期,因此过滤可能会出现_假阴性_。这类搜索依赖的 Operators 使用了在整个或部分检索时段内尚不存在的 metadata。比如,如果你使用
has:images
Operator 搜索 Post,在 2011 年 7 月之前将不会有任何匹配结果。原因是该 Operator 仅匹配_原生_照片(通过 X 的用户界面附加到 Post)。若要获得更完整的照片分享类 Post 数据集,2011 年 7 月之前的过滤条件需要包含匹配常见图片托管站点 URL 的规则子句。 - 有些 metadata 是在 Post 发布到 X_之后_才被回填的。
- X 个人资料
- 原创或转发的 Post
- Post 的语言分类
- 带地理参照的 Post
- 含分享链接的媒体
X 个人资料
原始 Post 和转发
_is:retweet_
运算符可让用户包含或排除转发。使用该运算符的用户在处理 2009 年 8 月之前的 data 时,需要针对转发匹配(或不匹配)准备两种策略。对于 2009 年 8 月之前的时期,需要通过精确短语匹配检查 Post 消息本身是否符合 “@RT ” 模式(实际上,如果你在筛选 2009 年 5 月至 8 月之间的转发,还应包含 “Via @” 模式)。对于 2009 年 8 月之后的时期,可使用 _is:retweet_
运算符。
Post 语言分类
对 Post 进行地理定位
- Post 正文中的地理指代。 在 Post 正文中基于地理相关表述进行匹配,虽然通常最具挑战(因为依赖本地知识),但可用于整个 Post 存档。此处 是一个 2006 年的示例,基于“golden gate”筛选对旧金山地区进行地理定位匹配。
-
用户为 Post 添加的地理标签(geo-tag)。 借助搜索 API,部分 Geo 运算符自 2010 年 3 月起即可用于匹配 Post,另一些则自 2015 年 2 月起可用:
- 2010 年 3 月 6 日:
has:geo
、bounding_box:
、point_radius:
- 2015 年 2 月 17 日:
place_country:
、place:
- 2010 年 3 月 6 日:
-
用户在账号资料中设置的“home”位置。 Profile Geo 运算符在 Historical PowerTrack 和 Search API 中均可用。对于 Search API,相关 Profile Geo metadata 自 2015 年 2 月起提供。对于早于 Profile Geo metadata 提供时间发布的 Post,可使用
bio_location:
运算符来匹配未经规范化的用户输入。
- 2006 年 10 月 26 日 -
has:links
- 2011 年 7 月 20 日 -
has:images
和has:media
- 2011 年 8 月 -
url:
,配合扩展 URL 富化。早至 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[] metadata。“youtube.com” 是一个示例,说明在没有任何 urls[] metadata 的情况下,消息内容也会匹配 url:youtube。 - 2015 年 2 月 10 日 - 面向原生视频的
has:videos
。在 2010/08/28 至 2015/02/10 期间,该 Operator 会匹配包含指向部分视频托管站点(如 youtube.com、vimeo.com 和 vivo.com)链接的 Posts。 - 2016 年 5 月 1 日 - 基于增强 URL 富化的
url_title:
和url_description:
,全面可用。首批增强 URL metadata 自 2014 年 12 月开始出现。
常见问题(FAQ)
常见的 Search Post API 问题
通过 data endpoint 我收到的 Post 数量与 counts endpoint 标识的 Post 数量不一致。为什么会这样?
通过 data endpoint 我收到的 Post 数量与 counts endpoint 标识的 Post 数量不一致。为什么会这样?
counts endpoint 与 data endpoint 提供的结果之间存在已知差异。你可能会在结果中看到不一致,这是因为 counts endpoint 属于合规处理之前(即不会计入已删除的 Post、地理信息清理等),而 data endpoint 在交付时已完成合规处理,并会纳入所有合规事件。
我没有收到本应匹配我query(查询)的Post。为什么?
我没有收到本应匹配我query(查询)的Post。为什么?
这可能发生的原因有几种,包括:
- 您预期看到的 Post 来自受保护的账号
- data endpoint 会计入所有合规事件(这意味着已删除的 Posts、被清除的地理信息等将不会包含在响应中)。
我的query(查询)匹配到了一个Post,但其中包含了我用否定运算符排除的关键字。为什么会这样?
我的query(查询)匹配到了一个Post,但其中包含了我用否定运算符排除的关键字。为什么会这样?
这很可能是由于你不当使用了我们的高级规则和过滤功能所致。请在此处查阅我们的文档,并确保你了解构建规则时的相关限制。
是否有可用的库可以帮助我开始使用 Search Post API?
是否有可用的库可以帮助我开始使用 Search Post API?
是的,包括:
- Tweepy - 适用于使用标准的搜索/Posts 产品(Python)
- X API - 适用于使用标准的 Search Post API(Python)
- Search Posts Python 和 Search Posts Ruby - 两款适用于 Enterprise(以及 v2!)Search Post API 的优秀工具
在向该 data endpoint 发起请求时,我设置了 `maxResults`。返回的 Post 数量是否有可能少于我设置的值?
在向该 data endpoint 发起请求时,我设置了 `maxResults`。返回的 Post 数量是否有可能少于我设置的值?
是的。我们的 data endpoint 会在达到指定的
maxResults
,或经过 30 天后进行分页。例如,如果在某个 30 天周期内你有 800 个 Post,则需要发起两次请求才能获取完整结果,因为每次请求最多返回 500 个 Post(maxResults
)。再例如,如果第一个月只有 400 个 Post,第二个月有 100 个 Post,你同样需要发起两次请求才能获取完整结果,因为即使首次请求返回的 Post 少于指定的 maxResults
,分页仍会在 30 天后发生。匹配的Posts按什么顺序返回?
匹配的Posts按什么顺序返回?
Post 按时间倒序返回。例如,第一页结果将显示与 query(查询)匹配的最新 Post;分页将持续进行,直到结果中各 Post 的发布时间达到最初请求的
fromDate
为止。编辑 Post 会如何影响我的用量和计费?
编辑 Post 会如何影响我的用量和计费?
仅原始 Post 会用于计费。任何后续编辑都会被忽略,不会计入您的总体活动量。
Enterprise
我想进一步了解 Enterprise 级别的 Search Post API 的定价,并申请此项服务。我该如何操作?
我想进一步了解 Enterprise 级别的 Search Post API 的定价,并申请此项服务。我该如何操作?
我们的 Enterprise 解决方案提供可预测的定价,并可按需定制以满足您的业务需求。有关更多信息,请在此处提交申请。
如何构建符合我用例的规则集?
如何构建符合我用例的规则集?
我本月的请求上限/限额已用尽,但我需要访问更多data——我可以怎么做?
我本月的请求上限/限额已用尽,但我需要访问更多data——我可以怎么做?
请联系您在 X 的客户经理,他们可以协助您处理此事。
错误排查指南
- 请确保为各个 endpoint 使用了正确的参数(例如,
buckets
字段只能与 counts endpoint 搭配使用,不能用于 data endpoint) - 请再次确认
:product
、:account_name
和:label
字段是否正确。您可以在 GNIP Console 中找到:label
字段(仅限 Enterprise 客户)。
API 参考
Enterprise 搜索 API
- 30-Day Search API - 提供过去 30 天内发布的 Tweets。
- Full-Archive Search API - 提供最早可追溯到 2006 年的 Tweets,起始于 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
表示你要请求的搜索 endpoint,取值为30day
或fullarchive
。:account_name
是与你账户关联的名称(区分大小写),如在 console.gnip.com 中所示:label
是与你搜索 endpoint 关联的标签(区分大小写),如在 console.gnip.com 中所示
- Data endpoint: https://gnip-api.x.com/search/30day/accounts/TwitterDev/prod.json
- Counts endpoint: https://gnip-api.x.com/search/30day/accounts/TwitterDev/prod/counts.json
:product
、:account_name
和 :label
。要使用这些示例,请务必将 URL 替换为你的具体信息。
身份验证
请求/响应行为
fromDate
和 toDate
参数,您可以请求 API 支持的任意时间段。30-Day 搜索 API 提供最近 31 天内的 Tweets(尽管名为“30-Day” API,但为便于用户发起整月请求,实际可用范围为 31 天)。Full-Archive 搜索 API 提供可追溯至第一条 Tweet(2006 年 3 月 21 日)的 Tweets。不过,单个响应的返回将受限于您指定的 maxResults 或 31 天二者中较小的值。如果匹配的 data 或您的时间范围超过您指定的 maxResults 或 31 天,您将收到一个 next 令牌,应使用该令牌对指定时间范围的其余结果进行分页。
例如,假设您使用 Full-Archive 搜索,并希望获取 2017 年 1 月 1 日至 2017 年 6 月 30 日期间与您的 query(查询)匹配的所有 Tweets。您将在请求中使用 fromDate
和 toDate
参数指定这整整六个月的时间段。搜索 API 将返回第一“页” Tweets,其数量与您的 maxResults
参数相匹配(默认值为 100)。若还有更多 Tweets(通常会有),API 还会提供一个 next 令牌,使您能够请求下一“页”的 data。此过程将重复,直至 API 不再返回 next 令牌。有关更多详细信息,请参见下一节。
分页
数据分页
maxResults
参数的默认值为 100,可设置在 10–500 的范围内。如果你的 query 匹配的 Tweets 数量超过请求中使用的 maxResults
参数,响应将包含一个 next
令牌(作为根级 JSON 属性)。该 next
令牌用于后续请求,以获取该 query 的下一部分匹配的 Tweets(即下一“页”)。在到达该 query 的最后一“页”且不再提供 next
令牌之前,系统会持续返回 next
令牌。
要请求下一“页”数据,必须发起与原始请求完全相同的查询(如使用),包括 query
、toDate
和 fromDate
参数,并包含一个 next
请求参数,取值为上一个响应返回的值。这可用于 GET 或 POST 请求。但在 GET 请求中,必须对 next
参数进行 URL 编码。
你可以持续传入上一次 query 返回的 next
元素,直至获取到该 query 所覆盖时间段内的所有 Tweets。当收到的响应不包含 next
元素时,表示你已到达最后一页,指定的 query 和时间范围内不再有其他可用数据。
计数分页
其他说明
- 在搜索请求中使用 fromDate 或 toDate 时,您只会获得位于指定时间范围内的结果。当到达该时间范围内的最后一组结果时,您将不会收到“next”令牌。
- “next”元素可与任意 10–500 范围内的 maxResults 值配合使用(默认值为 100)。maxResults 决定每个响应返回的 Tweet 数量,但不会阻止您最终获取全部结果。
- “next”元素不会过期。使用相同“next” query 的多次请求将获得相同结果,而与请求时间无关。
- 使用“next”参数对结果进行分页时,您可能会在 query 的边界处遇到重复项。您的应用程序应能够容忍这些重复。
data endpoint
POST /search/:product/:label
endpoint 模式:
数据请求参数
参数 | 说明 | 是否必需 | 示例值 |
---|---|---|---|
query | 等同于一条 PowerTrack 规则,最多 2,048 个字符(正向和负向子句数量不设上限)。 该参数应包含 PowerTrack 规则的所有部分,包括所有运算符;规则的任何部分都不应拆分到 query 的其他参数中。 注意: 并非所有 PowerTrack 运算符都受支持。受支持的运算符列在此处。 | 是 | (snow OR cold OR blizzard) weather |
tag | 可使用标签将规则及其匹配的 data 划分到不同的逻辑组中。若提供规则标签,该标签将包含在 ‘matching_rules’ 属性中。 建议为规则标签分配特定于规则的 UUID,并在客户端维护所需的映射关系。 | 否 | 8HYG54ZGTU |
fromDate | 提供 Tweets 的最早 UTC 时间戳(使用 Full-Archive 搜索可追溯至 2006/3/21)。时间戳粒度为分钟,且为包含(例如 12:00 包含第 00 分钟)。 已指定: 仅使用 fromDate 而不提供 toDate 参数时,将返回从现在起向后回溯至 fromDate 的 query 结果。 未指定: 如果未指定 fromDate,API 将返回从 now() 起或至 toDate(若已指定)之前 30 天内的所有结果。 如果既未使用 fromDate 也未使用 toDate 参数,API 将返回最近 30 天内的所有结果,从请求时刻开始向后回溯。 | 否 | 201207220000 |
toDate | 提供 Tweets 的最新(最近)UTC 时间戳。时间戳粒度为分钟,且为不包含(例如 11:59 不包含该小时的第 59 分钟)。 已指定: 仅使用 toDate 而不提供 fromDate 参数时,将返回 toDate 之前最近 30 天的数据。 未指定: 如果未指定 toDate,API 将返回从 now() 起向后回溯至 fromDate 的 query 的所有结果。 如果既未使用 fromDate 也未使用 toDate 参数,API 将返回整个 30 天索引内的所有结果,从请求时刻开始向后回溯。 | 否 | 201208220000 |
maxResults | 单个请求可返回的搜索结果最大数量。取值范围为 10 到系统上限(当前为 500)。默认情况下,响应将返回 100 个结果。 | 否 | 500 |
next | 用于获取下一“页”结果的参数,详见此处。该参数的取值直接来自 API 返回的响应,不应修改。 | 否 | NTcxODIyMDMyODMwMjU1MTA0 |
其他详细信息
可用时间范围 | 30-Day:过去 31 天 Full-Archive:2006 年 3 月 21 日至今 |
Query 格式 | 等同于一条 PowerTrack 规则,最多 2,048 个字符(正负子句数量不受限制)。 **注意:**并非所有 PowerTrack 运算符都受支持。有关受支持运算符的列表,请参见 Available operators。 |
请求速率限制 | 合作伙伴将在分钟级和秒级两个粒度上受到请求速率限制。每分钟的请求速率限制将依据合同在不同合作伙伴之间有所差异。但这些每分钟的限制并非用于一次性突发耗尽。无论您的每分钟请求速率限制是多少,所有合作伙伴每秒最多仅限 20 个请求,该限制在所有 data 和/或计数请求中聚合计算。 |
合规性 | 通过 Full-Archive Search API 交付的所有数据在交付时均处于合规状态。 |
实时可用性 | 数据在 X 平台生成后的 30 秒内即可被索引并可用 |
data 请求与响应示例
示例 POST 请求
- 如下所示,POST 请求的请求参数通过 JSON 格式的请求体发送。
- 需要查询的 PowerTrack 规则的所有组成部分(例如关键词、以及 bounding_box: 等其他运算符)都应放在 ‘query’ 参数中。
- 请勿将规则的各个部分拆分为查询 URL 中的独立参数。
示例 GET 请求
- 在 GET 请求中,请求参数会采用标准 URL 编码并附加到 URL 中。
- 要查询的 PowerTrack 规则的各个部分(例如关键词、以及诸如 bounding_box: 之类的其他运算符)都应放在 query 参数中。
- 请不要在查询 URL 中将规则的部分拆分为单独的参数。
示例数据响应
计数 endpoint
/search/:stream/counts
endpoint 模式:
/search/fullarchive/accounts/:account_name/:label/counts.json
此 endpoint 返回指定 query(查询)的计数(数据量)data。若未指定时间范围,时间参数默认取过去 30 天。数据量将以带时间戳的数组返回,可按天、按小时(默认)或按分钟聚合。
注意: 也可通过将下文所述参数编码到 URL 中,使用 GET 请求(而非 POST)来实现相同功能。
计数请求参数
Parameters | 描述 | 是否必需 | 示例值 |
---|---|---|---|
query | 等同于一条 PowerTrack 规则,最多 2,048 个字符(正向与负向子句的数量不受限制)。 此参数应包含该 PowerTrack 规则的所有部分,包括全部运算符;规则的任一部分都不应拆分到 query 的其他参数中。 注意: 并非所有 PowerTrack 运算符均受支持。请参阅可用运算符以获取受支持运算符列表。 | Yes | (snow OR cold OR blizzard) weather |
fromDate | 提供 tweets 的最早 UTC 时间戳(最早可追溯至 2006/3/21)。时间戳粒度为分钟,且为包含(例如 12:00 包含第 00 分钟)。 已指定: 仅指定 fromDate 而未提供 toDate 时,API 将从当前时刻向前回溯至 fromDate,返回该 query(查询)的计数(数据量)。如果 fromDate 早于当前时间超过 31 天,将返回 next 令牌以分页。 未指定: 如果未指定 fromDate,API 将返回从当前时刻或(如已指定)toDate 起向前 30 天的计数(数据量)。 如果既未使用 fromDate 也未使用 toDate,API 将返回最近 30 天的计数(数据量),从请求发起时刻开始向后计算。 | No | 201207220000 |
toDate | 提供 tweets 的最新(最近)UTC 时间戳。时间戳粒度为分钟,且为不包含(例如 11:59 不包含该小时的第 59 分钟)。 已指定: 仅指定 toDate 而未提供 fromDate 时,将返回 toDate 之前 30 天内的最新计数(数据量)。 未指定: 如果未指定 toDate,API 将向前回溯至 fromDate,返回该 query(查询)的计数(数据量)。如果 fromDate 早于当前时间超过 31 天,将返回 next 令牌以分页。 如果既未使用 fromDate 也未使用 toDate,API 将返回最近 30 天的计数(数据量),从请求发起时刻开始向后计算。 | No | 201208220000 |
bucket | 提供计数数据的时间单位。可在请求的时间范围内按天、小时或分钟返回计数数据。默认按小时返回。可选值:‘day’、‘hour’、‘minute’ | No | minute |
next | 用于获取下一“页”结果,详见此处。该参数的取值直接来自 API 的响应,且不应修改。 | No | NTcxODIyMDMyODMwMjU1MTA0 |
其他详细信息
可用时间范围 | 30-Day:过去 31 天 Full-Archive:2006 年 3 月 21 日至今 |
查询格式 | 相当于一条 PowerTrack 规则,最多 2,048 个字符。 **注意:**并非所有 PowerTrack 运算符均受支持。请参阅 Available operators 获取受支持的运算符列表。 |
请求速率限制 | 合作伙伴将同时在分钟级和秒级受到请求速率限制。每分钟的请求速率限制将按合同约定,因合作伙伴而异。但这些每分钟的限制并非用于一次性突发使用。无论您的每分钟请求速率限制如何,所有合作伙伴的每秒请求上限均为 20 次,该上限在所有 data 和/或计数请求间聚合计算。 |
计数精度 | 通过此 endpoint 提供的计数反映实际发生的 Tweet 数量,不包括任何后续的合规事件(删除、scrub geos)。由于用户合规操作,被计数的某些 Tweet 可能无法通过 data endpoint 获取。 |
计数请求和响应示例
示例 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 | 由于 query(查询)中存在无效参数而返回,例如无效的 PowerTrack 规则。 |
429 | Unknown Code | 您的 App 已超出连接请求的限制。相应的 JSON 消息类似如下: |
500 | Internal Server Error | 服务器端发生错误。请使用指数退避策略重试请求。 |
502 | Proxy Error | 服务器端发生错误。请使用指数退避策略重试请求。 |
503 | Service Unavailable | 服务器端发生错误。请使用指数退避策略重试请求。 |