跳转至

API 模块与任务指南

这份文档先回答“为了完成任务应该调用什么”,再链接到逐字段接口参考。 所有调用均通过 ThreadsClient 的异步子客户端完成。

参数来源约定

  • 用户输入:正文、搜索词、主题、位置、投票等业务输入。
  • 受保护账号配置:token、密码、2FA seed;不得出现在源码或日志。
  • 持久设备身份device_iduuidLoginDevice;同一账号长期复用。
  • 前置响应:必须从上一步真实响应提取,例如图片上传返回的 upload_id
  • 运行时生成:会话 ID、上传 ID、追踪 ID;按接口说明生成或交给 SDK。
  • 分页响应:上一页 next_cursor 只能用于同一接口、同一查询的下一页。

任务入口

任务 模块 状态 第一调用
校验现有 IGT:2 会话 (verify_session) 登录与当前账号 available AuthClient.get_current_user
账密登录并取得 IGT:2 (login) 登录与当前账号 experimental AuthClient.login
安全编辑当前账号资料 (edit_profile) 资料与主页帖子 available AuthClient.get_current_user
发布文本帖 (create_text_post) 帖子发布与删除 available PostsClient.create_text_post
发布单图帖 (create_image_post) 帖子发布与删除 available PostsClient.upload_image
发布视频帖 (create_video_post) 帖子发布与删除 unavailable 无可用接口
分页采集主页帖子 (collect_profile_threads) 资料与主页帖子 available ProfileClient.list_profile_threads

以下内容按业务模块展开。每个模块先列接口,再列需要多个接口协作的任务。

登录与当前账号

登录、校验会话并读取当前账号身份。

Python 入口:client.auth

本模块接口

接口 什么时候调用 状态
账号登录
AuthClient.login
没有可用 IGT:2,并且需要通过账密建立新会话时。 experimental
读取当前账号
AuthClient.get_current_user
校验 token 身份、取得当前 uid,或在资料编辑前读取完整原值时。 available

本模块任务

校验现有 IGT:2 会话 verify_session

  • 状态:available
  • 目标:确认 token 对应的真实账号,并取得后续调用使用的 uid 和资料字段。
  • 前置条件:ThreadsClient 已注入 IGT:2 token。;每个账号使用独立 proxy_url;不要让多账号共享出口。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 AuthClient.get_current_user
threads.auth.v1.AuthService/GetCurrentUser
调用 get_current_user(edit=False) 校验会话。 edit=False;token 和代理由 ThreadsClient metadata 自动注入。 核对 pk、username;将 pk 作为发帖 uid 或目标 user_id。

账密登录并取得 IGT:2 login

  • 状态:experimental
  • 目标:通过 CAA/Bloks 登录生成会话并即时核对账号身份。
  • 前置条件:准备持久化设备参数 LoginDevice。;生产使用必须在 Go server 通过 THREADS_KEYBOX_FILE 加载硬件 attestation signer;Docker 镜像从仓库根目录版本化 keybox.xml 构建。;无硬件证明登录属于高风险操作,必须得到明确授权。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 AuthClient.login
threads.auth.v1.AuthService/Login
提交账号、密码、设备和可选 2FA seed。 默认 allow_unattested_login=False;不要把密码或 2FA seed 写入日志。 核对 success、session.token、verified_user.username 和 assurance。
2 AuthClient.get_current_user
threads.auth.v1.AuthService/GetCurrentUser
用新 token 创建 ThreadsClient 后再次读取当前账号。 将 LoginResponse.session.token 注入 ThreadsClient.token。 确认 pk、username 与登录账号一致;即时成功不代表长期稳定。
步骤间参数传递
  • LoginResponse.session.tokenThreadsClient.token:登录返回的 IGT:2 用于后续全部业务 RPC。
当前缺失能力
  • 软件环境尚不能证明 session 可长期稳定;stable_for_automation 必须保持 false,直到硬件证明和存活观测通过。

资料与主页帖子

读取用户资料、保存当前账号资料并分页采集主页帖子。

