模块与任务¶
本页由 docs/llms-metadata.json 的 workflows 段自动生成,
发布门禁会校验其中每个 RPC 真实存在且可调用。
逐 RPC 的字段契约见接口参考。
模块划分¶
| 模块 | 门面 | RPC 数 | 覆盖 |
|---|---|---|---|
AndroidApi |
x.android.AndroidClient |
1 | login |
MediaApi |
account.media |
1 | upload |
PostsApi |
account.posts |
8 | create, delete, like, quote, reply, retweet, unlike, unretweet |
TimelineApi |
account.timeline |
2 | home, user_tweets |
UsersApi |
account.users |
4 | me, profile_analytics, profile_modules, by_rest_id |
任务编排¶
首次接入一个账号 first_login¶
目标:用账号密码(可选 2FA)完成 Android 冷启动登录,产出可长期复用的完整状态。
前置条件: - 已启动 Go server 并可连通 - 持有自有测试/业务账号的用户名、密码,账号开启 2FA 时还需当前验证码
| 步 | 调用 | 目的 | 输入与来源 | 响应与下一步 |
|---|---|---|---|---|
| 1 | x.android.AndroidClient.loginAndroidApi/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 | account.posts.createPostsApi/CreatePost |
发布文字推文。 | state 来自持久化存储;text 为正文;media_ids 留空。 | 响应 tweet.tweet_id 非空即成功;同时保存刷新后的 state。 |
| 2 | account.posts.deletePostsApi/DeletePost |
按 id 删除刚发布的推文(可选)。 | tweet_id 使用上一步响应的 tweet.tweet_id。 | 无异常即删除成功;该操作幂等。 |
步骤间参数传递:
CreatePostResponse.tweet.tweet_id→DeletePostRequest.tweet_id:删帖必须用发帖响应返回的 id。
注意
CreatePost 非幂等:超时后先查证是否已发出再决定重试,盲目重试会产生重复推文。
发布带图推文 post_with_media¶
目标:先上传媒体拿到 media_id,再用它发布带图推文。
前置条件: - 已持有完整 AccountState - 准备好图片字节与其 MIME 类型
| 步 | 调用 | 目的 | 输入与来源 | 响应与下一步 |
|---|---|---|---|---|
| 1 | account.media.uploadMediaApi/UploadMedia 🔷 |
分段上传媒体(INIT→APPEND→FINALIZE 在单个 RPC 内完成)。 | data 为图片二进制;mime_type 如 image/jpeg。 | 响应 media_id 非空即成功。media_id 有有效期,应尽快使用。 |
| 2 | account.posts.createPostsApi/CreatePost |
发布引用该媒体的推文。 | media_ids 传上一步的 media_id;text 为正文。 | 响应 tweet.tweet_id 非空即成功。 |
步骤间参数传递:
UploadMediaResponse.media_id→CreatePostRequest.media_ids:上传返回值原样放入 media_ids 列表;跨账号不可复用。
注意
两步都非幂等,且 media_id 有有效期——上传后应立即发帖,不要缓存待用。
互动(点赞 / 转发及其撤销) engage¶
目标:对目标推文点赞、转发,或撤销这些操作。
前置条件: - 已持有完整 AccountState - 已知目标推文 id
| 步 | 调用 | 目的 | 输入与来源 | 响应与下一步 |
|---|---|---|---|---|
| 1 | account.posts.likePostsApi/Like 🔷 |
点赞目标推文(撤销用 Unlike)。 | tweet_id 为目标推文 id。 | 无异常即成功;幂等,重复点赞不叠加。 |
| 2 | account.posts.retweetPostsApi/Retweet 🔷 |
转发目标推文。 | tweet_id 为目标推文 id。 | 无异常即成功;幂等。 |
| 3 | account.posts.unretweetPostsApi/Unretweet 🔷 |
撤销转发。 | ★tweet_id 必须是原始推文 id,不是转发产生的那条推文的 id★。 | 无异常即成功;传错 id 会静默失败。 |
步骤间参数传递:
原始推文 id→UnretweetRequest.tweet_id:撤销转发用的是被转发的原推文 id,这一点最容易传错。
注意
四个互动操作都幂等,但都会在目标推文上留下对方可见的痕迹。
读取资料与时间线 read_profile_and_timeline¶
目标:读取自身或指定用户的资料,以及主页/用户推文时间线。
前置条件: - 已持有完整 AccountState
| 步 | 调用 | 目的 | 输入与来源 | 响应与下一步 |
|---|---|---|---|---|
| 1 | account.users.meUsersApi/Me 🔷 |
读取当前登录账号自身资料,同时可用于确认会话有效。 | 只需 state。 | user 非空且 rest_id 与当前会话一致。 |
| 2 | account.users.by_rest_idUsersApi/UserByRestID 🔷 |
按数字 id 读取指定用户资料。 | ★rest_id 是数字用户 id,不是 @screen_name★。可先由 Me 或其它读取接口获得。 | user 非空。 |
| 3 | account.timeline.homeTimelineApi/HomeTimeline 🔷 |
读取主页时间线。 | 只需 state。 | raw_json 为可解析的非空 JSON,由调用方自行解析。 |
步骤间参数传递:
UserResponse.user.rest_id→UserByRestIDRequest.rest_id / UserTweetsRequest.rest_id:数字 id 在读取类接口之间传递,不要用 screen_name 代替。
注意
时间线与资料模块以 raw_json 原样返回,结构随上游变动——请做容错解析,不要硬编码路径。
🔷 标记的 RPC 已实现但未经真机验收,状态口径见接口验证状态。