freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Twitter最新接口浅析(非爬虫)
hb菠菜的菠 2025-02-14 11:27:31 81591
所属地 上海

前言

本文旨在对 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

可试读前30%内容
¥ 19.9 全文查看
9.9元开通FVIP会员
畅读付费文章
最低0.3元/天
# web安全 # Twitter # Python爬虫
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 hb菠菜的菠 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
hb菠菜的菠 LV.1
这家伙太懒了,还未填写个人描述!
  • 1 文章数
  • 0 关注者
文章目录