微博 API 回傳 mid (長整數),但網頁 URL 使用短字串 (如 z8ElgBLeQ)。兩者透過 Base62 編碼 互轉。本文提供完整 C# 實作與官方 API 驗證端點。
mid 以 7 位數字為一組 從右向左分組 (不足補 0)。反向解碼:URL 短碼以 4 字元為一組 從右向左分組,各組 Base62 解碼為數字,左側不足 7 位補 0,連接得 mid。
using System;
using System.Text.RegularExpressions;
public static class WeiboIdConverter
{
private const string Base62Chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// URL 短碼 -> mid (長整數字串)
public static string UrlToMid(string url)
{
var mid = GetMidFromUrl(url);
return string.IsNullOrEmpty(mid) ? "" : Mid2Id(mid);
}
// 從 URL 提取短碼
public static string GetMidFromUrl(string url)
{
if (string.IsNullOrEmpty(url)) return "";
if (url.IndexOf('?') >= 0) url = url.Substring(0, url.IndexOf('?'));
var m = Regex.Match(url, @"^https://(e\.)?weibo\.com/[0-9a-zA-Z]+/(?[0-9a-zA-Z]+)$", RegexOptions.IgnoreCase);
return m.Success ? m.Groups["id"].Value : "";
}
// mid (長整數字串) -> 短碼
public static string Mid2Id(string mid)
{
if (string.IsNullOrEmpty(mid)) return "";
var id = "";
for (int i = mid.Length - 4; i > -4; i -= 4)
{
int start = i < 0 ? 0 : i;
int len = i < 0 ? mid.Length % 4 : 4;
var seg = mid.Substring(start, len);
seg = Base62ToInt64(seg).ToString();
if (start > 0)
while (seg.Length < 7) seg = "0" + seg;
id = seg + id;
}
return id;
}
// 短碼 -> mid
public static string Id2Mid(string id)
{
if (string.IsNullOrEmpty(id)) return "";
var mid = "";
for (int i = id.Length - 7; i > -7; i -= 7)
{
int start = i < 0 ? 0 : i;
int len = i < 0 ? id.Length % 7 : 7;
var seg = id.Substring(start, len);
mid = Int64ToBase62(long.Parse(seg)) + mid;
}
return mid;
}
// Base62 字串 -> Int64
private static long Base62ToInt64(string s)
{
long val = 0;
for (int i = 0; i < s.Length; i++)
{
val = val * 62 + Base62Chars.IndexOf(s[i]);
}
return val;
}
// Int64 -> Base62 字串
private static string Int64ToBase62(long val)
{
if (val == 0) return "0";
var sb = new System.Text.StringBuilder();
while (val > 0)
{
sb.Insert(0, Base62Chars[(int)(val % 62)]);
val /= 62;
}
return sb.ToString();
}
}
GET https://api.t.sina.com.cn/queryid.json?mid=z8ElgBLeQ&isBase62=1&type=1
→ { "id": "3520617028999724" }
GET https://api.t.sina.com.cn/querymid.json?id=3520617028999724
→ { "mid": "z8ElgBLeQ" }
mid,轉短碼組合 URL 存入資料庫:https://weibo.com/{uid}/{shortCode}。mid 呼叫 statuses/show 取得完整資料。mid 為主鍵,短碼為顯示用。Base62 編碼讓 64 位整數縮短為 11~12 字元,節省 URL 長度且不區分大小寫 (實際區分)。掌握分組邏輯 (7 位/4 字元) 與補零規則,即可在任何語言快速實作雙向轉換。