新浪微博地址url字符與mid的相互轉換算法及原理

過新浪微博api接口發佈微博成功後,會返回一個二維數組,這個返回的數組裏有微博的內容,發佈微博的用戶信息等等.卻沒有所發佈成功的微博的URL.很多時候如果要記錄信息在數據庫 則微博URL應該必不可少.通過新浪微博論壇搜索,發現有以下方法.

原理:

新浪微博的URL都是如:http://weibo.com/1247667622/l4EV85aqp 這樣三部分.

第一部分(綠色部分)爲新浪微博的域名,第二部分(紅色部分)爲博主Uid,第三部分(藍色)爲一串貌似隨機的字符串.

如果通過方法能計算出藍色字串與返回的數組裏的對應關係則好解決多了.

首先分組藍色字串 ,從後往前4個字符一組,得到以下三組字符:
l
4EV8
5aqp

將它們分別轉換成62進制的數值則爲 21,111061, 1231717  將它們組合起來就是一串 2111106141231717 類似這樣的字串

通過發現返回的二維數組裏有個 [mid]的字段,其返回結果爲 2111106141231717.剛好是對應的.

故:通過api接口發佈微博,接收其成功後返回的數組,提取其裏面的 mid  將mid轉化成 62進字字串,再將發佈微博的UID組合.

原碼

附1:寫了個mid與url相互轉換的Javascript類(來自網絡)

附2:php版 字串轉id函數


 

function sinaWburl2ID($url) {
	$surl[2] = str62to10(substr($url, strlen($url) - 4, 4));
	$surl[1] = str62to10(substr($url, strlen($url) - 8, 4));
	$surl[0] = str62to10(substr($url, 0, strlen($url) - 8));
	$int10 = $surl[0] . $surl[1] . $surl[2];
	return ltrim($int10, '0');
}
function str62to10($str62) { //62進制到10進制
	$strarry = str_split($str62);
	$str = 0;
	for ($i = 0; $i < strlen($str62); $i++) {
		$vi = Pow(62, (strlen($str62) - $i -1));
 
		$str += $vi * str62keys($strarry[$i]);
	}
	$str = str_pad($str, 7, "0", STR_PAD_LEFT);
	return $str;
}
 
function str62keys($ks) //62進制字典
{
	$str62keys = array (
		"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"
	);
	return array_search($ks, $str62keys);
}
echo  sinaWburl2ID('l4EV85aqp '); //調用

php版Mid轉Str版

function midToStr($mid) {
	settype($mid, 'string');
	$mid_length = strlen($mid);
	$url = '';
	$str = strrev($mid);
	$str = str_split($str, 7);
 
	foreach ($str as $v) {
		$char = intTo62(strrev($v));
		$char = str_pad($char, 4, "0");
		$url .= $char;
	}
 
	$url_str = strrev($url);
 
	return ltrim($url_str, '0');
}
 
function str62keys_int_62($key) //62進制字典
{
	$str62keys = array (
		"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"
	);
	return $str62keys[$key];
}
 
/* url 10 進制 轉62進制*/
 
function intTo62($int10) {
	$s62 = '';
	$r = 0;
	while ($int10 != 0) {
		$r = $int10 % 62;
		$s62 .= str62keys_int_62($r);
		$int10 = floor($int10 / 62);
	}
 
	return $s62;
}
echo midToStr($mid);//調用

新浪API方法

$char_id='y6D72AsN7';
//通過url 字符id獲取數字mid
$re = json_decode(file_get_contents("http://api.t.sina.com.cn/queryid.json?mid=$char_id&isBase62=1&type=1"));
echo $id = $re->id;
 
//通過數字mid獲取url 字符id
$re = json_decode(file_get_contents("http://api.t.sina.com.cn/querymid.json?id=$id"));
echo   $re->mid;


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章