使用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 相关文章推荐
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
PyQt5利用QPainter绘制各种图形的实例
Oct 19 Python
python实现决策树分类算法
Dec 21 Python
Python将文字转成语音并读出来的实例详解
Jul 15 Python
django2笔记之路由path语法的实现
Jul 17 Python
一行python实现树形结构的方法
Aug 09 Python
python实现连续变量最优分箱详解--CART算法
Nov 22 Python
python 星号(*)的多种用途
Sep 21 Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 Python
Python中X[:,0]和X[:,1]的用法
May 10 Python
实例详解Python的进程,线程和协程
Mar 13 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
桌面中心(三)修改数据库
2006/10/09 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
python根据出生年份简单计算生肖的方法
2015/03/27 Python
python生成器推导式用法简单示例
2019/10/08 Python
python操作yaml说明
2020/04/08 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
详解Python调用系统命令的六种方法
2021/01/28 Python
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
介绍一下Ruby的特点
2013/01/20 面试题
自荐信格式写作方法有哪些呢
2013/11/20 职场文书
优乐美广告词
2014/03/14 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
PyQt5爬取12306车票信息程序的实现
2021/05/14 Python
详解Python描述符的工作原理
2021/06/11 Python
Python Matplotlib绘制条形图的全过程
2021/10/24 Python