微博地址url(id)与mid的相互转换
关键字:新浪 微博 url id mid 互相转换
地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/weibo-id-to-mid.html
通过新浪微博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"}