使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)


Posted in Python onApril 25, 2014

不过,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的常见命令注入威胁
Feb 18 Python
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
Python实现115网盘自动下载的方法
Sep 30 Python
Python简明入门教程
Aug 04 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
Python常用模块之requests模块用法分析
May 15 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
Django+Celery实现动态配置定时任务的方法示例
May 26 Python
keras输出预测值和真实值方式
Jun 27 Python
python 发送邮件的四种方法汇总
Dec 02 Python
对象析构函数__del__在Python中何时使用
Mar 22 Python
Python time模块详解(常用函数实例讲解,非常好)
Apr 24 #Python
Python 时间操作例子和时间格式化参数小结
Apr 24 #Python
python抓取网页图片并放到指定文件夹
Apr 24 #Python
python字符串替换示例
Apr 24 #Python
python自动安装pip
Apr 24 #Python
python网络编程示例(客户端与服务端)
Apr 24 #Python
python使用PyFetion来发送短信的例子
Apr 22 #Python
You might like
PHP实现今天是星期几的几种写法
2013/09/26 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
PHP编译安装时常见错误解决办法
2015/05/28 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
Ajax 数据请求的简单分析
2011/04/05 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
vue实现修改图片后实时更新
2019/11/14 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
Python实现删除文件但保留指定文件
2015/06/21 Python
Python 25行代码实现的RSA算法详解
2018/04/10 Python
对Python3中的input函数详解
2018/04/22 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
python Web开发你要理解的WSGI &amp; uwsgi详解
2018/08/01 Python
transform python环境快速配置方法
2018/09/27 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
工商管理毕业生推荐信
2013/12/24 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
一分钟演讲稿
2014/04/30 职场文书
病假条格式范文
2015/08/17 职场文书
《7的乘法口诀》教学反思
2016/02/18 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
浅谈Python数学建模之固定费用问题
2021/06/23 Python