WEKEN NEWS 週末哥的數據記錄
instagramig shortcode社群分析資料查核osint

IG貼文網址代碼怎麼查發布時間?右移23位,不是網路上常見的22位

直接回答

IG貼文網址代碼(shortcode)可以直接算出發布時間,正確公式是把代碼還原成數字後右移23位,不是網路上常見教學寫的22位。用Instagram Engineering官方部落格公開的ID欄位設計驗證一則2020年的公開貼文,23位算出來的時間跟Instagram自己頁面顯示的發布時間只差0.952秒;同一則貼文用22位算,會變成2029年,差了9年(查證日期2026-09-21)。

週末哥

IG網址代碼還原成數字後右移23位、加上epoch 1314220021721毫秒,就是發布時間;網路常見的22位會算錯好幾年(出處:Instagram Engineering 官方部落格〈Sharding & IDs at Instagram〉,查證日期 2026-09-21)。

先前在一場社群抽獎活動裡要判斷一則IG貼文是不是臨時發的,還是有人拿舊貼文重貼灌分,我當場用位移公式把網址代碼換算成時間,四條真實網址都對得上,其中一條算出12:31發布,參加者12:33貼進群組,差2分鐘。

回頭整理這個方法要不要寫成文章時才發現,網路上不少教學把公式寫成右移22位,但我自己那次用的是23位。同一條公式,位移數字差1,算出來的年份可以差到9年,這個落差值得攤開來講清楚。

先講機制。Instagram Engineering官方部落格2011年發過一篇「Sharding & IDs at Instagram」,原文寫得很直接:

Each of our IDs consists of: 41 bits for time in milliseconds, 13 bits that represent the logical shard ID, 10 bits that represent an auto-incrementing sequence, modulus 1024.

64位的ID裡,最高41位是時間戳(毫秒),接下來13位是shard編號,最後10位是流水號。13加10等於23,這就是要位移的位數,不是22。

貼文網址裡看到的那串代碼,是這個ID用base64轉成的可讀版本,字母表是A到Z、a到z、0到9、再加-和_,剛好64個字元對應64進位。換算成程式碼,10行內:

const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
const code = 'CGGOHDXhhK-';
let id = 0n;
for (const ch of code.slice(0, 11)) id = id * 64n + BigInt(ALPHABET.indexOf(ch));
const publishedAt = new Date(Number((id >> 23n) + 1314220021721n));
console.log(publishedAt.toISOString());

查證日期2026-09-21,實際跑一次驗證。上面這則CGGOHDXhhK-不是我自己的貼文,是ODU研究團隊2021-02-20那篇部落格文章裡公開引用的樣本,那篇文章當時直接從Instagram的頁面原始碼裡讀到這則貼文的media id是2415680307434230462、發布時間顯示為2020-10-08T21:12:34Z。拿這組已知答案回頭驗證我的公式:

shortcode CGGOHDXhhK-還原成id後右移23位,算出2020-10-08T21:12:34.952Z;Instagram頁面本身顯示的發布時間是2020-10-08T21:12:34Z,兩者差0.952秒。同一組id右移22位,算出2029-11-23T21:18:08Z,差了9年。

用程式碼跑出來的原始輸出:

decoded id: 2415680307434230462
match: true
shift23 date: 2020-10-08T21:12:34.952Z
shift22 date: 2029-11-23T21:18:08.183Z
actual (IG頁面顯示的發布時間): 2020-10-08T21:12:34Z

這個9年的落差不是隨機誤差,是可以算出來的固定倍率。少位移一位,等於少丟掉一個bit,換算出來的「距離epoch的毫秒數」會接近變成兩倍,離Instagram的2011年epoch越遠的貼文,位移錯一位造成的偏移就越大。這則貼文離epoch約9.13年,兩倍是18.25年,2011年加18.25年正好落在2029年11月,跟實際算出來的2029-11-23完全對上。2026年發的貼文用22位算,會直接跳到2041年。

網路上會出現22這個數字,常見原因是通用的Snowflake ID教學。Twitter的ID結構是41位時間戳加10位機器碼加12位序號,10加12剛好是22位,很多教學文章把這條公式當成所有Snowflake類ID的通用寫法,套到Instagram時沒注意到IG的欄位配置是13加10,不是10加12。

準確度要分兩種情況講清楚。同一篇ODU研究團隊的部落格文章抽樣1,000則貼文比對,76.4%的貼文,用media id算出來的時間跟頁面上顯示的發布時間誤差都在1到2秒內,其中輪播貼文的落差多半落在1秒或2秒,跟我這次驗證的0.952秒是同一個量級。但1000則裡有23.6%落差較大,這些剛好都是單支影片貼文,落差最大到60分32秒,因為影片類型的貼文是先上傳處理、media id先被建立,隔一段時間才真正發布上線,兩個時間點本來就不是同一刻。所以這個方法拿來查照片、輪播貼文很準,拿來查Reels發布時間,數字可以當參考,不能當成精確到秒的證據。

FB做不到同樣的事。FB現在的貼文網址是pfbid開頭的不透明字串,裡面沒有可解的時間資訊,只能登入後台或靠人工看畫面判斷。

要講清楚這整個方法在做什麼:從頭到尾只是把公開網址裡的那串代碼換算成數字再做位元運算,不需要登入任何帳號、不呼叫Instagram的任何API、也不用抓取或打開那則貼文的頁面。網址本身是公開的,代碼本身也是公開的,這裡做的事只是照Instagram官方公開過的ID欄位設計,把代碼還原成它原本包含的時間資訊。

套公式前先拿已知答案驗一次。

常見問題

IG貼文的發布時間要怎麼查,不登入帳號也查得到嗎?
查得到。貼文網址instagram.com/p/{代碼}/或instagram.com/reel/{代碼}/裡的那串代碼,本身就是media id的變形編碼,把它還原成數字再位移就能算出時間,全程不用登入、不用打API、不用抓網頁,純數學換算公開網址上的一串字。
IG shortcode換算發布時間,右移22位跟23位差在哪?
差在Instagram的ID欄位設計是41位時間戳加13位shard加10位序號,13加10等於23,不是Twitter那種標準Snowflake ID的10位機器碼加12位序號(等於22)。少位移一位,換算出來的『距離epoch的毫秒數』會接近變成兩倍,年份就會大幅偏移,通常偏向未來。
這個方法對Reels跟輪播貼文準嗎?
對單張照片跟輪播貼文很準。查到一篇研究團隊的部落格文章(ODU研究團隊,2021-02-20)抽樣1,000則貼文比對,76.4%算出來的時間跟頁面顯示的發布時間誤差都在1到2秒內;1000則裡有23.6%落差較大,這些剛好都是單支影片貼文,媒體ID裡的建立時間跟實際發布時間可以差到60分32秒,因為影片是先上傳處理才發布,時間點本來就不是同一刻。
FB貼文的網址代碼也能這樣算出時間嗎?
不能。FB現在的貼文網址是pfbid開頭的不透明字串,裡面沒有可解的時間資訊,只能靠登入後台或人工看畫面判斷,這個方法只對IG有效。
為什麼IG貼文代碼裡面會藏著時間?
因為Instagram資料庫用分散式ID設計,每個ID的最高41位本來就是拿系統時間直接寫進去的,這樣資料庫排序時ID大小順序會跟建立時間順序一致,不用另外查時間欄位。貼文網址上看到的代碼只是這個ID用base64轉過的可讀版本,時間資訊本來就在裡面,不是額外加密。