使用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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
浅谈Python的文件类型
May 30 Python
python设计模式大全
Jun 27 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
Atom的python插件和常用插件说明
Jul 08 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
Pycharm小白级简单使用教程
Jan 08 Python
Python中的Cookie模块如何使用
Jun 04 Python
小结Python的反射机制
Sep 28 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
PHP正确配置mysql(apache环境)
2011/08/28 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
JQuery优缺点分析说明
2010/06/09 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
javascript获取url上某个参数的方法
2013/11/08 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
六道php面试题附答案
2014/06/05 面试题
应届生.NET方向面试题
2015/05/23 面试题
浙江文明网签名寄语
2014/01/18 职场文书
小学生期末评语
2014/04/21 职场文书
班组拓展活动方案
2014/08/14 职场文书
领导干部群众路线个人对照检查材料思想汇报
2014/09/30 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2014年仓库工作总结
2014/11/20 职场文书
Python基础知识之变量的详解
2021/04/14 Python
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Nginx四层负载均衡的配置指南
2021/06/11 Servers
在vue中import()语法不能传入变量的问题及解决
2022/04/01 Vue.js
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS