# go-twitter-api 完整接口语义 > Go 实现的 X(Twitter)客户端协议执行器,通过 gRPC 为 Python 应用提供异步调用能力。 发布版本:v0.2.3(通道 pro) Python SDK:0.2.3 镜像标签:0.2.3 提交:71157c1dd2d8 ## 平台状态 - **android**:可用。命名空间 `twitter_sdk.x.android`,会话形式 OAuth 1.0a(oauth_token + oauth_secret),服务 AndroidApi, PostsApi, MediaApi, UsersApi, TimelineApi。 - **ios:当前不可调用**(unimplemented)。本项目尚未提供该平台的任何 RPC,调用其命名空间会失败。尚无任何 RPC。调用方现在无法通过本项目访问 iOS 客户端协议。 - **web:当前不可调用**(unimplemented)。本项目尚未提供该平台的任何 RPC,调用其命名空间会失败。尚无任何 RPC。调用方现在无法通过本项目访问 Web 客户端协议。 ## 状态口径 - `verified`:实现完成**且**真机验收通过(附日期)。 - `implemented`:实现完成、可调用,但**尚未真机验收**;不得据此宣称功能已验证。 - `unimplemented`:未实现,不可调用。 ## 接口清单 ### AndroidApi #### AndroidApi/Login > Login runs the full Android cold-start login and returns the complete AndroidAccountState. The caller MUST persist the returned device — later RPCs must not regenerate it. - Python 门面:`x.android.AndroidClient.login` - 平台:android - 类型:write,幂等:否 - 状态:已真机验收(2026-08-11) - 需要 AccountState:否 - 副作用: - 在 X 平台创建一个新的登录会话,可能触发风控与设备绑定 - 消耗账号的登录频次配额 - 业务成功判据:返回的 AndroidAccountState.session 中 user_id / screen_name 与登录账号一致,且服务端已用 account/settings.json 正面复核同一账号。HTTP 2xx 或响应里出现某个 token 字段都不作为成功判据。 - 说明:跨端点登录状态机,是「一端点一 RPC」的唯一受控例外。调用方必须持久化返回的完整状态(含设备),后续 RPC 禁止重新生成设备。 请求 `LoginRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `username` (#1) | `string` | - | - | | `password` (#2) | `string` | - | - | | `totp` (#3) | `string` | - | totp is the current 2FA code; empty when the account has no 2FA. | | `version` (#4) | `string` | optional | version selects the client build (default latest); optional. | | `proxy` (#5) | `string` | optional | proxy dials upstream through this URL (http/https/socks5); optional. | | `attest_account_id` (#6) | `string` | optional | attest_account_id binds attestation during the guest phase; optional. | 响应 `LoginResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | ### MediaApi #### MediaApi/UploadMedia > UploadMedia runs the segmented INIT→APPEND→FINALIZE flow and returns a media_id for CreatePost. Returns the refreshed state (attest re-minted). - Python 门面:`account.media.upload` - 平台:android - 类型:write,幂等:否 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 在 X 媒体服务上创建一份待引用的媒体对象 - 业务成功判据:响应 media_id 非空。 - 说明:尚未真机验收。分段 INIT→APPEND→FINALIZE 全流程在单个 RPC 内完成。media_id 有有效期,应尽快用于 CreatePost。 请求 `UploadMediaRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `data` (#2) | `bytes` | - | raw image bytes | | `mime_type` (#3) | `string` | - | default image/jpeg | | `media_category` (#4) | `string` | - | default tweet_image | 响应 `UploadMediaResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `media_id` (#2) | `string` | - | - | ### PostsApi #### PostsApi/CreatePost > CreatePost publishes text (+ optional media_ids from UploadMedia). - Python 门面:`account.posts.create` - 平台:android - 类型:write,幂等:否 - 状态:已真机验收(2026-08-11) - 需要 AccountState:是 - 副作用: - 在目标账号下公开发布一条推文 - 业务成功判据:响应 tweet.tweet_id 非空。 - 说明:media_ids 来自 MediaApi/UploadMedia。重复调用会产生多条推文,重试前必须先确认上一次是否已成功。 请求 `CreatePostRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `text` (#2) | `string` | - | - | | `media_ids` (#3) | `string` | repeated | - | 响应 `CreatePostResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `tweet` (#2) | `Tweet`(见消息定义) | - | - | #### PostsApi/DeletePost > DeletePost deletes a tweet by id. - Python 门面:`account.posts.delete` - 平台:android - 类型:write,幂等:是 - 状态:已真机验收(2026-08-11) - 需要 AccountState:是 - 副作用: - 永久删除目标推文,不可恢复 - 业务成功判据:RPC 正常返回且未抛出 gRPC 错误。 - 说明:对已删除的推文重复调用不会产生新的副作用。 请求 `DeletePostRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | 响应 `DeletePostResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | #### PostsApi/Like > Like favorites a tweet. - Python 门面:`account.posts.like` - 平台:android - 类型:write,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 在目标推文上留下本账号的点赞记录,对方可见 - 业务成功判据:RPC 正常返回且未抛出 gRPC 错误。 - 说明:尚未真机验收。重复点赞不会叠加。 请求 `EngageRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | 响应 `EngageResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | #### PostsApi/Quote > Quote posts text quoting a tweet (returns the new tweet). - Python 门面:`account.posts.quote` - 平台:android - 类型:write,幂等:否 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 公开发布一条引用推文 - 业务成功判据:响应 tweet.tweet_id 非空。 - 说明:尚未真机验收。 请求 `QuoteRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `quoted_tweet_id` (#2) | `string` | - | - | | `text` (#3) | `string` | - | - | | `media_ids` (#4) | `string` | repeated | - | 响应 `CreatePostResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `tweet` (#2) | `Tweet`(见消息定义) | - | - | #### PostsApi/Reply > Reply posts text as a reply to a tweet (returns the new tweet). - Python 门面:`account.posts.reply` - 平台:android - 类型:write,幂等:否 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 在目标推文下公开发布一条回复 - 业务成功判据:响应 tweet.tweet_id 非空。 - 说明:尚未真机验收。 请求 `ReplyRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `in_reply_to_tweet_id` (#2) | `string` | - | - | | `text` (#3) | `string` | - | - | | `media_ids` (#4) | `string` | repeated | - | 响应 `CreatePostResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `tweet` (#2) | `Tweet`(见消息定义) | - | - | #### PostsApi/Retweet > Retweet reposts a tweet. - Python 门面:`account.posts.retweet` - 平台:android - 类型:write,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 在本账号时间线公开转发目标推文 - 业务成功判据:RPC 正常返回且未抛出 gRPC 错误。 - 说明:尚未真机验收。 请求 `EngageRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | 响应 `EngageResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | #### PostsApi/Unlike > Unlike removes a favorite. - Python 门面:`account.posts.unlike` - 平台:android - 类型:write,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 撤销本账号对目标推文的点赞 - 业务成功判据:RPC 正常返回且未抛出 gRPC 错误。 - 说明:尚未真机验收。 请求 `EngageRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | 响应 `EngageResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | #### PostsApi/Unretweet > Unretweet removes a repost (tweet_id = the ORIGINAL/source tweet id). - Python 门面:`account.posts.unretweet` - 平台:android - 类型:write,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用: - 撤销本账号对目标推文的转发 - 业务成功判据:RPC 正常返回且未抛出 gRPC 错误。 - 说明:尚未真机验收。★入参 tweet_id 必须是原始推文 id,不是转发产生的推文 id。 请求 `EngageRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | 响应 `EngageResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | ### TimelineApi #### TimelineApi/HomeTimeline > HomeTimeline returns the launch home feed (raw). - Python 门面:`account.timeline.home` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 raw_json 为可解析的非空 JSON。 - 说明:尚未真机验收。时间线是体量大且易变的 GraphQL 树,以 raw_json 往返,调用方自行解析所需字段。 请求 `HomeTimelineRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | 响应 `TimelineResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `raw_json` (#2) | `string` | - | untouched GraphQL timeline payload | #### TimelineApi/UserTweets > UserTweets returns a user's own posts timeline (raw). - Python 门面:`account.timeline.user_tweets` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 raw_json 为可解析的非空 JSON。 - 说明:尚未真机验收。 请求 `UserTweetsRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | 响应 `TimelineResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `raw_json` (#2) | `string` | - | untouched GraphQL timeline payload | ### UsersApi #### UsersApi/Me > Me returns the logged-in user's own profile. - Python 门面:`account.users.me` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 user 非空且 rest_id 与当前会话账号一致。 - 说明:尚未真机验收。返回关键字段 + 原始 raw_json。 请求 `MeRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | 响应 `UserResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `user` (#2) | `User`(见消息定义) | - | - | #### UsersApi/ProfileAnalytics > ProfileAnalytics returns raw impressions over [from_time,to_time] (RFC3339 Z). - Python 门面:`account.users.profile_analytics` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 raw_json 为可解析的非空 JSON。 - 说明:尚未真机验收。时间区间用 RFC3339 Z 格式。 请求 `ProfileAnalyticsRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | | `from_time` (#3) | `string` | - | RFC3339 Z | | `to_time` (#4) | `string` | - | - | 响应 `RawResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `raw_json` (#2) | `string` | - | - | #### UsersApi/ProfileModules > ProfileModules returns the raw profile-page modules. - Python 门面:`account.users.profile_modules` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 raw_json 为可解析的非空 JSON。 - 说明:尚未真机验收。返回未经处理的 GraphQL 结构,字段随上游变动,调用方需自行做容错解析。 请求 `ProfileModulesRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | 响应 `RawResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `raw_json` (#2) | `string` | - | - | #### UsersApi/UserByRestID > UserByRestID returns a profile by numeric rest_id. - Python 门面:`account.users.by_rest_id` - 平台:android - 类型:read,幂等:是 - 状态:已实现,未真机验收 - 需要 AccountState:是 - 副作用:无(只读) - 业务成功判据:响应 user 非空。 - 说明:尚未真机验收。入参是数字 rest_id,不是 @screen_name。 请求 `UserByRestIDRequest`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | 响应 `UserResponse`: | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `user` (#2) | `User`(见消息定义) | - | - | ## 任务编排 多步任务的推荐顺序与步骤间参数传递。 ### 首次接入一个账号(`first_login`) 目标:用账号密码(可选 2FA)完成 Android 冷启动登录,产出可长期复用的完整状态。 - 前置:已启动 Go server 并可连通 - 前置:持有自有测试/业务账号的用户名、密码,账号开启 2FA 时还需当前验证码 1. `AndroidApi/Login` — 执行跨端点登录状态机并即时验证会话归属。 - Python:`x.android.AndroidClient.login` - 输入:username / password 来自调用方;totp 为当前 2FA 码,账号无 2FA 时省略;version 与 proxy 可选。 - 输出:返回完整 AndroidAccountState。★必须持久化★——其中含设备身份,后续调用复用。 - 幂等:否;验收:已真机验收 - 参数传递:`LoginResponse.state` → `调用方持久化存储`(状态含明文 token 与 secret,必须加密存储;后续每个 RPC 都从这里取。) - 注意:同一账号不要并发登录,也不要在每次操作前重新登录——保存的状态可长期复用。 - 注意:成功判据不是 HTTP 2xx,而是会话中的 user_id/screen_name 与登录账号一致且服务端已 whoami 复核。 ### 发布纯文字推文(`post_text`) 目标:用已保存的状态发一条文字推文,并在需要时删除。 - 前置:已持有登录产出的完整 AccountState 1. `PostsApi/CreatePost` — 发布文字推文。 - Python:`account.posts.create` - 输入:state 来自持久化存储;text 为正文;media_ids 留空。 - 输出:响应 tweet.tweet_id 非空即成功;同时保存刷新后的 state。 - 幂等:否;验收:已真机验收 2. `PostsApi/DeletePost` — 按 id 删除刚发布的推文(可选)。 - Python:`account.posts.delete` - 输入:tweet_id 使用上一步响应的 tweet.tweet_id。 - 输出:无异常即删除成功;该操作幂等。 - 幂等:是;验收:已真机验收 - 参数传递:`CreatePostResponse.tweet.tweet_id` → `DeletePostRequest.tweet_id`(删帖必须用发帖响应返回的 id。) - 注意:CreatePost 非幂等:超时后先查证是否已发出再决定重试,盲目重试会产生重复推文。 ### 发布带图推文(`post_with_media`) 目标:先上传媒体拿到 media_id,再用它发布带图推文。 - 前置:已持有完整 AccountState - 前置:准备好图片字节与其 MIME 类型 1. `MediaApi/UploadMedia` — 分段上传媒体(INIT→APPEND→FINALIZE 在单个 RPC 内完成)。 - Python:`account.media.upload` - 输入:data 为图片二进制;mime_type 如 image/jpeg。 - 输出:响应 media_id 非空即成功。media_id 有有效期,应尽快使用。 - 幂等:否;验收:未验收 2. `PostsApi/CreatePost` — 发布引用该媒体的推文。 - Python:`account.posts.create` - 输入:media_ids 传上一步的 media_id;text 为正文。 - 输出:响应 tweet.tweet_id 非空即成功。 - 幂等:否;验收:已真机验收 - 参数传递:`UploadMediaResponse.media_id` → `CreatePostRequest.media_ids`(上传返回值原样放入 media_ids 列表;跨账号不可复用。) - 注意:两步都非幂等,且 media_id 有有效期——上传后应立即发帖,不要缓存待用。 ### 互动(点赞 / 转发及其撤销)(`engage`) 目标:对目标推文点赞、转发,或撤销这些操作。 - 前置:已持有完整 AccountState - 前置:已知目标推文 id 1. `PostsApi/Like` — 点赞目标推文(撤销用 Unlike)。 - Python:`account.posts.like` - 输入:tweet_id 为目标推文 id。 - 输出:无异常即成功;幂等,重复点赞不叠加。 - 幂等:是;验收:未验收 2. `PostsApi/Retweet` — 转发目标推文。 - Python:`account.posts.retweet` - 输入:tweet_id 为目标推文 id。 - 输出:无异常即成功;幂等。 - 幂等:是;验收:未验收 3. `PostsApi/Unretweet` — 撤销转发。 - Python:`account.posts.unretweet` - 输入:★tweet_id 必须是原始推文 id,不是转发产生的那条推文的 id★。 - 输出:无异常即成功;传错 id 会静默失败。 - 幂等:是;验收:未验收 - 参数传递:`原始推文 id` → `UnretweetRequest.tweet_id`(撤销转发用的是被转发的原推文 id,这一点最容易传错。) - 注意:四个互动操作都幂等,但都会在目标推文上留下对方可见的痕迹。 ### 读取资料与时间线(`read_profile_and_timeline`) 目标:读取自身或指定用户的资料,以及主页/用户推文时间线。 - 前置:已持有完整 AccountState 1. `UsersApi/Me` — 读取当前登录账号自身资料,同时可用于确认会话有效。 - Python:`account.users.me` - 输入:只需 state。 - 输出:user 非空且 rest_id 与当前会话一致。 - 幂等:是;验收:未验收 2. `UsersApi/UserByRestID` — 按数字 id 读取指定用户资料。 - Python:`account.users.by_rest_id` - 输入:★rest_id 是数字用户 id,不是 @screen_name★。可先由 Me 或其它读取接口获得。 - 输出:user 非空。 - 幂等:是;验收:未验收 3. `TimelineApi/HomeTimeline` — 读取主页时间线。 - Python:`account.timeline.home` - 输入:只需 state。 - 输出:raw_json 为可解析的非空 JSON,由调用方自行解析。 - 幂等:是;验收:未验收 - 参数传递:`UserResponse.user.rest_id` → `UserByRestIDRequest.rest_id / UserTweetsRequest.rest_id`(数字 id 在读取类接口之间传递,不要用 screen_name 代替。) - 注意:时间线与资料模块以 raw_json 原样返回,结构随上游变动——请做容错解析,不要硬编码路径。 ## 消息定义 以下是上述请求/响应直接或间接引用的全部 message 定义。 ### twitter.android.v1.Account | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `username` (#1) | `string` | - | - | | `password` (#2) | `string` | - | plaintext — server-side only, never logged | | `totp_seed` (#3) | `string` | - | plaintext 2FA secret; optional | ### twitter.android.v1.AndroidAccountState > AndroidAccountState is the full round-trip identity for the android namespace. Mirrors identity.AndroidAccountState (OAuth 1.0a session). | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `account` (#1) | `Account`(见消息定义) | - | - | | `device` (#2) | `AndroidDevice`(见消息定义) | - | - | | `app_version` (#3) | `string` | - | - | | `proxy` (#4) | `string` | - | - | | `session` (#5) | `AndroidSession`(见消息定义) | - | - | ### twitter.android.v1.AndroidDevice | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `client_uuid` (#1) | `string` | - | - | | `device_id` (#2) | `string` | - | - | | `ad_id` (#3) | `string` | - | - | | `model` (#4) | `string` | - | - | | `manufacturer` (#5) | `string` | - | - | | `brand` (#6) | `string` | - | - | | `board` (#7) | `string` | - | - | | `os_version` (#8) | `string` | - | - | | `build_year` (#9) | `string` | - | - | | `language` (#10) | `string` | - | - | | `timezone` (#11) | `string` | - | - | | `sec_patch` (#12) | `string` | - | - | | `limit_ad_tracking` (#13) | `string` | - | - | | `attest_token` (#14) | `string` | - | - | ### twitter.android.v1.AndroidSession | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `oauth_token` (#1) | `string` | - | - | | `oauth_secret` (#2) | `string` | - | plaintext — server-side only, never logged | | `cookies` (#3) | `string` | repeated | - | | `user_id` (#4) | `string` | - | - | | `screen_name` (#5) | `string` | - | - | ### twitter.android.v1.CreatePostRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `text` (#2) | `string` | - | - | | `media_ids` (#3) | `string` | repeated | - | ### twitter.android.v1.CreatePostResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `tweet` (#2) | `Tweet`(见消息定义) | - | - | ### twitter.android.v1.DeletePostRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | ### twitter.android.v1.DeletePostResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | ### twitter.android.v1.EngageRequest > EngageRequest is the shared input for like/unlike/retweet/unretweet. For Unretweet, tweet_id is the ORIGINAL (source) tweet id. | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `tweet_id` (#2) | `string` | - | - | ### twitter.android.v1.EngageResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | ### twitter.android.v1.HomeTimelineRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | ### twitter.android.v1.LoginRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `username` (#1) | `string` | - | - | | `password` (#2) | `string` | - | - | | `totp` (#3) | `string` | - | totp is the current 2FA code; empty when the account has no 2FA. | | `version` (#4) | `string` | optional | version selects the client build (default latest); optional. | | `proxy` (#5) | `string` | optional | proxy dials upstream through this URL (http/https/socks5); optional. | | `attest_account_id` (#6) | `string` | optional | attest_account_id binds attestation during the guest phase; optional. | ### twitter.android.v1.LoginResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | ### twitter.android.v1.MeRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | ### twitter.android.v1.ProfileAnalyticsRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | | `from_time` (#3) | `string` | - | RFC3339 Z | | `to_time` (#4) | `string` | - | - | ### twitter.android.v1.ProfileModulesRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | ### twitter.android.v1.QuoteRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `quoted_tweet_id` (#2) | `string` | - | - | | `text` (#3) | `string` | - | - | | `media_ids` (#4) | `string` | repeated | - | ### twitter.android.v1.RawResponse > RawResponse round-trips state + the untouched GraphQL data (raw fallback). | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `raw_json` (#2) | `string` | - | - | ### twitter.android.v1.ReplyRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `in_reply_to_tweet_id` (#2) | `string` | - | - | | `text` (#3) | `string` | - | - | | `media_ids` (#4) | `string` | repeated | - | ### twitter.android.v1.TimelineResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `raw_json` (#2) | `string` | - | untouched GraphQL timeline payload | ### twitter.common.v1.Tweet > Tweet is a posted/read tweet. Structured key fields + raw_json fallback (charter interview #8: 关键字段 + 保留 raw) — on GraphQL schema drift, parse raw_json instead of changing this message. CreatePost fills only tweet_id; reads (B3) fill the rest. | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `tweet_id` (#1) | `string` | - | rest_id | | `text` (#2) | `string` | - | - | | `user_id` (#3) | `string` | - | author rest_id | | `screen_name` (#4) | `string` | - | - | | `created_at` (#5) | `int64` | - | unix seconds; 0 if unknown | | `favorite_count` (#6) | `int64` | - | - | | `retweet_count` (#7) | `int64` | - | - | | `reply_count` (#8) | `int64` | - | - | | `quote_count` (#9) | `int64` | - | - | | `view_count` (#10) | `int64` | - | - | | `raw_json` (#15) | `string` | - | raw_json is the untouched GraphQL tweet_results payload (drift safety). | ### twitter.android.v1.UploadMediaRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `data` (#2) | `bytes` | - | raw image bytes | | `mime_type` (#3) | `string` | - | default image/jpeg | | `media_category` (#4) | `string` | - | default tweet_image | ### twitter.android.v1.UploadMediaResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `media_id` (#2) | `string` | - | - | ### twitter.common.v1.User > User is a read profile (B3). Structured key fields + raw_json fallback. | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `user_id` (#1) | `string` | - | rest_id | | `screen_name` (#2) | `string` | - | - | | `name` (#3) | `string` | - | - | | `description` (#4) | `string` | - | - | | `followers_count` (#5) | `int64` | - | - | | `following_count` (#6) | `int64` | - | - | | `tweet_count` (#7) | `int64` | - | - | | `verified` (#8) | `bool` | - | - | | `raw_json` (#15) | `string` | - | - | ### twitter.android.v1.UserByRestIDRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | ### twitter.android.v1.UserResponse | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | refreshed round-trip state (charter §3) | | `user` (#2) | `User`(见消息定义) | - | - | ### twitter.android.v1.UserTweetsRequest | 字段 | 类型 | 约束 | 说明 | | --- | --- | --- | --- | | `state` (#1) | `AndroidAccountState`(见消息定义) | - | - | | `rest_id` (#2) | `string` | - | - | (版本 v0.2.3 · SDK 0.2.3 · 镜像 0.2.3 · 提交 71157c1dd2d8)