← All posts / Research

45 億筆 TikTok 資料、289GB、三週完成:一場繞過 App 私有 API 的爬取行動登陸 Hugging Face

一位獨立研究者透過 TikTok App 的私有 Android API,在三週內爬取 45 億筆影片紀錄,並將 289GB 資料集完整公開在 Hugging Face——全程無帳號、無登入,靠的是偽造裝置與逆向簽名。

45 億筆 TikTok 資料、289GB、三週完成:一場繞過 App 私有 API 的爬取行動登陸 Hugging Face

2026 年 9 月 2 日至 3 日,史上最大規模的社群媒體資料集之一,在沒有記者會、沒有機構背書的情況下悄然現身 Hugging Face。儲存庫 kuben-developer/tiktok-videos-4b 收錄了 45 億筆 TikTok 影片紀錄——字幕、觀看數、按讚、留言、分享、收藏、音樂識別碼、國家代碼與發布時間——打包成 27 個 zstd 壓縮的 Parquet 檔案,總計約 289 GB。作者是一位獨立研究者,他表示整個語料庫的收集只花了大約三週。

先誠實面對規模:這是詮釋資料(metadata),不是影片本身。289 GB 對應 45 億列資料,平均每筆紀錄只有約 60 位元組——夠放一個 ID、一段字幕和一排互動計數欄位,再多就沒了。影片檔不在資料集裡。真正在裡面的,是這個平台大部分內容的互動骨架:每個 content_id 一列,從原始收集的 59.4 億筆影片紀錄、32.3 億筆創作者檔案、28 億則留言中去重彙整而來。

怎麼辦到的:App 自己的 API,不是網頁版

收集方法才是技術上真正有趣的部分。市面上幾乎所有 TikTok 爬蟲都是驅動無頭瀏覽器或打網頁端點——又慢、又脆、欄位又少。這套系統直接對上 TikTok Android App 內部使用的私有 HTTP+JSON API,也就是 com.zhiliaoapp.musically 每次滑動時呼叫的同一個介面。它比網頁層快,回傳的欄位也多得多。

要進得去,必須同時搞對四件互不相干的事:

  1. TikTok 親自簽發的裝置憑證——device_id 與 iid 不是客戶端自己編的,而是 TikTok 的裝置註冊端點在收到一份「看起來像真的手機」的資料後核發。
  2. 正確的請求簽名——簽名堆疊涵蓋 X-Argus、X-Ladon(Speck-128/256)、舊版 X-Gorgon 摘要與 X-Khronos,底層是 Simon、Speck、SM3 等密碼學原語,外加 TikTok 自家的 TTEncrypt 主體加密。單一次創作者時間軸請求就帶有 38 個裝置身分參數,且順序固定——因為簽名是對查詢字串逐字雜湊。
  3. 正確的區域主機——TikTok 將流量分配到不同區域的 API 叢集,打錯主機什麼都拿不到。
  4. 看起來像手機的 TLS 握手——標準的 Go 或 Python HTTP 客戶端會呈現伺服器般的 JA3 指紋,然後被靜靜丟棄。

最值得一提的防禦設計,是「失敗」的長相。上述四項只要錯一項,API 回傳的是乾乾淨淨的 HTTP 200,回應本體零位元組。沒有錯誤、沒有狀態碼、沒有驗證頁面。研究者形容這是理解這個 API 最關鍵的一件事:不夠敏銳的爬蟲會連續幾小時把空 JSON 存進資料庫,而所有監控儀表板一路亮綠——因為四種失敗模式全都與成功難以區分。沒有可以對照除錯的回饋訊號:錯的旋轉常數、錯的位元組順序、錯的主機、錯的加密套件,全部產生同樣格式正確的請求,和同樣的一片空白。

整個流程跑在匿名裝置註冊之上。管線中不存在任何登入、帳號或 session cookie——這同時也劃定了影響範圍的上限:真正受帳號保護的內容(私訊、私密影片、誰按過讚的關係圖)始終碰不到,再怎麼調校也碰不到。

研究者實際拿到什麼

