使用Python進行新浪微博的mid和url互相轉換執行個體(10進位和62進位互算)

來源:互聯網
上載者:User
不過,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。
代碼如下:
複製代碼 代碼如下:


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轉為url也就很簡單了,對於一個mid,我們從後向前每7位一組,用base62編碼來encode,拼起來即可。同樣要注意的是,每7個一組的數字,除了開頭一組,如果得到的62進位數字不足4位,需要補足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)

運行doctest可以看到所有的測試案例都通過了。

最後其實我不太明白為什麼新浪微博不直接把url包含在欄位中,而新浪微博的開放平台也有很多不符合標準的地方,其實本文的內容並沒有什麼技術含量,不過就是讓開發人員折騰一下。還有比如refresh token的問題等等,這裡就不一一枚舉了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.