好吧,这几天给人写微博应用,于是彻底给新浪微博跪了,关于微博信息的返回值,又是id,又是mid,然后还有一个base62的mid

然后在开放平台的文档上,ID和MID的类型都是int64,而且两个的值是不一样的,但是在实际测试过程中,新发出去微博返回的ID和MID是一样的,虽说猜测觉得目前ID和MID只是为了向下兼容比较老的数据才留出来的,现在都一样,但由于新浪还是留了queryid和querymid进行互转处理的接口,所以还是不敢随便去认为ID和MID一样。

既然id和mid都是int64的数字,那么这个base62的mid是什么呢,从我知道的来看,目前新浪微博的每个微博都有一个独立页面类似

http://www.weibo.com/*****/ywnwezFce

而这个后面的ywnwezFce就是base62的mid,查阅资料这是一个短网址变换,变换的方法则是base62,如果需要对MID进行变换的话可以使用微博API的querymid,但是新浪对于API的请求有次数限制,虽然说这个API支持批量转换,但还是自己来实现这个转化比较好,网上关于base62的代码很多了,但新浪微博的短网址又不只是简单的对id的int64进行base62,而是进行拆分之后分别base62后再连接,于是就用C#实现了一下


    public String bst = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public String base62(String mid)
        {
            long int_mid = Int64.Parse(mid);
            String result = "";
            do
            {
                long a = int_mid % 62;
                result = bst[(int)a] + result;
                int_mid = (int_mid - a) / 62;
            } while (int_mid > 0);
            return result.PadLeft(4,'0');
        }

        public String getSinamid(String mid)
        {
            long int_mid = Int64.Parse(mid);
            String result = "";
            for (int i = mid.Length - 7; i > -7; i -= 7)
            {
                int offset1 = (i < 0) ? 0 : i;
                int offset2 = i + 7;
                String num = base62(mid.Substring(offset1, offset2 - offset1));
                result = num + result;
            }
            return result; 
        }