python获取bilibili封面 | Hlwdy's blog
python获取bilibili封面
发表于 2020-06-20 共 795 字
分类于 python

python获取bilibili封面

2020年3月23日前AV号

通过一个api接口我们就可以通过AV号(aid)获取视频封面的地址,

https://api.bilibili.com/x/web-interface/view?aid=加上AV号

编写python代码如下,输入一个av号,输出该视频封面的地址

import json
import requests
import urllib3

av = input('AV号: ').replace("av","")
url = 'https://api.bilibili.com/x/web-interface/view?aid=%s' % (av,)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3282.124',
            'Referer': 'https://www.bilibili.com'}

urllib3.disable_warnings()
response = requests.get(url, headers=headers, verify=False)
content = json.loads(response.text)
statue_code = content.get('code')
if statue_code == 0:
    print(content.get('data').get('pic'))
else:
    print('该AV号不存在')

BV号改动后

自 2020 年 3 月 23 日起,AV 号将全面升级为 BV 号。与纯数字的 AV 号不同,BV 号是一段由数字和大小写字母组成的字符串,经过算法自动生成。未来将统一使用 BV 号作为稿件标识。

虽说变成了BV号,但是仍然可以通过aid获取到视频封面,所以我们要先将BV号转成aid(具体分为两个步骤)

1.bvid获取cid:

https://api.bilibili.com/x/player/pagelist?bvid=(bvid)

在json的['data'][0]['cid']

2.用bvid和cid获取aid:

https://api.bilibili.com/x/web-interface/view?cid=(cid)&bvid=(bvid)

在json的['data']['aid']

注意:以上的bvid要带上前面的"BV"。

也就是说,先使用bvid获取cid,然后使用获取到的cid和原先的bvid获取到aid,最后调用以前的api获取封面。具体代码如下:

import json
import requests
import urllib3

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36',
            'Referer': 'https://www.bilibili.com'}

urllib3.disable_warnings()

bv = input('BV号: ')
url = 'https://api.bilibili.com/x/player/pagelist?bvid=%s' % (bv,)
response = requests.get(url, headers=headers, verify=False)
content = json.loads(response.text)
cid=content['data'][0]['cid']
url = 'https://api.bilibili.com/x/web-interface/view?cid=%s&bvid=%s' % (cid,bv,)
response = requests.get(url, headers=headers, verify=False)
content = json.loads(response.text)
av=content['data']['aid']
url = 'https://api.bilibili.com/x/web-interface/view?aid=%s' % (av,)

statue_code = content.get('code')
if statue_code == 0:
    print(content.get('data').get('pic'))
else:
    print('该BV号不存在')

本地转换bvid到aid

已经有人破解出了大致的转换算法,知乎链接: https://www.zhihu.com/question/381784377/answer/1099438784

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

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

def enc(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)

print(dec('BV17x411w7KC'))
print(dec('BV1Q541167Qg'))
print(dec('BV1mK4y1C7Bz'))
print(enc(170001))
print(enc(455017605))
print(enc(882584971))

即av号和bv互相转换。

至此,就可以获取到bilibili的视频封面地址了。之后当然也可以写一个下载器,将封面进行下载保存。

此外,再分享一些bilibili api:

获取UP主信息(视频总播放数、文章总浏览数)

https://api.bilibili.com/x/relation/stat?vmid=(UUID)

获取视频播放列表

https://api.bilibili.com/x/player/playurl?cid=(cid)&bvid=(bvid)

筛选文章
类别选择 (分类/标签)
全屏 关闭