使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
admin
2023-07-31 02:07:03
0

不过,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的问题等等,这里就不一一枚举了。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...