日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python测试脚本 进制转换_使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)...

發布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python测试脚本 进制转换_使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不過,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的問題等等,這里就不一一枚舉了。

總結

以上是生活随笔為你收集整理的python测试脚本 进制转换_使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。