有两个弹幕api接口,分别是移动端与电脑端
https://comment.bilibili.com/ + cid + .xml
https://api.bilibili.com/x/v1/dm/list.so?oid= + cid
以电脑端为例子,使用谷歌浏览器打开某个哔哩哔哩的视频:
右键–检查–network–刷新–一个个找吧,如图,这里已经找到了,点击Headers,就是api了,移动端的请点击左上角的toggle device toolbar,重复上述步骤。
弹幕XML文件中的含义
啧啧,原来阿卡丽那么小?
参数1(157.47900):弹幕出现的时间,以秒数为单位
参数2(1):弹幕的模式,1-3 滚动弹幕,4 底端弹幕,5顶端弹幕,6 逆向弹幕,7 精准定位,8 高级弹幕
参数3(25):字号 (12非常小,16特小,18小,25中,36大,45很大,64特别大)
参数4(16777215):字体的颜色;这串数字是十进制表示;通常软件中使用的是十六进制颜色码;
e.g:
白色
RGB值:(255,255,255)
十进制值:16777215
十六进制值:#FFFFFF
参数5(1548340494):unix时间戳,从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数
参数6(0):弹幕池,0普通池,1字幕池,2特殊池 【目前特殊池为高级弹幕专用】
参数7(389b20da):发送者的ID,用于“屏蔽此弹幕的发送者”功能
参数8(11114024647262210):弹幕在弹幕数据库中rowID 用于“历史弹幕”功能。
获取弹幕
我们可以直接通过上面的方法从网页直接找到xml文件下载,我们也可以使用api接口获取弹幕。
使用api之前需要知道视频的cid,获取cid也需要一个api,一下为python代码
import requests,json,re,time,datetime
from bs4 import BeautifulSoup#这里就直接一次性倒入要用的库了
def get_oid(av_num:str)->int:#获取cid,输入视频av号num=re.search(r'\d+',av_num).group(0)url='https://api.bilibili.com/x/player/pagelist?aid={}&jsonp=jsonp'.format(num)#获取cid的apijs=requests.get(url).content.decode('utf8')js_format=json.loads(js)#转换为json格式return js_format['data'][0]['cid']#返回cid
def get_dm(oid):#获取弹幕,输入cidurl='https://api.bilibili.com/x/v1/dm/list.so?oid={}'.format(oid)#弹幕apidm=requests.get(url).content.decode('utf8')#编码,防止中文乱码soup = BeautifulSoup(dm)#美化下输出格式return soup.find_all('d')#只返回d标签,即弹幕
def run():av_num=input('请输入视频的AV号:')cid=get_oid(av_num)dm=get_dm(cid)print(dm)#此处偷懒点,直接打印了,当然也可以直接保存为xml文件
通过弹幕查询用户
参照xml文件各种字符的含义,通过参数7反查即可:
http://biliquery.typcn.com/api/user/hash/[用户Hash]
返回json,id后面就是用户的uid了
直接上python程序:
def find_users(usr_cid:str)->int:url='https://biliquery.typcn.com/api/user/hash/{}'.format(usr_cid)#反查,获得jsonjs=json.loads(requests.get(url).text)if len(js['data'])==1:#如果有两个id,选择后面的idposi=0else: posi=1usr_id=str(js['data'][posi]['id'])获得uidspace='https://space.bilibili.com/{}'.format(usr_id)return space#返回用户的个人主页网址
这边直接返回了用户主页的链接,也可以使用用户数据的api来获得用户数据
api:https://api.bilibili.com/x/space/acc/info?mid=【uid】&jsonp=jsonp
【uid】为用户的uid,返回json,里面有等级、姓名,是否大会员等许多用户信息
转换弹幕格式
送上一个网站:https://tiansh.github.io/us-danmaku/bilibili/
以及教程:https://www.bilibili.com/read/cv1022304/
转换成ass字幕后就可以离线播放有弹幕的视频了
unix时间戳转换
参数5,请直接百度转换,python代码:
def get_time(unix_time:int)->str:#输入unix时间戳time=datetime.datetime.fromtimestamp(unix_time)return time.strftime("%Y-%m-%d %H:%M:%S")#返回时间