Python 入口:client.profile

本模块接口

接口 什么时候调用 状态
读取指定用户资料
ProfileClient.get_user_info
已知用户 ID,需要读取公开资料和账号统计时。 available
分页读取主页帖子
ProfileClient.list_profile_threads
采集指定账号主页帖子、验证发帖或验证删除结果时。 available
保存当前账号资料
ProfileClient.edit_profile
修改用户名、显示名、简介、隐私状态或外部链接时。 available

本模块任务

安全编辑当前账号资料 edit_profile

  • 状态:available
  • 目标:修改指定资料字段,同时避免整表回传接口清空未携带的原值。
  • 前置条件:已有有效 IGT:2 token。;已持久化当前账号 uuid。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 AuthClient.get_current_user
threads.auth.v1.AuthService/GetCurrentUser
先调用 get_current_user(edit=True) 读取完整当前资料。 edit=True。 保存 username、full_name、biography、is_private、external_url 和 bio_links。
2 ProfileClient.edit_profile
threads.profile.v1.ProfileService/EditProfile
只替换目标字段,其余字段使用上一步原值并整表提交。 username/first_name/biography/is_private 必须完整回传;uuid 来自持久设备身份。 核对返回资料,再调用 get_current_user(edit=True) 验证保存结果。
步骤间参数传递
  • CurrentUser.username/full_name/biography/is_private/external_urlEditProfileRequest 对应字段:未修改字段必须回填原值,不能省略。
当前缺失能力
  • 头像和封面需要独立上传端点,当前契约未实现。
  • location 不是 EditProfile 端点字段。

分页采集主页帖子 collect_profile_threads

  • 状态:available
  • 目标:读取指定账号主页帖子,并使用游标持续翻页。
  • 前置条件:已有有效 IGT:2 token。;准备目标 user_id。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 ProfileClient.list_profile_threads
threads.profile.v1.ProfileService/ListProfileThreads
首次调用不传 max_id,读取 threads 强类型结果。 user_id 为目标账号;exclude_reposts 按采集需求设置。 消费 threads[].items[].post,并读取 next_cursor。
2 ProfileClient.list_profile_threads
threads.profile.v1.ProfileService/ListProfileThreads
next_cursor 非空时继续请求下一页。 将上一页 next_cursor 传入下一次 max_id。 next_cursor 为空时结束;raw_json 只用于未建模字段排错。
步骤间参数传递
  • ProfileThreadsPage.next_cursorListProfileThreadsRequest.max_id:分页游标来自上一次真实响应。

帖子发布与删除

检查文本、发布文本帖、上传图片、发布单图帖和删除帖子。

Python 入口:client.posts

本模块接口

接口 什么时候调用 状态
检查冒犯文本
PostsClient.check_offensive_text
发帖前希望执行上游文本风险检查时;当前真实上游返回 404。 known-upstream-error
创建文本帖
PostsClient.create_text_post
发布不带图片或视频的 Threads 文本帖子时。 available
上传图片
PostsClient.upload_image
创建单图帖前上传 WebP 图片二进制时。 available
创建单图帖
PostsClient.create_image_post
UploadImage 成功后,把已上传图片发布为单图帖子时。 available
删除帖子
PostsClient.delete_post
删除当前账号已有帖子或清理测试帖子时。 available

本模块任务

发布文本帖 create_text_post

  • 状态:available
  • 目标:使用当前账号和持久设备身份创建纯文本帖子。
  • 前置条件:已有有效 IGT:2 token。;已通过 get_current_user 取得 uid。;已持久化 device_id 和 uuid。;写操作已获得明确授权。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 PostsClient.create_text_post
threads.posts.v1.PostsService/CreateTextPost
提交 caption、uid、device_id、uuid 和可选发帖功能字段。 纯文本帖不需要先上传媒体;upload_id 可省略或由调用方生成。 核对返回 Media 的作者、caption、code 和 permalink。
2 ProfileClient.list_profile_threads
threads.profile.v1.ProfileService/ListProfileThreads
重新读取账号主页确认帖子真实出现。 user_id 使用发帖 uid。 在 threads[].items[].post 中找到新帖子。
步骤间参数传递
  • CurrentUser.pkCreateTextPostRequest.uid:发帖 uid 来自当前账号身份校验。

