php微博mid转换url,新浪微博mid和url的互算
我們在使用新浪微博API時,有時需要得到一個微博的url,但是如statuses/public_timeline等接口中取得的微博status的字段中並沒有包含。不過,status中包含了一個mid字段,通過mid,我們實際上是可以通過計算得到url的。
在開始計算之前有必要說明一下,什么是base62編碼。它實際上就是十進(jìn)制和62位進(jìn)制的互換。對於62進(jìn)制,從0數(shù)到9以后,10用小寫字母a表示,接著數(shù)完26個字母,到z為35,然后36為大寫字母A,一直到61為大寫字母Z。所以,我們可以實現(xiàn)十進(jìn)制數(shù)字base62編碼的encode和decode。下面的代碼實際上來自stackoverflow:
1 ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
2
3 def base62_encode(num, alphabet=ALPHABET):4 """Encode a number in Base X5
6 `num`: The number to encode7 `alphabet`: The alphabet to use for encoding8 """
9 if (num ==0):10 returnalphabet[0]11 arr =[]12 base =len(alphabet)13 whilenum:14 rem = num %base15 num = num //base16 arr.append(alphabet[rem])17 arr.reverse()18 return ''.join(arr)19
20 def base62_decode(string, alphabet=ALPHABET):21 """Decode a Base X encoded string into the number22
23 Arguments:24 - `string`: The encoded string25 - `alphabet`: The alphabet to use for encoding26 """
27 base =len(alphabet)28 strlen =len(string)29 num =030
31 idx =032 for char instring:33 power = (strlen - (idx + 1))34 num += alphabet.index(char) * (base **power)35 idx += 1
36
37 return num
下面先說url到mid的轉(zhuǎn)換。對於一個新浪微博url,它是形如:http://weibo.com/2991905905/z579Hz9Wr,中間的數(shù)字是用戶的uid,重要的是后面的字符串“z579Hz9Wr”。它的計算其實也很簡單,從后向前四個字符一組,就得到:
z
579H
z9Wr
將每個字符串用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前面添上兩個0。
代碼如下:
1 defurl_to_mid(url):2 '''
3 >>> url_to_mid('z0JH2lOMb')4 3501756485200075L5 >>> url_to_mid('z0Ijpwgk7')6 3501703397689247L7 >>> url_to_mid('z0IgABdSn')8 3501701648871479L9 >>> url_to_mid('z08AUBmUe')10 3500330408906190L11 >>> url_to_mid('z06qL6b28')12 3500247231472384L13 >>> url_to_mid('yCtxn8IXR')14 3491700092079471L15 >>> url_to_mid('yAt1n2xRa')16 3486913690606804L17 '''
18 url = str(url)[::-1]19 size = len(url) / 4 if len(url) % 4 == 0 else len(url) / 4 + 1
20 result =[]21 for i inrange(size):22 s = url[i * 4: (i + 1) * 4][::-1]23 s =str(base62_decode(str(s)))24 s_len =len(s)25 if i < size - 1 and s_len < 7:26 s = (7 - s_len) * '0' +s27 result.append(s)28 result.reverse()29 return int(''.join(result))
mid轉(zhuǎn)為url也就很簡單了,對於一個mid,我們從后向前每7位一組,用base62編碼來encode,拼起來即可。同樣要注意的是,每7個一組的數(shù)字,除了開頭一組,如果得到的62進(jìn)制數(shù)字不足4位,需要補(bǔ)足0。
1 defmid_to_url(midint):2 '''
3 >>> mid_to_url(3501756485200075)4 'z0JH2lOMb'5 >>> mid_to_url(3501703397689247)6 'z0Ijpwgk7'7 >>> mid_to_url(3501701648871479)8 'z0IgABdSn'9 >>> mid_to_url(3500330408906190)10 'z08AUBmUe'11 >>> mid_to_url(3500247231472384)12 'z06qL6b28'13 >>> mid_to_url(3491700092079471)14 'yCtxn8IXR'15 >>> mid_to_url(3486913690606804)16 'yAt1n2xRa'17 '''
18 midint = str(midint)[::-1]19 size = len(midint) / 7 if len(midint) % 7 == 0 else len(midint) / 7 + 1
20 result =[]21 for i inrange(size):22 s = midint[i * 7: (i + 1) * 7][::-1]23 s =base62_encode(int(s))24 s_len =len(s)25 if i < size - 1 and len(s) < 4:26 s = '0' * (4 - s_len) +s27 result.append(s)28 result.reverse()29 return ''.join(result)
運行doctest可以看到所有的測試用例都通過了。
最后其實我不太明白為什么新浪微博不直接把url包含在字段中,而新浪微博的開放平臺也有很多不符合標(biāo)準(zhǔn)的地方,其實本文的內(nèi)容並沒有什么技術(shù)含量,不過就是讓開發(fā)人員折騰一下。還有比如refresh token的問題等等,這里就不一一枚舉了。
總結(jié)
以上是生活随笔為你收集整理的php微博mid转换url,新浪微博mid和url的互算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KuGoo(酷狗) V3.243 快乐无
- 下一篇: 键的校核matlab仿真