# -- 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