最近在做相和新浪微博相关的项目,因为抓取回来的微博JOSN中,ID和MID都是一样的。而客户又要求可以打开单条微博的查看页面。
本来SDK中是有QueryMID的功能的,但苦于调用次数的限制(一小时100下好像),而微博却又是海量的(其实就几千条啦)。
(http://weibo.com/2121718653/yvsAefokR <-- 这个就是传说中的MID)
在网上搜了好一会,只看到URL转ID的,没看到ID转URL的,实在无奈之下,只好自己写了一个。
参考了某网友的一篇文章:http://www.cnblogs.com/beijia/archive/2011/11/22/62ToInt.html
照着修修补补,写了这样一个类,其中除了原作者的MID转ID外,还可以ID转MID。(奇怪为啥没人有这样的需求呢?搜不到?)
不废话了,马上看代码,复制了随便用哈。
public class WeiboHelper
{
private static String str62keys = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String IntToEnode62(Int64 int10)
{
string s62 = "";
int r = 0;
while (int10 != 0) {
r = Convert.ToInt32(int10 % 62);
s62 = str62keys[r] + s62;
int10 = (Int64)Math.Floor(int10 / 62.0);
}
return s62;
}
public static Int64 Encode62ToInt(String str62)
{
Int64 i10 = 0;
for (var i = 0; i < str62.Length; i++)
{
double n = str62.Length - i - 1;
i10 += Convert.ToInt64(str62keys.IndexOf(str62[i]) * Math.Pow(62, n));
}
return i10;
}
public static string Mid2Id(string str62) //yvr29p8dG
{
String id = "";
for (int i = str62.Length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取字符
{
int offset = i < 0 ? 0 : i;
int len = i < 0 ? str62.Length % 4 : 4;
String str = Encode62ToInt(str62.Substring(offset, len)).ToString();
if (offset > 0) str = str.PadLeft(7, '0'); //若不是第一组,则不足7位补0
id = str + id;
}
return id;
}
public static string Id2Mid(string str10) //3474920895989800
{
string mid = "";
for (int i = str10.Length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取字符
{
int offset = i < 0 ? 0 : i;
int len = i < 0 ? str10.Length % 7 : 7;
var str = IntToEnode62(Convert.ToInt64(str10.Substring(offset, len)));
mid = str + mid;
}
return mid;
}
}