Skip to content

userArchive ​

按时间范围归档一个用户:日期切片枚举 + 逐条重新拉取详情 / 长文 / 评论 / 楼中楼 / 转发,支持续跑。

方法返回
run(uid, options?)Promise<UserArchiveResult>
stream(uid, options?)AsyncIterableIterator<UserArchiveEvent>

访客调用抛 CONFIG_INVALID,边界见 范围与限制。

run(uid, options?) ​

ts
const result = await sdk.userArchive.run('1111681197', {
  since: '2026-01-01',
  until: '2026-03-31',
  includeComments: true,
  includeReplies: true,
  maxCommentPages: 2,
  maxReplyPages: 2,
})

result.file        // ArchiveFile(weibo-user-archive/v2)
result.complete
result.summary     // { tweets, comments, replies, errors, complete, estimatedTotal?, coverage? }
result.user

stream(uid, options?) ​

逐事件消费,适合边抓边落盘:

ts
for await (const event of sdk.userArchive.stream(uid, { store })) {
  switch (event.type) {
    case 'meta':
      await saveMeta(event.meta)
      break
    case 'record':
      await persist(event.entry)
      break
    case 'issue':
      console.warn(event.issue)
      break
    case 'slice-done':
      console.log('slice done', event.slice)
      break
    case 'done':
      console.log(event.summary)
      break
  }
}

事件:

type载荷
meta{ meta: UserArchiveMeta }(切片计划与运行配置)
slice-start{ slice, resumed }
record{ entry: UserArchiveRecord }
issue{ slice?, issue: ArchiveIssue }
slice-done{ slice: string }
done{ summary: UserArchiveSummary }

选项 UserArchiveOptions ​

选项默认说明
since / until2009-08-14 / 现在unix 秒、YYYY-MM-DD 或 YYYYMMDD
sliceDays30每 n 天一个枚举子任务;0 = 不拆分
includeCommentstrue拉取并挂载一级评论
includeRepliestrue展开楼中楼
includeRepostsfalse拉取转发列表
commentOrder'time''time' / 'hot'
maxComments不限总评论条数上限
maxCommentPages2每条微博最多评论页数;0 = 全部
maxReplies不限总楼中楼条数上限
maxReplyPages2每条一级评论最多楼中楼页数;0 = 全部
maxReposts / maxRepostPages不限转发上限
concurrency6(上限 32)全局补全并发;实际 QPS 仍受令牌桶控制
store内存UserArchiveStore 持久化端口
onProgress无UserArchiveProgress 回调
onIssue无issue 回调
onRecord无每条记录完成时回调
signal无中断信号

UserArchiveStore ​

持久化由调用方实现,SDK 通过 UserArchiveStore 读写进度:

ts
interface UserArchiveStore {
  loadMeta(): Promise<UserArchiveMeta | undefined>
  saveMeta(meta: UserArchiveMeta): Promise<void>
  loadSlices(): Promise<UserArchiveSliceState[]>
  loadRecords(slice?: string): Promise<UserArchiveRecord[]>
  appendRecord(entry: UserArchiveRecord): Promise<void>
  saveCheckpoint(slice: UserArchiveSlice, checkpoint: ArchiveCheckpoint): Promise<void>
  markSliceDone(slice: UserArchiveSlice): Promise<void>
  appendIssue(issue: ArchiveIssue, slice?: UserArchiveSlice): Promise<void>
  loadIssues(): Promise<ArchiveIssue[]>
  clear(): Promise<void>
}

内置 createMemoryUserArchiveStore(),适合测试与小范围运行。

续跑语义 ​

  • journal 记录每个切片的完成状态与 checkpoint;重跑同一命令即可接着跑。
  • 已加载的旧记录计入 processed,重跑时跳过。
  • 带 issue 的目标保持未完成,下一轮重试。
  • --fresh 清空进度重新开始。

与全量镜像的区别 ​

archive.streamArchiveuserArchive.run
枚举方式mymblog + 可选日期切片日期切片
详情时间线简版,可选补详情逐条重新拉详情与长文
评论可选,挂到 tweet.comments默认补一级评论 + 楼中楼
输出ArchiveItem 流单个 ArchiveFile
用途全量镜像 / 增量同步指定时间段深度归档

CLI ​

bash
weibo-cli archive user 1111681197 --since 2026-01-01 --until 2026-03-31 -o ./weibo-archive.json
weibo-cli archive user 1111681197 --since 2026-04-01 --until 2026-06-30 -o ./weibo-archive.json --merge
weibo-cli archive user 1111681197 --all-comments --all-replies
weibo-cli archive user 1111681197 --fresh

只读公开数据;请遵守微博服务条款与隐私边界。