首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

新浪微博 URL (mid) 與數值 ID 雙向轉換:Base62 編碼演算法 C# 實作

     編輯:關於C#

前言

微博 API 回傳 mid (長整數),但網頁 URL 使用短字串 (如 z8ElgBLeQ)。兩者透過 Base62 編碼 互轉。本文提供完整 C# 實作與官方 API 驗證端點。

編碼原理

  1. 將 mid 以 7 位數字為一組 從右向左分組 (不足補 0)。
  2. 每組轉為 Base62 (0-9, a-z, A-Z) 字串。
  3. 連接各組字串即為 URL 短碼。

反向解碼:URL 短碼以 4 字元為一組 從右向左分組,各組 Base62 解碼為數字,左側不足 7 位補 0,連接得 mid。

完整 C# 實作


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();
    }
}

官方 API 驗證端點 (無需 Access Token)


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" }

應用場景

  • API 發布微博成功後,回傳 mid,轉短碼組合 URL 存入資料庫:https://weibo.com/{uid}/{shortCode}。
  • 爬蟲抓取 URL 短碼,解碼為 mid 呼叫 statuses/show 取得完整資料。
  • 跨系統同步微博資料時,以 mid 為主鍵,短碼為顯示用。

結語

Base62 編碼讓 64 位整數縮短為 11~12 字元,節省 URL 長度且不區分大小寫 (實際區分)。掌握分組邏輯 (7 位/4 字元) 與補零規則,即可在任何語言快速實作雙向轉換。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved