# 弹幕操作 ## 发送视频弹幕 > https://api.bilibili.com/x/v2/dm/post *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP 此接口与漫画弹幕相同 `mode=6`的逆向弹幕与`mode=8`的代码弹幕不可发送 **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------------- | ---- | ------------------------- | --------------- | ------------------------------------------------------------ | | access_key | str | APP 登录 Token | APP 方式必要 | | | type | num | 弹幕类选择 | 必要 | 1:视频弹幕
2:漫画弹幕 | | oid | num | 视频 cid | 必要 | | | msg | str | 弹幕内容 | 必要 | 长度小于 100 字符 | | bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | | aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | | progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒
默认为0 | | color | num | 弹幕颜色设置 | 非必要 | 十进制 RGB888 值
如`16777215`为 #FFFFFF 即白色 | | fontsize | num | 弹幕字号设置 | 非必要 | 默认为 25
极小:12
超小:16
小:18
标准:25
大:36
超大:45
极大:64 | | pool | num | 弹幕池选择 | 非必要 | 0:普通池
1:字幕池
2:特殊池(代码/BAS弹幕)
默认为0 | | mode | num | 弹幕类型选择 | 必要 | 1:普通弹幕
4:底部弹幕
5:顶部弹幕
7:高级弹幕
9:BAS弹幕(`pool`必须为2) | | rnd | num | 当前时间戳*1000000 | 非必要 | **若无此项,则发送弹幕冷却时间限制为90s**
若有此项,则发送弹幕冷却时间限制为5s | | colorful | num | 彩色弹幕 | 非必要 | 60001:专属渐变彩色(需要会员) | | checkbox_type | num | 是否带 UP 身份标识 | 非必要 | 0:普通
4:带有标识 | | csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
-404:无此项
36700:系统升级中
36701:弹幕包含被禁止的内容
36702:弹幕长度大于100
36703:发送频率过快
36704:禁止向未审核的视频发送弹幕
36705:您的等级不足,不能发送弹幕
36706:您的等级不足,不能发送顶端弹幕
36707:您的等级不足,不能发送底端弹幕
36708:您的等级不足,不能发送彩色弹幕
36709:您的等级不足,不能发送高级弹幕
36710:您的权限不足,不能发送这种样式的弹幕
36711:该视频禁止发送弹幕
36712:level 1用户发送弹幕的最大长度为20
36713:稿件未付费
36714:弹幕发送时间不合法
36715:当日操作数量超过上限
36718:目前您不是大会员,无法使用会员权益 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | obj | 信息本体 | | `data`对象: | 字段 | 类型 | 内容 | 备注 | | ------------ | ---------- | ------------------ | -------------------------------- | | action | str | (?) | | | animation | str | 弹幕样式 Json? | | | colorful_src | str 或 obj | 渐变彩色样式信息? | 当请求参数`colorful=60001`时有效 | | dm_content | str | (?) | | | dmid | num | 弹幕 dmid | | | dmid_str | str | 弹幕 dmid | 字串形式 | | visible | bool | (?) | | `data`中的`colorful_src`对象: | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | ----------------- | ---- | | type | num | 60001 | | | src | str | 渐变色样式 Json? | | **示例:** 为视频`av2`/`BV1xx411c7mD`(cid为`62131`)的 5000ms 位置发送一条弹幕`前来考古`(颜色为 #FFFFFF,字号 25,普通弹幕,游动弹幕) ```shell curl 'https://api.bilibili.com/x/v2/dm/post' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=62131' \ --data-urlencode 'msg=前来考古' \ --data-urlencode 'aid=2' \ --data-urlencode 'progress=5000' \ --data-urlencode 'color=16777215' \ --data-urlencode 'fontsize=25' \ --data-urlencode 'pool=0' \ --data-urlencode 'mode=1' \ --data-urlencode 'rnd=3456789987654321' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"0", "ttl":1, "data":{ "action":"", "dmid":32161968826613767, "dmid_str":"32161968826613767", "visible":true } } ```
## 发送互动弹幕 > https://api.bilibili.com/x/v2/dm/command/post *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP 2020-09-25 B站更新了互动弹幕功能,包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能 详情见: [【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) [引导关注卡片]( https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | | access_key | str | APP登录Token | APP方式必要 | | | type | num | 互动弹幕类型 | 必要 | 1:UP主头像弹幕
2:关联视频弹幕
5:视频内嵌引导关注按钮 | | aid | num | 稿件avid | 必要 | | | cid | num | 视频cid | 必要 | | | progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒
默认为0 | | plat | num | 平台标识 | 必要 | 1:web端
2:安卓端
8:视频管理页面 | | data | str | json序列 | 必要 | | | dmid | num | 修改互动弹幕的弹幕id | 非必要 | 注:修改弹幕`plat`必须为8 | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | `data`参数json序列: 类型为【UP主头像弹幕】时: | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | -------- | ---- | | msg | str | 弹幕内容 | | 类型为【关联视频弹幕】时: | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | -------------- | ---- | | msg | str | 弹幕内容 | | | bvid | str | 关联视频的bvid | | 类型为【视频内嵌引导关注按钮】时: | 字段 | 类型 | 内容 | 备注 | | -------- | ---- | -------- | --------------- | | duration | num | 持续时间 | 单位为毫秒 | | posX | num | X坐标 | 区间:[118-549] | | posY | num | Y坐标 | 区间:[82-293] | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ----------------------------- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
-404:无此项
-500:服务器错误
36711:该视频禁止发送弹幕
79026:发送失败,请勿填写当前稿件bvid
79024:发送失败,请输入正确的bvid
79036:该指令弹幕超出限制
79037:关注弹幕坐标溢出 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | 正确时:obj
错误时:null | 信息本体 | | `data`对象: | 字段 | 类型 | 内容 | 备注 | | -------- | ---- | ---------------------- | ------------------------------------------------------------ | | command | str | 指令? | UP主头像弹幕:#UP#
关联视频弹幕:#LINK#
视频内嵌引导关注按钮:#ATTENTION# | | content | str | 弹幕内容 | | | extra | str | 弹幕数据 | json序列 | | id | num | 弹幕dmid | | | idStr | str | 弹幕dmid | 字串形式 | | mid | num | 用户mid | | | oid | num | 视频cid | | | progress | num | 弹幕出现在视频内的时间 | | | type | num | 互动弹幕类型 | 1:UP主头像弹幕
2:关联视频弹幕
5:视频内嵌引导关注按钮 | `extra`序列数据: 类型为【UP主头像弹幕】时: | 字段 | 类型 | 内容 | 备注 | | ---- | ---- | ----------- | ---- | | icon | str | UP主头像url | | 类型为【关联视频弹幕】时: | 字段 | 类型 | 内容 | 备注 | | ----- | ---- | -------------- | ---- | | aid | num | 关联视频的avid | | | title | str | 关联视频的标题 | | | bvid | str | 关联视频的bvid | | 类型为【视频内嵌引导关注按钮】时: | 字段 | 类型 | 内容 | 备注 | | -------- | ---- | ------------ | ------------------------------------------ | | duration | num | 持续时间 | 单位为毫秒 | | posX | num | X坐标 | 区间:[118-549] | | posY | num | Y坐标 | 区间:[82-293] | | icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | | type | num | 关注按钮类型 | 0:仅关注
1:仅三联
2:关注+三联 | **示例:** 为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条UP主头像弹幕`test` ```shell curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=1' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ --data-urlencode 'progress=5000' \ --data-urlencode 'plat=1' \ --data-urlencode 'data={"msg":"test"}' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code": 0, "message": "0", "ttl": 1, "data": { "id": 39053842117558279, "oid": 230709860, "mid": 293793435, "type": 1, "command": "#UP#", "content": "test", "extra": "{\"icon\":\"http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg\"}", "idStr": "39053842117558279" } } ```
为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条发送关联视频弹幕`测试1234`关联视频为`BV1kz4y1X7XP` ```shell curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=2' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ --data-urlencode 'progress=5000' \ --data-urlencode 'plat=1' \ --data-urlencode 'data={"bvid":"BV1kz4y1X7XP","msg":"测试1234"}' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code": 0, "message": "0", "ttl": 1, "data": { "id": 39054383689236483, "oid": 230709860, "mid": 293793435, "type": 2, "command": "#LINK#", "content": "测试1234", "progress": 11925, "extra": "{\"aid\":583785685,\"title\":\"【cmd】访问api 命令行也能上B站\",\"bvid\":\"BV1kz4y1X7XP\"}", "idStr": "39054383689236483" } } ```
为视频`av201947622`(cid为`230709860`)的5000ms位置发送视频内嵌引导关注按钮,X坐标为118,Y坐标为82,持续时间为5000ms ```shell curl 'https://api.bilibili.com/x/v2/dm/command/post' \ --data-urlencode 'type=5' \ --data-urlencode 'aid=201947622' \ --data-urlencode 'cid=230709860' \ --data-urlencode 'progress=5000' \ --data-urlencode 'plat=1' \ --data-urlencode 'data={"duration":5000,"posX":118,"posY":82}' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code": 0, "message": "0", "ttl": 1, "data": { "id": 39055158405496839, "oid": 230709860, "mid": 293793435, "type": 5, "command": "#ATTENTION#", "progress": 5000, "extra": "{\"duration\":5000,\"posX\":118,\"posY\":82}", "idStr": "39055158405496839" } } ```
## 撤回弹幕 > https://api.bilibili.com/x/dm/recall *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP 仅能撤回自己两分钟内的弹幕,且每天只有3次机会 **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | ---- | | access_key | str | APP登录Token | APP方式必要 | | | dmid | num | 弹幕dmid | 必要 | | | cid | num | 视频cid | 必要 | | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
-404:无此项
36301:撤回失败,弹幕发送已过2分钟
36302:撤回失败,弹幕已经被删除或撤回
36303:撤回失败,今天撤回的机会已经用完
36304:撤回失败,服务器出错 | | message | str | 错误信息 | 成功后显示剩余次数 | | ttl | num | 1 | | **示例:** 撤回`cid=168901231`下的弹幕`32310301474947077`的弹幕 ```shell curl 'https://api.bilibili.com/x/dm/recall' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'dmid=32310301474947077' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code": 0, "message": "撤回成功,你还有3次撤回机会" } ```
## 购买高级弹幕发送权限 > https://api.bilibili.com/x/dm/adv/buy *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP 购买一次需要2硬币,同时向up主发送请求 **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | ---- | | access_key | str | APP登录Token | APP方式必要 | | | mode | str | sp | 必要 | | | cid | num | 视频cid | 必要 | | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-107:硬币不足
-400:请求错误
36007:不允许购买
36009:正在确认中
36010:已购买 | | message | str | 返回信息 | | | ttl | num | 1 | | 示例: 购买视频cid为`168901231`的高级弹幕发送权限 ```shell curl 'https://api.bilibili.com/x/dm/adv/buy' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'mode=sp' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"已成功购买" } ```
## 检测高级弹幕发送权限 > https://api.bilibili.com/x/dm/adv/state *请求方式:GET* 认证方式:Cookie(SESSDATA)或APP **url参数:** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------ | ----------- | ---- | | access_key | str | APP登录Token | APP方式必要 | | | mode | str | sp | 必要 | | | cid | num | 视频cid | 必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ----------------------------- | ---------------- | -------------------------------------------------- | | code | num | 返回值 | 0:成功
-101:账号未登录
--400:请求错误 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | | data | 有效时:obj
无效时:null | 有效时:信息本体 | | `data`对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | ---------------- | ------------------------------------------ | | coins | num | 需要支付的硬币数 | | | confirm | num | 是否同意 | 1:同意
2:未同意
未购买时无此项 | | accept | bool | 是否允许申请 | true:允许
false:不允许 | | hasBuy | bool | 是否已购买 | true:已购买
未购买时无此项 | **示例:** 查询视频cid为`168901231`的视频高级弹幕权限购买状态 当前状态为已购买且同意 ```shell curl -G 'https://api.bilibili.com/x/dm/adv/state' \ --data-urlencode 'cid=168901231' \ --data-urlencode 'mode=sp' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code": 0, "message": "0", "ttl": 1, "data": { "coins": 2, "confirm": 1, "accept": true, "hasBuy": true } } ```
## 点赞弹幕 > https://api.bilibili.com/x/v2/dm/thumbup/add *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP 查询指定弹幕点赞状态参阅文档 [弹幕点赞查询](thumbup.md) **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------- | --------------- | ------------------------------------------- | | access_key | str | APP 登录 Token | APP 方式必要 | | | dmid | num | 目标弹幕 dmid | 必要 | | | oid | num | 目标弹幕所在视频 cid | 必要 | | | op | num | 操作 | 必要 | 1:点赞
2:取消点赞 | | platform | str | 平台标识 | 非必要 | web_player:web 播放器
android:安卓端 | | csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | |---------|-----|------|------------------------------------------------------------------------------------------------------------------------------------| | code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误
36106:该弹幕已被删除
36805:该视频禁止点赞弹幕
65004:取消赞失败 未点赞过
65006:已赞过 | | message | str | 错误信息 | 默认为0 | | tll | num | 1 | | **示例** 为`cid=145928946`下的弹幕`35600074482384899`点赞 ```shell curl 'https://api.bilibili.com/x/v2/dm/thumbup/add' \ --data-urlencode 'dmid=35600074482384899' \ --data-urlencode 'oid=145928946' \ --data-urlencode 'op=1' \ --data-urlencode 'platform=web_player' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"0", "ttl":1 } ```
## 举报弹幕 > https://api.bilibili.com/x/dm/report/add *请求方式:POST* 认证方式:Cookie(SESSDATA)或APP **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | ------------------ | | access_key | str | APP登录Token | APP方式必要 | | | cid | num | 视频cid | 必要 | | | dmid | num | 弹幕dmid | 必要 | | | reason | num | 举报类型 | 必要 | **类型代码见下表** | | content | str | 其他举报备注 | 非必要 | `reason=11`时有效 | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | 举报类型`reason`: | 代码 | 含义 | | ---- | ---------- | | 1 | 违法违禁 | | 2 | 色情低俗 | | 3 | 赌博诈骗 | | 4 | 人身攻击 | | 5 | 侵犯隐私 | | 6 | 垃圾广告 | | 7 | 引战 | | 8 | 剧透 | | 9 | 恶意刷屏 | | 10 | 视频无关 | | 11 | 其他 | | 12 | 青少年不良 | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误
36201:举报弹幕不存在
36203:举报原因类型错误
36204:已举报 | | message | str | 错误信息 | 默认为空 | | tll | num | 1 | 举报失败时 | **示例** 举报`cid=145928946`下的弹幕`35600074482384899`,理由是`引战` ```shell curl 'https://api.bilibili.com/x/dm/report/add' \ --data-urlencode 'cid=145928946' \ --data-urlencode 'dmid=35600074482384899' \ --data-urlencode 'reason=7' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"" } ```
## 保护&删除弹幕 > https://api.bilibili.com/x/v2/dm/edit/state *请求方式:POST* 认证方式:Cookie(SESSDATA) 或APP 注:只能操作自己的稿件或有骑士权限的稿件 **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | --------------------------------------------- | | access_key | str | APP登录Token | APP方式必要 | | | type | num | 弹幕类选择 | 必要 | 1:视频弹幕 | | oid | num | 视频cid | 必要 | | | dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 | | state | num | 操作代码 | 必要 | 1:删除弹幕
2:弹幕保护
3:取消保护 | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误
-403:访问权限不足 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | **示例** 删除`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531` ```shell curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=145928946' \ --data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \ --data-urlencode 'state=1' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"0", "ttl":1 } ```
## 修改字幕池 > https://api.bilibili.com/x/v2/dm/edit/pool *请求方式:POST* 认证方式:Cookie(SESSDATA) 或APP 注:只能操作自己的稿件或有骑士权限的稿件 **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | -------------------------------- | | access_key | str | APP登录Token | APP方式必要 | | | type | num | 弹幕类选择 | 必要 | 1:视频弹幕 | | oid | num | 视频cid | 必要 | | | dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 | | pool | num | 操作代码 | 必要 | 0:移出字幕池
1:移入字幕池 | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | **json回复:** 根对象: | 字段 | 类型 | 内容 | 备注 | | ------- | ---- | -------- | ------------------------------------------------------------ | | code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误
-403:访问权限不足 | | message | str | 错误信息 | 默认为0 | | ttl | num | 1 | | **示例** 将`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531`移入字幕池 ```shell curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ --data-urlencode 'type=1' \ --data-urlencode 'oid=145928946' \ --data-urlencode 'pool=1' \ --data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \ --data-urlencode 'csrf=xxx' \ -b 'SESSDATA=xxx' ```
查看响应示例: ```json { "code":0, "message":"0", "ttl":1 } ```