通過新浪微博api接口發布微博成功後,會返回一個二維數組,這個返回的數組裡有微博的內容,發布 微博的用戶信息等等.卻沒有所發布成功的微博的URL.很多時候如果要記錄信息在數據庫 則微博URL應 該必不可少.通過新浪微博論壇搜索,發現有以下方法.
原理:
新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ這樣三部分.
第一部分(綠色部分)為新浪微博的域名,第二部分(紅色部分)為博主Uid,第三部分(藍色)為一串貌似 隨機的字符串.
如果通過方法能計算出藍色字串與返回的數組裡的對應關系則好解決多了.
首先分組藍色字串 ,從後往前4個字符一組,得到以下三組字符:
z
8Elg
BLeQ
將它們分別轉換成62進制的數值則為 35, 2061702, 8999724 將它們組合起來就是一串 3520617028999724 類似這樣的字串
通過發現返回的二維數組裡有個 [mid]的字段,其返回結果為 3520617028999724.剛好是對應 的.
故:通過api接口發布微博,接收其成功後返回的數組,提取其裡面的 mid 將mid轉化成 62進字 字串,再將發布微博的UID組合.
C#源碼
/// <summary> /// 從一條新浪微博地址中獲取這條微博的id /// </summary> /// <param name="url">一條微博地址</param> /// <returns>微博id</returns> public static string GetIdFromUrl(string url) { string mid = GetMidFromUrl(url); if (string.IsNullOrEmpty(mid)) { return string.Empty; } else { return Mid2Id(mid); } } /// <summary> /// 從一條新浪微博地址中獲取這條微博的mid /// </summary> /// <param name="url">一條微博地址</param> /// <returns>微博mid</returns> public static string GetMidFromUrl(string url) { if (string.IsNullOrEmpty(url)) { return ""; } if (url.IndexOf('?') != -1) { url = url.Substring(0, url.IndexOf('?')); } Regex reg = new Regex(@"^http://(e\.)?weibo\.com/[0-9a-zA-Z]+/(?<id>[0-9a-zA-Z]+)$", RegexOptions.IgnoreCase); Match match = reg.Match(url); if (match.Success) { return match.Result("${id}"); } return ""; } /// <summary> /// 將新浪微博mid轉換成id /// </summary> /// <param name="mid">微博mid</param> /// <returns>返回微博的id</returns> public static string Mid2Id(string mid) { string id = ""; for (int i = mid.Length - 4; i > -4; i = i - 4) //從最後往前以4字節為一組讀取URL字符 { int offset1 = i < 0 ? 0 : i; int len = i < 0 ? mid.Length % 4 : 4; var str = mid.Substring(offset1, len); str = Str62toInt(str); if (offset1 > 0) //若不是第一組,則不足7位補0 { while (str.Length < 7) { str = "0" + str; } } id = str + id; } return id; } /// <summary> /// 新浪微博id轉換為mid /// </summary> /// <param name="id">微博id</param> /// <returns>返回微博的mid</returns> public static string Id2Mid(string id) { string mid = "", strTemp; int startIdex, len; for (var i = id.Length - 7; i > -7; i = i - 7) //從最後往前以7字節為一組讀取mid { startIdex = i < 0 ? 0 : i; len = i < 0 ? id.Length % 7 : 7; strTemp = id.Substring(startIdex, len); mid = IntToStr62(Convert.ToInt32(strTemp)) + mid; } return mid; } //62進制轉成10進制 public static string Str62toInt(string str62) { Int64 i64 = 0; for (int i = 0; i < str62.Length; i++) { Int64 Vi = (Int64)Math.Pow(62, (str62.Length - i - 1)); char t = str62[i]; i64 += Vi * GetInt10(t.ToString()); } return i64.ToString(); } //10進制轉成62進制 public static string IntToStr62(int int10) { string s62 = ""; int r = 0; while (int10 != 0) { r = int10 % 62; s62 = Get62key(r) + s62; int10 = int10 / 62; } return s62; } // 62進制字典 private static string str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVTXYZ"; //獲取key對應的62進制整數 private static Int64 GetInt10(string key) { return str62keys.IndexOf(key); } //獲取62進制整數對應的key private static string Get62key(int int10) { if (int10 < 0 || int10 > 61) return ""; return str62keys.Substring(int10, 1); }
新浪提供的API 直接在浏覽器中輸入
http://api.t.sina.com.cn/queryid.json?mid=z8ElgBLeQ&isBase62=1&type=1 返回 {"id":"3520617028999724"} http://api.t.sina.com.cn/querymid.json?id=3520617028999724 返回 {"mid":"z8ElgBLeQ"}
查看本欄目