发布单图帖 create_image_post

  • 状态:available
  • 目标:先上传 WebP 图片,再用上传结果创建单图帖子。
  • 前置条件:已有有效 IGT:2 token。;已通过 get_current_user 取得 uid。;已持久化 device_id 和 uuid。;准备 WebP 图片字节及真实宽高。;写操作已获得明确授权。
步骤 调用接口 目的 输入与参数来源 响应与下一步
1 PostsClient.upload_image
threads.posts.v1.PostsService/UploadImage
上传图片二进制及真实宽高。 image_data 为 WebP bytes;original_width/original_height 来自图片元数据。 要求 status=ok,并保存响应 upload_id。
2 PostsClient.create_image_post
threads.posts.v1.PostsService/CreateImagePost
使用上传响应创建单图帖。 upload_id 必须使用 UploadImageResult.upload_id;宽高与上传步骤保持一致。 核对 media_type=1、caption、image_versions2 和帖子作者。
3 ProfileClient.list_profile_threads
threads.profile.v1.ProfileService/ListProfileThreads
重新读取账号主页确认图片帖真实出现。 user_id 使用发帖 uid。 在 threads[].items[].post 中找到新帖子和图片字段。
步骤间参数传递
  • UploadImageResult.upload_idCreateImagePostRequest.upload_id:图片上传返回值必须原样传给创建接口。
  • UploadImageRequest.original_width/original_heightCreateImagePostRequest.original_width/original_height:创建接口使用与上传图片一致的真实尺寸。

发布视频帖 create_video_post

  • 状态:unavailable
  • 目标:上传视频并创建视频帖子。
  • 前置条件:无

当前没有可执行调用步骤。

当前缺失能力
  • 当前 Proto、Go SDK 和 Python 门面均没有视频上传 RPC。
  • 当前没有视频 configure RPC、视频转码状态查询或封面上传工作流。
  • 在完成真实抓包、契约和黑盒测试前,禁止复用 UploadImage/CreateImagePost 伪装视频发布。

回复采集

分页读取指定账号的回复列表。

Python 入口:client.replies

本模块接口

接口 什么时候调用 状态
分页读取账号回复
RepliesClient.list_profile_replies
采集指定账号发布的回复时。 available
## 搜索与主题校验

关键词搜索以及发帖主题标签校验。

Python 入口:client.search

本模块接口

接口 什么时候调用 状态
关键词搜索
SearchClient.keyword_search
按关键词查找 Threads 账号或内容时。 available
校验发帖主题
SearchClient.validate_tag
发帖前需要确认主题标签是否有效或敏感时。 available
## 推荐用户

分页读取 Threads 推荐账号。

Python 入口:client.feed

本模块接口

接口 什么时候调用 状态
读取推荐用户
FeedClient.list_recommended_users
需要获取 Threads 推荐账号或继续推荐流分页时。 available
## 关系状态

读取与目标账号之间的关注、拉黑和静音状态。

Python 入口:client.friendships

本模块接口

接口 什么时候调用 状态
读取关系状态
FriendshipsClient.get_friendship_status
需要确认当前账号是否关注、被关注、拉黑或静音目标账号时。 available
## 账号洞察

读取账号洞察;当前缺少真实 GraphQL doc_id,尚不可用。

Python 入口:client.insights

本模块接口

接口 什么时候调用 状态
读取账号洞察
InsightsClient.get_account_insights
需要账号洞察数据时;当前接口尚不可用。 unimplemented
## 提及建议

获取 @ 提及建议;当前缺少真实 GraphQL doc_id,尚不可用。

Python 入口:client.mentions

本模块接口

接口 什么时候调用 状态
获取提及建议
MentionsClient.get_mention_suggestions
输入 @ 用户名时需要候选建议;当前接口尚不可用。 unimplemented