前言
本文旨在对 Twitter 的相关接口进行技术性分析,探讨其实现方式和应用场景。需要特别强调的是,本文仅限于对接口实现的研究和讨论,不涉及任何形式的数据抓取、爬虫或未经授权的数据收集行为。作者坚决遵守相关法律法规,尊重平台的使用政策和用户隐私权。任何因滥用技术手段进行数据抓取或侵犯他人隐私的行为,均与作者无关,且作者对此类行为不予支持。在阅读和参考本文时,读者应确保自身行为合法合规,避免触犯相关法律法规。再次声明,本文的所有内容仅供技术研究和学习之用,不得用于任何非法用途。
graphql语句解析
GraphQL 是一种由 Facebook 开发的 API 查询语言,其核心优势在于:
-
客户端可以指定精确需要的数据(避免过多或不足的数据传输)。
-
使用单个端点来处理多种数据请求。
-
通过类型系统(schema)明确数据结构。
在这里,Twitter(现称 X)利用 GraphQL 技术,将查询封装成持久化查询,通过 URL 里的查询 ID 以及后续传递的参数来获取数据。
https://x.com/i/api/graphql/U3QTLwGF8sZCHDuWIMSAmg/SearchTimeline?variables=&features=
这个请求使用了 GET 方法,其参数都被放在 URL 后面,主要有两个参数:
variables
和features
。参数
variables
是一个经过 URL 编码的 JSON 字符串。解码后内容大致如下:
{
"rawQuery": "美国经济 until:2025-02-07 since:2025-02-06",
"count": 20,
"cursor": "DAACCgACGjPuTG9AJxAKAAMaM-5Mbz9jwAgABAAAAAILAAUAAAJQ... (长字符串,用于分页)",
"querySource": "typed_query",
"product": "Top"
}
-
rawQuery:这是用户输入的原始搜索字符串。示例中为
"美国经济 until:2025-02-07 since:2025-02-06"
,表示搜索与“美国经济”相关的内容,同时限定时间范围(从 2025-02-06 至 2025-02-07)。 -
count:指定本次查询希望返回的结果数量,此处为
20
,即请求最多 20 条数据。 -
cursor:用于分页(或获取下一页数据)的标识符。它是一个经过编码的字符串,服务端会根据这个值返回后续的数据片段。如果是首次请求,该字段可能为空或不传;在分页请求中,它用来指示上次查询的结束位置。
-
querySource:表明查询的来源方式,此处
"typed_query"
表示查询是用户在搜索框中输入而产生的。 -
product:可能表示当前请求所对应的产品或结果类型,比如
"Top"
可能表示请求的是“热门”或“精选”内容。 -
features:同样经过 URL 编码,解码后的 JSON 对象包含一系列布尔型开关,例如:
{
"profile_label_improvements_pcf_label_in_post_enabled": true,
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"premium_content_api_read_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"responsive_web_grok_analyze_button_fetch_trends_enabled": false,
"responsive_web_grok_analyze_post_followups_enabled": true,
"responsive_web_jetfuel_frame": false,
"responsive_web_grok_share_attachment_enabled": true,
"articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"responsive_web_grok_analysis_button_from_backend": true,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_grok_image_annotation_enabled": true,
"responsive_web_enhance_cards_enabled": false
}
各个字段均为功能开关,用来告知服务器在返回数据时应启用或禁用哪些特性。例如:
-
profile_label_improvements_pcf_label_in_post_enabled
启用改进后的用户标签显示,可能影响推文中标签的展示样式。 -
verified_phone_label_enabled
设为 false 表示不启用已验证手机号的标签显示。 -
responsive_web_graphql_timeline_navigation_enabled
启用响应式网页中时间线的 GraphQL 导航功能。 -
articles_preview_enabled
启用文章预览功能,即当推文包含链接时返回预览信息。 -
longform_notetweets_consumption_enabled
启用对长文笔记型推文的支持。 -
responsive_web_edit_tweet_api_enabled
启用网页端编辑推文相关 API 的功能。 -
其他字段类似,基本上都是用来控制客户端展示、数据结构以及功能细节(例如视图计数、分享附件、分析按钮等)的开关。
每个开关帮助 Twitter 根据当前环境、用户状态以及前端需求动态调整返回的数据格式和功能。
cursor的获取
推特的分页游标并不完全按照“有更多数据就返回非空,否则为空”的传统模式来设计,而是一种内部状态标记机制,用来指示时间线当前的边界和状态。具体来说,有以下几点原因:
-
动态时间线特性
推特的时间线是一个动态更新的数据流,哪怕你当前拿到的是“最后一页”的数据,实际上新的推文可能随时被添加。因此,API 通常会返回一个“游标”值,作为当前时间线的边界标识,而不是直接返回空值。这个游标可以在后续的请求中用于检测是否有新增数据。 -
内部状态与一致性设计
推特内部分页接口设计时,为了保证前端逻辑的一致性,总是返回两个游标(例如一个“Top”游标和一个“Bottom”游标)。即使没有更多旧数据,底部游标仍然存在,并可能返回一个固定的或占位的值。这样前端处理分页时,无需额外判断游标是否为空,而只需根据游标值去发起下一次请求,看返回的数据是否发生变化。 -
分页并非静态终点
分页游标在推特中更多是一个指针,它标记了当前时间线在数据流中的位置,而不是“是否还有数据”的绝对标志。即使你已经浏览了所有已加载的旧数据,那个游标依然可以用来请求“下一批”数据——哪怕下一次请求可能返回空数组或与前次数据重复。这种设计允许系统在数据变动时保持连贯性。
综上所述,当你发现最后一页返回的分页游标依然有值时,这并不意味着后面一定还有更多结果,而是说明推特仍然在用这个游标来维护和标识时间线的当前位置。这是一种设计策略,主要考虑到时间线是实时动态变化的,而不是一个静态的分页列表。所以当我们爬去数据时应该通过cursor一致性进行分页判断,当最新的cursor
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)