加载中…

加载中...

正文 字体大小:

weibo的id与mid的转换及其在python中的实现方法

(2012-03-27 18:08:51)
标签:

杂谈

分类: Python

新浪微博地址url字符与mid的相互转换算法及原理


原文见:http://fengbin.me/weibo-mid-url-str/, 但仅仅介绍了再php里的实现方法,在python里呢?
通过新浪微博api接口发布微博成功后,会返回一个二维数组,这个返回的数组里有微博的内容,发布微博的用户信息等等.却没有所发布成功的微博的URL.很多时候如果要记录信息在数据库 则微博URL应该必不可少.通过新浪微博论坛搜索,发现有以下方法.

新浪微博的URL都是如:http://weibo.com/1247667622/l4EV85aqp 这样三部分.

第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分(蓝色)为一串貌似随机的字符串.

如果通过方法能计算出蓝色字串与返回的数组里的对应关系则好解决多了.

首先分组蓝色字串 ,从后往前4个字符一组,得到以下三组字符:
l
4EV8
5aqp

将它们分别转换成62进制的数值则为 21,111061, 1231717  将它们组合起来就是一串 2111106141231717 类似这样的字串

通过发现返回的二维数组里有个 [mid]的字段,其返回结果为 2111106141231717.刚好是对应的.

故:通过api接口发布微博,接收其成功后返回的数组,提取其里面的 mid  将mid转化成 62进字字串,再将发布微博的UID组合。





















我检索了zbase62 module, 发现不能用。不过还是在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

在python里利用以上的函数来检验一下

 

 

id=base62_decode('l4EV85aqp')

id1=base62_decode('l')

id2=base62_decode('4EV8')

id3=base62_decode('5aqp')

numList=[id1, id2, id3]

plus=int(''.join(map(str,numList)))

real=2111106141231717

print id, id1, id2, id3, plus, real

weibo的id与mid的转换及其在python中的实现方法


0

阅读 评论 收藏 禁止转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有