新浪微博的微博地址的URL有段参数是加过密的。
通过这个参数可以获得mid,mid是微博的标识。mid不知道是什么东西的去Google下,我这里直接贴转换代码了。
java版
package com.weibo.utils;
public abstract class WeiboUtils {
private static String [] str62keys = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
// 62进制转10进制
public static long str62To10(String str62){
long i10 = 0;
String [] array = strToArray(str62);
for (int i = 0; i < array.length; i++){
long n = array.length - i - 1;
String s = array[i];
i10 += getIndex(s) * Math.pow(62, n);
}
return i10;
}
// 将string变为数组
public static String [] strToArray(String str){
String [] s = new String[str.length()];
for(int i = 0; i < str.length();i++){
s[i] = str.substring(i, i+1);
}
return s;
}
// 字母在str62keys中 出现的位置
public static int getIndex(String s){
int t = 0;
for(int i = 0; i < str62keys.length;i++){
if(s.equals(str62keys[i])){
t = i;
}
}
return t;
}
// 通过ARGS获取mid
public static String getMidByUrlArgs(String url){
String mid = "";
//从最后往前以4字节为一组读取URL字符
for (int i = url.length() - 4; i > -4; i = i - 4){
int offset1 = i < 0 ? 0 : i;
int offset2 = i + 4;
String str = url.substring(offset1, offset2);
str = String.valueOf(str62To10(str));
//若不是第一组,则不足7位补0
if (offset1 > 0){
while (str.length() < 7){
str = "0" + str;
}
}
mid = str + mid;
}
return mid;
}
public static void main(String[] args) {
System.out.println(getMidByUrlArgs("zqNhSDn2J"));
}
}
Javascript版
/**
* 新浪微博mid与url互转实用工具
*/
var WeiboUtility = {};
/**
* 62进制字典
*/
WeiboUtility.str62keys = [
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
];
/**
* 62进制值转换为10进制
* @param {String} str62 62进制值
* @return {String} 10进制值
*/
WeiboUtility.str62to10 = function(str62) {
var i10 = 0;
for (var i = 0; i < str62.length; i++)
{
var n = str62.length - i - 1;
var s = str62[i];
i10 += this.str62keys.indexOf(s) * Math.pow(62, n);
}
return i10;
};
/**
* 10进制值转换为62进制
* @param {String} int10 10进制值
* @return {String} 62进制值
*/
WeiboUtility.int10to62 = function(int10) {
var s62 = '';
var r = 0;
while (int10 != 0)
{
r = int10 % 62;
s62 = this.str62keys[r] + s62;
int10 = Math.floor(int10 / 62);
}
return s62;
};
/**
* URL字符转换为mid
* @param {String} url 微博URL字符,如 "wr4mOFqpbO"
* @return {String} 微博mid,如 "201110410216293360"
*/
WeiboUtility.url2mid = function(url) {
var mid = '';
for (var i = url.length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取URL字符
{
var offset1 = i < 0 ? 0 : i;
var offset2 = i + 4;
var str = url.substring(offset1, offset2);
str = this.str62to10(str);
if (offset1 > 0) //若不是第一组,则不足7位补0
{
while (str.length < 7)
{
str = '0' + str;
}
}
mid = str + mid;
}
return mid;
};
/**
* mid转换为URL字符
* @param {String} mid 微博mid,如 "201110410216293360"
* @return {String} 微博URL字符,如 "wr4mOFqpbO"
*/
WeiboUtility.mid2url = function(mid) {
if (typeof(mid) != 'string') return false; //mid数值较大,必须为字符串!
var url = '';
for (var i = mid.length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid
{
var offset1 = i < 0 ? 0 : i;
var offset2 = i + 7;
var num = mid.substring(offset1, offset2);
num = this.int10to62(num);
url = num + url;
}
return url;
};
测试方法:
<script type="text/javascript">
alert(WeiboUtility.url2mid("zqNhSDn2J"));
</script>