Twitter最新接口浅析(非爬虫)

2025-02-19 5 0

前言

本文旨在对 Twitter 的相关接口进行技术性分析,探讨其实现方式和应用场景。需要特别强调的是,本文仅限于对接口实现的研究和讨论,不涉及任何形式的数据抓取、爬虫或未经授权的数据收集行为。作者坚决遵守相关法律法规,尊重平台的使用政策和用户隐私权。任何因滥用技术手段进行数据抓取或侵犯他人隐私的行为,均与作者无关,且作者对此类行为不予支持。在阅读和参考本文时,读者应确保自身行为合法合规,避免触犯相关法律法规。再次声明,本文的所有内容仅供技术研究和学习之用,不得用于任何非法用途。

graphql语句解析

GraphQL 是一种由 Facebook 开发的 API 查询语言,其核心优势在于:

  • 客户端可以指定精确需要的数据(避免过多或不足的数据传输)。

  • 使用单个端点来处理多种数据请求。

  • 通过类型系统(schema)明确数据结构。
    在这里,Twitter(现称 X)利用 GraphQL 技术,将查询封装成持久化查询,通过 URL 里的查询 ID 以及后续传递的参数来获取数据。

https://x.com/i/api/graphql/U3QTLwGF8sZCHDuWIMSAmg/SearchTimeline?variables=&features=

这个请求使用了 GET 方法,其参数都被放在 URL 后面,主要有两个参数:variablesfeatures

参数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的获取

推特的分页游标并不完全按照“有更多数据就返回非空,否则为空”的传统模式来设计,而是一种内部状态标记机制,用来指示时间线当前的边界和状态。具体来说,有以下几点原因:

  1. 动态时间线特性
    推特的时间线是一个动态更新的数据流,哪怕你当前拿到的是“最后一页”的数据,实际上新的推文可能随时被添加。因此,API 通常会返回一个“游标”值,作为当前时间线的边界标识,而不是直接返回空值。这个游标可以在后续的请求中用于检测是否有新增数据。

  2. 内部状态与一致性设计
    推特内部分页接口设计时,为了保证前端逻辑的一致性,总是返回两个游标(例如一个“Top”游标和一个“Bottom”游标)。即使没有更多旧数据,底部游标仍然存在,并可能返回一个固定的或占位的值。这样前端处理分页时,无需额外判断游标是否为空,而只需根据游标值去发起下一次请求,看返回的数据是否发生变化。

  3. 分页并非静态终点
    分页游标在推特中更多是一个指针,它标记了当前时间线在数据流中的位置,而不是“是否还有数据”的绝对标志。即使你已经浏览了所有已加载的旧数据,那个游标依然可以用来请求“下一批”数据——哪怕下一次请求可能返回空数组或与前次数据重复。这种设计允许系统在数据变动时保持连贯性。

综上所述,当你发现最后一页返回的分页游标依然有值时,这并不意味着后面一定还有更多结果,而是说明推特仍然在用这个游标来维护和标识时间线的当前位置。这是一种设计策略,主要考虑到时间线是实时动态变化的,而不是一个静态的分页列表。所以当我们爬去数据时应该通过cursor一致性进行分页判断,当最新的cursor


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

从中国视角看 NSA(方程式组织)的 TTP(攻击套路)
利用 cve-2023-33476 进行远程代码执行
黑客通过漏洞组合攻击获得Palo Alto防火墙的root权限
DeepSeek本地化部署有风险!快来看看你中招了吗?
java代码审计 | spring mvc路由详解
ATT&CK实战系列-红队实战(一)

发布评论