ホームページ >バックエンド開発 >Python チュートリアル >Pythonを使用して新浪微博のmidとurlを相互変換する例(10進数と10進数62の間の相互計算)

Pythonを使用して新浪微博のmidとurlを相互変換する例(10進数と10進数62の間の相互計算)

WBOY
WBOYオリジナル
2016-06-16 08:44:251579ブラウズ

ただし、status には Mid フィールドが含まれており、mid を通じて実際に URL を計算できます。

計算を始める前に、base62 エンコーディングとは何かを説明する必要があります。実際には、10 進数と 62 ビットの基数を交換します。 16 進数の場合、0 から 9 まで数えると 10 は小文字の a で表され、26 文字数えると z は 35 になり、36 は大文字の A、そして 61 までは大文字の Z になります。したがって、10 進数の Base62 エンコードのエンコードとデコードを実装できます。以下のコードは実際には stackoverflow からのものです:

コードをコピーします コードは次のとおりです:

ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

defbase62_encode(数値、alphabet= ALPHABET):
"""Base で数値をエンコードします > 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)

defbase62_decode(string, alphabet= ALPHABET):
"""Base エンコーディングをデコードします
"""
base = len(alphabet)
strlen = len(string)
num = 0

idx = 0
文字列のcharの場合:
、🎜>

URL から Mid への変換について話しましょう。 Sina Weibo の URL の形式は次のとおりです: http://weibo.com/2991905905/z579Hz9Wr 真ん中の数字はユーザーの uid で、重要なのは次の文字列「z579Hz9Wr」です。計算は実際には非常に簡単です。4 つの文字を後ろから前にグループ化すると、次のようになります。



コードをコピー

コードは次のとおりです:


z
579H
z9Wr

各文字列を Base62 エンコードでデコードすると、10 進数を取得できます:

コードをコピーします コードは次のとおりです:
35
1219149
8379699

これらを組み合わせると、mid:「3512191498379699」が得られます。ここで注意したいのは、先頭を除く文字列について、取得した10進数が7桁に満たない場合は、先頭に0を追加する必要があることです。たとえば、取得した 10 進数が 35、33040、および 8906190 の場合、33040 の前に 0 を 2 つ追加する必要があります。

コードは次のとおりです:

コードをコピーしますコードは次のとおりです:

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
結果 = []
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 s = (7 - s_len) * '0' + s
result.append(s)
result.reverse()
return int(''.join(result))

mid を URL にするのも簡単です。mid については、7 ビットずつ後ろから前に、base62 でエンコードし、エンコードします。同様に注意してください。

の数字は、先頭の 1 組を除いて、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 <サイズ - 1 およびレンズ s = '0' * (4 - s_len) + s
result.append(s)
result.reverse()
return ''.join(result)

doctest を実行すると、すべてのテスト アプリケーションが通過したことが確認できます。

最後に我不太明白は何新浪微博の URL を直接ハンドルするのではなく、新浪微博の公開平台にも多数の不一致規格の場所があり、本文の内容は何もありません。リフレッシュトークンのようなトークンもあり、ここには何もありません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。