不過,status中包含了一個mid字段,通過mid,我們實際上是可以通過計算得到url的。
在開始計算之前有必要說明一下,什么是base62編碼。它實際上就是十進制和62位進制的互換。對于62進制,從0數到9以后,10用小寫字母a表示,接著數完26個字母,到z為35,然后36為大寫字母A,一直到61為大寫字母Z。所以,我們可以實現十進制數字base62編碼的encode和decode。下面的代碼實際上來自stackoverflow:
代碼如下:
ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def base62_encode(num, alphabet=ALPHABET):
"""Encode a number in Base X
`num`: The number to encode
`alphabet`: The alphabet to use for encoding
"""
if (num == 0):
return alphabet[0]
arr = []
base = len(alphabet)
while num:
rem = num % base
num = num // base
arr.append(alphabet[rem])
arr.reverse()
return ''.join(arr)
def base62_decode(string, alphabet=ALPHABET):
"""Decode a Base X encoded string into the number
Arguments:
- `string`: The encoded string
- `alphabet`: The alphabet to use for encoding
"""
base = len(alphabet)
strlen = len(string)
num = 0
idx = 0
for char in string:
power = (strlen - (idx + 1))
num += alphabet.index(char) * (base ** power)
idx += 1
return num
下面先說url到mid的轉換。對于一個新浪微博url,它是形如:http://weibo.com/2991905905/z579Hz9Wr,中間的數字是用戶的uid,重要的是后面的字符串“z579Hz9Wr”。它的計算其實也很簡單,從后向前四個字符一組,就得到:
代碼如下:
z
579H
z9Wr
將每個字符串用base62編碼來decode,就可以得到它們的十進制數字分別為:
代碼如下:
35
1219149
8379699
將它們拼起來就可以得到mid為:“3512191498379699”。這里要強調的是:對于除了開頭的字符串,如果得到的十進制數字不足7位,需要在前面補足0。比如得到的十進制數分別為:35,33040,8906190,則需要在33040前面添上兩個0。
代碼如下:
代碼如下:
新聞熱點
疑難解答