关键字:新浪 微博 url id mid 互相转换
地址:http://www.cnblogs.com/txw1958/archive/2012/12/07/weibo-id-to-mid.html

通过新浪微博api接口发布微博成功后,会返回一个二维数组,这个返回的数组里有微博的内容,发布微博的用户信息等等.却没有所发布成功的微博的URL.很多时候如果要记录信息在数据库 则微博URL应该必不可少.通过新浪微博论坛搜索,发现有以下方法.

原理:

新浪微博的URL都是如:http://weibo.com//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('?') != -)
{
url = url.Substring(, 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 - ; i > -; i = i - ) //从最后往前以4字节为一组读取URL字符
{
int offset1 = i < ? : i;
int len = i < ? mid.Length % : ;
var str = mid.Substring(offset1, len); str = Str62toInt(str);
if (offset1 > ) //若不是第一组,则不足7位补0
{
while (str.Length < )
{
str = "" + 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 - ; i > -; i = i - ) //从最后往前以7字节为一组读取mid
{
startIdex = i < ? : i;
len = i < ? id.Length % : ;
strTemp = id.Substring(startIdex, len);
mid = IntToStr62(Convert.ToInt32(strTemp)) + mid;
}
return mid;
} //62进制转成10进制
public static string Str62toInt(string str62)
{
Int64 i64 = ;
for (int i = ; i < str62.Length; i++)
{
Int64 Vi = (Int64)Math.Pow(, (str62.Length - i - ));
char t = str62[i];
i64 += Vi * GetInt10(t.ToString());
}
return i64.ToString();
}
//10进制转成62进制
public static string IntToStr62(int int10)
{
string s62 = "";
int r = ;
while (int10 != )
{
r = int10 % ;
s62 = Get62key(r) + s62;
int10 = int10 / ;
}
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 < || int10 > )
return "";
return str62keys.Substring(int10, );
}

新浪提供的API  直接在浏览器中输入

http://api.t.sina.com.cn/queryid.json?mid=z8ElgBLeQ&isBase62=1&type=1
返回
{"id":""} http://api.t.sina.com.cn/querymid.json?id=3520617028999724
返回
{"mid":"z8ElgBLeQ"}

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

  1. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  2. 生成微博授权URL及回调地址

    1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...

  3. 03生成微博授权URL接口

    1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...

  4. 生成微博授权url接口

    1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...

  5. 04.vue获取微博授权URL

    1.在Vue页面加载时动态发送请求获取微博授 权url 1.1 在 components\common\lab_header.vue 中写oauth动态获取微 博授权**URL // 获取微博登录地址 ...

  6. vue获取微博授权URL

    1.在Vue**页面加载时动态发送请求获取微博授权url 1.1 在 components\common\lab_header.vue 中写oauth动态获取微 博授权URL // 获取微博登录地址 ...

  7. 用JAVASCRIPT获得当前页的来路地址URL的五种方法

    var rUrl;rUrl = document.referrer; //获得当前页的来路地址URL rUrl = window.parent.location; //获得父窗口的地址URL rUrl ...

  8. 利用<meta http-equiv="refresh" content="0;URL=?id='.$id.'" />一条一条的更新数据

    <meta http-equiv="refresh" content="0;URL=?id='.$id.'" /> 解释:页面定时刷新,后面加url ...

  9. Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL

    Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL >>>>>>>>>>>>> ...

随机推荐

  1. [Angular2 Form] Check password match

    Learn how to create a custom validator to check whether passwords match. <h1>password match< ...

  2. 简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候非常easy看到以下这个样例: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yie ...

  3. ztree实现左边动态生成树,右边为具体信息功能

    页面原型图: 图片.png 功能需求:点击左边树上的子节点,像后台发送请求,将请求到的信息展示在右边的表单里面 前端代码实现: 引入css文档: <link rel="styleshe ...

  4. TreeMap、HashMap、ConcurrentSkipListMap之性能比较

    比较Java原生的 3种Map的效率. 1.  TreeMap 2.  HashMap 3.  ConcurrentSkipListMap 结果: 模拟150W以内海量数据的插入和查找,通过增加和查找 ...

  5. js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译)

    js进阶正则表达式11RegExp的属性和方法(RegExp的属性和方法,就是RegExp对象.(点)什么的形式)(正则表达式执行之前会被编译) 一.总结 1. RegExp的属性和方法,就是RegE ...

  6. 编辑器vim简介

    vi简介 vi是"Visual interface"的简称,它在Linux上的地位就仿佛Edit程序在DOS上一样.它可以执行输出.删除.查找.替换.块操作等众多文本操作,而且用户 ...

  7. [Vue] Conditionally Render DOM Elements in Vue.js (v-if v-else v-show)

    You can use v-if and v-else to display content based on assertions on your data. Similarly, v-show c ...

  8. MFC 之 OnClose 与 OnCancel

    在一个对话框其中.按下esc键  与 上面的红叉,默认都是调用OnCancel()函数. 如今我要在按下esc键盘后不关闭程序而是弹出一个对话框,可是这个时候点击红叉 程序也不会关闭,为了解决问题.我 ...

  9. AR Drone系列之:使用ROS catkin创建package并使用cv_bridge实现对ar drone摄像头数据的处理

    1 开发环境 Ubuntu 12.04 ROS Hydro 2 前提 可參考这篇blog:http://blog.csdn.net/yake827/article/details/44564057 b ...

  10. Java一些基本帮助类

    Scanner sc=new Scanner(System.in); sc.nextInt(); sc.next(); Random ran=new Random(); ran.nextInt(); ...