当前位置:  编程技术>python

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

    来源: 互联网  发布时间:2014-10-04

    本文导语:  不过,status中包含了一个mid字段,通过mid,我们实际上是可以通过计算得到url的。 在开始计算之前有必要说明一下,什么是base62编码。它实际上就是十进制和62位进制的互换。对于62进制,从0数到9以后,10用小写字母a表示,接...

不过,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(/tech-python/midint/index.html):
    '''
    >>> mid_to_url(/tech-python/3501756485200075/index.html)
    'z0JH2lOMb'
    >>> mid_to_url(/tech-python/3501703397689247/index.html)
    'z0Ijpwgk7'
    >>> mid_to_url(/tech-python/3501701648871479/index.html)
    'z0IgABdSn'
    >>> mid_to_url(/tech-python/3500330408906190/index.html)
    'z08AUBmUe'
    >>> mid_to_url(/tech-python/3500247231472384/index.html)
    'z06qL6b28'
    >>> mid_to_url(/tech-python/3491700092079471/index.html)
    'yCtxn8IXR'
    >>> mid_to_url(/tech-python/3486913690606804/index.html)
    '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不使用print而直接输出二进制字符串
  • 以二进制方式打开的文件是不是一定要使用二进制的方式进行读写????
  • vi二进制使用问题
  • 急!请问如何使用Perl中的什么函数查找文件中的16进制数字?
  • 请教如何使用awk从文件中读取十六进制列的问题
  • linux下使用tcp传送二进制文件跟文本文件一样吗?
  • 如何用sha1sum获取一个字符串使用sha-1加密后的16进制字符串?
  • php使用pack处理二进制文件的方法
  • 新浪SAE云平台下使用codeigniter的数据库配置
  • Python使用新浪微博API发送微博的例子
  • 新浪SAE云平台如何使用codeigniter数据库配置?
  • python使用新浪微博api上传图片到微博示例
  • python使用rsa加密算法模块模拟新浪微博登录
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 类的方法和实例方法,类字段和实例字段有什么不同,在使用上?
  • Python namedtuple(命名元组)使用实例
  • LINUX中实现单实例功能使用哪种IPC好啊?
  • boost库区间range基本原理及使用实例
  • android 弹出提示框的使用(图文实例)
  • c++类库Boost::bimap(双向映射)介绍及使用实例
  • 使用PackageManager获得应用信息实例方法
  • mongodb 数据库常用命令使用实例
  • android自动安装apk代码实例(不使用apk安装器安装)
  • java获取当前日期使用实例
  • 使用C#实现在屏幕上画图效果的代码实例
  • 实现DataGridView控件中CheckBox列的使用实例
  • c# 在windows服务中 使用定时器实例代码
  • C#中使用UDP通信实例
  • android WakeLock使用方法代码实例
  • php定界符<<<使用技巧和实例
  • 教你怎么使用sql游标实例分享
  • PHP使用CURL获取302跳转后的地址实例
  • 在python中的socket模块使用代理实例
  • PHP函数getenv简介和使用实例
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 请教如何使用awk从文件中读取十六进制列的问题 iis7站长之家
  • Office 2010 Module模式下使用VBA Addressof
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • c#中SAPI使用总结——SpVoice的使用方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3