使用Python進(jìn)行新浪微博的mid和url互相轉(zhuǎn)換實(shí)例(10進(jìn)制和62進(jìn)制互算)
不過,status中包含了一個(gè)mid字段,通過mid,我們實(shí)際上是可以通過計(jì)算得到url的。
在開始計(jì)算之前有必要說明一下,什么是base62編碼。它實(shí)際上就是十進(jìn)制和62位進(jìn)制的互換。對于62進(jìn)制,從0數(shù)到9以后,10用小寫字母a表示,接著數(shù)完26個(gè)字母,到z為35,然后36為大寫字母A,一直到61為大寫字母Z。所以,我們可以實(shí)現(xiàn)十進(jìn)制數(shù)字base62編碼的encode和decode。下面的代碼實(shí)際上來自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的轉(zhuǎn)換。對于一個(gè)新浪微博url,它是形如:http://weibo.com/2991905905/z579Hz9Wr,中間的數(shù)字是用戶的uid,重要的是后面的字符串“z579Hz9Wr”。它的計(jì)算其實(shí)也很簡單,從后向前四個(gè)字符一組,就得到:
z
579H
z9Wr
將每個(gè)字符串用base62編碼來decode,就可以得到它們的十進(jìn)制數(shù)字分別為:
35
1219149
8379699
將它們拼起來就可以得到mid為:“3512191498379699”。這里要強(qiáng)調(diào)的是:對于除了開頭的字符串,如果得到的十進(jìn)制數(shù)字不足7位,需要在前面補(bǔ)足0。比如得到的十進(jìn)制數(shù)分別為:35,33040,8906190,則需要在33040前面添上兩個(gè)0。
代碼如下:
def url_to_mid(url):
'''
>>> url_to_mid('z0JH2lOMb')
3501756485200075L
>>> url_to_mid('z0Ijpwgk7')
3501703397689247L
>>> url_to_mid('z0IgABdSn')
3501701648871479L
>>> url_to_mid('z08AUBmUe')
3500330408906190L
>>> url_to_mid('z06qL6b28')
3500247231472384L
>>> url_to_mid('yCtxn8IXR')
3491700092079471L
>>> url_to_mid('yAt1n2xRa')
3486913690606804L
'''
url = str(url)[::-1]
size = len(url) / 4 if len(url) % 4 == 0 else len(url) / 4 + 1
result = []
for i in range(size):
s = url[i * 4: (i + 1) * 4][::-1]
s = str(base62_decode(str(s)))
s_len = len(s)
if i < size - 1 and s_len < 7:
s = (7 - s_len) * '0' + s
result.append(s)
result.reverse()
return int(''.join(result))
mid轉(zhuǎn)為url也就很簡單了,對于一個(gè)mid,我們從后向前每7位一組,用base62編碼來encode,拼起來即可。同樣要注意的是,每7個(gè)一組的數(shù)字,除了開頭一組,如果得到的62進(jìn)制數(shù)字不足4位,需要補(bǔ)足0。
def mid_to_url(midint):
'''
>>> mid_to_url(3501756485200075)
'z0JH2lOMb'
>>> mid_to_url(3501703397689247)
'z0Ijpwgk7'
>>> mid_to_url(3501701648871479)
'z0IgABdSn'
>>> mid_to_url(3500330408906190)
'z08AUBmUe'
>>> mid_to_url(3500247231472384)
'z06qL6b28'
>>> mid_to_url(3491700092079471)
'yCtxn8IXR'
>>> mid_to_url(3486913690606804)
'yAt1n2xRa'
'''
midint = str(midint)[::-1]
size = len(midint) / 7 if len(midint) % 7 == 0 else len(midint) / 7 + 1
result = []
for i in range(size):
s = midint[i * 7: (i + 1) * 7][::-1]
s = base62_encode(int(s))
s_len = len(s)
if i < size - 1 and len(s) < 4:
s = '0' * (4 - s_len) + s
result.append(s)
result.reverse()
return ''.join(result)
運(yùn)行doctest可以看到所有的測試用例都通過了。
最后其實(shí)我不太明白為什么新浪微博不直接把url包含在字段中,而新浪微博的開放平臺也有很多不符合標(biāo)準(zhǔn)的地方,其實(shí)本文的內(nèi)容并沒有什么技術(shù)含量,不過就是讓開發(fā)人員折騰一下。還有比如refresh token的問題等等,這里就不一一枚舉了。
相關(guān)文章
在Python中Dataframe通過print輸出多行時(shí)顯示省略號的實(shí)例
今天小編就為大家分享一篇在Python中Dataframe通過print輸出多行時(shí)顯示省略號的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12MacBook m1芯片采用miniforge安裝python3.9的方法示例
這篇文章主要介紹了MacBook m1芯片采用miniforge安裝python3.9的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04python 編寫簡單網(wǎng)頁服務(wù)器的實(shí)例
今天小編就為大家分享一篇python 編寫簡單網(wǎng)頁服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06解決selenium模塊利用performance獲取network日志請求報(bào)錯(cuò)的問題(親測有效)
這篇文章主要介紹了解決selenium模塊利用performance獲取network日志請求報(bào)錯(cuò)的問題(親測有效),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03解決Python中l(wèi)ist里的中文輸出到html模板里的問題
今天小編就為大家分享一篇解決Python中l(wèi)ist里的中文輸出到html模板里的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12