微博地址url(id)与mid的相互转换

简介: 关键字:新浪 微博 url id mid 互相转换地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/weibo-id-to-mid.html 通过新浪微博api接口发布微博成功后,会返回一个二维数组,这个返回的数组里有微博的内容,发布微博的用户信息等等.

关键字:新浪 微博 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"}

 

目录
相关文章
|
17天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
46 4
|
6月前
BurpSuite8.2 -- 查找包含id参数的URL
BurpSuite8.2 -- 查找包含id参数的URL
63 1
|
6月前
|
移动开发
钉钉H5微应用配置IP,应用首页地址报错:app url exceeds max length limit,这个怎么处理?
钉钉H5微应用配置IP,应用首页地址报错:app url exceeds max length limit,这个怎么处理?
595 0
|
5天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
|
2月前
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
58 1
|
5月前
|
安全 数据安全/隐私保护
应急响应-战后溯源反制&社会工程学&IP&ID追踪&URL反查&攻击画像
应急响应-战后溯源反制&社会工程学&IP&ID追踪&URL反查&攻击画像
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
6月前
用Angular获取当前地址的路径path(也就是网址/#后面那坨url)
用Angular获取当前地址的路径path(也就是网址/#后面那坨url)
|
6月前
|
小程序 前端开发
获取url地址指定参数值
获取url地址指定参数值
|
6月前
|
XML 安全 搜索推荐
URL地址解析
URL地址解析
123 0