实现哔哩哔哩视频aid和bvid互转

# -- coding: utf-8 --

import re

table = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'
tr = {}
for i in range(58):
    tr[table[i]] = i
s = [11, 10, 3, 8, 4, 6]
xor = 177451812
add = 8728348608


def bv2av(x):
    r = 0
    for i in range(6):
        r += tr[x[s[i]]] * 58 ** i
    return (r - add) ^ xor


def av2bv(x):
    x = (x ^ xor) + add
    r = list('BV1  4 1 7  ')
    for i in range(6):
        r[s[i]] = table[x // 58 ** i % 58]
    return ''.join(r)

"""
以上算法转载自
如何看待 2020 年 3 月 23 日哔哩哔哩将稿件的「av 号」变更为「BV 号」? - mcfx的回答 - 知乎
https://www.zhihu.com/question/381784377/answer/1099438784
"""
def avbv_exc(data):
	if 'BV' in data:
		p = r'(BV[a-zA-Z0-9]{10})'
    	bvid = re.findall(p, data)[0]  
    	id = bv2av(bvid)
	if 'av' in data:
		p = r'av(\d+)'
		aid = int(re.findall(p,ta)[0]) # 这里要化为整型,否则会异常
		id = av2bv(aid)
	return id
	
if __name__ == '__main__':
    x = 'https://www.bilibili.com/video/BV1rK4y187eg/'    
    y = 'https://www.bilibili.com/video/av884740535'   
    print(avbv_exc(x))
    print(avbv_exc(y))

运行结果:

884740535
BV1rK4y187eg
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值