mirror of
https://github.com/SocialSisterYi/bilibili-API-collect.git
synced 2026-05-07 10:47:42 +08:00
245 lines
80 KiB
HTML
245 lines
80 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||
<meta name="generator" content="VuePress 2.0.0-rc.24" />
|
||
<style>
|
||
:root {
|
||
--vp-c-bg: #fff;
|
||
}
|
||
|
||
[data-theme='dark'] {
|
||
--vp-c-bg: #1b1b1f;
|
||
}
|
||
|
||
html,
|
||
body {
|
||
background-color: var(--vp-c-bg);
|
||
}
|
||
</style>
|
||
<script>
|
||
const useChoice = localStorage.getItem('vuepress-color-scheme')
|
||
const systemStatus =
|
||
'matchMedia' in window
|
||
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
||
: false
|
||
|
||
if (useChoice === 'light') {
|
||
document.documentElement.dataset.theme = 'light'
|
||
} else if (useChoice === 'dark' || systemStatus) {
|
||
document.documentElement.dataset.theme = 'dark'
|
||
}
|
||
</script>
|
||
<link rel="icon" href="/bilibili-API-collect/logo2.jpg"><title>BiliTicket | BAC Document</title><meta name="description" content="社区开源的第三方哔哩哔哩 API 文档">
|
||
<link rel="preload" href="/bilibili-API-collect/assets/style-D1PJH1oj.css" as="style"><link rel="stylesheet" href="/bilibili-API-collect/assets/style-D1PJH1oj.css">
|
||
<link rel="modulepreload" href="/bilibili-API-collect/assets/app-CDdN0tOz.js"><link rel="modulepreload" href="/bilibili-API-collect/assets/bili_ticket.html-vACxIeyA.js">
|
||
<link rel="prefetch" href="/bilibili-API-collect/assets/CONTRIBUTING.html-PK1UqqxE.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-ogQNRpTk.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-BHWVOlkG.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/splash.html-DT2Mv3Kp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ver.html-QyIIKHz2.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-CFmmBt9q.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-CjC2sa8C.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-kh8YjgtV.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/activity_list.html-BvJR8Ryq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-CkqFhcAX.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-B5fi37Z1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/recommend_author.html-BujFvlYA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-DTKcRmsh.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/articles.html-Da6F23Ju.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/card.html-D3fqv2ms.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/category.html-_gEerbZj.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-B1d7nL5H.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/view.html-CfrvJobp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-NeDlGWkg.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BPQR7Cmp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/music_list.html-B_bKuCv_.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/musicstream_url.html-EuMHubLL.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/rank.html-FjKu3TyA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/status_number.html-CeV6WUtE.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/follow.html-CDWBwNwp.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-DXDRP4Tr.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/season_index.html-DEvje2t4.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/timeline.html-CbxJa1xf.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videostream_url.html-Bf9taY9f.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/banlist.html-BOIn5V7I.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-BtLmZCof.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/video_room.html-wzIAafFQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BiHKj1w9.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videostream_url.html-CqsEu6DJ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ip.html-E0kaE_eQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-DD2cAx4v.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-LLsYtwDq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-DztA8sxj.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/opus.html-eEc8Yf5P.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/railgun.html-BRLhtOZc.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/season.html-CyIySS1H.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/statistics_data.html-DoGwaL2a.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/upload.html-BwWV1Mob.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videos.html-CIxKiOa1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/msg.html-Bit0P_qL.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-Dl7KcSA5.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/buzzword.html-kk7HIlSF.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/config.html-DM69jDie.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/danmaku_proto.html-Xq8rg-Vi.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/danmaku_view_proto.html-BWgynEFR.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/danmaku_xml.html-DU2Yyky8.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/history.html-DlIgteaz.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/snapshot.html-gv9SZux9.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/thumbup.html-DfzKM8Zr.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/webmask.html-BYdvMhex.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-BFV_RxIQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/all.html-BaPdqgO8.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/atlist.html-CefeZlt1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/banner.html-BlYb5Zsf.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/basicInfo.html-C73Y6JhK.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/card_info.html-U03rcWu3.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/content.html-BkTvk_al.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/detail.html-CBnQQbZQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/dynamic_enum.html-Dc_9_y7O.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/get_dynamic_detail.html-DSXWEtO3.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/nav.html-t3QEPmo5.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/publish.html-CW3yJg6O.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/space.html-B2_VulMt.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/topic.html-B7RicLwi.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/Bcoin.html-Dru89PCF.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/WeChat_Alipay.html-DHGxW8Yn.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/charge_list.html-Qt0HXaUu.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/charge_msg.html-BoB2kh1t.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/monthly.html-D2D4XfPu.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-Bzs6kPjU.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-BPyKjfye.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-CEll5q3T.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-ChgX453v.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-C6L1c2PM.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/color.html-CuBJhwWM.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/lottery.html-Bl6dJSch.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/skin.html-eLlqRnly.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/history.html-DprmvJ34.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/toview.html-BgUiigz9.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/danmaku.html-CQDg0elV.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/emoticons.html-DP073ORS.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/follow_up_live.html-A8GXI9f5.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/gift.html-CXgFtYD_.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/guard.html-458TdML0.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-COOmU9Ww.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_area.html-Cz0Dkm7L.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_bill.html-B3EnzSEq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_data.html-Nowo0bdt.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_replay.html-B4RZPhCn.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_stream.html-6lCtIirB.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/live_vote.html-9LQlvAYm.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/manage.html-B4yA90EK.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/message_stream.html-aQRQQUuq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/recommend.html-CnDd3KcW.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/redpocket.html-DdHVXRsM.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/report.html-Cstzk6in.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/silent_user_manage.html-DhudMJfm.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/user.html-BtQqLu51.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/cookie_refresh.html-dYWKQSux.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/exit.html-BroV0kq3.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/login_info.html-Bzp6j_Of.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/login_notice.html-wYl00Hm3.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/member_center.html-DFmu76Nc.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/Activity.html-TVXp2qcO.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ClockIn.html-6YNaAeZA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/Comic.html-CW5AOWoC.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/Download.html-BXapSEFQ.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/Season.html-DXvGggpS.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/User.html-BscndSoG.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index_file.html-DGtsnz1d.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/light_card.html-Zvpc-F1u.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/point_shop.html-DZLcd1xT.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/msg.html-_GbFV9UV.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/private_msg.html-CaEr_DSB.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/private_msg_content.html-CHJdbTzA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/settings.html-C_MpVg0t.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/b23tv.html-Csfkl4ti.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/buvid3_4.html-t_rPekON.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/bvid_desc.html-DtS-E_fC.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/device_identity.html-DddBW7og.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/errcode.html-B1GfPLhh.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/mathjax.html-TSOsGSWM.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/picture.html-CobTmS-n.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/time_stamp.html-1E25B_hl.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-UfDC4QFo.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/fetch.html-D7Yay-TA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-CGmcJK93.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-DW2xjXB7.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BOveruLf.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/list.html-D_bTQEto.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-6DRHNy6O.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/detail.html-oprHdDEr.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/features.html-CcaOOgcg.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/rich_text_nodes.html-CoQPH0FT.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/space.html-XtaqwWUU.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/hot.html-CFUbZNeB.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/search_request.html-CLPBFIjW.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/search_response.html-Bzt-Y-X5.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/suggest.html-B-IFtUVa.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/teenager_mode.html-C4bvGcRa.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/batch.html-D5ZINnHR.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/check_nickname.html-B2_0nrT-.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/contract.html--BB48rg6.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-B8jHpiku.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/medals.html-D3napn8q.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/official_role.html-CmQ7uSBH.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/register.html-D0pdaExC.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/relation.html-BcNqxNhw.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/space.html-BEj4Fbod.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/status_number.html-CFhUtt7s.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-CtswDJuD.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/appeal.html-DmV4u2js.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/attribute_data.html-BcOcmZw1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/collection.html-MfFQgfvD.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-DNsCTu-l.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/interact_video.html-CUqv5NFS.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/online.html-BpgWFsDU.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/pbp.html-THoyMw_9.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/player.html-DuaavPwy.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/recommend.html-C9UhE8ge.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/report.html-DbuiY7dd.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/snapshot.html-tq8YVbyg.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/status_number.html-Bzy_V6j5.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/summary.html-B5TxyGjs.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/tags.html-D0Jr1AkA.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/video_zone.html-VyZ_et64.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/video_zone_v2.html-C6Muqh5L.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/videostream_url.html-IlTdJFLq.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/dynamic.html-CrIbtawI.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/popular.html-DD13FCMz.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/precious_videos.html-BIva5INa.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/ranking.html-BMFWGpVy.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-Cf3w-sy1.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/center.html-bkoY7WVx.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/clockin.html-Ccx4gQWs.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-B6QTFJMK.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/info.html-BSxggG6o.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/404_manga.html-CZDdPabx.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/banner.html-Dh1ZfROR.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/header.html-B-0n93yR.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/zone_upload.html-DahAPJYT.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/action.html-9pAfC6IY.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/base_info.html-DD2TBcHH.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/judgement_info.html-6mtwSvq-.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/QR.html-CKsBTmro.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/SMS.html-CSrRgFm4.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/password.html-BIitCOnG.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/index.html-D15Ti03q.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/APP.html-pgEqW_L0.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/APPKey.html-Bt5IxB3B.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/v_voucher.html-Ddz3iH5-.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/wbi.html-Cu5X3BQY.js" as="script"><link rel="prefetch" href="/bilibili-API-collect/assets/404.html-5JIZPgUW.js" as="script">
|
||
</head>
|
||
<body>
|
||
<div id="app"><!--[--><div class="vp-theme-container external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/bilibili-API-collect/"><img class="vp-site-logo" src="/bilibili-API-collect/logo2.jpg" alt="BAC Document"><span class="vp-site-name vp-hide-mobile" aria-hidden="true">BAC Document</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/#🍴目录" aria-label="目录"><!--[--><!--[--><!--]--><!--]-->目录<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/CONTRIBUTING.html" aria-label="贡献指南"><!--[--><!--[--><!--]--><!--]-->贡献指南<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="right arrow"></span></button><ul class="vp-navbar-dropdown" style="display:none;"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164" aria-label="QQ交流群(综合技术交流)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->QQ交流群(综合技术交流)<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://t.me/bilibili_API_collect_community" aria-label="Telegram交流群(Github Bot推送)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Telegram交流群(Github Bot推送)<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/SocialSisterYi/bilibili-API-collect" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" placeholder="搜索" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/#🍴目录" aria-label="目录"><!--[--><!--[--><!--]--><!--]-->目录<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/bilibili-API-collect/CONTRIBUTING.html" aria-label="贡献指南"><!--[--><!--[--><!--]--><!--]-->贡献指南<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="相关社群"><span class="title">相关社群</span><span class="right arrow"></span></button><ul class="vp-navbar-dropdown" style="display:none;"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164" aria-label="QQ交流群(综合技术交流)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->QQ交流群(综合技术交流)<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://t.me/bilibili_API_collect_community" aria-label="Telegram交流群(Github Bot推送)" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Telegram交流群(Github Bot推送)<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/SocialSisterYi/bilibili-API-collect" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="vp-sidebar-items"><!--[--><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading">BiliTicket <!----></p><!----></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div id="content"><h1 id="biliticket" tabindex="-1"><a class="header-anchor" href="#biliticket"><span>BiliTicket</span></a></h1><h2 id="简述" tabindex="-1"><a class="header-anchor" href="#简述"><span>简述</span></a></h2><p><code>bili_ticket</code> 位于请求头 Cookie 中, 非必需, 但存在可降低风控概率</p><p>由 <a href="https://github.com/aynuarance" target="_blank" rel="noopener noreferrer">@aynuarance</a> 于 <a href="https://github.com/SocialSisterYi/bilibili-API-collect/issues/903" target="_blank" rel="noopener noreferrer">#903</a> 提供的思路,根据时间戳使用 <code>hmac_sha256</code> 算法计算 <code>hexsign</code>。</p><p>是 <a href="https://jwt.io/" target="_blank" rel="noopener noreferrer">JWT 令牌</a>,有效时长为 259260 秒,即 3 天。 例如 <code>eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDI3NDI3NDYsImlhdCI6MTcwMjQ4MzQ4NiwicGx0IjotMX0.xQgtTAc41NA1gzvd9yKUPgucUy_DKcQj6OG1vj8V7ZA</code></p><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "alg"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"HS256"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "kid"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"s03"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "typ"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"JWT"</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="算法" tabindex="-1"><a class="header-anchor" href="#算法"><span>算法</span></a></h2><ol><li>获取 UNIX 秒级时间戳存入变量如 <code>timestamp</code></li><li>计算变量 <code>hexsign</code> 值,使用 <code>hmac_sha256</code> 算法,密钥为 <code>XgwSnGZ1p</code>,消息为字符串 <code>"ts"</code> 与变量 <code>timestamp</code> 值拼接</li><li>构造请求参数,<code>key_id</code> 为 <code>ec02</code>,<code>hexsign</code> 为变量 <code>hexsign</code> 值,<code>context[ts]</code> 为变量 <code>timestamp</code> 值,<code>csrf</code> 为 cookie 中的 <code>bili_jct</code> 值也可为空</li><li>发送 <code>POST</code> 请求,获取 <code>data</code> 字段中的 <code>ticket</code> 字段的值即为所求</li></ol><h2 id="接口" tabindex="-1"><a class="header-anchor" href="#接口"><span>接口</span></a></h2><blockquote><p>https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket</p></blockquote><p><em>请求方式: POST</em></p><p>鉴权方式: 请求头 <code>Referer</code> 为空或 <code>.bilibili.com</code> 子域下任意页</p><p><strong>URL参数:</strong></p><table><thead><tr><th>参数名</th><th>类型</th><th>内容</th><th>必要性</th><th>备注</th></tr></thead><tbody><tr><td>key_id</td><td>str</td><td>ec02</td><td>必要</td><td></td></tr><tr><td>hexsign</td><td>str</td><td>由 <code>hmac_sha256</code> 算法计算的 <code>hexsign</code> 值</td><td>必要</td><td></td></tr><tr><td>context[ts]</td><td>num</td><td>UNIX 秒级时间戳</td><td>必要</td><td></td></tr><tr><td>csrf</td><td>str</td><td>cookie 中的 <code>bili_jct</code> 值</td><td>非必要</td><td></td></tr></tbody></table><p><strong>JSON回复:</strong></p><p>根对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>code</td><td>num</td><td>返回值</td><td>0: 成功<br>400: 参数错误</td></tr><tr><td>message</td><td>str</td><td>返回消息</td><td>OK: 成功</td></tr><tr><td>data</td><td>obj</td><td>数据本体</td><td></td></tr><tr><td>ttl</td><td>num</td><td>1</td><td></td></tr></tbody></table><p><code>data</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>ticket</td><td>str</td><td>bili_ticket</td><td></td></tr><tr><td>created_at</td><td>num</td><td>创建时间</td><td>UNIX 秒级时间戳</td></tr><tr><td>ttl</td><td>num</td><td>有效时长</td><td>259200 秒 (3 天)</td></tr><tr><td>context</td><td>obj</td><td>空</td><td></td></tr><tr><td>nav</td><td>obj</td><td>wbi_img 相关</td><td>参见 <a class="route-link" href="/bilibili-API-collect/docs/misc/sign/wbi.html">WBI 签名</a></td></tr></tbody></table><p><code>nav</code> 对象:</p><table><thead><tr><th>字段</th><th>类型</th><th>内容</th><th>备注</th></tr></thead><tbody><tr><td>img</td><td>str</td><td>img_key 值</td><td>参见 <a class="route-link" href="/bilibili-API-collect/docs/misc/sign/wbi.html">WBI 签名</a></td></tr><tr><td>sub</td><td>str</td><td>sub_key 值</td><td>参见 <a class="route-link" href="/bilibili-API-collect/docs/misc/sign/wbi.html">WBI 签名</a></td></tr></tbody></table><p><strong>示例:</strong></p><details><summary>查看响应示例:</summary><div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-json"><span class="line"><span style="color:#D4D4D4;">{</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "code"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">0</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "message"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"OK"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "data"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ticket"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjM2OTMwODAsImlhdCI6MTcyMzQzMzgyMCwicGx0IjotMX0.efOwv7i4m0ykABrXEDHGAechU2AByMcP_-3EYpQrNKs"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "created_at"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1723433820</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">259200</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "context"</span><span style="color:#D4D4D4;">: {},</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "nav"</span><span style="color:#D4D4D4;">: {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "img"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "sub"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png"</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> },</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> "ttl"</span><span style="color:#D4D4D4;">: </span><span style="color:#B5CEA8;">1</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></details><h2 id="demo" tabindex="-1"><a class="header-anchor" href="#demo"><span>Demo</span></a></h2><p>此处提供 <a href="#python">Python</a>, <a href="#java">Java</a>, <a href="#javascript-nodejs">JavaScript (Node.js)</a> 的示例代码</p><h3 id="python" tabindex="-1"><a class="header-anchor" href="#python"><span>Python</span></a></h3><p>需要 <code>requests</code> 依赖</p><div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-python"><span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> hmac</span></span>
|
||
<span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> hashlib</span></span>
|
||
<span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> requests</span></span>
|
||
<span class="line"><span style="color:#C586C0;">import</span><span style="color:#D4D4D4;"> time</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">def</span><span style="color:#DCDCAA;"> hmac_sha256</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">message</span><span style="color:#D4D4D4;">):</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> """</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> 使用HMAC-SHA256算法对给定的消息进行加密</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> :param key: 密钥</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> :param message: 要加密的消息</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> :return: 加密后的哈希值</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> """</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> # 将密钥和消息转换为字节串</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> key = key.encode(</span><span style="color:#CE9178;">'utf-8'</span><span style="color:#D4D4D4;">)</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> message = message.encode(</span><span style="color:#CE9178;">'utf-8'</span><span style="color:#D4D4D4;">)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> # 创建HMAC对象,使用SHA256哈希算法</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> hmac_obj = hmac.new(key, message, hashlib.sha256)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> # 计算哈希值</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> hash_value = hmac_obj.digest()</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> # 将哈希值转换为十六进制字符串</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> hash_hex = hash_value.hex()</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#D4D4D4;"> hash_hex</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#C586C0;">if</span><span style="color:#9CDCFE;"> __name__</span><span style="color:#D4D4D4;"> == </span><span style="color:#CE9178;">'__main__'</span><span style="color:#D4D4D4;">:</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> o = hmac_sha256(</span><span style="color:#CE9178;">"XgwSnGZ1p"</span><span style="color:#D4D4D4;">,</span><span style="color:#569CD6;">f</span><span style="color:#CE9178;">"ts</span><span style="color:#569CD6;">{</span><span style="color:#4EC9B0;">int</span><span style="color:#D4D4D4;">(time.time())</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">"</span><span style="color:#D4D4D4;">)</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> url = </span><span style="color:#CE9178;">"https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket"</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> params = {</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> "key_id"</span><span style="color:#D4D4D4;">:</span><span style="color:#CE9178;">"ec02"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> "hexsign"</span><span style="color:#D4D4D4;">:o,</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> "context[ts]"</span><span style="color:#D4D4D4;">:</span><span style="color:#569CD6;">f</span><span style="color:#CE9178;">"</span><span style="color:#569CD6;">{</span><span style="color:#4EC9B0;">int</span><span style="color:#D4D4D4;">(time.time())</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">"</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> "csrf"</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">''</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> headers = {</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> 'user-agent'</span><span style="color:#D4D4D4;">: </span><span style="color:#CE9178;">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0"</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> resp = requests.post(url, </span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">=params,</span><span style="color:#9CDCFE;">headers</span><span style="color:#D4D4D4;">=headers).json()</span></span>
|
||
<span class="line"><span style="color:#DCDCAA;"> print</span><span style="color:#D4D4D4;">(resp)</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="java" tabindex="-1"><a class="header-anchor" href="#java"><span>Java</span></a></h3><p>无需第三方依赖</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-java"><span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.io.ByteArrayOutputStream;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.io.InputStream;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.net.HttpURLConnection;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.net.URI;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> java.nio.charset.StandardCharsets;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> javax.crypto.Mac;</span></span>
|
||
<span class="line"><span style="color:#569CD6;">import</span><span style="color:#D4D4D4;"> javax.crypto.spec.SecretKeySpec;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#569CD6;">public</span><span style="color:#569CD6;"> class</span><span style="color:#4EC9B0;"> BiliTicketDemo</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> /**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Convert a byte array to a hex string.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#9CDCFE;"> bytes</span><span style="color:#6A9955;"> The byte array to convert.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@return</span><span style="color:#6A9955;"> The hex string representation of the given byte array.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> String</span><span style="color:#DCDCAA;"> bytesToHex</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">byte</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">bytes</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> StringBuilder</span><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> StringBuilder</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> for</span><span style="color:#D4D4D4;"> (</span><span style="color:#4EC9B0;">byte</span><span style="color:#9CDCFE;"> b</span><span style="color:#C586C0;"> :</span><span style="color:#D4D4D4;"> bytes) {</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> hex</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">Integer</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toHexString</span><span style="color:#D4D4D4;">(</span><span style="color:#B5CEA8;">0xff</span><span style="color:#D4D4D4;"> & b);</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#D4D4D4;"> (</span><span style="color:#9CDCFE;">hex</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">length</span><span style="color:#D4D4D4;">() == </span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'0'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(hex);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#9CDCFE;"> sb</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> /**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Generate a HMAC-SHA256 hash of the given message string using the given key</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * string.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#9CDCFE;"> key</span><span style="color:#6A9955;"> The key string to use for the HMAC-SHA256 hash.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#9CDCFE;"> message</span><span style="color:#6A9955;"> The message string to hash.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@throws</span><span style="color:#4EC9B0;"> Exception</span><span style="color:#6A9955;"> If an error occurs during the HMAC-SHA256 hash generation.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@return</span><span style="color:#6A9955;"> The HMAC-SHA256 hash of the given message string using the given key</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * string.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> String</span><span style="color:#DCDCAA;"> hmacSha256</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#9CDCFE;"> key</span><span style="color:#D4D4D4;">, </span><span style="color:#4EC9B0;">String</span><span style="color:#9CDCFE;"> message</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">throws</span><span style="color:#4EC9B0;"> Exception</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> Mac</span><span style="color:#9CDCFE;"> mac</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">Mac</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getInstance</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"HmacSHA256"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> SecretKeySpec</span><span style="color:#9CDCFE;"> secretKeySpec</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> SecretKeySpec</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getBytes</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">StandardCharsets</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">UTF_8</span><span style="color:#D4D4D4;">), </span><span style="color:#CE9178;">"HmacSHA256"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> mac</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">init</span><span style="color:#D4D4D4;">(secretKeySpec);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> byte</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">hash</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">mac</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">doFinal</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">message</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getBytes</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">StandardCharsets</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">UTF_8</span><span style="color:#D4D4D4;">));</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#DCDCAA;"> bytesToHex</span><span style="color:#D4D4D4;">(hash);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> /**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Get a Bilibili web ticket for the given CSRF token.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#9CDCFE;"> csrf</span><span style="color:#6A9955;"> The CSRF token to use for the web ticket, can be {@code null} or</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * empty.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@return</span><span style="color:#6A9955;"> The Bilibili web ticket raw response for the given CSRF token.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@throws</span><span style="color:#4EC9B0;"> Exception</span><span style="color:#6A9955;"> If an error occurs during the web ticket generation.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@see</span><span style="color:#6A9955;"> https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/bili_ticket.md</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> String</span><span style="color:#DCDCAA;"> getBiliTicket</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#9CDCFE;"> csrf</span><span style="color:#D4D4D4;">) </span><span style="color:#569CD6;">throws</span><span style="color:#4EC9B0;"> Exception</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // params</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> long</span><span style="color:#9CDCFE;"> ts</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">System</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">currentTimeMillis</span><span style="color:#D4D4D4;">() / </span><span style="color:#B5CEA8;">1000</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> String</span><span style="color:#9CDCFE;"> hexSign</span><span style="color:#D4D4D4;"> = </span><span style="color:#DCDCAA;">hmacSha256</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"XgwSnGZ1p"</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">"ts"</span><span style="color:#D4D4D4;"> + ts);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> StringBuilder</span><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> StringBuilder</span><span style="color:#D4D4D4;">(</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> "https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'?'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"key_id=ec02"</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'&'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"hexsign="</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(hexSign).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'&'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"context[ts]="</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(ts).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'&'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"csrf="</span><span style="color:#D4D4D4;">).</span><span style="color:#DCDCAA;">append</span><span style="color:#D4D4D4;">(csrf == </span><span style="color:#569CD6;">null</span><span style="color:#C586C0;"> ?</span><span style="color:#CE9178;"> ""</span><span style="color:#C586C0;"> :</span><span style="color:#D4D4D4;"> csrf);</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> // request</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> HttpURLConnection</span><span style="color:#9CDCFE;"> conn</span><span style="color:#D4D4D4;"> = (HttpURLConnection) </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> URI</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">url</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">()).</span><span style="color:#DCDCAA;">toURL</span><span style="color:#D4D4D4;">().</span><span style="color:#DCDCAA;">openConnection</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> conn</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">setRequestMethod</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"POST"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> conn</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">addRequestProperty</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">"User-Agent"</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">"Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> InputStream</span><span style="color:#9CDCFE;"> in</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">conn</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">getInputStream</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> ByteArrayOutputStream</span><span style="color:#9CDCFE;"> out</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">new</span><span style="color:#DCDCAA;"> ByteArrayOutputStream</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#4EC9B0;"> int</span><span style="color:#9CDCFE;"> b</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> while</span><span style="color:#D4D4D4;"> ((b = </span><span style="color:#9CDCFE;">in</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">read</span><span style="color:#D4D4D4;">()) != -</span><span style="color:#B5CEA8;">1</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> out</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">write</span><span style="color:#D4D4D4;">(b);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#C586C0;"> new</span><span style="color:#DCDCAA;"> String</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">out</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toByteArray</span><span style="color:#D4D4D4;">(), </span><span style="color:#9CDCFE;">StandardCharsets</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">UTF_8</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;"> /**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Main method to test the BiliTicketDemo class.</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#9CDCFE;"> args</span><span style="color:#6A9955;"> The command line arguments (not used).</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> public</span><span style="color:#569CD6;"> static</span><span style="color:#4EC9B0;"> void</span><span style="color:#DCDCAA;"> main</span><span style="color:#D4D4D4;">(</span><span style="color:#4EC9B0;">String</span><span style="color:#D4D4D4;">[] </span><span style="color:#9CDCFE;">args</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> try</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> System</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">out</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">println</span><span style="color:#D4D4D4;">(</span><span style="color:#DCDCAA;">getBiliTicket</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">""</span><span style="color:#D4D4D4;">)); </span><span style="color:#6A9955;">// use empty CSRF here</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> } </span><span style="color:#C586C0;">catch</span><span style="color:#D4D4D4;"> (</span><span style="color:#4EC9B0;">Exception</span><span style="color:#9CDCFE;"> e</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> e</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">printStackTrace</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="javascript-node-js" tabindex="-1"><a class="header-anchor" href="#javascript-node-js"><span>JavaScript (Node.js)</span></a></h3><div class="language-javascript line-numbers-mode" data-highlighter="shiki" data-ext="javascript" style="background-color:#1E1E1E;color:#D4D4D4;"><pre class="shiki dark-plus vp-code"><code class="language-javascript"><span class="line"><span style="color:#569CD6;">const</span><span style="color:#4FC1FF;"> crypto</span><span style="color:#D4D4D4;"> = </span><span style="color:#DCDCAA;">require</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'crypto'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;">/**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Generate HMAC-SHA256 signature</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#4EC9B0;"> {string}</span><span style="color:#9CDCFE;"> key</span><span style="color:#6A9955;"> The key string to use for the HMAC-SHA256 hash</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#4EC9B0;"> {string}</span><span style="color:#9CDCFE;"> message</span><span style="color:#6A9955;"> The message string to hash</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@returns</span><span style="color:#4EC9B0;"> {string}</span><span style="color:#6A9955;"> The HMAC-SHA256 signature as a hex string</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;">function</span><span style="color:#DCDCAA;"> hmacSha256</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">message</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> hmac</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">crypto</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">createHmac</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'sha256'</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">key</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> hmac</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">update</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">message</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#9CDCFE;"> hmac</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">digest</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'hex'</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#6A9955;">/**</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * Get Bilibili web ticket</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@param</span><span style="color:#4EC9B0;"> {string}</span><span style="color:#9CDCFE;"> csrf</span><span style="color:#6A9955;"> CSRF token, can be empty or null</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> * </span><span style="color:#569CD6;">@returns</span><span style="color:#4EC9B0;"> {Promise<any>}</span><span style="color:#6A9955;"> Promise of the ticket response in JSON format</span></span>
|
||
<span class="line"><span style="color:#6A9955;"> */</span></span>
|
||
<span class="line"><span style="color:#569CD6;">async</span><span style="color:#569CD6;"> function</span><span style="color:#DCDCAA;"> getBiliTicket</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">csrf</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> ts</span><span style="color:#D4D4D4;"> = </span><span style="color:#9CDCFE;">Math</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">floor</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">Date</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">now</span><span style="color:#D4D4D4;">() / </span><span style="color:#B5CEA8;">1000</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> hexSign</span><span style="color:#D4D4D4;"> = </span><span style="color:#DCDCAA;">hmacSha256</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'XgwSnGZ1p'</span><span style="color:#D4D4D4;">, </span><span style="color:#CE9178;">`ts</span><span style="color:#569CD6;">${</span><span style="color:#9CDCFE;">ts</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">`</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> url</span><span style="color:#D4D4D4;"> = </span><span style="color:#CE9178;">'https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket'</span><span style="color:#D4D4D4;">;</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> params</span><span style="color:#D4D4D4;"> = </span><span style="color:#569CD6;">new</span><span style="color:#DCDCAA;"> URLSearchParams</span><span style="color:#D4D4D4;">({</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> key_id:</span><span style="color:#CE9178;"> 'ec02'</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> hexsign:</span><span style="color:#9CDCFE;"> hexSign</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> 'context[ts]'</span><span style="color:#9CDCFE;">:</span><span style="color:#9CDCFE;"> ts</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> csrf:</span><span style="color:#9CDCFE;"> csrf</span><span style="color:#D4D4D4;"> || </span><span style="color:#CE9178;">''</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> });</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> response</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">await</span><span style="color:#DCDCAA;"> fetch</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">`</span><span style="color:#569CD6;">${</span><span style="color:#9CDCFE;">url</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">?</span><span style="color:#569CD6;">${</span><span style="color:#9CDCFE;">params</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">toString</span><span style="color:#D4D4D4;">()</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">`</span><span style="color:#D4D4D4;">, {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> method:</span><span style="color:#CE9178;"> 'POST'</span><span style="color:#D4D4D4;">,</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> headers:</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#CE9178;"> 'User-Agent'</span><span style="color:#9CDCFE;">:</span><span style="color:#CE9178;"> 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0'</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> });</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> if</span><span style="color:#D4D4D4;"> (!</span><span style="color:#9CDCFE;">response</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">ok</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> throw</span><span style="color:#569CD6;"> new</span><span style="color:#DCDCAA;"> Error</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">`HTTP error! status: </span><span style="color:#569CD6;">${</span><span style="color:#9CDCFE;">response</span><span style="color:#D4D4D4;">.</span><span style="color:#9CDCFE;">status</span><span style="color:#569CD6;">}</span><span style="color:#CE9178;">`</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> return</span><span style="color:#9CDCFE;"> response</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">json</span><span style="color:#D4D4D4;">();</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#D4D4D4;">(</span><span style="color:#569CD6;">async</span><span style="color:#D4D4D4;"> () </span><span style="color:#569CD6;">=></span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#C586C0;"> try</span><span style="color:#D4D4D4;"> {</span></span>
|
||
<span class="line"><span style="color:#569CD6;"> const</span><span style="color:#4FC1FF;"> ticketResponse</span><span style="color:#D4D4D4;"> = </span><span style="color:#C586C0;">await</span><span style="color:#DCDCAA;"> getBiliTicket</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">''</span><span style="color:#D4D4D4;">); </span><span style="color:#6A9955;">// use empty CSRF here</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> console</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">log</span><span style="color:#D4D4D4;">(</span><span style="color:#9CDCFE;">ticketResponse</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> } </span><span style="color:#C586C0;">catch</span><span style="color:#D4D4D4;"> (</span><span style="color:#9CDCFE;">e</span><span style="color:#D4D4D4;">) {</span></span>
|
||
<span class="line"><span style="color:#9CDCFE;"> console</span><span style="color:#D4D4D4;">.</span><span style="color:#DCDCAA;">error</span><span style="color:#D4D4D4;">(</span><span style="color:#CE9178;">'Failed to get BiliTicket:'</span><span style="color:#D4D4D4;">, </span><span style="color:#9CDCFE;">e</span><span style="color:#D4D4D4;">);</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;"> }</span></span>
|
||
<span class="line"><span style="color:#D4D4D4;">})();</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div></div><!--[--><!--]--></div><footer class="vp-page-meta"><div class="vp-meta-item edit-link"><a class="auto-link external-link label" href="https://github.com/SocialSisterYi/bilibili-API-collect/edit/master/docs/misc/sign/bili_ticket.md" aria-label="在 GitHub 上编辑此页" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><svg class="edit-icon" viewbox="0 0 1024 1024"><g fill="currentColor"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></g></svg><!--]--><!--]-->在 GitHub 上编辑此页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-meta-item git-info"><div class="vp-meta-item last-updated"><span class="meta-item-label">最近更新: </span><time class="meta-item-info" datetime="2025-02-07T18:28:52.000Z" data-allow-mismatch>2025/2/7 18:28</time></div><div class="vp-meta-item contributors"><span class="meta-item-label">Contributors: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: z0z0r4@outlook.com">z0z0r4</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: 102411014+SessionHu@users.noreply.github.com">SessionHu</span><!----><!--]--><!--]--></span></div></div></footer><!----><!--[--><!--[--><footer style="text-align:center;"> Copyright © 2020-2025 <a href="https://github.com/SocialSisterYi/">SocialSisterYi</a> | <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE">CC-BY-NC-4.0 Licensed</a></footer><!--]--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
|
||
<script type="module" src="/bilibili-API-collect/assets/app-CDdN0tOz.js" defer></script>
|
||
</body>
|
||
</html>
|