php专区

 首页 > php专区 > PHP应用 > 开放平台 > 微博地址url(id)与mid的相互转换 - 微信公众平台开原理:

微博地址url(id)与mid的相互转换 - 微信公众平台开原理:

分享到:
【字体:
导读:
          关键字:新浪 微博 url id mid 互相转换地址:http: www cnblogs com txw1958 archive 2012 12 07 weibo-id-to-mid html通过新浪微博api接口发布微博成功后,会返回一个二维数组,这个返回的数组里有微博的...

通过新浪微博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#源码

        ///  
        /// 从一条新浪微博地址中获取这条微博的id
        ///   
        /// 一条微博地址  
        /// 微博id  
        public static string GetIdFromUrl(string url)
        {
            string mid = GetMidFromUrl(url);

            if (string.IsNullOrEmpty(mid))
            {
                return string.Empty;
            }
            else
            {
                return Mid2Id(mid);
            }
        }

        ///  
        /// 从一条新浪微博地址中获取这条微博的mid
        ///   
        /// 一条微博地址  
        /// 微博mid  
        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]+/(?[0-9a-zA-Z]+)$", RegexOptions.IgnoreCase);
            Match match = reg.Match(url);
            if (match.Success)
            {
                return match.Result("${id}");
            }
            return "";
        }

        /// 
        /// 将新浪微博mid转换成id
        /// 
        /// 微博mid
        /// 返回微博的id
        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;
        }

        /// 
        /// 新浪微博id转换为mid
        /// 
        /// 微博id
        /// 返回微博的mid
        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"}

 

分享到:
微信公众平台开发(四) 简单回复功能开...
一、简介 微信公众平台可以根据用户发送的信息进行判断,然后给出对应的回复,具有良好的交互性。下文将模拟简单的回复功能,根据这个案例,开发者也可以基本理解微信交互的原理,进行更深层次的开发。 二、思路分析 用户发送过来的文本信息,我们可以提取关键字,通过简单的 if...elseif...else... 实现。 关键代码...
方倍微信公众平台消息接口开发(33)智能...
 一、智能快递查询 在目前的快递查询中,我们一般需要输入1.快递公司,2快递单号这样两项来进行查询,这个过程中,需要输入两次。 如果我们能自动智能识别快递单号是哪家快递公司的,这样就可以减少一次输入,用户也可以不用再去输入快递公司名称,因为汉字+单号的匹配规则变化性比较大,有时用户输入正确了快递公司名称...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……