import{_ as r,c as o,a,b as l,d as n,e as d,w as e,r as u,o as i}from"./app-Dgsdh8A6.js";const p={};function m(D,t){const s=u("RouteLink");return i(),o("div",null,[t[73]||(t[73]=a(`
https://api.bilibili.com/x/v2/history/report
请求方式:POST
认证方式:APP或Cookie(SESSDATA)
正文参数( application/x-www-form-urlencoded ):
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---|---|---|---|---|
| access_key | str | APP登录Token | APP方式必要 | |
| aid | num | 稿件avid | 必要 | |
| cid | num | 视频cid | 必要 | 用于识别分P |
| progress | num | 观看进度 | 非必要 | 单位为秒 默认为0 |
| platform | str | 平台标识 | 非必要 | 可为android |
| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 |
json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -101:账号未登录 -111:csrf校验失败 -400:请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 |
示例:
记录视频av13662970(cid=126654047)的观看记录位于1248秒
Cookie方式:
curl 'https://api.bilibili.com/x/v2/history/report' \\
--data-urlencode 'aid=13662970' \\
--data-urlencode 'cid=126654047' \\
--data-urlencode 'progress=1248' \\
--data-urlencode 'platform=android' \\
--data-urlencode 'csrf=xxx' \\
-b 'SESSDATA=xxx'APP方式:
curl 'https://api.bilibili.com/x/v2/history/report' \\
--data-urlencode 'access_key=xxx' \\
--data-urlencode 'aid=13662970' \\
--data-urlencode 'cid=126654047' \\
--data-urlencode 'progress=1248' \\
--data-urlencode 'platform=android'{
"code": 0,
"message": "0",
"ttl": 1
}https://api.bilibili.com/x/click-interface/web/heartbeat
请求方式:POST
认证方式:仅可Cookie(SESSDATA)
默认间隔15秒一次, 亦可记录播放历史
该接口较为复杂, 且参数计算方法均为推测, 实际过程不明, 可能含有错误, 若要正式使用可以把已播放的持续时间全都设为相同值
URL参数:
`,24)),l("table",null,[t[22]||(t[22]=l("thead",null,[l("tr",null,[l("th",null,"参数名"),l("th",null,"类型"),l("th",null,"内容"),l("th",null,"必要性"),l("th",null,"备注")])],-1)),l("tbody",null,[t[12]||(t[12]=l("tr",null,[l("td",null,"w_start_ts"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"UNIX 秒级时间戳")],-1)),t[13]||(t[13]=l("tr",null,[l("td",null,"w_mid"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td")],-1)),t[14]||(t[14]=l("tr",null,[l("td",null,"w_aid"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td")],-1)),t[15]||(t[15]=l("tr",null,[l("td",null,"w_dt"),l("td",null,"num"),l("td",null,"2"),l("td",null,"非必要"),l("td")],-1)),t[16]||(t[16]=l("tr",null,[l("td",null,"w_realtime"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[17]||(t[17]=l("tr",null,[l("td",null,"w_playedtime"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[18]||(t[18]=l("tr",null,[l("td",null,"w_real_played_time"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[19]||(t[19]=l("tr",null,[l("td",null,"w_video_duration"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[20]||(t[20]=l("tr",null,[l("td",null,"w_last_play_progress_time"),l("td",null,"num"),l("td",null,[n("参见请求正文同名无"),l("code",null,"w_"),n("前缀参数")]),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[21]||(t[21]=l("tr",null,[l("td",null,"web_location"),l("td",null,"num"),l("td",null,"网页位置"),l("td",null,"非必要"),l("td",null,"视频详情页播放器: 1315873")],-1)),l("tr",null,[t[2]||(t[2]=l("td",null,"w_rid",-1)),t[3]||(t[3]=l("td",null,"num",-1)),t[4]||(t[4]=l("td",null,"WBI 签名",-1)),t[5]||(t[5]=l("td",null,"非必要",-1)),l("td",null,[t[1]||(t[1]=n("参见")),d(s,{to:"/docs/misc/sign/wbi.html"},{default:e(()=>t[0]||(t[0]=[n("WBI 签名")])),_:1,__:[0]})])]),l("tr",null,[t[8]||(t[8]=l("td",null,"wts",-1)),t[9]||(t[9]=l("td",null,"num",-1)),t[10]||(t[10]=l("td",null,"UNIX 秒级时间戳",-1)),t[11]||(t[11]=l("td",null,"非必要",-1)),l("td",null,[t[7]||(t[7]=n("参见")),d(s,{to:"/docs/misc/sign/wbi.html"},{default:e(()=>t[6]||(t[6]=[n("WBI 签名")])),_:1,__:[6]})])])])]),t[74]||(t[74]=l("p",null,[l("strong",null,"正文参数( application/x-www-form-urlencoded ):")],-1)),l("table",null,[t[53]||(t[53]=l("thead",null,[l("tr",null,[l("th",null,"参数名"),l("th",null,"类型"),l("th",null,"内容"),l("th",null,"必要性"),l("th",null,"备注")])],-1)),l("tbody",null,[t[29]||(t[29]=l("tr",null,[l("td",null,"aid"),l("td",null,"num"),l("td",null,"稿件avid"),l("td",null,"必要(可选)"),l("td",null,"avid与bvid任选一个(网页端请求默认仅使用aid)")],-1)),t[30]||(t[30]=l("tr",null,[l("td",null,"bvid"),l("td",null,"str"),l("td",null,"稿件bvid"),l("td",null,"必要(可选)"),l("td",null,"avid与bvid任选一个")],-1)),t[31]||(t[31]=l("tr",null,[l("td",null,"cid"),l("td",null,"num"),l("td",null,"视频cid"),l("td",null,"非必要"),l("td",null,"用于识别分P")],-1)),t[32]||(t[32]=l("tr",null,[l("td",null,"epid"),l("td",null,"num"),l("td",null,"番剧epid"),l("td",null,"非必要"),l("td")],-1)),t[33]||(t[33]=l("tr",null,[l("td",null,"sid"),l("td",null,"num"),l("td",null,"番剧ssid"),l("td",null,"非必要"),l("td")],-1)),t[34]||(t[34]=l("tr",null,[l("td",null,"mid"),l("td",null,"num"),l("td",null,"当前用户mid"),l("td",null,"非必要"),l("td")],-1)),t[35]||(t[35]=l("tr",null,[l("td",null,"played_time"),l("td",null,"num"),l("td",null,"视频播放进度"),l("td",null,"非必要"),l("td",null,[n("单位 秒"),l("br"),n("播放完成为 -1")])],-1)),t[36]||(t[36]=l("tr",null,[l("td",null,"realtime"),l("td",null,"num"),l("td",null,"本轮页面会话真实播放时间"),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[37]||(t[37]=l("tr",null,[l("td",null,"real_played_time"),l("td",null,"num"),l("td",null,"本轮页面会话真实视频播放持续时间"),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[38]||(t[38]=l("tr",null,[l("td",null,"refer_url"),l("td",null,"str"),l("td",null,"与请求头 Referer 字段相同"),l("td",null,"非必要"),l("td")],-1)),l("tr",null,[t[25]||(t[25]=l("td",null,"quality",-1)),t[26]||(t[26]=l("td",null,"num",-1)),t[27]||(t[27]=l("td",null,"视频清晰度",-1)),t[28]||(t[28]=l("td",null,"非必要",-1)),l("td",null,[t[24]||(t[24]=n("参见")),d(s,{to:"/docs/video/videostream_url.html#qn%E8%A7%86%E9%A2%91%E6%B8%85%E6%99%B0%E5%BA%A6%E6%A0%87%E8%AF%86"},{default:e(()=>t[23]||(t[23]=[n("qn视频清晰度标识")])),_:1,__:[23]})])]),t[39]||(t[39]=l("tr",null,[l("td",null,"video_duration"),l("td",null,"num"),l("td",null,"视频时长"),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[40]||(t[40]=l("tr",null,[l("td",null,"last_play_progress_time"),l("td",null,"num"),l("td",null,"play_time 与 本轮页面会话开始时 played_time 之和"),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[41]||(t[41]=l("tr",null,[l("td",null,"max_play_progress_time"),l("td",null,"num"),l("td",null,"本轮页面会话所有最大 last_play_progress_time 与 本轮页面会话开始时 played_time 之和"),l("td",null,"非必要"),l("td",null,"单位 秒")],-1)),t[42]||(t[42]=l("tr",null,[l("td",null,"start_ts"),l("td",null,"num"),l("td",null,"开始播放时刻"),l("td",null,"非必要"),l("td",null,"时间戳")],-1)),t[43]||(t[43]=l("tr",null,[l("td",null,"type"),l("td",null,"num"),l("td",null,"视频类型"),l("td",null,"非必要"),l("td",null,[n("3:投稿视频"),l("br"),n("4:剧集"),l("br"),n("10:课程")])],-1)),t[44]||(t[44]=l("tr",null,[l("td",null,"sub_type"),l("td",null,"num"),l("td",null,"剧集副类型"),l("td",null,"非必要"),l("td",null,[n("0: 普通投稿视频"),l("br"),n("1:番剧"),l("br"),n("2:电影"),l("br"),n("3:纪录片"),l("br"),n("4:国创"),l("br"),n("5:电视剧"),l("br"),n("7:综艺")])],-1)),t[45]||(t[45]=l("tr",null,[l("td",null,"dt"),l("td",null,"num"),l("td",null,"2"),l("td",null,"非必要"),l("td")],-1)),t[46]||(t[46]=l("tr",null,[l("td",null,"outer"),l("td",null,"num"),l("td",null,"0"),l("td",null,"非必要"),l("td")],-1)),t[47]||(t[47]=l("tr",null,[l("td",null,"spmid"),l("td",null,"str"),l("td",null,"333.788.0.0"),l("td",null,"非必要"),l("td",null,"作用尚不明确")],-1)),t[48]||(t[48]=l("tr",null,[l("td",null,"from_spmid"),l("td",null,"str"),l("td",null,"播放来源?"),l("td",null,"非必要"),l("td",null,[n("也可为空, 如: "),l("code",null,"444.41.list.card_archive.click"),n(),l("code",null,"333.999.0.0")])],-1)),t[49]||(t[49]=l("tr",null,[l("td",null,"session"),l("td",null,"str"),l("td",null,"会话信息?"),l("td",null,"非必要"),l("td",null,"一串无分隔小写 UUID")],-1)),t[50]||(t[50]=l("tr",null,[l("td",null,"extra"),l("td",null,"obj"),l("td",null,"额外信息, 如播放器版本"),l("td",null,"非必要"),l("td",null,[n("如: "),l("code",null,'{"player_version":"4.8.36"}')])],-1)),t[51]||(t[51]=l("tr",null,[l("td",null,"play_type"),l("td",null,"num"),l("td",null,"播放动作"),l("td",null,"非必要"),l("td",null,[n("0:播放中"),l("br"),n("1:开始播放"),l("br"),n("2:暂停"),l("br"),n("3:继续播放"),l("br"),n("4: 结束播放")])],-1)),t[52]||(t[52]=l("tr",null,[l("td",null,"csrf"),l("td",null,"str"),l("td",null,"CSRF Token (即 Cookie 中 bili_jct)"),l("td",null,"非必要"),l("td")],-1))])]),t[75]||(t[75]=a(`json回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 |
示例:
上报一次视频av2/BV1xx411c7mD的心跳数据
curl 'https://api.bilibili.com/x/click-interface/web/heartbeat' \\
--data-urlencode 'aid=2' \\
--data-urlencode 'bvid=BV1xx411c7mD' \\
--data-urlencode 'cid=62131' \\
--data-urlencode 'played_time=60' \\
--data-urlencode 'realtime=60' \\
--data-urlencode 'start_ts=1592720840' \\
--data-urlencode 'type=3' \\
--data-urlencode 'dt=2' \\
--data-urlencode 'play_type=0' \\
--data-urlencode 'csrf=xxx' \\
-b 'SESSDATA=xxx'{
"code": 0,
"message": "0",
"ttl": 1
}https://api.bilibili.com/x/click-interface/click/web/h5
请求方式: POST
认证方式: Cookie (SESSDATA)
该接口亦被用于计算播放量, 播放量更新不是实时的
该接口使用似乎存在 200 播放限制, 请勿滥用!
URL参数:
`,13)),l("table",null,[t[72]||(t[72]=l("thead",null,[l("tr",null,[l("th",null,"参数名"),l("th",null,"类型"),l("th",null,"内容"),l("th",null,"必要性"),l("th",null,"备注")])],-1)),l("tbody",null,[t[66]||(t[66]=l("tr",null,[l("td",null,"w_aid"),l("td",null,"num"),l("td",null,"稿件 aid"),l("td",null,"不必要"),l("td")],-1)),t[67]||(t[67]=l("tr",null,[l("td",null,"w_part"),l("td",null,"num"),l("td",null,"视频分 P 编号"),l("td",null,"不必要"),l("td")],-1)),t[68]||(t[68]=l("tr",null,[l("td",null,"w_ftime"),l("td",null,"num"),l("td",null,"点击时间戳?"),l("td",null,"不必要"),l("td",null,"UNIX 秒级时间戳")],-1)),t[69]||(t[69]=l("tr",null,[l("td",null,"w_stime"),l("td",null,"num"),l("td",null,"开始播放时间戳?"),l("td",null,"不必要"),l("td",null,"UNIX 秒级时间戳")],-1)),t[70]||(t[70]=l("tr",null,[l("td",null,"w_type"),l("td",null,"num"),l("td",null,"视频类型"),l("td",null,"不必要"),l("td",null,[n("见"),l("a",{href:"#%E4%B8%8A%E6%8A%A5%E8%A7%86%E9%A2%91%E6%92%AD%E6%94%BE%E5%BF%83%E8%B7%B3web%E7%AB%AF"},"上报视频播放心跳(web端)")])],-1)),t[71]||(t[71]=l("tr",null,[l("td",null,"web_location"),l("td",null,"num"),l("td",null,"网页位置?"),l("td",null,"不必要"),l("td",null,"1315873")],-1)),l("tr",null,[t[56]||(t[56]=l("td",null,"w_rid",-1)),t[57]||(t[57]=l("td",null,"num",-1)),t[58]||(t[58]=l("td",null,"WBI 签名",-1)),t[59]||(t[59]=l("td",null,"不必要",-1)),l("td",null,[t[55]||(t[55]=n("参见")),d(s,{to:"/docs/misc/sign/wbi.html"},{default:e(()=>t[54]||(t[54]=[n("WBI 签名")])),_:1,__:[54]})])]),l("tr",null,[t[62]||(t[62]=l("td",null,"wts",-1)),t[63]||(t[63]=l("td",null,"num",-1)),t[64]||(t[64]=l("td",null,"UNIX 秒级时间戳",-1)),t[65]||(t[65]=l("td",null,"不必要",-1)),l("td",null,[t[61]||(t[61]=n("参见")),d(s,{to:"/docs/misc/sign/wbi.html"},{default:e(()=>t[60]||(t[60]=[n("WBI 签名")])),_:1,__:[60]})])])])]),t[76]||(t[76]=a(`正文参数 (application/x-www-form-urlencoded):
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
|---|---|---|---|---|
| mid | num | 当前用户 mid | 不必要 | |
| aid | num | 稿件 aid | 必要 | |
| cid | num | 视频 cid | 不必要 | |
| part | num | 视频分 P 编号 | 不必要 | |
| lv | num | 当前用户等级 | 不必要 | |
| ftime | num | 同 URL 参数中带有 w_ 前缀的同名参数 | 不必要 | |
| stime | num | 同 URL 参数中带有 w_ 前缀的同名参数 | 不必要 | |
| type | num | 视频类型 | 不必要 | 见上报视频播放心跳(web端) |
| sub_type | num | 视频子类型 | 不必要 | 见上报视频播放心跳(web端) |
| referer_url | str | 与请求头 Referer 字段相同 | 不必要 | |
| outer | num | 0 | 不必要 | |
| spmid | str | 333.788.0.0 | 不必要 | 作用尚不明确 |
| from_spmid | str | 播放来源? | 不必要 | 见上报视频播放心跳(web端) |
| session | str | 会话信息? | 不必要 | 一串无分隔小写 UUID |
| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 不必要 |
JSON回复:
根对象:
| 字段 | 类型 | 内容 | 备注 |
|---|---|---|---|
| code | num | 返回值 | 0:成功 -400:请求错误 |
| message | str | 错误信息 | 默认为 0 |
| ttl | num | 1 |
示例:
curl 'https://api.bilibili.com/x/click-interface/click/web/h5' \\
--data-urlencode 'aid=2' \\{
"code": 0,
"message": "0",
"ttl": 1
}