新浪微博mid与id互转实用工具(转)

js版 

复制代码
/**
* 新浪微博mid和id转换工具类
* @constructor 工具类  提供10进制和62进制转换
*/
function SinaWeiboUtility() {
    /**
    * 62进制字典
    * @property {String}
    
*/
    this.str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    if (typeof (SinaWeiboUtility._initalized) == 'undefined') {
        /**
        * 10进制值转换为62进制
        * @param {String} int10 10进制值
        * @return {String} 62进制值
        
*/
        SinaWeiboUtility.prototype.int10to62 = function (int10) {
            var s62 = '';
            var r = 0;
            while (int10 != 0) {
                r = int10 % 62;
                s62 = this.str62keys.charAt(r) + s62;
                int10 = Math.floor(int10 / 62);
            }
            return s62;
        };
        /**
        * 62进制值转换为10进制
        * @param {String} str62 62进制值
        * @return {String} 10进制值
        
*/
        SinaWeiboUtility.prototype.str62to10 = function (str62) {
            var i10 = 0;
            for (var i = 0; i < str62.length; i++) {
                var n = str62.length - i - 1;
                var s = str62.substr(i, 1);  // str62[i]; 字符串用数组方式获取,IE下不支持为“undefined”
                i10 += parseInt(this.str62keys.indexOf(s)) * Math.pow(62, n);
            }
            return i10;
        };
        /**
        * id转换为mid
        * @param {String} id 微博id,如 "201110410216293360"
        * @return {String} 微博mid,如 "wr4mOFqpbO"
        
*/
        SinaWeiboUtility.prototype.id2mid = function (id) {
            if (typeof (id) != 'string') {
                return false// id数值较大,必须为字符串!
            }
            var mid = '';

            for (var i = id.length - 7; i > -7; i = i - 7//从最后往前以7字节为一组读取mid
            {
                var offset1 = i < 0 ? 0 : i;
                var offset2 = i + 7;
                var num = id.substring(offset1, offset2);

                num = this.int10to62(num);
                mid = num + mid;
            }

            return mid;
        };
        /**
        * mid转换为id
        * @param {String} mid 微博mid,如 "wr4mOFqpbO"
        * @return {String} 微博id,如 "201110410216293360"
        
*/
        SinaWeiboUtility.prototype.mid2id = function (mid) {
            var id = '';

            for (var i = mid.length - 4; i > -4; i = i - 4//从最后往前以4字节为一组读取mid字符
            {
                var offset1 = i < 0 ? 0 : i;
                var len = i < 0 ? parseInt(mid.length % 4) : 4;
                var str = mid.substr(offset1, len);

                str = this.str62to10(str).toString();
                if (offset1 > 0//若不是第一组,则不足7位补0
                {
                    while (str.length < 7) {
                        str = '0' + str;
                    }
                }

                id = str + id;
            }
            return id;
        };

        /**
        * 标识对象是否初始化过(将方法挂在prototype上只需执行一次即可,不必要的重复的运算。)
        * @property {boolean}
        
*/
        SinaWeiboUtility._initalized = true;
    }
}
复制代码

 

c#版

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace SinaExportTool.Public
{
    /// <summary>
    
/// 新浪微博mid和id转换工具类
    
/// </summary>
    public class SinaWeiboUtility
    {

        /// <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);
        }
    }

}
复制代码

 

posted @   贝加  阅读(4707)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示