微博地址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"}

 

<think>好的,我现在要帮用户解决如何查看新浪微博MID的问题。首先,我需要回忆一下MID是什么。MID微博系统用来唯一标识每条微博ID,通常是一个长数字。但用户可能在实际使用中看到的是经过Base62编码后的字符串,比如在URL里。例如,一条微博的链接可能是https://weibo.com/1234567890/Habcdefg,这里的“Habcdefg”可能就是MID的Base62编码形式。 接下来,用户想知道如何查看MID的具体方法。根据之前的引用资料,特别是引用[2]提到的Base62编码方法,可能需要将URL中的字符串转换回数字MID。那用户可能需要先找到微博URL,然后从中提取出编码后的字符串,再通过解码得到原始的数字MID。 首先,步骤应该是:找到微博的网页版链接,复制URL,然后解析其中的MID部分。例如,在浏览器中打开一条微博URL可能类似于https://weibo.com/用户ID/后面跟着一串字符,这部分字符就是MID的Base62编码。用户需要复制这部分字符串,然后使用解码工具或脚本来转换。 然后,用户可能需要具体的操作步骤,比如如何获取URL,如何提取编码后的MID,以及如何转换。可能还需要提供代码示例,如Python脚本,因为引用[2]中的示例是用Python写的Base62编码函数。所以,我可以参考那个函数,写出解码的函数,或者解释如何使用现有的工具进行转换。 另外,用户可能不知道MID有两种表现形式:数字形式和Base62编码后的字符串形式,需要解释清楚这两者的区别和转换方法。可能还需要提到,有些第三方工具或浏览器插件可以自动显示MID,方便用户直接查看,而无需手动转换。 还需要注意,不同版本的微博可能URL结构不同,比如移动端和PC端的链接可能不同,但通常MID的编码部分在URL末尾。如果用户无法找到,可能需要指导他们如何通过查看网页源代码或使用开发者工具来查找相关信息。 最后,确保回答的步骤清晰,并提供具体的示例,比如一个实际的URL例子,展示如何提取和转换。同时,提供代码示例时,要确保语法正确,并解释代码的作用,让用户即使没有编程经验也能理解大致流程。</think>### 如何查看新浪微博MID微博MID是每条内容的唯一标识符,通常以长整型数字或Base62编码字符串的形式存在。以下是具体查看方法及转换步骤: --- #### **方法1:通过网页链接直接提取** 1. **打开微博网页版**,找到目标微博,点击右上角的“&middot;&middot;&middot;”选择**“复制链接”**。 - 示例链接格式:`https://weibo.com/用户ID/MID编码` - 例如:`https://weibo.com/1234567890/ABCDEFG123` 中的 `ABCDEFG123` 即为MID的Base62编码形式。 2. **手动解析MID编码**: - 若需将Base62编码转换为数字MID,可使用Python脚本实现解码(参考引用[2]的编码逻辑逆向推导): ```python def base62_decode(s, alphabet="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"): num = 0 for char in s: num = num * 62 + alphabet.index(char) return num # 示例:将URL中的编码转换为数字MID encoded_mid = "ABCDEFG123" numeric_mid = base62_decode(encoded_mid) print("数字MID:", numeric_mid) ``` --- #### **方法2:通过开发者工具查看(需技术基础)** 1. 在微博页面按 **F12** 打开浏览器开发者工具,切换到 **Network(网络)** 标签。 2. 刷新页面并点击目标微博,找到以 `statuses/show` 开头的API请求。 3. 在响应数据中搜索 `"id":`,其后的长整型数值即为数字MID[^2]。 --- #### **方法3:使用第三方工具** 部分微博分析工具(如“微博MID转换器”)可直接输入URL或编码MID,自动输出数字MID,无需编程操作。 --- ### 关键概念说明 1. **MID的两种形式**: - **数字MID**:纯数字形式,如 `4472020594782345`,用于系统底层存储和接口调用。 - **Base62编码MID**:URL中的短字符串形式,如 `yBv0XneZc`,通过Base62算法转换生成。 2. **MID的作用**: - 唯一标识微博内容,便于数据追踪和接口调用。 - 通过虚拟内存管理机制,MID关联的元数据(如用户权限、互动记录)可被高效共享和保护[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值