Fork me on GitHub

python获取bilibili封面

python获取bilibili封面

2020年3月23日前AV号

通过一个api接口我们就可以通过AV号(aid)获取视频封面的地址,
https://api.bilibili.com/x/web-interface/view?aid=加上AV号
编写python代码如下,输入一个av号,输出该视频封面的地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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获取封面。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)