資料集卡片的坦白程度罕見,多數企業級發布都做不到:

  • 這是抽樣,不是普查。 匯出內容涵蓋 32 個儲存分區中的 27 個,按創作者 ID 的雜湊切分——是所收集內容的無偏隨機子集,而所收集的內容本身也不是 TikTok 的全部。
  • 互動數據是快照,不是時間序列。 每個數字都是收集那一刻的值,散落在為期三週的窗口內;不對帳齡做正規化就直接比較不同時期的原始計數,是方法論上的錯誤。
  • 資料列按創作者分組排列,未經打散。 順序讀取會產生高度相關的訓練批次。要拿來訓練,先 shuffle。
  • 刻意排除創作者身分——沒有作者 ID、使用者名稱或檔案資料。影片可以按音樂、提及或字幕分組,但無法按發布者分組。
  • 媒體 URL 不隨附——TikTok CDN 連結帶有簽名的到期參數,幾天內就失效。
  • country 與 language 是 TikTok 自行的推論標籤,錯誤率高到卡片明文警告:別當成基準真值。

想先窺探一下又不想下載 289 GB 的人,卡片開頭就給了一行 DuckDB 語法,直接對 Parquet 檔原地查詢、從 Hub 串流讀取,不必完整下載。

底下的法律與倫理大坑

卡片中的「負責任使用」段落,是整個故事最尖銳的地方。作者承認收集行為違反 TikTok 服務條款、資料集與 TikTok 或字節跳動無關;更重要的是——真人寫下的字幕構成 GDPR、英國 GDPR 與 CCPA 意義下的個人資料,即使內容是公開發布的也不例外。義務在下載那一刻起就轉移到下載者身上。卡片禁止識別、剖析、鎖定或聯絡任何個人,並透過儲存庫討論區提供移除管道。

這種措辭不是杞人憂天。X 與 Meta 都曾針對爬蟲行為進行訴訟(有輸有贏),而平台服務條款在民事訴訟中多次被認定為具約束力的契約。如今,一個 45 億列、由真人撰寫文字組成、明確違反這些條款收集而來的語料庫,就放在整個產業預設的開放模型託管平台上——而且時間點就在 Nvidia 以 129.3 億美元完成收購 Hugging Face 後沒幾天,這家晶片巨頭如今是這個平台上最大非官方 TikTok 語料庫的守門人。

Hacker News 討論串(48 分、58 則留言)依慣例分裂:有人感謝資料、有人嫌那份寫作風格滿滿 LLM 味的技術文件,還有 Simon Willison 的一句話總結——「我用跟他們 Android App 一樣的 API 爬了 45 億支 TikTok 影片的詮釋資料……影片內容本身不包括在內。我的 Go 爬蟲程式碼可以賣你。」

因為沒錯——這份慷慨背後有商業引擎。seeksocial.io 上的完整技術文件以 699 美元出售整套 Go 實作(含測試向量的完整簽名堆疊、裝置註冊管線、全部 24 個端點與實測成功率),另提供 1,899 美元的代客建置版。那份免費資料集,最好理解為一場能力展示:證明這套機械能在數十億列的規模上運轉,而展示的對象,是資料供應商、避險基金與研究團隊。

為什麼重要

三條互相交疊的故事線,讓這件事超越週末趣聞。

對 AI 訓練資料而言,這個規模的互動訊號極為稀缺。推薦系統研究、爆紅預測、字幕與成功程度的相關性分析、跨語言內容研究——這些通常需要合作夥伴關係或經年累月的收集。一份免費、去重、文件完整的 45 億列表格,把入場費從「企業級資料合約」改成「289 GB 頻寬加一支 DuckDB 執行檔」。

對平台防禦而言,空 200 軟封鎖是設計得極好的反爬蟲機制——而它還是輸了。當裝置註冊、簽名偽造與 TLS 模仿可以被一個拿著反編譯器的執著個人解決時,API 邊界服務條款對付決心堅定的收集者的實際拘束力,看起來越來越像理論。

對資料治理而言這個資料集是一場壓力測試,而且時機尷尬:歐盟與美國的監管機關都正在訴訟中界定「公開可得」的個人資料究竟附帶哪些義務,而產業的中心儲存庫——如今的擁有者是 Nvidia——正以 289 GB 的體積托管著答案。它能否撐過下架要求、GDPR 申訴或靜靜消失,本身就是一個值得盯的訊號。

本文撰寫當下,資料集仍在線上。程式碼在售。語料庫一旦下載,誰都留得住——這正是問題所在,也正是重點所在。