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

通过新浪微博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"}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/csharp/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, int
, 新浪
, 进制
, return
, tomcat7 0 62
, 新浪api 获取数据
, mid
, 新浪微博api
, 62进制
, 新浪api接口
, url字串
仿新浪微博源码
cdnmidimgurl、mid格式转换器、mid转换mp3、mid音乐格式转换器、mp3转mid格式转换器,以便于您获取更多的相关知识。

时间: 2024-11-10 01:19:58

实现微博地址url(id)与mid的相互转换的相关文章

微博地址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.c

js代码得到以图片的地址url,有没有办法用php代码下载url下的图片

问题描述 js代码得到以图片的地址url,有没有办法用php代码下载url下的图片 <!DOCTYPE html> 普通地图&全景图 body, html{width: 100%;height: 100%;overflow: hidden;margin:0;} #panorama {height: 100%;overflow: hidden;} var myGeo = new BMap.Geocoder(); var url; // 将地址解析结果显示在地图上,并调整地图视野 myGe

javascript-js代码得到图片的地址url,有没有办法用c++代码下载url下的图片

问题描述 js代码得到图片的地址url,有没有办法用c++代码下载url下的图片 我的.html 文件里的js代码求得图的url,能不能将这个url传到一个c++代码里,把图片以jpg格式保存到本地的的指定路径下,具体该怎么实现呢 解决方案 http://blog.chinaunix.net/uid-24862988-id-3722069.html 解决方案二: http://blog.csdn.net/glt3953/article/details/11605009 解决方案三: 用winht

js 验证电子邮件地址 url地址的正则正则表达式

网页特效 验证电子邮件地址 url地址的正则正则表达式   *   * @parameter string str 字符串   * @return boolean   */ function checkmail(str){   return str.match(/^(w+.)*w+@(w+.)+[a-za-z]+$/);  }    /**   * 验证url地址   *    * @parameter string $str 字符串   * @return boolean   */ funct

jquery中邮箱地址 URL网站地址正则验证实例代码_jquery

email地址验证 复制代码 代码如下: function checkEmail(){    var email=$.trim($("#report_email").val());    if(email == ""){        $("#report_email").next('p').html("*请输入邮箱地址!");        return false;    }    var re = /^([a-zA-Z0

php使用filter过滤器验证邮箱 ipv6地址 url验证_php实例

1.验证邮箱 复制代码 代码如下: $email = 'jb51@qq.com';$result = filter_var($email, FILTER_VALIDATE_EMAIL);var_dump($result); //string(14) "jb51@qq.com" 2.验证url地址 复制代码 代码如下: $url = "http://www.jb51.net";$result = filter_var($url, FILTER_VALIDATE_URL

jquery中邮箱地址 URL网站地址正则验证实例

email地址验证  代码如下 复制代码 function checkEmail(){     var email=$.trim($("#report_email").val());     if(email == ""){         $("#report_email").next('p').html("*请输入邮箱地址!");         return false;     }     var re = /^([a

ASP取得地址URL中的顶级域名的函数

ASP取得地址栏中URL网址中的顶级域名函数,非正则,非常实用,亲自调试好用. 在制作一个DLL组件中,由于DLL里不方便调用正则函数,所以,制作了一个不需要正则的取得跟域名的函数,贡献给大家! 以下内容为程序代码Private Function durl(url) Dim domext, s1, s2, re, matches, arrdom, dd domext = "comnetorgcnlaccinfohkbizmemobinametvasiakrdeorg.cnco.krcom.cnn

javascript中获取地址url参数

最快捷的js方法 js代码:  代码如下 复制代码 function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r!=null) return unescape(r[2]); return null; } URL的参数&