From 7809924e2dd394a2363ac873a9ba6d17d5349f39 Mon Sep 17 00:00:00 2001 From: SocialSisterYi <1440239038@qq.com> Date: Wed, 28 Jan 2026 14:01:34 +0800 Subject: [PATCH] delete all --- .github/FUNDING.yml | 12 - .github/ISSUE_TEMPLATE/1-add-request.yml | 56 - .github/ISSUE_TEMPLATE/2-update-request.yml | 29 - .github/ISSUE_TEMPLATE/3-mistake-report.yml | 64 - .github/ISSUE_TEMPLATE/config.yml | 5 - .github/workflows/vuepress-deploy.yml | 37 - .gitignore | 11 - .vuepress/client.js | 8 - .vuepress/config.js | 64 - .vuepress/public/logo2.jpg | Bin 17236 -> 0 bytes .vuepress/theme/layouts/Layout.vue | 28 - CONTRIBUTING.md | 285 - LICENSE | 352 - README.md | 408 - assets/img/2233login.png | Bin 45074 -> 0 bytes assets/img/activit.svg | 3 - assets/img/add.svg | 20 - assets/img/aiSummary.svg | 1 - assets/img/akari.jpg | Bin 8992 -> 0 bytes assets/img/ban.png | Bin 5472 -> 0 bytes assets/img/battery-100.png | Bin 6261 -> 0 bytes assets/img/bilibili.svg | 44 - assets/img/blackroom.svg | 1 - assets/img/channel.svg | 6 - assets/img/class.svg | 7 - assets/img/coin.svg | 7 - assets/img/collect.svg | 9 - assets/img/comment.svg | 7 - assets/img/delete.svg | 9 - assets/img/download.svg | 7 - assets/img/fav.svg | 6 - assets/img/follow.svg | 23 - assets/img/history.png | Bin 2400 -> 0 bytes assets/img/home.svg | 6 - assets/img/like.svg | 5 - assets/img/live.svg | 1 - assets/img/loadTV.gif | Bin 10013 -> 0 bytes assets/img/logo.png | Bin 257403 -> 0 bytes assets/img/logo2.jpg | Bin 17236 -> 0 bytes assets/img/musicplus.svg | 1 - assets/img/ploading.gif | Bin 4610 -> 0 bytes assets/img/ranking.svg | 4 - assets/img/read.svg | 1 - assets/img/relation.svg | 10 - assets/img/share.svg | 5 - assets/img/sponsorQR.jpg | Bin 706776 -> 0 bytes assets/img/sub.svg | 5 - assets/img/tebietuijian.svg | 1 - assets/img/topic.svg | 1 - assets/img/toview.png | Bin 724 -> 0 bytes assets/img/tuiguang.svg | 1 - assets/img/video_up.svg | 6 - assets/zone_icon/ad.svg | 14 - assets/zone_icon/animal.svg | 11 - assets/zone_icon/anime.svg | 16 - assets/zone_icon/car.svg | 20 - assets/zone_icon/cinephile.svg | 14 - assets/zone_icon/comic.svg | 20 - assets/zone_icon/dance.svg | 10 - assets/zone_icon/digital.svg | 13 - assets/zone_icon/documentary.svg | 31 - assets/zone_icon/douga.svg | 14 - assets/zone_icon/ent.svg | 17 - assets/zone_icon/fashion.svg | 11 - assets/zone_icon/food.svg | 32 - assets/zone_icon/game.svg | 9 - assets/zone_icon/guochuang.svg | 11 - assets/zone_icon/information.svg | 17 - assets/zone_icon/kichiku.svg | 16 - assets/zone_icon/knowledge.svg | 18 - assets/zone_icon/life.svg | 8 - assets/zone_icon/movie.svg | 11 - assets/zone_icon/music.svg | 11 - assets/zone_icon/sports.svg | 8 - assets/zone_icon/tech.svg | 12 - assets/zone_icon/teleplay.svg | 11 - assets/zone_v2_icon/ai.svg | 17 - assets/zone_v2_icon/animal.svg | 11 - assets/zone_v2_icon/car.svg | 23 - assets/zone_v2_icon/cinephile.svg | 32 - assets/zone_v2_icon/dance.svg | 23 - assets/zone_v2_icon/douga.svg | 26 - assets/zone_v2_icon/emotion.svg | 8 - assets/zone_v2_icon/entertainment.svg | 20 - assets/zone_v2_icon/fashion.svg | 14 - assets/zone_v2_icon/food.svg | 23 - assets/zone_v2_icon/game.svg | 14 - assets/zone_v2_icon/gym.svg | 17 - assets/zone_v2_icon/handmake.svg | 23 - assets/zone_v2_icon/health.svg | 11 - assets/zone_v2_icon/home.svg | 26 - assets/zone_v2_icon/information.svg | 20 - assets/zone_v2_icon/kichiku.svg | 20 - assets/zone_v2_icon/knowledge.svg | 17 - assets/zone_v2_icon/life_experience.svg | 8 - assets/zone_v2_icon/life_joy.svg | 14 - assets/zone_v2_icon/music.svg | 17 - assets/zone_v2_icon/outdoors.svg | 14 - assets/zone_v2_icon/painting.svg | 23 - assets/zone_v2_icon/parenting.svg | 26 - assets/zone_v2_icon/rural.svg | 17 - assets/zone_v2_icon/shortplay.svg | 26 - assets/zone_v2_icon/sports.svg | 8 - assets/zone_v2_icon/tech.svg | 23 - assets/zone_v2_icon/travel.svg | 26 - assets/zone_v2_icon/vlog.svg | 26 - docs/APP_widget/splash.md | 567 -- docs/APP_widget/ver.md | 236 - docs/activity/info.md | 93 - docs/activity/list.md | 213 - docs/album/action.md | 174 - docs/album/activity_list.md | 152 - docs/album/info.md | 249 - docs/album/list.md | 2438 ------ docs/album/recommend_author.md | 169 - docs/article/action.md | 172 - docs/article/articles.md | 311 - docs/article/card.md | 463 - docs/article/category.md | 81 - docs/article/info.md | 182 - docs/article/view.md | 1346 --- docs/audio/action.md | 148 - docs/audio/info.md | 425 - docs/audio/music_list.md | 782 -- docs/audio/musicstream_url.md | 279 - docs/audio/rank.md | 1160 --- docs/audio/status_number.md | 63 - docs/bangumi/follow.md | 124 - docs/bangumi/info.md | 1510 ---- docs/bangumi/season_index.md | 806 -- docs/bangumi/timeline.md | 799 -- docs/bangumi/videostream_url.md | 359 - docs/blackroom/banlist.md | 301 - docs/blackroom/jury/action.md | 361 - docs/blackroom/jury/base_info.md | 331 - docs/blackroom/jury/judgement_info.md | 978 --- docs/broadcast/readme.md | 180 - docs/broadcast/video_room.md | 144 - docs/cheese/info.md | 640 -- docs/cheese/videostream_url.md | 222 - docs/clientinfo/ip.md | 157 - docs/comment/action.md | 535 -- docs/comment/list.md | 3722 -------- docs/comment/readme.md | 349 - docs/creativecenter/opus.md | 110 - docs/creativecenter/railgun.md | 274 - docs/creativecenter/season.md | 1088 --- docs/creativecenter/statistics&data.md | 890 -- docs/creativecenter/upload.md | 1927 ---- docs/creativecenter/videos.md | 555 -- docs/customerservice/msg.md | 115 - docs/danmaku/action.md | 828 -- docs/danmaku/buzzword.md | 508 -- docs/danmaku/config.md | 71 - docs/danmaku/danmaku_proto.md | 115 - docs/danmaku/danmaku_view_proto.md | 288 - docs/danmaku/danmaku_xml.md | 145 - docs/danmaku/history.md | 240 - docs/danmaku/snapshot.md | 88 - docs/danmaku/thumbup.md | 104 - docs/danmaku/webmask.md | 80 - docs/dynamic/action.md | 351 - docs/dynamic/all.md | 7770 ----------------- docs/dynamic/atlist.md | 238 - docs/dynamic/banner.md | 132 - docs/dynamic/basicInfo.md | 1581 ---- docs/dynamic/card_info.md | 604 -- docs/dynamic/content.md | 1034 --- docs/dynamic/detail.md | 2327 ----- docs/dynamic/dynamic_enum.md | 240 - docs/dynamic/get_dynamic_detail.md | 538 -- docs/dynamic/nav.md | 1167 --- docs/dynamic/publish.md | 555 -- docs/dynamic/space.md | 4473 ---------- docs/dynamic/topic.md | 5736 ------------ docs/electric/Bcoin.md | 323 - docs/electric/WeChat&Alipay.md | 198 - docs/electric/charge_list.md | 542 -- docs/electric/charge_msg.md | 298 - docs/electric/monthly.md | 746 -- docs/emoji/action.md | 105 - docs/emoji/list.md | 639 -- docs/fav/action.md | 472 - docs/fav/info.md | 571 -- docs/fav/list.md | 560 -- docs/garb/color.md | 311 - docs/garb/lottery.md | 3201 ------- docs/garb/skin.md | 267 - docs/historytoview/history.md | 845 -- docs/historytoview/toview.md | 462 - docs/live/danmaku.md | 1828 ---- docs/live/emoticons.md | 927 -- docs/live/follow_up_live.md | 317 - docs/live/gift.md | 191 - docs/live/guard.md | 592 -- docs/live/info.md | 1269 --- docs/live/live_area.md | 210 - docs/live/live_bill.md | 328 - docs/live/live_data.md | 183 - docs/live/live_replay.md | 2147 ----- docs/live/live_stream.md | 156 - docs/live/live_vote.md | 470 - docs/live/manage.md | 742 -- docs/live/message_stream.md | 7543 ---------------- docs/live/recommend.md | 717 -- docs/live/redpocket.md | 126 - docs/live/report.md | 66 - docs/live/silent_user_manage.md | 219 - docs/live/user.md | 1248 --- docs/login/cookie_refresh.md | 574 -- docs/login/exit.md | 68 - docs/login/login_action/QR.md | 652 -- docs/login/login_action/SMS.md | 453 - docs/login/login_action/password.md | 788 -- docs/login/login_action/readme.md | 164 - docs/login/login_info.md | 645 -- docs/login/login_notice.md | 269 - docs/login/member_center.md | 862 -- docs/manga/Activity.md | 76 - docs/manga/ClockIn.md | 217 - docs/manga/Comic.md | 4223 --------- docs/manga/Download.md | 256 - docs/manga/Season.md | 435 - docs/manga/User.md | 712 -- docs/manga/index_file.md | 269 - docs/manga/light_card.md | 200 - docs/manga/point_shop.md | 443 - docs/message/msg.md | 258 - docs/message/private_msg.md | 2077 ----- docs/message/private_msg_content.md | 627 -- docs/message/settings.md | 830 -- docs/misc/b23tv.md | 127 - docs/misc/buvid3_4.md | 132 - docs/misc/bvid_desc.md | 850 -- docs/misc/device_identity.md | 104 - docs/misc/errcode.md | 62 - docs/misc/mathjax.md | 54 - docs/misc/picture.md | 97 - docs/misc/sign/APP.md | 289 - docs/misc/sign/APPKey.md | 55 - docs/misc/sign/bili_ticket.md | 304 - docs/misc/sign/v_voucher.md | 179 - docs/misc/sign/wbi.md | 1481 ---- docs/misc/time_stamp.md | 127 - docs/newbie_exam/action.md | 445 - docs/newbie_exam/fetch.md | 257 - docs/newbie_exam/info.md | 550 -- docs/note/action.md | 131 - docs/note/info.md | 309 - docs/note/list.md | 653 -- docs/note/readme.md | 159 - docs/opus/detail.md | 2739 ------ docs/opus/features.md | 1295 --- docs/opus/rich_text_nodes.md | 422 - docs/opus/space.md | 356 - docs/search/hot.md | 693 -- docs/search/search_request.md | 1440 --- docs/search/search_response.md | 765 -- docs/search/suggest.md | 175 - docs/teenager/teenager_mode.md | 84 - docs/user/batch.md | 85 - docs/user/check_nickname.md | 145 - docs/user/contract.md | 131 - docs/user/info.md | 1777 ---- docs/user/medals.md | 822 -- docs/user/official_role.md | 12 - docs/user/register.md | 100 - docs/user/relation.md | 2724 ------ docs/user/space.md | 4981 ----------- docs/user/status_number.md | 305 - docs/video/action.md | 893 -- docs/video/appeal.md | 425 - docs/video/attribute_data.md | 71 - docs/video/collection.md | 1986 ----- docs/video/info.md | 4779 ---------- docs/video/interact_video.md | 369 - docs/video/online.md | 143 - docs/video/pbp.md | 69 - docs/video/player.md | 520 -- docs/video/recommend.md | 2680 ------ docs/video/report.md | 246 - docs/video/snapshot.md | 319 - docs/video/status_number.md | 210 - docs/video/summary.md | 287 - docs/video/tags.md | 434 - docs/video/video_zone.md | 336 - docs/video/video_zone_v2.md | 458 - docs/video/videostream_url.md | 1951 ----- docs/video_ranking/dynamic.md | 637 -- docs/video_ranking/popular.md | 1312 --- docs/video_ranking/precious_videos.md | 127 - docs/video_ranking/ranking.md | 963 -- docs/vip/action.md | 121 - docs/vip/center.md | 2070 ----- docs/vip/clockin.md | 60 - docs/vip/info.md | 431 - docs/wallet/info.md | 83 - docs/web_widget/404_manga.md | 321 - docs/web_widget/banner.md | 124 - docs/web_widget/header.md | 133 - docs/web_widget/zone_upload.md | 96 - .../bilibili/account/fission/v1/fission.proto | 64 - grpc_api/bilibili/ad/v1/ad.proto | 1011 --- grpc_api/bilibili/api/player/v1/player.proto | 75 - grpc_api/bilibili/api/probe/v1/probe.proto | 192 - grpc_api/bilibili/api/ticket/v1/ticket.proto | 79 - .../app/archive/middleware/v1/preload.proto | 18 - .../bilibili/app/archive/v1/archive.proto | 202 - grpc_api/bilibili/app/card/v1/ad.proto | 65 - grpc_api/bilibili/app/card/v1/card.proto | 33 - grpc_api/bilibili/app/card/v1/common.proto | 340 - grpc_api/bilibili/app/card/v1/double.proto | 416 - grpc_api/bilibili/app/card/v1/single.proto | 353 - .../bilibili/app/click/v1/heartbeat.proto | 122 - .../app/distribution/setting/download.proto | 11 - .../app/distribution/setting/dynamic.proto | 17 - .../distribution/setting/experimental.proto | 65 - .../distribution/setting/internaldevice.proto | 11 - .../app/distribution/setting/night.proto | 11 - .../app/distribution/setting/other.proto | 25 - .../app/distribution/setting/pegasus.proto | 41 - .../app/distribution/setting/play.proto | 58 - .../app/distribution/setting/privacy.proto | 20 - .../app/distribution/setting/search.proto | 19 - .../app/distribution/v1/distribution.proto | 158 - .../bilibili/app/dynamic/common/dynamic.proto | 22 - .../bilibili/app/dynamic/v1/dynamic.proto | 1389 --- grpc_api/bilibili/app/dynamic/v2/campus.proto | 66 - .../bilibili/app/dynamic/v2/dynamic.proto | 5810 ------------ grpc_api/bilibili/app/dynamic/v2/opus.proto | 94 - .../bilibili/app/interfaces/v1/history.proto | 378 - .../bilibili/app/interfaces/v1/media.proto | 342 - .../bilibili/app/interfaces/v1/search.proto | 187 - .../bilibili/app/interfaces/v1/space.proto | 106 - .../bilibili/app/listener/v1/listener.proto | 1329 --- grpc_api/bilibili/app/mine/v1/mine.proto | 245 - .../bilibili/app/nativeact/v1/nativeact.proto | 1801 ---- .../app/playeronline/v1/playeronline.proto | 70 - .../playerunite/pgcanymodel/pgcanymodel.proto | 14 - .../pugvanymodel.proto/pugvanymodel.proto | 51 - .../playerunite/ugcanymodel/ugcanymodel.proto | 39 - .../app/playerunite/v1/playerunite.proto | 57 - .../bilibili/app/playurl/v1/playurl.proto | 690 -- .../app/resource/privacy/v1/api.proto | 61 - .../bilibili/app/resource/v1/module.proto | 128 - grpc_api/bilibili/app/search/v2/search.proto | 195 - .../app/show/gateway/v1/service.proto | 25 - .../app/show/mixture/v1/mixture.proto | 53 - .../app/show/popular/v1/popular.proto | 116 - grpc_api/bilibili/app/show/rank/v1/rank.proto | 120 - .../bilibili/app/show/region/v1/region.proto | 55 - grpc_api/bilibili/app/space/v1/space.proto | 107 - grpc_api/bilibili/app/splash/v1/splash.proto | 131 - grpc_api/bilibili/app/topic/v1/topic.proto | 580 -- grpc_api/bilibili/app/view/v1/view.proto | 2698 ------ grpc_api/bilibili/app/viewunite/common.proto | 2009 ----- .../bilibili/app/viewunite/pgcanymodel.proto | 245 - .../bilibili/app/viewunite/pugvanymodel.proto | 430 - .../bilibili/app/viewunite/ugcanymodel.proto | 134 - .../bilibili/app/viewunite/v1/viewunite.proto | 897 -- grpc_api/bilibili/app/wall/v1/wall.proto | 45 - .../broadcast/message/editor/notify.proto | 30 - .../broadcast/message/esports/notify.proto | 8 - .../broadcast/message/fission/notify.proto | 18 - .../broadcast/message/im/notify.proto | 99 - .../bilibili/broadcast/message/main/dm.proto | 63 - .../broadcast/message/main/native.proto | 36 - .../broadcast/message/main/resource.proto | 61 - .../broadcast/message/main/search.proto | 29 - .../broadcast/message/note/sync.proto | 11 - .../broadcast/message/ogv/freya.proto | 228 - .../bilibili/broadcast/message/ogv/live.proto | 44 - .../message/ticket/activitygame.proto | 21 - .../bilibili/broadcast/message/tv/proj.proto | 77 - .../bilibili/broadcast/v1/broadcast.proto | 111 - grpc_api/bilibili/broadcast/v1/laser.proto | 19 - grpc_api/bilibili/broadcast/v1/mod.proto | 27 - grpc_api/bilibili/broadcast/v1/push.proto | 130 - grpc_api/bilibili/broadcast/v1/room.proto | 78 - grpc_api/bilibili/broadcast/v1/test.proto | 46 - grpc_api/bilibili/broadcast/v2/laser.proto | 21 - .../cheese/gateway/player/v1/playurl.proto | 121 - .../interfacess/biligram/v1/biligram.proto | 1 - .../bilibili/community/service/dm/v1/dm.proto | 890 -- .../community/service/govern/v1/govern.proto | 37 - .../dagw/component/avatar/common/common.proto | 108 - .../dagw/component/avatar/v1/avatar.proto | 112 - .../dagw/component/avatar/v1/plugin.proto | 93 - .../bilibili/dynamic/common/dynamic.proto | 1357 --- grpc_api/bilibili/dynamic/gw/gateway.proto | 2753 ------ .../dynamic/interfaces/campus/v1/api.proto | 28 - .../dynamic/interfaces/feed/v1/api.proto | 730 -- grpc_api/bilibili/gaia/gw/gw_api.proto | 116 - .../interfaces/inner-interface/v1/api.proto | 34 - grpc_api/bilibili/im/interfaces/v1/im.proto | 570 -- grpc_api/bilibili/im/type/im.proto | 378 - grpc_api/bilibili/live/app/room/v1/room.proto | 52 - .../general/interfaces/v1/interfaces.proto | 60 - .../main/common/arch/doll/v1/doll.proto | 61 - .../main/community/reply/v1/reply.proto | 1241 --- .../bilibili/metadata/device/device.proto | 41 - .../bilibili/metadata/fawkes/fawkes.proto | 23 - .../bilibili/metadata/locale/locale.proto | 26 - grpc_api/bilibili/metadata/metadata.proto | 22 - .../bilibili/metadata/network/network.proto | 35 - .../bilibili/metadata/parabox/parabox.proto | 17 - .../metadata/restriction/restriction.proto | 27 - grpc_api/bilibili/pagination/pagination.proto | 39 - .../bilibili/pangu/gallery/v1/gallery.proto | 250 - .../openplatform/apiserver/v1alpha1/api.proto | 1 - .../pgc/gateway/player/v1/playurl.proto | 265 - .../pgc/gateway/player/v2/playurl.proto | 1127 --- .../pgc/service/premiere/v1/premiere.proto | 33 - .../bilibili/playershared/playershared.proto | 974 --- .../polymer/app/search/v1/search.proto | 2330 ----- .../polymer/community/govern/v1/govern.proto | 96 - .../polymer/contract/v1/contract.proto | 91 - grpc_api/bilibili/polymer/demo/demo.proto | 15 - grpc_api/bilibili/polymer/list/v1/list.proto | 44 - .../bilibili/relation/interfaces/api.proto | 37 - grpc_api/bilibili/render/render.proto | 17 - grpc_api/bilibili/rpc/status.proto | 16 - .../bilibili/tv/interfaces/dm/v1/dm.proto | 371 - grpc_api/bilibili/vega/deneb/v1/deneb.proto | 38 - .../web/interfaces/v1/interfaces.proto | 1275 --- grpc_api/bilibili/web/space/v1/space.proto | 282 - .../hakase/protobuf/android_device_info.proto | 268 - grpc_api/pgc/biz/room.proto | 9 - grpc_api/pgc/gateway/vega/v1/vega.proto | 93 - grpc_api/readme.md | 149 - package.json | 20 - yarn.lock | 2545 ------ 432 files changed, 194464 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/1-add-request.yml delete mode 100644 .github/ISSUE_TEMPLATE/2-update-request.yml delete mode 100644 .github/ISSUE_TEMPLATE/3-mistake-report.yml delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/workflows/vuepress-deploy.yml delete mode 100644 .gitignore delete mode 100644 .vuepress/client.js delete mode 100644 .vuepress/config.js delete mode 100644 .vuepress/public/logo2.jpg delete mode 100644 .vuepress/theme/layouts/Layout.vue delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 assets/img/2233login.png delete mode 100644 assets/img/activit.svg delete mode 100644 assets/img/add.svg delete mode 100644 assets/img/aiSummary.svg delete mode 100644 assets/img/akari.jpg delete mode 100644 assets/img/ban.png delete mode 100644 assets/img/battery-100.png delete mode 100644 assets/img/bilibili.svg delete mode 100644 assets/img/blackroom.svg delete mode 100644 assets/img/channel.svg delete mode 100644 assets/img/class.svg delete mode 100644 assets/img/coin.svg delete mode 100644 assets/img/collect.svg delete mode 100644 assets/img/comment.svg delete mode 100644 assets/img/delete.svg delete mode 100644 assets/img/download.svg delete mode 100644 assets/img/fav.svg delete mode 100644 assets/img/follow.svg delete mode 100644 assets/img/history.png delete mode 100644 assets/img/home.svg delete mode 100644 assets/img/like.svg delete mode 100644 assets/img/live.svg delete mode 100644 assets/img/loadTV.gif delete mode 100644 assets/img/logo.png delete mode 100644 assets/img/logo2.jpg delete mode 100644 assets/img/musicplus.svg delete mode 100644 assets/img/ploading.gif delete mode 100644 assets/img/ranking.svg delete mode 100644 assets/img/read.svg delete mode 100644 assets/img/relation.svg delete mode 100644 assets/img/share.svg delete mode 100644 assets/img/sponsorQR.jpg delete mode 100644 assets/img/sub.svg delete mode 100644 assets/img/tebietuijian.svg delete mode 100644 assets/img/topic.svg delete mode 100644 assets/img/toview.png delete mode 100644 assets/img/tuiguang.svg delete mode 100644 assets/img/video_up.svg delete mode 100644 assets/zone_icon/ad.svg delete mode 100644 assets/zone_icon/animal.svg delete mode 100644 assets/zone_icon/anime.svg delete mode 100644 assets/zone_icon/car.svg delete mode 100644 assets/zone_icon/cinephile.svg delete mode 100644 assets/zone_icon/comic.svg delete mode 100644 assets/zone_icon/dance.svg delete mode 100644 assets/zone_icon/digital.svg delete mode 100644 assets/zone_icon/documentary.svg delete mode 100644 assets/zone_icon/douga.svg delete mode 100644 assets/zone_icon/ent.svg delete mode 100644 assets/zone_icon/fashion.svg delete mode 100644 assets/zone_icon/food.svg delete mode 100644 assets/zone_icon/game.svg delete mode 100644 assets/zone_icon/guochuang.svg delete mode 100644 assets/zone_icon/information.svg delete mode 100644 assets/zone_icon/kichiku.svg delete mode 100644 assets/zone_icon/knowledge.svg delete mode 100644 assets/zone_icon/life.svg delete mode 100644 assets/zone_icon/movie.svg delete mode 100644 assets/zone_icon/music.svg delete mode 100644 assets/zone_icon/sports.svg delete mode 100644 assets/zone_icon/tech.svg delete mode 100644 assets/zone_icon/teleplay.svg delete mode 100644 assets/zone_v2_icon/ai.svg delete mode 100644 assets/zone_v2_icon/animal.svg delete mode 100644 assets/zone_v2_icon/car.svg delete mode 100644 assets/zone_v2_icon/cinephile.svg delete mode 100644 assets/zone_v2_icon/dance.svg delete mode 100644 assets/zone_v2_icon/douga.svg delete mode 100644 assets/zone_v2_icon/emotion.svg delete mode 100644 assets/zone_v2_icon/entertainment.svg delete mode 100644 assets/zone_v2_icon/fashion.svg delete mode 100644 assets/zone_v2_icon/food.svg delete mode 100644 assets/zone_v2_icon/game.svg delete mode 100644 assets/zone_v2_icon/gym.svg delete mode 100644 assets/zone_v2_icon/handmake.svg delete mode 100644 assets/zone_v2_icon/health.svg delete mode 100644 assets/zone_v2_icon/home.svg delete mode 100644 assets/zone_v2_icon/information.svg delete mode 100644 assets/zone_v2_icon/kichiku.svg delete mode 100644 assets/zone_v2_icon/knowledge.svg delete mode 100644 assets/zone_v2_icon/life_experience.svg delete mode 100644 assets/zone_v2_icon/life_joy.svg delete mode 100644 assets/zone_v2_icon/music.svg delete mode 100644 assets/zone_v2_icon/outdoors.svg delete mode 100644 assets/zone_v2_icon/painting.svg delete mode 100644 assets/zone_v2_icon/parenting.svg delete mode 100644 assets/zone_v2_icon/rural.svg delete mode 100644 assets/zone_v2_icon/shortplay.svg delete mode 100644 assets/zone_v2_icon/sports.svg delete mode 100644 assets/zone_v2_icon/tech.svg delete mode 100644 assets/zone_v2_icon/travel.svg delete mode 100644 assets/zone_v2_icon/vlog.svg delete mode 100644 docs/APP_widget/splash.md delete mode 100644 docs/APP_widget/ver.md delete mode 100644 docs/activity/info.md delete mode 100644 docs/activity/list.md delete mode 100644 docs/album/action.md delete mode 100644 docs/album/activity_list.md delete mode 100644 docs/album/info.md delete mode 100644 docs/album/list.md delete mode 100644 docs/album/recommend_author.md delete mode 100644 docs/article/action.md delete mode 100644 docs/article/articles.md delete mode 100644 docs/article/card.md delete mode 100644 docs/article/category.md delete mode 100644 docs/article/info.md delete mode 100644 docs/article/view.md delete mode 100644 docs/audio/action.md delete mode 100644 docs/audio/info.md delete mode 100644 docs/audio/music_list.md delete mode 100644 docs/audio/musicstream_url.md delete mode 100644 docs/audio/rank.md delete mode 100644 docs/audio/status_number.md delete mode 100644 docs/bangumi/follow.md delete mode 100644 docs/bangumi/info.md delete mode 100644 docs/bangumi/season_index.md delete mode 100644 docs/bangumi/timeline.md delete mode 100644 docs/bangumi/videostream_url.md delete mode 100644 docs/blackroom/banlist.md delete mode 100644 docs/blackroom/jury/action.md delete mode 100644 docs/blackroom/jury/base_info.md delete mode 100644 docs/blackroom/jury/judgement_info.md delete mode 100644 docs/broadcast/readme.md delete mode 100644 docs/broadcast/video_room.md delete mode 100644 docs/cheese/info.md delete mode 100644 docs/cheese/videostream_url.md delete mode 100644 docs/clientinfo/ip.md delete mode 100644 docs/comment/action.md delete mode 100644 docs/comment/list.md delete mode 100644 docs/comment/readme.md delete mode 100644 docs/creativecenter/opus.md delete mode 100644 docs/creativecenter/railgun.md delete mode 100644 docs/creativecenter/season.md delete mode 100644 docs/creativecenter/statistics&data.md delete mode 100644 docs/creativecenter/upload.md delete mode 100644 docs/creativecenter/videos.md delete mode 100644 docs/customerservice/msg.md delete mode 100644 docs/danmaku/action.md delete mode 100644 docs/danmaku/buzzword.md delete mode 100644 docs/danmaku/config.md delete mode 100644 docs/danmaku/danmaku_proto.md delete mode 100644 docs/danmaku/danmaku_view_proto.md delete mode 100644 docs/danmaku/danmaku_xml.md delete mode 100644 docs/danmaku/history.md delete mode 100644 docs/danmaku/snapshot.md delete mode 100644 docs/danmaku/thumbup.md delete mode 100644 docs/danmaku/webmask.md delete mode 100644 docs/dynamic/action.md delete mode 100644 docs/dynamic/all.md delete mode 100644 docs/dynamic/atlist.md delete mode 100644 docs/dynamic/banner.md delete mode 100644 docs/dynamic/basicInfo.md delete mode 100644 docs/dynamic/card_info.md delete mode 100644 docs/dynamic/content.md delete mode 100644 docs/dynamic/detail.md delete mode 100644 docs/dynamic/dynamic_enum.md delete mode 100644 docs/dynamic/get_dynamic_detail.md delete mode 100644 docs/dynamic/nav.md delete mode 100644 docs/dynamic/publish.md delete mode 100644 docs/dynamic/space.md delete mode 100644 docs/dynamic/topic.md delete mode 100644 docs/electric/Bcoin.md delete mode 100644 docs/electric/WeChat&Alipay.md delete mode 100644 docs/electric/charge_list.md delete mode 100644 docs/electric/charge_msg.md delete mode 100644 docs/electric/monthly.md delete mode 100644 docs/emoji/action.md delete mode 100644 docs/emoji/list.md delete mode 100644 docs/fav/action.md delete mode 100644 docs/fav/info.md delete mode 100644 docs/fav/list.md delete mode 100644 docs/garb/color.md delete mode 100644 docs/garb/lottery.md delete mode 100644 docs/garb/skin.md delete mode 100644 docs/historytoview/history.md delete mode 100644 docs/historytoview/toview.md delete mode 100644 docs/live/danmaku.md delete mode 100644 docs/live/emoticons.md delete mode 100644 docs/live/follow_up_live.md delete mode 100644 docs/live/gift.md delete mode 100644 docs/live/guard.md delete mode 100644 docs/live/info.md delete mode 100644 docs/live/live_area.md delete mode 100644 docs/live/live_bill.md delete mode 100644 docs/live/live_data.md delete mode 100644 docs/live/live_replay.md delete mode 100644 docs/live/live_stream.md delete mode 100644 docs/live/live_vote.md delete mode 100644 docs/live/manage.md delete mode 100644 docs/live/message_stream.md delete mode 100644 docs/live/recommend.md delete mode 100644 docs/live/redpocket.md delete mode 100644 docs/live/report.md delete mode 100644 docs/live/silent_user_manage.md delete mode 100644 docs/live/user.md delete mode 100644 docs/login/cookie_refresh.md delete mode 100644 docs/login/exit.md delete mode 100644 docs/login/login_action/QR.md delete mode 100644 docs/login/login_action/SMS.md delete mode 100644 docs/login/login_action/password.md delete mode 100644 docs/login/login_action/readme.md delete mode 100644 docs/login/login_info.md delete mode 100644 docs/login/login_notice.md delete mode 100644 docs/login/member_center.md delete mode 100644 docs/manga/Activity.md delete mode 100644 docs/manga/ClockIn.md delete mode 100644 docs/manga/Comic.md delete mode 100644 docs/manga/Download.md delete mode 100644 docs/manga/Season.md delete mode 100644 docs/manga/User.md delete mode 100644 docs/manga/index_file.md delete mode 100644 docs/manga/light_card.md delete mode 100644 docs/manga/point_shop.md delete mode 100644 docs/message/msg.md delete mode 100644 docs/message/private_msg.md delete mode 100644 docs/message/private_msg_content.md delete mode 100644 docs/message/settings.md delete mode 100644 docs/misc/b23tv.md delete mode 100644 docs/misc/buvid3_4.md delete mode 100644 docs/misc/bvid_desc.md delete mode 100644 docs/misc/device_identity.md delete mode 100644 docs/misc/errcode.md delete mode 100644 docs/misc/mathjax.md delete mode 100644 docs/misc/picture.md delete mode 100644 docs/misc/sign/APP.md delete mode 100644 docs/misc/sign/APPKey.md delete mode 100644 docs/misc/sign/bili_ticket.md delete mode 100644 docs/misc/sign/v_voucher.md delete mode 100644 docs/misc/sign/wbi.md delete mode 100644 docs/misc/time_stamp.md delete mode 100644 docs/newbie_exam/action.md delete mode 100644 docs/newbie_exam/fetch.md delete mode 100644 docs/newbie_exam/info.md delete mode 100644 docs/note/action.md delete mode 100644 docs/note/info.md delete mode 100644 docs/note/list.md delete mode 100644 docs/note/readme.md delete mode 100644 docs/opus/detail.md delete mode 100644 docs/opus/features.md delete mode 100644 docs/opus/rich_text_nodes.md delete mode 100644 docs/opus/space.md delete mode 100644 docs/search/hot.md delete mode 100644 docs/search/search_request.md delete mode 100644 docs/search/search_response.md delete mode 100644 docs/search/suggest.md delete mode 100644 docs/teenager/teenager_mode.md delete mode 100644 docs/user/batch.md delete mode 100644 docs/user/check_nickname.md delete mode 100644 docs/user/contract.md delete mode 100644 docs/user/info.md delete mode 100644 docs/user/medals.md delete mode 100644 docs/user/official_role.md delete mode 100644 docs/user/register.md delete mode 100644 docs/user/relation.md delete mode 100644 docs/user/space.md delete mode 100644 docs/user/status_number.md delete mode 100644 docs/video/action.md delete mode 100644 docs/video/appeal.md delete mode 100644 docs/video/attribute_data.md delete mode 100644 docs/video/collection.md delete mode 100644 docs/video/info.md delete mode 100644 docs/video/interact_video.md delete mode 100644 docs/video/online.md delete mode 100644 docs/video/pbp.md delete mode 100644 docs/video/player.md delete mode 100644 docs/video/recommend.md delete mode 100644 docs/video/report.md delete mode 100644 docs/video/snapshot.md delete mode 100644 docs/video/status_number.md delete mode 100644 docs/video/summary.md delete mode 100644 docs/video/tags.md delete mode 100644 docs/video/video_zone.md delete mode 100644 docs/video/video_zone_v2.md delete mode 100644 docs/video/videostream_url.md delete mode 100644 docs/video_ranking/dynamic.md delete mode 100644 docs/video_ranking/popular.md delete mode 100644 docs/video_ranking/precious_videos.md delete mode 100644 docs/video_ranking/ranking.md delete mode 100644 docs/vip/action.md delete mode 100644 docs/vip/center.md delete mode 100644 docs/vip/clockin.md delete mode 100644 docs/vip/info.md delete mode 100644 docs/wallet/info.md delete mode 100644 docs/web_widget/404_manga.md delete mode 100644 docs/web_widget/banner.md delete mode 100644 docs/web_widget/header.md delete mode 100644 docs/web_widget/zone_upload.md delete mode 100644 grpc_api/bilibili/account/fission/v1/fission.proto delete mode 100644 grpc_api/bilibili/ad/v1/ad.proto delete mode 100644 grpc_api/bilibili/api/player/v1/player.proto delete mode 100644 grpc_api/bilibili/api/probe/v1/probe.proto delete mode 100644 grpc_api/bilibili/api/ticket/v1/ticket.proto delete mode 100644 grpc_api/bilibili/app/archive/middleware/v1/preload.proto delete mode 100644 grpc_api/bilibili/app/archive/v1/archive.proto delete mode 100644 grpc_api/bilibili/app/card/v1/ad.proto delete mode 100644 grpc_api/bilibili/app/card/v1/card.proto delete mode 100644 grpc_api/bilibili/app/card/v1/common.proto delete mode 100644 grpc_api/bilibili/app/card/v1/double.proto delete mode 100644 grpc_api/bilibili/app/card/v1/single.proto delete mode 100644 grpc_api/bilibili/app/click/v1/heartbeat.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/download.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/dynamic.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/experimental.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/internaldevice.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/night.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/other.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/pegasus.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/play.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/privacy.proto delete mode 100644 grpc_api/bilibili/app/distribution/setting/search.proto delete mode 100644 grpc_api/bilibili/app/distribution/v1/distribution.proto delete mode 100644 grpc_api/bilibili/app/dynamic/common/dynamic.proto delete mode 100644 grpc_api/bilibili/app/dynamic/v1/dynamic.proto delete mode 100644 grpc_api/bilibili/app/dynamic/v2/campus.proto delete mode 100644 grpc_api/bilibili/app/dynamic/v2/dynamic.proto delete mode 100644 grpc_api/bilibili/app/dynamic/v2/opus.proto delete mode 100644 grpc_api/bilibili/app/interfaces/v1/history.proto delete mode 100644 grpc_api/bilibili/app/interfaces/v1/media.proto delete mode 100644 grpc_api/bilibili/app/interfaces/v1/search.proto delete mode 100644 grpc_api/bilibili/app/interfaces/v1/space.proto delete mode 100644 grpc_api/bilibili/app/listener/v1/listener.proto delete mode 100644 grpc_api/bilibili/app/mine/v1/mine.proto delete mode 100644 grpc_api/bilibili/app/nativeact/v1/nativeact.proto delete mode 100644 grpc_api/bilibili/app/playeronline/v1/playeronline.proto delete mode 100644 grpc_api/bilibili/app/playerunite/pgcanymodel/pgcanymodel.proto delete mode 100644 grpc_api/bilibili/app/playerunite/pugvanymodel.proto/pugvanymodel.proto delete mode 100644 grpc_api/bilibili/app/playerunite/ugcanymodel/ugcanymodel.proto delete mode 100644 grpc_api/bilibili/app/playerunite/v1/playerunite.proto delete mode 100644 grpc_api/bilibili/app/playurl/v1/playurl.proto delete mode 100644 grpc_api/bilibili/app/resource/privacy/v1/api.proto delete mode 100644 grpc_api/bilibili/app/resource/v1/module.proto delete mode 100644 grpc_api/bilibili/app/search/v2/search.proto delete mode 100644 grpc_api/bilibili/app/show/gateway/v1/service.proto delete mode 100644 grpc_api/bilibili/app/show/mixture/v1/mixture.proto delete mode 100644 grpc_api/bilibili/app/show/popular/v1/popular.proto delete mode 100644 grpc_api/bilibili/app/show/rank/v1/rank.proto delete mode 100644 grpc_api/bilibili/app/show/region/v1/region.proto delete mode 100644 grpc_api/bilibili/app/space/v1/space.proto delete mode 100644 grpc_api/bilibili/app/splash/v1/splash.proto delete mode 100644 grpc_api/bilibili/app/topic/v1/topic.proto delete mode 100644 grpc_api/bilibili/app/view/v1/view.proto delete mode 100644 grpc_api/bilibili/app/viewunite/common.proto delete mode 100644 grpc_api/bilibili/app/viewunite/pgcanymodel.proto delete mode 100644 grpc_api/bilibili/app/viewunite/pugvanymodel.proto delete mode 100644 grpc_api/bilibili/app/viewunite/ugcanymodel.proto delete mode 100644 grpc_api/bilibili/app/viewunite/v1/viewunite.proto delete mode 100644 grpc_api/bilibili/app/wall/v1/wall.proto delete mode 100644 grpc_api/bilibili/broadcast/message/editor/notify.proto delete mode 100644 grpc_api/bilibili/broadcast/message/esports/notify.proto delete mode 100644 grpc_api/bilibili/broadcast/message/fission/notify.proto delete mode 100644 grpc_api/bilibili/broadcast/message/im/notify.proto delete mode 100644 grpc_api/bilibili/broadcast/message/main/dm.proto delete mode 100644 grpc_api/bilibili/broadcast/message/main/native.proto delete mode 100644 grpc_api/bilibili/broadcast/message/main/resource.proto delete mode 100644 grpc_api/bilibili/broadcast/message/main/search.proto delete mode 100644 grpc_api/bilibili/broadcast/message/note/sync.proto delete mode 100644 grpc_api/bilibili/broadcast/message/ogv/freya.proto delete mode 100644 grpc_api/bilibili/broadcast/message/ogv/live.proto delete mode 100644 grpc_api/bilibili/broadcast/message/ticket/activitygame.proto delete mode 100644 grpc_api/bilibili/broadcast/message/tv/proj.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/broadcast.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/laser.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/mod.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/push.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/room.proto delete mode 100644 grpc_api/bilibili/broadcast/v1/test.proto delete mode 100644 grpc_api/bilibili/broadcast/v2/laser.proto delete mode 100644 grpc_api/bilibili/cheese/gateway/player/v1/playurl.proto delete mode 100644 grpc_api/bilibili/community/interfacess/biligram/v1/biligram.proto delete mode 100644 grpc_api/bilibili/community/service/dm/v1/dm.proto delete mode 100644 grpc_api/bilibili/community/service/govern/v1/govern.proto delete mode 100644 grpc_api/bilibili/dagw/component/avatar/common/common.proto delete mode 100644 grpc_api/bilibili/dagw/component/avatar/v1/avatar.proto delete mode 100644 grpc_api/bilibili/dagw/component/avatar/v1/plugin.proto delete mode 100644 grpc_api/bilibili/dynamic/common/dynamic.proto delete mode 100644 grpc_api/bilibili/dynamic/gw/gateway.proto delete mode 100644 grpc_api/bilibili/dynamic/interfaces/campus/v1/api.proto delete mode 100644 grpc_api/bilibili/dynamic/interfaces/feed/v1/api.proto delete mode 100644 grpc_api/bilibili/gaia/gw/gw_api.proto delete mode 100644 grpc_api/bilibili/im/interfaces/inner-interface/v1/api.proto delete mode 100644 grpc_api/bilibili/im/interfaces/v1/im.proto delete mode 100644 grpc_api/bilibili/im/type/im.proto delete mode 100644 grpc_api/bilibili/live/app/room/v1/room.proto delete mode 100644 grpc_api/bilibili/live/general/interfaces/v1/interfaces.proto delete mode 100644 grpc_api/bilibili/main/common/arch/doll/v1/doll.proto delete mode 100644 grpc_api/bilibili/main/community/reply/v1/reply.proto delete mode 100644 grpc_api/bilibili/metadata/device/device.proto delete mode 100644 grpc_api/bilibili/metadata/fawkes/fawkes.proto delete mode 100644 grpc_api/bilibili/metadata/locale/locale.proto delete mode 100644 grpc_api/bilibili/metadata/metadata.proto delete mode 100644 grpc_api/bilibili/metadata/network/network.proto delete mode 100644 grpc_api/bilibili/metadata/parabox/parabox.proto delete mode 100644 grpc_api/bilibili/metadata/restriction/restriction.proto delete mode 100644 grpc_api/bilibili/pagination/pagination.proto delete mode 100644 grpc_api/bilibili/pangu/gallery/v1/gallery.proto delete mode 100644 grpc_api/bilibili/pangu/gallery/v1/openplatform/apiserver/v1alpha1/api.proto delete mode 100644 grpc_api/bilibili/pgc/gateway/player/v1/playurl.proto delete mode 100644 grpc_api/bilibili/pgc/gateway/player/v2/playurl.proto delete mode 100644 grpc_api/bilibili/pgc/service/premiere/v1/premiere.proto delete mode 100644 grpc_api/bilibili/playershared/playershared.proto delete mode 100644 grpc_api/bilibili/polymer/app/search/v1/search.proto delete mode 100644 grpc_api/bilibili/polymer/community/govern/v1/govern.proto delete mode 100644 grpc_api/bilibili/polymer/contract/v1/contract.proto delete mode 100644 grpc_api/bilibili/polymer/demo/demo.proto delete mode 100644 grpc_api/bilibili/polymer/list/v1/list.proto delete mode 100644 grpc_api/bilibili/relation/interfaces/api.proto delete mode 100644 grpc_api/bilibili/render/render.proto delete mode 100644 grpc_api/bilibili/rpc/status.proto delete mode 100644 grpc_api/bilibili/tv/interfaces/dm/v1/dm.proto delete mode 100644 grpc_api/bilibili/vega/deneb/v1/deneb.proto delete mode 100644 grpc_api/bilibili/web/interfaces/v1/interfaces.proto delete mode 100644 grpc_api/bilibili/web/space/v1/space.proto delete mode 100644 grpc_api/datacenter/hakase/protobuf/android_device_info.proto delete mode 100644 grpc_api/pgc/biz/room.proto delete mode 100644 grpc_api/pgc/gateway/vega/v1/vega.proto delete mode 100644 grpc_api/readme.md delete mode 100644 package.json delete mode 100644 yarn.lock diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index b5cfe71..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,12 +0,0 @@ -# These are supported funding model platforms - -github: [SocialSisterYi] -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -custom: https://afdian.com/@ShakaiAneE diff --git a/.github/ISSUE_TEMPLATE/1-add-request.yml b/.github/ISSUE_TEMPLATE/1-add-request.yml deleted file mode 100644 index d632a1a..0000000 --- a/.github/ISSUE_TEMPLATE/1-add-request.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: "新增请求" -description: "请求添加文档中未收录的 API 定义" -title: "[新增请求] " -labels: ["新增/Add"] -body: - - type: checkboxes - id: reminders - attributes: - label: "提交前请确认" - options: - - label: "我已阅读贡献指南, 已检索仓库中文档,确认不包含所提及内容,且 Issues、Pull Requests 中无相关提交" - required: true - - type: dropdown - id: source - attributes: - label: "API 来源" - description: "该 API 在何平台中使用" - multiple: true - options: - - "Web 端(含 H5)" - - "PC 客户端(Electron)" - - "Android 客户端(含粉版、平板版、蓝版、概念版、国际版等)" - - "TV 客户端(含云视听小电视、车机、物联网版等)" - - "iOS 客户端(含粉版、平板版、概念版等)" - - "必剪客户端" - - "漫画客户端" - - "其他(请在详情中备注)" - validations: - required: true - - type: dropdown - id: type - attributes: - label: "API 类型" - description: "API 所使用的协议标准及调用方式" - options: - - "REST" - - "gRPC" - - "长连接数据帧(含 WS、TCP)" - - "其他类型(请在详情中备注)" - validations: - required: true - - type: input - id: address - attributes: - label: "API 地址" - description: "REST 的 URL,或 gRPC 的包名+服务名" - placeholder: "eg: https://api.bilibili.com/2333333" - validations: - required: true - - type: textarea - id: details - attributes: - label: "详情描述" - description: "请描述该 API 的使用场景、请求及响应字段等,可附上原始抓包记录" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/2-update-request.yml b/.github/ISSUE_TEMPLATE/2-update-request.yml deleted file mode 100644 index cc2a1fc..0000000 --- a/.github/ISSUE_TEMPLATE/2-update-request.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: "更新请求" -description: "请求补充或更新文档中已有的 API 定义" -title: "[更新请求] <title>" -labels: ["更新/Update"] -body: - - type: checkboxes - id: reminders - attributes: - label: "提交前请确认" - options: - - label: "我已阅读贡献指南, 已确认文档中相关内容存在错误或不足,且 Issues、Pull Requests 中无相关提交" - required: true - - type: input - id: document_link - attributes: - label: "原文档链接" - description: | - 需要更新的文档链接,指定到具体 API<br> - eg: https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/bangumi/info.md#获取剧集明细web端ssidepid方式<br> - https://socialsisteryi.github.io/bilibili-API-collect/docs/bangumi/info.html#获取剧集明细-web端-ssid-epid方式 - validations: - required: true - - type: textarea - id: details - attributes: - label: "更新内容" - description: "请指出原文档中与最新 API 行为不符之处,并附上已知的最新改动和验证信息" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/3-mistake-report.yml b/.github/ISSUE_TEMPLATE/3-mistake-report.yml deleted file mode 100644 index 22df22c..0000000 --- a/.github/ISSUE_TEMPLATE/3-mistake-report.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: "错误修正" -description: "发现文档内容有误并提交修正请求" -title: "[错误修正] <title>" -labels: ["错误/Mistakes"] -body: - - type: checkboxes - id: confirmations - attributes: - label: "提交前请确认" - options: - - label: "我已阅读贡献指南, 已确认文档中有错误存在,且 Issues、Pull Requests 中无相同修正" - required: true - - label: "我已验证修正内容的正确性" - required: false - - - type: input - id: document_link - attributes: - label: "错误所在文档链接" - description: | - 需要修正的文档链接,指定到具体 API<br> - eg: https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/bangumi/info.md#获取剧集明细web端ssidepid方式<br> - https://socialsisteryi.github.io/bilibili-API-collect/docs/bangumi/info.html#获取剧集明细-web端-ssid-epid方式 - validations: - required: true - - - type: dropdown - id: error_type - attributes: - label: "错误类型" - multiple: true - options: - - "API 地址/鉴权方式错误" - - "参数错误" - - "响应数据结构或响应示例错误" - - "描述性内容错误(如拼写/流程说明)" - - "接口已弃用或下线" - - "其他(请在下文说明)" - validations: - required: true - - - type: textarea - id: error_description - attributes: - label: "错误描述" - description: "请详细说明具体错误所在,如有多个错误请编号列出" - validations: - required: true - - - type: textarea - id: evidence - attributes: - label: "纠错依据" - description: "如果有,请提供抓包记录等佐证,方便确认。如果有多个错误,请将依据对应错误描述的编号列出" - validations: - required: false - - - type: textarea - id: correction - attributes: - label: "修正方案" - description: "如果可以,请提供修正后的内容,如有多个修正点请编号列出" - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index e65606e..0000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: 参与讨论 - url: https://github.com/SocialSisterYi/bilibili-API-collect/discussions - about: 代码用例、情报分享等内容请使用 Discussions diff --git a/.github/workflows/vuepress-deploy.yml b/.github/workflows/vuepress-deploy.yml deleted file mode 100644 index 46c3e95..0000000 --- a/.github/workflows/vuepress-deploy.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: deploy and publish - -on: - workflow_dispatch: - push: - branches: - - master - -permissions: - contents: write - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - # if: github.repository == 'SocialSisterYi/bilibili-API-collect' - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Setup Node.js environment - uses: actions/setup-node@v4.0.3 - with: - node-version: 22 - cache: yarn - - name: Build with yarn - run: yarn && yarn build - - name: Commit & Push - run: | - cd .vuepress/dist/ - git init -b gh_pages - git config user.name "github-actions" - git config user.email "github-actions@github.com" - git remote add origin https://user:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }} - git add -A . - git commit -m "generated" - git push -fu origin gh_pages diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7307447..0000000 --- a/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -/.vuepress/.cache/ -/.vuepress/.temp/ -/.vuepress/dist/ -/node_modules/ -.idea/ -.vscode/ -.DS_Store -*.swp -/*.*js -/*.json -/*.sh diff --git a/.vuepress/client.js b/.vuepress/client.js deleted file mode 100644 index 0509372..0000000 --- a/.vuepress/client.js +++ /dev/null @@ -1,8 +0,0 @@ -import { defineClientConfig } from '@vuepress/client' -import Layout from './theme/layouts/Layout.vue' - -export default defineClientConfig({ - layouts: { - Layout, - }, -}) diff --git a/.vuepress/config.js b/.vuepress/config.js deleted file mode 100644 index dbe9307..0000000 --- a/.vuepress/config.js +++ /dev/null @@ -1,64 +0,0 @@ -import { defineUserConfig } from "vuepress"; -import { viteBundler } from '@vuepress/bundler-vite' -import { defaultTheme } from "@vuepress/theme-default"; -import markdownItTaskLists from "markdown-it-task-lists"; -import { searchPlugin } from "@vuepress/plugin-search"; -import { shikiPlugin } from '@vuepress/plugin-shiki' - -const base = "/bilibili-API-collect/"; - -export default defineUserConfig({ - bundler: viteBundler(), - base: base, - lang: "zh-CN", - title: "BAC Document", - description: "社区开源的第三方哔哩哔哩 API 文档", - head: [["link", { rel: "icon", href: base + "logo2.jpg" }]], - locales: { - "/": { - lang: "zh-CN", - }, - }, - theme: defaultTheme({ - logo: "/logo2.jpg", - navbar: [ - { text: "首页", link: "/" }, - { text: "目录", link: "/#🍴目录" }, - { text: "贡献指南", link: "/CONTRIBUTING.html" }, - { - text: "相关社群", - children: [ - { - text: "QQ交流群(综合技术交流)", - link: "http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164", - }, - { - text: "Telegram交流群(Github Bot推送)", - link: "https://t.me/bilibili_API_collect_community", - }, - ], - }, - ], - repo: "https://github.com/SocialSisterYi/bilibili-API-collect", - docsBranch: "master", - editLinkText: "在 GitHub 上编辑此页", - colorMode: "auto", - themePlugins: { - prismjs: false - } - }), - plugins: [ - searchPlugin({}), - shikiPlugin({ - theme: 'dark-plus', - langs: [ - 'javascript', 'typescript', 'markdown', 'protobuf', 'json', 'jsonc', - 'shell', 'go', 'html', 'http', 'java', 'kotlin', 'python', 'rust', 'c', - 'c++', 'cs', 'php', 'swift', 'text' - ] - }) - ], - extendsMarkdown: (md) => { - md.use(markdownItTaskLists); - } -}); diff --git a/.vuepress/public/logo2.jpg b/.vuepress/public/logo2.jpg deleted file mode 100644 index 199eefc2de3db52e482d78f584e7ad78dd6f5edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17236 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 diff --git a/.vuepress/theme/layouts/Layout.vue b/.vuepress/theme/layouts/Layout.vue deleted file mode 100644 index 75d2f21..0000000 --- a/.vuepress/theme/layouts/Layout.vue +++ /dev/null @@ -1,28 +0,0 @@ -<template> - <ParentLayout> - <template #page-bottom> - <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> - </template> - </ParentLayout> -</template> - -<style> - /* README.md */ - .shields a { - margin: auto .25em; - } - .shields a::after { - display: none !important; - } -</style> - -<script setup> -import ParentLayout from '@vuepress/theme-default/layouts/Layout.vue'; -</script> diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 8856cab..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,285 +0,0 @@ -# 贡献指南 - -欢迎来到 bilibili-API-collect 社区贡献指南,本文主要面向想要对本项目参与贡献的用户, 请务必认真阅读本文正文与潜在的注释 - -## 总则 - -[bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) 项目(简称 BAC 或 b-a-c)是一个仅用于学习研究、社区开源、公益性质的 [B 站(哔哩哔哩)](https://www.bilibili.com/)API(应用程序接口)文档,使用 [CC-BY-NC 4.0 协议](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE)开源,它将无差别收集整理相关的**主站业务接口**。 - -该项目使用 [Markdown](https://zh.wikipedia.org/zh-cn/Markdown) 语法进行文档书写,按照业务类型及功能以**路径**+**文件**形式索引,任何用户都可通过 Issue、Pull Request 与 Discussion 提供自己分析出的接口地址与使用说明。 - -本项目收集的接口类型包括但不限于 REST API、gRPC、WebSocket,文档内统一优先使用安全套接字协议,如 `https`、`securityRpc`、`wss`。 - -## Issue、Discussion 与社群讨论 - -对文档内容存在**不理解**之处、以及发现文档内容有所**缺失**或**错误**,可直接提出,强烈建议以提交 **Issue** 的形式 添加 / 补充 / 更新 文档中的说明,以发起 **Discussion** 的形式提出问题、代码用例、情报分享,并希望关于本项目的各种交流都是**公开进行**的,因为这样才可以保证关键信息的一致性。 - -提交 Issue 请遵守以下原则: - -1. 标题需要点明 API 的用处, `<title>` 要替换为标题主要内容而不是保留不动,切勿仅填写 `补充`、`修复`,形式良好的标题可以是 `[新增请求] 新增 xx 接口`、`[更新请求] xx 接口地址已失效`、`[更新请求] xx 接口的参数有变化` -2. 正文请按照 Issue 模板进行填写,标明 API 来源(Web、Android、iOS、TV 等)、API 类型(REST、gRPC、WebSocket 等)、API 地址 -3. 详情描述需要提供该 API 的使用场景、请求及响应字段等,可附上原始抓包记录 (文本格式优先);在更新时还需指出原文档中与最新 API 行为不符之处,并附上已知的最新改动。例如:“在前端页面某地址 / APP 某界面访问某 API(标明地址),它的某参数与文档中不符(标明文档地址)” - -发起 Discussion 请遵守以下原则: - -1. 标题言简意骇,说明欲提出的问题要点,如 `如何通过 xx 接口获取 yy`、`关于 xx 字段意义的探讨`、`建议将 xx 加入 yy 分类` 等标题;切勿使用表意含糊不清或索取性的标题,如 `怎么解决风控`、`搜索的接口是什么`、`好兄弟有没有投稿的接口` 等标题 -2. Discussion 正文应对遇到的问题进行尽可能详细的描述,展开并聚焦有关的信息,例如: “按照文档中某位置的说明进行了某操作,为什么无法获得预期结果”、“请问某 API 的某字段的具体含义是什么” -3. 提出问题时注意[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md)并且[别像弱智一样提问](https://github.com/tangx/Stop-Ask-Questions-The-Stupid-Ways) - -同时,您还可以通过加入社群的方式参与讨论 - -- QQ 交流群:[邀请链接](https://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164) -- Telegram 交流群:[@bilibili_API_collect_community](https://t.me/bilibili_API_collect_community) - -::: tip 提示 - -QQ 交流群为综合技术交流群(兼 Owner 的粉丝群),可交流探讨任何技术,包括但不限于 [BAC 项目](https://github.com/SocialSisterYi/bilibili-API-collect) - -Telegram 交流群主要用作 [BAC 项目](https://github.com/SocialSisterYi/bilibili-API-collect)的 Github Bot 接收,也可以进行项目相关的讨论,但不建议在此讨论交流其他内容(公开群) - -::: - -::: warning 注意 - -群内讨论同样需要遵守**公开交流**的原则,以及群内会定期清理不活跃成员。 - -**QQ 交流群**的加群问题答案可以去 [Owner 的主页](https://github.com/SocialSisterYi) Contact 部分找到,如果您填写“我不知道,从 Github 来的”那么管理员将有理由禁止您进群讨论! - -::: - -::: danger 禁止 - -项目 Issue 及其相关社群中**禁止**询问讨论 风控解除、爬虫(采集)、破解、漏洞利用、买卖代码和账号 相关内容,抵制基于本项目进行的一切黑产行为! - -::: - -## 目录与路径结构 - -### 目录 - -文档目录以 **Markdown 无序列表**语法写在 [README.md](README.md) 中,使用缩进标识文档的层级,如 `视频` 下存在 `基本信息`、`快照`、`视频推荐`、`TAG` 等子分类,使用 **Markdown 复选框**语法该标注文档是否编写完成, 新文档写完后记得在目录添加入口 - -```markdown -- [ ] 视频 - - [x] 基本信息 - - [x] 快照 - - [x] 视频推荐 - - [ ] TAG -``` - -### 路径 - -路径层级应当与文档目录一致,以文件夹的形式存放在项目中的 `/docs` 路径下,命名统一使用英文小写,如 `video`、`danmaku`、`comment`, 不建议出现 `&` 等特殊字符 - -二级、三级路径应当存在二级三级目录,可选添加 `README.md` 以描述该子目录 - -### 文件 - -各个子接口集整理为 Markdown (.md) 文件,命名统一使用英文小写,如 `info.md`、`action.md`、`list.md` - -文档文件中用于存放相关的接口的说明,如 `video/` 下的 `info.md`,存在 `查询视频基本信息`、`查询视频简介`、`查询视频分P列表` 等内容 - -## Markdown 文档内容格式 - -文档使用 [VuePress](https://vuepress.vuejs.org/) 生成,可以使用 [VuePress Markdown 扩展语法](https://vuepress.vuejs.org/guide/markdown.html)编写 - -注:以下文档范式主要针对接口类文档, 可根据**实际情况**进行调整, 你也可以使用 [`json-apidoc-gen`](https://github.com/SessionHu/json-apidoc-gen) 工具直接生成模板自行填充内容. 非接口类文档, 如算法等, 可以参考已有的内容 - -### 头部 - -文档首行为**一级标签**格式标题,如 `# 用户基本信息` - -**文档头部不需要手写索引**,索引由 VuePress 自动生成 - -### 接口说明 - -文档中可存在多个接口说明,应当遵守同一范式,依次排列在文档中 - -接口说明分为 `标题`、`地址`、`说明`、`请求参数`、`响应正文`、`示例` 这些部分 - -接口标题为**二级以下**的标签<!--别顶着一级标题就开写-->,接口地址使用**块引用**语法,地址只保留 REST API 路径,不应携带 query 等内容 - -接口地址下方需要注明接口的请求方法,如 `GET`、`POST`、`PUT` 等,使用*斜体*语法 - -若接口存在认证或鉴权,需要在说明中注明,如 `Cookie (SESSDATA)`、`APP`(认证是针对用户的,鉴权是针对接口使用的) - -其他使用说明也可写在这里,如 `限制游客访问的视频需要登录` - -e.g.: - -```markdown -## 获取视频详细信息_web端 - -> https://api.bilibili.com/x/web-interface/view - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -限制游客访问的视频需要登录 -``` - -**请求参数**应在**接口说明**的下方,应注明参数类型 URL 参数或正文参数(正文参数应注明 `Content-Type`,如 `application/x-www-form-urlencoded` 或 `multipart/form-data`),使用**加粗**语法 - -对象的字段及其含义使用**表格**进行整理,表头统一依次为 `参数名`、`类型`、`内容`、`必要性`、`备注`,使用 `object`、`number`、`string`、`boolean`、`number[]`、`string[]`、`file` 等这种类似 TypeScript 的类型系统,必要性为 `必要`、`非必要`、`必要 (可选)` 等,表格内每个字段为一行 - -e.g.: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ----------- | ----------------- | -| aid | num | 稿件 avid | 必要 (可选) | avid 与 bvid 任选 | -| bvid | str | 稿件 bvid | 必要 (可选) | avid 与 bvid 任选 | - -**响应正文**应在**请求参数**的下方,接口响应的数据格式应标注,如 `JSON 回复`、`XML 回复`、`ProtoBuf 回复`,使用**加粗**语法 - -JSON Object 或 ProtoBuf Message 应以对象的**表格**形式书写,表头为 `根对象` 或 `xx 中的 yy 对象` 或 `xx.yy.zz 对象`,若对象位于数组中则为 `xx 数组中的对象` 或 `xx[] 中的对象` - -表头统一依次为 `字段`、`类型`、`内容`、`备注`,类型为 JSON / Protobuf 的标准类型,具体同请求参数一致 - -不明确定义的字段说明在内容的末尾添加问号,如 `播放数?`;定义尚未明确的字段使用 `(?)` 在内容中占位,并在备注中填写 `作用尚不明确` - -多个对象及数组,使用**遍历树**的顺序进行排列, 若数组中的每一项结构均相同也可以直接省略为像 `xxx 数组中的对象` 这样的格式 - -e.g.: - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ------------ | -| bvid | str | 稿件 bvid | | -| aid | num | 稿件 avid | | -| videos | num | 稿件分P总数 | 默认为 1 | -| tid | num | 分区 tid | | -| no_cache | bool | (?) | 作用尚不明确 | - -Json Array 或 ProtoBuf Repeated 类型使用数组的**表格**形式书写,表头统一依次为 `项`、`类型`、`内容`、`备注`,无限长度数组表尾需要添加**省略号** - -数组每项内容若与实际数据有关联,`内容` 字段则可标为 `(n+1)P 视频内容` 这样的形式 - -e.g.: - -`data` 中的 `pages` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------- | -| 0 | obj | 1P 视频内容 | 无分 P 仅有此项 | -| n | obj | (n+1)P 视频内容 | | -| …… | obj | …… | …… | - -**示例**部分位于所有**响应正文**部分下方,需要**加粗**格式,分为请求命令示例与响应体示例两部分 - -请求命令示例为一段可测试该接口的 cURL 命令或某种编程语言的代码,使用**代码块**语法书写,命令应当尽可能简短、便于使人阅读, 代码缩进为 **2** 个 **空格 (U+0020)** - -示例命令中的认证信息应做**脱敏处理**,如 Cookie、Token、access_key 等,可替换为 `xxx` 占位 - -示例命令前后可以适当添加一些文字说明 - -响应体示例为一段格式化后的 JSON 或 ProtoBuf Message,使用**代码块**语法书写, 代码块语言填写清楚, 注意 `json` `jsonc` 区别. 并使用 `<details>` 标签进行折叠, 仍一律使用 **2** 个 **空格** 进行缩进 - -e.g.: - -````markdown -**示例:** - -获取视频 `av85440373` 的基本信息 - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view' \ - --data-urlencode 'aid=85440373' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "bvid": "BV117411r7R1", - "aid": 85440373, - "videos": 1, - "tid": 28, - "tname": "原创音乐", - "copyright": 1, - // ... - } -} -``` - -</details> -```` - -### 枚举值与属性位 - -接口返回或请求中若存在一些 enum 类型或二进制属性位,应当单独进行探讨,如视频的属性位 `attribute` 或视频清晰度 `qn` - -这些值及其说明使用**表格**进行整理,表头统一为 `位` / `代码` / `值`、`含义`、`备注` - -这些枚举值或属性位的用法应附加文字说明 - -e.g.: - -| 值 | 含义 | 备注 | -| ---- | ------------- | ------------------------------------------------------------ | -| 6 | 240P 极速 | 仅 MP4 格式支持<br />仅 `platform=html5` 时有效 | -| 16 | 360P 流畅 | | -| 32 | 480P 清晰 | | -| 64 | 720P 高清 | WEB 端默认值<br />B 站前端需要登录才能选择,但是直接发送请求可以不登录就拿到 720P 的取流地址<br />**无 720P 时则为 720P60** | -| 74 | 720P60 高帧率 | 需要登录认证 | -| 80 | 1080P 高清 | TV 端与 APP 端默认值<br />需要登录认证 | - -## Proto 定义格式 - -proto 文件为 [Protocol Buffers](https://protobuf.dev/) 以及 [gRPC](https://grpc.io/docs/) 的数据结构体定义,多用于客户端的接口,本文档也做相关的收集 - -存放于项目的 `/grpc_api` 路径下,使用包名进行路径层级的组织,如: - -``` -/grpc_api/bilibili/main/community/reply/v1/reply.proto -/grpc_api/bilibili/app/archive/v1/archive.proto -/grpc_api/bilibili/app/view/v1/view.proto -``` - -proto 文件内使用**单行注释**标注字段或对象的含义,如: - -```protobuf -// UP主信息 -message Author { - // UP主mid - int64 mid = 1; - // UP主昵称 - string name = 2; - // UP主头像url - string face = 3; -} -``` - -## 文档提交 - -### 拉取 (Pull) 与 提交 (Commit) - -本项目仓库仅托管于 GitHub, 使用 Git 作为版本控制系统, 你需要对两者有基础的了解 - -请先 fork, 然后在自己的 fork 上进行修改<!--废话--> - -提交的标题不要使用默认的 `Update xxx`, 请遵循 [Conventional Commits (约定式提交) 规范](https://www.conventionalcommits.org/zh-hans/v1.0.0/), 标题语言可根据个人习惯 - -<!--下面这两段属于常识, 但好像还有人不知道--> -当发现远程与本地仓库不一致时, 若你操作的 fork 的 branch 无打开的 PR, 建议使用变基拉取, 而不是生成一个额外的合并提交的合并拉取, 反之则相反 - -移动文件请使用 `git mv`, 而不是删除并添加同一个文件于不同位置 (该问题在 VSCode 的 GUI 版 Git 中存在<!--某个易姓owner干过-->), 以便后续 blame 操作 - -### 拉取请求 (Pull Request) - -使用 拉取请求 (Pull Request, PR) 将修改后的文档提交到 `master` 分支,标题需写明修改或新增的内容, 同样也需要遵循约定式提交规范, `gh_pages` 分支将在 PR 合并后自动更新 - -如果你还没有完成计划的全部修改, 请创建 Draft Pull Request 表示你还没有做好被合并的准备 ~~(抢占先机, 精神可嘉, 值得鼓励)~~ - -PR 正文使用 **无序列表** 写明更改的每一项内容, 可以使用复选框表明进度, 需要关闭的 Issue 请使用 `close #xxxx` 这样的格式一并包含在内 - -如果内容包含代码等, 请一并提供测试的输入与输出的文本或截图, 最好可以附上完整的测试环境及相关可执行文件等 - -<!--这也是常识喵--> -PR 合并后, 请及时删除或更新分支. 特别是在使用压缩合并或变基合并后, 请 `Discard changes` 或直接删除分支, 以免在下一次 PR 后出现重复相同提交的问题 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 973f6ce..0000000 --- a/LICENSE +++ /dev/null @@ -1,352 +0,0 @@ -Creative Commons Attribution-NonCommercial 4.0 International - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright and -certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - -- Considerations for licensors: Our public licenses are intended for - use by those authorized to give the public permission to use - material in ways otherwise restricted by copyright and certain other - rights. Our licenses are irrevocable. Licensors should read and - understand the terms and conditions of the license they choose - before applying it. Licensors should also secure all rights - necessary before applying our licenses so that the public can reuse - the material as expected. Licensors should clearly mark any material - not subject to the license. This includes other CC-licensed - material, or material used under an exception or limitation to - copyright. More considerations for licensors : - wiki.creativecommons.org/Considerations_for_licensors - -- Considerations for the public: By using one of our public licenses, - a licensor grants the public permission to use the licensed material - under specified terms and conditions. If the licensor's permission - is not necessary for any reason–for example, because of any - applicable exception or limitation to copyright–then that use is not - regulated by the license. Our licenses grant only permissions under - copyright and certain other rights that a licensor has authority to - grant. Use of the licensed material may still be restricted for - other reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, such - as asking that all changes be marked or described. Although not - required by our licenses, you are encouraged to respect those - requests where reasonable. More considerations for the public : - wiki.creativecommons.org/Considerations_for_licensees - -Creative Commons Attribution-NonCommercial 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NonCommercial 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and conditions. - -- Section 1 – Definitions. - - - a. Adapted Material means material subject to Copyright and - Similar Rights that is derived from or based upon the Licensed - Material and in which the Licensed Material is translated, - altered, arranged, transformed, or otherwise modified in a - manner requiring permission under the Copyright and Similar - Rights held by the Licensor. For purposes of this Public - License, where the Licensed Material is a musical work, - performance, or sound recording, Adapted Material is always - produced where the Licensed Material is synched in timed - relation with a moving image. - - b. Adapter's License means the license You apply to Your - Copyright and Similar Rights in Your contributions to Adapted - Material in accordance with the terms and conditions of this - Public License. - - c. Copyright and Similar Rights means copyright and/or similar - rights closely related to copyright including, without - limitation, performance, broadcast, sound recording, and Sui - Generis Database Rights, without regard to how the rights are - labeled or categorized. For purposes of this Public License, the - rights specified in Section 2(b)(1)-(2) are not Copyright and - Similar Rights. - - d. Effective Technological Measures means those measures that, - in the absence of proper authority, may not be circumvented - under laws fulfilling obligations under Article 11 of the WIPO - Copyright Treaty adopted on December 20, 1996, and/or similar - international agreements. - - e. Exceptions and Limitations means fair use, fair dealing, - and/or any other exception or limitation to Copyright and - Similar Rights that applies to Your use of the Licensed - Material. - - f. Licensed Material means the artistic or literary work, - database, or other material to which the Licensor applied this - Public License. - - g. Licensed Rights means the rights granted to You subject to - the terms and conditions of this Public License, which are - limited to all Copyright and Similar Rights that apply to Your - use of the Licensed Material and that the Licensor has authority - to license. - - h. Licensor means the individual(s) or entity(ies) granting - rights under this Public License. - - i. NonCommercial means not primarily intended for or directed - towards commercial advantage or monetary compensation. For - purposes of this Public License, the exchange of the Licensed - Material for other material subject to Copyright and Similar - Rights by digital file-sharing or similar means is NonCommercial - provided there is no payment of monetary compensation in - connection with the exchange. - - j. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, - distribution, dissemination, communication, or importation, and - to make material available to the public including in ways that - members of the public may access the material from a place and - at a time individually chosen by them. - - k. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and - of the Council of 11 March 1996 on the legal protection of - databases, as amended and/or succeeded, as well as other - essentially equivalent rights anywhere in the world. - - l. You means the individual or entity exercising the Licensed - Rights under this Public License. Your has a corresponding - meaning. - -- Section 2 – Scope. - - - a. License grant. - - 1. Subject to the terms and conditions of this Public - License, the Licensor hereby grants You a worldwide, - royalty-free, non-sublicensable, non-exclusive, irrevocable - license to exercise the Licensed Rights in the Licensed - Material to: - - A. reproduce and Share the Licensed Material, in whole - or in part, for NonCommercial purposes only; and - - B. produce, reproduce, and Share Adapted Material for - NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, - where Exceptions and Limitations apply to Your use, this - Public License does not apply, and You do not need to comply - with its terms and conditions. - - 3. Term. The term of this Public License is specified in - Section 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter - created, and to make technical modifications necessary to do - so. The Licensor waives and/or agrees not to assert any - right or authority to forbid You from making technical - modifications necessary to exercise the Licensed Rights, - including technical modifications necessary to circumvent - Effective Technological Measures. For purposes of this - Public License, simply making modifications authorized by - this Section 2(a)(4) never produces Adapted Material. - - 5. Downstream recipients. - - A. Offer from the Licensor – Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - B. No downstream restrictions. You may not offer or - impose any additional or different terms or conditions - on, or apply any Effective Technological Measures to, - the Licensed Material if doing so restricts exercise of - the Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License - constitutes or may be construed as permission to assert or - imply that You are, or that Your use of the Licensed - Material is, connected with, or sponsored, endorsed, or - granted official status by, the Licensor or others - designated to receive attribution as provided in Section - 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, - to the extent possible, the Licensor waives and/or agrees - not to assert any such rights held by the Licensor to the - limited extent necessary to allow You to exercise the - Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties, including when - the Licensed Material is used other than for NonCommercial - purposes. - -- Section 3 – License Conditions. - - Your exercise of the Licensed Rights is expressly made subject to - the following conditions. - - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - A. retain the following if it is supplied by the - Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to - the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may - be reasonable to satisfy the conditions by providing a URI - or hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - -- Section 4 – Sui Generis Database Rights. - - Where the Licensed Rights include Sui Generis Database Rights that - apply to Your use of the Licensed Material: - - - a. for the avoidance of doubt, Section 2(a)(1) grants You the - right to extract, reuse, reproduce, and Share all or a - substantial portion of the contents of the database for - NonCommercial purposes only; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; - and - - c. You must comply with the conditions in Section 3(a) if You - Share all or a substantial portion of the contents of the - database. - - For the avoidance of doubt, this Section 4 supplements and does not - replace Your obligations under this Public License where the - Licensed Rights include other Copyright and Similar Rights. - -- Section 5 – Disclaimer of Warranties and Limitation of Liability. - - - a. Unless otherwise separately undertaken by the Licensor, to - the extent possible, the Licensor offers the Licensed Material - as-is and as-available, and makes no representations or - warranties of any kind concerning the Licensed Material, whether - express, implied, statutory, or other. This includes, without - limitation, warranties of title, merchantability, fitness for a - particular purpose, non-infringement, absence of latent or other - defects, accuracy, or the presence or absence of errors, whether - or not known or discoverable. Where disclaimers of warranties - are not allowed in full or in part, this disclaimer may not - apply to You. - - b. To the extent possible, in no event will the Licensor be - liable to You on any legal theory (including, without - limitation, negligence) or otherwise for any direct, special, - indirect, incidental, consequential, punitive, exemplary, or - other losses, costs, expenses, or damages arising out of this - Public License or use of the Licensed Material, even if the - Licensor has been advised of the possibility of such losses, - costs, expenses, or damages. Where a limitation of liability is - not allowed in full or in part, this limitation may not apply to - You. - - c. The disclaimer of warranties and limitation of liability - provided above shall be interpreted in a manner that, to the - extent possible, most closely approximates an absolute - disclaimer and waiver of all liability. - -- Section 6 – Term and Termination. - - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply - with this Public License, then Your rights under this Public - License terminate automatically. - - b. Where Your right to use the Licensed Material has terminated - under Section 6(a), it reinstates: - - - 1. automatically as of the date the violation is cured, - provided it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect - any right the Licensor may have to seek remedies for Your - violations of this Public License. - - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing - so will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - -- Section 7 – Other Terms and Conditions. - - - a. The Licensor shall not be bound by any additional or - different terms or conditions communicated by You unless - expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - -- Section 8 – Interpretation. - - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could - lawfully be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public - License is deemed unenforceable, it shall be automatically - reformed to the minimum extent necessary to make it enforceable. - If the provision cannot be reformed, it shall be severed from - this Public License without affecting the enforceability of the - remaining terms and conditions. - - c. No term or condition of this Public License will be waived - and no failure to comply consented to unless expressly agreed to - by the Licensor. - - d. Nothing in this Public License constitutes or may be - interpreted as a limitation upon, or waiver of, any privileges - and immunities that apply to the Licensor or You, including from - the legal processes of any jurisdiction or authority. - -Creative Commons is not a party to its public licenses. Notwithstanding, -Creative Commons may elect to apply one of its public licenses to -material it publishes and in those instances will be considered the -"Licensor." The text of the Creative Commons public licenses is -dedicated to the public domain under the CC0 Public Domain Dedication. -Except for the limited purpose of indicating that material is shared -under a Creative Commons public license or as otherwise permitted by the -Creative Commons policies published at creativecommons.org/policies, -Creative Commons does not authorize the use of the trademark "Creative -Commons" or any other trademark or logo of Creative Commons without its -prior written consent including, without limitation, in connection with -any unauthorized modifications to any of its public licenses or any -other arrangements, understandings, or agreements concerning use of -licensed material. For the avoidance of doubt, this paragraph does not -form part of the public licenses. - -Creative Commons may be contacted at creativecommons.org. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index aa10099..0000000 --- a/README.md +++ /dev/null @@ -1,408 +0,0 @@ -<p align="center"> - <img src="./assets/img/logo.png" width="250" height="200" /> -</p> -<h1 align="center">哔哩哔哩 - API 收集整理</h1> -<p align="center" class="shields"> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/issues" style="text-decoration: none;"> - <img src="https://img.shields.io/github/issues/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=red" alt="GitHub issues"/> - </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/stargazers" style="text-decoration: none;"> - <img src="https://img.shields.io/github/stars/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=yellow" alt="GitHub stars"/> - </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/network" style="text-decoration: none;"> - <img src="https://img.shields.io/github/forks/SocialSisterYi/bilibili-API-collect.svg?style=flat&color=blue" alt="GitHub forks"/> - </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/actions" style="text-decoration: none;"> - <img src="https://img.shields.io/github/actions/workflow/status/SocialSisterYi/bilibili-API-collect/vuepress-deploy.yml?style=flat" alt="Build status"/> - </a> - <a href="https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/LICENSE" style="text-decoration: none;"> - <img src="https://img.shields.io/badge/License-CC%20BY--NC%204.0-lightgrey.svg?style=flat" alt="GitHub license"/> - </a> -</p> -<p align="center" class="trendshift"> - <a href="https://trendshift.io/repositories/3218" target="_blank"> - <img src="https://trendshift.io/api/badge/repositories/3218" alt="Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/> - </a> -</p> -<h3 align="center">野生 API 文档</h3> -<h3 align="center">不断更新中....</h3> - -本项目旨在对 B 站 WEB、APP、TV 等客户端中,散落在世界各地的野生 API 进行收集整理,研究使用方法并对其进行说明,运用了黑箱法、控制变量法、代码逆向分析、拆包及反编译法、网络抓包法等研究办法 - -本文档探讨的对象是主站业务接口,[官方开放平台](https://openhome.bilibili.com/doc) 和 [直播开放平台](https://open-live.bilibili.com/document/) 均不属于本项目范畴,请移步 - -B站 API 采用 C/S 结构,大多数接口为 REST API 和 gRPC,少部分接口为 WebSocket;REST API 接口请求数据大多为 url query 表单或 JSON,返回数据大多为 JSON 或 Protobuf,强制使用 https 协议 - -📖阅读地址:[Github Pages](https://socialsisteryi.github.io/bilibili-API-collect/) - -小小的 Demo:~~av583785685~~ [视频失效原因](https://shakaianee.top/archives/56/) ([Youtube 备链](https://www.youtube.com/watch?v=nfF91Z6fqGk)) - -::: warning 声明 - -1. 本项目遵守 CC-BY-NC 4.0 协议,禁止一切商业使用,如需转载请注明作者 ID -2. **请勿滥用,本项目仅用于学习和测试!请勿滥用,本项目仅用于学习和测试!请勿滥用,本项目仅用于学习和测试!** -3. 利用本项目提供的接口、文档等造成不良影响及后果与本人无关 -4. 由于本项目的特殊性,可能随时停止开发或删档 -5. 本项目为开源项目,不接受任何形式的催单和索取行为,更不容许存在付费内容 -6. **上传任何信息时请注意脱敏,删去账户密码、敏感 cookies 等可能泄漏个人信息的数据(例如 `SESSDATA`、`bili_jct` 之类的 cookies)** - -::: - -## 🌱参与贡献 - -欢迎各位 dalao 对本项目做出贡献,也希望每个使用者都能提出宝贵的意见 - -目前本项目存在的问题包括但不限于: - -1. 文档二级目录尚未完成 -2. 部分文档较旧,修改与更新没有跟进 -3. 目前文档使用 Markdown 语法编写,不易生成编程语言的 SDK,详见 [#604](https://github.com/SocialSisterYi/bilibili-API-collect/issues/604) - -更多信息请浏览 [贡献指南](CONTRIBUTING.md) - -## 🍴目录 - -计划整理分类 & 目录:(文档已完结请选中 checkbox) - -- [ ] [接口签名与验证](docs/misc/sign) - - [x] [APP API 签名](docs/misc/sign/APP.md)(`appkey` 与 `sign`) - - [x] [已知的 APPKey](docs/misc/sign/APPKey.md) - - [x] [Wbi 签名](docs/misc/sign/wbi.md)(`wts`与`w_rid`) - - [ ] [bili_ticket](docs/misc/sign/bili_ticket.md) - - [ ] [v_voucher 验证](docs/misc/sign/v_voucher.md) -- [ ] [杂项](docs/misc) - - [x] [获取当前时间戳](docs/misc/time_stamp.md) - - [x] [公共错误码](docs/misc/errcode.md) - - [x] [图片格式化](docs/misc/picture.md) - - [x] [表达式渲染](docs/misc/mathjax.md) - - [x] [bvid 说明](docs/misc/bvid_desc.md) - - [ ] [设备唯一标识 BUVID](docs/misc/device_identity.md) - - [ ] [获取 buvid3 / buvid4 / b_nut](docs/misc/buvid3_4.md) - - [ ] [b23.tv 短链](docs/misc/b23tv.md) -- [ ] [gRPC API 接口定义](grpc_api) -- [ ] [登录](docs/login) - - [x] [登录操作 (人机认证)](docs/login/login_action) - - [x] [短信登录](docs/login/login_action/SMS.md) - - [x] [密码登录](docs/login/login_action/password.md) - - [x] [二维码登录](docs/login/login_action/QR.md) - - [ ] SNS 登录 (QQ & 微信 & 微博) - - [x] [登录基本信息](docs/login/login_info.md) - - [ ] [个人中心](docs/login/member_center.md) - - [ ] [注销登录](docs/login/exit.md) - - [x] [登录记录](docs/login/login_notice.md) - - [x] [Web 端 Cookie 刷新](docs/login/cookie_refresh.md) -- [ ] [消息中心](docs/message) - - [ ] [通知类消息](docs/message/msg.md) - - [x] [私信](docs/message/private_msg.md) - - [x] [私信消息类型、内容说明](docs/message/private_msg_content.md) - - [x] [设置](docs/message/settings.md) -- [ ] [用户](docs/user) - - [x] [基本信息](docs/user/info.md) - - [x] [状态数](docs/user/status_number.md) - - [x] [关系](docs/user/relation.md) - - [ ] [个人空间](docs/user/space.md) - - [x] ~~[检查昵称是否可注册](docs/user/check_nickname.md)~~ (已失效) - - [x] [用户注册](docs/user/register.md) - - [x] [用户认证类型一览](docs/user/official_role.md) - - [ ] [加入老粉计划](docs/user/contract.md) - - [x] [所有粉丝勋章](docs/user/medals.md) - - [ ] [批量查询](docs/user/batch.md) -- [ ] [大会员](docs/vip) - - [ ] [大会员基本信息](docs/vip/info.md) - - [ ] [大会员中心](docs/vip/center.md) - - [ ] [大会员签到](docs/vip/clockin.md) - - [ ] [大会员操作](docs/vip/action.md) -- [ ] [视频](docs/video) - - [x] [视频分区一览 (分区代码)](docs/video/video_zone.md) - - [ ] [视频分区一览 (分区代码) (v2)](docs/video/video_zone_v2.md) - - [x] [基本信息](docs/video/info.md) - - [x] ~~[状态数](docs/video/status_number.md)~~ (已失效) - - [x] [快照](docs/video/snapshot.md) - - [x] [点赞 & 投币 & 收藏 & 分享](docs/video/action.md) - - [ ] [TAG](docs/video/tags.md) - - [x] [视频推荐](docs/video/recommend.md) - - [x] [播放 & 下载地址 (视频流)](docs/video/videostream_url.md) - - [ ] [互动视频](docs/video/interact_video.md) - - [x] [高能进度条](docs/video/pbp.md) - - [ ] [信息上报 (心跳及记录历史)](docs/video/report.md) - - [x] [视频属性数据](docs/video/attribute_data.md) - - [x] [视频在线人数](docs/video/online.md) - - [x] [视频 AI 摘要](docs/video/summary.md) - - [ ] [稿件投诉](docs/video/appeal.md) - - [ ] [视频合集](docs/video/collection.md) - - [ ] [播放器](docs/video/player.md) -- [ ] [剧集 (番剧、影视)](docs/bangumi) - - [ ] [基本信息](docs/bangumi/info.md) - - [ ] [播放 & 下载地址(视频流)](docs/bangumi/videostream_url.md) - - [ ] [时间轴](docs/bangumi/timeline.md) - - [ ] [索引](docs/bangumi/season_index.md) - - [ ] [追番相关](docs/bangumi/follow.md) - - [ ] 状态数 - - [ ] 操作 -- [ ] [视频弹幕](docs/danmaku) - - [x] [protobuf 实时弹幕](docs/danmaku/danmaku_proto.md) - - [x] [protobuf 弹幕元数据(BAS 弹幕 / 互动弹幕)](docs/danmaku/danmaku_view_proto.md) - - [x] [xml 实时弹幕](docs/danmaku/danmaku_xml.md) - - [x] [历史弹幕](docs/danmaku/history.md) - - [x] [快照](docs/danmaku/snapshot.md) - - [ ] [弹幕操作](docs/danmaku/action.md) - - [ ] 高级弹幕 - - [ ] 屏蔽管理 - - [ ] [智能防挡弹幕](docs/danmaku/webmask.md) - - [x] [弹幕个人配置修改](docs/danmaku/config.md) - - [x] [名词解释](docs/danmaku/buzzword.md) - - [x] [点赞查询](docs/danmaku/thumbup.md) -- [x] [视频笔记](docs/note) - - [x] [笔记列表](docs/note/list.md) - - [x] [笔记详细信息](docs/note/info.md) - - [x] [笔记操作](docs/note/action.md) -- [ ] [图文](docs/opus) - - [x] [图文详细](docs/opus/detail.md) - - [x] [空间图文](docs/opus/space.md) - - [ ] [功能模块](docs/opus/features.md) - - [ ] [富文本节点](docs/opus/rich_text_nodes.md) -- [ ] [专栏](docs/article) - - [ ] [专栏内容](docs/article/view.md) - - [ ] [专栏分类](docs/article/category.md) - - [x] [卡片信息](docs/article/card.md) - - [X] [基本信息](docs/article/info.md) - - [X] [点赞 & 投币 & 收藏 & 分享](docs/article/action.md) - - [X] [文集基本信息](docs/article/articles.md) -- [ ] [动态](docs/dynamic) - - [ ] [获取动态列表](docs/dynamic/all.md) - - [ ] [用户空间动态](docs/dynamic/space.md) - - [ ] [动态基本信息](docs/dynamic/basicInfo.md) - - [ ] [动态卡片信息字段](docs/dynamic/card_info.md) - - [ ] [获取动态详情](docs/dynamic/detail.md) - - [ ] [动态类型对照](docs/dynamic/dynamic_enum.md) - - [ ] [动态信息](docs/dynamic/content.md) - - [ ] [发送 & 转载动态](docs/dynamic/publish.md) - - [ ] [根据关键字搜索用户(at 别人时的填充列表)](docs/dynamic/atlist.md) - - [ ] [操作](docs/dynamic/action.md) - - [ ] [话题](docs/dynamic/topic.md) - - [ ] [动态内容](docs/dynamic/get_dynamic_detail.md) - - [ ] [导航栏动态](docs/dynamic/nav.md) - - [x] [首页公告栏](docs/dynamic/banner.md) -- [ ] [创作中心](docs/creativecenter) - - [ ] [投稿](docs/creativecenter/upload.md) - - [ ] [统计与数据](docs/creativecenter/statistics&data.md) - - [ ] 列表查询相关 - - [x] [电磁力数据](docs/creativecenter/railgun.md) - - [ ] [合集管理](docs/creativecenter/season.md) - - [ ] [视频相关杂项](docs/creativecenter/videos.md) - - [ ] [图文操作](docs/creativecenter/opus.md) -- [ ] [音频](docs/audio) - - [x] [歌曲基本信息](docs/audio/info.md) - - [ ] [歌单 & 音频收藏夹详细信息](docs/audio/music_list.md) - - [ ] [状态数](docs/audio/status_number.md) - - [ ] [投币 & 收藏](docs/audio/action.md) - - [x] [播放 & 下载地址(音频流)](docs/audio/musicstream_url.md) - - [x] [音频榜单](docs/audio/rank.md) -- [ ] [排行榜 & 最新视频](docs/video_ranking) - - [ ] [排行榜](docs/video_ranking/ranking.md) - - [ ] [热门视频](docs/video_ranking/popular.md) - - [ ] [最新视频](docs/video_ranking/dynamic.md) - - [x] [入站必刷视频](docs/video_ranking/precious_videos.md) -- [ ] [搜索](docs/search) - - [x] [搜索请求](docs/search/search_request.md) - - [x] [搜索结果](docs/search/search_response.md) - - [x] [默认搜索 & 热搜](docs/search/hot.md) - - [x] [搜索建议](docs/search/suggest.md) -- [ ] [小黑屋](docs/blackroom) - - [ ] 基本信息 - - [x] [封禁公示](docs/blackroom/banlist.md) - - [x] [风纪委员及众裁案件相关](docs/blackroom/jury) - - [x] [风纪委员基本信息](docs/blackroom/jury/base_info.md) - - [x] [众裁案件基本信息](docs/blackroom/jury/judgement_info.md) - - [x] [裁决操作](docs/blackroom/jury/action.md) -- [x] [评论区](docs/comment) - - [x] [评论区明细](docs/comment/list.md) - - [x] [操作](docs/comment/action.md) -- [ ] [表情](docs/emoji) - - [x] [表情及表情包信息](docs/emoji/list.md) - - [x] [操作](docs/emoji/action.md) -- [x] [实时广播(通讯协议)](docs/broadcast) - - [x] [视频内广播](docs/broadcast/video_room.md) -- [ ] [充电](docs/electric) - - [ ] [包月充电](docs/electric/monthly.md) - - [ ] 自定义充电 - - [x] [B 币方式充电](docs/electric/Bcoin.md) - - [x] [微信 & 支付宝方式充电](docs/electric/WeChat&Alipay.md) - - [x] [充电留言](docs/electric/charge_msg.md) - - [x] [充电列表](docs/electric/charge_list.md) -- [ ] ~~[相簿](docs/album)~~ (已下线) - - [x] ~~[基本信息](docs/album/info.md)~~ - - [x] ~~[相簿列表](docs/album/list.md)~~ - - [x] ~~[推荐作者](docs/album/recommend_author.md)~~ - - [x] ~~[活动列表](docs/album/activity_list.md)~~ - - [x] ~~[操作](docs/album/action.md)~~ - - [ ] ~~投稿~~ -- [ ] [历史记录 & 稍后再看](docs/historytoview) - - [x] [历史记录](docs/historytoview/history.md) - - [x] [稍后再看](docs/historytoview/toview.md) -- [ ] [收藏夹](docs/fav) - - [x] [基本信息](docs/fav/info.md) - - [x] [收藏夹内容](docs/fav/list.md) - - [ ] [收藏夹操作](docs/fav/action.md) -- [ ] [课程](docs/cheese) - - [x] [课程基本信息](docs/cheese/info.md) - - [ ] 已购课程 - - [ ] 分区推荐列表 - - [ ] 操作 - - [x] [播放 & 下载地址(视频流)](docs/cheese/videostream_url.md) -- [ ] [直播](docs/live) - - [ ] [直播间基本信息](docs/live/info.md) - - [ ] [直播推荐](docs/live/recommend.md) - - [ ] [直播分区](docs/live/live_area.md) - - [ ] [直播间管理](docs/live/manage.md) - - [ ] 直播间操作 - - [ ] [直播视频流](docs/live/live_stream.md) - - [ ] [直播信息流](docs/live/message_stream.md) - - [ ] [直播红包](docs/live/redpocket.md) - - [ ] [直播间表情包](docs/live/emoticons.md) - - [ ] [直播间用户实用 API](docs/live/user.md) - - [x] [直播间禁言相关](docs/live/silent_user_manage.md) - - [ ] [关注UP直播情况](docs/live/follow_up_live.md) - - [ ] [直播心跳上报](docs/live/report.md) - - [ ] [直播间弹幕](docs/live/danmaku.md) - - [ ] [直播流水](docs/live/live_bill.md) - - [ ] [礼物相关](docs/live/gift.md) - - [ ] [大航海/粉丝团](docs/live/guard.md) - - [ ] [直播回放](docs/live/live_replay.md) - - [ ] [直播数据](docs/live/live_data.md) - - [ ] [直播投票](docs/live/live_vote.md) -- [ ] [活动](docs/activity) - - [ ] [活动列表](docs/activity/list.md) - - [ ] [活动主题信息](docs/activity/info.md) -- [ ] [转正答题](docs/newbie_exam) - - [x] [查询信息](docs/newbie_exam/info.md) - - [x] [拉取题目](docs/newbie_exam/fetch.md) - - [x] [操作](docs/newbie_exam/action.md) -- [ ] [青少年守护](docs/teenager/) - - [x] [青少年模式](docs/teenager/teenager_mode.md) - - [ ] 亲子平台 - - [ ] 课堂模式 -- [ ] [B 币钱包](docs/wallet/) - - [ ] [基本信息](docs/wallet/info.md) - - [ ] B 币充值 - - [ ] 贝壳相关 -- [ ] [哔哩哔哩漫画](docs/manga) - - [ ] 用户信息 - - [x] [签到](docs/manga/ClockIn.md) - - [x] [积分商城](docs/manga/point_shop.md) - - [x] [漫画操作](docs/manga/Comic.md) - - [ ] [漫画任务操作](docs/manga/Activity.md) - - [x] [漫画赛季](docs/manga/Season.md) - - [x] [漫读券/已购相关](docs/manga/User.md) - - [x] [下载](docs/manga/Download.md) - - [x] [data.index 解析](docs/manga/index_file.md) - - [ ] [获取轻享卡信息](docs/manga/light_card.md) -- [ ] 哔哩哔哩游戏 -- [ ] [终端网络查询](docs/clientinfo) - - [x] [基于 IP 的地理位置查询](docs/clientinfo/ip.md) -- [ ] [客服中心](docs/customerservice) - - [ ] [客服消息](docs/customerservice/msg.md) -- [ ] [web 端组件](docs/web_widget) - - [x] [分区当日投稿数](docs/web_widget/zone_upload.md) - - [x] [404 页漫画收集](docs/web_widget/404_manga.md) - - [ ] [首页横幅头图](docs/web_widget/header.md) - - [ ] [分区横幅轮播图](docs/web_widget/banner.md) -- [ ] [APP 端组件](docs/APP_widget) - - [x] [开屏图片 + 恰饭珍贵录像](docs/APP_widget/splash.md) - - [ ] [获取最新 APP 版本](docs/APP_widget/ver.md) -- [ ] [个性装扮](docs/garb) - - [x] [APP 主题](docs/garb/skin.md) - - [x] [主题色](docs/garb/color.md) - - [ ] [装扮/收藏集](docs/garb/lottery.md) - -## ✨鸣谢 - -你们的存在,让社区更美好 - -[![contributors](https://opencollective.com/bilibili-api-collect/contributors.svg?width=860&button=false)](https://github.com/SocialSisterYi/bilibili-API-collect/graphs/contributors) - -## 📖相关协议基础 - -HTTP 协议:[传送门](https://www.cnblogs.com/an-wen/p/11180076.html) - -JSON 序列格式:[传送门](https://www.sojson.com/json/json_index.html) - -XML 序列格式:[传送门](https://www.w3school.com.cn/xml/xml_intro.asp) - -ProtoBuf 序列格式:[传送门](https://www.jianshu.com/p/a24c88c0526a) - -## 💦交流 - -<img src="https://avatars.githubusercontent.com/u/45892418" width="100" height="100" /> - -⚠注意:开源社群欢迎交流探讨,**拒绝**咨询、**不支持**合作,**黑产号**一经发现立即拉黑并举报相关 SRC - -- QQ 交流群:[邀请链接](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ympvb3LAPT-Ulu3ezhGqbkJ8zXMKImOX&authKey=z1KdkOdKO3wytN43m9K6On9nBtnDL4pAoD6VQHCipFBb9TasNDKuDHCmOE6TF3uc&noverify=0&group_code=191187164) -- Telegram 交流群:[@bilibili_API_collect_community](https://t.me/bilibili_API_collect_community) - -## 🧋发电 - -欢迎来~~交♂易~~,大家的支持就是我继续开发的动力! - -~~请可爱的易姐喝杯奶茶~~ - -WeChat & Alipay: - -<img src="./assets/img/sponsorQR.jpg" width="300" height="300" /> - -OR Aifadian:[https://afdian.com/@ShakaiAneE](https://afdian.com/@ShakaiAneE) - -## 🔗相关项目推荐 - -### 库及文档 - -- [jingyuexing/bilibiliAPI](https://github.com/jingyuexing/bilibiliAPI) -- [fython/BilibiliAPIDocs](https://github.com/fython/BilibiliAPIDocs) -- [czp3009/bilibili-api](https://github.com/czp3009/bilibili-api) -- [Vespa314/bilibili-api](https://github.com/Vespa314/bilibili-api) -- [Pengfei00/bili-utils](https://github.com/Pengfei00/bili-utils): bilibili 工具箱 -- [lovelyyoshino/Bilibili-Live-API](https://github.com/lovelyyoshino/Bilibili-Live-API): Bilibili 直播/番剧 API 文档 -- [flaribbit/bilibili-manga-spider](https://github.com/flaribbit/bilibili-manga-spider): Bilibili 漫画爬虫 -- [simon300000/bili-api](https://github.com/simon300000/bili-api): Bilibili Node.js API -- [iyear/biligo](https://github.com/iyear/biligo): Bilibili API SDK in Golang -- [bilibili-openplatform/demo](https://github.com/bilibili-openplatform/demo): 哔哩哔哩开放平台示例代码库 -- [ddiu8081/blive-message-listener](https://github.com/ddiu8081/blive-message-listener): Bilibili-live danmu listener with type. Bilibili 直播间弹幕监听库,支持类型输出。 -- [Nemo2011/bilibili-api](https://github.com/Nemo2011/bilibili-api): 哔哩哔哩常用API调用。支持视频、番剧、用户、频道、音频等功能。工具齐全。 -- [CuteReimu/bilibili](https://github.com/CuteReimu/bilibili): 哔哩哔哩API的Go版本SDK - -### 成品 - -- [NullPointerException/AnimePipe](https://codeberg.org/NullPointerException/AnimePipe): 功能完善的Android流媒体综合客户端,支持Bilibili, Youtube, NicoNico -- [3Shain/Comen](https://github.com/3Shain/Comen): 基于h5的B站直播弹幕姬 -- [AncientLysine/BiliLocal](https://github.com/AncientLysine/BiliLocal): 本地弹幕播放器 -- [zyzsdy/biliroku](https://github.com/zyzsdy/biliroku): bilibili 生放送(直播)录制 -- [otakustay/danmaku-to-ass](https://github.com/otakustay/danmaku-to-ass): A站B站弹幕转字幕文件 -- [bilibili-helper/bilibili-helper-o](https://github.com/bilibili-helper/bilibili-helper-o): 哔哩哔哩 (bilibili.com) 辅助工具,可以下载视频,查询弹幕发送人以及一些十分实用的直播区功能。 -- [apachecn/CDNDrive](https://github.com/apachecn/CDNDrive): 基于B站相簿上传的文件分块索引存储器 -- [Hsury/BiliDrive](https://github.com/Hsury/BiliDrive): 基于B站相簿上传的文件分块索引存储器 -- [Tsuk1ko/bilibili-live-chat](https://github.com/Tsuk1ko/bilibili-live-chat): 无后端的仿 YouTube Live Chat 风格的简易 Bilibili 弹幕姬 -- [ironmanic/crawler_target_users_good](https://github.com/ironmanic/crawler_target_users_good): 搜索bilibili特定视频,为评论 点赞,关注,私信,一体化服务 -- [dd-center/DDatElectron](https://github.com/dd-center/DDatElectron): DD@Home 分布式项目, 桌面客户端 -- [dd-center/vtbs.moe](https://github.com/dd-center/vtbs.moe): B站VTB数据中心 -- [the1812/Bilibili-Evolved](https://github.com/the1812/Bilibili-Evolved): 强大的哔哩哔哩增强脚本: 下载视频、音乐、封面、弹幕 / 简化直播间、评论区、首页 / 自定义顶栏、删除广告、夜间模式 / 触屏设备支持 -- [xlzy520/bili-short-url](https://github.com/xlzy520/bili-short-url): 哔哩哔哩短链生成器 -- [zjkwdy/bili_app_splash](https://github.com/zjkwdy/bili_app_splash): B站壁纸娘和开屏图自动下载,每天使用Actions自动同步 -- [Jannchie/BiliOB](https://github.com/Jannchie/BiliOB): BiliOB观测者是一个观测B站UP主及视频数据变化,并予以分析的Web应用程序 -- [biliob233/biliob233.github.io](https://github.com/biliob233/biliob233.github.io): ~~无可奉告~~ -- [biliup/biliup](https://github.com/biliup/biliup): 全自动录播、投稿工具,支持录制直播弹幕,也支持Youtube、twitch直播回放列表自动搬运到B站 -- [ddiu8081/bilicli](https://github.com/ddiu8081/bilicli): Bilibili-live danmu dashboard in your terminal. -- [MotooriKashin/Bilibili-Old](https://github.com/MotooriKashin/Bilibili-Old): 恢复旧版Bilibili页面,为了那些念旧的人。 -- [SocialSisterYi/bcut-asr](https://github.com/SocialSisterYi/bcut-asr): 使用必剪API的语音字幕识别 -- [CzJam/Bili_Realtime_Data](https://github.com/CzJam/Bili_Realtime_Data): Bilibili粉丝与视频实时数据统计 -- [kingwingfly/fav](https://github.com/kingwingfly/fav): 自动同步bili收藏夹、合集视频到本地的CLI工具(Rust实现,并提供一个文档测试完善的Rust风格的用于构建有状态爬虫的核心库) -- [linyuye/Bilibili_crawler](https://github.com/linyuye/Bilibili_crawler): 基于bilibili懒加载api爬取b站动态,视频等评论区 -- [ouzexi/bilibili-hot-tags](https://github.com/ouzexi/bilibili-hot-tags): 一个B站热门视频标签检索统计小工具 -- [SpenserCai/rust-video-downloader](https://github.com/SpenserCai/rust-video-downloader): Rust实现的高性能跨平台视频下载器(目前支持Bilibili),基本覆盖了BBDown的所有功能。 - -### 其他 - -- [kuresaru/geetest-validator](https://github.com/kuresaru/geetest-validator): GeeTest 调试器 -- [bloomrpc/bloomrpc](https://github.com/bloomrpc/bloomrpc): GUI Client for GRPC Services -- [grpc/grpc](https://github.com/grpc/grpc): The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#) -- [glideapps/quicktype](https://github.com/glideapps/quicktype): quicktype generates strongly-typed models and serializers from JSON, JSON Schema, TypeScript, and GraphQL queries, making it a breeze to work with JSON type-safely in many programming languages. 一键生成多种语言的JSON反序列化所需类,以便于快速反序列化,有网页版 -- [SessionHu/json-apidoc-gen](https://github.com/SessionHu/json-apidoc-gen): Simple CLI tool for generating BAC document template diff --git a/assets/img/2233login.png b/assets/img/2233login.png deleted file mode 100644 index 3d9ff562262bff55999c956f1765c46842219904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45074 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 diff --git a/assets/img/activit.svg b/assets/img/activit.svg deleted file mode 100644 index b210f77..0000000 --- a/assets/img/activit.svg +++ /dev/null @@ -1,3 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> -<path d="M518.656 475.904a223.488 223.488 0 0 1-23.296-75.52 366.08 366.08 0 0 1 81.408 14.592 623.104 623.104 0 0 1-58.112 60.928m-69.888-119.04c-11.52-58.112-8.704-55.296-25.6-156.928a265.984 265.984 0 0 0-78.336 46.592c51.2 104.448 60.928 165.376 92.928 290.304 51.2-5.632 211.968-40.704 226.56-130.56 8.704-64-142.336-64-215.04-49.408M486.4 624.128a263.424 263.424 0 0 0-107.52 69.632l43.52 153.6a47.872 47.872 0 0 1-92.928 23.296L216.576 473.088l-72.704-204.8c2.816-5.632 5.888-8.704 8.704-14.336l-14.592-51.2a46.08 46.08 0 0 1 32-57.856A47.616 47.616 0 0 1 228.096 179.2v2.816a334.848 334.848 0 0 1 98.816-43.52c177.152-46.592 203.264 55.04 429.824 23.296L890.368 588.8c-171.52 90.112-232.448-11.52-403.712 35.072" fill="#F39800"> -</svg> \ No newline at end of file diff --git a/assets/img/add.svg b/assets/img/add.svg deleted file mode 100644 index ecdea95..0000000 --- a/assets/img/add.svg +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 24.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - viewBox="0 0 838 838" enable-background="new 0 0 838 838" xml:space="preserve"> -<path fill="#1497C7" d="M419,838c-118.67-3.33-217.33-44.33-296-123S3.33,537.67,0,419c3.33-118.67,44.33-217.33,123-296 - S300.33,3.33,419,0c118.67,3.33,217.33,44.33,296,123s119.67,177.33,123,296c-3.33,118.67-44.33,217.33-123,296 - S537.67,834.67,419,838z M372,372H233v94h139v139h94V466h139v-94H466V233h-94V372z"/> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -<g> -</g> -</svg> diff --git a/assets/img/aiSummary.svg b/assets/img/aiSummary.svg deleted file mode 100644 index efa4420..0000000 --- a/assets/img/aiSummary.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="1024" height="1024" viewBox="0 0 1024 1024"><defs><clipPath id="master_svg0_1_5"><rect x="0" y="0" width="1024" height="1024" rx="0"/></clipPath><linearGradient x1="-0.03559274226427078" y1="0.14154286682605743" x2="0.3670809864997864" y2="1.0495315790176392" id="master_svg1_1_92"><stop offset="0%" stop-color="#393946" stop-opacity="1"/><stop offset="40.115898847579956%" stop-color="#23232E" stop-opacity="1"/><stop offset="100%" stop-color="#191924" stop-opacity="1"/></linearGradient><linearGradient x1="1.0356004238128662" y1="0.14154286682605743" x2="0.6329137682914734" y2="1.0495315790176392" id="master_svg2_1_93"><stop offset="0%" stop-color="#393946" stop-opacity="1"/><stop offset="40.115898847579956%" stop-color="#23232E" stop-opacity="1"/><stop offset="100%" stop-color="#191924" stop-opacity="1"/></linearGradient><filter id="master_svg3_1_05" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="-5" y="-5" width="831.2000732421875" height="728.800048828125"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="1" dx="1"/><feGaussianBlur stdDeviation="1.5"/><feColorMatrix type="matrix" values="0 0 0 0 0.03954499959945679 0 0 0 0 0.08450230211019516 0 0 0 0 0.20010699331760406 0 0 0 0.8500000238418579 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="master_svg4_1_12" filterUnits="objectBoundingBox" color-interpolation-filters="sRGB" x="0" y="0" width="887.4667358398438" height="750.933349609375"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feColorMatrix in="SourceAlpha" type="matrix" result="hardAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="3.714289903640747" dx="2.785710096359253"/><feGaussianBlur stdDeviation="1.3928600549697876"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.25 0"/><feBlend mode="normal" in2="shape" result="effect1_innerShadow"/><feColorMatrix in="SourceAlpha" type="matrix" result="hardAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset dy="-1.8571399450302124" dx="-2"/><feGaussianBlur stdDeviation="1.8571399450302124"/><feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/><feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0.15444999933242798 0 0 0 0 0.45426398515701294 0 0 0 0.10999999940395355 0"/><feBlend mode="normal" in2="effect1_innerShadow" result="effect2_innerShadow"/></filter><linearGradient x1="0.21811191737651825" y1="0.21849091351032257" x2="0.6896499991416931" y2="1.0494545698165894" id="master_svg5_1_95"><stop offset="0%" stop-color="#F4FCFF" stop-opacity="1"/><stop offset="100%" stop-color="#EAF5F9" stop-opacity="1"/></linearGradient></defs><g clip-path="url(#master_svg0_1_5)"><g><g><path d="M257.357049609375,80.1351999267578C279.080249609375,62.032609926757814,311.364849609375,64.96772992675781,329.467549609375,86.69049992675781L414.802349609375,189.09079992675782C432.902349609375,210.8137999267578,429.967349609375,243.0987999267578,408.245349609375,261.2007999267578C386.522349609375,279.30379992675785,354.239349609375,276.3687999267578,336.135049609375,254.6457999267578L250.801749609375,152.2452999267578C232.699149609375,130.5224999267578,235.634279609375,98.2374999267578,257.357049609375,80.1351999267578Z" fill-rule="evenodd" fill="url(#master_svg1_1_92)" fill-opacity="1"/></g><g><path d="M749.5745874023437,80.1351999267578C727.8525874023437,62.032609926757814,695.5695874023438,64.96772992675781,677.4648874023437,86.69049992675781L592.1314874023437,189.09079992675782C574.0306074023438,210.8137999267578,576.9660174023437,243.0987999267578,598.6884874023438,261.2007999267578C620.4109874023437,279.30379992675785,652.6942874023438,276.3687999267578,670.7985874023437,254.6457999267578L756.1315874023437,152.2452999267578C774.2325874023437,130.5224999267578,771.3005874023438,98.2374999267578,749.5745874023437,80.1351999267578Z" fill-rule="evenodd" fill="url(#master_svg2_1_93)" fill-opacity="1"/></g><g style="opacity:0.20000000298023224;" filter="url(#master_svg3_1_05)"><g><path d="M921.6000244140625,623.0460183105469C921.6000244140625,854.0370183105468,738.2150244140626,921.6000183105468,512.0000244140625,921.6000183105468C285.7840244140625,921.6000183105468,102.4000244140625,854.0370183105468,102.4000244140625,623.0460183105469C102.4000244140625,392.05501831054687,133.9078244140625,204.80001831054688,512.0000244140625,204.80001831054688C905.8480244140625,204.80001831054688,921.6000244140625,392.05501831054687,921.6000244140625,623.0460183105469Z" fill="#D9D9D9" fill-opacity="1"/></g></g><g filter="url(#master_svg4_1_12)"><g><path d="M955.7336625976562,646.7890183105469C955.7336625976562,909.8580183105469,757.0666625976562,955.7330183105469,511.99966259765625,955.7330183105469C266.93266259765625,955.7330183105469,68.26666259765625,909.8580183105469,68.26666259765625,646.7890183105469C68.26666259765625,341.3330183105469,102.39996259765624,204.80001831054688,511.99966259765625,204.80001831054688C938.6666625976562,204.80001831054688,955.7336625976562,341.3330183105469,955.7336625976562,646.7890183105469Z" fill="url(#master_svg5_1_95)" fill-opacity="1"/></g></g><g><path d="M163.36666870117188,485.00368701171874C163.36666870117188,407.0843870117187,219.98396870117188,340.03798701171877,297.34866870117185,330.76228701171874C450.79566870117185,312.36440701171875,572.3406687011718,311.68546701171874,727.4906687011719,330.44178701171876C804.5126687011718,339.7532870117187,860.6616687011718,406.65778701171877,860.6616687011718,484.2426870117188L860.6616687011718,655.0866870117188C860.6616687011718,728.1596870117187,810.8406687011719,792.7736870117187,738.8226687011719,805.1506870117187C576.9556687011718,832.9626870117188,449.55266870117185,827.6006870117187,292.1596687011719,802.6006870117187C217.16826870117188,790.6886870117187,163.36666870117188,724.7296870117187,163.36666870117188,648.7996870117188L163.36666870117188,485.00368701171874Z" fill="#191924" fill-opacity="1"/></g><g><path d="M639.7466748046875,522.6667022705078L639.7466748046875,617.7519022705078Q639.7466748046875,618.5060022705078,639.7836748046875,619.2593022705078Q639.8206748046875,620.0125022705079,639.8945748046875,620.7630022705079Q639.9684748046875,621.5135022705078,640.0791748046875,622.2595022705078Q640.1898748046875,623.0057022705078,640.3369748046875,623.7447022705078Q640.4840748046875,624.4847022705078,640.6672748046875,625.2167022705078Q640.8505748046875,625.9477022705078,641.0694748046875,626.6697022705079Q641.2883748046875,627.3907022705079,641.5424748046875,628.1007022705078Q641.7964748046875,628.8117022705078,642.0850748046875,629.5077022705078Q642.3736748046875,630.2047022705078,642.6961748046875,630.8867022705078Q643.0185748046875,631.5677022705078,643.3740748046876,632.2337022705078Q643.7295748046874,632.8987022705078,644.1172748046876,633.5447022705079Q644.5049748046875,634.1917022705078,644.9239748046875,634.8187022705079Q645.3428748046875,635.4457022705078,645.7921748046875,636.0517022705078Q646.2413748046876,636.6577022705078,646.7197748046875,637.2407022705078Q647.1981748046875,637.8237022705079,647.7046748046876,638.3827022705078Q648.2110748046875,638.9407022705078,648.7443748046875,639.4747022705078Q649.2775748046874,640.0077022705078,649.8363748046875,640.5137022705078Q650.3951748046875,641.0207022705079,650.9780748046875,641.4987022705078Q651.5610748046875,641.9777022705078,652.1667748046875,642.4267022705078Q652.7724748046875,642.8757022705079,653.3995748046875,643.2947022705079Q654.0265748046875,643.7137022705078,654.6734748046875,644.1017022705078Q655.3202748046875,644.4887022705078,655.9853748046875,644.8447022705078Q656.6504748046875,645.1997022705078,657.3321748046875,645.5227022705078Q658.0138748046875,645.8447022705078,658.7106748046875,646.1337022705078Q659.4073748046875,646.4217022705078,660.1173748046875,646.6757022705078Q660.8274748046875,646.9307022705078,661.5491348046875,647.1487022705078Q662.2707948046875,647.3677022705078,663.0023248046875,647.5517022705078Q663.7338548046876,647.7347022705078,664.4735048046875,647.8817022705078Q665.2131448046875,648.0287022705078,665.9591148046875,648.1397022705078Q666.7050848046875,648.2497022705078,667.4555848046875,648.3237022705079Q668.2060948046875,648.3977022705078,668.9593148046876,648.4347022705078Q669.7125408046875,648.4717022705079,670.4666748046875,648.4717022705079Q671.2208088046875,648.4717022705079,671.9740348046874,648.4347022705078Q672.7272548046875,648.3977022705078,673.4777648046875,648.3237022705079Q674.2282648046875,648.2497022705078,674.9742348046875,648.1397022705078Q675.7202048046875,648.0287022705078,676.4598448046875,647.8817022705078Q677.1994948046874,647.7347022705078,677.9310248046875,647.5517022705078Q678.6625548046875,647.3677022705078,679.3842148046875,647.1487022705078Q680.1058748046875,646.9307022705078,680.8159748046875,646.6757022705078Q681.5259748046875,646.4217022705078,682.2226748046875,646.1337022705078Q682.9194748046875,645.8447022705078,683.6011748046875,645.5227022705078Q684.2828748046875,645.1997022705078,684.9479748046875,644.8447022705078Q685.6130748046875,644.4887022705078,686.2598748046875,644.1017022705078Q686.9067748046875,643.7137022705078,687.5337748046875,643.2947022705079Q688.1608748046875,642.8757022705079,688.7665748046875,642.4267022705078Q689.3722748046875,641.9777022705078,689.9552748046875,641.4987022705078Q690.5381748046875,641.0207022705079,691.0969748046875,640.5137022705078Q691.6557748046876,640.0077022705078,692.1889748046875,639.4747022705078Q692.7222748046875,638.9407022705078,693.2286748046874,638.3827022705078Q693.7351748046875,637.8237022705079,694.2135748046875,637.2407022705078Q694.6919748046874,636.6577022705078,695.1411748046875,636.0517022705078Q695.5904748046875,635.4457022705078,696.0093748046875,634.8187022705079Q696.4283748046875,634.1917022705078,696.8160748046874,633.5447022705079Q697.2037748046876,632.8987022705078,697.5592748046874,632.2337022705078Q697.9147748046875,631.5677022705078,698.2371748046875,630.8867022705078Q698.5596748046875,630.2047022705078,698.8482748046875,629.5077022705078Q699.1368748046875,628.8117022705078,699.3908748046875,628.1007022705078Q699.6449748046875,627.3907022705079,699.8638748046875,626.6697022705079Q700.0827748046875,625.9477022705078,700.2660748046875,625.2167022705078Q700.4492748046875,624.4847022705078,700.5963748046875,623.7447022705078Q700.7434748046875,623.0057022705078,700.8541748046875,622.2595022705078Q700.9648748046875,621.5135022705078,701.0387748046875,620.7630022705079Q701.1126748046875,620.0125022705079,701.1496748046875,619.2593022705078Q701.1866748046875,618.5060022705078,701.1866748046875,617.7519022705078L701.1866748046875,522.6667022705078Q701.1866748046875,521.9125682705078,701.1496748046875,521.1593422705079Q701.1126748046875,520.4061222705078,701.0387748046875,519.6556122705078Q700.9648748046875,518.9051122705079,700.8541748046875,518.1591422705078Q700.7434748046875,517.4131722705079,700.5963748046875,516.6735322705078Q700.4492748046875,515.9338822705079,700.2660748046875,515.2023522705078Q700.0827748046875,514.4708222705078,699.8638748046875,513.7491622705078Q699.6449748046875,513.0275022705079,699.3908748046875,512.3174022705078Q699.1368748046875,511.6074022705078,698.8482748046875,510.91070227050784Q698.5596748046875,510.2139022705078,698.2371748046875,509.5322022705078Q697.9147748046875,508.85050227050783,697.5592748046874,508.18540227050784Q697.2037748046876,507.52030227050784,696.8160748046874,506.8735022705078Q696.4283748046875,506.2266022705078,696.0093748046875,505.59960227050783Q695.5904748046875,504.9725022705078,695.1411748046875,504.36680227050783Q694.6919748046874,503.7611022705078,694.2135748046875,503.1781022705078Q693.7351748046875,502.5952022705078,693.2286748046874,502.03640227050784Q692.7222748046875,501.4776022705078,692.1889748046875,500.9444022705078Q691.6557748046876,500.4111022705078,691.0969748046875,499.9047022705078Q690.5381748046875,499.3982022705078,689.9552748046875,498.91980227050783Q689.3722748046875,498.4414022705078,688.7665748046875,497.9922022705078Q688.1608748046875,497.5429022705078,687.5337748046875,497.1240022705078Q686.9067748046875,496.7050022705078,686.2598748046875,496.3173022705078Q685.6130748046875,495.9296022705078,684.9479748046875,495.5741022705078Q684.2828748046875,495.2186022705078,683.6011748046875,494.89620227050784Q682.9194748046875,494.5737022705078,682.2226748046875,494.2851022705078Q681.5259748046875,493.9965022705078,680.8159748046875,493.7425022705078Q680.1058748046875,493.48840227050783,679.3842148046875,493.2695022705078Q678.6625548046875,493.0506022705078,677.9310248046875,492.8673022705078Q677.1994948046874,492.6841022705078,676.4598448046875,492.5370022705078Q675.7202048046875,492.38990227050783,674.9742348046875,492.2792022705078Q674.2282648046875,492.1685022705078,673.4777648046875,492.09460227050783Q672.7272548046875,492.0207022705078,671.9740348046874,491.9837022705078Q671.2208088046875,491.9467022705078,670.4666748046875,491.9467022705078Q669.7125408046875,491.9467022705078,668.9593148046876,491.9837022705078Q668.2060948046875,492.0207022705078,667.4555848046875,492.09460227050783Q666.7050848046875,492.1685022705078,665.9591148046875,492.2792022705078Q665.2131448046875,492.38990227050783,664.4735048046875,492.5370022705078Q663.7338548046876,492.6841022705078,663.0023248046875,492.8673022705078Q662.2707948046875,493.0506022705078,661.5491348046875,493.2695022705078Q660.8274748046875,493.48840227050783,660.1173748046875,493.7425022705078Q659.4073748046875,493.9965022705078,658.7106748046875,494.2851022705078Q658.0138748046875,494.5737022705078,657.3321748046875,494.89620227050784Q656.6504748046875,495.2186022705078,655.9853748046875,495.5741022705078Q655.3202748046875,495.9296022705078,654.6734748046875,496.3173022705078Q654.0265748046875,496.7050022705078,653.3995748046875,497.1240022705078Q652.7724748046875,497.5429022705078,652.1667748046875,497.9922022705078Q651.5610748046875,498.4414022705078,650.9780748046875,498.91980227050783Q650.3951748046875,499.3982022705078,649.8363748046875,499.9047022705078Q649.2775748046874,500.4111022705078,648.7443748046875,500.9444022705078Q648.2110748046875,501.4776022705078,647.7046748046876,502.03640227050784Q647.1981748046875,502.5952022705078,646.7197748046875,503.1781022705078Q646.2413748046876,503.7611022705078,645.7921748046875,504.36680227050783Q645.3428748046875,504.9725022705078,644.9239748046875,505.59960227050783Q644.5049748046875,506.2266022705078,644.1172748046876,506.8735022705078Q643.7295748046874,507.52030227050784,643.3740748046876,508.18540227050784Q643.0185748046875,508.85050227050783,642.6961748046875,509.5322022705078Q642.3736748046875,510.2139022705078,642.0850748046875,510.91070227050784Q641.7964748046875,511.6074022705078,641.5424748046875,512.3174022705078Q641.2883748046875,513.0275022705079,641.0694748046875,513.7491622705078Q640.8505748046875,514.4708222705078,640.6672748046875,515.2023522705078Q640.4840748046875,515.9338822705079,640.3369748046875,516.6735322705078Q640.1898748046875,517.4131722705079,640.0791748046875,518.1591422705078Q639.9684748046875,518.9051122705079,639.8945748046875,519.6556122705078Q639.8206748046875,520.4061222705078,639.7836748046875,521.1593422705079Q639.7466748046875,521.9125682705078,639.7466748046875,522.6667022705078Z" fill-rule="evenodd" fill="#2CFFFF" fill-opacity="1"/></g><g><path d="M375.2577557128906,485.21440764160155L375.2550557128906,485.2118076416016Q375.24655571289065,485.20330764160155,375.2380557128906,485.1948076416016Q375.1149557128906,485.07190764160157,374.99045571289065,484.95040764160154Q374.9815557128906,484.94170764160157,374.9726557128906,484.93300764160153Q374.4414557128906,484.4154076416016,373.8859557128906,483.9240076416016Q373.33035571289065,483.4326076416016,372.7517557128906,482.9686076416016Q372.17305571289063,482.5046076416016,371.5727557128906,482.0691076416016Q370.97235571289065,481.63350764160157,370.35165571289065,481.22750764160156Q369.7310557128906,480.8214076416016,369.09145571289065,480.44580764160156Q368.45195571289065,480.07010764160157,367.79505571289064,479.7258076416016Q367.1380557128906,479.38150764160156,366.4652557128906,479.06930764160154Q365.79255571289065,478.75700764160155,365.1054557128906,478.47760764160154Q364.4183557128906,478.1982076416016,363.7186557128906,477.9523076416016Q363.0189057128906,477.7064076416016,362.3081057128906,477.49460764160153Q361.5973057128906,477.2827076416016,360.8771057128906,477.1054076416016Q360.1569157128906,476.92810764160157,359.42899571289064,476.78570764160156Q358.70108571289063,476.6434076416016,357.96715571289064,476.53640764160156Q357.2332157128906,476.42930764160155,356.4949757128906,476.35780764160154Q355.7567257128906,476.2863076416016,355.0158957128906,476.2505076416016Q354.2750557128906,476.21470764160154,353.5333557128906,476.21470764160154L353.5325367328906,476.21470764160154Q352.1499857128906,476.21470764160154,350.7730257128906,476.33900764160154Q349.44232571289064,476.45900764160154,348.12707571289064,476.69420764160157Q346.81182571289065,476.92930764160155,345.52195571289064,477.2777076416016Q344.23208571289064,477.6262076416016,342.97735571289064,478.08530764160156Q341.72255571289065,478.54440764160154,340.51245571289064,479.11070764160155Q339.3022557128906,479.67700764160156,338.14585571289064,480.3463076416016Q336.9894557128906,481.0155076416016,335.89555571289065,481.78260764160154Q334.8015557128906,482.54980764160155,333.77835571289063,483.40900764160153Q332.75515571289066,484.2682076416016,331.81045571289064,485.21300764160156Q331.8019557128906,485.22150764160153,331.79345571289065,485.23000764160156Q331.67055571289063,485.3531076416016,331.5490557128906,485.47760764160154Q331.54035571289063,485.4865076416016,331.5316557128906,485.49540764160156Q331.01405571289064,486.0266076416016,330.52265571289064,486.58210764160157Q330.03125571289064,487.13770764160154,329.56725571289064,487.7163076416016Q329.10325571289064,488.29500764160156,328.66775571289065,488.89530764160156Q328.23215571289063,489.49570764160154,327.8261557128906,490.11640764160154Q327.42005571289064,490.73700764160156,327.0444557128906,491.37660764160154Q326.66875571289063,492.01610764160154,326.32445571289065,492.67300764160154Q325.9801557128906,493.3300076416016,325.6679557128906,494.0028076416016Q325.3556557128906,494.67550764160154,325.0762557128906,495.3626076416016Q324.79685571289065,496.0497076416016,324.55095571289064,496.7494076416016Q324.30505571289063,497.4491576416016,324.0932557128906,498.15996764160155Q323.88135571289064,498.8707576416016,323.70405571289064,499.59095764160156Q323.52675571289063,500.31114764160156,323.3843557128906,501.03906764160155Q323.24205571289065,501.76697764160156,323.13495571289064,502.50090764160154Q323.0279557128906,503.23484764160156,322.9564557128906,503.9730876416016Q322.88495571289064,504.7113376416016,322.84915571289065,505.4521676416016Q322.8133557128906,506.1930076416016,322.8133557128906,506.93470764160156L322.8133557128906,506.9355266216016Q322.8133557128906,508.3180776416016,322.9376557128906,509.6950376416016Q323.0576557128906,511.02573764160155,323.2928557128906,512.3409876416016Q323.5279557128906,513.6562376416016,323.87635571289064,514.9461076416015Q324.22485571289064,516.2359776416016,324.6839557128906,517.4907076416016Q325.1430557128906,518.7455076416015,325.7093557128906,519.9556076416015Q326.2756557128906,521.1658076416015,326.94495571289065,522.3222076416016Q327.61415571289064,523.4786076416016,328.3812557128906,524.5725076416015Q329.1484557128906,525.6665076416016,330.0076557128906,526.6897076416016Q330.86685571289064,527.7129076416015,331.8116557128906,528.6576076416015L331.8142557128906,528.6602076416016L373.4799557128906,570.3237076416016L331.8116557128906,611.9897076416016Q331.27835571289063,612.5227076416015,330.7718557128906,613.0817076416016Q330.2654557128906,613.6407076416016,329.78695571289063,614.2237076416015Q329.3085557128906,614.8067076416015,328.85935571289065,615.4117076416015Q328.41005571289065,616.0177076416015,327.9910557128906,616.6447076416016Q327.57205571289063,617.2717076416016,327.18435571289064,617.9187076416016Q326.79665571289064,618.5657076416015,326.44115571289063,619.2307076416016Q326.0856557128906,619.8957076416016,325.76315571289064,620.5777076416016Q325.4407557128906,621.2587076416015,325.1520557128906,621.9557076416015Q324.86345571289064,622.6527076416015,324.60935571289065,623.3627076416016Q324.3553557128906,624.0727076416016,324.13635571289063,624.7947076416016Q323.9174557128906,625.5157076416016,323.73415571289064,626.2477076416016Q323.55095571289064,626.9787076416015,323.40375571289064,627.7187076416016Q323.2566557128906,628.4587076416016,323.1459557128906,629.2047076416015Q323.0352557128906,629.9507076416015,322.9613557128906,630.7007076416015Q322.88745571289064,631.4517076416016,322.85035571289063,632.2047076416015Q322.8133557128906,632.9577076416016,322.8133557128906,633.7117076416016L322.8133557128906,633.7127076416016Q322.8133557128906,634.4507076416015,322.84875571289064,635.1877076416015Q322.8827557128906,635.8947076416016,322.94925571289065,636.5997076416015Q323.01585571289064,637.3047076416016,323.1147557128906,638.0057076416016Q323.2136557128906,638.7067076416015,323.34485571289065,639.4017076416015Q323.4759557128906,640.0977076416016,323.6389557128906,640.7867076416015Q323.8019557128906,641.4757076416015,323.99655571289065,642.1567076416015Q324.19115571289063,642.8377076416016,324.4169557128906,643.5087076416016Q324.64265571289064,644.1797076416016,324.89905571289063,644.8387076416016Q325.15555571289065,645.4987076416015,325.44205571289064,646.1467076416016Q325.7286557128906,646.7937076416016,326.04465571289063,647.4277076416015Q326.36075571289064,648.0607076416015,326.70565571289063,648.6787076416016Q327.0505557128906,649.2977076416016,327.42365571289065,649.8987076416015Q327.79665571289064,650.5007076416016,328.19705571289063,651.0847076416015Q328.59735571289065,651.6687076416016,329.02425571289064,652.2337076416015Q329.45105571289065,652.7987076416016,329.9034557128906,653.3427076416016Q330.3558557128906,653.8877076416015,330.83285571289065,654.4107076416016Q331.3098557128906,654.9337076416016,331.81045571289064,655.4347076416016Q332.3436557128906,655.9677076416016,332.9024557128906,656.4747076416015Q333.46125571289065,656.9807076416016,334.0442557128906,657.4587076416016Q334.6271557128906,657.9377076416015,335.2329557128906,658.3867076416016Q335.8386557128906,658.8357076416016,336.46575571289065,659.2547076416015Q337.0927557128906,659.6737076416016,337.7396557128906,660.0617076416015Q338.3864557128906,660.4497076416015,339.0515557128906,660.8047076416016Q339.7166557128906,661.1607076416016,340.3984557128906,661.4827076416016Q341.08015571289064,661.8057076416015,341.77695571289064,662.0937076416016Q342.4736557128906,662.3827076416015,343.1837557128906,662.6367076416016Q343.89382571289065,662.8907076416016,344.6155157128906,663.1097076416015Q345.3371957128906,663.3287076416016,346.0687557128906,663.5117076416016Q346.80030571289063,663.6957076416015,347.5399757128906,663.8427076416016Q348.2796457128906,663.9897076416016,349.0256357128906,664.1007076416015Q349.7716357128906,664.2107076416016,350.5221657128906,664.2847076416016Q351.27269571289065,664.3587076416015,352.02594571289063,664.3957076416016Q352.7791957128906,664.4327076416016,353.5333557128906,664.4327076416016Q354.32820271289063,664.4327076416016,355.1220457128906,664.3917076416016Q355.8255057128906,664.3547076416015,356.5265657128906,664.2867076416015Q357.22762571289064,664.2177076416016,357.92480571289065,664.1177076416016Q358.62198571289065,664.0167076416016,359.3138057128906,663.8837076416016Q360.00563571289064,663.7517076416016,360.6906657128906,663.5877076416016Q361.3756957128906,663.4237076416016,362.0524757128906,663.2277076416016Q362.7292557128906,663.0327076416015,363.39637571289063,662.8067076416016Q364.06345571289063,662.5807076416015,364.7195557128906,662.3237076416016Q365.3755557128906,662.0667076416016,366.0191557128906,661.7807076416016Q366.6627557128906,661.4947076416015,367.2926557128906,661.1787076416016Q367.9224557128906,660.8637076416015,368.5370557128906,660.5197076416016Q369.15175571289063,660.1757076416015,369.7500557128906,659.8037076416016Q370.3483557128906,659.4317076416016,370.9289557128906,659.0327076416015Q371.5094557128906,658.6337076416016,372.07115571289063,658.2087076416016Q372.6328557128906,657.7837076416015,373.17455571289065,657.3337076416016Q373.7161557128906,656.8827076416015,374.2365557128906,656.4087076416015Q374.7569557128906,655.9337076416016,375.2550557128906,655.4357076416015L438.6475557128906,592.0466076416016Q439.18075571289063,591.5134076416016,439.68725571289065,590.9546076416016Q440.19365571289063,590.3959076416015,440.6721557128906,589.8129076416016Q441.15055571289065,589.2300076416016,441.59985571289064,588.6243076416016Q442.0490557128906,588.0186076416015,442.46805571289065,587.3915076416016Q442.88705571289063,586.7645076416015,443.2747557128906,586.1177076416016Q443.6624557128906,585.4708076416016,444.0179557128906,584.8058076416015Q444.3735557128906,584.1407076416016,444.6959557128906,583.4590076416016Q445.0184557128906,582.7773076416015,445.30705571289064,582.0805076416016Q445.5956557128906,581.3838076416016,445.8497557128906,580.6738076416016Q446.10375571289063,579.9637076416016,446.3227557128906,579.2421076416016Q446.54165571289064,578.5204076416015,446.7249557128906,577.7889076416016Q446.9081557128906,577.0573076416016,447.0553557128906,576.3177076416016Q447.20245571289064,575.5781076416016,447.31315571289065,574.8321076416016Q447.4238557128906,574.0861076416015,447.49775571289064,573.3356076416015Q447.5716557128906,572.5851076416016,447.6087557128906,571.8319076416016Q447.6457557128906,571.0787076416016,447.6457557128906,570.3246076416016Q447.6457557128906,569.5704076416016,447.6087557128906,568.8172076416016Q447.5718557128906,568.0640076416016,447.49795571289064,567.3135076416015Q447.4240557128906,566.5630076416015,447.3133557128906,565.8170076416015Q447.2027557128906,565.0710076416016,447.0556557128906,564.3314076416016Q446.90855571289063,563.5917076416016,446.72535571289063,562.8602076416016Q446.54215571289063,562.1286076416015,446.3232557128906,561.4070076416016Q446.10435571289065,560.6853076416015,445.85025571289066,559.9753076416016Q445.59625571289064,559.2652076416016,445.3076557128906,558.5685076416015Q445.01905571289063,557.8717076416016,444.6966557128906,557.1900076416016Q444.37425571289066,556.5082076416015,444.01875571289065,555.8432076416016Q443.6633557128906,555.1781076416015,443.2756557128906,554.5312076416016Q442.88795571289063,553.8844076416016,442.46895571289065,553.2573076416015Q442.05005571289064,552.6303076416016,441.6008557128906,552.0245076416015Q441.1515557128906,551.4188076416016,440.6731557128906,550.8358076416016Q440.19475571289064,550.2528076416015,439.6883557128906,549.6941076416016Q439.1819557128906,549.1353076416016,438.6486557128906,548.6020076416015L375.2577557128906,485.21440764160155Z" fill-rule="evenodd" fill="#2CFFFF" fill-opacity="1"/></g></g></g></svg> \ No newline at end of file diff --git a/assets/img/akari.jpg b/assets/img/akari.jpg deleted file mode 100644 index 5e5ea0bc912b7e8b9eb447d35ee6fe5682616ce8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8992 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 xueIl6DyOnNq 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 Wf8K0CAWA^W@V`*tubls&nEOBCt+wa@ diff --git a/assets/img/ban.png b/assets/img/ban.png deleted file mode 100644 index a51f5b95d53282261f3cfa7ec13f88ab4e9f655b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5472 zcmcgwc|4Ts+aKyA$yPZWDPyeBY-YEHA+lr(Wowpam>9#%lqE;DghOR1TM}9nSx$wJ zEuoMt$x@aqDUnXH^Lw<N^S<vn@9+2i^Umk<%=0|={k^`|dSBOkCd$%czwj36Ef5Gq z*u<D@4c;xlOLg-m@OxJ)%L=>+dK(|+LLfrh*DpRu>Ln=%L_mdU>%em`H`Ac8SqKW9 zO$88sEN>7EfoSRac~fW}01rw9+?Zb4u<7zD7?erZhS}rHQRdzTfIHJTfCJbBSlH46 zJZL03Ojif0<);A>umBzf>c{f*;%fM5!@lrpfY0m8NEq}Bgy*3R(_2>vbuhPt8n8J4 z6o<gWX=p4CN+2Q7cnp?A+6z@jp@~Qo5sAjY(Rd9kN<&>8`t1V)wQ=YS4QsN|H(lVH zHq4#J^VUEjeSLiqz8D0X<Ay|&NF*dm9jUGk2N7_tzZZ|<2lwL2e`g>ATpEYz&115? zpzDkjD*HH38wOhX)diNfx%m%bFYdQMfgwZsQM{381PaMwt^4%_&E;7Gf12^PXs)fl zH-NMTxa{K`8UVuO{}eVn0c!r{!+#)bcmnX^{SXI3|Gx`=*TZ8n{=vreoi8qZhtg?3 zD7}w!JikPgPD28o01H&j1+nNKzI(f~d2Fsb`yZ_MvHe2<7+4K5n|6Gi%7pyAROoCP zldkatt%0J_DQFyy0cTJMcsPlMrNT)>bu^rSN7IP_5l5il@$2TUvzd5tc@!@iu+9dq zAebN%hCoH5=l~jy$6@erfQH4wNfaCnjv)a!a1X^GkVxO<4|14bwNpI*YSlUq9pu3q z>glVa2!<qro<16FNYK|Ol8p4pcq2R(WrV_DzHn$5Z~zLA&9P;(J-?T@<@dNi4Gh*x zngCTXr_h*Q>%rRd7b$>D;Q`t(b(A^^j>5pzQMM?O1`e-*Ca9r^8Yt9Ps5zU?WcdFN zC>o`K!h%QSzd*qgN2l;8{}#NSb`8*XFb|aVbD#}F!=QAU27}FEQNW61vM6o<(%Z`o z2K_TH25e6@2ebw>8T9?nbrS;vOAedC^aMA!*8BCLCWZ!hGzpJ~t0U0shwf{t$N-0V z0-zgl*evLmQ=`HBo8-|53>+5BG8{#~65v=29t$U884Ng<fTa>JC_0`(CBnYRgN5^N zN{L7S^R14@!5LTr1CB-$C~ztjpuzzxMx9Qlqi8r907L#T(U{2vQ|bS$)7St$-<~{~ zphobhYEWojqs66wo~)a(zW8@;P-z4l0MJozB2k?Prx39yIF&)c!fEP&IsqWzFc>1? zyS%SE04CrsRq)?a`&A8>&EWY`IDnoTn6-Z@H4;?Cp6Nwr`*OiT`zl9sr+B#mU?WF< z@pQf8{onoh&(73Wh5x_)AlDuGnkwYiLi;m|U-tge?!k0^SpsLs`s0t`1-|?ke}ESl zDh@c@)}#|2g9G-J30cq9J*4HxNr%Mll(h%1gHinvJ`sH3zlibaeb|Cl-9mNFe*b*z z?1Wcr8odu2+oOeJrM~y-D?Ql3TJ-EwFyGGYQSd+?OLNasQVO0+Hip6o6bRq_X7BW0 z7@IbZywpA4MBr8q$-n>HGvLa7)khl89RFB3O$uiYKDlV__ip)4!p32=R^_Z$bgXBH zWHJeYyyUm*u%K*Ps^OW61<s&HvEqxlg;Q6$C30=|i$BB0EXR}-?V%yXV;6QkTqxrY zZ2u%YS;kTpkDdRZx!5w_GGlPm+I*XD-ijcQs+;0|OF{ZZexPHA%Vh@zjx^*-&SFrw zz-;pq=Cz9~zasjy>q{mC^(17z^rPOS_QEzz8I7vnJ*-8bS~&uWxHTx%#*;2&rw|B} zyPRLn4&Zk9^mnA4z4$6-4+~XUJTDwanVM;C=uzt{!o9P{1hs`fB{gXi9Tsi+kKVIR zFWC4SPN+()rvbmjPZEbw`!CFHecHtu_wtRgbf?vy3ad_dKX%#7Yr;Ik-J+%R_uPR* z6-0F9J}Yry{cPC_YmocDZP}yx?AC~5X&Fg&|A7ohSYqSaBX1F-A<;(#-UZ4o7U8wE zWrg?!NHk()U*oxG_kBkuZ)~Ibzb=l-P=y>FBbD|q;-cD~glEITJnta)+01c9kgKwa z1Jy65944#gF|s$rrI_s*!}*i0!<iMQY990)lvf@V3*F#!VDjna?pfmsyH8qkKH+)I z^)V|scWw_?>Li@6s^yt=<h%DZYE@F}lVTrT{Hgo=32P{^`t-G^8{zd9T|ol(Z=NRe zoZAHgy=RoAq=n<!YC{(bX)hBJkE+bY2W2cRNL2VPO6E*B<Th67^2&#OMw(msv=G$o zac6!*$dY{?ia<^VZoH^;xi+K8NlHfWCrD|;-NF}k{PTf<H(i*n@>Y#8NVzNuTeCS& z@Ay(c-a*YgdcPCf`E=^ju5Hxwy<ukvL9T;$XU;__Xr36GGK#lq%)s61>z+x9bp#fA z#&m}`raBmpz<PabO!NFU!6L6^(Otey4`%HIF|5^JD9QkQ=lLCnjK~&-VLFa~oYT2m zVYoz}dwP@a+~8DKRdBSI%3C)jncIPhDdSs~q9flJ#1EM!-t!cD8?cm>&y|4WB$H(D zCx;UicN-WvrL;AU=9W-W7UUIaKvGkr+Vev?F^8hgTzHe<(s|bQ^?1-}{jf=gW2!Z8 zM|_L?Ru8-LKRT83kXC(Twxp@|aGalvgn8QOikMR5J}n8!-pQzDnf!=H7nKA*jd|>h zbgy>INC}&HRx|n{WsX)QiwQAJzpo<@s?=sep*Tl>;)A}j3_J2pS~j5il3d`gJwgs? zA76cfpHA7}T{(0@X5}L~=IjBt7d?w7Ar<nI%AGvEGl*3+jDVj&9eHGUV7JG<G<l$6 zyLAoK)F!jD(vnKA%(Qc_c$^yIz>*jD-w~+Z=IJ<PAY?15+L2x@b77kAs$J}0X2pIL z<=Nml9W%0gVnU$Uxe=Y1V3NVM2bcM_`+m9_RVD``#E9FsccjY=FU?;Cc~5)o4-J>P zEitXjT4AEzAqD+m4(TR3*zqeacLkfWe5(l}OXbb>%#fnm4CzNZku=l#CY_j6i-8_Z zzB`p$;15j0E0PP1Ov?M>u7tjXo1e<kFA%&??!>4ICoJqN+-Py`)fs#}mrkG{QC#RT zjpwG3$E52cK5d9zbWK`Cgg)!&^0}>SW9K5<9wSoFMc^|a=U!#`Hr#5Pj*1t<$>B3O zN%A!f!Ma;rL?t?O^XGSCe)I3Na`LZIDBc+SqHz<9qc(9lQVaDiSApEOFEmfz%nuVF zFdVMM&iHgP%l5-oQ~7tB-)>i(E6>hs=c!8l(ejl4R}m@5z6{Mx$fRXS%$cT}oSUO* zM5~1>qVju7?S0lDV(Rvb@cc|;|HH8o8+M1Cm(*K{FLop9$HuioCkAWlcFwnXOKp{V zGE9JM7U5KD!z_HIS!#vjAM|uw=aj66Eer~Z_$;#@m+f%d`xDVJRmcjggpaPXAL<8> z-@f`jy~gZ}%j@uyM6*UAp#;PN$cl?FQcSxyd6R^_WfhpkAFOkAyY_}*88OJEuz(8t z;+-me!V)j5rCL+k8IG>1b9XMn9_u8iU_3rNs{yuU&6#KlgH`kLw0^_3xHG<z7UB^` zIMui-VqA9~tmaU-Lpm`}Tra8<GPo(%r#SEitY`Svd#U?!&gMhXJ=dN#^F>d-3V*UR z5+^Ll-(>&^m2kYg=k3}p;z>Z$o-n?&o$}kP-Ht;`Q*rf$4BcZjIyXLqYqK*p-qcpz zm~*Yu_vpS!nHDGI0Igx|ec?Z~1Di#sto9b{FjKAYUrkyL>UsT2QJ(SqgYqHKp;?=% znm5VQTh&|2_j;80qPEJZ@9C=!e&)mXRt|>^5!q_i$J>>+VNmm$d}tYJq+`RI4|C4j zp;>4hE1!)Swz^lyL3T&2hs<7<_*AaCtiBW!x?5xC7je(;?a|cMkC)CGwz~oTh!XK$ zOP^<hM<<whg1j8Dn{i`jcb8b@<O#9&Cz%G_k)&K$*mZwGSKdxZreV0WGYIf1l<p4b zwCpM7i*;^V(SRT6Bl|=I91bec7AZS_Lawz>IW83;aaXS6muI8flG13kJKLXUsP+{> zu6BK<0a=CdladP)?2ga4wX;jzD`wUy^QMJ}Yi-D?hjB4)Hv2H1y+3au#WFs#B_fg` z*shvzB3by5`-R7&%b5)a?;>iS)QJ`W6Vo9xVthvLyAIDy#J-6%>W}{v;+pdOl_Kh$ z+Ubg?e9Tw7Bzm*-W9+R5UcvLA)p-RWEpa(2&SioO5i+gS`r1ch^u?^f=QpC<-=27k zEjUtCxw(#3idi}gTgXzuoT(i%4)1|ZHT5aC|FKt9VW)>;Q|8M`%Mlrvw0?Z1%xDWK zTELm@JZ2-AU=UNxCpxM-#MSdmwa+fq700_(8bw(pEk8*lj6)w=BDl_C(Vv;Q=l!-m zu0J9nPEu?NF*$v!crQiZ7awJ-<E-pqJ=gb7?Gz+s25Wu0b&bfC1SfP^!BpvFUG|IQ zg|{)BL*00od_K9^qbYtzKx}U=c|=C}YQ1q-SMLcX$<8kZIeCd-3TO1MzX2FFtkL z@fhCbn$>3MbEy96oqe}I`d>%MbF4*%b{7Chh-P{K_QY-S^V$S`KDKNBr!Mn`N0*aO zY6YVh?v)Z@m~?ggJk`mwXRKv=*25{s<{g<&1B5bi%ahWd`iJW5zalExz1h&R6E)>D zyY*MKce-u?2K*2e*2>Qp>m-|;BsXS#OvRespUCxTP~6!hCQZ+vi<}M58a{TpF#Gt; zC7=Atqt_20FanFQxz}ll8+=M91t&?1;%lEB<Yd(b9{v38cC%K}No}9P@+^rS6ZMO) z_ooTDAMYqXP?tj5IR19JrtH~@en@n#e}eC=>iJR2-;1`E`pcP<vzNy^wmB8{qxaZ8 zUlxYQp6r8V7e~#V3gCNmsE@A#K~RB7kGTy@CwFbwxhb<HE)>6ii-pUANMwV;Qj^*I zl46xox`ltyy_`iI1;Yz*R%&Mlo;X$^nCAuv=lDAZ&eGvTn0Oi0xy4z;$E<|eqegU# zJ5{J2;yHua@+djB6P%981#>4|)zB~BpRKvy%kO!3=A>LzQ<2!cT^*XyOr2C2sg&_U z54GS7s#tVxxS~vlM{kkNJ+X!Z86PyuVpG@)bx~{f#!;0y?g!JV1+E>05mwG&4|Xbz zNZP+obYiEDA8N<08Lzd2V_xC?$1(H%cJ|NGug<UHC#T$3^HweH7m2qYpX~qWycf5y zd-jjoI{zVi!>k#hYgvJrGa|&7n>>wAIW|teA!JwhCxj=LygApI)=^83xG7ctB)5>% z!2X<KJO80cmjA^l>r$lA{eo$e3h%eLDUNNUwg+?<39=lyv}oo&(HeYm?+%~dP06!K zU=z0@3S^T5?$p=5X-$mu*?&;lMf(qJt<<@}x}edp?H9_g7CAa#)Xg4s8Y*DUM%H^f zj=4m|fek+2U3}AntDX0<j?NzRp_yqxkcW?4=3U~%i&}?fUIKxp9YrahcF2LvB|^+_ z6ya2KyM9+sYvV3h;I&`jxB57Wb$u5rh93yedsY5&9k%yFnV*jJssZEY?$<UngtZy{ zPL|$D8h31G&|LLkFyF}4=4D$vas__P*?M)Dpn_RVjBIF@o41*;*+$LE<OeC(hh-bY z#c6#X#}$yLFNIn8jfehDkiP>F7ak75i3-i_OUU1J&T~=O({Vw@PAN#mL&4Wd4p3Y^ z&Y04a4BA@mcI)%?tevI5E^xCZ4L&pX$X0z)IdJTRapW9hI&*SFUS0KdK(pSPnKwI- z>4Fbj4$AbFOAal1Z_eTgqb81B7fo(TD;W$OMcn<oH{t+pOG4!)(w@_tJ8s2;)=hXB zl@)>@T6YEBTQ>PqTt&rerOU5NKAY=EMWjZ|thB6|DLG%rb4jAfty(T`D`r$0_dK3% zUERL=dGLAV)(RdKX>{XSijuSN?w8BKZ%Dd>4L;Q^bLFkF$i(ZrxJyMI4>zpBcvJ5% zL+@KJ8<KM*d<*6;c=E5ULHfJhYX4AnJ@any*#mv=V4?EjSL5ui`Pk;iVjUr&lQ$Gw zpF4NU&kRo_-S2~^9f-5&j&3OKKR4efy}VebqvKp2mU6)rz8bs!d%nVN5s2#C90Q8E d^&VT5oWEg{xO-MzeEmOA6GIDfzW&kBe*qHrRvrKV diff --git a/assets/img/battery-100.png b/assets/img/battery-100.png deleted file mode 100644 index 4336d56f4877ebd73124f1615dacb14d9a63ebde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6261 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 diff --git a/assets/img/bilibili.svg b/assets/img/bilibili.svg deleted file mode 100644 index e5cd8ee..0000000 --- a/assets/img/bilibili.svg +++ /dev/null @@ -1,44 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2250 1024"> -<path d="M2079.44,914.36c-10,0-19-0.33-27-1c-17.33-1.33-34.33-2-51-2c-10.67,0-10.67-0.33-12-11l-16-182l-16-151 - l-11-93l-10-81l-18-126c-6-44.67-13.33-89.33-22-134c-1.33-6.67-1-7.67,7-9c31.33-6,63-9,95-9h11c5.33,0.67,8.33,4,9,10 - c1.33,23.33,2.67,46.33,4,69l28,373l14,171l9,98L2079.44,914.36z M853.44,115.36c4.67,0,10.67,0,18,0c9.33,0,11,2.67,11,12l8,121 - l18,251l11,131l8,101l16,174c0,8-1,9-9,9c-24-1.33-48-2.33-72-3c-5.33,0.67-8-1.67-8-7c-1.33-11.33-2.33-23-3-35 - c-3.33-30-6-60.33-8-91l-16-158l-17-143l-12-101l-13-92c-6-41.33-12.67-82.67-20-124l-5-28c-1.33-4.67,0.33-7.33,5-8 - C793.44,119.03,820.11,114.03,853.44,115.36z M1859.44,518.36c25.33,0,28,1,32,25c4.67,30,8.67,60,12,90l11,97l21,206 - c1.33,4.67-0.33,7-5,7l-78,9c-8,1.33-9.67,0-11-8l-45-230l-28-153l-4-21c-0.67-4,1-6.67,5-8 - C1800.11,525.03,1830.11,520.36,1859.44,518.36z M722.44,518.36c26.67-1.33,30.33,1.67,33,27c6.67,40.67,12,81.33,16,122l13,120 - l8,81l7,65c0,9.33-1,10.67-9,12l-74,7c-8,1.33-9.67,0-11-8l-61-314l-16-89c-1.33-4.67,0.67-7.67,6-9 - C665.11,525.03,694.44,520.36,722.44,518.36z M1104.44,828.36v124v4c0.67,6-2,8.67-8,8c-8,0-16,0-24,0c-17.33,0-34.33,0.67-51,2 - c-9.33,1.33-9.67,0.67-11-10l-16-180l-8-89l-12-136c-1.33-10.67,0.67-12.67,10-14c28-2.67,56-3.33,84-2c6.67,0.67,13.67,1.67,21,3 - c8,2.67,9,4,9,12c1.33,18,2.33,36,3,54l1,60C1103.78,719.03,1104.44,773.7,1104.44,828.36z M2239.44,834.36v117v6 - c0,5.33-2.33,7.67-7,7h-36c-14,0-27.67,0.67-41,2c-8,1.33-8.67,0.33-10-9l-21-234l-11-116l-4-59c-1.33-8,1-10,9-10 - c33.33-4,66.67-5,100-1c13.33,1.33,14.67,4.67,16,18c1.33,44.67,2.33,89,3,133C2238.78,735.03,2238.11,782.36,2239.44,834.36z - M1830.44,305.36c10,0,18.67,0.67,26,2c4.67,0.67,7.33,3.33,8,8l13,139c2.67,12,1,14-11,14l-34,2c-6.67,1.33-10,1.67-10-9 - c-4.67-37.33-9.33-75-14-113l-4-32c-1.33-6,1-9.33,7-10L1830.44,305.36z M697.44,305.36c8,0,15.67,0.67,23,2c4,0.67,6.33,3.33,7,8 - l4,35l10,109c1.33,8,1,9-7,9c-12.67,0.67-25.67,1.33-39,2c-8,1.33-8.67,0-10-8l-9-80c-2.67-22.67-5.33-45-8-67 - c-1.33-5.33,0.67-8,6-8C681.78,306.03,689.44,305.36,697.44,305.36z M1096.44,405.36c0,23.33,0,46.33,0,69c1.33,10.67-0.67,11-10,11 - c-12.67,0-25-0.67-37-2c-8-1.33-9.33-1-8-9l-3-85c0-18.67-0.33-37.67-1-57c-1.33-9.33-0.33-10,9-10c14,0,28,1,42,3c8,0,8,2,8,10 - V405.36z M2232.44,406.36c0,22.67,0,45.67,0,69c0,9.33-0.67,10-10,10c-12.67-0.67-25.33-1.33-38-2c-6-0.67-8.67-3.67-8-9l-3-143 - c0-8,1-9,9-9c12.67,0,25,0.67,37,2c14.67,1.33,13,4.33,13,15V406.36z M666.44,460.36c1.33,12,0,13.67-12,15l-24,6 - c-8,2.67-8.67,0.67-10-6l-25-141c-2.67-9.33-1.33-10.67,8-12l35-6c8-1.33,10-1,10,7c3.33,17.33,6,34.33,8,51l10,80V460.36z - M1730.44,323.36c15.33-2.67,31-5,47-7c4.67-0.67,7.33,1.67,8,7c2.67,18.67,5.33,37,8,55c4,26.67,6.67,53.67,8,81v8 - c0.67,4-1,6.67-5,8l-32,7c-4.67,0.67-7.33-1.33-8-6l-26-149V323.36z M1020.44,431.36c0,16-0.67,31-2,45c0,4.67-2.33,7.33-7,8l-31,3 - c-4.67,0.67-7-1.67-7-7c-2-14.67-3.33-29.33-4-44c-2-27.33-3.67-55-5-83l-2-20c-0.67-4,1-6,5-6c13.33-1.33,27-2.33,41-3 - c6.67,0,9,1,9,9L1020.44,431.36z M2154.44,415.36c0.67,19.33,0.67,38.67,0,58c1.33,9.33-0.67,11-10,11l-28,3c-5.33,0.67-8-1.67-8-7 - c-1.33-25.33-3-50.67-5-76l-4-70c-0.67-4.67,1-7,5-7c13.33-1.33,26.67-2.33,40-3c6.67,0,8,1,8,9 - C2154.44,360.7,2155.11,388.03,2154.44,415.36z M627.44,756.36c16,18.67,18.67,40.33,12,63c-6,22-17,41-33,57 - c-26,27.33-55.67,49.33-89,66c-56.67,30-116.33,50.67-179,62c-44.67,9.33-89.67,15.33-135,18c-14,0.67-28,1-42,1h-30 - c-8,0-9.67-2-11-10l-7-97l-19-191l-21-182l-12-97l-13-93c-7.33-51.33-15.67-102.33-25-153c-6.67-41.33-14.33-82.33-23-123 - c-1.33-5.33,0.33-8.67,5-10l139-58c8.67-4,17.33-7,26-9c6-1.33,8.67,1,8,7c0,16-0.33,32.33-1,49l-1,13c-1.33,58-1.33,116.33,0,175 - c1.33,51.33,3.67,102.67,7,154c5.33,80,13,160.33,21,239c0,8,0.67,8.33,10,7c16.67-2.67,33.33-4,50-4c53.33,0,105.67,6.33,157,19 - c44.67,10.67,88.33,25.67,131,45c20.67,10,40,22,58,36C617.11,745.03,622.78,750.36,627.44,756.36z M1754.44,747.36 - c20.67,17.33,28,39.67,22,67c-5.33,22-15.33,41.33-30,58c-24,26.67-51.67,48.33-83,65c-60,33.33-124,56-192,68 - c-36.67,7.33-73.67,12.67-111,16c-21.33,2-43.67,2.67-67,2h-27c-6,0.67-9-2-9-8c-2-28-4.33-56-7-84l-16-171l-17-149l-21-168 - c-3.33-29.33-7.33-58.67-12-88l-18-112c-8-53.33-17.67-106.33-29-159l-1-7c-2-5.33-0.33-8.67,5-10c49.33-20,96.67-42.33,146-61 - c13.33-5.33,29.33-11,28,1c-4,37.33-2.67,74-4,110c-1.33,30-1,59.67,1,89c0,8,0,15.67,0,23c0,36,1.33,71.67,4,107 - c2,47.33,5,94.67,9,142c2.67,34,5.67,67.67,9,101c1.33,18.67,3.33,37.33,6,56c0,10.67,1.67,10.33,11,9c18-2.67,36-4,54-4 - c62.67,1.33,124,10.67,184,28c40.67,10.67,80,26,118,46C1724.11,723.7,1739.78,734.7,1754.44,747.36z M308.44,923.36 - c15.33-8.67,41-27.17,77-55.5s58.33-47.5,67-57.5c-54-24-110-45.33-168-64L308.44,923.36z M1585.44,815.36c2.67-2.67,2.33-5-1-7 - l-24-10c-42-18-84.33-34-127-48l-6-2c-2-0.67-4.33-0.33-7,1l24,173c2.67,0,4.67-0.67,6-2c39.33-28,78.33-57.33,117-88 - C1573.44,827.03,1579.44,821.36,1585.44,815.36z" fill="#FB7299"/> -</svg> diff --git a/assets/img/blackroom.svg b/assets/img/blackroom.svg deleted file mode 100644 index 10c801d..0000000 --- a/assets/img/blackroom.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M139.264 529.152a27.136 27.136 0 0 1-14.592-2.816A32 32 0 0 1 113.152 486.4l130.816-236.032a28.416 28.416 0 1 1 49.152 28.928l-130.56 235.52a25.6 25.6 0 0 1-23.296 14.336" fill="#F99E4A"></path><path d="M380.416 529.152a34.56 34.56 0 0 1-25.6-14.592l-131.328-235.264a30.208 30.208 0 0 1 11.52-37.632 25.6 25.6 0 0 1 37.888 11.52l130.816 235.264a25.6 25.6 0 0 1-11.776 37.888c-2.816 0-8.704 2.816-11.52 2.816m261.376 0a25.6 25.6 0 0 1-14.336-2.816 29.44 29.44 0 0 1-11.776-37.888l130.816-235.264a28.928 28.928 0 0 1 37.632-11.52 29.44 29.44 0 0 1 11.776 37.632L665.6 514.56a25.6 25.6 0 0 1-23.296 14.592" fill="#F99E4A"></path><path d="M883.968 529.152a34.56 34.56 0 0 1-25.6-14.336l-130.56-235.52a27.392 27.392 0 0 1 11.52-37.632 25.6 25.6 0 0 1 37.888 11.52l130.56 235.52a25.6 25.6 0 0 1-11.776 37.632c-2.816 0-8.704 2.816-11.776 2.816" fill="#F99E4A"></path><path d="M801.536 241.664l-130.56-51.2A129.536 129.536 0 0 0 640 183.552H380.416a153.6 153.6 0 0 0-32 5.632L217.6 241.664A21.248 21.248 0 0 0 226.304 281.6h569.6a21.248 21.248 0 0 0 5.632-40.704M458.752 281.6v520.704a51.2 51.2 0 0 0 104.704 0V281.6z" fill="#FFD043"></path><path d="M561.152 183.296A51.2 51.2 0 0 0 512 139.776a52.992 52.992 0 0 0-51.2 46.336h102.4z" fill="#FFD043"></path><path d="M755.2 877.824H267.008A41.472 41.472 0 0 1 230.4 816.896l55.04-122.112a44.8 44.8 0 0 1 37.888-25.6h373.76a37.12 37.12 0 0 1 37.632 25.6L790.016 819.2a37.888 37.888 0 0 1-34.816 58.112" fill="#F99E4A"></path><path d="M900.352 494.336a9.216 9.216 0 0 1 8.704 8.704 148.48 148.48 0 0 1-296.192 0 7.68 7.68 0 0 1 8.704-8.704z m-502.528 0a9.216 9.216 0 0 1 8.704 8.704 151.808 151.808 0 0 1-148.224 142.336 150.016 150.016 0 0 1-148.224-142.336 7.68 7.68 0 0 1 8.704-8.704z" fill="#FFD043"></path></svg> \ No newline at end of file diff --git a/assets/img/channel.svg b/assets/img/channel.svg deleted file mode 100644 index 308e4df..0000000 --- a/assets/img/channel.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#23c9ed" d="M837,192c1.3-8,10-14,18-10c46.7,24,75,70.7,75,124v299c-1.3,78.7-60.3,137.7-139,139H352 - c-53.3,0-100-28-124-76c-4-6.7,2-15.7,10-17h506c53.3-1.3,91.7-39.7,93-93V192z M93,0h605c50.7,0,91.7,41,93,93v419 - c-1.3,50.7-42.3,91.7-93,93H93c-52-1.3-93-42.3-93-93V93C0,41,41,0,93,0z M508,321c12-9.3,12-28.7,0-38L339,165 - c-16-10.7-35.7,0.3-37,19v236c1.3,18.7,21,29.7,37,19L508,321z"/> -</svg> diff --git a/assets/img/class.svg b/assets/img/class.svg deleted file mode 100644 index 51797d1..0000000 --- a/assets/img/class.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#0BA395" d="M107.7,3.2C45,16.5,1,68.8-0.3,134.2v582c1.3,65.3,45.3,117.7,108,131V3.2z M625.7,0.2h-452v850h452 - c76-2.7,132.7-58,134-134v-582C758.4,58.2,701.7,2.8,625.7,0.2z M385.7,117.2c0-18.7,14.3-33,33-33h213c18.7,0,31.7,14.3,33,33v237 - c-0.7,13.3-6.7,23.3-18,30c-10.7,4-23.3,4.7-34-2l-92-63l-82,62c-22.7,14.7-51.7-0.3-53-27V117.2z M670.7,704.2 - c0,18.7-14.3,33-33,33h-354c-42.1,0-41.2-63.1,0-66h354C656.4,672.5,670.7,685.5,670.7,704.2z M670.7,555.2c0,18.7-14.3,33-33,33 - h-354c-42.1,0-41.2-63.1,0-66h354C656.4,523.5,670.7,536.5,670.7,555.2z"/> -</svg> \ No newline at end of file diff --git a/assets/img/coin.svg b/assets/img/coin.svg deleted file mode 100644 index d58a86e..0000000 --- a/assets/img/coin.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path d="M472,244h119c47.06,0,47.06-65,0-65H281c-45.49,0-45.49,65,0,65h125v60c-112,8-192,93-196,205v44 - c3.12,40.52,62.97,42.37,66,0v-44c1.33-74.67,55.33-133.33,130-140v305c2.98,41.69,63.02,41.69,66,0V369 - c74.67,6.67,128.67,65.33,130,140v44c0,41.73,65,41.73,65,0v-44c-2.67-112-82.67-197-196-205v-60H472z M439,878 - c-124-3.33-227.33-46.33-310-129S3.33,563,0,439c3.33-124,46.33-227.33,129-310S315,3.33,439,0c124,3.33,227.33,46.33,310,129 - s125.67,186,129,310c-3.33,124-46.33,227.33-129,310S563,874.67,439,878z" fill="#FB7299"/> -</svg> diff --git a/assets/img/collect.svg b/assets/img/collect.svg deleted file mode 100644 index b382480..0000000 --- a/assets/img/collect.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> - <path fill="#F3A034" d="M646.6,837.1c-50.8,0-119.6-23.4-204.4-69.5l-0.2-0.1l-0.2,0.1c-84.7,45.8-153.4,69.1-204.2,69.1 - c-36,0-63.8-11.7-82.8-34.6c-17.8-21.5-28.2-53.6-31.1-95.4c-2.9-41.8,1.7-94.5,13.8-156.5l0.1-0.3l-0.2-0.2 - c-53.4-49.2-91.6-94.1-113.6-133.2c-21.9-39.1-28.3-73.6-19-102.7c9.4-29.2,35-53.7,76.1-72.8c41.2-19.1,99.1-33.4,172.1-42.4 - l0.3,0l0.1-0.2c31.3-65.6,63.1-115.6,94.4-148.4C379,17.1,410.7,0.5,441.9,0.5c31.2,0,62.9,16.6,94.1,49.3 - c31.3,32.8,63.1,82.7,94.4,148.4l0.1,0.2l0.3,0c73.2,9,131.2,23.3,172.5,42.4c41.2,19.1,66.9,43.6,76.2,72.9 - c9.3,29,2.9,63.6-19.1,102.6c-22.1,39.2-60.4,84-113.9,133.2l-0.2,0.2l0.1,0.3c12,62.2,16.7,115,13.8,156.9 - c-2.9,41.8-13.4,74-31.2,95.5C710.1,825.4,682.4,837.1,646.6,837.1z"/> -</svg> \ No newline at end of file diff --git a/assets/img/comment.svg b/assets/img/comment.svg deleted file mode 100644 index f5cf6b1..0000000 --- a/assets/img/comment.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 960 823"> -<path fill="#1497C7" d="M892,329c-2-74-28.8-135.8-80.5-185.5C759.8,93.8,695,68,617,66H343c-78,2-142.8,27.8-194.5,77.5 - S70.3,255,69,329c1.3,74.7,27.8,136.8,79.5,186.5S265,591,343,593h79l32,107l117-107h46c78-2,142.8-27.8,194.5-77.5 - C863.2,465.8,890,403.7,892,329z M343,0h274c96.7,2.7,177.3,35,242,97s98.3,139.3,101,232c-2.7,93.3-36.3,171-101,233 - s-145.3,94.3-242,97h-19L419,823l-49-164h-27c-96.7-2.7-177.3-35-242-97S2.7,422.3,0,329c2.7-92.7,36.3-170,101-232S246.3,2.7,343,0 - z"/> -</svg> \ No newline at end of file diff --git a/assets/img/delete.svg b/assets/img/delete.svg deleted file mode 100644 index 6901d1a..0000000 --- a/assets/img/delete.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 844 844"> -<path fill="#A0A0A0" d="M269,697V286c0-12,9.67-22,23-22c13.33,0,30,10,30,22v411c0,13.33-16.67,23-30,23 - C278.67,720,269,710.33,269,697z M391,697V286c0-27.72,50.75-29.26,54,0v411c-1.33,13.33-16.67,23-30,23 - C401.67,720,392.33,710.33,391,697z M522,697V286c0-12,9.67-22,23-22s30,10,30,22v411c0,13.33-16.67,23-30,23S522,710.33,522,697z - M644,759l40-565H164l36,549c0,20,7.33,44.33,46,47h375C634.33,790,641.33,781.67,644,759z M622,844H230 - c-54.67-2.67-82.67-39.33-84-70l-36-580H23c-12,0-23-10.67-23-24c0-13.33,9.67-30,23-30h215V55c1.33-38.67,30.33-55,61-55h246 - c13.33,0,27.33,1.33,46,24c14.67,17.33,15,27.33,15,38v78h215c13.33,0,23,16.67,23,30c0,13.33-11,24-23,24h-86l-39,597 - C694.67,807,672.67,841.33,622,844z M530,55H318c-18.67,0-27.33,11.67-26,29v56h260V84C552,65.33,539.33,55,530,55z"/> -</svg> \ No newline at end of file diff --git a/assets/img/download.svg b/assets/img/download.svg deleted file mode 100644 index dca94f2..0000000 --- a/assets/img/download.svg +++ /dev/null @@ -1,7 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#1497C7" d="M512,0C366.7,3.3,245.8,53.2,149.5,149.5S3.3,366.7,0,512c3.3,145.3,53.2,266.2,149.5,362.5 - S366.7,1020.7,512,1024c145.3-3.3,266.2-53.2,362.5-149.5S1020.7,657.3,1024,512c-3.3-145.3-53.2-266.2-149.5-362.5S657.3,3.3,512,0 - z M326,463c4-4,8.7-6,14-6h81V311c0-10.7,7.3-18,18-18h146c10.7,0,18,7.3,18,18v146h81c17.3,1.3,23.7,20,13,32L524,647 - c-6.7,6.7-17.3,6.7-24,0L327,489C320.3,482.3,319.3,471,326,463z M713,731c0,10.7-8.7,19-18,19H329c-9.3,0-18-8.3-18-19v-36 - c0-10.7,7.3-18,18-18h366c10.7,0,18,7.3,18,18V731z"/> -</svg> diff --git a/assets/img/fav.svg b/assets/img/fav.svg deleted file mode 100644 index eea2122..0000000 --- a/assets/img/fav.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path d="M661.53,260c-42.67-6.67-77.67-33.33-95-72l-72-151c-25.33-49.33-86.67-49.33-116,0l-68,151 - c-20,38.67-53.67,65.33-95,72l-162,25c-52,10.67-71,65.67-35,107l122,126c29.33,28,40.33,68.67,35,110l-28,175 - c-6.67,56,43.33,90,94,66l137-75c38.67-22.67,84.33-22.67,123,0l138,75c49.33,24,96.67-10,94-66l-32-175c-5.33-41.33,5.67-82,35-110 - l122-126c36-41.33,17-96.33-35-107L661.53,260z" fill="#FB7299"/> -</svg> diff --git a/assets/img/follow.svg b/assets/img/follow.svg deleted file mode 100644 index 900076b..0000000 --- a/assets/img/follow.svg +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 24.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - viewBox="0 0 244.04 55.01" enable-background="new 0 0 244.04 55.01" xml:space="preserve"> -<path fill="#19AAD5" d="M5.39,55.01h233.26c2.98,0,5.39-2.41,5.39-5.39V5.39c0-2.98-2.41-5.39-5.39-5.39L5.39,0 - C2.41,0,0,2.41,0,5.39l0,44.22C0,52.6,2.41,55.01,5.39,55.01z"/> -<path fill="#FFFFFF" d="M79.26,24.77V8.37c0.08-1.52,1.22-2.68,2.73-2.68s2.66,1.16,2.73,2.68v16.4h16.4 - c1.52,0.08,2.68,1.22,2.68,2.73c0,1.52-1.16,2.66-2.68,2.73h-16.4v16.4c-0.08,1.52-1.22,2.68-2.73,2.68s-2.66-1.16-2.73-2.68v-16.4 - h-16.4c-1.52-0.08-2.68-1.22-2.68-2.73c0-1.52,1.16-2.66,2.68-2.73H79.26z"/> -<g> - <path fill="#FFFFFF" d="M105.14,44.25c9.46-3.33,15.11-8.12,16.93-14.37h-16.13V26.9h16.71c0.05-0.56,0.08-3.05,0.08-7.48h-14.45 - v-2.98h9.5c-2.27-2.47-4.21-4.45-5.82-5.95l2.3-2.04c2.27,2.01,4.34,3.93,6.22,5.76l-2.53,2.23h9.44c2.05-2.86,3.85-5.53,5.4-8.03 - l3.29,1.8c-1.82,2.3-3.5,4.37-5.03,6.23h10.02v2.98h-14.97c0,3.84-0.02,6.33-0.06,7.48h17.36v2.98h-16.81 - c3.1,6.57,8.94,11.07,17.52,13.51c-1.08,1.1-2.06,2.15-2.93,3.17c-8.13-3.13-13.65-7.84-16.57-14.13 - c-2.15,6.11-7.87,10.99-17.16,14.64C106.75,46.18,105.99,45.24,105.14,44.25z"/> - <path fill="#FFFFFF" d="M147.35,19.11c1.9,1.31,4.24,3.08,7.01,5.33c-0.98,1.1-1.76,1.94-2.34,2.54c-2.77-2.51-4.99-4.39-6.65-5.64 - L147.35,19.11z M150.92,30.39c1.08,0.47,2.13,0.9,3.13,1.29c-1.45,4.59-2.97,9.61-4.55,15.04l-3.41-1.17 - C147.75,41.08,149.36,36.03,150.92,30.39z M148.86,8.97c2.56,1.91,4.84,3.81,6.85,5.72c-0.9,0.89-1.69,1.68-2.38,2.39 - c-1.42-1.49-3.59-3.47-6.49-5.95L148.86,8.97z M155.15,41.67h13.3V30.55h-10.29v-2.98h10.29v-9.48h-11.4v-2.98h12.63 - c-1.24-1.94-2.51-3.72-3.8-5.33l2.61-1.64c1.77,2.04,3.17,3.84,4.2,5.4l-2.47,1.57h13.29v2.98h-11.72v9.48h10.29v2.98h-10.29v11.12 - h12.83v2.98h-29.46V41.67z"/> -</g> -</svg> diff --git a/assets/img/history.png b/assets/img/history.png deleted file mode 100644 index dc42b04222dada65b6a0e5902ea3b70348ab8d32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2400 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 diff --git a/assets/img/home.svg b/assets/img/home.svg deleted file mode 100644 index 21b5eb9..0000000 --- a/assets/img/home.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#29B28A" d="M632.4,855h35c60.4,0,112-51,112-112V518c1.3-32,24-54.7,56-56h4 - c21.3,0,37.3-13,44-33c4-17.3-1-33.7-13-47l-349-349c-46.7-44-112.3-44-159,0l-349,349c-14.7,14.7-17.3,35.3-8,54 - c9.3,14.7,23.7,23,41,23h3c32,1.3,54.7,25.3,56,56v225c1.3,64,48,110.3,112,113h35c12-1.3,21.7-9,23-21c12-86.7,79-147.7,167-149 - c88,1.3,156,62.3,168,149C610.4,845.3,620.4,855,632.4,855z"/> -</svg> \ No newline at end of file diff --git a/assets/img/like.svg b/assets/img/like.svg deleted file mode 100644 index cfc8cb1..0000000 --- a/assets/img/like.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path d="M250,767.13v-551h4l154-189c33.33-33.33,86-36.67,122-6c18.67,18.67,30.67,43,28,71l-6,124h235 - c29.33,0,56.33,13,75,37c16,22.67,19.67,52.67,13,78l-100,328c-17.33,62.67-68.33,104-135,108H250z M193,767.13h-80 - c-61.82,4.12-110.87-48.32-113-108v-331c0-41.33,21-77.33,57-96c18.67-9.33,37.33-13.33,56-16h80V767.13z" fill="#FB7299"/> -</svg> diff --git a/assets/img/live.svg b/assets/img/live.svg deleted file mode 100644 index 4bd4e55..0000000 --- a/assets/img/live.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M392.448 275.911111a92.416 92.416 0 1 1-184.832 0 92.416 92.416 0 0 1 184.832 0" fill="#23ADE5"></path><path d="M826.624 464.583111l-63.744 36.864v-48.64a72.206222 72.206222 0 0 0-71.68-71.936H190.72a72.192 72.192 0 0 0-71.936 71.936V748.231111a71.936 71.936 0 0 0 71.936 71.936H691.2a71.936 71.936 0 0 0 71.936-71.936v-23.808l63.488 37.888a51.2 51.2 0 0 0 76.8-44.544V508.871111a51.2 51.2 0 0 0-76.8-44.288M572.928 369.351111c79.459556 0.142222 143.985778-64.156444 144.128-143.616 0.142222-79.459556-64.156444-143.985778-143.616-144.128-79.260444-0.142222-143.701333 63.857778-144.128 143.104-0.426667 79.459556 63.644444 144.213333 143.104 144.64h0.512" fill="#48CFE5"></path><path d="M425.216 512.967111l124.16 71.936a25.6 25.6 0 0 1 0 42.496l-124.16 71.68a25.6 25.6 0 0 1-37.12-21.248V534.471111a25.6 25.6 0 0 1 37.12-21.504" fill="#FDDE80"></path></svg> \ No newline at end of file diff --git a/assets/img/loadTV.gif b/assets/img/loadTV.gif deleted file mode 100644 index 33ebcd88d63d41e8d37471924a5bcc3ea40c1649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10013 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 Dln&x= diff --git a/assets/img/logo.png b/assets/img/logo.png deleted file mode 100644 index 57fedbddee9348599840402950661954a3be79f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257403 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¨bxee%v+ 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 diff --git a/assets/img/logo2.jpg b/assets/img/logo2.jpg deleted file mode 100644 index 199eefc2de3db52e482d78f584e7ad78dd6f5edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17236 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 diff --git a/assets/img/musicplus.svg b/assets/img/musicplus.svg deleted file mode 100644 index a32c24e..0000000 --- a/assets/img/musicplus.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M128 256m25.6 0l716.8 0q25.6 0 25.6 25.6l0 512q0 25.6-25.6 25.6l-716.8 0q-25.6 0-25.6-25.6l0-512q0-25.6 25.6-25.6Z" fill="#3DA9D3"></path><path d="M153.6 256h153.6v563.2H153.6a25.6 25.6 0 0 1-25.6-25.6V281.6a25.6 25.6 0 0 1 25.6-25.6zM870.4 256h-153.6v563.2h153.6a25.6 25.6 0 0 0 25.6-25.6V281.6a25.6 25.6 0 0 0-25.6-25.6z" fill="#7DD3E0"></path><path d="M768 320m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M768 448m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M768 576m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M768 704m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M576 180.736c8.7808-2.6112 15.8976-1.92 21.3504 2.0736 5.4784 3.9936 11.008 9.8304 16.64 17.4592 5.6064 7.6544 12.544 16.256 20.7616 25.856 8.2432 9.5744 19.456 18.5088 33.6896 26.7776 12.2368 7.68 22.9632 12.9536 32.2048 15.7696l25.9584 7.8592c8.2176 2.432 16.128 5.5296 23.6544 9.2672 0 0 17.7408 9.984 25.5232 20.48 8.1152 10.9056 14.8736 19.6608 16.6144 30.976 1.7152 11.3408 1.6128 21.9136-0.4608 31.6928a72.7296 72.7296 0 0 1-9.5744 24.576c-4.2752 6.5792-7.8592 9.9328-10.752 9.9328-2.8672 0.0256-5.4016-1.6128-7.6032-5.0432-2.2272-3.3792-3.84-9.984-4.864-19.7632-1.6896-15.872-6.656-27.0336-14.976-33.4592-8.32-6.4256-21.3504-9.984-39.1424-10.7264a96.0512 96.0512 0 0 1-48.9216-15.616c-12.3648-8.0384-24.064-16.9984-34.9696-26.8032-8.8832-7.3728-15.7952-9.5488-20.8896-6.2976-4.992 3.2256-7.5776 8.1152-7.7312 14.7456l-0.5632 26.752-6.7072 273.792-0.7936 35.4048c0.1536 9.856-1.664 21.1968-5.4272 33.9968-3.7888 12.8-10.6752 25.2928-20.6592 37.4528-9.9328 12.16-23.0912 23.2192-39.4752 33.2288s-36.5824 17.3568-60.5952 22.0672c-24.448 4.7616-46.4128 3.584-65.8944-3.5072-19.456-7.0912-34.3808-17.4336-44.7744-31.0272-10.24-12.928-15.4368-29.5936-14.7712-47.5136 0.6912-18.048 8.8576-36.0448 24.4736-53.9648 15.616-17.92 32.4352-31.2832 50.432-40.1152a198.8096 198.8096 0 0 1 51.8144-17.7152 178.8416 178.8416 0 0 1 44.3136-3.0208c13.0048 1.0496 22.5792 2.3808 28.7488 3.9424 0 0 6.4512-280.1664 8.2944-341.6064 0.2304-12.1088 3.584-22.3232 9.9328-30.976 6.4-8.5504 14.7712-14.208 25.1392-16.9472z m160.9216 288.1792a12.8 12.8 0 0 1 0.3584 2.9696v40.96l41.728-6.912a12.8 12.8 0 0 1 14.8992 12.5952v15.0016a12.8 12.8 0 0 1-10.7008 12.6464l-45.952 7.6288 0.0256 45.3632a12.8 12.8 0 0 1-9.8304 12.4416l-15.36 3.6608a12.8 12.8 0 0 1-15.7696-12.4416V560.64l-41.1136 6.8608a12.8 12.8 0 0 1-14.8992-12.6208v-15.0016a12.8 12.8 0 0 1 10.7008-12.6464l45.312-7.552v-44.1344a12.8 12.8 0 0 1 9.8304-12.4672l15.36-3.6352a12.8 12.8 0 0 1 15.4112 9.472z" fill="#FFD469"></path><path d="M179.2 320m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M179.2 448m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M179.2 576m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path><path d="M179.2 704m15.36 0l46.08 0q15.36 0 15.36 15.36l0 20.48q0 15.36-15.36 15.36l-46.08 0q-15.36 0-15.36-15.36l0-20.48q0-15.36 15.36-15.36Z" fill="#3DA9D3"></path></svg> \ No newline at end of file diff --git a/assets/img/ploading.gif b/assets/img/ploading.gif deleted file mode 100644 index 1a8c97d0443b2b3f17ffa6b91ad8395c939bff2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4610 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 E3(>4PcK`qY diff --git a/assets/img/ranking.svg b/assets/img/ranking.svg deleted file mode 100644 index c827ff1..0000000 --- a/assets/img/ranking.svg +++ /dev/null @@ -1,4 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 770"> -<path d="M352,0h192c36,1.33,62.67,28,64,64v704H288V64C289.33,28,316,1.33,352,0z M64,256h160v512H0V320 - C1.33,284,28,257.33,64,256z M672,320h160c36,1.33,62.67,28,64,64v384H672V320z" fill="#00a1d6"/> -</svg> diff --git a/assets/img/read.svg b/assets/img/read.svg deleted file mode 100644 index 8d16156..0000000 --- a/assets/img/read.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M778.496 142.08h-537.6a56.832 56.832 0 0 0-60.16 54.016v630.528a56.832 56.832 0 0 0 59.136 54.016h537.6a56.832 56.832 0 0 0 59.136-54.016V196.096a56.832 56.832 0 0 0-59.136-54.016z" fill="#54E2E2"></path><path d="M298.496 679.168h421.376a25.6 25.6 0 0 0 0-52.736H298.496a25.6 25.6 0 1 0 0 52.736zM719.872 732.928H298.496a25.6 25.6 0 1 0 0 52.736h421.376a25.6 25.6 0 0 0 0-52.736z" fill="#23ADE5"></path><path d="M272.128 237.056m80.128 0l314.112 0q80.128 0 80.128 80.128l0 154.368q0 80.128-80.128 80.128l-314.112 0q-80.128 0-80.128-80.128l0-154.368q0-80.128 80.128-80.128Z" fill="#23ADE5"></path><path d="M404.992 361.472m-49.408 0a49.408 49.408 0 1 0 98.816 0 49.408 49.408 0 1 0-98.816 0Z" fill="#2EC3E5"></path><path d="M375.552 551.936l120.832-144.384a44.544 44.544 0 0 1 68.352 0l120.832 144.384z" fill="#2EC3E5"></path></svg> \ No newline at end of file diff --git a/assets/img/relation.svg b/assets/img/relation.svg deleted file mode 100644 index a9e42ec..0000000 --- a/assets/img/relation.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 953.46 738.35"> -<path fill="#9FA0A0" d="M675.64,504c106.67-2.67,186.33-78.33,189-181c-1.33-77.33-49-143.33-125-170 - c-38.96-14.98-18.21-73.06,21-61c101.33,37.33,166.67,124.33,168,231c0,88-45.33,162-116,206c49.33,18.67,93,46,131,82 - c29.48,29.48-13.97,73.03-44,46c-61.33-57.33-140-89-224-89C633.92,568,633.92,504,675.64,504z M193.64,572 - c-97.33-53.33-159.67-150-161-266c2-86.67,32.83-158.83,92.5-216.5S259.64,2,349.64,0c89.33,2,163.83,31.83,223.5,89.5 - c59.67,57.67,90.83,129.83,93.5,216.5c-1.33,116-63.33,212.67-162,266c69.33,23.33,130.67,60,184,110c27.73,30.81-14.42,74.52-45,47 - c-80-76-183.33-118-294-118s-215,42-295,118c-29.5,29.5-75.63-17.63-44-47C63.31,632,124.31,595.33,193.64,572z M349.64,548 - c72-2,131.67-25.83,179-71.5c47.33-45.67,72-102.5,74-170.5c-2-68.67-26.67-125.67-74-171c-47.33-45.33-107-69-179-71 - c-72,2-131.83,25.67-179.5,71s-72.17,102.33-73.5,171c1.33,68,25.83,124.83,73.5,170.5S277.64,546,349.64,548z"/> -</svg> \ No newline at end of file diff --git a/assets/img/share.svg b/assets/img/share.svg deleted file mode 100644 index ca3b8fc..0000000 --- a/assets/img/share.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path d="M388.29,243V55c1.33-30.67,23.33-55,54-55c13.33,0,25,4.33,35,13l378,322c29.33,25.33,29.33,71.33,0,98 - l-378,322c-22.67,18.67-57.33,15.67-76-7c-8.67-10.67-13-22.67-13-36V539c-89.33,0-160.67,17.67-214,53s-104.33,87.67-153,157 - c-5.33,6.67-19.67,9.33-21-12c-3.33-138,21.67-253.83,75-347.5S232.96,247,388.29,243z" fill="#FB7299"/> -</svg> diff --git a/assets/img/sponsorQR.jpg b/assets/img/sponsorQR.jpg deleted file mode 100644 index 9178ffc1a8d5ce71122c48e9e9e4e5c779f9dda6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 706776 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�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%0D0NGbp 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 e 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 diff --git a/assets/img/sub.svg b/assets/img/sub.svg deleted file mode 100644 index 907fce8..0000000 --- a/assets/img/sub.svg +++ /dev/null @@ -1,5 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#EB5D47" d="M490,783.7c-58-1.3-150.3-48.3-277-141S15.3,417.4,0,244.7C2.7,127.4,77.7,32.4,191,5.7 - c114.7-24,223,28.7,275,134c52-105.3,160.3-158,275-134c113.3,26.7,188.7,121.7,190,239c-12.7,168-75.3,299.3-188,394 - S546,781.7,490,783.7z"/> -</svg> \ No newline at end of file diff --git a/assets/img/tebietuijian.svg b/assets/img/tebietuijian.svg deleted file mode 100644 index 4623fa6..0000000 --- a/assets/img/tebietuijian.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M215.04 153.6h593.92c33.93024 0 61.44 27.50976 61.44 61.44v643.3792a30.72 30.72 0 0 1-45.96224 26.6752L512 706.56l-312.43776 178.5344A30.72 30.72 0 0 1 153.6 858.4192V215.04c0-33.93024 27.50976-61.44 61.44-61.44z" fill="#9696ED"></path><path d="M512 555.392l-90.05056 46.60736a19.27168 19.27168 0 0 1-27.84256-20.41856l17.12128-98.2784-72.2432-69.32992a19.27168 19.27168 0 0 1 10.61376-32.98304l100.1216-14.32064 45.05088-89.8816a19.27168 19.27168 0 0 1 34.4576 0l45.05088 89.8816 100.11648 14.32064a19.27168 19.27168 0 0 1 10.61888 32.98304l-72.2432 69.32992 17.12128 98.2784a19.27168 19.27168 0 0 1-27.84768 20.41856L512 555.392z" fill="#FFD778"></path></svg> \ No newline at end of file diff --git a/assets/img/topic.svg b/assets/img/topic.svg deleted file mode 100644 index b26e7a0..0000000 --- a/assets/img/topic.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M880.64 520.448C880.64 642.56 768 742.4 627.712 742.4H409.6l-165.632 74.496-92.928-258.56a146.688 146.688 0 0 1-3.072-37.888v-37.888c0-122.112 110.592-226.56 250.112-226.56h232.704c136.448 0 249.856 104.448 249.856 226.56v37.888zM642.304 209.408h-256a280.064 280.064 0 0 0-279.04 273.152v43.776a250.88 250.88 0 0 0 3.072 46.336L215.04 878.08l183.04-90.112h244.224c153.6 0 279.04-116.48 279.04-261.632v-43.776a279.808 279.808 0 0 0-279.04-273.152z m58.112 351.744a51.2 51.2 0 0 1-51.2-51.2 55.552 55.552 0 0 1 58.112-52.48 54.528 54.528 0 0 1 51.2 55.296 57.088 57.088 0 0 1-58.112 49.408m-179.2 0a51.2 51.2 0 0 1-51.2-51.2 55.552 55.552 0 0 1 58.112-52.48 54.528 54.528 0 0 1 51.2 55.296A59.392 59.392 0 0 1 521.216 563.2m-179.2 0a51.2 51.2 0 0 1-51.2-51.2 55.552 55.552 0 0 1 58.112-52.48 54.528 54.528 0 0 1 51.2 55.296 59.648 59.648 0 0 1-58.112 49.408m279.04-270.336h-208.384c-122.112 0-224 87.296-224 188.928V512a111.36 111.36 0 0 0 3.072 31.744L267.264 768l110.592-58.112H645.12A194.048 194.048 0 0 0 842.752 512v-29.44c-2.816-104.448-102.4-191.744-223.744-191.744" fill="#8FC31F"></path></svg> \ No newline at end of file diff --git a/assets/img/toview.png b/assets/img/toview.png deleted file mode 100644 index cd1e0aebdeb644ad1b2ddff47df4ed27416446f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 724 zcmV;_0xSKAP)<h;3K|Lk000e1NJLTq000>P000>X1^@s6#OZ}&0007;Nkl<ZNQt$T zT}V@59L9fpw{~`%+hpPj@*}ZQjM{}2?LulqB~eO|M$kodt(2187+%$FT_{0;5EK-2 zlPjo*1_@>Ku}sJmHJbCIB(=G<xs^LzYy;Q)*sMKpF5dtDInVDs=RN0rRi3tbVmb^o z0y}_g(vu%}16%<f#*6v&Z2*Ya_!8g%?5h9}yT=YZh-D>60Ed8<RRk}k7NTz@0n+pz z0dY0{4cVRnNJ6Fn49mH5cGsa&tJ8%fWQwI+ab<6<B=5*s)cTxsL8(IkwCjqo9KV3H zeq-h!0O~9Qc{L4WTkV;HMBRd%%A=SMoI<rm$`B-`tW6b|_nyowBsko|wDWe#eob2G zN(67W1E0$YD9c*o`&L?zNYKyJlbeJ_2hy5X%8>A+o2f?~%=>1NdTN6iW5qsnMOzSA zMk0Y(=G-3viU4;?ke_`o`SJW7%KY!7p02Q*+^RE##s-;wc8l=05dgGn3lVzbC%Jgr zQQ+~4kQwKlMe7=)8FSTXe6FVihFq9zHAn|b0SI{p@V>Y&hrfR5G})?41>jo=w3rMP z`w5Q^5g2-prM4Nl#LD=MW`tIUTw=vi+f4BD2d%%i>zV-Gt_GqjD#zF3#AK^RNODqN zNHV5f)dU9L*#&TQH4q^i2~Un76_hSLk%BUQO^xXU(IfM6x{ye4cG3E1djq5G4bg!L zP!uJ;@E3vCz&T(ipkE0x=k7ymDJ0|>KrXQYi9aB~+(<tfL+-@Fugej;meqow4MH~b zdAmDhDSva)x<o=jyssPxN#Ckcl;yXF6;$Qzc60`Zd$cB74Z4D|=o5JQ@pd~9TKTS} z?)-^=g#Z-!d%La&2VHx@-#rovipH2bq0;JFEytQV0R8}Wy~V4VB)0qj0000<MNUMn GLSTXu)Jquv diff --git a/assets/img/tuiguang.svg b/assets/img/tuiguang.svg deleted file mode 100644 index 52aac0e..0000000 --- a/assets/img/tuiguang.svg +++ /dev/null @@ -1 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><path d="M324.5568 660.31616v56.832c0 30.19264 24.4736 54.67136 54.67136 54.67136 30.19264 0 54.67136-24.4736 54.67136-54.67136v-14.04928l-109.34272-42.78272z m186.4704 72.96512C503.0656 799.0016 447.09376 849.92 379.22816 849.92c-73.32864 0-132.77184-59.4432-132.77184-132.77184v-87.3984l-117.15584-45.83936v0.06656a39.05024 39.05024 0 1 1-78.10048 0V411.71968a39.05024 39.05024 0 0 1 78.10048 0v0.06656l499.85024-195.59424v-23.54176a39.05024 39.05024 0 1 1 78.1056 0v610.39616a39.05024 39.05024 0 1 1-78.1056 0v-23.54176l-118.1184-46.22336z" fill="#FFD778"></path><path d="M808.78592 458.73152h124.96384A39.05024 39.05024 0 0 1 972.8 497.78176v0.13312a39.05024 39.05024 0 0 1-39.05024 39.05024h-124.96384a39.05024 39.05024 0 0 1-39.05024-39.05024v-0.13312a39.05024 39.05024 0 0 1 39.05024-39.05024z m-3.31264 130.43712l108.25728 62.61248a39.05024 39.05024 0 0 1 14.2848 53.2992l-0.05632 0.1024a39.04512 39.04512 0 0 1-53.376 14.30016l-108.25728-62.6176a39.05024 39.05024 0 0 1-14.2848-53.2992l0.05632-0.09728a39.04512 39.04512 0 0 1 53.376-14.30016z m-39.14752-250.3424l108.25728-62.61248a39.04512 39.04512 0 0 1 53.376 14.30528l0.0512 0.09216a39.05024 39.05024 0 0 1-14.2848 53.30432L805.4784 406.528a39.04512 39.04512 0 0 1-53.376-14.30016l-0.0512-0.09728a39.05024 39.05024 0 0 1 14.27968-53.2992z" fill="#FB813A"></path></svg> \ No newline at end of file diff --git a/assets/img/video_up.svg b/assets/img/video_up.svg deleted file mode 100644 index e8987f5..0000000 --- a/assets/img/video_up.svg +++ /dev/null @@ -1,6 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024"> -<path fill="#17AACC" d="M618,131.5l47-47c41.7-47.6-25-112.2-72-71l-107,106c-3.3,3.3-6,7-8,11H361c-1.3-2.7-3.3-5-6-7l-112-111 - c-21.3-17.3-51-17-71,3s-20.3,49.7-3,71l45,44H105c-56.7,0-105,48.3-105,105v417c0,56.7,48.3,105,105,105h57 - c-17.9,49.6,19.9,105,73.5,105c55.4,0,90.4-55.3,74.5-105h218c-15.9,49.7,19.1,105,74.5,105c53.6,0,91.4-55.4,73.5-105h57 - c56.7,0,105-48.3,105-105v-417c0-57.6-48.3-104-105-104L618,131.5L618,131.5z"/> -</svg> diff --git a/assets/zone_icon/ad.svg b/assets/zone_icon/ad.svg deleted file mode 100644 index 3004bbf..0000000 --- a/assets/zone_icon/ad.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M576.768 153.6c32.768-32.512 132.096 13.824 221.952 103.68s136.448 189.184 103.68 221.952a27.648 27.648 0 0 1-6.144 4.608c-37.632 22.784-640 377.6-640 377.6a110.592 110.592 0 0 1-48.384-30.976 140.288 140.288 0 0 1-34.56-49.152s381.184-588.8 399.36-620.8a34.56 34.56 0 0 1 4.096-6.912z" - fill="#9796ED"></path> - <path - d="M172.288 780.032c-4.864 3.328-35.328 19.968-51.2 28.928a18.688 18.688 0 0 0-9.728 19.456 104.192 104.192 0 0 0 31.488 58.368 117.504 117.504 0 0 0 59.392 33.024 19.2 19.2 0 0 0 19.968-8.448c10.752-17.152 32-51.2 33.024-51.2a110.592 110.592 0 0 1-48.384-30.976 140.288 140.288 0 0 1-34.56-49.152z" - fill="#9289F0"></path> - <path - d="M576.768 153.6c32.768-32.512 132.096 13.824 221.952 103.68s136.448 189.184 103.68 221.952a27.648 27.648 0 0 1-6.144 4.608c-37.632 22.784-102.4 60.16-102.4 60.16s-64-4.096-173.312-113.664c-102.4-102.4-112.128-171.008-112.128-171.008s39.936-61.696 62.464-98.816a34.56 34.56 0 0 1 5.888-6.912z" - fill="#F7DF88"></path> - <path - d="M680.45816 374.49224a230.144 83.712 45 1 0 118.386645-118.386645 230.144 83.712 45 1 0-118.386645 118.386645Z" - fill="#8683EA"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/animal.svg b/assets/zone_icon/animal.svg deleted file mode 100644 index 4f7708d..0000000 --- a/assets/zone_icon/animal.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M517.376 465.152a144.924444 144.924444 0 0 1 137.528889 99.214222c1.28 3.925333 2.275556 7.850667 2.901333 11.804445a132.266667 132.266667 0 0 1-14.279111 263.765333h-263.054222a132.266667 132.266667 0 0 1-14.250667-263.793778c0.625778-3.982222 1.592889-7.907556 2.872889-11.776a144.924444 144.924444 0 0 1 137.528889-99.214222h10.752zM420.693333 418.104889c50.261333-3.783111 85.617778-59.164444 79.047111-123.733333-6.599111-64.568889-52.650667-113.891556-102.912-110.108445-50.232889 3.754667-85.617778 59.164444-79.018666 123.733333 6.599111 64.568889 52.650667 113.863111 102.912 110.08zM603.306667 418.104889c50.232889 3.754667 96.284444-45.511111 102.883555-110.108445 6.599111-64.568889-28.785778-119.978667-79.018666-123.733333-50.261333-3.783111-96.312889 45.511111-102.912 110.08-6.599111 64.568889 28.785778 119.978667 79.018666 123.733333zM717.425778 551.139556c39.082667 21.816889 96.910222-4.266667 129.137778-58.225778 32.256-53.959111 26.709333-115.370667-12.373334-137.187556-39.111111-21.816889-96.938667 4.266667-129.166222 58.225778-32.256 53.959111-26.709333 115.370667 12.401778 137.187556zM306.574222 551.139556c39.111111-21.816889 44.657778-83.228444 12.401778-137.187556-32.227556-53.959111-90.055111-80.042667-129.137778-58.225778-39.111111 21.816889-44.657778 83.228444-12.430222 137.187556 32.256 53.959111 90.083556 80.042667 129.166222 58.225778z" - fill="#FB7299"></path> - <path - d="M621.511111 113.777778c76.231111-0.938667 138.467556 74.012444 149.504 173.340444 37.745778-13.312 75.861333-12.913778 107.292445 4.323556 70.712889 38.769778 80.753778 147.968 22.442666 243.911111a272.327111 272.327111 0 0 1-71.111111 78.336c9.159111 22.869333 14.222222 47.843556 14.222222 73.984V711.111111a199.111111 199.111111 0 0 1-199.111111 199.111111h-265.500444a199.111111 199.111111 0 0 1-199.111111-199.111111v-23.438222c0-26.168889 5.063111-51.114667 14.222222-74.012445a272.099556 272.099556 0 0 1-71.111111-78.307555c-58.311111-95.943111-48.270222-205.141333 22.442666-243.911111 31.431111-17.237333 69.546667-17.635556 107.320889-4.352C264.021333 187.790222 326.257778 112.839111 402.488889 113.777778c42.410667 0.540444 81.152 24.462222 109.511111 62.776889 28.359111-38.286222 67.100444-62.236444 109.511111-62.776889z" - fill="#FFD7E7"></path> - <path - d="M512 465.152a141.198222 141.198222 0 0 1 134.741333 98.958222l0.085334 0.256c1.905778 6.087111 3.015111 12.231111 3.356444 18.289778a132.266667 132.266667 0 0 1-9.728 264.163556h-256.910222a132.266667 132.266667 0 0 1-9.671111-264.192l-0.199111 4.579555c0-7.736889 1.194667-15.445333 3.498666-22.840889l0.085334-0.284444A141.198222 141.198222 0 0 1 512 465.180444zM420.693333 418.104889c50.261333-3.783111 85.617778-59.164444 79.047111-123.733333-6.599111-64.568889-52.650667-113.891556-102.912-110.108445-50.232889 3.754667-85.617778 59.164444-79.018666 123.733333 6.599111 64.568889 52.650667 113.863111 102.912 110.08zM603.306667 418.104889c50.232889 3.754667 96.284444-45.511111 102.883555-110.108445 6.599111-64.568889-28.785778-119.978667-79.018666-123.733333-50.261333-3.783111-96.312889 45.511111-102.912 110.08-6.599111 64.568889 28.785778 119.978667 79.018666 123.733333zM717.425778 551.139556c39.082667 21.816889 96.910222-4.266667 129.137778-58.225778 32.256-53.959111 26.709333-115.370667-12.373334-137.187556-39.111111-21.816889-96.938667 4.266667-129.166222 58.225778-32.256 53.959111-26.709333 115.370667 12.401778 137.187556zM306.574222 551.139556c39.111111-21.816889 44.657778-83.228444 12.401778-137.187556-32.227556-53.959111-90.055111-80.042667-129.137778-58.225778-39.111111 21.816889-44.657778 83.228444-12.430222 137.187556 32.256 53.959111 90.083556 80.042667 129.166222 58.225778z" - fill="#FB7299"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/anime.svg b/assets/zone_icon/anime.svg deleted file mode 100644 index fd797d3..0000000 --- a/assets/zone_icon/anime.svg +++ /dev/null @@ -1,16 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M588.8 359.68l-12.032-7.424 150.272-206.592a30.976 30.976 0 0 0-51.2-36.352l-153.6 210.176L281.6 170.24a30.976 30.976 0 1 0-33.024 52.736L486.4 369.92l-22.784 31.488a30.976 30.976 0 1 0 51.2 36.352l25.6-35.072 16.128 9.728A30.976 30.976 0 1 0 588.8 359.68z" - fill="#FB813A"></path> - <path d="M763.648 850.688m-53.248 0a53.248 53.248 0 1 0 106.496 0 53.248 53.248 0 1 0-106.496 0Z" fill="#FB813A"> - </path> - <path d="M261.12 797.44a53.248 53.248 0 1 0 53.504 53.248 53.248 53.248 0 0 0-53.504-53.248z" fill="#FB813A"></path> - <path - d="M141.312 314.368m92.928 0l556.288 0q92.928 0 92.928 92.928l0 360.704q0 92.928-92.928 92.928l-556.288 0q-92.928 0-92.928-92.928l0-360.704q0-92.928 92.928-92.928Z" - fill="#FDDE80"></path> - <path d="M520.448 575.232m-128.256 0a128.256 128.256 0 1 0 256.512 0 128.256 128.256 0 1 0-256.512 0Z" - fill="#FFFFFF"></path> - <path - d="M476.928 546.56c0-26.88 19.2-37.632 42.24-25.6l49.664 28.672a25.6 25.6 0 0 1 0 48.64l-49.664 28.672c-23.04 13.568-42.24 2.56-42.24-24.32z" - fill="#FB813A"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/car.svg b/assets/zone_icon/car.svg deleted file mode 100644 index 6d30f0a..0000000 --- a/assets/zone_icon/car.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M210.688 588.8h25.6a51.2 51.2 0 0 1 51.2 45.568l14.08 128A51.2 51.2 0 0 1 256 819.2H225.024a51.2 51.2 0 0 1-51.2-45.568l-14.08-128A51.2 51.2 0 0 1 204.8 588.8zM788.224 588.8h25.6a51.2 51.2 0 0 1 51.2 51.2 41.984 41.984 0 0 1 0 5.632l-14.08 128a51.2 51.2 0 0 1-51.2 45.568h-25.6a51.2 51.2 0 0 1-51.2-51.2 41.984 41.984 0 0 1 0-5.632l14.08-128a51.2 51.2 0 0 1 51.2-45.568zM906.496 392.96a38.656 38.656 0 0 1-25.6 48.128l-25.6 7.424a38.4 38.4 0 0 1-22.528-73.472l25.6-7.424a38.144 38.144 0 0 1 48.128 25.344zM215.296 422.912a38.4 38.4 0 0 1-47.872 25.6l-25.6-7.424a38.656 38.656 0 0 1-25.6-48.128 38.144 38.144 0 0 1 47.872-25.6l25.6 7.424a38.4 38.4 0 0 1 25.6 48.128z" - fill="#23ADE5"></path> - <path - d="M292.608 201.216A1109.76 1109.76 0 0 1 512 179.2a1165.568 1165.568 0 0 1 224 22.016 51.2 51.2 0 0 1 38.144 32L870.4 486.4v230.4a25.6 25.6 0 0 1-25.6 25.6H179.2a25.6 25.6 0 0 1-25.6-25.6v-230.4l102.4-253.696a51.2 51.2 0 0 1 36.608-31.488z" - fill="#48CFE5"></path> - <path - d="M204.8 512m25.6 0l102.4 0q25.6 0 25.6 25.6l0 25.6q0 25.6-25.6 25.6l-102.4 0q-25.6 0-25.6-25.6l0-25.6q0-25.6 25.6-25.6Z" - fill="#FFFFFF"></path> - <path - d="M665.6 512m25.6 0l102.4 0q25.6 0 25.6 25.6l0 25.6q0 25.6-25.6 25.6l-102.4 0q-25.6 0-25.6-25.6l0-25.6q0-25.6 25.6-25.6Z" - fill="#FFFFFF"></path> - <path - d="M327.68 270.848a1000.96 1000.96 0 0 1 172.032-14.848 1429.248 1429.248 0 0 1 196.864 15.36 25.6 25.6 0 0 1 20.992 18.176l39.68 134.656a25.6 25.6 0 0 1-17.408 31.744 24.064 24.064 0 0 1-9.472 0q-125.184-12.032-230.4-12.032a1894.4 1894.4 0 0 0-204.8 11.264 25.6 25.6 0 0 1-28.16-22.784 25.6 25.6 0 0 1 0-9.984L307.2 288.768a25.6 25.6 0 0 1 20.48-17.92z" - fill="#FDDE80"></path> - <path - d="M614.4 358.4a102.4 102.4 0 0 0-100.864 86.784h51.2a51.2 51.2 0 0 1 99.072 5.12l51.2 4.352A102.4 102.4 0 0 0 614.4 358.4z" - fill="#23ADE5"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/cinephile.svg b/assets/zone_icon/cinephile.svg deleted file mode 100644 index cad39f4..0000000 --- a/assets/zone_icon/cinephile.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M147.2 201.728m79.616 0l571.136 0q79.616 0 79.616 79.616l0 458.24q0 79.616-79.616 79.616l-571.136 0q-79.616 0-79.616-79.616l0-458.24q0-79.616 79.616-79.616Z" - fill="#9796ED"></path> - <path - d="M222.976 269.312h77.056v57.856H222.976zM390.144 269.312h77.056v57.856h-77.056zM557.312 269.312h77.056v57.856h-77.056zM724.48 269.312h77.056v57.856H724.48zM222.976 693.76h77.056v57.856H222.976zM390.144 693.76h77.056v57.856h-77.056zM557.312 693.76h77.056v57.856h-77.056zM147.2 375.296h730.368v270.08H147.2z" - fill="#7B78EA"></path> - <path - d="M521.369822 529.707066m23.351494-23.351495l2.534271-2.53427q23.351494-23.351494 46.702989 0l199.664327 199.664327q23.351494 23.351494 0 46.702989l-2.534271 2.534271q-23.351494 23.351494-46.702988 0l-199.664328-199.664328q-23.351494-23.351494 0-46.702989Z" - fill="#FFD043"></path> - <path - d="M708.352 418.816h-25.6v-24.32a13.568 13.568 0 0 0-13.568-13.568H665.6a13.312 13.312 0 0 0-13.312 13.568v24.32h-25.6a13.568 13.568 0 0 0-13.568 13.568v5.632a13.568 13.568 0 0 0 13.568 13.568h25.6v24.32a13.312 13.312 0 0 0 13.312 13.568h5.632a13.568 13.568 0 0 0 13.568-13.568v-24.32h25.6a13.312 13.312 0 0 0 13.312-13.568v-5.632a13.312 13.312 0 0 0-15.36-13.568zM517.888 418.816h-25.6v-24.32a13.312 13.312 0 0 0-13.312-13.568h-5.632a13.568 13.568 0 0 0-13.568 13.568v24.32H435.2a13.312 13.312 0 0 0-13.312 13.568v5.632a13.312 13.312 0 0 0 13.312 13.568h25.6v24.32a13.568 13.568 0 0 0 13.568 13.568h5.632a13.312 13.312 0 0 0 13.312-13.568v-24.32h25.6a13.312 13.312 0 0 0 13.312-13.568v-5.632a13.312 13.312 0 0 0-14.336-13.568zM493.568 572.16h-18.432v-18.432a10.24 10.24 0 0 0-10.24-10.24H460.8a10.24 10.24 0 0 0-10.24 10.24v18.432h-18.432a10.24 10.24 0 0 0-10.24 10.24v4.352a10.24 10.24 0 0 0 10.24 10.24h18.432V614.4a10.24 10.24 0 0 0 10.24 10.24h4.352a10.24 10.24 0 0 0 10.24-10.24v-18.432h18.432a10.24 10.24 0 0 0 10.24-10.24v-4.352a10.24 10.24 0 0 0-10.496-9.216z" - fill="#FFD778"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/comic.svg b/assets/zone_icon/comic.svg deleted file mode 100644 index bb78da2..0000000 --- a/assets/zone_icon/comic.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M722.204444 843.491556H170.524444a70.144 70.144 0 0 1-69.973333-69.916445V400.896a70.144 70.144 0 0 1 69.973333-69.944889H722.204444a70.144 70.144 0 0 1 69.916445 69.973333v372.622223a70.144 70.144 0 0 1-69.916445 69.944889" - fill="#FDDE80"></path> - <path - d="M710.314667 341.703111c22.613333-7.338667 38.200889-29.098667 36.067555-52.792889a143.616 143.616 0 0 0-6.542222-32.142222c-39.480889-121.628444-229.12-169.045333-423.566222-105.898667C121.799111 214.016-3.783111 363.804444 35.697778 485.461333c3.413333 10.524444 7.992889 20.451556 13.596444 29.809778 12.231111 20.423111 37.603556 28.871111 60.216889 21.532445l600.803556-195.100445z" - fill="#9796ED"></path> - <path - d="M281.031111 123.676444l11.235556 34.616889c4.977778 15.331556 21.617778 23.779556 36.920889 18.801778 15.331556-4.977778 23.808-21.589333 18.830222-36.920889l-11.235556-34.588444a29.383111 29.383111 0 0 0-36.920889-18.801778c-15.36 4.949333-23.808 21.589333-18.830222 36.892444" - fill="#7B78EB"></path> - <path - d="M444.16 714.069333a139.747556 139.747556 0 0 0 138.296889-119.552 17.493333 17.493333 0 0 0-17.123556-20.195555h-242.346666a17.493333 17.493333 0 0 0-17.123556 20.195555 139.776 139.776 0 0 0 138.296889 119.552" - fill="#FFAF66"></path> - <path - d="M704.796444 680.903111L618.951111 640.284444s12.288 55.751111 71.395556 92.672c-0.085333 0.739556-0.284444 1.422222-0.369778 2.190223-12.714667 94.549333 38.200889 179.399111 113.692444 189.553777 75.491556 10.126222 146.972444-58.311111 159.687111-152.860444 12.686222-94.520889-38.200889-179.399111-113.720888-189.525333-60.017778-8.078222-117.418667 33.649778-144.839112 98.588444z" - fill="#9796ED"></path> - <path - d="M856.064 682.012444l-19.797333 99.157334a6.570667 6.570667 0 0 1-6.456889 5.290666h-17.777778a6.599111 6.599111 0 0 1-6.542222-7.537777l14.478222-99.128889a6.542222 6.542222 0 0 1 6.485333-5.660445h23.153778c4.181333 0 7.281778 3.811556 6.456889 7.879111m-22.897778 136.078223l-2.986666 16.298666a6.570667 6.570667 0 0 1-6.456889 5.404445h-20.963556a6.599111 6.599111 0 0 1-6.485333-7.651556l2.645333-16.270222a6.599111 6.599111 0 0 1 6.485333-5.546667h21.276445c4.124444 0 7.253333 3.726222 6.485333 7.765334" - fill="#C5C2FF"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/dance.svg b/assets/zone_icon/dance.svg deleted file mode 100644 index 87a5ad1..0000000 --- a/assets/zone_icon/dance.svg +++ /dev/null @@ -1,10 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M956.672 513.792a476.416 476.416 0 0 0-890.368 0L512 727.296l-95.232 45.568a117.76 117.76 0 0 0 192.256 0L512 727.04z" - fill="#FC6B8A"></path> - <path d="M512 727.296l208.64-99.84a222.976 222.976 0 0 0-416.768 0z" fill="#FFFFFF"></path> - <path d="M405.4528 751.5392l541.184-258.5856 14.0288 29.312-541.184 258.6112z" fill="#FF5C7A"></path> - <path - d="M666.624 545.792l-18.688-15.36-112.64 135.424 40.192-173.056-23.552-5.632-40.192 172.544-40.448-172.544-23.808 5.632 40.704 173.056-112.896-135.424-18.688 15.36 111.616 134.144-391.68-186.88-13.824 29.184 541.184 258.56 14.08-29.44-87.552-41.728 136.192-163.84z" - fill="#F14767"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/digital.svg b/assets/zone_icon/digital.svg deleted file mode 100644 index 56ea8f9..0000000 --- a/assets/zone_icon/digital.svg +++ /dev/null @@ -1,13 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M298.496 284.928l17.664-51.2a36.608 36.608 0 0 1 33.28-22.016h325.376a37.12 37.12 0 0 1 34.304 22.016l17.408 51.2h88.576a69.376 69.376 0 0 1 66.56 70.656v377.344a69.12 69.12 0 0 1-67.84 70.144H209.92a69.12 69.12 0 0 1-68.352-70.144V355.584a69.376 69.376 0 0 1 68.352-70.656z" - fill="#FFBA7B"></path> - <path d="M141.568 457.728h740.096v271.36a69.632 69.632 0 0 1-73.728 73.984H210.688a69.12 69.12 0 0 1-69.12-69.376z" - fill="#FB952C"></path> - <path d="M512 358.4a197.376 197.376 0 1 1-197.376 197.376A197.632 197.632 0 0 1 512 358.4z" fill="#FB952C"></path> - <path d="M512 409.6a148.224 148.224 0 1 1-147.968 147.968A147.968 147.968 0 0 1 512 409.6z" fill="#FFFFFF"></path> - <path d="M512 457.728a98.816 98.816 0 1 1-98.56 98.56A98.56 98.56 0 0 1 512 457.728z" fill="#FB952C"></path> - <path - d="M733.696 358.4h73.984a25.6 25.6 0 0 1 25.6 25.6 25.6 25.6 0 0 1-25.6 25.6h-73.984a25.6 25.6 0 0 1-25.6-25.6 25.6 25.6 0 0 1 25.6-25.6z" - fill="#FFFFFF"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/documentary.svg b/assets/zone_icon/documentary.svg deleted file mode 100644 index fcaf707..0000000 --- a/assets/zone_icon/documentary.svg +++ /dev/null @@ -1,31 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M404.9 386.765c-70.8975-2.565-143.3475 12.06-196.65 38.1825-48.8475 23.9625-117.63 89.46-121.9275 135.5625h735.3225c-3.2175 0-12.015-9.4275-14.7375-11.52-5.0175-3.825-9.7425-7.8075-14.76-11.5425-11.9025-8.91-24.66-16.8975-37.1475-24.975a1040.175 1040.175 0 0 0-77.0625-45.585c-52.47-27.945-107.865-50.805-165.69-65.0025a533.88 533.88 0 0 0-107.3475-15.12" - fill="#47CFE5"></path> - <path - d="M744.605 489.1625c-12.7125 32.31-136.71 36.765-181.395 36.765H137.8025c-15.2325 0-29.7675 5.1975-39.7575 14.265-9.9 8.9775-14.1075 20.7675-11.7 32.355 0 0.1125 0 0.27 0.09 0.3375 9.2925 43.6725 35.73 83.34 76.365 114.6825 1.62 1.26 3.2625 2.52 4.9275 3.735 106.74 78.4575 292.5225 81.1575 423.45 43.875 41.445-11.79 80.865-28.17 115.1775-49.635 38.9925-24.39 78.795-57.3075 102.3075-91.7325 3.465-5.0625 41.22-61.1775 41.9625-60.885l-106.02-43.7625z" - fill="#47CFE5"></path> - <path - d="M918.0575 505.3175l-29.88-17.0775a75.0825 75.0825 0 0 0-70.11-2.1375 75.375 75.375 0 0 0-37.4175-59.355l-29.925-17.0775a11.4525 11.4525 0 0 0-15.66 4.275l-7.83 13.7025a59.0625 59.0625 0 0 0 21.96 80.5725l15.795 9.045a0.045 0.045 0 0 1-0.045 0.045l51.48 29.43 0.045-0.045 17.46 9.99a59.085 59.085 0 0 0 80.5725-21.9375l7.83-13.725a11.5425 11.5425 0 0 0-4.275-15.705" - fill="#2BBAE4"></path> - <path - d="M654.515 712.4975C351.3275 720.8675 266.3 564.425 266.3 564.425H85.7825a31.995 31.995 0 0 0 0.63 8.46c9.2925 43.6725 35.73 83.34 76.365 114.6825 1.62 1.2825 3.2625 2.52 4.9275 3.735 106.7175 78.4575 292.5 81.18 423.4275 43.875a509.6925 509.6925 0 0 0 63.3825-22.68" - fill="#E5E6E6"></path> - <path - d="M654.515 712.4975c-65.16 1.8-120.15-4.41-166.5675-14.2425-49.005-10.3725-26.1675 59.31-3.2175 56.79 37.485-4.0725 73.665-10.5975 106.4025-19.9125a502.3575 502.3575 0 0 0 63.3825-22.635" - fill="#E4E5E4"></path> - <path - d="M407.1275 674.9225c21.5775 69.84 69.705 117.6525 116.775 113.6475 3.735-0.3375 6.2325-4.0725 5.5125-7.74l-24.435-125.6175a5.715 5.715 0 0 0-6.6825-4.5l-86.715 16.8975a5.7825 5.7825 0 0 0-4.455 7.3125" - fill="#47CFE5"></path> - <path d="M441.2375 614.7125a29.295 29.295 0 1 1-58.6125 0.0225 29.295 29.295 0 0 1 58.6125-0.0225" fill="#0099BC"> - </path> - <path - d="M252.5975 310.4675a64.2825 64.2825 0 0 1 64.305-64.1025c18.81 0 35.73 8.1225 47.52 21.1275a64.17 64.17 0 0 1 111.7125 42.975 16.56 16.56 0 0 1-16.5825 16.5825 16.56 16.56 0 0 1-16.605-16.5825 31.05 31.05 0 0 0-61.9875-2.16h-0.18l0.1125 77.4675a16.5825 16.5825 0 1 1-33.1875 0v-75.3975c0-17.0325-13.9275-30.9375-30.96-30.9375a31.05 31.05 0 0 0-31.0275 31.0275 16.56 16.56 0 1 1-33.12 0" - fill="#47CFE5"></path> - <path - d="M364.3325 408.0275a22.2525 22.2525 0 0 1-22.2075-22.23V310.4a25.3575 25.3575 0 1 0-50.715 0.09 22.23 22.23 0 0 1-44.415 0c0-38.4525 31.365-69.75 69.9075-69.75a69.75 69.75 0 0 1 47.52 18.765 70.2 70.2 0 0 1 47.61-18.765c38.4525 0 69.75 31.2975 69.75 69.75a22.23 22.23 0 0 1-44.4375 0 25.425 25.425 0 0 0-50.7375-1.7775l-0.1575 2.385 0.09 74.7a22.2525 22.2525 0 0 1-22.2075 22.23z m-47.5425-134.19c20.16 0 36.5625 16.4025 36.5625 36.5625v75.42a10.98 10.98 0 1 0 21.915 0l-0.09-83.0925h0.9225a36.7425 36.7425 0 0 1 35.82-28.8675c20.205 0 36.6525 16.4475 36.6525 36.6525a10.98 10.98 0 0 0 21.9375 0c0-32.265-26.235-58.5-58.5-58.5-16.4475 0-32.2875 7.02-43.4475 19.305l-4.1625 4.545-4.1625-4.6125a58.635 58.635 0 0 0-43.335-19.2825 58.635 58.635 0 0 0-58.6575 58.5 10.9575 10.9575 0 0 0 21.915 0 36.675 36.675 0 0 1 36.63-36.63z" - fill="#47CFE5"></path> - <path - d="M389.87 621.2825h-66.33a47.79 47.79 0 0 1-35.0325-15.5925l-23.715-25.695a28.575 28.575 0 0 0-20.88-9.2925H91.0475a6.525 6.525 0 1 1 0-13.095h152.8875c11.4525 0 22.5675 4.9275 30.4875 13.5225l23.715 25.7175c6.66 7.2 15.93 11.34 25.425 11.34h66.33a6.525 6.525 0 1 1-0.0225 13.095" - fill="#0099BC"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/douga.svg b/assets/zone_icon/douga.svg deleted file mode 100644 index 5cf324c..0000000 --- a/assets/zone_icon/douga.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M273.408 166.912h477.696c58.368 0 105.984 47.616 105.984 105.984v477.696c0 58.368-47.616 105.984-105.984 105.984H273.408c-58.368 0-105.984-47.616-105.984-105.984V273.408C166.912 215.04 215.04 166.912 273.408 166.912z" - fill="#7B78EB"></path> - <path - d="M512 525.312v98.816c33.28-14.848 72.704 0.512 87.552 33.792 14.848 33.28-0.512 72.704-33.792 87.552-16.896 7.68-35.84 7.68-53.248 0v111.616H273.408c-58.368 0-105.984-47.616-105.984-105.984V512h137.216c-21.504 19.456-24.064 53.248-4.608 74.752 19.456 21.504 53.248 24.064 74.752 4.608 21.504-18.944 24.064-53.248 4.608-74.752l-4.608-4.608H512v-40.96c-4.096 0.512-9.216 0.512-13.312 0-51.2 0-86.016-47.616-86.016-105.984s20.992-108.032 86.016-108.032h13.312V166.912h238.592c58.368 0 105.984 47.616 105.984 105.984v251.904h-120.832c20.992-23.552 19.456-59.392-3.584-80.896-23.552-20.992-59.392-19.456-80.896 3.584-19.968 21.504-19.968 55.296 0 76.8H512z" - fill="#9796ED"></path> - <path - d="M512 525.312v98.816l13.312-4.096c35.84-7.68 72.704 15.872 79.872 52.224 7.68 35.84-18.432 72.192-54.272 78.848-4.096 1.024-8.704 1.024-13.312 1.024-9.216 0-16.384-3.072-25.088-6.144v111.616h-14.336v-132.608l18.432 8.192c27.136 11.776 58.368-0.512 70.144-27.648 11.776-27.136-0.512-58.368-27.648-70.144-13.312-5.632-28.672-5.632-42.496 0l-18.432 8.192v-117.76H399.872c14.848 33.28-0.512 72.704-33.792 87.552-33.28 14.848-72.704-0.512-87.552-33.792-7.68-16.896-7.68-35.84 0-53.248H166.912V512h137.216c-21.504 19.456-24.064 53.248-4.608 74.752 19.456 21.504 53.248 24.064 74.752 4.608 21.504-19.456 24.064-53.248 4.608-74.752l-4.608-4.608H512v-39.936h-13.312c-51.2 0-86.016-47.104-86.016-105.984s20.992-109.568 86.016-109.568h13.312V166.912h13.312v105.984h-26.624c-49.664 0-73.216 33.28-73.216 94.208 0 53.248 30.72 92.672 73.216 92.672 3.584 0.512 7.68 0.512 11.264 0l15.36-2.048V512h102.912c-13.824-35.84 4.096-76.8 40.448-90.624 35.84-13.824 76.8 4.096 90.624 40.448 6.144 15.872 6.144 33.792 0 50.176h97.792v13.312h-120.832c20.992-23.552 19.456-59.392-3.584-80.896-23.552-20.992-59.392-19.456-80.896 3.584-19.968 21.504-19.968 55.296 0 76.8H512z" - fill="#6A68C6"></path> - <path - d="M444.928 693.248c-23.04 13.312-52.224 5.12-65.024-17.408-4.096-7.68-6.144-15.36-6.144-24.064V392.192c0-26.624 20.992-47.616 47.616-47.616 8.704 0 16.896 2.048 24.576 6.656l221.696 132.608c23.04 13.312 30.208 42.496 16.896 65.024-4.096 6.656-10.24 12.8-16.896 16.896" - fill="#FDDE80"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/ent.svg b/assets/zone_icon/ent.svg deleted file mode 100644 index d938420..0000000 --- a/assets/zone_icon/ent.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M534.442796 378.982175m36.203867 36.203867l30.592268 30.592268q36.203867 36.203867 0 72.407734l-360.590518 360.590518q-36.203867 36.203867-72.407734 0l-30.592268-30.592268q-36.203867-36.203867 0-72.407735l360.590518-360.590517q36.203867-36.203867 72.407734 0Z" - fill="#FF8693"></path> - <path - d="M369.92 543.744l137.472-137.472a38.912 38.912 0 0 1 54.528 0l48.384 48.64a38.4 38.4 0 0 1 0 54.528l-137.984 137.984z" - fill="#FC6376"></path> - <path - d="M286.133941 631.021801m12.854616 12.85013l72.601422 72.576083q12.854616 12.850129 0.004486 25.704746l-1.62889 1.629458q-12.850129 12.854616-25.704745 0.004486l-72.601422-72.576083q-12.854616-12.850129-0.004486-25.704745l1.62889-1.629459q12.850129-12.854616 25.704745-0.004486Z" - fill="#FFA9B1"></path> - <path - d="M737.024 547.584a99.328 99.328 0 0 1 62.72-62.72l51.2-13.568a27.136 27.136 0 0 0 13.056-49.664L826.624 384a98.816 98.816 0 0 1-22.784-85.76l16.896-63.232c7.168-27.136-8.96-43.52-36.096-36.096l-63.232 16.896a98.816 98.816 0 0 1-85.76-23.04l-37.376-36.864a27.136 27.136 0 0 0-49.408 13.312l-13.824 51.2a97.792 97.792 0 0 1-62.464 62.72l-51.2 13.824a27.136 27.136 0 0 0-13.312 49.408L445.44 384a97.536 97.536 0 0 1 23.04 85.504l-16.896 63.232c-7.424 27.392 8.96 43.52 36.096 36.352l63.232-16.896a97.792 97.792 0 0 1 85.76 22.784l37.376 37.376a26.88 26.88 0 0 0 49.408-13.312z" - fill="#FDDE80"></path> - <path - d="M886.272 417.536l-74.752-75.008 30.464-114.432a41.216 41.216 0 0 0-8.704-41.472A41.728 41.728 0 0 0 791.808 179.2l-114.432 30.72-74.752-76.032A41.728 41.728 0 0 0 563.2 120.576a41.216 41.216 0 0 0-28.416 31.488l-27.392 102.4L404.48 281.6a42.24 42.24 0 0 0-31.744 28.16 42.24 42.24 0 0 0 13.312 40.448L460.8 425.216l-30.72 114.432a41.728 41.728 0 0 0 8.96 41.472 37.888 37.888 0 0 0 27.392 10.752 56.832 56.832 0 0 0 14.08-2.048l114.432-30.72 74.752 75.008a45.824 45.824 0 0 0 31.232 14.336 34.304 34.304 0 0 0 8.96 0 41.216 41.216 0 0 0 28.416-31.488l27.392-102.4 102.4-27.392a41.984 41.984 0 0 0 31.488-28.416 40.96 40.96 0 0 0-13.312-41.216z m-84.736-203.52h5.12a16.896 16.896 0 0 1 0 5.12l-25.6 93.696-72.96-73.728z m-32 139.776l-34.56 128-128 34.56-102.4-102.4 34.56-128 128-34.56z m-199.424-192c0-2.56 1.792-4.096 1.792-4.608a9.984 9.984 0 0 1 4.096 3.072l59.648 59.648-87.296 23.296z m-157.696 162.048L409.6 320a12.8 12.8 0 0 1 4.864-2.048l81.152-21.76-23.552 87.808z m58.368 230.4a18.944 18.944 0 0 1-5.12 0 17.92 17.92 0 0 1 0-5.12l25.6-93.696L563.2 528.64z m230.4 51.2c0 2.816-1.536 4.096-1.536 4.864a20.992 20.992 0 0 1-4.352-3.328l-59.392-59.392 87.296-23.552z m156.16-156.16l-81.152 21.76 23.296-87.04 59.392 59.392a40.96 40.96 0 0 1 3.328 3.84 12.8 12.8 0 0 1-4.096 2.56z" - fill="#FCC029"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/fashion.svg b/assets/zone_icon/fashion.svg deleted file mode 100644 index cfb6621..0000000 --- a/assets/zone_icon/fashion.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M691.2 204.8a44.032 44.032 0 0 1 29.952 34.048 117.76 117.76 0 0 1-13.056 76.8s-19.2 29.952-24.32 39.936a235.008 235.008 0 0 0-25.6 107.008v40.704H365.312v-39.424a235.008 235.008 0 0 0-25.6-107.008c-5.12-9.984-24.32-39.936-24.32-39.936a117.76 117.76 0 0 1-13.056-76.8A44.544 44.544 0 0 1 336.896 204.8V147.712a29.952 29.952 0 0 1 27.136-31.744 29.952 29.952 0 0 1 27.648 31.744v73.728A237.056 237.056 0 0 0 512 253.952a241.408 241.408 0 0 0 125.184-35.072V147.712a27.136 27.136 0 1 1 53.76 0z" - fill="#FF6A9B"></path> - <path - d="M658.432 487.936H365.312L204.8 780.288a36.352 36.352 0 0 0 10.24 46.592 492.288 492.288 0 0 0 595.456 0 36.608 36.608 0 0 0 8.704-47.36z" - fill="#FF9DC6"></path> - <path - d="M409.6 537.6a9.984 9.984 0 0 0-13.568 4.608l-124.16 250.624a10.496 10.496 0 0 0 4.608 13.568 14.848 14.848 0 0 0 4.608 0 9.984 9.984 0 0 0 8.96-5.632l124.16-250.88A10.24 10.24 0 0 0 409.6 537.6zM455.936 643.072a9.984 9.984 0 0 0-12.032 7.424l-40.448 170.752a10.24 10.24 0 0 0 7.424 12.288h2.304a9.728 9.728 0 0 0 9.728-7.936l40.448-170.752a9.984 9.984 0 0 0-7.424-11.776zM750.848 791.808l-124.16-250.624A9.984 9.984 0 0 0 614.4 537.6a10.24 10.24 0 0 0-4.608 13.312l124.16 250.88a9.984 9.984 0 0 0 8.96 5.632 14.848 14.848 0 0 0 4.608 0 10.496 10.496 0 0 0 3.328-15.616zM579.84 650.496a9.984 9.984 0 0 0-19.456 4.608l40.448 170.752a9.728 9.728 0 0 0 9.728 7.936h2.304a10.24 10.24 0 0 0 7.424-12.288z" - fill="#FF6A9B"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/food.svg b/assets/zone_icon/food.svg deleted file mode 100644 index e554eb5..0000000 --- a/assets/zone_icon/food.svg +++ /dev/null @@ -1,32 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M192.075294 503.883294m-75.294118 0a75.294118 75.294118 0 1 0 150.588236 0 75.294118 75.294118 0 1 0-150.588236 0Z" - fill="#FA942D"></path> - <path - d="M342.663529 411.211294m-75.294117 0a75.294118 75.294118 0 1 0 150.588235 0 75.294118 75.294118 0 1 0-150.588235 0Z" - fill="#FA942D"></path> - <path - d="M284.747294 480.722824m-75.294118 0a75.294118 75.294118 0 1 0 150.588236 0 75.294118 75.294118 0 1 0-150.588236 0Z" - fill="#FE5D79"></path> - <path - d="M765.470118 532.841412m-127.427765 0a127.427765 127.427765 0 1 0 254.855529 0 127.427765 127.427765 0 1 0-254.855529 0Z" - fill="#FA942D"></path> - <path - d="M632.259765 457.547294m-133.210353 0a133.210353 133.210353 0 1 0 266.420706 0 133.210353 133.210353 0 1 0-266.420706 0Z" - fill="#FA942D"></path> - <path - d="M672.798118 556.016941m-150.588236 0a150.588235 150.588235 0 1 0 301.176471 0 150.588235 150.588235 0 1 0-301.176471 0Z" - fill="#FE5D79"></path> - <path - d="M932.291765 474.925176a28.762353 28.762353 0 0 1 28.747294 28.762353l-0.045177 1.355295-0.090353 1.355294c-14.305882 150.919529-130.605176 272.865882-280.741647 299.188706l20.178824 80.745411a23.160471 23.160471 0 0 1-22.467765 28.777412H343.371294a23.160471 23.160471 0 0 1-22.467765-28.777412l20.178824-80.745411C192.813176 779.595294 77.552941 660.329412 60.928 512.015059l-0.557176-5.376a28.958118 28.958118 0 0 1 28.822588-31.713883h843.083294z" - fill="#FDDC7A"></path> - <path - d="M442.548706 196.924235h136.146823c21.263059 0 39.800471 14.456471 44.950589 35.087059l60.732235 242.913882H336.865882l60.732236-242.898823a46.336 46.336 0 0 1 44.950588-35.102118z" - fill="#F6C338"></path> - <path - d="M688.037647 192.903529c9.441882-30.177882 28.385882-29.409882 34.680471-47.585882 7.062588-20.449882 9.366588-45.718588 6.927058-75.821176 16.850824 17.935059 25.976471 37.014588 30.945883 62.283294 4.894118 24.937412-9.125647 44.182588-29.06353 74.480941-19.922824 30.313412-8.809412 67.614118 0 94.915765-16.850824-17.92-59.904-55.777882-43.474823-108.272942zM283.361882 154.247529c11.324235-37.707294 34.063059-36.773647 41.60753-59.482353 8.493176-25.554824 11.264-57.133176 8.31247-94.765176 20.239059 22.407529 31.201882 46.260706 37.165177 77.854118 5.872941 31.171765-10.947765 55.220706-34.876235 93.108706-23.943529 37.872941-10.601412 84.48 0 118.633411-20.239059-22.422588-71.936-69.722353-52.208942-135.348706z" - fill="#C6D2E1"></path> - <path - d="M510.629647 706.605176a92.672 92.672 0 0 1 92.672 92.672v115.832471H417.957647v-115.832471a92.672 92.672 0 0 1 92.672-92.672z" - fill="#F5BC20"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/game.svg b/assets/zone_icon/game.svg deleted file mode 100644 index 59a2188..0000000 --- a/assets/zone_icon/game.svg +++ /dev/null @@ -1,9 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M166.4 166.144m90.112 0l510.976 0q90.112 0 90.112 90.112l0 510.976q0 90.112-90.112 90.112l-510.976 0q-90.112 0-90.112-90.112l0-510.976q0-90.112 90.112-90.112Z" - fill="#58D598"></path> - <path d="M307.2 325.632h136.448v136.448H307.2zM580.096 325.632h136.448v136.448h-136.448z" fill="#17AD8A"></path> - <path - d="M443.648 462.336v75.776h-64.256v204.544h59.392v-68.096H585.216v68.096h59.136v-204.544h-64.256v-75.776h-136.448z" - fill="#17AD8A"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/guochuang.svg b/assets/zone_icon/guochuang.svg deleted file mode 100644 index a10c3e9..0000000 --- a/assets/zone_icon/guochuang.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M873.472 321.792c-46.08-46.592-102.4-73.472-161.536-40.192a177.152 177.152 0 0 0-51.2-161.536s-83.456 107.52-15.104 219.648c-12.288 13.568-24.32 27.136-36.352 39.424-26.88 27.136 14.592 69.12 41.216 41.984l68.608-69.632c40.704-40.96 76.8-23.808 112.896 12.288 26.624 26.88 68.096-15.104 41.472-41.984z" - fill="#58D598"></path> - <path - d="M705.024 344.576a189.696 189.696 0 0 0-270.848 0 195.072 195.072 0 0 0-41.216 62.464 249.088 249.088 0 0 0-177.664 74.496 256 256 0 0 0 0 359.68 248.576 248.576 0 0 0 354.816 0 256 256 0 0 0 73.472-179.2 190.976 190.976 0 0 0 61.44-41.728 195.84 195.84 0 0 0 0-275.712z" - fill="#FF5C7A"></path> - <path - d="M514.304 808.704a187.136 187.136 0 0 1-267.264-5.12 193.536 193.536 0 0 1 5.12-271.104s-45.056 120.832 43.776 214.272a210.176 210.176 0 0 0 218.368 61.952" - fill="#F14767"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/information.svg b/assets/zone_icon/information.svg deleted file mode 100644 index c33d838..0000000 --- a/assets/zone_icon/information.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M760.685714 768a21.942857 21.942857 0 0 0 19.836343 21.840457L782.628571 789.942857a21.942857 21.942857 0 0 0 21.840458-19.836343L804.571429 768V321.828571h29.257142a58.514286 58.514286 0 0 1 58.514286 58.514286v438.857143a58.514286 58.514286 0 0 1-58.514286 58.514286H190.171429a58.514286 58.514286 0 0 1-58.514286-58.514286V204.8a58.514286 58.514286 0 0 1 58.514286-58.514286h512a58.514286 58.514286 0 0 1 58.514285 58.514286v563.2z" - fill="#7DD3E0"></path> - <path - d="M219.428571 234.057143m29.257143 0l394.971429 0q29.257143 0 29.257143 29.257143l0 263.314285q0 29.257143-29.257143 29.257143l-394.971429 0q-29.257143 0-29.257143-29.257143l0-263.314285q0-29.257143 29.257143-29.257143Z" - fill="#3DA9D3"></path> - <path - d="M404.772571 300.514743l129.462858 80.925257a15.945143 15.945143 0 0 1 0 27.062857l-129.462858 80.925257a15.945143 15.945143 0 0 1-24.429714-13.531428V314.046171a15.945143 15.945143 0 0 1 24.429714-13.531428z" - fill="#FFD469"></path> - <path - d="M219.428571 614.4m29.257143 0l394.971429 0q29.257143 0 29.257143 29.257143l0 0q0 29.257143-29.257143 29.257143l-394.971429 0q-29.257143 0-29.257143-29.257143l0 0q0-29.257143 29.257143-29.257143Z" - fill="#3DA9D3"></path> - <path - d="M219.428571 731.428571m29.257143 0l219.428572 0q29.257143 0 29.257143 29.257143l0 0q0 29.257143-29.257143 29.257143l-219.428572 0q-29.257143 0-29.257143-29.257143l0 0q0-29.257143 29.257143-29.257143Z" - fill="#3DA9D3"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/kichiku.svg b/assets/zone_icon/kichiku.svg deleted file mode 100644 index 2d74f85..0000000 --- a/assets/zone_icon/kichiku.svg +++ /dev/null @@ -1,16 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M918.784 510.208a187.904 187.904 0 0 0-88.832-159.488 156.416 156.416 0 0 0 1.792-22.016 150.784 150.784 0 0 0-210.944-138.496 151.04 151.04 0 0 0-216.32 0 150.784 150.784 0 0 0-210.944 138.496 156.416 156.416 0 0 0 1.792 22.016 187.648 187.648 0 0 0-13.824 309.504v1.536a215.296 215.296 0 0 0 332.8 179.2 215.04 215.04 0 0 0 332.8-179.2v-2.56a187.904 187.904 0 0 0 71.68-148.992z" - fill="#FC6B8A"></path> - <path - d="M680.704 479.744A150.528 150.528 0 0 1 572.672 435.2a150.016 150.016 0 0 1-120.064 0 150.528 150.528 0 0 1-108.032 45.824h-11.264v167.168a166.4 166.4 0 0 0 165.888 165.888h33.536a166.4 166.4 0 0 0 165.888-165.888v-169.728a137.216 137.216 0 0 1-17.92 1.28z" - fill="#FFFFFF"></path> - <path d="M510.464 651.264m-33.536 0a33.536 33.536 0 1 0 67.072 0 33.536 33.536 0 1 0-67.072 0Z" fill="#E2006C"> - </path> - <path - d="M635.904 554.496H614.4v-21.504a12.032 12.032 0 0 0-11.776-11.776h-4.864a12.032 12.032 0 0 0-11.776 11.776v21.504h-21.248a11.776 11.776 0 0 0-11.776 11.52v5.12a11.776 11.776 0 0 0 11.776 11.52h21.248v21.504a12.032 12.032 0 0 0 11.776 11.776h4.864a12.032 12.032 0 0 0 11.776-11.776v-21.504h21.248a11.776 11.776 0 0 0 11.776-11.52v-5.12a11.776 11.776 0 0 0-11.52-11.52zM455.936 554.496H435.2v-21.504a12.032 12.032 0 0 0-11.776-11.776h-4.864a12.032 12.032 0 0 0-11.776 11.776v21.504H384a11.776 11.776 0 0 0-11.776 11.52v5.12a11.776 11.776 0 0 0 11.776 11.52h21.248v21.504a12.032 12.032 0 0 0 11.776 11.776h4.864a12.032 12.032 0 0 0 13.312-11.776v-21.504h21.248a11.52 11.52 0 0 0 11.776-11.52v-5.12a11.52 11.52 0 0 0-12.288-11.52z" - fill="#FF5C7A"></path> - <path - d="M600.32 651.008a12.288 12.288 0 0 0-12.288 12.544c0 34.048-34.816 61.696-76.8 61.696s-76.8-27.648-76.8-61.696a12.544 12.544 0 1 0-25.6 0c0 47.616 45.824 86.528 102.4 86.528s102.4-38.912 102.4-86.528a12.544 12.544 0 0 0-13.312-12.544z" - fill="#EB53A8"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/knowledge.svg b/assets/zone_icon/knowledge.svg deleted file mode 100644 index 8ede0d7..0000000 --- a/assets/zone_icon/knowledge.svg +++ /dev/null @@ -1,18 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M492.270933 147.729067A255.342933 255.342933 0 0 1 627.2 620.2624v51.2a37.546667 37.546667 0 0 1-25.6 34.133333h-221.866667a44.654933 44.654933 0 0 1-25.6-34.133333v-51.2a256.648533 256.648533 0 0 1 138.1376-472.533333z" - fill="#FFA200"></path> - <path - d="M550.4 534.929067v-76.8h51.2c46.609067 0 51.2-26.786133 51.2-42.666667v-128c0-23.1168-17.2032-42.666667-51.2-42.666667h-213.333333c-42.103467 0-59.733333 21.111467-59.733334 42.666667v76.8h102.4v-68.266667h119.466667v119.466667h-51.2c-60.501333-0.5632-76.8 24.405333-76.8 42.666667v76.8h128z m-62.6688 24.533333a59.733333 59.733333 0 1 1-59.733333 59.733333 59.733333 59.733333 0 0 1 59.733333-59.733333z" - fill="#FFF0D3"></path> - <path d="M354.133333 739.7376h273.066667v8.533333a128 128 0 0 1-128 128h-17.066667a128 128 0 0 1-128-128v-8.533333z" - fill="#5FB5EC"></path> - <path - d="M746.666667 210.6624h119.466666a17.066667 17.066667 0 0 1 0 34.133333h-119.466666a17.066667 17.066667 0 0 1 0-34.133333z m59.733333-59.733333a17.066667 17.066667 0 0 1 17.066667 17.066666v119.466667a17.066667 17.066667 0 0 1-34.133334 0v-119.466667a17.066667 17.066667 0 0 1 17.066667-17.066666z" - fill="#FFE074"></path> - <path - d="M157.866667 662.929067h119.466666a17.066667 17.066667 0 0 1 0 34.133333h-119.466666a17.066667 17.066667 0 0 1 0-34.133333z m59.733333-59.733334a17.066667 17.066667 0 0 1 17.066667 17.066667v119.466667a17.066667 17.066667 0 0 1-34.133334 0v-119.466667a17.066667 17.066667 0 0 1 17.066667-17.066667z" - fill="#FFE074"></path> - <path d="M200.533333 662.9376h34.133334v34.133333h-34.133334z" fill="#FFE074"></path> - <path d="M789.333333 210.670933h34.133334v34.133334h-34.133334z" fill="#FFE074"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/life.svg b/assets/zone_icon/life.svg deleted file mode 100644 index ad03a79..0000000 --- a/assets/zone_icon/life.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M881.408 664.064V504.32a168.192 168.192 0 0 0-128-162.56l-7.936-1.792v144.896a12.288 12.288 0 0 1-14.592 11.776 170.752 170.752 0 0 0-30.464-2.816h-138.752v-27.648a37.632 37.632 0 0 1 11.776-27.648 175.872 175.872 0 0 0 57.856-135.68A179.2 179.2 0 0 0 460.8 132.352a175.872 175.872 0 0 0-180.992 176.128V409.6h32.256a225.536 225.536 0 0 0 15.872 19.2 36.608 36.608 0 0 1 9.472 25.6v42.496A193.792 193.792 0 0 0 179.2 712.96a197.12 197.12 0 0 0 197.12 166.656h325.12a148.48 148.48 0 0 0 45.568-6.144 217.088 217.088 0 0 0 64.256-31.744 176.896 176.896 0 0 0 18.176-15.616l4.608-4.352a156.16 156.16 0 0 0 47.36-111.872v-35.84c0.512-3.072 0.256-6.656 0-9.984z" - fill="#FFD778"></path> - <path - d="M468.736 238.592a40.192 40.192 0 1 0 40.192 40.192 40.192 40.192 0 0 0-40.192-40.192zM323.584 362.752H217.6a34.816 34.816 0 1 0 0 69.376h106.24a34.816 34.816 0 1 0 0-69.376z" - fill="#FB813A"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/movie.svg b/assets/zone_icon/movie.svg deleted file mode 100644 index 5f691a4..0000000 --- a/assets/zone_icon/movie.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M954.624 452.864H919.04v-168.96a37.376 37.376 0 0 0-25.6-36.608A36.608 36.608 0 0 0 846.848 281.6v170.24H199.936v-168.96a37.632 37.632 0 0 0-25.6-36.608A36.352 36.352 0 0 0 128 281.6v170.24H92.16a15.616 15.616 0 0 0-15.36 15.872v82.688a15.36 15.36 0 0 0 15.36 15.616h26.88v85.248a135.68 135.68 0 0 0 134.4 136.192h114.432a135.68 135.68 0 0 0 134.4-136.192v-20.992a7.936 7.936 0 0 1 7.68-7.936h25.6a7.68 7.68 0 0 1 7.68 7.936v20.992a135.936 135.936 0 0 0 134.4 136.192H793.6a135.68 135.68 0 0 0 134.4-136.192v-85.248h25.6a15.36 15.36 0 0 0 15.36-15.616v-81.664a15.616 15.616 0 0 0-15.36-15.872" - fill="#E5E6E6"></path> - <path - d="M361.216 727.552h-102.4A87.296 87.296 0 0 1 172.8 640v-79.872a61.184 61.184 0 0 1 60.416-61.44h153.6a61.184 61.184 0 0 1 60.416 61.44V640a87.296 87.296 0 0 1-86.528 87.552" - fill="#FF5C7A"></path> - <path - d="M685.568 727.552h102.4A87.296 87.296 0 0 0 873.984 640v-79.872a61.184 61.184 0 0 0-60.416-61.44h-153.6a61.184 61.184 0 0 0-60.416 61.44V640a87.296 87.296 0 0 0 86.528 87.552" - fill="#2CBAE5"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/music.svg b/assets/zone_icon/music.svg deleted file mode 100644 index 408c93c..0000000 --- a/assets/zone_icon/music.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M881.92 460.8A335.36 335.36 0 0 0 547.584 125.696h-73.216A335.616 335.616 0 0 0 139.776 460.8v313.6a18.688 18.688 0 0 0 18.432 18.688h41.984c13.568 46.336 37.888 80.384 88.576 80.384h98.304a37.376 37.376 0 0 0 37.376-36.864l1.28-284.672a36.864 36.864 0 0 0-37.12-37.12h-99.84a111.616 111.616 0 0 0-51.2 12.8v-73.216a242.432 242.432 0 0 1 241.664-241.664h67.328a242.176 242.176 0 0 1 241.408 241.664v74.496a110.592 110.592 0 0 0-54.272-14.08h-99.84a36.864 36.864 0 0 0-37.12 37.12v284.672a37.376 37.376 0 0 0 37.376 36.864h98.304c51.2 0 75.008-34.048 88.576-80.384h41.984a18.688 18.688 0 0 0 18.432-18.688z" - fill="#45C7DD"></path> - <path - d="M646.141043 825.220963m0.045396-32.511969l0.273801-196.095809q0.045395-32.511968 32.557364-32.466573l1.023999 0.00143q32.511968 0.045395 32.466573 32.557364l-0.273802 196.095809q-0.045395 32.511968-32.557363 32.466573l-1.023999-0.00143q-32.511968-0.045395-32.466573-32.557364Z" - fill="#FF5C7A"></path> - <path - d="M307.222608 825.246563m0.045395-32.511969l0.273801-196.095809q0.045395-32.511968 32.557364-32.466573l1.023999 0.00143q32.511968 0.045395 32.466573 32.557364l-0.273801 196.095809q-0.045395 32.511968-32.557364 32.466573l-1.023999-0.00143q-32.511968-0.045395-32.466573-32.557364Z" - fill="#FF5C7A"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/sports.svg b/assets/zone_icon/sports.svg deleted file mode 100644 index bd4c97e..0000000 --- a/assets/zone_icon/sports.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M497.8944 517.8624l23.8848 29.2608a58.5728 58.5728 0 0 1-5.6064 80.0512L241.9456 880.7424a47.7184 47.7184 0 0 1-65.6128-0.768 49.8176 49.8176 0 0 1-4.3008-66.816l108.5696-136.3712 126.1056-158.3616a58.5728 58.5728 0 0 1 91.1872-0.5632z" - fill="#1BAD8B"></path> - <path - d="M698.9312 153.6a117.1456 117.1456 0 0 1 11.4176 233.728l60.416 45.9008c4.352 3.328 10.1632 3.9168 15.104 1.5872l73.6256-34.6368a46.2848 46.2848 0 0 1 59.1104 17.5872 44.3392 44.3392 0 0 1-11.9296 59.3152l-125.952 90.2656a58.5728 58.5728 0 0 1-65.9456 1.5616l-66.048-42.752-44.1344 47.7696 70.6048 83.328c1.664 1.9456 3.2 4.0192 4.608 6.1952l1.9456 3.3024a58.5728 58.5728 0 0 1-22.8608 79.616l-192.1024 106.3424a49.3824 49.3824 0 0 1-65.7408-16.9984 52.096 52.096 0 0 1 11.904-68.5824l105.5488-83.1744-106.2912-68.3008-1.536-1.024a59.7504 59.7504 0 0 1-0.896-0.6144l-13.824-7.168a58.5728 58.5728 0 0 1-23.296-82.2784l71.68-118.8864-30.72-13.824a14.6432 14.6432 0 0 0-14.336 1.3312l-80.4864 55.6032a48.8704 48.8704 0 0 1-62.6688-5.9648 39.3472 39.3472 0 0 1 1.792-56.8576l128.2816-115.1488a58.5728 58.5728 0 0 1 57.4464-12.032l143.5392 47.2576A117.1456 117.1456 0 0 1 698.9312 153.6z" - fill="#57D59A"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/tech.svg b/assets/zone_icon/tech.svg deleted file mode 100644 index 4c3795b..0000000 --- a/assets/zone_icon/tech.svg +++ /dev/null @@ -1,12 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path d="M510.208 683.264h-114.176l-50.688 209.408H674.816l-50.688-209.408h-113.92z" fill="#FFD778"></path> - <path - d="M535.552 150.528v-28.16a25.6 25.6 0 1 0-51.2 0v28.16a271.872 271.872 0 0 0-244.992 269.568v97.28a25.6 25.6 0 0 0 26.88 26.88h487.936a25.6 25.6 0 0 0 25.6-26.88v-97.28a271.616 271.616 0 0 0-244.224-269.568z" - fill="#48CFE5"></path> - <path - d="M125.696 464.64m103.168 0l562.432 0q103.168 0 103.168 103.168l0 15.36q0 103.168-103.168 103.168l-562.432 0q-103.168 0-103.168-103.168l0-15.36q0-103.168 103.168-103.168Z" - fill="#2CBAE5"></path> - <path - d="M742.4 537.6a37.632 37.632 0 1 0 37.632 37.632A37.376 37.376 0 0 0 742.4 537.6zM276.736 537.6a37.632 37.632 0 1 0 37.632 37.632A37.632 37.632 0 0 0 276.736 537.6z" - fill="#FFD778"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_icon/teleplay.svg b/assets/zone_icon/teleplay.svg deleted file mode 100644 index a6a39af..0000000 --- a/assets/zone_icon/teleplay.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"> - <path - d="M271.616 247.808a212.224 212.224 0 0 0-49.664 172.8l25.6 126.72c56.832 21.76 60.16 87.552 67.328 149.248a1167.872 1167.872 0 0 1 190.208-14.08 1247.488 1247.488 0 0 1 196.096 14.08c7.68-61.696 4.352-126.72 59.904-148.736l25.6-128a211.712 211.712 0 0 0-49.92-172.288 218.624 218.624 0 0 0-165.12-74.752h-134.912a218.624 218.624 0 0 0-165.12 74.752" - fill="#FFB161"></path> - <path - d="M505.088 412.672l-34.816-34.56a19.456 19.456 0 0 0-27.392 27.392l25.6 25.6-25.6 25.6a19.456 19.456 0 0 0 27.392 27.392l34.816-34.56 35.072 34.56a18.688 18.688 0 0 0 13.568 5.632 19.456 19.456 0 0 0 13.824-33.024l-25.6-25.6 25.6-25.6a19.456 19.456 0 0 0-13.824-33.024 18.688 18.688 0 0 0-13.568 5.632z" - fill="#FFE494"></path> - <path - d="M822.016 482.56a130.816 130.816 0 0 0-133.888 128v68.864l-368.128 1.536v-69.376a130.304 130.304 0 0 0-120.32-128h-13.568A81.92 81.92 0 0 0 102.4 563.2a76.8 76.8 0 0 0 0 13.312 79.104 79.104 0 0 0 38.912 54.784l8.96 4.352h2.304a25.6 25.6 0 0 1 15.36 22.016v63.744a112.384 112.384 0 0 0 80.896 105.472 51.2 51.2 0 0 0 98.816 5.888h313.088a51.2 51.2 0 0 0 98.816-5.888 112.384 112.384 0 0 0 79.104-105.472V650.752a25.6 25.6 0 0 1 8.192-11.52h1.536l4.608-2.816a80.384 80.384 0 0 0 51.2-61.44v-12.032a81.92 81.92 0 0 0-83.712-79.616" - fill="#FB952C"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/ai.svg b/assets/zone_v2_icon/ai.svg deleted file mode 100644 index 797fd6f..0000000 --- a/assets/zone_v2_icon/ai.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M6.11152 13.3818L12.7385 13.3818L14.074 16.2091L4.77077 16.2091L6.11152 13.3818z" - fill="#00B9E7ff"></path> - <path - d="M7.51228 5.77233C7.6183 5.49296 7.88599 5.30823 8.18479 5.30823L10.302 5.30823C10.5325 5.30823 10.6918 5.53896 10.61 5.75451L5.38035 19.5351C5.27433 19.8144 5.00664 19.9992 4.70783 19.9992L3.15565 19.9992C2.65222 19.9992 2.30452 19.4953 2.48314 19.0247L7.51228 5.77233z" - fill="#00B9E7ff"></path> - <path - d="M17.7595 5.24761C17.3688 5.24499 17.0508 5.5496 17.0515 5.92584L17.0642 19.3231C17.0648 19.6966 17.3794 19.9991 17.7673 19.9991L19.4532 19.9991C19.8415 19.9991 20.1563 19.6959 20.1563 19.322L20.1563 5.93605C20.1563 5.56393 19.8444 5.26155 19.458 5.25897L17.7595 5.24761z" - fill="#59E0F9ff"></path> - <path - d="M11.4125 5.77007C11.3065 5.4907 11.0388 5.30597 10.74 5.30597L8.14548 5.30597L13.5445 19.5328C13.6505 19.8122 13.9182 19.9969 14.217 19.9969L15.7691 19.9969C16.2726 19.9969 16.6203 19.4931 16.4417 19.0224L11.4125 5.77007z" - fill="#59E0F9ff"></path> - <path - d="M21.8385 2.26096C21.9179 2.10202 22.1446 2.10202 22.224 2.26096L22.3536 2.52039C22.6034 3.02047 22.9711 3.45233 23.4249 3.77874L23.663 3.95005C23.7826 4.03605 23.7826 4.21395 23.663 4.29994L23.4249 4.47126C22.9711 4.79767 22.6034 5.22952 22.3536 5.72961L22.224 5.98904C22.1446 6.14798 21.9179 6.14798 21.8385 5.98904L21.7089 5.72961C21.4591 5.22952 21.0914 4.79767 20.6376 4.47126L20.3995 4.29994C20.2799 4.21395 20.2799 4.03605 20.3995 3.95005L20.6376 3.77874C21.0914 3.45233 21.4591 3.02047 21.7089 2.52039L21.8385 2.26096z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/animal.svg b/assets/zone_v2_icon/animal.svg deleted file mode 100644 index 74cb01e..0000000 --- a/assets/zone_v2_icon/animal.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M14.36582 3.67143C15.80352 3.65373 17.00323 4.92678 17.39434 6.70047C17.46086 7.00223 17.7719 7.19548 18.07651 7.14389C18.6671 7.04388 19.24147 7.11564 19.73645 7.38712C21.21533 8.19796 21.42538 10.48176 20.20589 12.48835C19.88563 13.02058 19.48099 13.49606 19.00848 13.89667C18.84211 14.0377 18.77798 14.26694 18.84067 14.47584C18.95462 14.85523 19.01606 15.25757 19.01606 15.67392L19.01606 16.1641C19.01606 17.26858 18.57734 18.32774 17.79638 19.1087C17.01542 19.88966 15.95626 20.32838 14.85178 20.32838L9.29912 20.32838C8.19468 20.32838 7.1355 19.88966 6.35456 19.1087C5.57361 18.32774 5.13488 17.26858 5.13488 16.1641L5.13488 15.67392C5.13488 15.25699 5.19634 14.85485 5.31033 14.47517C5.37301 14.26637 5.3088 14.03712 5.14245 13.89619C4.66991 13.49578 4.26526 13.02038 3.94509 12.48835C2.72556 10.48176 2.93556 8.19796 4.41446 7.38712C4.90967 7.11554 5.48421 7.04383 6.07527 7.14374C6.37981 7.19522 6.69059 7.0019 6.75702 6.70026C7.14757 4.92688 8.34733 3.65373 9.78518 3.67143C10.47494 3.68023 11.11843 3.98481 11.64941 4.49674C11.88154 4.72055 12.26957 4.72063 12.5017 4.49685C13.03267 3.98511 13.67597 3.68023 14.36582 3.67143z" - fill="#FF5C7Aff"></path> - <path - d="M11.7289 7.80475C11.84861 8.98123 11.20435 9.99031 10.28861 10.05924C9.3728 10.12819 8.53423 9.22949 8.41399 8.05301C8.29375 6.87653 8.93848 5.86693 9.85373 5.79852C10.76957 5.72959 11.60861 6.62827 11.7289 7.80475zM15.7225 8.05301C15.60221 9.23001 14.76317 10.12762 13.8479 10.05924C12.93264 9.99083 12.28733 8.98071 12.40762 7.80423C12.52781 6.62775 13.36694 5.72959 14.28269 5.79852C15.19795 5.86693 15.84269 6.87653 15.7225 8.05301zM18.16906 11.42227C17.58182 12.4055 16.52822 12.8807 15.8161 12.48317C15.10349 12.08573 15.0024 10.96675 15.59011 9.98358C16.17734 9.00041 17.23104 8.52516 17.94365 8.92267C18.65578 9.32019 18.75677 10.43914 18.16906 11.42227zM8.55615 9.98358C9.14388 10.96675 9.04281 12.08573 8.33018 12.48317C7.61808 12.8807 6.56443 12.4055 5.97671 11.42227C5.38951 10.43914 5.49057 9.32019 6.20319 8.92267C6.9153 8.52516 7.96895 9.00041 8.55615 9.98358z" - fill="#FFCFE6ff"></path> - <path - d="M12.17328 11.43072C12.72787 11.43072 13.26845 11.60534 13.71821 11.92982C13.89734 12.05904 14.06899 12.21734 14.21914 12.39619C14.67053 12.9337 15.25728 13.46515 15.83606 13.8623C16.0105 13.98192 16.16976 14.12496 16.30896 14.28874C16.70842 14.75875 16.91242 15.36394 16.8791 15.97978C16.84579 16.59562 16.57757 17.17526 16.12973 17.5993C15.68189 18.02342 15.08851 18.25968 14.47181 18.25949L9.67882 18.25949C9.06126 18.26083 8.46676 18.02506 8.018 17.60074C7.56923 17.17651 7.30045 16.59619 7.26714 15.97949C7.23383 15.36288 7.43852 14.75693 7.83897 14.28682C7.97802 14.12352 8.137 13.98096 8.31101 13.86173C8.89154 13.46381 9.5054 12.94397 9.94973 12.39821C10.10381 12.20899 10.27306 12.04474 10.43242 11.92982C10.88218 11.60534 11.42275 11.43072 11.97734 11.43072L12.17328 11.43072z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/car.svg b/assets/zone_v2_icon/car.svg deleted file mode 100644 index 9dd5705..0000000 --- a/assets/zone_v2_icon/car.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M21.24202 9.24032C21.31075 9.46754 21.28675 9.71272 21.1753 9.92231C21.06374 10.13194 20.87386 10.2888 20.64701 10.35888L20.0521 10.53139C19.93997 10.56576 19.82218 10.57776 19.70544 10.56653C19.5887 10.55539 19.47533 10.52141 19.37174 10.4664C19.26816 10.41149 19.17638 10.33661 19.1017 10.24618C19.02701 10.15574 18.97094 10.05152 18.93658 9.9394C18.90221 9.82728 18.89021 9.70949 18.90134 9.59275C18.91248 9.47601 18.94656 9.36261 19.00147 9.25902C19.05648 9.15543 19.13126 9.06369 19.2217 8.98902C19.31213 8.91435 19.41638 8.85823 19.52851 8.82385L20.12352 8.65131C20.23555 8.61552 20.35363 8.6024 20.47085 8.61272C20.58806 8.62304 20.70211 8.65659 20.80618 8.71141C20.91034 8.76624 21.0025 8.84124 21.07728 8.93204C21.15206 9.02286 21.20813 9.12765 21.24202 9.24032zM5.17807 9.93642C5.10935 10.16285 4.95356 10.35264 4.74493 10.46419C4.53631 10.57574 4.29192 10.59994 4.06548 10.53139L3.47052 10.35888C3.2437 10.2888 3.0538 10.13194 2.94231 9.92231C2.83084 9.71272 2.80684 9.46754 2.87556 9.24032C2.9089 9.12779 2.96424 9.02298 3.03839 8.932C3.11254 8.84102 3.20402 8.76568 3.30752 8.71033C3.41101 8.65499 3.52448 8.62074 3.64131 8.60959C3.75815 8.59843 3.87604 8.6106 3.98814 8.64536L4.5831 8.8179C4.69586 8.85188 4.80079 8.90785 4.89181 8.98257C4.98284 9.05729 5.05818 9.1493 5.11349 9.25328C5.16879 9.35725 5.20298 9.47115 5.21406 9.58839C5.22515 9.70564 5.21291 9.82393 5.17807 9.93642z" - fill="#00B9E7ff"></path> - <path - d="M6.97476 4.78406C8.65316 4.44467 10.36118 4.27327 12.07354 4.27239C13.82131 4.27461 15.56477 4.44596 17.27952 4.78406C17.47834 4.82236 17.6641 4.91076 17.81923 5.04089C17.97437 5.17104 18.0937 5.33861 18.16598 5.52776L20.34038 11.24707C20.38176 11.35603 20.40307 11.47171 20.40307 11.58826L20.40307 16.76659C20.40307 16.92442 20.34038 17.07571 20.22874 17.18726C20.11718 17.29882 19.96589 17.3615 19.80806 17.3615L4.33908 17.3615C4.18129 17.3615 4.02996 17.29882 3.91837 17.18726C3.8068 17.07571 3.74412 16.92442 3.74412 16.76659L3.74412 11.59834C3.74412 11.47526 3.76781 11.35325 3.8139 11.23901L6.12396 5.51586C6.19464 5.33331 6.30926 5.17102 6.45767 5.04336C6.60609 4.91571 6.7837 4.82665 6.97476 4.78406z" - fill="#00B9E7ff"></path> - <path - d="M5.529 12.00691L7.90884 12.00691C8.30549 12.00691 8.5038 12.20515 8.5038 12.60182L8.5038 13.19683C8.5038 13.59341 8.30549 13.79174 7.90884 13.79174L5.529 13.79174C5.13236 13.79174 4.93404 13.59341 4.93404 13.19683L4.93404 12.60182C4.93404 12.20515 5.13236 12.00691 5.529 12.00691z" - fill="#FDDE80ff"></path> - <path - d="M16.2383 12.00691L18.61814 12.00691C19.01482 12.00691 19.21315 12.20515 19.21315 12.60182L19.21315 13.19683C19.21315 13.59341 19.01482 13.79174 18.61814 13.79174L16.2383 13.79174C15.84173 13.79174 15.64339 13.59341 15.64339 13.19683L15.64339 12.60182C15.64339 12.20515 15.84173 12.00691 16.2383 12.00691z" - fill="#FDDE80ff"></path> - <path - d="M7.79001 6.40233C9.11029 6.17235 10.44797 6.05689 11.78813 6.05724C13.31962 6.07062 14.84832 6.1899 16.36339 6.41422C16.47677 6.43024 16.58304 6.47862 16.66954 6.55355C16.75613 6.62846 16.8192 6.72677 16.85126 6.83665L17.77344 9.96614C17.79533 10.04115 17.80224 10.11974 17.7937 10.19741C17.78525 10.27507 17.76154 10.35034 17.724 10.41878C17.68637 10.48733 17.63568 10.54771 17.57482 10.59667C17.51386 10.64554 17.44387 10.68202 17.3689 10.7039C17.29622 10.7185 17.22144 10.7185 17.14877 10.7039C15.20918 10.51747 13.42426 10.42426 11.79408 10.42426C10.20394 10.4255 8.61508 10.51286 7.0344 10.68605C6.95666 10.6943 6.87804 10.6871 6.80307 10.66502C6.72808 10.64285 6.6582 10.60608 6.59743 10.55693C6.53665 10.50778 6.48615 10.4471 6.44884 10.37837C6.41152 10.30963 6.38811 10.23427 6.37995 10.15651C6.36471 10.07993 6.36471 10.00109 6.37995 9.9245L7.31404 6.81879C7.3462 6.71165 7.40791 6.61574 7.4921 6.54207C7.57629 6.46841 7.67954 6.41997 7.79001 6.40233z" - fill="#59E1F9ff"></path> - <path - d="M3.74414 15.65299C3.74414 14.85763 4.38885 14.21299 5.18414 14.21299L5.28938 14.21299C6.08466 14.21299 6.72938 14.85763 6.72938 15.65299L6.72938 17.70653C6.72938 18.50189 6.08466 19.14653 5.28938 19.14653L5.18414 19.14653C4.38885 19.14653 3.74414 18.50189 3.74414 17.70653L3.74414 15.65299z" - fill="#00B9E7ff"></path> - <path - d="M17.42822 15.65299C17.42822 14.85763 18.07296 14.21299 18.86822 14.21299L18.97344 14.21299C19.7688 14.21299 20.41344 14.85763 20.41344 15.65299L20.41344 17.70653C20.41344 18.50189 19.7688 19.14653 18.97344 19.14653L18.86822 19.14653C18.07296 19.14653 17.42822 18.50189 17.42822 17.70653L17.42822 15.65299z" - fill="#00B9E7ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/cinephile.svg b/assets/zone_v2_icon/cinephile.svg deleted file mode 100644 index de746dc..0000000 --- a/assets/zone_v2_icon/cinephile.svg +++ /dev/null @@ -1,32 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.16093 18.89558L18.83645 18.89558C19.63171 18.89558 20.27645 18.25085 20.27645 17.45558L20.27645 6.34031C20.27645 5.54503 19.63171 4.90031 18.83645 4.90031L5.16094 4.90031C4.36565 4.90031 3.72094 5.54503 3.72094 6.34031L3.72094 17.45558C3.72094 18.25085 4.36565 18.89558 5.16093 18.89558z" - fill="#9796EDff"></path> - <path - d="M5.49187 7.15125C5.49187 7.54889 5.81423 7.87125 6.21187 7.87125L7.53881 7.87125C7.93645 7.87125 8.25881 7.54889 8.25881 7.15125C8.25881 6.75361 7.93645 6.43125 7.53881 6.43125L6.21187 6.43125C5.81423 6.43125 5.49187 6.75361 5.49187 7.15125z" - fill="#6D69E4ff"></path> - <path - d="M10.6897 7.15125C10.6897 7.54889 11.01206 7.87125 11.4097 7.87125L12.73661 7.87125C13.13424 7.87125 13.45661 7.54889 13.45661 7.15125C13.45661 6.75361 13.13424 6.43125 12.73661 6.43125L11.4097 6.43125C11.01206 6.43125 10.6897 6.75361 10.6897 7.15125z" - fill="#6D69E4ff"></path> - <path - d="M15.88733 7.15125C15.88733 7.54889 16.2097 7.87125 16.60733 7.87125L17.93424 7.87125C18.33187 7.87125 18.65424 7.54889 18.65424 7.15125C18.65424 6.75361 18.33187 6.43125 17.93424 6.43125L16.60733 6.43125C16.2097 6.43125 15.88733 6.75361 15.88733 7.15125z" - fill="#6D69E4ff"></path> - <path - d="M5.49187 17.14742C5.49187 17.54515 5.81423 17.86742 6.21187 17.86742L7.53881 17.86742C7.93645 17.86742 8.25881 17.54515 8.25881 17.14742C8.25881 16.74979 7.93645 16.42742 7.53881 16.42742L6.21187 16.42742C5.81423 16.42742 5.49187 16.74979 5.49187 17.14742z" - fill="#6D69E4ff"></path> - <path - d="M10.6897 17.14742C10.6897 17.54515 11.01206 17.86742 11.4097 17.86742L12.73661 17.86742C13.13424 17.86742 13.45661 17.54515 13.45661 17.14742C13.45661 16.74979 13.13424 16.42742 12.73661 16.42742L11.4097 16.42742C11.01206 16.42742 10.6897 16.74979 10.6897 17.14742z" - fill="#6D69E4ff"></path> - <path - d="M15.88733 17.14742C15.88733 17.54515 16.2097 17.86742 16.60733 17.86742L17.93424 17.86742C18.33187 17.86742 18.65424 17.54515 18.65424 17.14742C18.65424 16.74979 18.33187 16.42742 17.93424 16.42742L16.60733 16.42742C16.2097 16.42742 15.88733 16.74979 15.88733 17.14742z" - fill="#6D69E4ff"></path> - <path - d="M3.72094 14.9591L20.27645 14.9591L20.27645 8.83594L3.72094 8.83594L3.72094 14.9591z" - fill="#6D69E4ff"></path> - <path - d="M9.8783 12.948C9.91536 12.84787 9.93389 12.79776 9.95213 12.77434C10.02883 12.67565 10.17802 12.67565 10.25482 12.77434C10.27296 12.79776 10.29149 12.84787 10.32854 12.948C10.53485 13.50557 10.97443 13.94515 11.532 14.15146C11.63222 14.18851 11.68224 14.20704 11.70566 14.22528C11.80435 14.30198 11.80435 14.45117 11.70566 14.52787C11.68224 14.54611 11.63222 14.56464 11.532 14.6017C10.97443 14.808 10.53485 15.24758 10.32854 15.80515C10.29149 15.90528 10.27296 15.95539 10.25482 15.97882C10.17802 16.0775 10.02883 16.0775 9.95213 15.97882C9.93389 15.95539 9.91536 15.90528 9.8783 15.80515C9.672 15.24758 9.23242 14.808 8.67487 14.6017C8.5747 14.56464 8.52462 14.54611 8.50123 14.52787C8.40254 14.45117 8.40254 14.30198 8.50123 14.22528C8.52462 14.20704 8.5747 14.18851 8.67487 14.15146C9.23242 13.94515 9.672 13.50557 9.8783 12.948z" - fill="#FDDE80ff"></path> - <path - d="M13.42128 6.99748C13.50605 6.76846 13.54838 6.65394 13.58995 6.60048C13.76544 6.37484 14.10653 6.37484 14.28202 6.60048C14.32358 6.65394 14.36592 6.76846 14.45069 6.99748C14.92234 8.27225 15.92746 9.27733 17.20224 9.74909C17.4313 9.83376 17.54573 9.87619 17.5992 9.91776C17.8249 10.09325 17.8249 10.43424 17.5992 10.60973C17.54573 10.6513 17.4313 10.69373 17.20224 10.7785C15.92746 11.25014 14.92234 12.25526 14.45069 13.53005C14.36592 13.75901 14.32358 13.87354 14.28202 13.92701C14.10653 14.1527 13.76544 14.1527 13.58995 13.92701C13.54838 13.87354 13.50605 13.75901 13.42128 13.53005C12.94954 12.25526 11.94451 11.25014 10.66973 10.7785C10.44067 10.69373 10.32614 10.6513 10.27267 10.60973C10.04707 10.43424 10.04707 10.09325 10.27267 9.91776C10.32614 9.87619 10.44067 9.83376 10.66973 9.74909C11.94451 9.27733 12.94954 8.27225 13.42128 6.99748z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/dance.svg b/assets/zone_v2_icon/dance.svg deleted file mode 100644 index 1082252..0000000 --- a/assets/zone_v2_icon/dance.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M22.45853 11.58826C22.62758 11.94816 22.47293 12.37699 22.11302 12.54614L11.7097 17.43446C11.34979 17.60362 10.92096 17.44896 10.7519 17.08906C10.58275 16.72915 10.73741 16.30032 11.09731 16.13117L21.50064 11.24285C21.86054 11.0737 22.28938 11.22845 22.45853 11.58826z" - fill="#FFCFE6ff"></path> - <path - d="M17.59709 7.57625C17.94307 7.77225 18.06461 8.21161 17.86867 8.55759L12.62534 17.81386C12.42941 18.15984 11.99002 18.28138 11.64403 18.08544C11.29805 17.88941 11.17642 17.45002 11.37245 17.10403L16.61568 7.84786C16.81171 7.50186 17.2511 7.38026 17.59709 7.57625z" - fill="#FFCFE6ff"></path> - <path - d="M12.16022 6.47833C12.55786 6.47833 12.88022 6.80069 12.88022 7.19833L12.88022 17.40806C12.88022 17.8057 12.55786 18.12806 12.16022 18.12806C11.76259 18.12806 11.44022 17.8057 11.44022 17.40806L11.44022 7.19833C11.44022 6.80069 11.76259 6.47833 12.16022 6.47833z" - fill="#FFCFE6ff"></path> - <path - d="M6.70345 8.53544C7.03465 8.31539 7.48154 8.40548 7.7016 8.73668L13.0248 16.74845C13.24493 17.07965 13.15478 17.52653 12.82358 17.74656C12.49238 17.96669 12.0455 17.87654 11.82547 17.54534L6.5022 9.53359C6.28214 9.20239 6.37225 8.7555 6.70345 8.53544z" - fill="#FFCFE6ff"></path> - <path - d="M9.66182 17.5007C9.57036 17.28797 9.68467 17.0519 9.89453 16.95398L12.09898 15.92611L14.30141 16.95312C14.51126 17.05094 14.6256 17.28691 14.5343 17.49955C14.1288 18.44381 13.1905 19.10515 12.09782 19.10515C11.00554 19.10515 10.06752 18.44429 9.66182 17.5007z" - fill="#FFCFE6ff"></path> - <path - d="M7.16267 14.97974C7.7695 12.8303 9.75514 11.23526 12.09878 11.23526C14.44253 11.23526 16.4183 12.81062 17.02512 14.96026L22.13731 12.53549C22.50115 12.36288 22.67424 11.93654 22.5119 11.568C22.49309 11.52528 22.47504 11.48554 22.45862 11.45078C20.62118 7.57511 16.67299 4.89487 12.09878 4.89487C7.45255 4.89487 3.4522 7.66017 1.65375 11.63472L1.65375 11.63472C1.49874 11.97734 1.64364 12.38957 1.98407 12.54922C3.48774 13.25472 7.16267 14.97974 7.16267 14.97974z" - fill="#FF5C7Aff"></path> - <path - d="M1.65842 11.60611C1.82741 11.24611 2.2562 11.09126 2.61615 11.26032L12.85507 16.06723C13.21507 16.23619 13.36982 16.66502 13.20086 17.02493C13.0319 17.38493 12.60307 17.53968 12.24317 17.37072L2.00419 12.56381C1.64424 12.39485 1.48943 11.96602 1.65842 11.60611z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/douga.svg b/assets/zone_v2_icon/douga.svg deleted file mode 100644 index 00a4f8c..0000000 --- a/assets/zone_v2_icon/douga.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.67687 4.05598L5.67687 4.05598C4.8817 4.05598 4.23687 4.70064 4.23687 5.49582L4.23687 11.94893L8.11451 15.3912L12.12979 11.94893L12.12979 4.05598L5.67687 4.05598z" - fill="#6D69E4ff"></path> - <path - d="M15.57206 15.82656L12.12979 19.72838L5.67687 19.72838C4.88158 19.72838 4.23687 19.08365 4.23687 18.28838L4.23687 11.94893L6.74114 11.94893C6.63916 12.15446 6.58075 12.38554 6.58075 12.63053C6.58075 13.47792 7.26776 14.16461 8.11482 14.16461C8.96189 14.16461 9.64886 13.47792 9.64886 12.63053C9.64886 12.38554 9.59049 12.15446 9.48819 11.94893L12.12979 11.94893L15.57206 15.82656z" - fill="#9796EDff"></path> - <path - d="M16.00752 8.16033L12.12989 11.63318L12.12989 14.24419C12.33542 14.14195 12.56659 14.08349 12.81158 14.08349C13.65898 14.08349 14.34566 14.77046 14.34566 15.61757C14.34566 16.46467 13.65898 17.15165 12.81158 17.15165C12.56659 17.15165 12.33542 17.09357 12.12989 16.99094L12.12989 19.72838L18.46934 19.72838C19.26461 19.72838 19.90934 19.08365 19.90934 18.28838L19.90934 11.63318L16.00752 8.16033z" - fill="#6D69E4ff"></path> - <path - d="M18.46934 4.05598C19.26461 4.05598 19.90934 4.70069 19.90934 5.49598L19.90934 11.94893L17.38723 11.94893C17.48947 11.74339 17.54755 11.51222 17.54755 11.26694C17.54755 10.41984 16.86086 9.73286 16.01357 9.73286C15.16646 9.73286 14.47949 10.41984 14.47949 11.26694C14.47949 11.51222 14.53786 11.74339 14.64019 11.94893L12.12989 11.94893L12.12989 9.3073C11.92435 9.40959 11.69328 9.46768 11.44829 9.46768C10.6009 9.46768 9.91392 8.781 9.91392 7.93361C9.91392 7.08655 10.6009 6.39986 11.44829 6.39986C11.69328 6.39986 11.92435 6.45795 12.12989 6.56025L12.12989 4.05598L18.46934 4.05598z" - fill="#9796EDff"></path> - <path - d="M12.12979 9.04368L10.4809 8.09169C9.47782 7.51265 8.65694 7.98655 8.65694 9.14492L8.65694 14.57338C8.65694 14.69107 8.66543 14.80176 8.68171 14.90496L12.12979 11.94893L12.12979 9.04368z" - fill="#FDDE80ff"></path> - <path - d="M13.72944 13.75075L10.4809 15.6263C9.47782 16.20557 8.65694 15.73171 8.65694 14.57338L8.65694 14.06611C9.23658 13.84704 9.64886 13.28707 9.64886 12.63053C9.64886 12.38554 9.59049 12.15446 9.48819 11.94893L12.12979 11.94893L13.72944 13.75075z" - fill="#FDDE80ff"></path> - <path - d="M13.88794 10.05869L15.1823 10.80595C16.18531 11.38522 16.18531 12.33302 15.1823 12.9121L13.10477 14.11152C13.00982 14.09309 12.91181 14.08349 12.81158 14.08349C12.56659 14.08349 12.33542 14.14195 12.12989 14.24419L12.12989 11.63318L13.88794 10.05869z" - fill="#FDDE80ff"></path> - <path - d="M8.65694 9.14491C8.65694 7.98655 9.47781 7.51266 10.4808 8.09169L15.18221 10.80586C16.18522 11.38522 16.18522 12.33302 15.18221 12.9121L10.4808 15.6263C9.47781 16.20557 8.65694 15.73171 8.65694 14.57338L8.65694 9.14491z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/emotion.svg b/assets/zone_v2_icon/emotion.svg deleted file mode 100644 index 8ed2de6..0000000 --- a/assets/zone_v2_icon/emotion.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M11.64326 6.75353C8.80572 2.45969 3.05423 4.99012 3.47601 9.85922C3.84148 14.0784 8.01705 17.41958 10.97002 19.14355C11.38675 19.38691 11.89891 19.38691 12.31574 19.14355C15.26842 17.41958 19.44403 14.0783 19.8095 9.85922C20.23123 4.99012 14.48035 2.45969 11.64326 6.75353z" - fill="#FF5C7Aff"></path> - <path - d="M16.95014 12.98275C16.39747 10.17744 12.90787 10.2649 12.09763 12.85632C11.43677 14.97024 12.67536 17.39645 13.7856 18.93235C14.06842 19.32355 14.54659 19.51978 15.02266 19.44C16.89158 19.12675 19.47754 18.27005 20.49216 16.30128C21.73584 13.88774 19.31395 11.37437 16.95014 12.98275z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/entertainment.svg b/assets/zone_v2_icon/entertainment.svg deleted file mode 100644 index b69d02f..0000000 --- a/assets/zone_v2_icon/entertainment.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.92972 20.481C5.34469 21.0726 4.39035 21.075 3.80205 20.4867L3.42324 20.1078C2.83711 19.5217 2.83752 18.5713 3.42416 17.9856L12.0134 9.41117C12.372 9.05293 12.9589 9.05293 13.3175 9.41117L14.4768 10.5692C14.8355 10.9275 14.8355 11.5132 14.4768 11.8714C12.0808 14.2648 7.88596 18.5029 5.92972 20.481z" - fill="#FF5C7Aff"></path> - <path - d="M8.72852 12.693L12.0139 9.41126C12.3725 9.05302 12.9593 9.05302 13.318 9.41126L14.4773 10.5693C14.836 10.9276 14.836 11.5137 14.4773 11.872L11.1758 15.1698L8.72852 12.693z" - fill="#FC6376ff"></path> - <path - d="M16.2118 14.531C16.5704 14.8893 16.971 14.782 17.1024 14.2925L19.5843 5.04082C19.7152 4.55181 19.422 4.25849 18.932 4.38973L9.67009 6.86887C9.18053 6.99964 9.07312 7.40025 9.43176 7.75849L16.2118 14.531z" - fill="#FDDE80ff"></path> - <path - d="M20.7561 9.99241C21.1147 10.3507 21.0073 10.7508 20.5173 10.882L11.2554 13.3612C10.7658 13.4919 10.4722 13.1991 10.6036 12.7096L13.0855 3.45795C13.2164 2.96893 13.6174 2.86165 13.9761 3.21989L20.7561 9.99241z" - fill="#FDDE80ff"></path> - <path - d="M6.6992 14.7177L9.17585 17.167L8.47269 17.878L5.99603 15.4287L6.6992 14.7177z" - fill="#FFCFE6ff"></path> - <path - d="M8.67909 12.7448L11.1456 15.2003L10.44 15.909L7.97356 13.4535L8.67909 12.7448z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/fashion.svg b/assets/zone_v2_icon/fashion.svg deleted file mode 100644 index 5572bef..0000000 --- a/assets/zone_v2_icon/fashion.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M16.0695 2.7305C12.7258 3.85612 10.9074 4.09695 8.30573 2.7305L12.1298 8.01044L16.0695 2.7305z" - fill="#FFCFE6ff"></path> - <path - d="M8.37409 10.243C6.22673 12.7549 5.26956 15.1018 4.17298 18.4108C4.09425 18.6483 4.10943 18.9135 4.27234 19.1035C6.38097 21.5625 16.2982 21.696 19.208 19.118C19.4281 18.923 19.4887 18.6141 19.4071 18.3315C18.4274 14.9392 16.8594 12.462 14.8639 10.243L8.37409 10.243z" - fill="#FF5C7Aff"></path> - <path - d="M6.71505 2.5833C7.21559 2.4809 7.56291 2.47743 8.05183 2.52926C8.29103 2.55462 8.50926 2.67534 8.66566 2.85809L11.0339 5.6253C11.3497 5.99425 11.9202 5.99425 12.236 5.6253L14.5849 2.88068C14.7528 2.68446 14.9917 2.56125 15.2493 2.54369C15.689 2.51373 16.0305 2.51088 16.555 2.59268C17.7675 2.77617 18.4473 4.98552 18.4928 6.49521C18.5014 6.77775 18.3517 7.04445 18.089 7.1489C17.3664 7.43628 16.3941 7.44278 15.6755 7.33024L14.8472 10.6895C12.29 11.0952 10.8825 11.103 8.42274 10.6895L7.60432 7.36766C6.85494 7.52539 5.78994 7.47444 5.07016 7.13883C4.84587 7.03425 4.71412 6.80481 4.71142 6.55735C4.69584 5.13103 5.45156 3.01836 6.71505 2.5833z" - fill="#FF5C7Aff"></path> - <path - d="M8.19688 9.85347C9.66073 10.5601 13.5345 10.7668 15.1159 9.75003L15.6793 11.2107C12.9174 12.2073 9.85241 12.1155 7.65021 11.2107L8.19688 9.85347z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/food.svg b/assets/zone_v2_icon/food.svg deleted file mode 100644 index b9ada08..0000000 --- a/assets/zone_v2_icon/food.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M3.18094 10.5647C3.18094 11.01408 3.35942 11.44493 3.67714 11.76269C3.99484 12.08035 4.42574 12.25882 4.87505 12.25882C5.32436 12.25882 5.75527 12.08035 6.07298 11.76269C6.39068 11.44493 6.56917 11.01408 6.56917 10.5647C6.56917 10.11542 6.39068 9.68453 6.07298 9.36682C5.75527 9.04911 5.32436 8.87062 4.87505 8.87062C4.42574 8.87062 3.99484 9.04911 3.67714 9.36682C3.35942 9.68453 3.18094 10.11542 3.18094 10.5647z" - fill="#FB813Aff"></path> - <path - d="M5.69523 9.30581C5.69518 9.60927 5.76987 9.90977 5.91502 10.19011C6.06016 10.47053 6.27294 10.72531 6.54118 10.93987C6.80942 11.15443 7.12788 11.32474 7.47837 11.4408C7.82887 11.55696 8.20452 11.61677 8.5839 11.61677C8.96327 11.61677 9.33893 11.55696 9.68938 11.4408C10.03987 11.32474 10.3584 11.15443 10.62662 10.93987C10.89485 10.72531 11.10758 10.47053 11.25274 10.19011C11.39789 9.90977 11.47258 9.60927 11.47258 9.30581C11.47258 9.00234 11.39789 8.70184 11.25274 8.42147C11.10758 8.1411 10.89485 7.88634 10.62662 7.67174C10.3584 7.45715 10.03987 7.28693 9.68938 7.17079C9.33893 7.05465 8.96327 6.99487 8.5839 6.99487C8.20452 6.99487 7.82887 7.05465 7.47837 7.17079C7.12788 7.28693 6.80942 7.45715 6.54118 7.67174C6.27294 7.88634 6.06016 8.1411 5.91502 8.42147C5.76987 8.70184 5.69518 9.00234 5.69523 9.30581z" - fill="#FB813Aff"></path> - <path - d="M14.90909 11.21645C14.90899 11.59296 14.9832 11.96582 15.1272 12.31373C15.2713 12.66163 15.4825 12.97766 15.7487 13.24397C16.01501 13.51018 16.33104 13.72147 16.67894 13.86557C17.02675 14.00966 17.39962 14.08378 17.77622 14.08378C18.15274 14.08378 18.5256 14.00966 18.87341 13.86557C19.22131 13.72147 19.53744 13.51018 19.80365 13.24397C20.06986 12.97766 20.28106 12.66163 20.42515 12.31373C20.56925 11.96582 20.64336 11.59296 20.64326 11.21645C20.64336 10.83994 20.56925 10.46707 20.42515 10.11917C20.28106 9.77126 20.06986 9.45516 19.80365 9.1889C19.53744 8.92264 19.22131 8.71142 18.87341 8.56733C18.5256 8.42322 18.15274 8.34905 17.77622 8.34905C17.39962 8.34905 17.02675 8.42322 16.67894 8.56733C16.33104 8.71142 16.01501 8.92264 15.7487 9.1889C15.4825 9.45516 15.2713 9.77126 15.1272 10.11917C14.9832 10.46707 14.90899 10.83994 14.90909 11.21645z" - fill="#FB813Aff"></path> - <path - d="M11.7816 9.52223C11.7816 9.91584 11.85907 10.3056 12.0097 10.66925C12.16032 11.0329 12.38112 11.36323 12.65942 11.64163C12.93773 11.91994 13.26816 12.14074 13.63181 12.29136C13.99546 12.44198 14.38522 12.51946 14.77882 12.51946C15.17242 12.51946 15.56218 12.44198 15.92582 12.29136C16.28947 12.14074 16.61981 11.91994 16.89821 11.64163C17.17651 11.36323 17.39722 11.0329 17.54784 10.66925C17.69846 10.3056 17.77603 9.91584 17.77603 9.52223C17.77603 8.72732 17.46029 7.96496 16.89821 7.40287C16.33603 6.84078 15.5737 6.525 14.77882 6.525C13.98384 6.525 13.2215 6.84078 12.65942 7.40287C12.09734 7.96496 11.7816 8.72732 11.7816 9.52223z" - fill="#FB813Aff"></path> - <path - d="M21.52992 9.91312C21.70147 9.91322 21.86602 9.98144 21.98736 10.10275C22.10861 10.22419 22.17677 10.38874 22.17677 10.56029L22.17571 10.59082L22.1737 10.62125C21.85181 14.01696 19.23504 16.76074 15.85699 17.35306L16.31107 19.16976C16.33027 19.24666 16.33171 19.32682 16.3153 19.40429C16.29878 19.48176 16.26499 19.55443 16.21622 19.61683C16.16746 19.67923 16.10515 19.72973 16.03402 19.76448C15.96288 19.79923 15.88474 19.81728 15.80554 19.81728L8.27921 19.81728C8.20003 19.81728 8.12188 19.79923 8.05071 19.76448C7.97955 19.72973 7.91723 19.67923 7.8685 19.61683C7.81977 19.55443 7.7859 19.48176 7.76947 19.40429C7.75305 19.32682 7.75449 19.24666 7.7737 19.16976L8.22772 17.35306C4.89166 16.76822 2.29831 14.08474 1.92424 10.74768L1.91171 10.62672C1.90307 10.53629 1.9134 10.44509 1.94207 10.35898C1.97073 10.27286 2.01708 10.19366 2.07813 10.12646C2.13919 10.05928 2.21362 10.0056 2.29664 9.96886C2.37965 9.93212 2.46943 9.91314 2.56021 9.91312L21.52992 9.91312z" - fill="#FDDE80ff"></path> - <path - d="M10.51066 3.65813L13.57402 3.65813C14.05238 3.65813 14.4695 3.9834 14.58538 4.44758L15.95184 9.91314L8.13281 9.91314L9.49929 4.44792C9.55566 4.22235 9.68582 4.02209 9.86909 3.87899C10.05235 3.73588 10.27814 3.65814 10.51066 3.65813z" - fill="#FDDE80ff"></path> - <path - d="M12.04234 15.12614C12.5953 15.12614 13.1257 15.34579 13.5167 15.7368C13.90771 16.1279 14.12746 16.65821 14.12746 17.21126L14.12746 19.81747L9.95722 19.81747L9.95722 17.21126C9.95722 16.65821 10.17686 16.1279 10.56787 15.7368C10.95898 15.34579 11.48928 15.12614 12.04234 15.12614z" - fill="#FB813Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/game.svg b/assets/zone_v2_icon/game.svg deleted file mode 100644 index 7fe5842..0000000 --- a/assets/zone_v2_icon/game.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.73713 20.26694L18.61296 20.26694C19.40822 20.26694 20.05296 19.6223 20.05296 18.82694L20.05296 5.83225C20.05296 5.03696 19.40822 4.39225 18.61296 4.39225L5.73712 4.39225C4.94183 4.39225 4.29712 5.03696 4.29712 5.83225L4.29713 18.82694C4.29713 19.6223 4.94184 20.26694 5.73713 20.26694z" - fill="#57D587ff"></path> - <path - d="M7.73276 8.05963C7.60831 8.05963 7.50647 8.16223 7.50647 8.28763L7.50647 10.96666C7.50647 11.09203 7.60831 11.19466 7.73276 11.19466L10.39162 11.19466C10.51603 11.19466 10.61789 11.09203 10.61789 10.96666L10.61789 8.28763C10.61789 8.16223 10.51603 8.05963 10.39162 8.05963L7.73276 8.05963z" - fill="#1F9F81ff"></path> - <path - d="M16.84051 8.28763C16.84051 8.16223 16.73875 8.05963 16.61424 8.05963L13.95542 8.05963C13.83091 8.05963 13.72915 8.16223 13.72915 8.28763L13.72915 10.96666C13.72915 11.09203 13.83091 11.19466 13.95542 11.19466L16.61424 11.19466C16.73875 11.19466 16.84051 11.09203 16.84051 10.96666L16.84051 8.28763z" - fill="#1F9F81ff"></path> - <path - d="M10.84416 11.19456C10.71974 11.19456 10.61789 11.29718 10.61789 11.42256L10.61789 12.70666C10.61789 12.83203 10.51603 12.93466 10.39162 12.93466L9.37919 12.93466C9.25473 12.93466 9.1529 13.03728 9.1529 13.16266L9.1529 14.27395L9.1529 14.72995L9.1529 15.84163L9.1529 16.29763L9.1529 17.40893C9.1529 17.5343 9.25473 17.63693 9.37919 17.63693L10.27843 17.63693C10.40294 17.63693 10.5047 17.5343 10.5047 17.40893L10.5047 16.29763C10.5047 16.17226 10.60656 16.06963 10.73098 16.06963L11.85658 16.06963L12.17338 16.06963L12.49066 16.06963L13.61616 16.06963C13.74058 16.06963 13.84243 16.17226 13.84243 16.29763L13.84243 17.40893C13.84243 17.5343 13.94429 17.63693 14.0687 17.63693L14.96755 17.63693C15.09197 17.63693 15.19382 17.5343 15.19382 17.40893L15.19382 16.29763L15.19382 15.84163L15.19382 14.72995L15.19382 14.27395L15.19382 13.16266C15.19382 13.03728 15.09197 12.93466 14.96755 12.93466L13.95562 12.93466C13.8311 12.93466 13.72934 12.83203 13.72934 12.70666L13.72934 11.42256C13.72934 11.29718 13.62749 11.19456 13.50298 11.19456L10.84416 11.19456z" - fill="#1F9F81ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/gym.svg b/assets/zone_v2_icon/gym.svg deleted file mode 100644 index 4b1e3a8..0000000 --- a/assets/zone_v2_icon/gym.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M2.00343 12.04454C2.00343 11.51434 2.41329 11.08454 2.91886 11.08454L21.22742 11.08454C21.73296 11.08454 22.14278 11.51434 22.14278 12.04454C22.14278 12.57475 21.73296 13.00454 21.22742 13.00454L2.91886 13.00454C2.41329 13.00454 2.00343 12.57475 2.00343 12.04454z" - fill="#FF8834ff"></path> - <path - d="M18.79498 5.27997L17.35498 5.27997L17.35498 18.72L18.79498 18.72C19.59034 18.72 20.23498 18.07526 20.23498 17.28L20.23498 6.71994C20.23498 5.92466 19.59024 5.27997 18.79498 5.27997z" - fill="#FFD671ff"></path> - <path - d="M8.23125 5.27997L6.79125 5.27997L6.79125 18.72L8.23125 18.72C9.02654 18.72 9.67123 18.07526 9.67123 17.28L9.67123 6.71995C9.67123 5.92467 9.02653 5.27997 8.23125 5.27997z" - fill="#FF8834ff"></path> - <path - d="M15.91498 5.28L17.35498 5.28L17.35498 18.72L15.91498 18.72C15.11971 18.72 14.47498 18.07526 14.47498 17.28L14.47498 6.71983C14.47498 5.92466 15.11981 5.28 15.91498 5.28z" - fill="#FF8834ff"></path> - <path - d="M5.35125 5.27997L6.79125 5.27997L6.79125 18.72L5.35125 18.72C4.55596 18.72 3.91125 18.07526 3.91125 17.28L3.91125 6.71994C3.91125 5.92466 4.55597 5.27997 5.35125 5.27997z" - fill="#FFD671ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/handmake.svg b/assets/zone_v2_icon/handmake.svg deleted file mode 100644 index 96f3bcc..0000000 --- a/assets/zone_v2_icon/handmake.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M12.62496 14.23738C12.36461 14.6424 11.77267 14.6424 11.51222 14.23757L10.54176 12.72902C10.4015 12.5111 10.4015 12.23146 10.54157 12.01344L16.35754 2.96447C16.50086 2.74146 16.80134 2.67425 16.99843 2.85151C18.05741 3.80375 18.30067 5.40988 17.50579 6.64666L12.62496 14.23738z" - fill="#6D69E4ff"></path> - <path - d="M11.37398 12.43008L12.56045 13.11504L10.65005 16.42397L9.46356 15.73901L11.37398 12.43008z" - fill="#6D69E4ff"></path> - <path - d="M11.49312 14.24842C11.75386 14.64998 12.34176 14.65008 12.60259 14.24861L13.58832 12.73152C13.73069 12.51245 13.73069 12.23011 13.58851 12.01094L7.71324 2.95969C7.56982 2.73875 7.2717 2.67196 7.07455 2.84664C6.00046 3.79827 5.75254 5.40777 6.55671 6.64666L11.49312 14.24842z" - fill="#9796EDff"></path> - <path - d="M11.37398 13.11504L12.56045 12.43008L14.40605 15.62678L13.21958 16.31174L11.37398 13.11504z" - fill="#9796EDff"></path> - <path - d="M6.8168 18.86678C5.84817 18.24422 5.56763 16.95437 6.1902 15.98573C6.81276 15.01709 8.10268 14.73648 9.07131 15.35914C10.03997 15.9817 10.32048 17.27155 9.69792 18.24019C9.07535 19.20883 7.78543 19.48934 6.8168 18.86678zM5.96217 20.19648C4.25917 19.10189 3.76595 16.83408 4.86051 15.13104C5.95507 13.4281 8.22294 12.93485 9.92592 14.02944C11.62896 15.12394 12.12221 17.39184 11.02762 19.09478C9.93302 20.79782 7.66517 21.29107 5.96217 20.19648z" - fill="#FDDE80ff"></path> - <path - d="M15.05808 18.86678C14.08944 18.24422 13.80893 16.95437 14.43149 15.98573C15.05405 15.01709 16.3439 14.73648 17.31254 15.35914C18.28118 15.9817 18.56179 17.27155 17.93914 18.24019C17.31658 19.20883 16.02672 19.48934 15.05808 18.86678zM14.20349 20.19648C12.50045 19.10189 12.0072 16.83408 13.10179 15.13104C14.19638 13.4281 16.46419 12.93485 18.16723 14.02944C19.87018 15.12394 20.36342 17.39184 19.26883 19.09478C18.17434 20.79782 15.90643 21.29107 14.20349 20.19648z" - fill="#FDDE80ff"></path> - <path - d="M13.07414 12.32688C13.07414 12.87965 12.62602 13.32778 12.07325 13.32778C11.52048 13.32778 11.07235 12.87965 11.07235 12.32688C11.07235 11.77411 11.52048 11.32598 12.07325 11.32598C12.62602 11.32598 13.07414 11.77411 13.07414 12.32688z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/health.svg b/assets/zone_v2_icon/health.svg deleted file mode 100644 index ee172e4..0000000 --- a/assets/zone_v2_icon/health.svg +++ /dev/null @@ -1,11 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M3.67336 7.39739C3.67336 6.59091 3.67336 6.18766 3.83031 5.87964C3.96837 5.60868 4.18866 5.38838 4.45961 5.25033C4.76765 5.09338 5.17089 5.09338 5.97736 5.09338L18.14179 5.09338C18.94829 5.09338 19.35149 5.09338 19.65955 5.25033C19.93046 5.38838 20.15078 5.60868 20.28883 5.87964C20.44579 6.18766 20.44579 6.5909 20.44579 7.39738L20.44579 16.60262C20.44579 17.40912 20.44579 17.81232 20.28883 18.12038C20.15078 18.3913 19.93046 18.61162 19.65955 18.74966C19.35149 18.90662 18.94829 18.90662 18.14179 18.90662L5.97735 18.90662C5.17089 18.90662 4.76765 18.90662 4.45961 18.74966C4.18866 18.61162 3.96837 18.3913 3.83031 18.12038C3.67336 17.81232 3.67336 17.40912 3.67336 16.60262L3.67336 7.39739z" - fill="#FF5C7Aff"></path> - <path - d="M3.09983 7.20505L3.09983 7.20505C3.09983 6.57943 3.09983 6.26662 3.19538 6.01756C3.34163 5.63638 3.64284 5.33518 4.02401 5.18893C4.27307 5.09338 4.58588 5.09338 5.2115 5.09338L5.2115 5.09338L18.93494 5.09338L18.93494 5.09338C19.56058 5.09338 19.87344 5.09338 20.12246 5.18893C20.50368 5.33518 20.80483 5.63637 20.95114 6.01757C21.04666 6.26662 21.04666 6.57944 21.04666 7.20505L21.04666 7.20505C21.04666 7.41359 21.04666 7.51786 21.01478 7.60088C20.96602 7.72794 20.8656 7.82834 20.73859 7.87709C20.65555 7.90894 20.5513 7.90894 20.34278 7.90894L3.80372 7.90894C3.59518 7.90894 3.49091 7.90894 3.40789 7.87709C3.28083 7.82834 3.18043 7.72794 3.13167 7.60088C3.09983 7.51786 3.09983 7.41359 3.09983 7.20505z" - fill="#FFCFE6ff"></path> - <path - d="M13.20672 11.86099L13.20672 9.88544C13.20672 9.62034 12.99187 9.40544 12.72672 9.40544L11.39251 9.40544C11.12736 9.40544 10.91251 9.62034 10.91251 9.88544L10.91251 11.86099L8.93696 11.86099C8.67185 11.86099 8.45696 12.07584 8.45696 12.34099L8.45696 13.6752C8.45696 13.94035 8.67185 14.1552 8.93696 14.1552L10.91251 14.1552L10.91251 16.13078C10.91251 16.39584 11.12736 16.61078 11.39251 16.61078L12.72672 16.61078C12.99187 16.61078 13.20672 16.39584 13.20672 16.13078L13.20672 14.1552L15.1823 14.1552C15.44736 14.1552 15.6623 13.94035 15.6623 13.6752L15.6623 12.34099C15.6623 12.07584 15.44736 11.86099 15.1823 11.86099L13.20672 11.86099z" - fill="#FFCFE6ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/home.svg b/assets/zone_v2_icon/home.svg deleted file mode 100644 index 066b5dd..0000000 --- a/assets/zone_v2_icon/home.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.59324 5.04454C5.59324 4.24928 6.2378 3.60457 7.03307 3.60457C7.06633 3.60457 7.09987 3.60457 7.13368 3.60457L14.02454 3.60457C14.05824 3.60457 14.09174 3.60457 14.12486 3.60457C14.92022 3.60456 15.56496 4.24931 15.56496 5.04468L15.56496 20.40461L7.13367 20.40461C6.28292 20.40461 5.59324 19.79482 5.59324 19.04246L5.59324 5.04454z" - fill="#FF8834ff"></path> - <path - d="M9.42703 11.3329C9.42703 11.06784 9.64195 10.8529 9.90701 10.8529L11.2512 10.8529C11.51626 10.8529 11.7312 11.06784 11.7312 11.3329L11.7312 12.67699C11.7312 12.94214 11.51626 13.15699 11.2512 13.15699L9.90701 13.15699C9.64195 13.15699 9.42703 12.94214 9.42703 12.67699L9.42703 11.3329z" - fill="#FFD671ff"></path> - <path - d="M9.42703 7.04062C9.42703 6.77553 9.64195 6.56062 9.90701 6.56062L11.2512 6.56062C11.51626 6.56062 11.7312 6.77553 11.7312 7.04062L11.7312 8.38475C11.7312 8.64985 11.51626 8.86475 11.2512 8.86475L9.90701 8.86475C9.64195 8.86475 9.42703 8.64985 9.42703 8.38475L9.42703 7.04062z" - fill="#FFD671ff"></path> - <path - d="M9.42703 15.62506C9.42703 15.36 9.64195 15.14506 9.90701 15.14506L11.2512 15.14506C11.51626 15.14506 11.7312 15.36 11.7312 15.62506L11.7312 16.96915C11.7312 17.2343 11.51626 17.44915 11.2512 17.44915L9.90701 17.44915C9.64195 17.44915 9.42703 17.2343 9.42703 16.96915L9.42703 15.62506z" - fill="#FFD671ff"></path> - <path - d="M15.56496 8.80705L19.03325 8.80705C19.82851 8.80705 20.47325 9.45176 20.47325 10.24704L20.47325 10.24704L20.47325 18.96461C20.47325 19.75987 19.82851 20.40461 19.03325 20.40461L15.56496 20.40461L15.56496 8.80705z" - fill="#FFD671ff"></path> - <path - d="M17.15616 11.3327C17.15616 11.06755 17.37101 10.8527 17.63616 10.8527L18.40205 10.8527C18.6672 10.8527 18.88205 11.06755 18.88205 11.3327L18.88205 12.6768C18.88205 12.94186 18.6672 13.1568 18.40205 13.1568L17.63616 13.1568C17.37101 13.1568 17.15616 12.94186 17.15616 12.6768L17.15616 11.3327z" - fill="#FF8834ff"></path> - <path - d="M17.15616 15.62486C17.15616 15.35971 17.37101 15.14486 17.63616 15.14486L18.40205 15.14477C18.6672 15.14477 18.88205 15.35971 18.88205 15.62477L18.88205 16.96896C18.88205 17.23402 18.6672 17.44896 18.40205 17.44896L17.63616 17.44896C17.37101 17.44896 17.15616 17.23402 17.15616 16.96896L17.15616 15.62486z" - fill="#FF8834ff"></path> - <path - d="M4.46813 19.8047C4.46813 19.2745 4.89793 18.8447 5.42813 18.8447L20.63626 18.8447C21.16646 18.8447 21.59626 19.2745 21.59626 19.8047C21.59626 20.33491 21.16646 20.7647 20.63626 20.7647L5.42813 20.7647C4.89793 20.7647 4.46813 20.33491 4.46813 19.8047z" - fill="#FF8834ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/information.svg b/assets/zone_v2_icon/information.svg deleted file mode 100644 index 68a2917..0000000 --- a/assets/zone_v2_icon/information.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M20.7696 9.43989C20.7696 8.64461 20.12486 7.99991 19.3296 7.99988C16.87613 7.9998 14.42275 7.99956 11.96928 7.99979C11.17411 7.99986 10.52957 8.64452 10.52957 9.4397L10.52957 18.96499C10.52957 19.76026 11.17421 20.40499 11.96957 20.40499C14.42285 20.40499 16.87622 20.40499 19.3296 20.40499C20.12486 20.40499 20.7696 19.76026 20.7696 18.96499C20.7696 15.78998 20.7696 12.61498 20.7696 9.43989z" - fill="#00B9E7ff"></path> - <path - d="M17.56512 4.12356L5.86988 4.12356C5.16028 4.12356 4.58508 4.65644 4.58508 5.3136L4.58508 19.21469C4.58508 19.8719 5.16028 20.4047 5.86988 20.4047L17.56512 20.4047C18.27427 20.4047 18.8495 19.8719 18.8495 19.21469L18.8495 5.3136C18.8495 4.65644 18.27427 4.12356 17.56512 4.12356z" - fill="#59E1F9ff"></path> - <path - d="M6.55239 15.36586C6.55239 14.96861 6.87441 14.64662 7.27164 14.64662L16.14778 14.64662C16.54493 14.64662 16.86701 14.96861 16.86701 15.36586C16.86701 15.7631 16.54493 16.08509 16.14778 16.08509L7.27164 16.08509C6.87441 16.08509 6.55239 15.7631 6.55239 15.36586z" - fill="#00B9E7ff"></path> - <path - d="M6.55239 17.90045C6.55239 17.5032 6.87441 17.18122 7.27164 17.18122L16.14778 17.18122C16.54493 17.18122 16.86701 17.5032 16.86701 17.90045C16.86701 18.2977 16.54493 18.61968 16.14778 18.61968L7.27164 18.61968C6.87441 18.61968 6.55239 18.2977 6.55239 17.90045z" - fill="#00B9E7ff"></path> - <path - d="M15.61574 13.17888L7.81898 13.17888C7.13058 13.17888 6.56738 12.61891 6.56738 11.93443L6.56738 7.62798C6.56738 6.94351 7.13058 6.38353 7.81898 6.38353L15.61574 6.38353C16.30416 6.38353 16.86701 6.94351 16.86701 7.62798L16.86701 11.93443C16.86701 12.61891 16.30416 13.17888 15.61574 13.17888z" - fill="#00B9E7ff"></path> - <path - d="M10.3943 8.60394C10.3943 8.06573 10.77312 7.84541 11.23603 8.11452L13.40477 9.37584C13.86768 9.64495 13.86768 10.08557 13.40477 10.35466L11.23603 11.616C10.77312 11.88566 10.3943 11.66534 10.3943 11.12659L10.3943 8.60394z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/kichiku.svg b/assets/zone_v2_icon/kichiku.svg deleted file mode 100644 index a02252b..0000000 --- a/assets/zone_v2_icon/kichiku.svg +++ /dev/null @@ -1,20 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M21.44573 11.95363C21.44573 9.55713 19.50038 7.61437 17.10058 7.61437C15.08016 7.61437 13.38701 8.99326 12.90048 10.85837C12.61642 10.97539 12.34656 11.1191 12.09197 11.28422C11.8248 11.11114 11.54035 10.9632 11.24141 10.8431C10.7495 8.98562 9.05986 7.61437 7.04517 7.61437C4.64539 7.61437 2.7 9.55713 2.7 11.95363C2.7 13.36733 3.37985 14.61888 4.42758 15.41136C4.42758 15.4225 4.42605 15.43315 4.42605 15.4439C4.42605 18.18326 6.64974 20.40394 9.39251 20.40394C10.38893 20.40394 11.31456 20.10806 12.09197 19.60387C12.86947 20.10806 13.7951 20.40394 14.7911 20.40394C17.5343 20.40394 19.75795 18.18326 19.75795 15.4439C19.75795 15.42365 19.75488 15.40406 19.75488 15.38381C20.78198 14.59027 21.44573 13.35091 21.44573 11.95363z" - fill="#FF5C7Aff"></path> - <path - d="M12.58224 5.53555L11.71478 5.53555C9.34452 5.53555 7.40521 7.47222 7.40521 9.83926L7.40521 15.31181C7.40521 17.67888 9.34452 19.61558 11.71478 19.61558L12.58224 19.61558C14.95258 19.61558 16.89187 17.67888 16.89187 15.31181L16.89187 9.83926C16.89187 7.47222 14.95258 5.53555 12.58224 5.53555z" - fill="#ffffffff"></path> - <path - d="M9.46395 12.41309C9.51499 12.25402 9.73997 12.25402 9.79104 12.41309L9.80074 12.44323C9.99446 13.04669 10.41043 13.55386 10.96445 13.86182C11.0785 13.92528 11.0785 14.08934 10.96445 14.1527C10.41043 14.46067 9.99446 14.96784 9.80074 15.5713L9.79104 15.60154C9.73997 15.76051 9.51499 15.76051 9.46395 15.60154L9.45425 15.5713C9.26053 14.96784 8.84449 14.46067 8.29054 14.1527C8.17648 14.08934 8.17648 13.92528 8.29054 13.86182C8.84449 13.55386 9.26053 13.04669 9.45425 12.44323L9.46395 12.41309z" - fill="#FF5C7Aff"></path> - <path - d="M14.28221 12.41309C14.33328 12.25402 14.55821 12.25402 14.60928 12.41309L14.61898 12.44323C14.8127 13.04669 15.22877 13.55386 15.78269 13.86182C15.89674 13.92528 15.89674 14.08934 15.78269 14.1527C15.22877 14.46067 14.8127 14.96784 14.61898 15.5713L14.60928 15.60154C14.55821 15.76051 14.33328 15.76051 14.28221 15.60154L14.27251 15.5713C14.07878 14.96784 13.66282 14.46067 13.1088 14.1527C12.99475 14.08934 12.99475 13.92528 13.1088 13.86182C13.66282 13.55386 14.07878 13.04669 14.27251 12.44323L14.28221 12.41309z" - fill="#FF5C7Aff"></path> - <path - d="M15.88627 4.34697C15.40176 4.34697 14.94173 4.44877 14.52384 4.62983C13.90205 3.99273 13.03459 3.59566 12.07315 3.59566C11.11171 3.59566 10.24426 3.99273 9.62208 4.62983C9.20452 4.44877 8.74409 4.34697 8.25997 4.34697C6.36862 4.34697 4.83576 5.87813 4.83576 7.76653C4.83576 9.65493 6.36862 11.18611 8.25997 11.18611C9.22144 11.18611 10.08883 10.78906 10.71072 10.1519C11.12861 10.33296 11.58864 10.43482 12.07315 10.43482C12.55766 10.43482 13.0177 10.33296 13.4352 10.1519C14.05738 10.78906 14.92483 11.18611 15.88627 11.18611C17.77728 11.18611 19.3105 9.65493 19.3105 7.76653C19.3105 5.87813 17.77728 4.34697 15.88627 4.34697z" - fill="#FF5C7Aff"></path> - <path - d="M13.46515 16.05629C13.46515 16.85155 12.81917 17.49658 12.02285 17.49658C11.22586 17.49658 10.58064 16.85155 10.58064 16.05629C10.58064 15.26102 11.22586 14.616 12.02285 14.616C12.81917 14.616 13.46515 15.26102 13.46515 16.05629z" - fill="#FF5C7Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/knowledge.svg b/assets/zone_v2_icon/knowledge.svg deleted file mode 100644 index 154fe65..0000000 --- a/assets/zone_v2_icon/knowledge.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M11.314 2.23489C12.9446 2.23067 14.532 2.75886 15.8349 3.73921C17.1379 4.71955 18.0852 6.09845 18.5329 7.66636C18.9806 9.23427 18.9042 10.9055 18.3154 12.426C17.8016 13.7526 16.9223 14.9013 15.7852 15.7421C15.4744 15.972 15.2705 16.326 15.2705 16.7125L15.2705 17.592C15.2617 17.8153 15.2705 18.4288 15.2705 18.4288C15.2705 18.4288 14.2951 18.5929 13.8545 18.5929C13.4139 18.5929 8.6663 18.5929 8.6663 18.5929C8.23657 18.5929 7.26348 18.3716 7.26348 18.3716C7.26348 18.3716 7.26348 17.3741 7.26348 16.9398L7.26348 16.6997C7.26348 16.3201 7.06671 15.9714 6.76507 15.741C5.64258 14.8837 4.78051 13.7248 4.28335 12.394C3.71494 10.8724 3.65406 9.20783 4.10982 7.64882C4.56557 6.08982 5.51348 4.7201 6.81195 3.7443C8.11043 2.7685 9.68976 2.239 11.314 2.23489z" - fill="#FF8834ff"></path> - <path - d="M12.1195 12.5257C12.3663 12.5257 12.5664 12.3256 12.5664 12.0788L12.5664 11.3639C12.5664 11.1171 12.7665 10.917 13.0133 10.917L13.6389 10.917C14.6152 10.917 14.7114 10.3559 14.7114 10.0232L14.7114 6.7135C14.7114 6.22927 14.351 5.81976 13.6389 5.81976L9.17018 5.81976C8.28824 5.81976 7.91895 6.26199 7.91895 6.7135L7.91895 8.50456C7.91895 8.75099 8.11871 8.95076 8.36514 8.95076L9.61773 8.95076C9.86415 8.95076 10.0639 8.75099 10.0639 8.50456L10.0639 7.96765C10.0639 7.72085 10.264 7.52078 10.5108 7.52078L12.1195 7.52078C12.3663 7.52078 12.5664 7.72085 12.5664 7.96765L12.5664 9.57638C12.5664 9.82318 12.3663 10.0232 12.1195 10.0232L11.4939 10.0232C10.2266 10.0114 9.88517 10.5345 9.88517 10.917L9.88517 12.0788C9.88517 12.3256 10.0852 12.5257 10.332 12.5257L12.1195 12.5257zM11.2537 13.0396C11.5011 13.0396 11.7431 13.113 11.9488 13.2505C12.1546 13.388 12.315 13.5834 12.4097 13.812C12.5044 14.0407 12.5291 14.2922 12.4809 14.535C12.4326 14.7777 12.3134 15.0006 12.1384 15.1756C11.9634 15.3506 11.7405 15.4698 11.4978 15.518C11.2551 15.5663 11.0035 15.5415 10.7748 15.4468C10.5462 15.3521 10.3508 15.1918 10.2133 14.986C10.0758 14.7802 10.0024 14.5383 10.0024 14.2909C10.0024 13.959 10.1343 13.6407 10.3689 13.4061C10.6036 13.1714 10.9218 13.0396 11.2537 13.0396z" - fill="#FFE8AFff"></path> - <path - d="M7.61193 19.1082C7.56041 18.8267 7.79538 18.593 8.0816 18.593L14.5507 18.593C14.8369 18.593 15.0719 18.8267 15.0204 19.1082C14.9 19.7663 14.5593 20.4539 14.0385 20.8941C13.3787 21.4518 12.4838 21.7652 11.5507 21.7652L11.0816 21.7652C10.1485 21.7652 9.25362 21.4518 8.59382 20.8941C8.073 20.4539 7.73233 19.7663 7.61193 19.1082z" - fill="#00B9E7ff"></path> - <path - d="M6.53796 17.9091C6.53796 17.4028 6.94835 16.9924 7.45459 16.9924L14.9778 16.9924C15.484 16.9924 15.8944 17.4028 15.8944 17.9091L15.8944 18.0758C15.8944 18.582 15.484 18.9924 14.9778 18.9924L7.45459 18.9924C6.94835 18.9924 6.53796 18.582 6.53796 18.0758L6.53796 17.9091z" - fill="#FFD671ff"></path> - <path - d="M20.289 3.28204C20.345 3.15749 20.5218 3.15749 20.5779 3.28204L20.8592 3.90715C21.1186 4.4836 21.5405 4.97188 22.0732 5.31218L22.267 5.43598C22.3971 5.51903 22.3971 5.70894 22.267 5.79199L22.0821 5.91013C21.5438 6.25396 21.1188 6.74879 20.8602 7.33278L20.5783 7.96932C20.5226 8.09501 20.3442 8.09501 20.2886 7.96932L20.0206 7.36425C19.7533 6.76065 19.3084 6.25278 18.7453 5.90825L18.5589 5.79416C18.4242 5.71178 18.4242 5.51619 18.5589 5.43381L18.7543 5.3142C19.3118 4.9731 19.7535 4.47182 20.0217 3.87581L20.289 3.28204z" - fill="#FFD671ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/life_experience.svg b/assets/zone_v2_icon/life_experience.svg deleted file mode 100644 index 2ef38e2..0000000 --- a/assets/zone_v2_icon/life_experience.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M10.61434 6.33318C10.44384 7.21354 10.50317 8.08513 10.75046 8.88596L5.69662 13.35926L5.69921 13.36157C5.57936 13.47024 5.465 13.58765 5.35702 13.7137C3.97257 15.33053 4.16094 17.76355 5.77777 19.14806C7.39459 20.53248 9.82762 20.34413 11.21203 18.7273C11.30314 18.62093 11.38742 18.51101 11.46499 18.39811L15.31018 12.58262C17.97302 12.82781 20.43984 11.0184 20.9593 8.33736C21.17885 7.20411 21.01738 6.0853 20.56435 5.11334C20.37149 4.69955 19.82563 4.66821 19.52582 5.01252L17.27568 7.59697C17.10634 7.79142 16.81142 7.81181 16.61702 7.6425L15.29088 6.48796C15.09648 6.31865 15.07603 6.02376 15.24538 5.82931L17.46605 3.27885C17.7697 2.93007 17.65584 2.38682 17.2104 2.26236C17.07254 2.22383 16.9319 2.19058 16.78886 2.16287C13.93229 1.60943 11.16778 3.47652 10.61434 6.33318z" - fill="#FDDE80ff"></path> - <path - d="M7.35426 17.3065C6.75449 16.79299 6.68461 15.8904 7.19819 15.29059C7.71177 14.69088 8.61432 14.62099 9.21409 15.1345C9.81389 15.6481 9.88378 16.55069 9.37018 17.1504C8.8566 17.75021 7.95404 17.8201 7.35426 17.3065z" - fill="#FB813Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/life_joy.svg b/assets/zone_v2_icon/life_joy.svg deleted file mode 100644 index 1b31b60..0000000 --- a/assets/zone_v2_icon/life_joy.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M4.07763 7.63768C4.05931 6.56311 5.5539 6.83651 6.30349 7.10752C7.97693 7.98802 10.8193 9.80818 8.8013 10.0448C6.27878 10.3405 4.10053 8.98089 4.07763 7.63768z" - fill="#FB813Aff"></path> - <path - d="M4.55611 14.4882C4.84141 11.4532 7.31628 10.1389 8.31998 9.82821C8.48729 9.82821 9.61772 10.5076 13.464 11.2928C16.0255 11.8156 17.6628 11.0097 18.4364 9.93394C18.805 9.42136 19.3229 9.07939 19.7434 9.55032C20.3467 10.226 21.0067 11.5269 21.0067 13.5405C21.0067 17.3561 18.0324 20.9886 12.5657 20.9886C7.48437 20.9886 4.24105 17.8397 4.55611 14.4882z" - fill="#FDDE80ff"></path> - <path - d="M14.8068 7.41519C14.8068 9.84733 12.8352 11.819 10.4031 11.819C7.97092 11.819 5.99929 9.84733 5.99929 7.41519C5.99929 4.98305 7.97092 3.01141 10.4031 3.01141C12.8352 3.01141 14.8068 4.98305 14.8068 7.41519z" - fill="#FDDE80ff"></path> - <path - d="M10.0014 7.74284C10.0014 8.297 9.5522 8.74623 8.99804 8.74623C8.44388 8.74623 7.99465 8.297 7.99465 7.74284C7.99465 7.18868 8.44388 6.73944 8.99804 6.73944C9.5522 6.73944 10.0014 7.18868 10.0014 7.74284z" - fill="#FB813Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/music.svg b/assets/zone_v2_icon/music.svg deleted file mode 100644 index 10c5f58..0000000 --- a/assets/zone_v2_icon/music.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M20.36371 11.11344C20.36371 7.03327 17.00093 3.69495 12.89088 3.69495L11.25552 3.69495C7.1455 3.69495 3.78273 7.03327 3.78273 11.11344L3.78273 17.13898C3.78273 17.88566 4.38811 18.49114 5.1349 18.49114C5.43671 19.51978 5.98057 20.27731 7.11021 20.27731L8.35096 20.27731C8.80764 20.27731 9.17878 19.91088 9.18128 19.45718L9.21324 13.14941C9.21532 12.69274 8.84292 12.32102 8.38293 12.32102L7.11021 12.32102C6.69256 12.32102 6.29858 12.42566 5.95151 12.60826L5.95151 10.98528C5.95151 8.03846 8.38018 5.62746 11.34854 5.62746L12.85142 5.62746C15.81984 5.62746 18.24845 8.03846 18.24845 10.98528L18.24845 12.63706C17.88893 12.4368 17.47546 12.32102 17.03616 12.32102L15.76349 12.32102C15.30346 12.32102 14.93107 12.69274 14.93318 13.14941L14.96515 19.45718C14.96765 19.91088 15.33878 20.27731 15.79546 20.27731L17.03616 20.27731C18.16589 20.27731 18.70973 19.51978 19.01155 18.49114C19.75834 18.49114 20.36371 17.88566 20.36371 17.13898L20.36371 11.11344z" - fill="#59E0F9ff"></path> - <path - d="M5.11552 15.22608C5.11552 14.15078 5.11552 13.61309 5.32479 13.2024C5.50887 12.84115 5.8026 12.54739 6.16386 12.36336C6.57458 12.15408 7.11223 12.15408 8.18752 12.15408L8.61742 12.15408C9.15507 12.15408 9.4239 12.15408 9.62928 12.25872C9.80986 12.35078 9.95674 12.49757 10.0488 12.67824C10.15344 12.88358 10.15344 13.15238 10.15344 13.69008L10.15344 18.74131C10.15344 19.27891 10.15344 19.54781 10.0488 19.75315C9.95674 19.93373 9.80986 20.08061 9.62928 20.17267C9.4239 20.27731 9.15507 20.27731 8.61742 20.27731L8.18752 20.27731C7.11223 20.27731 6.57458 20.27731 6.16386 20.06803C5.8026 19.884 5.50887 19.59024 5.32479 19.22899C5.11552 18.81821 5.11552 18.28061 5.11552 17.20531L5.11552 15.22608z" - fill="#00B9E7ff"></path> - <path - d="M19.03075 15.22608C19.03075 14.15078 19.03075 13.61309 18.82147 13.2024C18.63734 12.84115 18.34368 12.54739 17.98243 12.36336C17.57165 12.15408 17.03405 12.15408 15.95875 12.15408L15.52675 12.15408C14.98906 12.15408 14.72026 12.15408 14.51491 12.25872C14.33424 12.35078 14.18736 12.49757 14.09539 12.67824C13.99075 12.88358 13.99075 13.15238 13.99075 13.69008L13.99075 18.74131C13.99075 19.27891 13.99075 19.54781 14.09539 19.75315C14.18736 19.93373 14.33424 20.08061 14.51491 20.17267C14.72026 20.27731 14.98906 20.27731 15.52675 20.27731L15.95875 20.27731C17.03405 20.27731 17.57165 20.27731 17.98243 20.06803C18.34368 19.884 18.63734 19.59024 18.82147 19.22899C19.03075 18.81821 19.03075 18.28061 19.03075 17.20531L19.03075 15.22608z" - fill="#00B9E7ff"></path> - <path - d="M13.9992 12.87389C13.9992 12.34349 14.42928 11.91341 14.95968 11.91341L14.95968 11.91341C15.49018 11.91341 15.92026 12.34349 15.92026 12.87389L15.92026 19.55741C15.92026 20.0879 15.49018 20.51798 14.95968 20.51798L14.95968 20.51798C14.42928 20.51798 13.9992 20.0879 13.9992 19.55741L13.9992 12.87389z" - fill="#FDDE80ff"></path> - <path - d="M8.24077 12.87389C8.24077 12.34349 8.67081 11.91341 9.20127 11.91341L9.20127 11.91341C9.73171 11.91341 10.16179 12.34349 10.16179 12.87389L10.16179 19.55741C10.16179 20.0879 9.73171 20.51798 9.20127 20.51798L9.20127 20.51798C8.67081 20.51798 8.24077 20.0879 8.24077 19.55741L8.24077 12.87389z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/outdoors.svg b/assets/zone_v2_icon/outdoors.svg deleted file mode 100644 index 0af234d..0000000 --- a/assets/zone_v2_icon/outdoors.svg +++ /dev/null @@ -1,14 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M9.29448 4.11732C9.64829 3.40975 10.65802 3.40975 11.01178 4.11732L18.0985 18.29069C18.4176 18.92899 17.95344 19.68 17.23978 19.68L3.06644 19.68C2.3528 19.68 1.88864 18.92899 2.20779 18.29069L9.29448 4.11732z" - fill="#1F9F81ff"></path> - <path - d="M3.05915 19.68019C2.34988 19.67482 1.89021 18.92698 2.20821 18.29098L5.83356 11.04019L6.34665 12.06643C6.62966 12.63245 7.43746 12.63245 7.72048 12.06643L8.3349 10.83754C8.68868 10.13002 9.6984 10.13002 10.05216 10.83754L12.10666 14.94643C12.38966 15.51245 13.19741 15.51245 13.48051 14.94643L14.95354 12.00029L18.09888 18.29098C18.41808 18.92928 17.95392 19.68029 17.24026 19.68029L3.26428 19.68029C3.26216 19.68019 3.26004 19.68019 3.25792 19.68019L3.05915 19.68019z" - fill="#57D587ff"></path> - <path - d="M16.01443 9.87732C16.36829 9.16975 17.37802 9.16975 17.73178 9.87732L21.9385 18.29069C22.2576 18.92899 21.79344 19.68 21.07978 19.68L12.66643 19.68C11.95277 19.68 11.48861 18.92899 11.80781 18.29069L16.01443 9.87732z" - fill="#1F9F81ff"></path> - <path - d="M19.51354 13.44L21.93888 18.29069C22.25808 18.92899 21.79392 19.68 21.08026 19.68L12.66682 19.68C11.95325 19.68 11.48909 18.92899 11.80819 18.29069L14.95354 12L17.16422 16.42138C17.34115 16.77514 17.84602 16.77514 18.02285 16.42138L19.51354 13.44z" - fill="#57D587ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/painting.svg b/assets/zone_v2_icon/painting.svg deleted file mode 100644 index 2e0cd81..0000000 --- a/assets/zone_v2_icon/painting.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M12.3744 18.84662C12.69341 20.00419 13.71994 21.08438 14.85139 20.68234C18.26458 19.46938 20.71642 16.13021 20.71642 12.20093C20.71642 7.24727 16.81949 3.23156 12.01248 3.23156C7.20531 3.23156 3.30844 7.24727 3.30844 12.20093C3.33446 12.77126 3.45612 13.28774 3.61254 13.63834C4.17721 14.90381 5.61394 15.15859 6.73392 15.12922C8.03405 15.09514 9.63226 15.24019 10.56096 16.00886C11.59786 16.8671 12.11866 17.91859 12.3744 18.84662z" - fill="#FDDE80ff"></path> - <path - d="M8.78526 10.49779C8.78526 11.44157 8.02013 12.20669 7.07629 12.20669C6.13247 12.20669 5.36734 11.44157 5.36734 10.49779C5.36734 9.55393 6.13247 8.78881 7.07629 8.78881C8.02013 8.78881 8.78526 9.55393 8.78526 10.49779z" - fill="#FB813Aff"></path> - <path - d="M12.408 7.48322C12.408 8.20428 11.82355 8.78881 11.1025 8.78881C10.38144 8.78881 9.7969 8.20428 9.7969 7.48322C9.7969 6.76216 10.38144 6.17764 11.1025 6.17764C11.82355 6.17764 12.408 6.76216 12.408 7.48322z" - fill="#FB813Aff"></path> - <path - d="M16.3633 7.48323C16.3633 8.02254 15.92611 8.45974 15.38678 8.45974C14.84755 8.45974 14.41027 8.02254 14.41027 7.48323C14.41027 6.94392 14.84755 6.50672 15.38678 6.50672C15.92611 6.50672 16.3633 6.94392 16.3633 7.48323z" - fill="#FB813Aff"></path> - <path - d="M14.71584 14.62147C14.41421 14.09914 14.58682 13.43146 15.10368 13.1207L21.1801 9.46733C21.82541 9.07934 22.66397 9.30876 23.02195 9.97121C23.37216 10.61933 23.12429 11.4287 22.4711 11.76941L16.18522 15.04906C15.6599 15.32304 15.012 15.1345 14.71584 14.62147z" - fill="#FB813Aff"></path> - <path - d="M11.78429 14.75242C12.32054 14.68214 12.92227 13.98 13.23936 13.54013L15.35971 16.06061C13.86586 16.96474 11.96122 16.30694 11.5559 15.00941C11.51616 14.88211 11.65219 14.76979 11.78429 14.75242z" - fill="#FB813Aff"></path> - <path - d="M16.15882 14.96486C15.96509 15.86717 15.07661 16.44154 14.1743 16.24781C13.272 16.05408 12.69763 15.1655 12.89136 14.2633C13.08509 13.36099 13.97366 12.78662 14.87587 12.98035C15.77818 13.17408 16.35254 14.06256 16.15882 14.96486z" - fill="#FB813Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/parenting.svg b/assets/zone_v2_icon/parenting.svg deleted file mode 100644 index 719ea97..0000000 --- a/assets/zone_v2_icon/parenting.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M5.96079 9.69571C5.59021 9.81677 5.26667 9.8328 4.86949 9.85738L9.89213 5.07405L10.87805 9.6721L15.83242 9.6721C17.87904 9.6721 19.53811 11.33117 19.53811 13.37779C19.53811 15.42432 17.87904 17.08339 15.83242 17.08339L10.16016 17.08339C7.92572 17.08339 6.09908 15.30134 6.04398 13.06752L5.96079 9.69571z" - fill="#FDDE80ff"></path> - <path - d="M9.6025 4.46082C10.41341 5.55808 9.75648 7.49415 8.20206 8.64297C6.64761 9.79181 3.96818 10.40179 3.055 9.26052C1.96426 7.89731 3.63332 5.60959 5.18777 4.46077C6.74222 3.31196 8.79157 3.36356 9.6025 4.46082z" - fill="#FDDE80ff"></path> - <path - d="M6.87196 6.71961C6.87196 7.12133 6.5463 7.447 6.14457 7.447C5.74284 7.447 5.41718 7.12133 5.41718 6.71961C5.41718 6.31788 5.74284 5.99222 6.14457 5.99222C6.5463 5.99222 6.87196 6.31788 6.87196 6.71961z" - fill="#FB813Aff"></path> - <path - d="M6.14543 12.70627L10.23763 14.1047L8.64211 18.77357L4.54988 17.37514L6.14543 12.70627z" - fill="#FDDE80ff"></path> - <path - d="M14.78726 14.63981L18.7393 12.88387L20.74282 17.3928L16.79078 19.14874L14.78726 14.63981z" - fill="#FDDE80ff"></path> - <path - d="M21.96979 15.99082C22.31914 16.3897 22.27901 16.99613 21.88022 17.34547C15.86986 22.61002 7.48995 22.30915 2.4827 17.30218C2.10779 16.9273 2.10778 16.31942 2.48267 15.94454C2.85756 15.56966 3.4654 15.56966 3.84032 15.94454C8.08284 20.18688 15.31133 20.54678 20.61514 15.90125C21.01392 15.5519 21.62045 15.59203 21.96979 15.99082z" - fill="#FB813Aff"></path> - <path - d="M19.39718 14.39482C19.72656 11.1407 18.06538 10.3655 17.14954 9.91958C17.37629 9.69235 18.31123 9.5818 19.1807 9.99101C20.37235 10.55174 21.10224 11.98934 21.42298 12.9239C21.54499 13.27949 21.33542 13.65331 20.98474 13.78877C20.39798 14.01523 19.57814 14.33251 19.39718 14.39482z" - fill="#FB813Aff"></path> - <path - d="M10.83811 9.66922C10.11696 4.5294 7.26305 3.30956 5.97503 3.99554C5.97565 3.79332 5.97577 3.52899 5.97581 3.2852C5.97588 2.91278 6.25105 2.59212 6.62292 2.5719C11.19946 2.32295 12.21792 7.17193 12.41837 9.66922C12.19757 9.69322 11.40576 9.66922 10.83811 9.66922z" - fill="#FB813Aff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/rural.svg b/assets/zone_v2_icon/rural.svg deleted file mode 100644 index 86890a6..0000000 --- a/assets/zone_v2_icon/rural.svg +++ /dev/null @@ -1,17 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M10.91453 10.73011C7.95237 9.85407 7.59103 5.97928 10.11072 4.12781C13.15738 5.65305 12.98035 8.82602 10.91453 10.73011z" - fill="#57D587ff"></path> - <path - d="M18.67613 9.33284C18.19392 12.384 14.39933 13.24752 12.2351 10.99085C13.34995 7.77122 16.51891 7.53296 18.67613 9.33284z" - fill="#57D587ff"></path> - <path - d="M11.30275 17.05469C7.42624 18.98832 3.35071 15.35866 4.16538 11.05008C8.74932 9.70172 11.6015 13.12618 11.30275 17.05469z" - fill="#57D587ff"></path> - <path - d="M19.80106 14.7049C19.08797 18.83357 13.92499 19.93133 11.03338 16.8288C12.60778 12.48394 16.91021 12.22205 19.80106 14.7049z" - fill="#57D587ff"></path> - <path - d="M16.30752 5.67904C16.56192 6.14421 16.39104 6.72755 15.92592 6.98196C13.72982 8.183 12.6264 10.43021 12.22214 12.83395C11.81539 15.25277 12.15562 17.6279 12.63734 18.80381C12.83827 19.29446 12.60346 19.8551 12.1128 20.05603C11.62224 20.25706 11.0616 20.02224 10.86058 19.53158C10.22304 17.97514 9.87216 15.2304 10.32874 12.51552C10.78781 9.78549 12.10214 6.88484 15.00461 5.29743C15.46973 5.04302 16.05312 5.21388 16.30752 5.67904z" - fill="#1F9F81ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/shortplay.svg b/assets/zone_v2_icon/shortplay.svg deleted file mode 100644 index dae6736..0000000 --- a/assets/zone_v2_icon/shortplay.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M3.28234 9.44915C3.28234 8.65385 3.92704 8.00915 4.72234 8.00915L18.60384 8.00915C19.3991 8.00915 20.04384 8.65385 20.04384 9.44915L20.04384 18.55642C20.04384 19.35168 19.3991 19.99642 18.60384 19.99642L4.72234 19.99642C3.92704 19.99642 3.28234 19.35168 3.28234 18.55642L3.28234 9.44915z" - fill="#6D69E4ff"></path> - <path - d="M3.30774 6.48804C3.30774 5.77451 3.83026 5.16858 4.53603 5.06368L10.46851 4.18192C11.26406 4.06368 12.07267 4.06356 12.86813 4.18158L18.81648 5.06397C19.52246 5.1687 20.04518 5.77471 20.04518 6.48839L20.04518 8.03538L3.30774 8.03538L3.30774 6.48804z" - fill="#FDDE80ff"></path> - <path - d="M3.2646 18.55642L3.2646 8.01092L10.72051 8.01092C10.72051 10.45459 8.77914 15.92371 4.72764 15.92371C6.42906 15.92371 6.81611 17.75664 6.79081 19.16352C6.78217 19.64362 6.36905 19.99642 5.88889 19.99642L4.7046 19.99642C3.90932 19.99642 3.2646 19.35168 3.2646 18.55642z" - fill="#9796EDff"></path> - <path - d="M20.04586 18.55642L20.04586 8.01094L12.59002 8.01094C12.59002 10.45459 14.53133 15.92371 18.58282 15.92371C16.88141 15.92371 16.49434 17.75664 16.51968 19.16352C16.52832 19.64362 16.94141 19.99642 17.4216 19.99642L18.60586 19.99642C19.40112 19.99642 20.04586 19.35168 20.04586 18.55642z" - fill="#9796EDff"></path> - <path - d="M6.42128 8.02812L3.28242 8.02812L3.28242 16.0439C6.1361 16.0439 6.56402 10.70006 6.42128 8.02812z" - fill="#6D69E4ff"></path> - <path - d="M16.90704 8.02812L20.04586 8.02812L20.04586 16.0439C17.19216 16.0439 16.76429 10.70006 16.90704 8.02812z" - fill="#6D69E4ff"></path> - <path - d="M3.2646 15.24941L5.88621 15.24941C6.4164 15.24941 6.84621 15.6792 6.84621 16.20941L6.84621 16.20941C6.84621 16.73962 6.4164 17.16941 5.88621 17.16941L3.2646 17.16941L3.2646 15.24941z" - fill="#FDDE80ff"></path> - <path - d="M20.04586 15.24941L17.42016 15.24941C16.88995 15.24941 16.46016 15.6792 16.46016 16.20941L16.46016 16.20941C16.46016 16.73962 16.88995 17.16941 17.42016 17.16941L20.04586 17.16941L20.04586 15.24941z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/sports.svg b/assets/zone_v2_icon/sports.svg deleted file mode 100644 index 70f6360..0000000 --- a/assets/zone_v2_icon/sports.svg +++ /dev/null @@ -1,8 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M11.96112 11.90266L12.51312 12.57888C12.73104 12.84586 12.83904 13.18579 12.81494 13.52957C12.79085 13.87334 12.63658 14.19494 12.38362 14.4289L6.04611 20.28893C5.83904 20.48045 5.56644 20.58538 5.2844 20.58211C5.00236 20.57875 4.7323 20.46749 4.52977 20.27117C4.32434 20.07216 4.20036 19.80374 4.18199 19.51834C4.16362 19.23283 4.25216 18.95078 4.43037 18.7271L6.93946 15.57552L9.85382 11.91571C9.97968 11.7576 10.13942 11.62973 10.32115 11.54141C10.50298 11.45309 10.70227 11.40653 10.90435 11.40528C11.10643 11.40403 11.3063 11.4481 11.48918 11.53411C11.67206 11.62022 11.83334 11.74618 11.96112 11.90266z" - fill="#1F9F81ff"></path> - <path - d="M16.60733 3.48445C17.30227 3.48483 17.97043 3.75239 18.47347 4.23176C18.97651 4.71111 19.27603 5.36557 19.30992 6.05964C19.34381 6.75371 19.10957 7.43424 18.65558 7.96035C18.2017 8.48647 17.56282 8.81788 16.87123 8.88599L18.26746 9.94675C18.36806 10.02369 18.50237 10.0373 18.61651 9.98345L20.31802 9.18298C20.5559 9.07102 20.82662 9.05058 21.07862 9.12555C21.33053 9.20052 21.54614 9.36564 21.6841 9.58942C21.82022 9.81035 21.86755 10.07472 21.81638 10.32912C21.76522 10.58362 21.61939 10.80912 21.40838 10.96022L18.49757 13.0463C18.27658 13.2047 18.01296 13.29283 17.74118 13.29926C17.46931 13.3057 17.20186 13.23014 16.97357 13.0824L15.44717 12.09437L14.42717 13.19837L16.05888 15.12403C16.09757 15.16934 16.13309 15.21725 16.16544 15.26726L16.21037 15.34358C16.38432 15.6576 16.42637 16.02787 16.3273 16.37299C16.22822 16.71802 15.9961 17.00957 15.68208 17.18352L11.24246 19.64112C10.98701 19.78234 10.6872 19.82035 10.40458 19.7473C10.12205 19.67424 9.87821 19.49568 9.72317 19.24829C9.56556 18.99667 9.50644 18.69571 9.55721 18.4031C9.60797 18.11059 9.76512 17.84707 9.9983 17.66333L12.43757 15.74112L9.98122 14.16269L9.9457 14.13898C9.93869 14.13437 9.93178 14.12966 9.92496 14.12486L9.60547 13.95917C9.44086 13.87421 9.29545 13.75632 9.17823 13.6129C9.06103 13.46938 8.9745 13.30339 8.92404 13.12512C8.87357 12.94694 8.86022 12.76022 8.88483 12.57658C8.90943 12.39293 8.97147 12.21638 9.06708 12.0577L10.72368 9.31018L10.01366 8.9907C9.96048 8.96686 9.90202 8.95716 9.84403 8.96255C9.78595 8.96794 9.73027 8.98823 9.68237 9.02147L7.82232 10.30646C7.60337 10.45786 7.338 10.52707 7.07301 10.50182C6.80803 10.47658 6.56048 10.35859 6.37402 10.16861C6.28791 10.08096 6.22047 9.97679 6.17576 9.86235C6.13105 9.74791 6.10999 9.62558 6.11386 9.50278C6.11773 9.37997 6.14645 9.25923 6.19828 9.14782C6.25011 9.03642 6.32398 8.93669 6.41543 8.85463L9.38007 6.1935C9.55734 6.03445 9.77347 5.925 10.00656 5.87618C10.23965 5.82735 10.48147 5.8409 10.70765 5.91543L14.02493 7.00758C13.89667 6.60188 13.86595 6.17168 13.93507 5.75185C14.00419 5.33202 14.17133 4.93441 14.42285 4.59125C14.67437 4.24808 15.00326 3.96903 15.38275 3.77674C15.76234 3.58444 16.18186 3.4843 16.60733 3.48445L16.60733 3.48445z" - fill="#57D587ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/tech.svg b/assets/zone_v2_icon/tech.svg deleted file mode 100644 index 9874d4e..0000000 --- a/assets/zone_v2_icon/tech.svg +++ /dev/null @@ -1,23 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M12.02688 16.19126L9.47718 16.19126L8.48827 20.24736C8.41458 20.54966 8.64349 20.84102 8.95461 20.84102L12.02688 20.84102L15.09946 20.84102C15.41059 20.84102 15.63955 20.54966 15.56582 20.24736L14.57693 16.19126L12.02688 16.19126z" - fill="#FDDE80ff"></path> - <path - d="M12.0265 5.11161C11.68627 5.11161 11.40749 4.83518 11.40749 4.49694L11.40749 2.92935C11.40749 2.59111 11.68627 2.31468 12.0265 2.31468C12.36662 2.31468 12.6455 2.59111 12.6455 2.92935L12.6455 4.49694C12.6455 4.83518 12.36662 5.11161 12.0265 5.11161z" - fill="#00B9E7ff"></path> - <path - d="M5.44948 12.45869L5.44948 10.1089C5.44948 6.51677 8.40948 3.57738 12.02678 3.57738C15.64464 3.57738 18.60461 6.51677 18.60461 10.1089L18.60461 12.45869C18.60461 12.81619 18.31267 13.10611 17.95267 13.10611L6.1014 13.10611C5.74138 13.10611 5.44948 12.81619 5.44948 12.45869z" - fill="#00B9E7ff"></path> - <path - d="M18.30816 16.26451L5.74677 16.26451C4.34618 16.26451 3.20062 15.15648 3.20062 13.80269C3.20062 12.44851 4.34618 11.34048 5.74677 11.34048L18.30816 11.34048C19.7088 11.34048 20.85427 12.44851 20.85427 13.80269C20.85427 15.15648 19.7088 16.26451 18.30816 16.26451z" - fill="#59E1F9ff"></path> - <path - d="M18.0864 13.80269C18.0864 14.2633 17.71018 14.63683 17.2463 14.63683C16.78205 14.63683 16.40621 14.2633 16.40621 13.80269C16.40621 13.34208 16.78205 12.96845 17.2463 12.96845C17.71018 12.96845 18.0864 13.34208 18.0864 13.80269z" - fill="#00B9E7ff"></path> - <path - d="M7.64822 13.80259C7.64822 14.2632 7.272 14.63683 6.80816 14.63683C6.3439 14.63683 5.9681 14.2632 5.9681 13.80259C5.9681 13.34198 6.3439 12.96835 6.80816 12.96835C7.272 12.96835 7.64822 13.34198 7.64822 13.80259z" - fill="#00B9E7ff"></path> - <path - d="M12.91315 13.8025C12.91315 14.2631 12.53693 14.63674 12.07315 14.63674C11.6089 14.63674 11.23306 14.2631 11.23306 13.8025C11.23306 13.34189 11.6089 12.96826 12.07315 12.96826C12.53693 12.96826 12.91315 13.34189 12.91315 13.8025z" - fill="#00B9E7ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/travel.svg b/assets/zone_v2_icon/travel.svg deleted file mode 100644 index e2891a1..0000000 --- a/assets/zone_v2_icon/travel.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M7.28637 20.13062C7.28637 19.42819 7.85893 18.85872 8.56137 18.85872C9.2638 18.85872 9.83635 19.42819 9.83635 20.13062C9.83635 20.83306 9.2638 21.40253 8.56137 21.40253C7.85893 21.40253 7.28637 20.83306 7.28637 20.13062z" - fill="#59E1F9ff"></path> - <path - d="M14.51731 20.13062C14.51731 19.42819 15.08986 18.85872 15.79229 18.85872C16.49472 18.85872 17.06726 19.42819 17.06726 20.13062C17.06726 20.83306 16.49472 21.40253 15.79229 21.40253C15.08986 21.40253 14.51731 20.83306 14.51731 20.13062z" - fill="#59E1F9ff"></path> - <path - d="M9.77107 3.69966C9.29394 3.69966 8.90712 4.08648 8.90712 4.56366L8.90712 9.36919L7.75512 9.36919L7.75512 4.56366C7.75512 3.45025 8.65771 2.54766 9.77107 2.54766L14.35613 2.54766C15.46954 2.54766 16.37213 3.45025 16.37213 4.56366L16.37213 9.63337L15.22013 9.63337L15.22013 4.56366C15.22013 4.08648 14.83325 3.69966 14.35613 3.69966L9.77107 3.69966z" - fill="#59E1F9ff"></path> - <path - d="M7.37112 4.56367C7.37112 3.23819 8.44563 2.16366 9.77107 2.16366L14.35613 2.16366C15.6816 2.16366 16.75613 3.23818 16.75613 4.56366L16.75613 10.01737L14.83613 10.01737L14.83613 4.56366C14.83613 4.29856 14.62118 4.08366 14.35613 4.08366L9.77107 4.08366C9.50603 4.08366 9.29112 4.29856 9.29112 4.56367L9.29112 9.7532L7.37112 9.7532L7.37112 4.56367zM9.77107 2.93166C8.86979 2.93166 8.13912 3.66233 8.13912 4.56367L8.13912 8.9852L8.52312 8.9852L8.52312 4.56367C8.52312 3.87442 9.08187 3.31566 9.77107 3.31566L14.35613 3.31566C15.04541 3.31566 15.60413 3.87441 15.60413 4.56366L15.60413 9.24937L15.98813 9.24937L15.98813 4.56366C15.98813 3.66233 15.25747 2.93166 14.35613 2.93166L9.77107 2.93166z" - fill="#59E1F9ff"></path> - <path - d="M9.77146 4.03555C9.47984 4.03555 9.24345 4.27194 9.24345 4.56355L9.24345 4.80656C9.24345 5.31025 8.83513 5.71857 8.33145 5.71857C7.82776 5.71857 7.41945 5.31025 7.41945 4.80656L7.41945 4.56355C7.41945 3.26458 8.47247 2.21155 9.77146 2.21155L14.35642 2.21155C15.65539 2.21155 16.70842 3.26458 16.70842 4.56355L16.70842 4.90056C16.70842 5.40424 16.30013 5.81256 15.79642 5.81256C15.2928 5.81256 14.88442 5.40424 14.88442 4.90056L14.88442 4.56355C14.88442 4.27194 14.64806 4.03555 14.35642 4.03555L9.77146 4.03555z" - fill="#59E1F9ff"></path> - <path - d="M5.11429 8.49827C5.11429 7.7029 5.75914 7.05815 6.55452 7.05827C10.23398 7.05876 13.91347 7.05902 17.59296 7.05831C18.38842 7.05816 19.03334 7.70292 19.03334 8.49836L19.03334 18.42451C19.03334 19.21978 18.3887 19.86451 17.59334 19.86451C13.91366 19.86451 10.23398 19.86451 6.55429 19.86451C5.75901 19.86451 5.11429 19.21978 5.11429 18.42451L5.11429 8.49827z" - fill="#00B9E7ff"></path> - <path - d="M8.86945 11.22643C8.86945 10.69622 9.29926 10.26643 9.82944 10.26643C10.35965 10.26643 10.78944 10.69622 10.78944 11.22643L10.78944 15.69638C10.78944 16.22659 10.35965 16.65638 9.82944 16.65638C9.29926 16.65638 8.86945 16.22659 8.86945 15.69638L8.86945 11.22643z" - fill="#FDDE80ff"></path> - <path - d="M13.35821 11.22643C13.35821 10.69622 13.788 10.26643 14.31821 10.26643C14.84842 10.26643 15.27821 10.69622 15.27821 11.22643L15.27821 15.69638C15.27821 16.22659 14.84842 16.65638 14.31821 16.65638C13.788 16.65638 13.35821 16.22659 13.35821 15.69638L13.35821 11.22643z" - fill="#FDDE80ff"></path> -</svg> \ No newline at end of file diff --git a/assets/zone_v2_icon/vlog.svg b/assets/zone_v2_icon/vlog.svg deleted file mode 100644 index bb8343d..0000000 --- a/assets/zone_v2_icon/vlog.svg +++ /dev/null @@ -1,26 +0,0 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="100%" height="100%"> - <path - d="M19.21968 13.77802C19.42733 13.68547 19.56115 13.47936 19.56115 13.25194L19.56115 10.74586L20.71315 9.59381L20.71315 14.2224C20.71315 14.90957 20.30602 15.53146 19.67616 15.80621L13.80115 18.3696L10.51142 17.65949L19.21968 13.77802z" - fill="#6D69E4ff"></path> - <path - d="M19.56115 10.74586L20.71315 10.74586L20.71315 11.32186C20.71315 11.6399 20.4552 11.89786 20.13715 11.89786L19.56115 11.89786L19.56115 10.74586z" - fill="#6D69E4ff"></path> - <path - d="M18.40877 7.866C18.40877 7.54788 18.66662 7.29 18.98477 7.29L20.13677 7.29C20.45491 7.29 20.71277 7.54788 20.71277 7.866L20.71277 10.74595C20.71277 11.0641 20.45491 11.32195 20.13677 11.32195L18.98477 11.32195C18.66662 11.32195 18.40877 11.0641 18.40877 10.74595L18.40877 7.866z" - fill="#6D69E4ff"></path> - <path - d="M17.54477 3.8339L5.44875 3.8339C4.65346 3.8339 4.00875 4.47862 4.00875 5.2739L4.00875 12.76195C4.00875 13.55722 4.65347 14.20195 5.44875 14.20195L17.54477 14.20195C18.34003 14.20195 18.98477 13.55722 18.98477 12.76195L18.98477 5.2739C18.98477 4.47862 18.34003 3.8339 17.54477 3.8339z" - fill="#6D69E4ff"></path> - <path - d="M6.31312 6.13781C6.31312 5.50158 6.82889 4.98581 7.46512 4.98581L14.95315 4.98581C15.58934 4.98581 16.10515 5.50158 16.10515 6.13781L16.10515 11.89786C16.10515 12.53405 15.58934 13.04986 14.95315 13.04986L7.46512 13.04986C6.82889 13.04986 6.31312 12.53405 6.31312 11.89786L6.31312 6.13781z" - fill="#FDDE80ff"></path> - <path - d="M9.76877 7.50189C9.76877 7.04184 10.2815 6.76744 10.66426 7.02263L13.08182 8.63436C13.42387 8.86236 13.42387 9.36489 13.08182 9.59289L10.66426 11.20464C10.2815 11.45981 9.76877 11.18544 9.76877 10.72531L9.76877 7.50189z" - fill="#6D69E4ff"></path> - <path - d="M10.34515 16.50586C10.34515 15.7105 10.98989 15.06586 11.78515 15.06586L13.51315 15.06586C14.30842 15.06586 14.95315 15.7105 14.95315 16.50586L14.95315 19.09786C14.95315 19.89312 14.30842 20.53786 13.51315 20.53786L11.78515 20.53786C10.98989 20.53786 10.34515 19.89312 10.34515 19.09786L10.34515 16.50586z" - fill="#6D69E4ff"></path> - <path - d="M10.34515 17.8895L14.95315 17.8895L14.95315 18.8495L10.34515 18.8495L10.34515 17.8895z" - fill="#9796EDff"></path> -</svg> \ No newline at end of file diff --git a/docs/APP_widget/splash.md b/docs/APP_widget/splash.md deleted file mode 100644 index 2a3179c..0000000 --- a/docs/APP_widget/splash.md +++ /dev/null @@ -1,567 +0,0 @@ -# APP端开屏图片 - -## 获取APP端开屏图片列表 - -> https://app.bilibili.com/x/v2/splash/brand/list - -*请求方式:GET* - -鉴权方式:APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-----|-------|---------|-----| -| appkey | str | APP密钥 | APP方式必要 | | -| ts | num | 当前时间戳 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|---------------------------------------| -| code | num | 返回值 | 0:成功<br />-3:API校验密匙错误<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------|-------|--------|--------| -| pull_interval | num | 1800 | 作用尚不明确 | -| forcibly | bool | false | 作用尚不明确 | -| rule | str | order | 作用尚不明确 | -| list | array | 开屏图片列表 | | -| show | array | 默认显示项 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-----------|-----| -| 0 | obj | 开屏图片1 | | -| n | obj | 开屏图片(n+1) | | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|---------------------|-----| -| id | num | 开屏图片id | | -| thumb | str | 开屏图片url | | -| logo_url | str | “bilibili”logo图片url | | - -`data`中的`show`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-------|-----| -| 0 | obj | 套了个娃? | | - -`show`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|--------|--------| -| id | num | 开屏图片id | | -| begin_time | num | 起始时间? | 时间戳 | -| end_time | num | 结束时间? | 时间戳 | -| probability | num | 0 | 作用尚不明确 | -| duration | num | 显示时间? | 单位为毫秒 | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/v2/splash/brand/list' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=78a89e153cd6231a4a4d55013aa063ce' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "pull_interval": 1800, - "forcibly": false, - "rule": "order", - "list": [ - { - "id": 10, - "thumb": "http://i0.hdslb.com/bfs/archive/e2d2f57e08b511d1a47203859f7bddb4ef9d4e16.png", - "logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png" - }, - { - "id": 11, - "thumb": "http://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png", - "logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png" - }, - { - "id": 12, - "thumb": "http://i0.hdslb.com/bfs/archive/574469a4a20f41ba4dc9ecd41d15f94eea875ed9.png", - "logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png" - }, - { - "id": 13, - "thumb": "http://i0.hdslb.com/bfs/archive/af0f4f611faa34340bd4f91def1973ccbfb8fbb3.png", - "logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png" - }, - { - "id": 14, - "thumb": "http://i0.hdslb.com/bfs/archive/1d40e975b09d5c87b11b3ae0c9ce6c6b82f63d9e.png", - "logo_url": "http://i0.hdslb.com/bfs/archive/ecc9b29bb4b803daf2a46fe5ef71bf530300162c.png" - } - ], - "show": [ - { - "id": 12, - "begin_time": 1597564800, - "end_time": 1630753108, - "probability": 0, - "duration": 700 - } - ] - } -} -``` - -</details> - -如id=11的图片为: - -<img src="https://i0.hdslb.com/bfs/archive/fe737da5cdedf9dad038e5fd30e957be8a063bc2.png" referrerpolicy="no-referrer" /> - - -## 获取APP端开屏幕广告信息 - -> https://app.bilibili.com/x/v2/splash/list - -*请求方式: GET* - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|-----------------------|-----|-----| -| build | int | 客户端内部版本号 | 必要 | | -| mobi_app | str | android, iphone, ipad | 必要 | | -| platform | str | android, ios | 必要 | | -| height | int | 屏幕高度 | 必要 | | -| width | int | 屏幕宽度 | 必要 | | -| birth | str | 生日日期(四位数,例 0101) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|---------------------------------------| -| code | num | 返回值 | 0:成功<br />-3:API校验密匙错误<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|--------|---------------------|---------| -| splash_request_id | 当前请求id | 长度为33, 前13位是当前秒级时间戳 | | -| max_time | int | 最长显示时间? | | -| min_interval | int | 最少显示时间? | 千分之一秒单位 | -| pull_interval | int | 显示时间? | | -| keep_ids | int | 显示时间? | | -| list | list | 广告 list | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------------------|-------|---------------|--------| -| id | int | 广告id | | -| type | int | 1 | | -| card_type | int | 39 | | -| duration | int | 持续时间? | | -| begin_time | int | 开始展示时间 | 秒级时间戳 | -| end_time | int | 停止展示时间 | 毫秒级时间戳 | -| thumb | url | 广告图片 | | -| hash | str | 作用尚不明确 | | -| logo_url | str | 空值 | | -| logo_hash | str | 空值 | | -| skip | int | 是否跳转? | | -| uri | str | 跳转的url | | -| video_url | str | 视频url | | -| video_hash | str | 视频hash | | -| video_width | num | 视频宽度 | | -| video_height | num | 视频高度 | | -| uri_title | str | 空值 | | -| source | int | 929 | | -| cm_mark | int | 1 | | -| ad_cb | str | 作用尚不明确 | | -| resource_id | int | 926 | | -| request_id | str | 作用尚不明确 | | -| client_ip | str | 客户端IP | | -| is_ad | bool | 作用尚不明确 | | -| is_ad_loc | bool | 作用尚不明确 | | -| schema_title | str | 滑动进入第三方应用 | | -| schema_callup_white_list | array | 跳转的 APP 的白名单 | | -| extra | obj | 显示信息? | | -| enable_pre_download | bool | 是否可以当场下载 APP? | | -| enable_background_download | bool | 是否可以静默下载 APP? | | -| interact_type | int | 是否可以跳转(互动)? | | -| interact_url | str | 跳转(互动) url | | -| interact_distance | int | 作用尚不明确 | | -| guide_button_list | array | 所有的按钮 | | -| mark_with_skip_style | num | 作用尚不明确 | | -| skip_button_height | num | 作用尚不明确 | | - -`extra`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------------------|-------|-----|-----| -| use_ad_web_v2 | bool | | | -| show_urls | array | | | -| click_urls | array | | | -| show_1s_urls | array | | | -| download_whitelist | array | | | -| open_whitelist | array | | | -| card | obj | | | -| report_time | num | | | -| sales_type | num | | | -| special_industry | bool | | | -| preload_landingpage | num | | | -| share_info | obj | | | -| upzone_entrance_type | num | | | -| upzone_entrance_report_id | num | | | -| topview_pic_url | str | | | -| topview_video_url | str | | | -| click_area | num | | | -| shop_id | num | | | -| up_mid | num | | | -| track_id | str | | | -| enable_store_direct_launch | int | | | -| enable_double_jump | bool | | | -| store_callup_card | bool | | | -| enable_h5_alert | bool | | | -| special_industry_style | num | | | -| macro_replace_priority | num | | | -| feedback_panel_style | num | | | -| ad_content_type | num | | | -| enable_h5_pre_load | num | | | -| hot_activity_id | num | | | -| product_id | num | | | -| landingpage_download_style | num | | | - -`guide_button_list` 中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------------------------|-------|-----|-------| -| id | int | | | -| x | int | | | -| y | int | | | -| bg_color | str | | | -| bg_color_night | str | | | -| text_color | str | | | -| text_color_night | str | | | -| guide_instructions | str | | | -| guide_instructions_new | str | 空值 | | -| width | str | | | -| jump_url | str | | | -| schema_package_name | str | | | -| schema_title | str | | | -| schema_title_new | str | 空值 | | -| height | str | | | -| slide_threshold_value | str | | | -| slide_border_color | str | | | -| guide_image_url | str | | | -| guide_image_md5 | str | | | -| interact_style | str | | | -| jump_image_url | str | | | -| jump_image_md5 | str | | | -| schema_image_url | str | | | -| schema_image_md5 | str | | | -| click_expand_ratio | str | | | -| logo_image_url | str | | | -| logo_image_md5 | str | | | -| related_ids | array | 空 | | -| schema_list | array | 空 | | -| font_ratio | num | | | -| seq | num | | | -| degrade_type | num | | | -| twist_angle | num | | | -| twist_speed | num | | | -| secondary_guide_instructions | str | | | -| secondary_font_ratio | num | | | -| secondary_text_color | str | | | -| secondary_text_color_night | str | | | -| activity_time | num | | 秒级时间戳 | -| time_show_type | num | | | - -**示例:** - -```shell -curl -X GET 'https://app.bilibili.com/x/v2/splash/list' \ - --data-urlencode 'build=999999999' \ - --data-urlencode 'mobi_app=android' \ - --data-urlencode 'platform=android' \ - --data-urlencode 'height=1920' \ - --data-urlencode 'width=1080' \ - --data-urlencode 'birth=0101' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "max_time": 4, - "min_interval": 14400, - "pull_interval": 900, - "keep_ids": null, - "list": [ - { - "id": 9460, - "type": 1, - "card_type": 39, - "duration": 5, - "begin_time": 1663689600, - "end_time": 1663775999, - "thumb": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/cb001c291c6011940e29531dcce6b1e8.webp", - "hash": "712d3df973f99fdcd30c2419d19630dc", - "logo_url": "", - "logo_hash": "", - "skip": 1, - "uri": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419", - "video_url": "http://upos-sz-static.bilivideo.com/ssaxcode/89/jl/n220831a21uql976d44zun4y0ykmjl89-1-SPLASH.mp4", - "video_hash": "ae10333c160452cc2755d079db10b597", - "video_width": 1080, - "video_height": 1920, - "uri_title": "", - "source": 929, - "cm_mark": 1, - "ad_cb": "COfrARC7jxUY9EkgADDWwCE4oQdCIDE2NjM2NDY2MzY1ODhxMTcyYTI2YTE5MmE5NnE1NDE0SKy0xMi1MFIG5aSp5rSlaP///////////wFw////////////AYABS4gB5+sBsgEg8mQFw0bBxGOGYE8OBhMOd3DE8OGFZXhookrFX4s3UrrwAruPFdgD9Ek=", - "resource_id": 926, - "request_id": "1663646636588q172a26a192a96q5414", - "client_ip": "117.14.146.37", - "is_ad": true, - "is_ad_loc": true, - "schema_title": "滑动进入第三方应用", - "schema_callup_white_list": [ - "tmall", - "taobao", - "openapp.jdmobile", - "weixin", - "alipays", - "tbopen", - "eleme", - "qqmusic", - "pddopen", - "upwallet", - "yocial://plaza/?tab=0", - "hiapplink", - "meiju", - "midea-meiju", - "uclink", - "qklink", - "taobaolite", - "lazyaudio", - "meituanwaimai", - "baiduboxapp://", - "baiduboxapp", - "fleamarket", - "dewuapp", - "duappmoblink", - "cmblife", - "imeituan", - "vmall", - "music", - "pinduoduo" - ], - "extra": { - "use_ad_web_v2": true, - "show_urls": [ - "https://g.cn.miaozhen.com/x/k=2315612&p=8EUuC&dx=__IPDX__&rt=2&pro=s&ns=__IP__&ni=__IESID__&v=__LOC__&xa=__ADPLATFORM__&tr=__REQUESTID__&vg=__AUTOPLAY__&nh=__AUTOREFRESH__&mo=__OS__&m0=__OPENUDID__&m0a=__DUID__&m1=__ANDROIDID1__&m1a=__ANDROIDID__&m2=__IMEI__&m4=__AAID__&m5=__IDFA__&m6=__MAC1__&m6a=__MAC__&m11=__OAID__&m14=__CAID__&m5a=__IDFV__&mn=__ANAME__&m5b=__IDFA1__&m11a=__OAID1__&m14a=__CAID1__&o=" - ], - "click_urls": [ - "https://e.cn.miaozhen.com/r/k=2315612&p=8EUuC&dx=__IPDX__&rt=2&pro=s&ns=__IP__&ni=__IESID__&v=__LOC__&xa=__ADPLATFORM__&tr=__REQUESTID__&mo=__OS__&m0=__OPENUDID__&m0a=__DUID__&m1=__ANDROIDID1__&m1a=__ANDROIDID__&m2=__IMEI__&m4=__AAID__&m5=__IDFA__&m6=__MAC1__&m6a=__MAC__&m11=__OAID__&m14=__CAID__&m5a=__IDFV__&mn=__ANAME__&m5b=__IDFA1__&m11a=__OAID1__&m14a=__CAID1__&o=" - ], - "show_1s_urls": [], - "download_whitelist": [], - "open_whitelist": [ - "tmall", - "taobao", - "openapp.jdmobile", - "weixin", - "alipays", - "tbopen", - "eleme", - "qqmusic", - "pddopen", - "upwallet", - "yocial://plaza/?tab=0", - "hiapplink", - "meiju", - "midea-meiju", - "uclink", - "qklink", - "taobaolite", - "lazyaudio", - "meituanwaimai", - "baiduboxapp://", - "baiduboxapp", - "fleamarket", - "dewuapp", - "duappmoblink", - "cmblife", - "imeituan", - "vmall", - "music", - "pinduoduo" - ], - "card": { - "card_type": 0, - "extreme_team_status": false, - "support_transition": false, - "under_player_interaction_style": 0, - "grade_denominator": 0, - "star_level": 0, - "live_booking_population_threshold": 0, - "ori_mark_hidden": 0, - "use_multi_cover": false, - "fold_time": 0, - "live_room_popularity": 0, - "live_tag_show": false, - "grade_level": 0 - }, - "report_time": 0, - "sales_type": 75, - "special_industry": false, - "preload_landingpage": 0, - "share_info": {}, - "upzone_entrance_type": 0, - "upzone_entrance_report_id": 0, - "topview_pic_url": "", - "topview_video_url": "", - "click_area": 0, - "shop_id": 0, - "up_mid": 0, - "track_id": "pbaes.Y5ATuPVlG6ysPF6cvl6W8B-BYexhSJzrKH3NYfC3KIHDb9W5cxPA4_FTEPWYDED5DjfRwb3tcrLppYAqQ87SSg==", - "enable_store_direct_launch": 0, - "enable_double_jump": false, - "store_callup_card": false, - "enable_h5_alert": false, - "special_industry_style": 0, - "macro_replace_priority": 1, - "feedback_panel_style": 0, - "ad_content_type": 0, - "enable_h5_pre_load": 0, - "hot_activity_id": 0, - "product_id": 0, - "landingpage_download_style": 2 - }, - "enable_pre_download": true, - "enable_background_download": true, - "interact_type": 1, - "interact_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419", - "interact_distance": 60, - "guide_button_list": [ - { - "id": 49037, - "x": 50, - "y": 78, - "bg_color": "#80000000", - "bg_color_night": "#80000000", - "text_color": "#FFFFFFFF", - "text_color_night": "#FFFFFFFF", - "guide_instructions": "点击进入活动页", - "guide_instructions_new": "", - "width": 70, - "jump_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419", - "schema_package_name": "", - "schema_title": "", - "schema_title_new": "", - "height": 7, - "slide_threshold_value": 5, - "slide_border_color": "#40FFFFFF", - "guide_image_url": "", - "guide_image_md5": "", - "interact_style": 6, - "jump_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json", - "jump_image_md5": "26d8b4b516f83a3f9b15fef643464cc6", - "schema_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json", - "schema_image_md5": "26d8b4b516f83a3f9b15fef643464cc6", - "click_expand_ratio": 100, - "logo_image_url": "https://i0.hdslb.com/bfs/sycp/mgk/img/202106/17006d50ec506813727b1cb5c6fc58b1.png", - "logo_image_md5": "86bc1b68ce4708d918cd4e01a975ca17", - "related_ids": [], - "schema_list": [], - "font_ratio": 0.23, - "seq": 0, - "degrade_type": 1, - "twist_angle": 0, - "twist_speed": -1, - "secondary_guide_instructions": "", - "secondary_font_ratio": 0, - "secondary_text_color": "", - "secondary_text_color_night": "", - "activity_time": 1662532059, - "time_show_type": 0 - }, - { - "id": 49040, - "x": 50, - "y": 83, - "bg_color": "#80000000", - "bg_color_night": "#80000000", - "text_color": "#FFFFFFFF", - "text_color_night": "#FFFFFFFF", - "guide_instructions": "即可前往 开吃新品", - "guide_instructions_new": "", - "width": 64, - "jump_url": "https://market.m.taobao.com/app/mwdk-industry/mwdk-shopping-base/pages/peppa.html?disableNav=YES&merchantCode=HM&pageId=105240&path=%2Fact%2Frax%2Fmanual1455861656935693595&renderChannelCode=HM&siteCode=HM_8_7dd8299642994fa196f9a9aae4fd4391_3&spma=a225z&usePayment=alipayMiniApp&utm_campaign=dwlx&utm_source=1234&targetShopId=199273419", - "schema_package_name": "", - "schema_title": "滑动进入第三方应用", - "schema_title_new": "", - "height": 3, - "slide_threshold_value": 5, - "slide_border_color": "#40FFFFFF", - "guide_image_url": "", - "guide_image_md5": "", - "interact_style": 3, - "jump_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json", - "jump_image_md5": "26d8b4b516f83a3f9b15fef643464cc6", - "schema_image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202208/f61a66cf54bc71d9bd1b81bde79c0140.json", - "schema_image_md5": "26d8b4b516f83a3f9b15fef643464cc6", - "click_expand_ratio": 100, - "logo_image_url": "https://i0.hdslb.com/bfs/sycp/mgk/img/202106/17006d50ec506813727b1cb5c6fc58b1.png", - "logo_image_md5": "86bc1b68ce4708d918cd4e01a975ca17", - "related_ids": [ - 49037 - ], - "schema_list": [], - "font_ratio": 0.23, - "seq": 99, - "degrade_type": 0, - "twist_angle": 0, - "twist_speed": -1, - "secondary_guide_instructions": "", - "secondary_font_ratio": 0, - "secondary_text_color": "", - "secondary_text_color_night": "", - "activity_time": 1662532059, - "time_show_type": 0 - } - ], - "mark_with_skip_style": 0, - "skip_button_height": 0.0557 - } - ], - "splash_request_id": "1663646636605q172a24a57a232q5796" - } -} -``` -</details> diff --git a/docs/APP_widget/ver.md b/docs/APP_widget/ver.md deleted file mode 100644 index 3296c87..0000000 --- a/docs/APP_widget/ver.md +++ /dev/null @@ -1,236 +0,0 @@ -# 获取最新 APP 版本 - -## 获取版本信息 - -> https://app.bilibili.com/x/v2/version - -*请求方法: GET* - -<!--{ - "from": { - "url": "https://app.bilibili.com/" - } -}--> - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| mobi_app | str | 目标客户端类型 | 不必要 | 留空为最新有更新的平台<br />android: Android 版<br />iphone: iPhone 版<br />ipad: iPad HD 版<br />win: UWP 版<br />android_tv_yst: TV 版<br />android_car: 车机版<br />pc_client: PC 客户端 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | int | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 `0` | -| ttl | int | 1 | | -| data | array | 版本信息列表 | | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| plat | int | 平台 | 0: Android<br />1: iPhone<br />2: iPad HD<br />3: UWP<br />12: TV 版<br />35: 车机版<br />40: PC 客户端 | -| desc | str | 版本描述 | | -| version | str | 版本号 | | -| build | int | 内部版本号 | | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/v2/version' \ ---url-query'mobi_app=android' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "plat": 0, - "desc": "-修复了一些bug,切了个大西瓜~", - "version": "8.9.0", - "build": 8090300, - "ptime": 1723612377 - }, - // ... - { - "plat": 0, - "desc": "[修正]横屏状态下,视频列表加载失败的问题\n[修正]超过48kHz采样率的音频无法播放的问题\n[修正]部分系统黑屏的问题\nPS:帮下面的同学祈祷早日上架", - "version": "2.0.4", - "build": 0, - "ptime": 1382630400 - } - ] -} -``` - -</details> - -## 版本升级 - -> https://app.bilibili.com/x/v2/version/fawkes/upgrade - -*请求方式: GET* - -鉴权方式(非必须):[APP API 签名与鉴权](../misc/sign/APP.md) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| - | - | - | - | - | -| abi | str | 设备 CPU ABI | 不必要 | 如 `arm64-v8a` | -| appid | str | 客户端类型 | 不必要 | 如 `tv.danmaku.bili` | -| brand | str | 设备品牌 | 不必要 | 如 `google` | -| build | int | 当前 APP 版本号 | 必要 | 如 `8000200` | -| channel | str | APP 分发渠道 | 必要 | 如 `master` | -| deviceid | str | 设备唯一 ID | 不必要 | 即 XU-Prefixed BUVID,见 [device_identity](../misc/device_identity.md) | -| env | str | APP 分发环境 | 不必要 | 默认 `prod` | -| iv | int | 当前 APP innerVer | 不必要 | 如 `8000210` | -| mobi_app | str | APP mobi_app | 必要 | 如 `android` | -| model | str | 设备型号 | 不必要 | 如 `Pixel 2 XL` | -| nt | str | - | 必要 | 默认 `1` | -| ov | str | 设备 OS 版本 | 必要 | 安卓即 API Level,如 Android 11 为 `30` | -| platform | str | 设备平台 | 不必要 | 如 `android` | -| screen | str | 设备屏幕参数 | 不必要 | 如 `2712_1440@537.882_537.882` -| sn | int | 当前 APP SN | 必要 | 如 `15088473` | -| vn | str | 当前 APP 版本名称 | 必要 | 如 `8.0.0` | - -**标头参数(Headers):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| - | - | - | - | - | -| app-key | str | APPKey 名称 | 必要 | 大体等同于 [`mobi_app`](../misc/sign/APPKey.md)。特别地:64 位版本粉版客户端应为 `android64` | -| buvid | str | BUVID | 必要 | XU-Prefixed BUVID,见 [device_identity](../misc/device_identity.md) | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| code | int | 返回值 | 0: 成功<br />-304: 木有改动<br />-400: 请求异常 | -| message | str | 错误信息 | 默认为 `0` | -| ttl | int | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| title | str | 标题 | | -| content | str | 内容 | | -| version | str | 最新版本名称 | | -| version_code | int | 最新版本号 | 即 `build` | -| url | str | 下载地址 | | -| size | int | 大小 | 单位字节 | -| md5 | str | MD5 值 | | -| silent | int | 是否静默安装? | | -| upgrade_type | int | 升级类型? | | -| cycle | int | 升级周期? | | -| policy | int | 升级策略? | | -| policy_url | str | 升级策略链接? | | -| ptime | int | 发布时间 | | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/v2/version/fawkes/upgrade' \ ---url-query 'build=1145141' \ ---url-query 'channel=apt' \ ---url-query 'mobi_app=android' \ ---url-query 'nt=awa' \ ---url-query 'ov=qwq' \ ---url-query 'platform=archlinux' \ ---url-query 'sn=919810' \ ---url-query 'vn=!!!' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "title": "升级提醒", - "content": "-修复了一些bug,并吃了一桶冰淇凌~\n-记得检查暑假作业哦!", - "version": "8.10.0", - "version_code": 8100300, - "url": "https://dl.hdslb.com/mobile/pack/android64/15793300/iBiliPlayer-apinkRelease-8.10.0-b15793300.apk", - "size": 132432843, - "md5": "f196c0ea68ff894dab0cf380cafad802", - "silent": 0, - "upgrade_type": 1, - "cycle": 4, - "policy": 0, - "policy_url": "", - "is_gray": 0, - "ptime": 1724207041 - } -} -``` - -</details> - -## 拼接最新版本下载地址 - -> https://api.bilibili.com/x/web-frontend/getappversion - -*请求方法: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---- | ---- | ---- | ---- | ---- | -| target | string | 目标平台 | 目测仅 `pc_electron`, 错误的值会导致返回 `HTTP 404` | -| cdn_url | string | CDN URL | 任意字符串, 默认 `https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe` | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-1: need target | -| message | string | 错误消息 | 成功时无此项 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cdn_url | string | CDN URL | 内容同请求参数 `cdn_url` | -| sole_cdn_url | string | 带版本的 CDN URL | `cdn_url + "?v=" + 最新版本` | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/web-frontend/getappversion' \ ---url-query 'target=pc_electron' \ ---url-query 'cdn_url=https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "cdn_url": "https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe", - "sole_cdn_url": "https://dl.hdslb.com/mobile/fixed/bili_win/bili_win-install.exe?v=1.16.1-2" - } -} -``` - -</details> diff --git a/docs/activity/info.md b/docs/activity/info.md deleted file mode 100644 index ddf2f68..0000000 --- a/docs/activity/info.md +++ /dev/null @@ -1,93 +0,0 @@ -# 活动主题信息 - -## 主题信息 - -> https://api.bilibili.com/x/activity/subject/info - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| - | - | - | - | - | -| sid | num | 活动 id | 必要 | | -| bvid | str | 来源视频 bvid | 非必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| id | num | 活动 id | | -| oid | num | 0 | | -| type | num | 13 | | -| state | num | 1 | | -| stime | num | 开始时间 | UNIX 秒级时间戳 | -| etime | num | 结束时间 | UNIX 秒级时间戳 | -| ctime | num | 创建时间 | UNIX 秒级时间戳 | -| mtime | num | 修改时间 | UNIX 秒级时间戳 | -| name | str | 活动名称 | | -| act_url | str | 活动链接 | | -| lstime | num | ? | 作用尚不明确 | -| letime | num | ? | 作用尚不明确 | -| cover | str | 封面图片 | | -| dic | str | 简介 | | -| h5_cover | str | H5 封面 | | -| android_url | str | Android 端活动链接 | | -| ios_url | str | iOS 端活动链接 | | -| child_sids | str | 子活动 id? | | -| calendar | str | 日历? | 空 或 `{}`? | -| lid | num | ? | 仅在传入 bvid 时存在 | - -**示例:** - -```shell -curl -G --url 'https://api.bilibili.com/x/activity/subject/info' \ ---url-query 'sid=4017552' \ ---url-query 'bvid=BV1mKY4e8ELy' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 4017552, - "oid": 0, - "type": 13, - "state": 1, - "stime": 1720540800, - "etime": 1728575999, - "ctime": 1720439769, - "mtime": 1720591285, - "name": "科技猎手2024第2季", - "act_url": "https://www.bilibili.com/blackboard/era/kejilieshou2PC.html", - "lstime": 1720540800, - "letime": 1728575999, - "cover": "https://i0.hdslb.com/bfs/activity-plat/static/98bc38873cc71e154019070975cd20a0/fLOEOStVUV.jpg", - "dic": "科技猎手召集中!投稿赢奖金>>", - "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/98bc38873cc71e154019070975cd20a0/PTIFsXkV0o.jpg", - "android_url": "https://www.bilibili.com/blackboard/era/kejilieshou2H5.html", - "ios_url": "https://www.bilibili.com/blackboard/era/kejilieshou2H5.html", - "child_sids": "", - "calendar": "", - "lid": 294258214 - } -} -``` - -</details> diff --git a/docs/activity/list.md b/docs/activity/list.md deleted file mode 100644 index f187bd5..0000000 --- a/docs/activity/list.md +++ /dev/null @@ -1,213 +0,0 @@ -# 活动列表 - -## 获取活动列表 - -> https://api.bilibili.com/x/activity/page/list - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| plat | str | 活动平台类型? | 必要 | 可选范围 [1, 3], 以半角逗号分隔, 默认 `1,3` | -| mold | int | 0 | 非必要 | | -| http | int | 3 | 非必要 | | -| pn | int | 目标页码 | 非必要 | 默认为 `1` | -| ps | int | 每页条数 | 非必要 | 默认为 `15` | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| code | int | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | int | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| list | array | 活动列表 | | -| num | int | 当前页码 | | -| size | int | 每页条数 | | -| total | int | 总条数 | | - -`list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| id | int | 活动 ID | | -| state | int | 1 | | -| stime | int | 开始时间 | UNIX 秒级时间戳 | -| etime | int | 结束时间 | UNIX 秒级时间戳 | -| ctime | int | 创建时间? | UNIX 秒级时间戳, 可能为 0 | -| mtime | int | 修改时间? | UNIX 秒级时间戳, 可能为 0 | -| name | str | 活动名称 | | -| author | str | 空 || -| pc_url | str | 空 || -| rank | int | 0 | | -| h5_url | str | 活动链接 | | -| pc_cover | str | 空 | | -| h5_cover | str | 活动封面 | | -| page_name | str | 页面名称 | | -| plat | int | 活动平台类型? | 即 URL 中 `plat` 参数 | -| desc | str | 活动描述 | | -| click | int | 0 | | -| type | int | 0 | | -| mold | int | 0 | | -| series | int | 0 | | -| dept | int | 0 | | -| reply_id | int | 0 | | -| tp_id | int | 0 | | -| ptime | int | 0 | | -| catalog | int | 0 | | -| creator | str | 空 | | -| spm_id | str | 空 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/activity/page/list' \ ---url-query 'plat=1,2,3' \ ---url-query 'ps=4' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "id": 207, - "state": 1, - "stime": 1723262400, - "etime": 1724774399, - "ctime": 0, - "mtime": 0, - "name": "原神fes2024", - "author": "", - "pc_url": "", - "rank": 0, - "h5_url": "https://www.bilibili.com/blackboard/era/DK8i0NS7fxwcLBgm.html", - "pc_cover": "", - "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/d32c2bb79f59192cb072d7bf79b61c6d/In2tYOLFTZ.png", - "page_name": "原神fes2024", - "plat": 2, - "desc": "", - "click": 0, - "type": 0, - "mold": 0, - "series": 0, - "dept": 0, - "reply_id": 0, - "tp_id": 0, - "ptime": 0, - "catalog": 0, - "creator": "", - "spm_id": "" - }, - { - "id": 210, - "state": 1, - "stime": 1723219200, - "etime": 1725983999, - "ctime": 0, - "mtime": 0, - "name": "暗区突围端游海外版全员夺金冲榜挑战赛", - "author": "", - "pc_url": "", - "rank": 0, - "h5_url": "https://www.bilibili.com/blackboard/era/UP8CZSTfboDVZuGr.html", - "pc_cover": "", - "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/f9a67e268d55d029e6b27d81246fc59a/LPN9dlcRlW.png", - "page_name": "暗区突围端游海外版全员夺金冲榜挑战赛", - "plat": 2, - "desc": "", - "click": 0, - "type": 0, - "mold": 0, - "series": 0, - "dept": 0, - "reply_id": 0, - "tp_id": 0, - "ptime": 0, - "catalog": 0, - "creator": "", - "spm_id": "" - }, - { - "id": 199, - "state": 1, - "stime": 1723089600, - "etime": 1725897599, - "ctime": 0, - "mtime": 0, - "name": "剑与远征:启程公测创作者激励", - "author": "", - "pc_url": "", - "rank": 0, - "h5_url": "https://www.bilibili.com/blackboard/era/HkHatvvW9nJZXEMh.html", - "pc_cover": "", - "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/7785e7ecb0434c85530b92e3586f32ff/CgKENr0ftC.jpeg", - "page_name": "剑与远征:启程公测创作者激励", - "plat": 2, - "desc": "", - "click": 0, - "type": 0, - "mold": 0, - "series": 0, - "dept": 0, - "reply_id": 0, - "tp_id": 0, - "ptime": 0, - "catalog": 0, - "creator": "", - "spm_id": "" - }, - { - "id": 203, - "state": 1, - "stime": 1723089600, - "etime": 1724255999, - "ctime": 0, - "mtime": 0, - "name": "王者荣耀新英雄少司缘创作激励", - "author": "", - "pc_url": "", - "rank": 0, - "h5_url": "https://www.bilibili.com/blackboard/era/g0gn2j4ZENrCLYLn.html", - "pc_cover": "", - "h5_cover": "https://i0.hdslb.com/bfs/activity-plat/static/a99ba278036e9fbfa81b9100d13d9e7e/9UHZg6r0Y5.jpg", - "page_name": "王者荣耀新英雄少司缘创作激励", - "plat": 2, - "desc": "", - "click": 0, - "type": 0, - "mold": 0, - "series": 0, - "dept": 0, - "reply_id": 0, - "tp_id": 0, - "ptime": 0, - "catalog": 0, - "creator": "", - "spm_id": "" - } - ], - "num": 1, - "size": 4, - "total": 5391 - } -} -``` - -</details> diff --git a/docs/album/action.md b/docs/album/action.md deleted file mode 100644 index 1d42821..0000000 --- a/docs/album/action.md +++ /dev/null @@ -1,174 +0,0 @@ -# 相簿操作 - -<details> -<summary>功能已下线</summary> - -## ~~点赞相簿~~ - -> https://api.vc.bilibili.com/link_draw/v2/Vote/operate - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ---------------------- | -| doc_id | num | 相簿id | 必要 | | -| type | num | 操作方式 | 必要 | 1:点赞<br />2:取消赞 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />1:参数错误<br />3:未登录<br />110022:已经操作过了 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---------------------- | -| type | num | 操作方式 | 1:点赞<br />2:取消赞 | - -**示例:** - -点赞相簿`id=99184721` - -```shell -curl 'https://api.vc.bilibili.com/link_draw/v2/Vote/operate' \ ---data-urlencode 'doc_id=99184721' \ ---data-urlencode 'type=1' \ ---data-urlencode 'csrf_token=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "type": 1 - } -} -``` - -</details> - -## ~~收藏相簿~~ - -> https://api.vc.bilibili.com/user_plus/v1/Fav/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------ | -| fav_id | num | 相簿id | 必要 | | -| biz_type | num | 2 | 必要 | 作用尚不明确 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:参数错误<br />-500:未登录<br />-507:已收藏 | -| msg | str | 错误信息 | 默认为OK | -| message | str | 错误信息 | 默认为OK | -| data | array | 空 | | - -**示例:** - -收藏相簿`id=99184721` - -```shell -curl 'https://api.vc.bilibili.com/user_plus/v1/Fav/add' \ ---data-urlencode 'fav_id=99184721' \ ---data-urlencode 'biz_type=2' \ ---data-urlencode 'csrf_token=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "msg": "OK", - "message": "OK", - "data": [] -} -``` - -</details> - -## 取消收藏相簿 - -> https://api.vc.bilibili.com/user_plus/v1/Fav/delete - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------ | -| fav_id | num | 相簿id | 必要 | | -| biz_type | num | 2 | 必要 | 作用尚不明确 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | --------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:参数错误<br />-500:未登录 | -| msg | str | 错误信息 | 默认为OK | -| message | str | 错误信息 | 默认为OK | -| data | array | 空 | | - -**示例:** - -取消收藏相簿`id=99184721` - -```shell -curl 'https://api.vc.bilibili.com/user_plus/v1/Fav/delete' \ ---data-urlencode 'fav_id=99184721' \ ---data-urlencode 'biz_type=2' \ ---data-urlencode 'csrf_token=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "msg": "OK", - "message": "OK", - "data": [] -} -``` - -</details> -</details> diff --git a/docs/album/activity_list.md b/docs/album/activity_list.md deleted file mode 100644 index 4c82f37..0000000 --- a/docs/album/activity_list.md +++ /dev/null @@ -1,152 +0,0 @@ -# 相簿活动列表 - -<details> -<summary>功能已下线</summary> - -## 获取相簿热门活动列表 - -> https://api.vc.bilibili.com/photo_activity/v2/Activity/list - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | --------------------------------------------- | -| type | num | 活动类型 | 非必要 | 0:全部<br/>1:展示类<br/>2:比赛类 | -| biz | num | 分区 | 非必要 | 0:全部<br />1:画友<br/>2:摄影<br />默认为0 | -| page_num | num | 页码 | 非必要 | 默认为4 | -| page_size | num | 每页项数 | 非必要 | 默认为0 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------ | -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------- | ---- | -| total_count | str | 总计活动数 | | -| items | array | 活动列表 | | - -`data`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| 0 | obj | 活动 1 | | -| n | obj | 活动 (n+1) | | -| …… | obj | …… | …… | - -`data`中的`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------- | ------------------------ | -| cover | str | 活动图片url | | -| title | str | 活动标题 | | -| link | str | 活动页面url | | -| type | num | 活动类型 | 1:展示类<br/>2:比赛类 | -| biz | num | 所属分区 | 1:画友<br/>2:摄影 | -| tag | str | 活动关联的TAG | | -| start_time | num | 开始时间 | 时间戳 | -| end_time | num | 结束时间 | 时间戳 | -| desc | str | 备注 | | -| desc_type | num | 活动状态 | 1:已结束<br />2:进行中 | - -**示例:** - -获取`画友`分区,全部类型的5条活动 - -```shell -curl -G 'https://api.vc.bilibili.com/photo_activity/v2/Activity/list' \ ---data-urlencode 'type=0' \ ---data-urlencode 'biz=1' \ ---data-urlencode 'page_num=0' \ ---data-urlencode 'page_size=5' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "total_count": 21, - "items": [ - { - "cover": "http://i0.hdslb.com/bfs/vc/344d175cf88f217ce8bd0f004a2c5e770eff2e03.png", - "title": "#月饼拟人#创作大赛!丰厚奖励等你来拿!", - "link": "https://www.bilibili.com/read/cv1102416", - "type": 1, - "biz": 1, - "tag": "", - "start_time": 1535817600, - "end_time": 1540915200, - "desc": "已结束", - "desc_type": 1 - }, - { - "cover": "http://i0.hdslb.com/bfs/vc/63d48fbc37f0142a9c72e06ebc950d4089f881d6.png", - "title": "「ISLAND」同人绘画大赛", - "link": "https://www.bilibili.com/blackboard/activity-rkOlNomMQ.html", - "type": 2, - "biz": 1, - "tag": "ISLAND同人绘画", - "start_time": 1530720000, - "end_time": 1534435200, - "desc": "已结束", - "desc_type": 1 - }, - { - "cover": "http://i0.hdslb.com/bfs/vc/08d20bc6c10e1e310946ebaaf56c2c90c921644d.jpg", - "title": "我家大师兄脑子有坑同人绘画大赛", - "link": "https://www.bilibili.com/blackboard/activity-S1lV0Ot6M.html", - "type": 2, - "biz": 1, - "tag": "兄坑同人绘画大赛", - "start_time": 1525449600, - "end_time": 1528473600, - "desc": "已结束", - "desc_type": 1 - }, - { - "cover": "http://i0.hdslb.com/bfs/vc/4eb48398ec0824e96fc878235536f2e0b4a8aef5.jpg", - "title": "国宝复“活”计划", - "link": "https://www.bilibili.com/blackboard/activity-SJ4hL_UFz.html", - "type": 2, - "biz": 1, - "tag": "国宝复“活”计划", - "start_time": 1521388800, - "end_time": 1525017600, - "desc": "已结束", - "desc_type": 1 - }, - { - "cover": "http://i0.hdslb.com/bfs/vc/9068f91f62ea5a36cbafff263d7e47af99cc9836.jpg", - "title": "画师专访——管郁生", - "link": "https://www.bilibili.com/blackboard/interview-guanyusheng.html", - "type": 1, - "biz": 1, - "tag": "", - "start_time": 1517414400, - "end_time": 0, - "desc": "进行中", - "desc_type": 2 - } - ] - } -} -``` - -</details> -</details> diff --git a/docs/album/info.md b/docs/album/info.md deleted file mode 100644 index 5489857..0000000 --- a/docs/album/info.md +++ /dev/null @@ -1,249 +0,0 @@ -# 相簿基本信息 - -<details> -<summary>功能已下线</summary> - -## 获取相簿详细信息 - ->https://api.vc.bilibili.com/link_draw/v1/doc/detail - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | ---- | -| doc_id | num | 目标相簿id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------- | -| code | num | 返回值 | 0:成功<br />110001:找不到目标相簿 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| user | obj | 作者信息 | | -| item | obj | 相簿信息 | | - -`data`中的`user`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------- | ---- | -| uid | num | 作者mid | | -| head_url | str | 头像url | | -| name | str | 昵称 | | -| vip | obj | 会员信息 | | -| upload_count | str | 相簿投稿数 | | - -`user`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ------------------------------------------------- | -| vipType | num | 会员类型 | 0:无<br />1:月度大会员<br />2:年度及以上大会员 | -| vipDueDate | num | 会员到期时间 | 毫秒 时间戳 | -| dueRemark | str | 空 | 作用尚不明确 | -| accessStatus | num | 0 | 作用尚不明确 | -| vipStatus | num | 会员开通状态 | 0:无<br />1:有 | -| vipStatusWarn | str | 空 | 作用尚不明确 | -| themeType | num | 0 | 作用尚不明确 | -| label | obj | ? | 作用尚不明确 | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ------------ | -| path | str | 空 | 作用尚不明确 | - -`data`中的`item`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ------------------ | ------------------------------------------------------------ | -| biz | num | 相簿分区 | 1:画友<br />2:摄影<br />3:日常 | -| doc_id | num | 相簿id | | -| poster_uid | num | 作者mid | | -| category | str | 子分区标识 | cos:cosplay<br />daily:日常<br />illustration:插画<br />comic:漫画<br />draw:其他<br />sifu:私服 | -| type | num | 相簿类型 | 0:原创<br />1:同人 | -| title | str | 标题 | | -| tags | array | 相簿TAG | | -| pictures | array | 相簿图片 | | -| source | null | | 作用尚不明确 | -| upload_time | str | 投稿时间(时间码) | YYYY-MM-DD hh:mm:ss | -| upload_timestamp | num | 投稿时间(时间戳) | | -| upload_time_text | str | 投稿时间(文本) | | -| description | str | 简介 | | -| role | null | | 作用尚不明确 | -| settings | obj | 权限配置 | | -| already_collected | num | 是否已收藏 | 需要登录(Cookie)<br />否则恒为0 | -| already_liked | num | 0 | 作用尚不明确 | -| user_status | num | 0 | 作用尚不明确 | -| at_control | str | 空 | 作用尚不明确 | -| view_count | num | 观看数 | | -| like_count | num | 0 | 作用尚不明确 | -| collect_count | num | 收藏数 | | -| verify_status | num | 1 | 作用尚不明确 | -| already_voted | num | 是否已点赞 | 需要登录(Cookie)<br />否则恒为0 | -| vote_count | num | 点赞数 | | -| comment_count | num | 评论数 | | - -`item`中的`tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | TAG 1 | | -| n | obj | TAG (n+1) | | -| …… | obj | …… | …… | - -`item`中的`tags`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | --------------- | --------------- | -| tag | str | TAG名 | | -| type | num | 类型? | | -| category | str | TAG所属子分区名 | | -| link | str | 活动页面url | 是活动TAG有此项 | -| text | str | TAG名 | | -| name | str | TAG名 | | - -`item`中的`pictures`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| 0 | obj | 图片 1 | | -| n | obj | 图片 (n+1) | | -| …… | obj | …… | …… | - -`item`中的`pictures`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ----------- | -| img_src | str | 图片url | | -| img_width | num | 图片宽度 | | -| img_height | num | 图片高度 | | -| img_size | num | 图片大小 | 单位为KByte | - -`item`中的`settings`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------ | ------------------------------------------------------------ | -| copy_forbidden | num | 禁止转载标志 | 0:不设置转载权限<br />1:开放授权-署名-非商用转载<br />2:作者授权-署名-非商用转载<br />3:禁止转载 | - -**示例:** - -查询相簿`id=99184721`的详细信息 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/detail' \ ---data-urlencode 'doc_id=99184721' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "user": { - "uid": 813818, - "head_url": "https://i2.hdslb.com/bfs/face/26b12390399f3e82fb913922938f8a6662d28665.jpg", - "name": "QYS3", - "vip": { - "vipType": 2, - "vipDueDate": 1613750400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "upload_count": "171" - }, - "item": { - "biz": 1, - "doc_id": 99184721, - "poster_uid": 813818, - "category": "illustration", - "type": 1, - "title": "旅行", - "tags": [ - { - "tag": "魔女之旅", - "type": 4, - "category": "illustration", - "text": "魔女之旅", - "name": "魔女之旅" - }, - { - "tag": "伊蕾娜", - "type": 3, - "category": "illustration", - "text": "伊蕾娜", - "name": "伊蕾娜" - }, - { - "tag": "旅行", - "type": 3, - "category": "illustration", - "text": "旅行", - "name": "旅行" - }, - { - "tag": "魔女", - "type": 3, - "category": "illustration", - "text": "魔女", - "name": "魔女" - } - ], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/d531e3dae34ef65b44ecdb2914d4cc4f5a4da998.jpg", - "img_width": 1236, - "img_height": 1600, - "img_size": 508 - } - ], - "source": null, - "upload_time": "2020-11-23 23:03:12", - "upload_timestamp": 1606143792, - "upload_time_text": "3天前", - "description": "伊蕾娜世界第一~!", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 143699, - "like_count": 0, - "collect_count": 54, - "verify_status": 1, - "already_voted": 0, - "vote_count": 2258, - "comment_count": 98 - } - } -} -``` - -</details> -</details> diff --git a/docs/album/list.md b/docs/album/list.md deleted file mode 100644 index 44adb6f..0000000 --- a/docs/album/list.md +++ /dev/null @@ -1,2438 +0,0 @@ -# 相簿列表 - -<details> -<summary>功能已下线</summary> - -## 获取画友首页列表 - -> https://api.vc.bilibili.com/link_draw/v2/Doc/index - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | ------------------------------------------- | -| type | str | 排序方式 | 必要 | recommend:推荐<br/>hot:最热<br/>new:最新 | -| page_num | num | 页码 | 非必要 | 默认为1 | -| page_size | num | 每页项数 | 非必要 | 默认为45 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------ | -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------- | ---- | -| items | array | 相簿列表 | | -| total_count | num | 总计条目数 | | - -`data`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| 0 | obj | 相簿 1 | | -| n | obj | 相簿 (n+1) | | -| …… | obj | …… | …… | - -`data`中的`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| user | obj | 作者信息 | | -| item | obj | 相簿信息 | | - -`data`中的`items`数组中的对象中的`user`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------- | ---- | -| uid | num | 作者mid | | -| head_url | str | 头像url | | -| name | str | 昵称 | | - -`data`中的`items`数组中的对象中的`item`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | ---------- | --------------------------------- | -| doc_id | num | 相簿id | | -| poster_uid | num | 作者mid | | -| pictures | array | 相簿图片 | | -| title | str | 标题 | | -| category | str | 子分区名 | | -| upload_time | num | 投稿时间 | 时间戳 | -| already_liked | num | 0 | 作用尚不明确 | -| already_voted | num | 是否已点赞 | 需要登录(Cookie)<br />否则恒为0 | - -`item`中的`pictures`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| 0 | obj | 图片 1 | | -| n | obj | 图片 (n+1) | | -| …… | obj | …… | …… | - -`item`中的`pictures`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ---- | -| img_src | str | 图片url | | -| img_width | num | 图片宽度 | | -| img_height | num | 图片高度 | | - -**示例:** - -用按热度排序方式获取画友首页列表 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/index' \ ---data-urlencode 'type=hot' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "items": [ - { - "user": { - "uid": 813818, - "head_url": "http://i2.hdslb.com/bfs/face/26b12390399f3e82fb913922938f8a6662d28665.jpg", - "name": "QYS3" - }, - "item": { - "doc_id": 99184721, - "poster_uid": 813818, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/d531e3dae34ef65b44ecdb2914d4cc4f5a4da998.jpg", - "img_width": 1236, - "img_height": 1600, - "img_size": 508 - } - ], - "title": "旅行", - "category": "illustration", - "upload_time": 1606143792, - "already_liked": 0, - "already_voted": 1 - } - }, - { - "user": { - "uid": 813818, - "head_url": "http://i2.hdslb.com/bfs/face/26b12390399f3e82fb913922938f8a6662d28665.jpg", - "name": "QYS3" - }, - "item": { - "doc_id": 99456663, - "poster_uid": 813818, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/cb202244684de733f026240b60ac28bb32ba39fd.jpg", - "img_width": 849, - "img_height": 1200, - "img_size": 513 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/30b8fb29d4ab3237018be7aeddc678fff9860885.jpg", - "img_width": 849, - "img_height": 1200, - "img_size": 513 - } - ], - "title": "大头", - "category": "illustration", - "upload_time": 1606405574, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 2244861, - "head_url": "http://i2.hdslb.com/bfs/face/7fd263548d587465b9f2ad5797e483b6c9182941.jpg", - "name": "Slancx" - }, - "item": { - "doc_id": 186801, - "poster_uid": 2244861, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/vc/cd9443a37ce08ec5b3df65166107f7cae23172e3.jpg", - "img_width": 1939, - "img_height": 2841, - "img_size": 1824 - }, - { - "img_src": "http://i0.hdslb.com/bfs/vc/8c282a9d76372c4ff3cc27b92fbeb2feb6b45767.jpg", - "img_width": 1954, - "img_height": 2902, - "img_size": 1996 - }, - { - "img_src": "http://i0.hdslb.com/bfs/vc/a9e0163001ce17f996b205f95627ea550b5793db.jpg", - "img_width": 3778, - "img_height": 5728, - "img_size": 6070 - } - ], - "title": "边边封面", - "category": "illustration", - "upload_time": 1504255746, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 751036, - "head_url": "http://i2.hdslb.com/bfs/face/be1cf20d37cd104b32e2e935fb2ef65bfe09e2bc.jpg", - "name": "洛书23333333" - }, - "item": { - "doc_id": 1091581, - "poster_uid": 751036, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/e78d3f6bbc487a003a3a72677c1975f781ac2090.jpg", - "img_width": 1289, - "img_height": 1108, - "img_size": 188 - } - ], - "title": "青鸟", - "category": "illustration", - "upload_time": 1512041349, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 21833522, - "head_url": "http://i2.hdslb.com/bfs/face/9037fc1027d780083ecc2e818b512b69b9267e7c.jpg", - "name": "欧阳鹏杰-OY" - }, - "item": { - "doc_id": 835730, - "poster_uid": 21833522, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/vc/acb88974c768aa24c092927ae59291023d55f175.jpg", - "img_width": 1200, - "img_height": 832, - "img_size": 914 - }, - { - "img_src": "http://i0.hdslb.com/bfs/vc/9dff2455d595835c8a214d73f3cf10633304acbe.jpg", - "img_width": 3000, - "img_height": 2000, - "img_size": 2305 - }, - { - "img_src": "http://i0.hdslb.com/bfs/vc/643f775358085c55b598b1d6f5941ea0114344ea.jpg", - "img_width": 1494, - "img_height": 1000, - "img_size": 475 - } - ], - "title": "OY超写实钢笔画:轨迹", - "category": "illustration", - "upload_time": 1509533004, - "already_liked": 0, - "already_voted": 0 - } - } - ] - } -} -``` - -</details> - -## 获取摄影首页列表 - -> https://api.vc.bilibili.com/link_draw/v2/Photo/index - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | --------------- | -| type | str | 排序方式 | 必要 | recommend:推荐 | -| page_num | num | 页码 | 非必要 | 默认为1 | -| page_size | num | 每页项数 | 非必要 | 默认为45 | - -**json回复:** - -见[获取画友首页列表](#获取画友首页列表)中的响应内容 - -**示例:** - -用推荐方式获取画友首页列表 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/index' \ ---data-urlencode 'type=recommend' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "items": [ - { - "user": { - "uid": 2487587, - "head_url": "https://i0.hdslb.com/bfs/face/4cd0d05708c4826737eef2cf3c5cb3c5361a2a2a.jpg", - "name": "是茶茶茶茶子呀" - }, - "item": { - "doc_id": 1164937, - "poster_uid": 2487587, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/07019ac09fa0bc63a6403eb28db1222792ab4768.jpg", - "img_width": 2048, - "img_height": 3623, - "img_size": 3501 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/469cdb91f88822cbaf9639b2fa12b0a481e3ac60.jpg", - "img_width": 2048, - "img_height": 3072, - "img_size": 3173 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/61d5a369f93debbc3187026fd35df8f994156f3b.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 1788 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/39f4bf47a96842a5834e5a49420fbf960bc7f5b7.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 2046 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4f14ad7008f0b5ce3a99c4234543f8ee05ecbfd8.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 2154 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/6aebb9afb4139b8a83da8f276a20ab9201b29bb9.jpg", - "img_width": 2048, - "img_height": 3072, - "img_size": 3109 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/1942e0ffd95283898b0ee0fa5e236cdf146cf492.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 1342 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/02e83961560492ae947347b2c49ae0aad305790b.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 1537 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/8cadaf8660136fae7f75cb35b56fd6b39fe4913c.jpg", - "img_width": 2048, - "img_height": 3072, - "img_size": 3430 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/1ac1fdbb883b68a65d5e575a43c68c56afa98b91.jpg", - "img_width": 2048, - "img_height": 3072, - "img_size": 4446 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/352242d86a6689fb9935a76360ddc010edc844ea.jpg", - "img_width": 2048, - "img_height": 1365, - "img_size": 1443 - } - ], - "title": "COS 明日香", - "category": "cos", - "upload_time": 1512184831, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 13104471, - "head_url": "https://i1.hdslb.com/bfs/face/af36442eafccc5b743cc1aff7922d84fd9279005.jpg", - "name": "Shika小鹿鹿鹿" - }, - "item": { - "doc_id": 1225984, - "poster_uid": 13104471, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/6ba1d9a136566c21a3950c8707a6c3b3121b81bb.jpg", - "img_width": 1728, - "img_height": 1080, - "img_size": 315 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/be5d659cde3b17c8ec60db503e33769a6a0183ae.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 348 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/14676962db356877a81b175024da24230305688e.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 256 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/ee3f7b04f17c2b612311b145a7dde5bf782e91ae.jpg", - "img_width": 1728, - "img_height": 1080, - "img_size": 242 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/88e88b000379d0e51346e74d84dfc3952f17d34b.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 312 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/16342927703a298024fce2e0a16018bdf9f3e634.jpg", - "img_width": 1728, - "img_height": 1080, - "img_size": 318 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/1098a86a0b186840b4eec74cae6a92b16dcfaf5c.jpg", - "img_width": 1728, - "img_height": 1080, - "img_size": 288 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/7bd01b575e391f218a4c86e04964fab514aed2b7.jpg", - "img_width": 1728, - "img_height": 1080, - "img_size": 336 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/2aca94992789eb6ea35a4a398f0f98c83ac48449.jpg", - "img_width": 1620, - "img_height": 1080, - "img_size": 302 - } - ], - "title": "清月之辉——阎魔", - "category": "cos", - "upload_time": 1512472775, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 2651372, - "head_url": "https://i1.hdslb.com/bfs/face/06285d510887ab8f08f3639de021273d31aa6e9f.jpg", - "name": "假酒澡堂" - }, - "item": { - "doc_id": 1161521, - "poster_uid": 2651372, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/41b7f22f31faedf0e6fb7ea694e5cd460ed01744.jpg", - "img_width": 2667, - "img_height": 4000, - "img_size": 7063 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/66af6e9685516820a92aa959caf47776afd95899.jpg", - "img_width": 4000, - "img_height": 2667, - "img_size": 5164 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/f69af7f3802aec88616e3d0567930eb74a0c0b49.jpg", - "img_width": 4000, - "img_height": 2667, - "img_size": 6863 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/cabd2bd20c2b47bcebb8a33c2f645ecbfe610aac.jpg", - "img_width": 6480, - "img_height": 4320, - "img_size": 13374 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/2780c80797cfb709d3d00b884f0c8c491c2fb33e.jpg", - "img_width": 2667, - "img_height": 4000, - "img_size": 5553 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c221300d9c9949eb2654dc65288437d2509716e9.jpg", - "img_width": 6480, - "img_height": 4320, - "img_size": 14213 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/be4710e76452d48aaae6a45e4ad813248a79efe2.jpg", - "img_width": 4000, - "img_height": 2667, - "img_size": 4733 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c87cabbfcdca90e9136d7c66e4b9b9ec586af957.jpg", - "img_width": 4000, - "img_height": 2667, - "img_size": 5654 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/65892d474ae09290f4e7f64461f0c21b4ee4664c.jpg", - "img_width": 4000, - "img_height": 2667, - "img_size": 4657 - } - ], - "title": "奥雅之光-异梦守护者", - "category": "cos", - "upload_time": 1512168749, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 7732095, - "head_url": "https://i0.hdslb.com/bfs/face/d0c465d55d457bd15760651e2eb7f9278055b40c.jpg", - "name": "超高校级的鲷鱼烧" - }, - "item": { - "doc_id": 1159580, - "poster_uid": 7732095, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/256ee4ccd4f3ed859fd71702513a345c2b4beeb4.jpg", - "img_width": 2159, - "img_height": 1569, - "img_size": 801 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c76707f83078c61d48a8ff1ee2888542bb64cef3.jpg", - "img_width": 1480, - "img_height": 1973, - "img_size": 617 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/a363e8ac04a90d4aecb567ff278a88b051886122.jpg", - "img_width": 1620, - "img_height": 2160, - "img_size": 876 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/06bc09d1927ba65e7210650e0cfe887d37b7871b.jpg", - "img_width": 1620, - "img_height": 2160, - "img_size": 885 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/ea5e47d7c99b1be8f799b1bf356ef81d58926a0c.jpg", - "img_width": 2160, - "img_height": 1620, - "img_size": 701 - } - ], - "title": "lolita私影", - "category": "sifu", - "upload_time": 1512148075, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 65579886, - "head_url": "https://i2.hdslb.com/bfs/face/b5f66542be47c508dd425d13fb7245655bc02413.jpg", - "name": "丹砂Scorpius" - }, - "item": { - "doc_id": 1177247, - "poster_uid": 65579886, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/53b14da232bb4aacc7bfeeba0caf8ebb1d9f0395.jpg", - "img_width": 3000, - "img_height": 2001, - "img_size": 3959 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/58f2fbc6c285571fa31cc032fb790fae5f8ffac0.jpg", - "img_width": 3000, - "img_height": 2001, - "img_size": 4106 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/018f4ddacf1ae792d2e6169ee394f336155d369e.jpg", - "img_width": 4000, - "img_height": 2668, - "img_size": 6534 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/874e31e7e3d6a3653c797583e6643d5d778d7a2c.jpg", - "img_width": 3000, - "img_height": 2001, - "img_size": 5484 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/7ff9b60bcecd80b5923194dee4de29251b37ce2c.jpg", - "img_width": 2000, - "img_height": 2998, - "img_size": 5969 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/0926b507b8e6ff11951b36732e9a089d49836e0e.jpg", - "img_width": 2000, - "img_height": 3000, - "img_size": 3671 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c55994fbf1e8a20425066bd6f4acc4347c197d11.jpg", - "img_width": 3000, - "img_height": 2001, - "img_size": 3069 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/03e621a23626d8d9f584a0d0663e1a77bd2832f1.jpg", - "img_width": 3000, - "img_height": 2001, - "img_size": 4339 - } - ], - "title": "天涯明月刀ol明月心", - "category": "cos", - "upload_time": 1512214505, - "already_liked": 0, - "already_voted": 0 - } - } - ], - "total_count": 200 - } -} -``` - -</details> - -## 获取画友列表 - -> https://api.vc.bilibili.com/link_draw/v2/Doc/list - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | ------------------------------------------------------------ | -| category | str | 类型 | 必要 | all:全部<br/>illustration:插画<br/>comic:漫画<br/>draw:其他 | -| type | str | 排序方式 | 必要 | hot:最热<br/>new:最新 | -| page_num | num | 页码 | 非必要 | 默认为1 | -| page_size | num | 每页项数 | 非必要 | 默认为45 | - -**json回复:** - -见[获取画友首页列表](#获取画友首页列表)中的响应内容 - -**示例:** - -用按热度排序方式获取`全部`类型的画友列表 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/list' \ ---data-urlencode 'category=all' \ ---data-urlencode 'type=hot' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "total_count": 500, - "items": [ - { - "user": { - "uid": 1403138, - "head_url": "https://i0.hdslb.com/bfs/face/member/noface.jpg", - "name": "莉莎娜" - }, - "item": { - "doc_id": 99421434, - "poster_uid": 1403138, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/5191163a4f1a2e567adda32f4dd6d4c024455d8d.png", - "img_width": 2286, - "img_height": 1760, - "img_size": 4147 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/74943ba725ee352d95e8356d9c7f823b329e51bf.png", - "img_width": 812, - "img_height": 1218, - "img_size": 885 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c0b17e496963203fb966ea046bddcc0d26dee066.png", - "img_width": 812, - "img_height": 1218, - "img_size": 892 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/099327c21f789294c6e8f2e9de9a280bed80eea5.png", - "img_width": 812, - "img_height": 1216, - "img_size": 895 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4ae0365073300541ab34b214499a7e4e79d6d205.png", - "img_width": 812, - "img_height": 1216, - "img_size": 875 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/5912fd5dc436580f3d5d59e089c4119da532635a.png", - "img_width": 812, - "img_height": 1218, - "img_size": 921 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/6e0ac1a10d1e55439cb8347df8948d263321cc42.png", - "img_width": 812, - "img_height": 1218, - "img_size": 971 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/fa4738bfda93079e9db0df0bdd67ecf316eba099.png", - "img_width": 812, - "img_height": 1218, - "img_size": 860 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/d841f61d1ffdcdd8ae0831307c6479f3b8a2c803.png", - "img_width": 812, - "img_height": 1216, - "img_size": 839 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/685b75cff31f98af4881e3c1af5f58703ef8780e.png", - "img_width": 812, - "img_height": 1216, - "img_size": 928 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/2deb81f4813843c628a0cfbd3fe033e3f70ddd95.png", - "img_width": 812, - "img_height": 1218, - "img_size": 932 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/d93d03bc4f17ef4bf684f8eb8b0f48ef4c52f204.png", - "img_width": 812, - "img_height": 1218, - "img_size": 875 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/06e00c35e198de27a69a00284fb99b1ca6b77ca0.png", - "img_width": 812, - "img_height": 1216, - "img_size": 991 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/f1c18fd5cc062623d0b7789fc20ee5938aa83c37.png", - "img_width": 846, - "img_height": 725, - "img_size": 877 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/7f937d022f34f72fd9c7dcf25122671b9d6c87b4.png", - "img_width": 847, - "img_height": 733, - "img_size": 896 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/5e693c5d3b995d5553357b2b2e270ccc68562f91.png", - "img_width": 848, - "img_height": 740, - "img_size": 967 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/e8f1574af6244f8f4df5876f2bce4a9b03b02021.png", - "img_width": 848, - "img_height": 741, - "img_size": 1181 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/ceca23740750a545b26c2b35b12d357e24b887af.png", - "img_width": 856, - "img_height": 748, - "img_size": 1246 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/98439a15f2a8fdaa16c20b18d436894f2a667969.png", - "img_width": 837, - "img_height": 745, - "img_size": 1248 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/cda219582d4bc824a0f3b276944bb440f94c3365.jpg", - "img_width": 550, - "img_height": 441, - "img_size": 53 - } - ], - "title": "ufotable 剧场版", - "category": "draw", - "upload_time": 1606386642, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 5030761, - "head_url": "https://i0.hdslb.com/bfs/face/2feef28d962b0e5c8bbd573cffe84d5e13277747.jpg", - "name": "深井玑" - }, - "item": { - "doc_id": 3674543, - "poster_uid": 5030761, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/c52e9b3a1fa307095cac0e82f5932baba4f0a286.png", - "img_width": 6142, - "img_height": 4724, - "img_size": 5314 - } - ], - "title": "小02", - "category": "illustration", - "upload_time": 1524970836, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 401154, - "head_url": "https://i1.hdslb.com/bfs/face/4c57866c6c8f21ff2fc8577369a613ed8397fae8.jpg", - "name": "oO大黄Oo" - }, - "item": { - "doc_id": 979620, - "poster_uid": 401154, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/vc/8f5342382b5c92a14cd37f93e887124813ba2163.jpg", - "img_width": 1920, - "img_height": 1051, - "img_size": 549 - } - ], - "title": "八云家的早晨", - "category": "illustration", - "upload_time": 1510916676, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 21833522, - "head_url": "https://i2.hdslb.com/bfs/face/9037fc1027d780083ecc2e818b512b69b9267e7c.jpg", - "name": "欧阳鹏杰-OY" - }, - "item": { - "doc_id": 663050, - "poster_uid": 21833522, - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/vc/7b20f041ad7c04bbaf8c54ba520be6fd4953583e.jpg", - "img_width": 770, - "img_height": 999, - "img_size": 798 - }, - { - "img_src": "https://i0.hdslb.com/bfs/vc/0710b08b54013b06249170e8adf08b41a41030aa.jpg", - "img_width": 1024, - "img_height": 1024, - "img_size": 475 - }, - { - "img_src": "https://i0.hdslb.com/bfs/vc/09f168697210ce4ff62df3f0f1284574795ea96b.png", - "img_width": 863, - "img_height": 1283, - "img_size": 1257 - } - ], - "title": "OY手绘:白玫瑰", - "category": "illustration", - "upload_time": 1507952704, - "already_liked": 0, - "already_voted": 0 - } - } - ] - } -} -``` - -</details> - -## 获取摄影列表 - -> https://api.vc.bilibili.com/link_draw/v2/Photo/list - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | --------------------------- | -| category | str | 类型 | 必要 | cos:Cosplay<br/>sifu:私服 | -| type | str | 排序方式 | 必要 | hot:最热<br/>new:最新 | -| page_num | num | 页码 | 非必要 | 默认为1 | -| page_size | num | 每页项数 | 非必要 | 默认为45 | - -**json回复:** - -见[获取画友首页列表](#获取画友首页列表)中的响应内容 - -**示例:** - -用按热度排序方式获取`Cosplay`类型的摄影列表 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/list' \ ---data-urlencode 'category=cos' \ ---data-urlencode 'type=hot' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "total_count": 500, - "items": [ - { - "user": { - "uid": 639050, - "head_url": "http://i0.hdslb.com/bfs/face/cb5ea5f15e4503cc26598bd307faa2a5413f914f.jpg", - "name": "Mayuri阮陌" - }, - "item": { - "doc_id": 1207334, - "poster_uid": 639050, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/323049c9389d31525ab301e22915a3343172216e.jpg", - "img_width": 969, - "img_height": 599, - "img_size": 210 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/3e2fb000f8865092f378a480ab454fea3aa09380.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 1369 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/b3aa55a8529935692be9a2d9e0ccf65e9bae6d87.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 520 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/90a1b083e7d1c876aa6a82cf6440d11e84d8b4c3.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 1442 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/eb1af3d84f2238ca63717a5c7e10a23d55d577c7.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 1155 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/69bae275fce8d85cc1822cd520675281fa8f89a9.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 1606 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/fbb77786fd531d081ea2867ae93cc1231326da58.jpg", - "img_width": 1920, - "img_height": 2880, - "img_size": 1329 - } - ], - "title": "式雪鸟", - "category": "cos", - "upload_time": 1512360622, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 55183010, - "head_url": "http://i0.hdslb.com/bfs/face/9484cb85e2f3acc4fcc953deab4090424b5a5aa3.jpg", - "name": "HaneAme雨波" - }, - "item": { - "doc_id": 99103637, - "poster_uid": 55183010, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/99cfb9601146d85622d0950b4689e2016e827ca6.jpg", - "img_width": 1366, - "img_height": 2048, - "img_size": 395 - } - ], - "title": "雨波 cos少女前线 OTS14 cos", - "category": "cos", - "upload_time": 1606070733, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 55183010, - "head_url": "http://i0.hdslb.com/bfs/face/9484cb85e2f3acc4fcc953deab4090424b5a5aa3.jpg", - "name": "HaneAme雨波" - }, - "item": { - "doc_id": 99103785, - "poster_uid": 55183010, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/bfb54c1ef7b9891ab458f2171fb1c115b8c94147.jpg", - "img_width": 1366, - "img_height": 2048, - "img_size": 601 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/2e8fd0d327cabc6ff9aa3fdc7f21d12949cd3774.jpg", - "img_width": 1366, - "img_height": 2048, - "img_size": 383 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/82050a1badfd2cce0e3888b0de501da8d0052285.jpg", - "img_width": 2048, - "img_height": 1366, - "img_size": 445 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/25223cd3d5bb7e4e96bdf5dded8538e9737762c4.jpg", - "img_width": 1366, - "img_height": 2048, - "img_size": 497 - } - ], - "title": "雨波 cos 英雄联盟阿狸KDA cos", - "category": "cos", - "upload_time": 1606071173, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 12429622, - "head_url": "http://i2.hdslb.com/bfs/face/af7fd8dfba51c0735303a381e1d7115c6dd13ad5.jpg", - "name": "ayaco_" - }, - "item": { - "doc_id": 6029076, - "poster_uid": 12429622, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/41bd20d921f8310243856665ee15c9f4a2dca89a.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 775 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/e6f7ea5b8f74d97239d307db43851341a802ee58.jpg", - "img_width": 591, - "img_height": 5672, - "img_size": 2714 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/af1795fb3873202f4668d0a598c36371f4b0addb.jpg", - "img_width": 591, - "img_height": 5641, - "img_size": 2305 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/15cf752ba3c3568828c5245cedd21d74b05b79cc.jpg", - "img_width": 591, - "img_height": 5602, - "img_size": 2158 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/6b19e916ad10e167503d1e002211cf84457f780b.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 571 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/a92b4286a1322c1315a18520af27759ee13bee69.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 580 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/104001f3ea13753f5a74ca40f302c8bf82fd75ee.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 479 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/6edb8fe0835c2ab284012889abe5306ed0122eb1.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 622 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/ef1be9ab93fae60f5425c2a5e6411bdb72a16bee.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 389 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/7250c928a6458cd30face9403889c8bb9eda19ef.jpg", - "img_width": 1080, - "img_height": 635, - "img_size": 550 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/34439287647262eb80d6d4f16f38b4801f32c193.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 472 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/253325d97fce756812a73eb609d8e082bf1eae12.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 576 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/00a05300453d0b14e44ba2051cc3714dabc46fd1.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 1047 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/1416e50ce1ab2e364212ebb2503cec247ca8642d.jpg", - "img_width": 1080, - "img_height": 720, - "img_size": 582 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/23661c4843e4c1d32aa7432683153be3813d771a.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 372 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/161753dced7278876055e38114e3773106dbedf5.jpg", - "img_width": 4743, - "img_height": 3162, - "img_size": 1395 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/224ff973a91566b3dc364fde122e71520b56fdc6.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 432 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/6495534c72147d512c79b4c2bbc06011635d4913.jpg", - "img_width": 591, - "img_height": 886, - "img_size": 453 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/0474e1479a0228cc6e97891f0f4d1cdbc1370222.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 370 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/5a19599960129f2060c125e3896d20dccf5a6f25.jpg", - "img_width": 591, - "img_height": 887, - "img_size": 367 - } - ], - "title": "剑网3cos明教成女", - "category": "cos", - "upload_time": 1532692182, - "already_liked": 0, - "already_voted": 0 - } - }, - { - "user": { - "uid": 25000899, - "head_url": "http://i2.hdslb.com/bfs/face/4017d03cfe42da7a0c93277cb46fb5a47a9b2415.jpg", - "name": "狩子和光哥" - }, - "item": { - "doc_id": 13690635, - "poster_uid": 25000899, - "pictures": [ - { - "img_src": "http://i0.hdslb.com/bfs/album/5f497ae7b064c5e323ad1e008b0068d3fb95b3f0.jpg", - "img_width": 1908, - "img_height": 3332, - "img_size": 3852 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/96e6743d04b0d31e9c17e171d767ceab75c9ac35.jpg", - "img_width": 1908, - "img_height": 3392, - "img_size": 3444 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/2116c3fe1bb5fbfd77a641fd0c29c6e6408b050e.jpg", - "img_width": 1908, - "img_height": 3328, - "img_size": 3793 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/6de08b62d633a84e5e50c8da0b42334f88ca50cb.jpg", - "img_width": 1812, - "img_height": 3176, - "img_size": 3513 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/02f1e419e79e45572c671a534f4271f411f2771f.jpg", - "img_width": 1908, - "img_height": 3392, - "img_size": 3660 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/348bf5b4f887f3ecd690cb1a1442bdda43898652.jpg", - "img_width": 3814, - "img_height": 3392, - "img_size": 7891 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/c50a2cc182c8ad07850e2f364b76d14cd6b1729c.jpg", - "img_width": 3839, - "img_height": 2160, - "img_size": 1630 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/b051883ca18556c78e72bf07d3981324394541c8.jpg", - "img_width": 2437, - "img_height": 2159, - "img_size": 1869 - }, - { - "img_src": "http://i0.hdslb.com/bfs/album/42e5f13601067a772d5ddc47a8756fecfec9f8cb.jpg", - "img_width": 2121, - "img_height": 3023, - "img_size": 2021 - } - ], - "title": "玉藻前", - "category": "cos", - "upload_time": 1548154774, - "already_liked": 0, - "already_voted": 0 - } - } - ] - } -} -``` - -</details> - -## 获取指定用户的相簿列表 - -> https://api.vc.bilibili.com/link_draw/v1/doc/others - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------- | ------ | --------------------------------------------- | -| biz | num | 分区 | 非必要 | 0:全部<br />1:画友<br/>2:摄影<br />默认为0 | -| poster_uid | num | 作者mid | 必要 | 默认为20 | -| page_num | num | 页码 | 非必要 | 默认为1 | -| page_size | num | 每页项数 | 非必要 | 默认为45 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------ | -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------- | ---- | -| total_count | str | 总计相簿数 | | -| user | obj | 作者信息 | | -| items | array | 相簿列表 | | - -`data`中的`user`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------- | ---- | -| uid | str | 作者mid | | -| head_url | str | 头像url | | -| name | str | 昵称 | | - -`data`中的`item`对象: - -同[获取画友首页列表](#获取画友首页列表)中的`item`对象 - -**示例:** - -获取用户` 1360010 `的所有类型相簿 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/others' \ ---data-urlencode 'biz=0' \ ---data-urlencode 'poster_uid=1360010' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "total_count": "290", - "user": { - "uid": "1360010", - "head_url": "https://i2.hdslb.com/bfs/face/865c7b03575a69822e503ef291ac26199c6a540a.jpg", - "name": "楚楚子" - }, - "items": [ - { - "biz": 3, - "doc_id": 85097979, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/65604d9697a644686c6ad811f9663a9fe308b164.jpg", - "img_width": 1347, - "img_height": 1792, - "img_size": 363 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/3f4448059ddaa8cbcd9094851ecfb84b184b0dc9.jpg", - "img_width": 1347, - "img_height": 1792, - "img_size": 506 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/edd1b6b424c078ba6a5b267db355cf7e8522f27a.jpg", - "img_width": 1347, - "img_height": 1792, - "img_size": 424 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/a615ce43ce3412060e487c3fcbc73ed08da23c56.jpg", - "img_width": 2268, - "img_height": 4032, - "img_size": 2192 - } - ], - "source": null, - "upload_time": "2020-08-03 16:48:30", - "upload_timestamp": 1596444510, - "upload_time_text": "3月前", - "description": "“绝望吧~!”\n#江之岛盾子#弹丸论破# \n黑历史重刷,终于又出了盾子 ​​​", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 53822, - "like_count": 0, - "collect_count": 40, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 84200785, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/8aa4ad3fc7b9f01a21f4c398565788bbe92cff2d.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2059 - } - ], - "source": null, - "upload_time": "2020-07-29 18:06:52", - "upload_timestamp": 1596017212, - "upload_time_text": "4月前", - "description": "莫西莫西?", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 49659, - "like_count": 0, - "collect_count": 6, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 83943309, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/4f4321bec1ddc55a3ed98b63a40175ec90820b4a.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2432 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/e2ed6aecfa713e109867198a1b0292eb9180aec9.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 1949 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/92694ea7db527663a8c97a6747125e12c6300bc4.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 1978 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/1757e958088dc7477fae30f2bf0daba034dd5de2.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 1849 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/60d55f032f4332387a165d6aa4e7ab0d2f628b1d.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2032 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/12bdbda0c8ea40505449ef4f4ad764780ad991ec.jpg", - "img_width": 1623, - "img_height": 2160, - "img_size": 1068 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4e51f06fb2c9aedfd077eb9341ada50aea5a2d50.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2106 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/5e8d27655c9741b0cb8c3e257677b9fc14b4cb5b.jpg", - "img_width": 2996, - "img_height": 3289, - "img_size": 3347 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/0018b04da7f9897b0a80dae64267fda16a7d3249.jpg", - "img_width": 700, - "img_height": 659, - "img_size": 122 - } - ], - "source": null, - "upload_time": "2020-07-28 02:18:39", - "upload_timestamp": 1595873919, - "upload_time_text": "4月前", - "description": "CP26第一天的集邮#CP26#\np1@流一_喵喵喵喵喵喵 流一爸爸太好看呜呜\np2@星之迟迟 我迟哥天仙下凡 新本太可了推荐\np3@紅吸式咖啡 师姐是俺永远的珍宝!\np4@伏笔小哥哥 我家儿子人间导弹杀伤力巨大[doge]\np5@鹤祈W 我家鹅鹅[喜极而泣]老色批又偷偷亲我\np6@拉花一哥虚年gg 虚虚今天也是又白又可口\np7@沐阳_阳阳阳阳羊哞 又御又有气场爱了\nP8战利品?", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "[{\"type\":1,\"location\":86,\"length\":7,\"data\":\"44500220\"}]", - "view_count": 67546, - "like_count": 0, - "collect_count": 18, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 83305352, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/9700a04ea0adc0fc4e0d0be54432210f7cb0ca08.jpg", - "img_width": 2996, - "img_height": 4096, - "img_size": 3687 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/bea5b177169027506afb7f11f91aecaf770f50a8.jpg", - "img_width": 2232, - "img_height": 4032, - "img_size": 2435 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/94c170c09acfc22bcdf541dc2a173cac0c3ca5eb.jpg", - "img_width": 1080, - "img_height": 1080, - "img_size": 349 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/53b082a3352a4cbf05dd796b60fe06ad5ba443f9.jpg", - "img_width": 2148, - "img_height": 2864, - "img_size": 1712 - } - ], - "source": null, - "upload_time": "2020-07-24 11:12:03", - "upload_timestamp": 1595560323, - "upload_time_text": "4月前", - "description": "cp26认衣服。?[笑哭]\nD1, 瑶-遇见神鹿(游场\nD2,嘉德罗斯-酒吞童子(凹凸世界展台8.1馆CPB25 ​​​", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 45415, - "like_count": 0, - "collect_count": 5, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 81307632, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/bf3e274cf5a013a9ae8ddfaa756ad4f22d643ff4.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2418 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/e8ad8f1297048e9adbcd70c8ca589dc306679c6e.jpg", - "img_width": 1656, - "img_height": 2205, - "img_size": 692 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/44e2d7d566833a67b151b5f0eba67bb70c34e6b7.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2430 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/0c11a891a71a567899b45801049cb44e8e09984b.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2513 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/92e0f0a0e6c38c693511b705acfd25caa9c14125.jpg", - "img_width": 1656, - "img_height": 2205, - "img_size": 664 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/235e63ecfa8db0bb21a4dbd4d82c7be321c96b73.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2149 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/98a3eb965f07a75b24d59cc6446a7752ad8211bd.jpg", - "img_width": 1656, - "img_height": 2205, - "img_size": 580 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/0dc3637addb53bf8ebea2a1896f41bcedafee42f.jpg", - "img_width": 1656, - "img_height": 2205, - "img_size": 669 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/f1ccbe4b61022cea2545eaa4cd26ac0617f9c12c.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 3329 - } - ], - "source": null, - "upload_time": "2020-07-12 01:03:34", - "upload_timestamp": 1594487014, - "upload_time_text": "4月前", - "description": "绿茶公主切?听说你想和我一起喝奶茶\n新风格自拍⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄希望喜欢\n\n裙子和领结是我家 海盐气泡", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 80832, - "like_count": 0, - "collect_count": 110, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 80611117, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/4cb935b7f542891c42e5b90a8cd6a9cc3817fdad.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1136 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/d99cd3d16fb1353a4dd42e72f4a1b4dce786bdf7.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1429 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4a5b947929a8a748a1cd8a165e07e39cf9efbac1.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1052 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c9972c6681e22d50f03bc80337f09c5bca12ce83.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1324 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/57137ce057e0c8098b17ed7ef9dbd6230cc08f31.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1361 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/f6ef2ffe0de5e336e12be620a2460fb9226da2d7.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1261 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/75c9012a5447025f533539e7e0c91aa7d47436e1.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 986 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/07088481611b53a35bffc797e00ab39361cac764.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 1361 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/2126d4a1f5882d1bd37db64e5acb17b3ba70a454.jpg", - "img_width": 1728, - "img_height": 3072, - "img_size": 991 - } - ], - "source": null, - "upload_time": "2020-07-07 14:13:32", - "upload_timestamp": 1594102412, - "upload_time_text": "4月前", - "description": "出镜:楚楚子\n摄影@猫尾先生DK \n服装@诺琪旗舰店 \n后勤:鹤祈 伏笔\n#cosplay##cos##cos正片##初音未来##初音ミク##初音##Miku##初音miku# ​​​", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 72419, - "like_count": 0, - "collect_count": 93, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 80314152, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/8debaeafd8463f06132f46776d2e100d7fc7da62.jpg", - "img_width": 2160, - "img_height": 3840, - "img_size": 2793 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c930d2b3b8533b28c18ebd69d7bb62027a96dc64.jpg", - "img_width": 3072, - "img_height": 4096, - "img_size": 3688, - "img_tags": [ - { - "tid": 0, - "orientation": 2, - "type": 2, - "text": "鹤祈w", - "mid": 319699970, - "textString": "@鹤祈w", - "x": 69531, - "y": 74547, - "source_type": 0, - "item_id": 0 - }, - { - "tid": 0, - "orientation": 2, - "type": 2, - "text": "楚楚子", - "mid": 1360010, - "textString": "@楚楚子", - "x": 24845, - "y": 88315, - "source_type": 0, - "item_id": 0 - } - ] - } - ], - "source": null, - "upload_time": "2020-07-05 15:30:19", - "upload_timestamp": 1593934219, - "upload_time_text": "4月前", - "description": "又出了拉姆蕾姆双子快乐!#蕾姆##拉姆##从零开始的异世界生活#", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 53346, - "like_count": 0, - "collect_count": 27, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 78948058, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/63d3158d33e4e7e74b04ad522841b746795a2c58.jpg", - "img_width": 1080, - "img_height": 1080, - "img_size": 321 - } - ], - "source": null, - "upload_time": "2020-06-25 12:47:54", - "upload_timestamp": 1593060474, - "upload_time_text": "5月前", - "description": "端午节安康哦!大家", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 56377, - "like_count": 0, - "collect_count": 19, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 78732068, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/bce1fbe78f222b669cd2ecf154faee55fffa4c22.jpg", - "img_width": 828, - "img_height": 1295, - "img_size": 431 - } - ], - "source": null, - "upload_time": "2020-06-23 20:06:14", - "upload_timestamp": 1592913974, - "upload_time_text": "5月前", - "description": "阿荣正片发我微博了(楚楚子w)\n还有转发抽500软妹币哦~[tv_调侃]", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 49872, - "like_count": 0, - "collect_count": 2, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 78601963, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/952125a9d23e9845c359752919d7a4919c5146b2.jpg", - "img_width": 2160, - "img_height": 3840, - "img_size": 2219 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/206a554bf8ca9f8f5b20f819a3a3d4caaf8cc7c8.jpg", - "img_width": 2160, - "img_height": 3840, - "img_size": 2093 - } - ], - "source": null, - "upload_time": "2020-06-22 17:17:02", - "upload_timestamp": 1592817422, - "upload_time_text": "5月前", - "description": "“拉菲…喜欢指挥官”\n#碧蓝航线#", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 47885, - "like_count": 0, - "collect_count": 6, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 77719612, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/8c78cfc991f160e649530ef124958a40174d1edf.jpg", - "img_width": 2464, - "img_height": 3280, - "img_size": 2902 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/e7e5d9fd004461ccc06bd4a2070fe8984cc910ab.jpg", - "img_width": 1906, - "img_height": 1080, - "img_size": 182 - } - ], - "source": null, - "upload_time": "2020-06-15 11:59:27", - "upload_timestamp": 1592193567, - "upload_time_text": "5月前", - "description": "#转生成为了只有乙女游戏破灭FLAG的邪恶##转生恶役只好拔除破灭旗标##卡塔丽娜##COS#\n猴王来了(不是)", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 52101, - "like_count": 0, - "collect_count": 5, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 77344908, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/a7d74d4ee9fc7b000ce325f56d7f20c2f46097ce.jpg", - "img_width": 614, - "img_height": 584, - "img_size": 35 - } - ], - "source": null, - "upload_time": "2020-06-12 17:58:43", - "upload_timestamp": 1591955923, - "upload_time_text": "5月前", - "description": "都和你们说了多少次了我没有男朋友,我有女朋友!!!!别问了[笑哭]giao", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 48760, - "like_count": 0, - "collect_count": 0, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 77340591, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/d53eae5957290841e99182b57dec41b73536c31f.jpg", - "img_width": 1440, - "img_height": 1080, - "img_size": 247 - } - ], - "source": null, - "upload_time": "2020-06-12 17:20:47", - "upload_timestamp": 1591953647, - "upload_time_text": "5月前", - "description": "昨天的自拍[tv_斜眼笑][tv_doge]", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 43730, - "like_count": 0, - "collect_count": 1, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 77255303, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/0ec917d17f79e7dbd07e60c4eba78add95f8db1e.jpg", - "img_width": 1080, - "img_height": 1619, - "img_size": 292 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/d3509348d52329d415a0022a1d79651645201dfc.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 531 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/6e2b6f49b6c8650ade51e66c4dc6008a4fd10b9e.jpg", - "img_width": 1619, - "img_height": 1080, - "img_size": 235 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/c31455b0d11a982f09fdcd13ce24354743410a95.jpg", - "img_width": 1080, - "img_height": 1619, - "img_size": 353 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/d6bcaf3c8cdcd5d680e359f20b7514e39337ed0c.jpg", - "img_width": 1619, - "img_height": 1080, - "img_size": 253 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4151fe1cf8f4a47c3843f12ae10eb8449660d80f.jpg", - "img_width": 1080, - "img_height": 1619, - "img_size": 413 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/29e2f6361e0773342b9f8adae7c44515231415da.jpg", - "img_width": 1619, - "img_height": 1080, - "img_size": 337 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/88b42ea572b95ba2d0bbdec0253f3cf5f87bf1e9.jpg", - "img_width": 1080, - "img_height": 1619, - "img_size": 459 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/4f96eea84478eaeccf80b5e34b263e6d7e04e382.jpg", - "img_width": 1619, - "img_height": 1080, - "img_size": 325 - } - ], - "source": null, - "upload_time": "2020-06-11 21:10:12", - "upload_timestamp": 1591881012, - "upload_time_text": "5月前", - "description": "#LOLITA##国牌LOLITA##LOLITA装扮#\n 🌹雾都小姐🍷酒红色🍷\n\n出镜:楚楚子\n裙子:@Neverland星芙颂 \n\n摄影感谢@夜_綰灵 ​​​", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 48652, - "like_count": 0, - "collect_count": 20, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 76904631, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/d89d1ae4dbb98c7b4ab40d3cb76543b4d5b9d471.jpg", - "img_width": 3987, - "img_height": 4032, - "img_size": 2898 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/8292a3ffe10baaf3b957605bc9fa450848746598.jpg", - "img_width": 3987, - "img_height": 4032, - "img_size": 3059 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/e6992efada737c6340b400ad8541ec8f550cd490.jpg", - "img_width": 4016, - "img_height": 4000, - "img_size": 2628 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/b4af594407dc4115779aa82d30000005f1940cee.jpg", - "img_width": 4000, - "img_height": 4012, - "img_size": 2602 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/6bc9ed0a4456806972793c8c9ff6b6dab7d82492.jpg", - "img_width": 828, - "img_height": 831, - "img_size": 156 - } - ], - "source": null, - "upload_time": "2020-06-08 17:19:55", - "upload_timestamp": 1591607995, - "upload_time_text": "5月前", - "description": "做了粉丝向小周边是蕾姆cos的扑克牌\n可以拿去打扑克[tv_点赞]搜店铺【楚王的宝库】就看到了,54张➕铁盒包装➕包邮 ​​​", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 40875, - "like_count": 0, - "collect_count": 1, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 76895569, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/0f35f75e31dd1298673207292f06ed73c44ab7d6.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 290 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/487f3ba4891b52825965337cc67b386cd61ef2ae.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 403 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/01e0a911f6efab97191def3d3fab36d656f395a4.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 306 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/62903ff9bad9d8f67fa44d0ec745f041f7c48e69.jpg", - "img_width": 1620, - "img_height": 1080, - "img_size": 230 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/f4ff78679627139c8f0bad222cd4a148cfc48212.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 277 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/8444278d213ee9a88ee4e0672999625b9fe08ac3.jpg", - "img_width": 1080, - "img_height": 1620, - "img_size": 244 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/b726178928cd90091dbb424a1d67e65509b27415.jpg", - "img_width": 1080, - "img_height": 1512, - "img_size": 322 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/736c90c02dafb3bf846936220084505a0da2ff55.jpg", - "img_width": 1620, - "img_height": 1080, - "img_size": 394 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/3fe89476c5f6572e7c42f10af219adf8cb80fa5b.jpg", - "img_width": 1620, - "img_height": 1080, - "img_size": 370 - } - ], - "source": null, - "upload_time": "2020-06-08 15:41:20", - "upload_timestamp": 1591602080, - "upload_time_text": "5月前", - "description": "死亡爱丽丝联动蕾姆\n\n蕾姆:楚楚子\n服装@悠悠cos微博 \n摄影@菜菜1911 \n\n#从零开始的异世界生活##蕾姆##COSPLAY#", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "[{\"type\":1,\"location\":32,\"length\":8,\"data\":\"92962087\"}]", - "view_count": 62523, - "like_count": 0, - "collect_count": 74, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 76277041, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/04b5e6ca741e16504e32a8afcaff02d26e3dbb02.jpg", - "img_width": 2105, - "img_height": 2105, - "img_size": 756 - } - ], - "source": null, - "upload_time": "2020-06-03 20:58:17", - "upload_timestamp": 1591189097, - "upload_time_text": "5月前", - "description": "听说最近虚拟女友很火?我也想应聘一下(๑¯ω¯๑)\n你们喜欢哪种声音的呢?\n定制虚拟恋人的方式在评论区\n顺便我在评论区抓一个粉丝做一期体验视频\n记得关注我和【甜味陪伴】哦[tv_害羞]", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 53645, - "like_count": 0, - "collect_count": 4, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 74762578, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/6d9c4a1c5a313880c9917b7a37810d37d06df056.png", - "img_width": 1792, - "img_height": 828, - "img_size": 4752 - }, - { - "img_src": "https://i0.hdslb.com/bfs/album/9a5e21c9e620fd58f4ffa0f23c6758c6be004c16.png", - "img_width": 1792, - "img_height": 828, - "img_size": 5322 - } - ], - "source": null, - "upload_time": "2020-05-23 10:33:32", - "upload_timestamp": 1590201212, - "upload_time_text": "6月前", - "description": "我冲了!#碧蓝航线#", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 71068, - "like_count": 0, - "collect_count": 1, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 74397184, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/de4711846523f58a1e17da281a3033b40296e5c6.jpg", - "img_width": 5304, - "img_height": 7952, - "img_size": 16275 - } - ], - "source": null, - "upload_time": "2020-05-20 13:34:51", - "upload_timestamp": 1589952891, - "upload_time_text": "6月前", - "description": "是金发辣妹风格的jk\n520表白大家\n裙子是我家的万佳灯火@风間original \n感谢摄影:远野咲夜", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 74593, - "like_count": 0, - "collect_count": 12, - "verify_status": 1 - }, - { - "biz": 3, - "doc_id": 74246310, - "poster_uid": 1360010, - "category": "daily", - "type": 0, - "title": "", - "tags": [], - "pictures": [ - { - "img_src": "https://i0.hdslb.com/bfs/album/e4541718610d4f19c9228bebf580db4f96e7a911.png", - "img_width": 1792, - "img_height": 828, - "img_size": 3884 - } - ], - "source": null, - "upload_time": "2020-05-19 10:06:53", - "upload_timestamp": 1589854013, - "upload_time_text": "6月前", - "description": "上古老婆队我也有了[tv_微笑]开心", - "role": null, - "settings": { - "copy_forbidden": 0 - }, - "already_collected": 0, - "already_liked": 0, - "user_status": 0, - "at_control": "", - "view_count": 48537, - "like_count": 0, - "collect_count": 0, - "verify_status": 1 - } - ] - } -} -``` - -</details> -</details> diff --git a/docs/album/recommend_author.md b/docs/album/recommend_author.md deleted file mode 100644 index ba57f07..0000000 --- a/docs/album/recommend_author.md +++ /dev/null @@ -1,169 +0,0 @@ -# 相簿推荐作者 - -<details> -<summary>功能已下线</summary> - -## 获取摄影推荐作者 - -> https://api.vc.bilibili.com/link_draw/v2/Photo/uper - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ------- | -| num | num | 请求数量 | 非必要 | 默认为6 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | array | 信息本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| 0 | obj | 作者 1 | | -| n | obj | 作者 (n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------- | ------------ | -| uid | num | 作者mid | | -| head_url | str | 头像url | | -| name | str | 昵称 | | -| is_followed | num | 0 | 作用尚不明确 | - -**示例:** - -请求获取摄影推荐作者,数量为5 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Photo/uper' \ ---data-urlencode 'num=5' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": [ - { - "uid": 36974706, - "head_url": "https://i2.hdslb.com/bfs/face/fa7ef3a5124e2ebfd2094e0bc2f42c752c1abd21.jpg", - "name": "幹物小幺", - "is_followed": 0 - }, - { - "uid": 3223860, - "head_url": "https://i0.hdslb.com/bfs/face/c5400d25eb7700cd41d88dff5b800bd55ec27cfe.jpg", - "name": "您算哪根葱", - "is_followed": 0 - }, - { - "uid": 941228, - "head_url": "https://i2.hdslb.com/bfs/face/f38f000d4df21e9bea96d3573efdf81ae02f4ddf.jpg", - "name": "碳酸熊卡", - "is_followed": 0 - }, - { - "uid": 2624541, - "head_url": "https://i0.hdslb.com/bfs/face/86ccd746af8b1e8bfcdd432de7f0ce1e2b2cb8b0.jpg", - "name": "_一之濑光", - "is_followed": 0 - }, - { - "uid": 29963706, - "head_url": "https://i1.hdslb.com/bfs/face/c054f097f1b882fc6ad8a67d0f0f88e3acd3bc88.jpg", - "name": "公子温温温如", - "is_followed": 0 - } - ] -} -``` - -</details> - -## 获取画友推荐作者 - -> https://api.vc.bilibili.com/link_draw/v2/Doc/drawer - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ------- | -| num | num | 请求数量 | 非必要 | 默认为6 | - -**json回复:** - -见[获取摄影推荐作者](#获取摄影推荐作者)中的响应内容 - -**示例:** - -请求获取画友推荐作者,数量为5 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v2/Doc/drawer' \ ---data-urlencode 'num=5' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": [ - { - "uid": 7905675, - "head_url": "http://i1.hdslb.com/bfs/face/d4765fd020e8b96e331861cb4d6a3afde4e70d1d.jpg", - "name": "我真的是离城", - "is_followed": 0 - }, - { - "uid": 20356494, - "head_url": "http://i0.hdslb.com/bfs/face/0686141506894df969832d7dda91f2a0c4cdc24b.jpg", - "name": "ZM-PANDA", - "is_followed": 0 - }, - { - "uid": 4836885, - "head_url": "http://i1.hdslb.com/bfs/face/48822c5aa7aeae9d3dd2010388baa2b0e1c5cc0a.jpg", - "name": "六六子w", - "is_followed": 0 - }, - { - "uid": 2575079, - "head_url": "http://i1.hdslb.com/bfs/face/cb3d6f4fb2fbe5aa85ab8773a1a19cec6d8ff1e1.jpg", - "name": "念萦墨葵", - "is_followed": 0 - }, - { - "uid": 1904878, - "head_url": "http://i0.hdslb.com/bfs/face/f6de926b3905ec7bb9e36202d80eb931d12f70ac.jpg", - "name": "fedsnk", - "is_followed": 0 - } - ] -} -``` - -</details> -</details> diff --git a/docs/article/action.md b/docs/article/action.md deleted file mode 100644 index c195594..0000000 --- a/docs/article/action.md +++ /dev/null @@ -1,172 +0,0 @@ -# 专栏点赞&投币&收藏 - -## 点赞文章 - -<img src="../../assets/img/like.svg" width="100" height="100"/> - -> https://api.bilibili.com/x/article/like - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------- | ------ | ---------------------- | -| id | num | 文章cvid | 必要 | | -| type | num | 操作方式 | 必要 | 1:点赞<br />2:取消赞 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />10003:不存在该稿件<br />65006:已赞过<br />65004:取消点赞失败 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -为文章`cv5806746`点赞 - -```shell -curl 'https://api.bilibili.com/x/article/like' \ ---data-urlencode 'id=5806746' \ ---data-urlencode 'type=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 投币文章 - -<img src="../../assets/img/coin.svg" width="100" height="100"/> - -> https://api.bilibili.com/x/web-interface/coin/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------- | ------ | ------- | -| aid | num | 文章cvid | 必要 | | -| upid | num | 文章作者mid | 必要 | | -| multiply | num | 投币数量 | 必要 | 上限为2 | -| avtype | num | 2 | 必要 | 必须为2 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-104:硬币不足<br />-111:csrf校验失败<br />-400:请求错误<br />10003:不存在该稿件<br />34002:不能给自己投币<br />34003:非法的投币数量<br />34005:超过投币上限 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------------------------------------------- | -| like | bool | 是否点赞成功 | true:成功<br />false:失败<br />已赞过则附加点赞失败 | - -**示例:** - -为文章`cv5806746`投币1枚 - -```shell -curl 'https://api.bilibili.com/x/web-interface/coin/add' \ ---data-urlencode 'aid=5806746' \ ---data-urlencode 'upid=486980924' \ ---data-urlencode 'multiply=1' \ ---data-urlencode 'avtype=2' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": false - } -} -``` - -</details> - -## 收藏文章 - -<img src="../../assets/img/fav.svg" width="100" height="100"/> - ->https://api.bilibili.com/x/article/favorites/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------- | ------ | ---- | -| id | num | 文章cvid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项 | -| message | str | 错误信息 | 正确为success | -| data | obj | 信息本体 | | - -**示例:** - -收藏文章`cv5806746` - -```shell -curl 'https://api.bilibili.com/x/article/favorites/add' \ ---data-urlencode 'id=5806746' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/article/articles.md b/docs/article/articles.md deleted file mode 100644 index 0890ca9..0000000 --- a/docs/article/articles.md +++ /dev/null @@ -1,311 +0,0 @@ -# 文集基本信息 - -## 获取文集基本信息 - -> https://api.bilibili.com/x/article/list/web/articles - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 文集rlid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此信息 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------------- | ------------------------------------------------------------ | -| list | obj | 文集概览 | | -| articles | array | 文集内的文章列表 | | -| author | obj | 文集作者信息 | | -| last | obj | - | 作用尚不明确<br />结构与data.articles[]中相似 | -| attention | bool | 是否关注文集作者 | false:未关注<br />true:已关注<br />需要登录(Cookie) <br />未登录为false | - -`data`中的`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | --------------- | ------------ | -| id | num | 文集rlid | | -| mid | num | 文集作者mid | | -| name | str | 文集名称 | | -| image_url | str | 文集封面图片url | | -| update_time | num | 文集更新时间 | 时间戳 | -| ctime | num | 文集创建时间 | 时间戳 | -| publish_time | num | 文集发布时间 | 时间戳 | -| summary | str | 文集简介 | | -| words | num | 文集字数 | | -| read | num | 文集阅读量 | | -| articles_count | num | 文集内文章数量 | | -| state | num | 1或3 | 作用尚不明确 | -| reason | str | 空 | 作用尚不明确 | -| apply_time | str | 空 | 作用尚不明确 | -| check_time | str | 空 | 作用尚不明确 | - -`data`中的`articles`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---- | -| 0 | obj | 文集中第1篇文章 | | -| n | obj | 文集中第(n+1)篇文章 | | - -`data`中的`articles`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | -------------- | ------------------------------------------------------------ | -| id | num | 专栏cvid | | -| title | str | 文章标题 | | -| state | num | 0 | 作用尚不明确 | -| publish_time | num | 发布时间 | 秒时间戳 | -| words | num | 文章字数 | | -| image_urls | array | 文章封面 | | -| category | obj | 文章标签 | | -| categories | array | 文章标签列表 | | -| summary | str | 文章摘要 | | -| stats | obj | 文章状态数信息 | | -| like_state | num | 是否点赞 | 0:未点赞<br />1:已点赞<br />需要登录(Cookie) <br />未登录为0 | - -`articles`数组中的对象中的`stats`: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| view | num | 阅读数 | | -| favorite | num | 收藏数 | | -| like | num | 点赞数 | | -| dislike | num | 点踩数 | | -| reply | num | 评论数 | | -| share | num | 分享数 | | -| coin | num | 投币数 | | -| dynamic | num | 动态转发数 | | - -`articles`数组中的对象中的`author`: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------------- | ---- | -| mid | num | 作者mid | | -| name | str | 作者昵称 | | -| face | str | 作者头像url | | -| official_verify | obj | 作者认证信息 | | -| nameplate | obj | 作者勋章 | | -| vip | obj | 作者大会员状态 | | - -**示例:** - -查询文集`rl207146`的基本信息 - -```shell -curl -G 'https://api.bilibili.com/x/article/list/web/articles' \ ---data-urlencode 'id=207146' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": { - "id": 207146, - "mid": 293793435, - "name": "B站api研究笔记", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1585036952, - "ctime": 1582718126, - "publish_time": 1585045493, - "summary": "", - "words": 8697, - "read": 1654, - "articles_count": 3, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - "articles": [ - { - "id": 4815593, - "title": "【B站API】api研究笔记ep1-视频基本信息", - "state": 0, - "publish_time": 1582643908, - "words": 2906, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/00497c8df7130f22e5b953694b8931a22d32f133.jpg" - ], - "category": { - "id": 26, - "parent_id": 17, - "name": "数码" - }, - "categories": [ - { - "id": 17, - "parent_id": 0, - "name": "科技" - }, - { - "id": 26, - "parent_id": 17, - "name": "数码" - } - ], - "summary": "各位小可爱们大家好啊,终于可以结束我长达一年的咕咕了.........在这蝠想联翩的日子里也闲的没事,除了上课就是睡觉,还不如搞点事情哪个猿不想拥有自己的B站爬虫呢(误),当然自制一个B站的综合信息台也是可以的,比如显示粉丝数 获赞数(掉粉警告)于是就萌生了这个研究B站api的想法,以后也会继续不定期分享我的主体思路是利用Chrome中的F12工具进行分析,再用curl进行验证先从视频下手吧qwq我们以av2075941为例network检测下,有各种图片、视频、网页、js。。。。。的传输记录", - "stats": { - "view": 578, - "favorite": 19, - "like": 26, - "dislike": 0, - "reply": 19, - "share": 6, - "coin": 10, - "dynamic": 0 - }, - "like_state": 0 - }, - { - "id": 4820548, - "title": "【B站API】api研究笔记ep2-视频其他信息", - "state": 0, - "publish_time": 1582688189, - "words": 4319, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/2416ee72759a5c2c8bba0f10d42e789fc0c0ae2b.jpg" - ], - "category": { - "id": 26, - "parent_id": 17, - "name": "数码" - }, - "categories": [ - { - "id": 17, - "parent_id": 0, - "name": "科技" - }, - { - "id": 26, - "parent_id": 17, - "name": "数码" - } - ], - "summary": "大家中午好鸭昨天我们研究了B站api的获取方法和使用方法 这一期我们继续分享另一个从网页中寻找api的方法以及研究视频的其他api接口以av170001为例首先打开视频,在F12的network下的监控中加载页面筛选XHR对象用搜索法的效率较低,不如我们直接进行筛选&观察通过对资源路径的观察可以猜到某些有关的项比如playurl有可能是播放的地址,pagelist可能是分P列表,view不就是昨天研究的『视频基本信息』吗通过继续分析我总结出了以下api这个可以在只想获取简介时应用,而不用处理多余", - "stats": { - "view": 737, - "favorite": 14, - "like": 18, - "dislike": 0, - "reply": 14, - "share": 1, - "coin": 1, - "dynamic": 0 - }, - "like_state": 0 - }, - { - "id": 5263184, - "title": "【B站API】api研究笔记Special-AV与BV互转", - "state": 0, - "publish_time": 1585045493, - "words": 1472, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/b520939046899303cfcac1511308eb87ede760d7.jpg" - ], - "category": { - "id": 26, - "parent_id": 17, - "name": "数码" - }, - "categories": [ - { - "id": 17, - "parent_id": 0, - "name": "科技" - }, - { - "id": 26, - "parent_id": 17, - "name": "数码" - } - ], - "summary": "昨天视频新编号BV上线了,所有视频的编号默认都变成了BVxxx,不再是avxxx,兼容在链接和搜索中输入av号,评论区和动态av和bv都可以一键传送显然日益增长的投稿量对于编号是个问题,int是有上限的,但一串“乱码”缺少了灵魂,还会让我们想到磁力链接或者熊掌盘的链接(手动狗头)看到av170001,我会想到“法克儿~~”,但看到BV17x411w7KC,我?????其实av号并没有消失,只不过它已经隐藏于大众的视野里了,av和bv本质上是可以双向转换的方法一(电脑版推荐):打开一个视频,会发现", - "stats": { - "view": 343, - "favorite": 9, - "like": 13, - "dislike": 0, - "reply": 9, - "share": 0, - "coin": 2, - "dynamic": 0 - }, - "like_state": 0 - } - ], - "author": { - "mid": 293793435, - "name": "社会易姐QwQ", - "face": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i1.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i1.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "vip": { - "type": 2, - "status": 1, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": null - } - }, - "last": { - "id": 0, - "title": "", - "state": 0, - "publish_time": 0, - "words": 0, - "image_urls": [ ], - "category": { - "id": 0, - "parent_id": 0, - "name": "" - }, - "categories": [ ], - "summary": "" - }, - "attention": true - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/article/card.md b/docs/article/card.md deleted file mode 100644 index a21a25f..0000000 --- a/docs/article/card.md +++ /dev/null @@ -1,463 +0,0 @@ -# 卡片信息 - -## 获取专栏显示卡片信息 - -> https://api.bilibili.com/x/article/cards - -*请求方法: GET* - -鉴权方式: 请求头 `Referer` 在 `.bilibili.com` 下 - -**URL 参数:** - -| 参数 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ------ | ---- | ------ | ---- | -| ids | string | 被查询的 id 列表 | 不必要 | 以 `,` 分隔, 可填视频完整 AV/BV 号, 专栏 CV 号, 直播间长短 lv 号 (可能会合并同类项) | -| web_location | string | `333.1305` | 不必要 | | -| w_rid | string | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | number | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -以请求时 `ids` 字段中每一项为键, 其内容对象为值的表, 注意可能会合并同类项 - -`data` 中代表视频的对象 (`avxxx` 或 `Bvxxxxxxxxxx`): - -详细可参见 [视频基本信息] (../video/info.md) - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| aid | number | | | -| bvid | string | | | -| cid | number | | | -| copyright | number | | | -| cover43 | string | | | -| ctime | number | | | -| desc | string | | | -| dimension | object | | | -| duration | number | | | -| dynamic | string | | | -| owner | object | | | -| pic | string | | | -| pubdate | number | | | -| rights | object | | | -| short_link_v2 | string | | | -| stat | object | | | -| state | number | | | -| tid | number | | | -| title | string | | | -| tname | string | | | -| videos | number | | | -| vt_switch | boolean | | | - -`data` 中代表专栏的对象 (`cvxxx`): - -详细可参见 [专栏内容](view.md) - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| act_id | number | | | -| apply_time | string | | | -| attributes | number | | | -| authenMark | null | | | -| author | object | | | -| banner_url | string | | | -| categories | object[] | | | -| category | object | | | -| check_state | number | | | -| check_time | string | | | -| content_pic_list | null | | | -| cover_avid | number | | | -| ctime | number | | | -| dispute | null | | | -| dynamic | string | | | -| id | number | | | -| image_urls | string[] | | | -| is_like | boolean | | | -| list | object | | | -| media | object | | | -| mtime | number | | | -| origin_image_urls | string[] | | | -| origin_template_id | number | | | -| original | number | | | -| private_pub | number | | | -| publish_time | number | | | -| reprint | number | | | -| state | number | | | -| stats | object | | | -| summary | string | | | -| template_id | number | | | -| title | string | | | -| top_video_info | null | | | -| type | number | | | -| words | number | | | - -`data` 中代表直播间的对象: - -详细可参见 [直播间基本信息](../live/info.md) - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| area_v2_name | string | 分区完整名称 | | -| cover | string | 直播封面 | | -| face | string | 主播头像 | | -| live_status | number | 直播状态 | | -| online | number | 在线人数 | | -| pendent_ru | string | | | -| pendent_ru_color | string | | | -| pendent_ru_pic | string | | | -| role | number | | | -| room_id | number | 直播间长 id | | -| title | string | 直播间标题 | | -| uid | number | 主播 UID (mid) | | -| uname | string | 主播用户名 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/article/cards?ids=av2,cv1,cv2,15111509,lv1,lv5440' \ - --referer 'https://www.bilibili.com/' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "av2": { - "aid": 2, - "bvid": "BV1xx411c7mD", - "cid": 62131, - "copyright": 2, - "cover43": "", - "ctime": 1497344798, - "desc": "www", - "dimension": { - "height": 360, - "rotate": 0, - "width": 480 - }, - "duration": 2055, - "dynamic": "", - "owner": { - "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "mid": 2, - "name": "碧诗" - }, - "pic": "http://static.hdslb.com/images/transparent.gif", - "pubdate": 1252458549, - "rights": { - "arc_pay": 0, - "autoplay": 1, - "bp": 0, - "download": 0, - "elec": 0, - "hd5": 0, - "is_cooperation": 0, - "movie": 0, - "no_background": 0, - "no_reprint": 0, - "pay": 0, - "pay_free_watch": 0, - "ugc_pay": 0, - "ugc_pay_preview": 0 - }, - "short_link_v2": "https://b23.tv/BV1xx411c7mD", - "stat": { - "aid": 2, - "coin": 38042, - "danmaku": 121342, - "dislike": 0, - "favorite": 107375, - "his_rank": 0, - "like": 261036, - "now_rank": 0, - "reply": 86021, - "share": 20052, - "view": 4983587, - "vt": 0, - "vv": 0 - }, - "state": 0, - "tid": 130, - "title": "字幕君交流场所", - "tname": "音乐综合", - "videos": 1, - "vt_switch": false - }, - "cv1": { - "act_id": 0, - "apply_time": "", - "attributes": 24, - "authenMark": null, - "author": { - "face": "https://i1.hdslb.com/bfs/face/89fe260a17891fdadc3365a9698fee52796c7765.jpg", - "fans": 0, - "level": 0, - "mid": 91221505, - "name": "健行见远渐忘", - "nameplate": { - "condition": "2018.6.26-7.8某一天是年度大会员", - "image": "https://i2.hdslb.com/bfs/face/421179426c929dfeaed4117461c83f5d07ffb148.png", - "image_small": "https://i1.hdslb.com/bfs/face/682001c2e1c2ae887bdf2a0e18eef61180c48f84.png", - "level": "稀有勋章", - "name": "大会员2018年度勋章", - "nid": 74 - }, - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/face/7ae15f06f8c912435206a2578509d6bc77c12353.png", - "name": "作文鬼才", - "pid": 255 - }, - "vip": { - "avatar_subscript": 1, - "due_date": 0, - "label": { - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员" - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "banner_url": "https://i0.hdslb.com/bfs/article/b1e1029c08d8ad1bb06460d736839a7741dd7925.jpg", - "categories": [ - { - "id": 3, - "name": "生活", - "parent_id": 0 - }, - { - "id": 15, - "name": "日常", - "parent_id": 3 - } - ], - "category": { - "id": 15, - "name": "日常", - "parent_id": 3 - }, - "check_state": 0, - "check_time": "", - "content_pic_list": null, - "cover_avid": 0, - "ctime": 1497973729, - "dispute": null, - "dynamic": "It's now or never !", - "id": 1, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/d2eedf1fd338bceca10099e2f7b33fa9017c859b.jpg" - ], - "is_like": false, - "list": { - "apply_time": "", - "articles_count": 0, - "check_time": "", - "ctime": 1588601669, - "id": 253534, - "image_url": "", - "mid": 91221505, - "name": "静夜思", - "publish_time": 1625900652, - "read": 0, - "reason": "", - "state": 1, - "summary": "", - "update_time": 1625900518, - "words": 3059 - }, - "media": { - "area": "", - "cover": "", - "media_id": 0, - "score": 0, - "season_id": 0, - "spoiler": 0, - "title": "", - "type_id": 0, - "type_name": "" - }, - "mtime": 1589209079, - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/b1e1029c08d8ad1bb06460d736839a7741dd7925.jpg" - ], - "origin_template_id": 4, - "original": 0, - "private_pub": 0, - "publish_time": 1519913233, - "reprint": 0, - "state": 0, - "stats": { - "coin": 2545, - "dislike": 1, - "dynamic": 0, - "favorite": 17524, - "like": 32489, - "reply": 14399, - "share": 616, - "view": 1631442 - }, - "summary": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入", - "template_id": 4, - "title": "未知的光", - "top_video_info": null, - "type": 0, - "words": 1190 - }, - "cv2": { - "act_id": 0, - "apply_time": "", - "authenMark": null, - "author": { - "face": "http://i0.hdslb.com/bfs/face/ff6b51c3b339dae5f341d1693f52132ab11c86b6.jpg", - "fans": 0, - "level": 0, - "mid": 144900660, - "name": "专栏小天使", - "nameplate": { - "condition": "", - "image": "", - "image_small": "", - "level": "", - "name": "", - "nid": 0 - }, - "official_verify": { - "desc": "专栏小天使 官方账号", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "name": "", - "pid": 0 - }, - "vip": { - "avatar_subscript": 0, - "due_date": 0, - "label": { - "label_theme": "", - "path": "", - "text": "" - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0, - "vip_pay_type": 0 - } - }, - "banner_url": "https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg@90p.webp", - "categories": [ - { - "id": 3, - "name": "生活", - "parent_id": 0 - }, - { - "id": 15, - "name": "日常", - "parent_id": 3 - } - ], - "category": { - "id": 15, - "name": "日常", - "parent_id": 3 - }, - "check_state": 0, - "check_time": "", - "content_pic_list": null, - "cover_avid": 0, - "ctime": 1497973871, - "dispute": null, - "id": 2, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/0a72422ce8e77d8512f010d93b1b7f9bc4e64e52.jpg" - ], - "is_like": false, - "list": null, - "media": { - "area": "", - "cover": "", - "media_id": 0, - "score": 0, - "season_id": 0, - "spoiler": 0, - "title": "", - "type_id": 0, - "type_name": "" - }, - "mtime": 1640696950, - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg" - ], - "origin_template_id": 4, - "original": 0, - "private_pub": 0, - "publish_time": 1509517123, - "reprint": 1, - "state": 0, - "stats": { - "coin": 3590, - "dislike": 0, - "dynamic": 0, - "favorite": 5614, - "like": 16956, - "reply": 1944, - "share": 371, - "view": 1184187 - }, - "summary": "欢迎各位使用Bilibili专栏,为了保证Bilibili专栏的内容质量,维护专栏的内容生态,让创作者和读者都拥有良好的使用体验和阅读体验,请各位谨遵以下规范条例:\n\n严令禁止条例\nbilibili严", - "template_id": 4, - "title": "专栏行为准则 ", - "top_video_info": null, - "type": 0, - "words": 3711 - }, - "lv5440": { - "area_v2_name": "历史·人文·综合", - "cover": "https://i0.hdslb.com/bfs/live/9fe50921ab9b49e80dcb398f65135191d1b8252c.jpg", - "face": "https://i0.hdslb.com/bfs/face/8f6a614a48a3813d90da7a11894ae56a59396fcd.jpg", - "live_status": 2, - "online": 0, - "pendent_ru": "", - "pendent_ru_color": "", - "pendent_ru_pic": "", - "role": 0, - "room_id": 5440, - "title": "一场穿越20年的直播|梦回千禧文学", - "uid": 9617619, - "uname": "哔哩哔哩直播" - } - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-04-26T08:24:57.605652577Z --> diff --git a/docs/article/category.md b/docs/article/category.md deleted file mode 100644 index 833fa40..0000000 --- a/docs/article/category.md +++ /dev/null @@ -1,81 +0,0 @@ -# 专栏分类 - -## 游戏 - -| id | parent_id | name | -|-----|-----------|------| -| 1 | 0 | 游戏 | -| 6 | 1 | 单机游戏 | -| 7 | 1 | 电子竞技 | -| 8 | 1 | 手机游戏 | -| 9 | 1 | 网络游戏 | -| 10 | 1 | 桌游棋牌 | - -## 动画 - -| id | parent_id | name | -|-----|-----------|------| -| 2 | 0 | 动画 | -| 4 | 2 | 动漫杂谈 | -| 5 | 2 | 动漫资讯 | -| 31 | 2 | 动画技术 | - -## 生活 - -| id | parent_id | name | -|-----|-----------|------| -| 3 | 0 | 生活 | -| 13 | 3 | 美食 | -| 14 | 3 | 时尚 | -| 15 | 3 | 日常 | -| 21 | 3 | 萌宠 | -| 22 | 3 | 运动 | - -## 轻小说 - -| id | parent_id | name | -|-----|-----------|------| -| 16 | 0 | 轻小说 | -| 18 | 16 | 原创连载 | -| 19 | 16 | 同人连载 | -| 20 | 16 | 小说杂谈 | -| 32 | 16 | 短篇小说 | - -## 科技 - -| id | parent_id | name | -|-----|-----------|------| -| 17 | 0 | 科技 | -| 25 | 17 | 人文历史 | -| 26 | 17 | 数码 | -| 27 | 17 | 汽车 | -| 33 | 17 | 自然 | -| 34 | 17 | 学习 | - -## 影视 - -| id | parent_id | name | -|-----|-----------|------| -| 28 | 0 | 影视 | -| 12 | 28 | 电影 | -| 35 | 28 | 电视剧 | -| 36 | 28 | 纪录片 | -| 37 | 28 | 综艺 | - -## 兴趣 - -| id | parent_id | name | -|-----|-----------|------| -| 29 | 0 | 兴趣 | -| 11 | 29 | 模型手办 | -| 23 | 29 | 绘画 | -| 24 | 29 | 手工 | -| 38 | 29 | 摄影 | -| 39 | 29 | 音乐舞蹈 | - -## 笔记 - -| id | parent_id | name | -|-----|-----------|------| -| 41 | 0 | 笔记 | -| 42 | 41 | 全部笔记 | diff --git a/docs/article/info.md b/docs/article/info.md deleted file mode 100644 index 7e986f0..0000000 --- a/docs/article/info.md +++ /dev/null @@ -1,182 +0,0 @@ -# 专栏基本信息 - -## 获取专栏文章基本信息 - -> https://api.bilibili.com/x/article/viewinfo - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 专栏cvid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此信息 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ------ | ---------------- | ------------------------------------------------------------ | -| like | num | 是否点赞 | 0:未点赞<br />1:已点赞<br />需要登录(Cookie) <br />未登录为0 | -| attention | bool | 是否关注文章作者 | false:未关注<br />true:已关注<br />需要登录(Cookie) <br />未登录为false | -| favorite | bool | 是否收藏 | false:未收藏<br />true:已收藏<br />需要登录(Cookie) <br />未登录为false | -| coin | num | 为文章投币数 | | -| stats | obj | 状态数信息 | | -| title | str | 文章标题 | | -| banner_url | str | 文章头图url | | -| mid | num | 文章作者mid | | -| author_name | str | 文章作者昵称 | | -| is_author | bool | true | 作用尚不明确 | -| image_urls | array | 动态封面 | | -| origin_image_urls | array | 封面图片 | | -| shareable | bool | true | 作用尚不明确 | -| show_later_watch | bool | true | 作用尚不明确 | -| show_small_window | bool | true | 作用尚不明确 | -| in_list | bool | 是否收于文集 | false:否<br />true:是 | -| pre | num | 上一篇文章cvid | 无为0 | -| next | num | 下一篇文章cvid | 无为0 | -| share_channels | array | 分享方式列表 | | -| type | num | 文章类别 | 0:文章<br />2:笔记 | - - -`stats`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| view | num | 阅读数 | | -| favorite | num | 收藏数 | | -| like | num | 点赞数 | | -| dislike | num | 点踩数 | | -| reply | num | 评论数 | | -| share | num | 分享数 | | -| coin | num | 投币数 | | -| dynamic | num | 动态转发数 | | - -`data`中的`image_urls`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 动态封面图片url | | - -`data`中的`origin_image_urls`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 文章封面图片url | | - -`data`中的`share_channels`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 分享项:qq | | -| 1 | obj | 分享项:qq空间 | | -| 2 | obj | 分享项:微信 | | -| 3 | obj | 分享项:朋友圈 | | -| 4 | obj | 分享项:微博 | | - -`data`中的`share_channels`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ----------- | ---- | -| name | str | 分享名称 | | -| picture | str | 分享图片url | | -| share_channel | str | 分享代号 | | - -**示例:** - -查询文章`cv2`的基本信息 - -```shell -curl -G 'https://api.bilibili.com/x/article/viewinfo' \ ---data-urlencode 'id=2' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": 0, - "attention": false, - "favorite": false, - "coin": 0, - "stats": { - "view": 1072619, - "favorite": 5481, - "like": 16465, - "dislike": 0, - "reply": 1865, - "share": 351, - "coin": 3436, - "dynamic": 37 - }, - "title": "专栏行为准则 ", - "banner_url": "https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg@90p.webp", - "mid": 144900660, - "author_name": "专栏小天使", - "is_author": true, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/0a72422ce8e77d8512f010d93b1b7f9bc4e64e52.jpg" - ], - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/131b1d41b857d5308f5bff36591d117bddc48d96.jpg" - ], - "shareable": true, - "show_later_watch": true, - "show_small_window": true, - "in_list": false, - "pre": 115914, - "next": 38575, - "share_channels": [ - { - "name": "QQ", - "picture": "https://i0.hdslb.com/bfs/album/114ccfb3a999df9c4d11f274c8c61a804c8f8803.png", - "share_channel": "QQ" - }, - { - "name": "QQ空间", - "picture": "https://i0.hdslb.com/bfs/album/30e9608bbce725bca45b5910866f60ab4d5e18b3.png", - "share_channel": "QZONE" - }, - { - "name": "微信", - "picture": "https://i0.hdslb.com/bfs/album/658af3c22431cd78bb7c50be3394f7c032eba12c.png", - "share_channel": "WEIXIN" - }, - { - "name": "朋友圈", - "picture": "https://i0.hdslb.com/bfs/album/c1ebcec8c5302f29f792d15f04e0d6dcef53ec27.png", - "share_channel": "WEIXIN_MONMENT" - }, - { - "name": "微博", - "picture": "https://i0.hdslb.com/bfs/album/3707fc23f7d3e24022712320284b0de9aa78c87d.png", - "share_channel": "SINA" - } - ], - "type": 0, - "video_url": "", - "location": "", - "disable_share": false - } -} -``` - -</details> diff --git a/docs/article/view.md b/docs/article/view.md deleted file mode 100644 index d763068..0000000 --- a/docs/article/view.md +++ /dev/null @@ -1,1346 +0,0 @@ -# 专栏内容 - -## 获取专栏正文内容 - -> https://api.bilibili.com/x/article/view - -*请求方法: GET* - -鉴权方式: 请求头 `User-Agent` - -**URL 参数:** - -| 参数 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ------ | ----------- | ------ | ---- | -| id | number | 专栏文章 ID | 必要 | | -| gaia_source | string | `main_web` | 不必要 | | -| w_rid | string | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | number | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-352: 请求被风控<br />-400: 请求错误<br />-404: 啥都木有 | -| data | object | 数据本体 | 见下 | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| act_id | number | 操作 ID? | | -| apply_time | string | 应用时间? | | -| attributes | number | 属性位? | 可能不存在 | -| authenMark | null | 授权码? | | -| author | object | 作者信息 | 参考 [用户基本信息](../user/info.md) | -| banner_url | string | 文章头图 URL | 空则为无 | -| categories | object[] | 专栏分类信息 | 首项为主分区, 第二项为子分区 | -| category | object | 专栏分类信息 | 子分区 | -| check_state | number | 检查状态? | | -| check_time | string | 检查时间? | | -| content | string | 文章内容 | `type` 字段为 `0` 为 HTML, `3` 为 JSON | -| content_pic_list | unknown | 内容图片列表? | | -| cover_avid | number | 封面视频 AV 号 | `0` 为无视频 | -| ctime | number | 创建时间 | UNIX 秒级时间戳 | -| dispute | unknown | 争议信息? | | -| dyn_id_str | string | 动态 opus id | | -| dynamic | string | 动态信息? | 可能不存在 | -| id | number | 专栏文章 ID | | -| image_urls | string[] | 图片 URL | | -| is_like | boolean | 是否喜欢? | | -| keywords | string | 关键词 | 以 `,` 分隔 | -| list | object | 文集信息 | 见下 | -| media | object | 媒体信息? | | -| mtime | number | 修改时间 | UNIX 秒级时间戳 | -| opus | object | opus 信息 | 当 `type` 字段为 `3` 时存在, 包含了更加详细的富文本信息 | -| origin_image_urls | string[] | 原始图片 URL | | -| origin_template_id | number | 原始模板 ID? | | -| original | number | 是否原创 | 0: 非原创<br />1: 原创 | -| private_pub | number | 仅自己可见 | | -| publish_time | number | 发布时间 | UNIX 秒级时间戳 | -| reprint | number | 是否允许转载 | 0: 不允许<br />1: 允许规范转载 | -| state | number | 专栏状态 | | -| stats | object | 统计数据 | | -| summary | string | 专栏开头部分内容 | 纯文本 | -| tags | object[] | 专栏标签 | | -| template_id | number | 模板 ID? | | -| title | string | 专栏标题 | | -| top_video_info | unknown | 封面食品信息? | | -| total_art_num | number | 作者总文章数 | | -| type | number | 类型? | | -| version_id | number | 版本 ID? | | -| words | number | 文章总词数 | | - -`data.categories[]` 对象: - -另见 [专栏分类](category.md) - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| id | number | 分类 ID | | -| name | string | 分类名称 | | -| parent_id | number | 父分类 ID | | - -`data.category` 对象: - -同 `data.categories[]` 中的对象 - -`data.content` 为字符串形式的 JSON 时代表的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ---- | ---- | -| ops | object[] | 以 JSON 呈现的文本内容 | 套了个娃 | - -`data.content` 代表的对象中的 `ops` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ---- | ---- | -| attribute | object? | 属性 | 见下 | -| insert | string \| object | 插入内容 | | - - -`data.content` 代表的对象中的 `ops[].attribute` 对象: - -注: 此处属性备注为页面实际渲染的情况 - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | -------- | ---- | ---- | -| align | string? | 文字对齐 | 参见 [text-align](https://developer.mozilla.org/zh-CN/docs/Web/CSS/text-align) | -| blockquote | boolean? | 块级引用 | 参见 [\<blockquote\>:块级引用元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/blockquote) | -| bold | boolean? | 加粗 | 参见 [\<strong\>](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/strong) | -| class | string? | 类名 | 参见 [class](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Global_attributes/class) | -| color | string? | 颜色 | 十六进制颜色值, 参见 [color](https://developer.mozilla.org/zh-CN/docs/Web/CSS/color) | -| header | number? | 标题级别 | 参见 [\<h1\>–\<h6\>:HTML 区域标题元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/Heading_Elements) | -| strike | boolean? | 删除线 | 参见 [\<s\>](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/s) | -| link | string? | 站内链接 | 参见 [\<a\>:锚元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/a) | -| italic | boolean? | 斜体 | 参见 [\<em\>:强调元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/em) | list | string? | 列表 | `bullet`: 无序列表, 参见 [\<ul\>:无序列表元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/ul)<br />`ordered`: 有序列表, 参见 [\<ol\>](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/ol) | - -`data.content` 代表的对象中的 `ops[].insert` 为对象时的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| native-image | object? | 原生图片 | 见下, 另见 [\<img\>:图像嵌入元素](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Reference/Elements/img) | -| cut-off | object? | 分割线 | 见下 | -| video-card | object? | 视频卡片 | 见下 | -| article-card | object? | 专栏卡片 | 见下 | -| vote-card | object? | 投票卡片 | 见下 | -| live-card | object? | 投票卡片 | 见下 | - -`data.content` 代表的对象中的 `ops[].insert.native-image` 对象: - -注: 此处属性备注为页面实际渲染的情况 - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| alt | string | 图像的备用文本描述 | 即 `<img>` 的 `alt` 属性 | -| url | string | 图像的 URL | 即 `<img>` 的 `src` 属性 | -| width | number | 图像的宽度 | 即 `<img>` 的 `data-w` 属性 | -| height | number | 图像的高度 | 即 `<img>` 的 `data-h` 属性 | -| size | number | 图像的文件大小 | 即 `<img>` 的 `data-size` 属性 | -| status | number | `"loaded"` | 即 `<img>` 的 `data-status` 属性 | - -`data.content` 代表的对象中的 `ops[].insert.cut-off` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| type | string | 类型 | 没错, 就是字符串 | -| url | string | 分割线图片 URL | | - -`data.content` 代表的对象中的 `ops[].insert.video-card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| alt | string | | | -| height | number | 卡片高度 | 似乎恒定为 `352` | -| id | string | 视频 id | 如 `av99999999` | -| size | null | | | -| status | string | `loaded` | | -| tid | number | `1.1` | | -| url | string | 卡片图片 URL | | -| width | number | 卡片宽度 | 似乎恒定为 `2632` | - -`data.content` 代表的对象中的 `ops[].insert.article-card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| alt | string | | | -| height | number | 卡片高度 | 似乎恒定为 `320` | -| id | string | 文章 id | 如 `cv1` | -| size | null | | | -| status | string | `loaded` | | -| tid | number | `2` | | -| url | string | 卡片图片 URL | | -| width | number | 卡片宽度 | 似乎恒定为 `2632` | - -`data.content` 代表的对象中的 `ops[].insert.vote-card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| alt | string | | | -| height | number | 卡片高度 | 似乎恒定为 `320` | -| id | string | 投票 id | 确实是字符串, 如 `15111509` | -| size | null | | | -| status | string | `loaded` | | -| tid | number | `7` | | -| url | string | 卡片图片 URL | | -| width | number | 卡片宽度 | 似乎恒定为 `2632` | - -`data.content` 代表的对象中的 `ops[].insert.live-card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| alt | string | | | -| height | number | 卡片高度 | 似乎恒定为 `352` | -| id | string | 直播间 id | 可能为长也可能为短, 如 `lv1` `lv5440` | -| size | null | | | -| status | string | `loaded` | | -| tid | number | `8` | | -| url | string | 卡片图片 URL | | -| width | number | 卡片宽度 | 似乎恒定为 `2632` | - - -`data.list` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| apply_time | string | 空 | | -| articles_count | number | 0 | | -| check_time | string | 空 | | -| ctime | number | 创建时间 | UNIX 秒级时间戳 | -| id | number | 文集 ID | | -| image_url | string | 文集封面 URL | | -| mid | number | 作者 mid | | -| name | string | 文集名称 | | -| publish_time | number | 最新发布时间 | UNIX 秒级时间戳 | -| read | number | 0 | | -| reason | string | 审核不通过理由? | | -| state | number | 文集状态 | | -| summary | string | 文集描述 | | -| update_time | number | 文集更新时间 | UNIX 秒级时间戳 | -| words | number | 文集总词数 | | - -`data.media` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| area | string | | | -| cover | string | | | -| media_id | number | | | -| score | number | | | -| season_id | number | | | -| spoiler | number | | | -| title | string | | | -| type_id | number | | | -| type_name | string | | | - -`data.stats` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| coin | number | 硬币数 | | -| dislike | number | 点踩数 | 0 | -| dynamic | number | 动态数? | | -| favorite | number | 收藏数 | | -| like | number | 点赞数 | | -| reply | number | 回复数 | | -| share | number | 分享数 | | -| view | number | 查看数 | | - -`data.tags[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | string | 标签名 | | -| tid | number | 标签 ID | | - -**示例:** - -`type=0`: `cv1` 未知的光 - -```shell -curl -G 'https://api.bilibili.com/x/article/view' \ ---url-query 'id=1' \ --A 'Mozilla/5.0' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "act_id": 0, - "apply_time": "", - "attributes": 24, - "authenMark": null, - "author": { - "face": "https://i1.hdslb.com/bfs/face/89fe260a17891fdadc3365a9698fee52796c7765.jpg", - "fans": 3051, - "level": 6, - "mid": 91221505, - "name": "健行见远渐忘", - "nameplate": { - "condition": "2018.6.26-7.8某一天是年度大会员", - "image": "https://i0.hdslb.com/bfs/face/421179426c929dfeaed4117461c83f5d07ffb148.png", - "image_small": "https://i0.hdslb.com/bfs/face/682001c2e1c2ae887bdf2a0e18eef61180c48f84.png", - "level": "稀有勋章", - "name": "大会员2018年度勋章", - "nid": 74 - }, - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/face/7ae15f06f8c912435206a2578509d6bc77c12353.png", - "name": "作文鬼才", - "pid": 255 - }, - "vip": { - "avatar_subscript": 1, - "due_date": 0, - "label": { - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员" - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "banner_url": "https://i0.hdslb.com/bfs/article/b1e1029c08d8ad1bb06460d736839a7741dd7925.jpg", - "categories": [ - { - "id": 3, - "name": "生活", - "parent_id": 0 - }, - { - "id": 15, - "name": "日常", - "parent_id": 3 - } - ], - "category": { - "id": 15, - "name": "日常", - "parent_id": 3 - }, - "check_state": 0, - "check_time": "", - "content": "<p>天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。</p><p>夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入你的怀抱,此时此刻,万念侵扰,思绪咆哮。</p><p>台灯在角落里静静注视着我,不稳定的电流偶尔会吱吱作响。一切都像打在海绵上的水,渐渐消失,慢慢隐身于黑夜,独独留下我自己。一盏灯就可以把夜撕出个伤口,我似乎听到夜逃离光亮的脚步声,窸窸窣窣。它在蔓延,吞噬的野心已越过了窗沿。</p><p>我捧着茶杯,仿佛是在捧着一整个空间,凝重而诡异。茶香绕过茶杯脱落的瓷层向四周扩散,空气闻到了茶香,于是身边的气息似乎活跃了起来。转念一想,人生如茶。器皿的束缚不是茶香的归宿,所以人生的低谷也不是生命的全部。黑暗是光明的束缚,但光明却是黑暗的归宿。</p><p>灯光下,书架上一本金色题字的书的书名熠熠发光,我起身取下书,发现是海伦写的《假如给我三天光明》,我内心一热,忽然间有些感动。一个身体残疾的孩子,孱弱的身躯却支撑起了刚劲的灵魂。她的眼前一片漆黑,但内心世界却是光彩艳丽的。她的心中永远都有一抹无形的光,指引着她踏遍人生的路途。</p><p>时钟告诉我现在是凌晨四点。我舒展下筋骨,刚要起身,一只飞虫不偏不斜恰好闯入我的视线。灯光是它唯一的追寻。我不敢有任何的动作,只好也只能静静看着这只可爱的生灵。它好像不知道我是它的伙伴,也许它真的以为光亮是它唯一的追寻。但是我却欣慰于这突如其来的伙伴。光明可以带来很多东西,有时候也包括一份黑暗中的灵魂的一份安慰。我不忍打扰它与光明的约会,于是悄悄起身慢慢摸索着到了阳台。</p><p>阳台和我沉入了外面黑暗的梦乡。隐约可以听到一些不知名的昆虫在开着它们的舞会,我猜它们都端着无形的酒杯。它们在黑暗中买醉,因为明天的天明将是它们的散会。我有些感怀,也有些悲哀。</p><p>夜风股股咆哮着,我昂首顶住风头,仰望着漆黑的四周。很远很远处,灯塔若隐若现。它向来就是一头巨大的野兽,而此时它却空荡的像杯将尽的酒。它散发出柔弱的灯光在风中摇曳,忽明忽暗,像是一场与黑暗的决斗,随时都可能葬身在这黎明的前奏。</p><p>不忍心这惨烈的一幕,我踱步来到窗前。窗子很旧了,旧到已经无法再承受住时间的践踏了。可无论它多么陈旧,此时的它是神奇的——窗外黑暗窗内光。人心不也是一扇窗户吗?一半明媚一半伤。窗户把光亮的一面给了光明,人心是不是也应该把明媚的一半朝向世界呢?</p><p>屋内的灯倏忽闪了闪,我晃过神来,发现天边已经有抹淡红色了。黎明的脚步已经迈出了一半。那只与台灯约会的虫子似乎很满意,兴高采烈的向着呼之欲出的朝阳的方向窜去了。我望着它的背影,轻轻挥了挥手,心中暗念:“亲爱的朋友,恭喜你找到了属于自己的方向和追求,希望你能在光和热中接受生命的升华。”</p><p>天空见亮了,有点空灵,光晕中泛着感动。第一缕曙光穿透了云层,是的,我看到了,那一抹光,越来越近,越来越亮……</p>", - "content_pic_list": null, - "cover_avid": 0, - "ctime": 1497973729, - "dispute": null, - "dyn_id_str": "38554821905721204", - "dynamic": "It's now or never !", - "id": 1, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/d2eedf1fd338bceca10099e2f7b33fa9017c859b.jpg" - ], - "is_like": false, - "keywords": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入", - "list": { - "apply_time": "", - "articles_count": 0, - "check_time": "", - "ctime": 1588601669, - "id": 253534, - "image_url": "", - "mid": 91221505, - "name": "静夜思", - "publish_time": 1625900652, - "read": 0, - "reason": "", - "state": 1, - "summary": "", - "update_time": 1625900518, - "words": 3059 - }, - "media": { - "area": "", - "cover": "", - "media_id": 0, - "score": 0, - "season_id": 0, - "spoiler": 0, - "title": "", - "type_id": 0, - "type_name": "" - }, - "mtime": 1589209079, - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/b1e1029c08d8ad1bb06460d736839a7741dd7925.jpg" - ], - "origin_template_id": 4, - "original": 0, - "private_pub": 0, - "publish_time": 1519913233, - "reprint": 0, - "state": 0, - "stats": { - "coin": 2543, - "dislike": 1, - "dynamic": 0, - "favorite": 17520, - "like": 32484, - "reply": 14399, - "share": 616, - "view": 1631212 - }, - "summary": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入", - "tags": [ - { - "name": "静夜思", - "tid": 239416 - } - ], - "template_id": 4, - "title": "未知的光", - "top_video_info": null, - "total_art_num": 5, - "type": 0, - "version_id": 0, - "words": 1190 - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-04-22T16:42:30.354080534Z --> - -`type=3`: `cv41358718` 通过 DevTools 绕过 SSR 抓包某站专栏正文接口 - -```shell -curl 'https://api.bilibili.com/x/article/view?id=41358718' \ --A 'Mozilla/10.0' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 41358718, - "category": { - "id": 26, - "parent_id": 17, - "name": "数码" - }, - "categories": [ - { - "id": 17, - "parent_id": 0, - "name": "科技" - }, - { - "id": 26, - "parent_id": 17, - "name": "数码" - } - ], - "title": "通过 DevTools 绕过 SSR 抓包某站专栏正文接口", - "summary": "背景\n最近没什么事做, 又回 BAC 看看有什么接口可以抓, 于是看到了陈年的专栏正文内容的 Issue #859\n由于泽生自己是写前端的, 对于浏览器 DevTools 的各项调试工具还算是比较了解, 打算想办法把专栏正文的接口抓下来 :)\n思路\n由于专栏正文完整的内容在页面加载的时候就已经通过 SSR (Server-Side Rendering, 服务端渲染) 的方式通过 <script> 标签注入到 HTML 网页中, 直接通过看 DevTools 的网络面板肯定是没用的\n[图片]\n最直接的方法是", - "banner_url": "", - "template_id": 4, - "state": 0, - "author": { - "mid": 645769214, - "name": "Session小胡", - "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "https://i2.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "https://i0.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "vip": { - "type": 1, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans": 347, - "level": 4 - }, - "reprint": 1, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/9071997152b6fec0ae465fe2a86b580e645769214.jpg" - ], - "publish_time": 1744789930, - "ctime": 1744789930, - "mtime": 1744789930, - "stats": { - "view": 51, - "favorite": 2, - "like": 3, - "dislike": 0, - "reply": 0, - "share": 0, - "coin": 2, - "dynamic": 0 - }, - "tags": [ - { - "tid": 12005, - "name": "HTML" - }, - { - "tid": 336733, - "name": "API" - }, - { - "tid": 854101, - "name": "BAC" - }, - { - "tid": 2573142, - "name": "JavaScript" - }, - { - "tid": 2709088, - "name": "Bilibili" - }, - { - "tid": 2719113, - "name": "GitHub" - }, - { - "tid": 2822654, - "name": "Web" - }, - { - "tid": 3161936, - "name": "Chromium" - }, - { - "tid": 3416147, - "name": "DevTools" - } - ], - "words": 2039, - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/9071997152b6fec0ae465fe2a86b580e645769214.jpg" - ], - "list": { - "id": 326286, - "mid": 645769214, - "name": "电脑", - "image_url": "", - "update_time": 1744789924, - "ctime": 1601636259, - "publish_time": 1744789930, - "summary": "", - "words": 9501, - "read": 0, - "articles_count": 0, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - "is_like": false, - "media": { - "score": 0, - "media_id": 0, - "title": "", - "cover": "", - "area": "", - "type_id": 0, - "type_name": "", - "spoiler": 0, - "season_id": 0 - }, - "apply_time": "", - "check_time": "", - "original": 1, - "act_id": 0, - "dispute": null, - "authenMark": null, - "cover_avid": 0, - "top_video_info": null, - "type": 3, - "check_state": 0, - "origin_template_id": 4, - "private_pub": 0, - "content_pic_list": null, - "content": "{\"ops\":[{\"insert\":\"背景\"},{\"attributes\":{\"header\":2},\"insert\":\"\\n\"},{\"insert\":\"最近没什么事做, 又回 BAC 看看有什么接口可以抓, 于是看到了陈年的专栏正文内容的 Issue #859\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"由于泽生自己是写前端的, 对于浏览器 DevTools 的各项调试工具还算是比较了解, 打算想办法把专栏正文的接口抓下来 :)\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"思路\"},{\"attributes\":{\"header\":2},\"insert\":\"\\n\"},{\"insert\":\"由于专栏正文完整的内容在页面加载的时候就已经通过 SSR (Server-Side Rendering, 服务端渲染) 的方式通过 <script> 标签注入到 HTML 网页中, 直接通过看 DevTools 的网络面板肯定是没用的\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"attributes\":{\"class\":\"normal-img\"},\"insert\":{\"native-image\":{\"alt\":\"read-normal-img\",\"url\":\"https://i0.hdslb.com/bfs/new_dyn/7bb121008990850bbd333fe504eebc90645769214.png\",\"width\":748,\"height\":494,\"size\":185239,\"status\":\"loaded\"}}},{\"insert\":\"最直接的方法是找到专栏相关的 JavaScript 代码, 通过大脑在没有 SourceMap 的情况下沿着 bundle 逆向出接口, 这种方法对于泽生明显不可行, 其中一个原因是屏幕太小而源码太大 (-.-;)\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"另一个方法是通过伪造 SSR 不工作, 从而诱导页面脚本手动通过 API 去获取内容, 不过伪造的方法也比较麻烦, 但可行度相对较高 😆\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"关于如何伪造 SSR 不工作的现象, 就需要分析 SSR 是如何被使用的, 某站的 SSR 是通过向页面注入 JavaScript 代码实现的, 具体是在 window 全局对象上加了个属性 __INITIAL_STATE__, 具体结构需要具体页面分析\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"目标就是要在读取之前移除这个属性, 移除方法简单, 无非是直接 window.__INITIAL_STATE__ = undefined (或者任意无效值), 或者 delete window.__INITIAL_STATE__, 别的 ES6 的反射之类的方法就不说了, 这不是重点\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"但这个脚本注入的位置就很恶心, 不在 <head> 里面, 也不在 <body> 底部, 就刚好在读取 __INITIAL_STATE__ 的脚本前面, 这使得无法使用篡改猴一类的用户脚本插件进行修改, 因为提供的用户脚本执行方式会出现还没写属性和已经读过属性的问题 (゜-゜)\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"接着就是传统的 DevTools 调试面板, 但正常手动暂停脚本执行往往已经脚本执行完成了, 解决方法就是网络节流或者 <head> 处用户脚本 debugger 语句\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"正好篡改猴高级设置允许用户脚本执行前暂停开始调试, 原理就是 debugger 语句, 只要把脚本执行位置放在 <body> 之前就有机会打断点把 __INITIAL_STATE__ 删掉 💥\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"attributes\":{\"class\":\"normal-img\"},\"insert\":{\"native-image\":{\"alt\":\"read-normal-img\",\"url\":\"https://i0.hdslb.com/bfs/new_dyn/1a20d186e8c8cddc043b5295d481c719645769214.png\",\"width\":625,\"height\":563,\"size\":320286,\"status\":\"loaded\"}}},{\"insert\":\"实践\"},{\"attributes\":{\"header\":2},\"insert\":\"\\n\"},{\"insert\":\"使用 Chromium (理论上 Firefox 也可以, 但其 DevTools 泽生用起来不是很舒服) 安装篡改猴扩展 🐒, 新建一个用户脚本, 里面是否写内容无所谓, 执行位置为 document-head, 然后在篡改猴的设置里面把调试脚本打开\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"接着打开一个使用 SSR 的网页, 不过注意要保持 DevTools 打开, 否则调试就不会生效, 页面脚本自动暂停后, 你将看到你的脚本和该页面已经加载的内容, 包含 HTML 网页, JavaScript 代码, 和 CSS 文本\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"你所需要做的就是检查 SSR 的情况是否如你所想的那样, 放在 window.__INITIAL_STATE__ 那里, 如果是直接渲染成页面元素的话, 抱歉上帝来了也救不了你, 某站 JavaScript 前端可不会管 HTML 的事情 🫠\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"如果在 __INITIAL_STATE__ 里面, 恭喜, 你可以直接继续了. 如果不是, 那就检查一下当前页面路径之类的, 看看有没有不同版本的相同内容, 毕竟专栏分新旧版, 专栏网页也分新旧版, 往往旧版能带来惊喜 ✨\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"找到了合适的 __INITIAL_STATE__, 你只需要在原地打个断点, 然后继续执行脚本, 页面就会在那里暂停, 接着执行下一步, 此时赋值完成, 可以开始改属性了\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"切到控制台, 执行那句期待已久的语句: window.__INITIAL_STATE__ = undefined, 大功告成! 🎉\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"恢复页面脚本执行, 你会看到页面好像卡了一下, 然后文章还是加载了出来, 这个时候就可以看看网络面板的情况了\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"attributes\":{\"class\":\"normal-img\"},\"insert\":{\"native-image\":{\"alt\":\"read-normal-img\",\"url\":\"https://i0.hdslb.com/bfs/new_dyn/87c88df1e15195996e34835456493d55645769214.png\",\"width\":892,\"height\":831,\"size\":473706,\"status\":\"loaded\"}}},{\"insert\":\"可以观察到, 多了一个你从来没见到过的叫 view 的野生请求, 点开详细, 复制地址, 记下参数, 保存响应, 发 Issue 去也~\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"如果这时回过头看控制台, 你会发现有这么一段错误十分显眼, 无法读取 undefined 的属性, 正是由于这个错误, 加之某站程序员的细心, 你才得以看到文章和抓到接口\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"后话\"},{\"attributes\":{\"header\":2},\"insert\":\"\\n\"},{\"insert\":\"Issue 已经发了, 估计写到文档里也是泽生的事情 🥴\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"这样的因 SSR 而省下的相关接口应该也有很多, 一个个慢慢打断点抓也不是个长久之计, 毕竟一旦直接渲染成 HTML, 就没的办法了 😮‍💨\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"学习正经的前端知识还是有利于不正经的逆向的 📚\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"希望大家都能来一起帮忙, Make BAC Great Again! 🥂\"},{\"attributes\":{\"list\":\"bullet\"},\"insert\":\"\\n\"},{\"insert\":\"有改动, 原文地址: https://sess.xhustudio.eu.org/posts/2025/devtools-vs-ssr-bac/\"},{\"attributes\":{\"blockquote\":true},\"insert\":\"\\n\"}]}", - "keywords": "BULLET,HEADER,WINDOW,LIST,SSR,WIDTH,html,undefined,VIEW,FIREFOX,BAC,JAVASCRIPT,CLASS,脚本插件,SIZE,TRUE,es6,ALT,长久之计,HTTPS,CSS,控制台,一起帮,A_PI,解决方法,期待已久,大功告成,没什么,有什么,浏览器,很舒服,无所谓,有没有,程序员,有利于,不正经", - "version_id": 0, - "opus": { - "opus_id": 1056353752004427792, - "opus_source": 2, - "title": "通过 DevTools 绕过 SSR 抓包某站专栏正文接口", - "content": { - "paragraphs": [ - { - "para_type": 1, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "背景", - "font_size": 22, - "style": { - "bold": true - }, - "font_level": "xLarge" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "最近没什么事做, 又回 BAC 看看有什么接口可以抓, 于是看到了陈年的专栏正文内容的 Issue #859", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 2 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "由于泽生自己是写前端的, 对于浏览器 DevTools 的各项调试工具还算是比较了解, 打算想办法把专栏正文的接口抓下来 :)", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 1, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "思路", - "font_size": 22, - "style": { - "bold": true - }, - "font_level": "xLarge" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "由于专栏正文完整的内容在页面加载的时候就已经通过 SSR (Server-Side Rendering, 服务端渲染) 的方式通过 <script> 标签注入到 HTML 网页中, 直接通过看 DevTools 的网络面板肯定是没用的", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 2, - "pic": { - "pics": [ - { - "url": "https://i0.hdslb.com/bfs/new_dyn/7bb121008990850bbd333fe504eebc90645769214.png", - "width": 748, - "height": 494, - "size": 180.8974609375 - } - ], - "style": 1 - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "最直接的方法是找到专栏相关的 JavaScript 代码, 通过大脑在没有 SourceMap 的情况下沿着 bundle 逆向出接口, 这种方法对于泽生明显不可行, 其中一个原因是屏幕太小而源码太大 (-.-;)", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 2 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "另一个方法是通过伪造 SSR 不工作, 从而诱导页面脚本手动通过 API 去获取内容, 不过伪造的方法也比较麻烦, 但可行度相对较高 😆", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 3 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "关于如何伪造 SSR 不工作的现象, 就需要分析 SSR 是如何被使用的, 某站的 SSR 是通过向页面注入 JavaScript 代码实现的, 具体是在 window 全局对象上加了个属性 __INITIAL_STATE__, 具体结构需要具体页面分析", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 4 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "目标就是要在读取之前移除这个属性, 移除方法简单, 无非是直接 window.__INITIAL_STATE__ = undefined (或者任意无效值), 或者 delete window.__INITIAL_STATE__, 别的 ES6 的反射之类的方法就不说了, 这不是重点", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 5 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "但这个脚本注入的位置就很恶心, 不在 <head> 里面, 也不在 <body> 底部, 就刚好在读取 __INITIAL_STATE__ 的脚本前面, 这使得无法使用篡改猴一类的用户脚本插件进行修改, 因为提供的用户脚本执行方式会出现还没写属性和已经读过属性的问题 (゜-゜)", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 6 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "接着就是传统的 DevTools 调试面板, 但正常手动暂停脚本执行往往已经脚本执行完成了, 解决方法就是网络节流或者 <head> 处用户脚本 debugger 语句", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 7 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "正好篡改猴高级设置允许用户脚本执行前暂停开始调试, 原理就是 debugger 语句, 只要把脚本执行位置放在 <body> 之前就有机会打断点把 __INITIAL_STATE__ 删掉 💥", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 2, - "pic": { - "pics": [ - { - "url": "https://i0.hdslb.com/bfs/new_dyn/1a20d186e8c8cddc043b5295d481c719645769214.png", - "width": 625, - "height": 563, - "size": 312.779296875 - } - ], - "style": 1 - } - }, - { - "para_type": 1, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "实践", - "font_size": 22, - "style": { - "bold": true - }, - "font_level": "xLarge" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "使用 Chromium (理论上 Firefox 也可以, 但其 DevTools 泽生用起来不是很舒服) 安装篡改猴扩展 🐒, 新建一个用户脚本, 里面是否写内容无所谓, 执行位置为 document-head, 然后在篡改猴的设置里面把调试脚本打开", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 2 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "接着打开一个使用 SSR 的网页, 不过注意要保持 DevTools 打开, 否则调试就不会生效, 页面脚本自动暂停后, 你将看到你的脚本和该页面已经加载的内容, 包含 HTML 网页, JavaScript 代码, 和 CSS 文本", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 3 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "你所需要做的就是检查 SSR 的情况是否如你所想的那样, 放在 window.__INITIAL_STATE__ 那里, 如果是直接渲染成页面元素的话, 抱歉上帝来了也救不了你, 某站 JavaScript 前端可不会管 HTML 的事情 🫠", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 4 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "如果在 __INITIAL_STATE__ 里面, 恭喜, 你可以直接继续了. 如果不是, 那就检查一下当前页面路径之类的, 看看有没有不同版本的相同内容, 毕竟专栏分新旧版, 专栏网页也分新旧版, 往往旧版能带来惊喜 ✨", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 5 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "找到了合适的 __INITIAL_STATE__, 你只需要在原地打个断点, 然后继续执行脚本, 页面就会在那里暂停, 接着执行下一步, 此时赋值完成, 可以开始改属性了", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 6 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "切到控制台, 执行那句期待已久的语句: window.__INITIAL_STATE__ = undefined, 大功告成! 🎉", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 7 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "恢复页面脚本执行, 你会看到页面好像卡了一下, 然后文章还是加载了出来, 这个时候就可以看看网络面板的情况了", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 2, - "pic": { - "pics": [ - { - "url": "https://i0.hdslb.com/bfs/new_dyn/87c88df1e15195996e34835456493d55645769214.png", - "width": 892, - "height": 831, - "size": 462.603515625 - } - ], - "style": 1 - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "可以观察到, 多了一个你从来没见到过的叫 view 的野生请求, 点开详细, 复制地址, 记下参数, 保存响应, 发 Issue 去也~", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 2 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "如果这时回过头看控制台, 你会发现有这么一段错误十分显眼, 无法读取 undefined 的属性, 正是由于这个错误, 加之某站程序员的细心, 你才得以看到文章和抓到接口", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 1, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "后话", - "font_size": 22, - "style": { - "bold": true - }, - "font_level": "xLarge" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 1 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "Issue 已经发了, 估计写到文档里也是泽生的事情 🥴", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 2 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "这样的因 SSR 而省下的相关接口应该也有很多, 一个个慢慢打断点抓也不是个长久之计, 毕竟一旦直接渲染成 HTML, 就没的办法了 😮‍💨", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 3 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "学习正经的前端知识还是有利于不正经的逆向的 📚", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 6, - "format": { - "list_format": { - "level": 1, - "order": 4 - } - }, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "希望大家都能来一起帮忙, Make BAC Great Again! 🥂", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - }, - { - "para_type": 4, - "text": { - "nodes": [ - { - "node_type": 1, - "word": { - "words": "有改动, 原文地址: https://sess.xhustudio.eu.org/posts/2025/devtools-vs-ssr-bac/", - "font_size": 17, - "style": {}, - "font_level": "regular" - } - } - ] - } - } - ] - }, - "tags": [ - { - "tag": { - "show_text": "HTML", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "API", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "BAC", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "JavaScript", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "Bilibili", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "GitHub", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "Web", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "Chromium", - "link_type": 36 - } - }, - { - "tag": { - "show_text": "DevTools", - "link_type": 36 - } - } - ], - "pub_info": { - "uid": 645769214, - "pub_time": 1744789930 - }, - "article": { - "category_id": 26, - "list_id": 326286, - "originality": 1, - "reproduced": 1, - "cover": [ - { - "url": "http://i0.hdslb.com/bfs/article/9071997152b6fec0ae465fe2a86b580e645769214.jpg", - "width": 768, - "height": 430, - "size": 58.13671875 - } - ], - "biz_tags": [ - "JavaScript", - "HTML", - "Chromium", - "DevTools", - "BAC", - "GitHub", - "API", - "Bilibili", - "Web" - ] - }, - "version": { - "cvid": 41358718, - "version_id": 140614555890906624 - } - }, - "dyn_id_str": "1056353752004427792", - "total_art_num": 4 - } -} -``` - -</details> diff --git a/docs/audio/action.md b/docs/audio/action.md deleted file mode 100644 index 8199f05..0000000 --- a/docs/audio/action.md +++ /dev/null @@ -1,148 +0,0 @@ -# 音频投币&收藏 - -## 查询音频收藏状态 - -> https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:账号未登陆<br />7201006:该音频不存在或已被下架 | -| msg | str | 错误信息 | 默认为success | -| data | bool | 是否收藏 | false:未收藏<br />true:已收藏 | - -**示例:** - -查询音频`au13598`的收藏状态 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/songs-coll' \ ---data-urlencode 'sid=13598' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": true -} -``` - -</details> - -## 查询音频投币数 - -> https://www.bilibili.com/audio/music-service-c/web/coin/audio - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:账号未登陆<br />7201006:该音频不存在或已被下架 | -| msg | str | 错误信息 | 默认为success | -| data | num | 投币数量 | 0为未投币,上限为2 | - -**示例:** - -查询音频`au13598`的投币数 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/coin/audio' \ ---data-urlencode 'sid=15664' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": 1 -} -``` - -</details> - -## 投币音频 - -> https://www.bilibili.com/audio/music-service-c/web/coin/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------- | ------ | ---- | -| sid | num | 音频 auid | 必要 | | -| multiply | num | 投币数量(最大为 2) | 必要 | | -| csrf | str | CSRF Token(位于 cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:账号未登陆<br />7201006:该音频不存在或已被下架 | -| msg | str | 错误信息 | 默认为 0 | -| data | str | 当前投币数量 | 0 为未投币,上限为 2 | - -**示例:** - -为音频`au13598`投币 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/coin/add' \ ---data-urlencode 'sid=15664' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "0", - "data": "1" -} -``` - -</details> diff --git a/docs/audio/info.md b/docs/audio/info.md deleted file mode 100644 index 2b296ff..0000000 --- a/docs/audio/info.md +++ /dev/null @@ -1,425 +0,0 @@ -# 歌曲基本信息 - -## 查询歌曲基本信息 - -> https://www.bilibili.com/audio/music-service-c/web/song/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />7201006:该音频不存在或已被下架<br />72010027:版权音乐重定向 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------ | ------------------ | ------------------ | -| id | num | 音频auid | | -| uid | num | UP主mid | | -| uname | str | UP主昵称 | | -| author | str | 作者名 | | -| title | str | 歌曲标题 | | -| cover | str | 封面图片url | | -| intro | str | 歌曲简介 | | -| lyric | str | lrc歌词url | | -| crtype | num | 1 | **作用尚不明确** | -| duration | num | 歌曲时间长度 | 单位为秒 | -| passtime | num | 歌曲发布时间 | 时间戳 | -| curtime | num | 当前请求时间 | 时间戳 | -| aid | num | 关联稿件avid | 无为0 | -| bvid | str | 关联稿件bvid | 无为空 | -| cid | num | 关联视频cid | 无为0 | -| msid | num | 0 | **作用尚不明确** | -| attr | num | 0 | **作用尚不明确** | -| limit | num | 0 | **作用尚不明确** | -| activityId | num | 0 | **作用尚不明确** | -| limitdesc | str | 空 | **作用尚不明确** | -| ctime | null | - | **作用尚不明确** | -| statistic | obj | 状态数 | | -| vipInfo | obj | UP主会员状态 | | -| collectIds | array | 歌曲所在的收藏夹mlid | 需要登录(SESSDATA) | -| coin_num | num | 投币数 | | - -`data`中的`statistic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| sid | num | 音频auid | | -| play | num | 播放次数 | | -| collect | num | 收藏数 | | -| comment | num | 评论数 | | -| share | num | 分享数 | | - -`data`中的`vipInfo`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ----------------------------------- | -| type | num | 会员类型 | 0:无<br />1:月会员<br />2:年会员 | -| status | num | 会员状态 | 0:无<br />1:有 | -| due_date | num | 会员到期时间 | 时间戳 毫秒 | -| vip_pay_type | num | 会员开通状态 | 0:无<br />1:有 | - -`data`中的`collectIds`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------------- | ---- | -| 0 | num | 第1个所在的收藏夹mlid | | -| n | num | 第(n+1)个所在的收藏夹mlid | | -| …… | num | …… | …… | - -**示例:** - -查询音频`au13598`的基本信息 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/info' \ ---data-urlencode 'sid=13598' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "id": 13598, - "uid": 486183, - "uname": "排骨教主", - "author": "排骨教主", - "title": "牵丝戏", - "cover": "http://i0.hdslb.com/bfs/music/cf50d93b4dc08bfc6d3112041d6de0e56045ac5b.jpg", - "intro": "自制 这次要特别感谢山东省京剧院的各位年轻的老师们对我戏腔发声的悉心指导\n关注排骨的微博@排骨节操收割机\n排骨QQ群456237456\n感谢@妄北没睡够(新浪微博) 画的视频图,太美了!!!!!\n", - "lyric": "http://i0.hdslb.com/bfs/music/150587810313598.lrc", - "crtype": 1, - "duration": 239, - "passtime": 1501640683, - "curtime": 1590154258, - "aid": 2554020, - "bvid": "BV1us411S7E6", - "cid": 3990196, - "msid": 0, - "attr": 0, - "limit": 0, - "activityId": 0, - "limitdesc": "", - "ctime": null, - "statistic": { - "sid": 13598, - "play": 1028516, - "collect": 30914, - "comment": 523, - "share": 384 - }, - "vipInfo": { - "type": 2, - "status": 1, - "due_date": 1620316800000, - "vip_pay_type": 0 - }, - "collectIds": [ - 15967839 - ], - "coin_num": 1777 - } -} -``` - -</details> - -## 查询歌曲TAG - -> https://www.bilibili.com/audio/music-service-c/web/tag/song - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | -------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| data | array | TAG列表 | 无为空 | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| 0 | str | TAG1 | | -| n | str | TAG(n+1) | | -| …… | str | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ---------------- | -| type | str | song | **作用尚不明确** | -| subtype | num | ??? | **作用尚不明确** | -| key | num | TAG id?? | **作用尚不明确** | -| info | str | TAG名 | | - -**示例:** - -查询音频`au15664`的TAG - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/tag/song' \ ---data-urlencode 'sid=15664' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": [ - { - "type": "song", - "subtype": 0, - "key": 1, - "info": "音乐" - }, - { - "type": "song", - "subtype": 1, - "key": 3, - "info": "人声" - }, - { - "type": "song", - "subtype": 2, - "key": 2, - "info": "翻唱" - }, - { - "type": "song", - "subtype": 3, - "key": 33, - "info": "日语" - }, - { - "type": "song", - "subtype": 5, - "key": 41, - "info": "网络歌曲" - }, - { - "type": "song", - "subtype": 4, - "key": 7, - "info": "流行" - } - ] -} -``` - -</details> - -## 查询歌曲创作成员列表 - -> https://www.bilibili.com/audio/music-service-c/web/member/song - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ------------ | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| data | array | 成员类型列表 | 无为空 | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | str | 成员类型1 | | -| n | str | 成员类型(n+1) | | -| …… | str | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ------------ | ------------------------------------------------------------ | -| list | array | 成员列表 | | -| type | num | 成员类型代码 | 1:歌手<br />2:作词<br />3:作曲<br />4:编曲<br />5:后期/混音<br />7:封面制作<br />8:音源<br />9:调音<br />10:演奏<br />11:乐器<br />127:UP主 | - -`data`数组中的对象中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | str | 成员1 | | -| n | str | 成员(n+1) | | -| …… | str | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------- | ---------------- | -| mid | num | 0 | **作用尚不明确** | -| name | str | 成员名 | | -| member_id | num | 成员id?? | **作用尚不明确** | - -**示例:** - -查询音频`au815861`的创作成员信息 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/member/song' \ ---data-urlencode 'sid=815861' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": [ - { - "list": [ - { - "mid": 0, - "name": "匀子Cyrena", - "member_id": 164341 - } - ], - "type": 1 - }, - { - "list": [ - { - "mid": 0, - "name": "圣月樱泪 ", - "member_id": 12349 - } - ], - "type": 2 - }, - { - "list": [ - { - "mid": 0, - "name": "Days的Wing翼", - "member_id": 13777 - } - ], - "type": 3 - }, - { - "list": [ - { - "mid": 0, - "name": "Days的Wing翼", - "member_id": 13777 - } - ], - "type": 4 - }, - { - "list": [ - { - "mid": 0, - "name": "嘟比Dubi", - "member_id": 40902 - } - ], - "type": 5 - }, - { - "list": [ - { - "mid": 0, - "name": "匀子Cyrena", - "member_id": 164222 - } - ], - "type": 127 - } - ] -} -``` - -</details> - -## 获取歌曲歌词 - -> https://www.bilibili.com/audio/music-service-c/web/song/lyric - -*请求方式:GET* - -同[查询歌曲基本信息](#查询歌曲基本信息)中的lrc歌词 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----------------------------- | --------------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:str<br />错误时:null | lrc格式歌词信息 | 无为空 | - -**示例:** - -获取音频`au15664`的歌词信息 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/song/lyric' \ ---data-urlencode 'sid=15664' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": "[ar:萧忆情]\n\n[ti:威风堂堂]\n\n[00:26.64]引诱谁去摘下禁果\n\n[00:28.11]甜美滋味偷咬一口\n\n[00:30.03]触及到了最深处果核\n\n[00:31.82]身体开始颤抖\n\n[00:33.85]舌尖已濡湿双腿内侧\n\n[00:35.55]神经末梢警报响彻\n\n[00:37.39]自内而外逐渐变得火热\n\n[00:39.14]现在无须再遵守规则\n\n[00:42.14]还故作矜持说违心的话\n\n[00:45.84]为何动作不停下\n\n[00:47.85]停下来\n\n[00:48.39]已经快停不下来\n\n[00:49.42]还想索取更多\n\n[00:50.46]踩碎那PRIDE\n\n[00:51.41]忘记毫无意义的理智存在\n\n[00:53.27]让暧昧因子在四处的徘徊\n\n[00:55.19]给我收起你那\n\n[00:56.21]太虚伪的STYLE\n\n[00:57.01]直白赤裸的爱\n\n[00:58.00]最原始的DIVE\n\n[00:58.86]喘息中断续的声音叫期待\n\n[01:00.65]别掩饰此刻\n\n[01:01.50]那让人意乱情迷的SMILE\n\n[01:10.90]缓慢吐息迷惑双眼的雾\n\n[01:12.49]强制禁锢身下轻舔锁骨\n\n[01:14.23]就让封锁的心渐渐领悟\n\n[01:15.97]别继续装无辜\n\n[01:17.54]开始脱下的衬衫\n\n[01:19.08]最后的纽扣解开它\n\n[01:20.98]快感get\n\n[01:21.85]从此不顾一切\n\n[01:23.32]还在犹豫什么\n\n[01:24.78]Darling\n\n[01:26.54]站在自由世界的正中央\n\n[01:30.09]窥探你幻想的是否太过浪荡\n\n[01:33.99]太难耐\n\n[01:34.41]分分秒秒太难耐\n\n[01:35.61]床笫间的狩猎\n\n[01:36.63]充满野心的TRY\n\n[01:37.66]不承认口头上无理的摊牌\n\n[01:39.58]只想要在身体里深埋\n\n[01:41.34]现在由我掌控\n\n[01:42.36]随心所欲的LIFE\n\n[01:43.40]给你要的未来\n\n[01:44.41]永远不腐坏\n\n[01:45.32]所有的阴暗面统统藏起来\n\n[01:46.70]仅为你一人展现那能骄傲夸耀的MIND\n\n[01:49.90]将不安的情绪碾至粉末\n\n[01:53.14]抹在你胸口印上最鲜艳的红\n\n[02:21.06]别打算缩起来置身之外\n\n[02:22.64]无论何时\n\n[02:23.27]NO TIME\n\n[02:23.58]ALL RIGHT\n\n[02:24.21]打破一切的羞耻值\n\n[02:25.43]哪里奇怪\n\n[02:26.06]哪里奇怪\n\n[02:26.68]哪里奇怪\n\n[02:27.30]BURN BURN BURN\n\n[02:28.22]想要的就是那\n\n[02:29.17]啊 没错\n\n[02:29.87]再给我更多的触摸\n\n[02:31.62]顺位交换贴近肌肤的DANCE\n\n[02:33.34]好吧 肆无忌惮\n\n[02:34.98]停下来\n\n[02:35.35]已经快停不下来\n\n[02:36.50]还想索取更多\n\n[02:37.68]踩碎那PRIDE\n\n[02:38.38]忘记毫无意义的理智存在\n\n[02:40.27]让暧昧因子在四处的徘徊\n\n[02:42.11]给我收起你那\n\n[02:43.16]太虚伪的STYLE\n\n[02:44.00]直白赤裸的爱\n\n[02:45.06]最原始的DIVE\n\n[02:45.90]喘息中断续的声音叫期待\n\n[02:47.76]别掩饰此刻那让人意乱情迷的SMILE\n\n[02:50.64]将不安的情绪碾至粉末\n\n[02:54.09]抹在你胸口印上最鲜艳的红\n\n[02:58.35]抛弃所有只想拥有此刻\n\n" -} -``` - -</details> diff --git a/docs/audio/music_list.md b/docs/audio/music_list.md deleted file mode 100644 index 8e8dff0..0000000 --- a/docs/audio/music_list.md +++ /dev/null @@ -1,782 +0,0 @@ -# 歌单&音频收藏夹详细信息 - -## 查询自己创建的歌单 - -> https://www.bilibili.com/audio/music-service-c/web/collections/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| pn | num | 页码 | 必要 | | -| ps | num | 每页项数 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----------------------------- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:未登录 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | ------------ | ---- | -| curPage | num | 当前页码 | | -| pageCount | num | 总计页数 | | -| totalSize | num | 总计收藏夹数 | | -| pageSize | num | 当前页面项数 | | -| data | array | 歌单列表 | | - -`data`中的`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 音频收藏夹mlid1 | | -| n | obj | 音频收藏夹mlid(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | ------------------------ | -------------------------------- | -| id | num | 音频收藏夹mlid | | -| uid | num | 创建用户mid | | -| uname | str | 创建用户昵称 | | -| title | str | 歌单标题 | | -| type | num | 收藏夹属性 | 0:普通收藏夹<br />1:默认收藏夹 | -| published | num | 是否公开 | 0:不公开<br />1:公开 | -| cover | str | 歌单封面图片url | | -| ctime | num | 歌单创建时间 | 时间戳 | -| song | num | 歌单中的音乐数量 | | -| desc | str | 歌单备注信息 | | -| sids | array | 歌单中的音乐 | | -| menuId | num | 音频收藏夹对应的歌单amid | | -| statistic | obj | 歌单状态数信息 | | - -`data`中的`sids`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---------------- | -| 0 | num | 收藏的音频auid1 | | -| n | num | 收藏的音频auid(n+1) | 按照歌单顺序排列 | -| …… | num | …… | …… | - -`data`中的`statistic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------------------ | ---- | -| sid | num | 音频收藏夹对应的歌单amid | | -| play | num | 播放数 | | -| collect | num | 收藏数 | | -| comment | null | 评论数 | | -| share | num | 分享数 | | - -**示例:** - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/list' \ ---data-urlencode 'ps=2' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -共计创建了两个歌单,如下 - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "curPage": 1, - "pageCount": 1, - "totalSize": 2, - "pageSize": 2, - "data": [ - { - "id": 15967839, - "uid": 293793435, - "uname": "社会易姐QwQ", - "title": "默认歌单", - "type": 1, - "published": 1, - "cover": "http://i0.hdslb.com/bfs/music/1e079693701d2f525850c288fcc48fa4259a73f6.jpg", - "ctime": 1519295502, - "song": 13, - "desc": "", - "sids": [ - 11673, - 276404, - 15664, - 737904, - 108588, - 1286999, - 658085, - 682118, - 736952, - 48716, - 15711, - 13598, - 57744 - ], - "menuId": 15958713, - "statistic": { - "sid": 15958713, - "play": 0, - "collect": 0, - "comment": null, - "share": 0 - } - }, - { - "id": 30894022, - "uid": 293793435, - "uname": "社会易姐QwQ", - "title": "test", - "type": 0, - "published": 1, - "cover": "", - "ctime": 1590154346, - "song": 0, - "desc": "test1", - "sids": [], - "menuId": 30866686, - "statistic": { - "sid": 30866686, - "play": 0, - "collect": 0, - "comment": 0, - "share": 0 - } - } - ] - } -} -``` - -</details> - -## 查询音频收藏夹(默认歌单)信息 - -> https://www.bilibili.com/audio/music-service-c/web/collections/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ------------------ | -| sid | num | 音频收藏夹mlid | 必要 | 必须为默认收藏夹mlid | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----------------------------- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:未登录 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | ------------------------ | ---------------------- | -| id | num | 音频收藏夹mlid | | -| uid | num | 创建用户mid | | -| uname | str | 创建用户昵称 | | -| title | str | 默认歌单 | 恒为`默认歌单` | -| type | num | 1 | 恒为`1` | -| published | num | 是否公开 | 0:不公开<br />1:公开 | -| cover | str | 歌单封面图片url | | -| ctime | num | 歌单创建时间 | 时间戳 | -| song | num | 歌单中的音乐数量 | | -| desc | str | 空 | 恒为空 | -| sids | array | 歌单中的音乐 | | -| menuId | num | 音频收藏夹对应的歌单amid | 与普通歌单不同通用 | -| statistic | obj | 歌单状态数信息 | | - -`data`中的`sids`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---------------- | -| 0 | num | 收藏的音频auid1 | | -| n | num | 收藏的音频auid(n+1) | 按照歌单顺序排列 | -| …… | num | …… | …… | - -`data`中的`statistic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------------------ | ---- | -| sid | num | 音频收藏夹对应的歌单amid | | -| play | num | 0 | | -| collect | num | 0 | | -| comment | null | - | | -| share | num | 0 | | - -**示例:** - -查询我的默认歌单,id为` 15967839 ` - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/collections/info' \ ---data-urlencode 'sid=15967839 ' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "id": 15967839, - "uid": 293793435, - "uname": "社会易姐QwQ", - "title": "默认歌单", - "type": 1, - "published": 1, - "cover": "http://i0.hdslb.com/bfs/music/1e079693701d2f525850c288fcc48fa4259a73f6.jpg", - "ctime": 1519295502, - "song": 13, - "desc": "", - "sids": [ - 11673, - 276404, - 15664, - 737904, - 108588, - 1286999, - 658085, - 682118, - 736952, - 48716, - 15711, - 13598, - 57744 - ], - "menuId": 15958713, - "statistic": { - "sid": 15958713, - "play": 0, - "collect": 0, - "comment": null, - "share": 0 - } - } -} -``` - -</details> - - -## 查询热门歌单 - -> https://www.bilibili.com/audio/music-service-c/web/menu/hit - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | ---- | --- | --- | -| pn | num | 页码 | 必要 | | -| ps | num | 每页项数 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | --------------------- | ---- | ----------------------------------------- | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:未登录 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------ | --- | -| curPage | num | 当前页码 | | -| pageCount | num | 总计页数 | | -| totalSize | num | 总计收藏夹数 | | -| pageSize | num | 当前页面项数 | | -| data | array | 歌单列表 | | - -`data`中的`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | --- | -------------- | --- | -| 0 | obj | 音频收藏夹mlid1 | | -| n | obj | 音频收藏夹mlid(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | --- | -------------- | ----------------------------- | -| menuId | num | 音频收藏夹对应的歌单amid | | -| uid | num | 创建用户mid | | -| uname | str | 创建用户昵称 | | -| title | str | 歌单标题 | | -| cover | str | 歌单封面图片url | | -| intro | str | 歌单介绍 | | -| type | num | 歌单属性 | 1:普通歌单<br/>2:置顶歌单<br/>5:PGC歌单 | -| off | num | 歌单是否公开 | 0:公开<br/>1:私密 | -| ctime | num | 歌单创建时间 | 时间戳 | -| curtime | num | 当前时间 | 时间戳 | -| statistic | obj | 歌单状态数信息 | | -| snum | num | 歌单包含歌曲个数 | | - -`data`中的`statistic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | -------------- | --- | -| sid | num | 音频收藏夹对应的歌单amid | | -| play | num | 播放数 | | -| collect | num | 收藏数 | | -| comment | num | 评论数 | | -| share | num | 分享数 | | - -**示例:** - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/menu/hit' \ - ---data-urlencode 'ps=1' \ - ---data-urlencode 'pn=6' -``` - -使用参数:`ps=1&qn=2` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "curPage": 1, - "pageCount": 1, - "totalSize": 11, - "pageSize": 3, - "data": [{ - "menuId": 10624, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "新曲推荐", - "cover": "http://i0.hdslb.com/bfs/music/a32c1ed4f6ec3f74f8240f4486a750dda3a509e5.jpg", - "intro": "每天11:00更新,为你推送最新音乐", - "type": 2, - "off": 0, - "ctime": 1501209433, - "curtime": 1655712354, - "statistic": { - "sid": 10624, - "play": 2366255, - "collect": 20565, - "comment": 1104, - "share": 622 - }, - "snum": 16, - "attr": 0, - "isDefault": 0, - "collectionId": 0 - }, { - "menuId": 125312, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "丧甜可口?你意想不到的软萌电音", - "cover": "http://i0.hdslb.com/bfs/music/04f6c29ed094368253bc05fecb7bf990cee2d3a3.jpg", - "intro": "这个化学反应是怦然心动?", - "type": 1, - "off": 0, - "ctime": 1533298738, - "curtime": 1655712354, - "statistic": { - "sid": 125312, - "play": 298018, - "collect": 9928, - "comment": 89, - "share": 239 - }, - "snum": 19, - "attr": 0, - "isDefault": 0, - "collectionId": 0 - }, { - "menuId": 26241, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "那些听了会泪目的动漫歌曲", - "cover": "http://i0.hdslb.com/bfs/music/006832318fc85fdf287667d51d83dba3b78be808.jpg", - "intro": "那些年陪伴我们的动漫歌曲,你还记得吗?\n", - "type": 1, - "off": 0, - "ctime": 1509608572, - "curtime": 1655712354, - "statistic": { - "sid": 26241, - "play": 370120, - "collect": 8390, - "comment": 110, - "share": 131 - }, - "snum": 12, - "attr": 0, - "isDefault": 0, - "collectionId": 0 - }] - } -} -``` - -</details> - -## 查询热门榜单 - -> https://www.bilibili.com/audio/music-service-c/web/menu/rank - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | ---- | --- | --- | -| pn | num | 页码 | 必要 | | -| ps | num | 每页项数 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | --------------------- | ---- | ----------------------------------------- | -| code | num | 返回值 | 0:成功<br />72000000:参数错误<br />72010002:未登录 | -| msg | str | 错误信息 | 默认为success | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------ | --- | -| curPage | num | 当前页码 | | -| pageCount | num | 总计页数 | | -| totalSize | num | 总计收藏夹数 | | -| pageSize | num | 当前页面项数 | | -| data | array | 歌单列表 | | - -`data`中的`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | --- | -------------- | --- | -| 0 | obj | 音频收藏夹mlid1 | | -| n | obj | 音频收藏夹mlid(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------------- | ----------------------------- | -| menuId | num | 音频收藏夹对应的歌单amid | | -| uid | num | 创建用户mid | | -| uname | str | 创建用户昵称 | | -| title | str | 歌单标题 | | -| cover | str | 歌单封面图片url | | -| intro | str | 歌单介绍 | | -| type | num | 歌单属性 | 1:普通歌单<br/>2:置顶歌单<br/>5:PGC歌单 | -| off | num | 歌单是否公开 | 0:公开<br/>1:私密 | -| ctime | num | 歌单创建时间 | 时间戳 | -| curtime | num | 当前时间 | 时间戳 | -| statistic | obj | 歌单状态数信息 | | -| snum | num | 歌单包含歌曲个数 | | -| audios | array | 歌单中的音乐信息(部分) | | - -`data`数组中的`statistic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | -------------- | --- | -| sid | num | 音频收藏夹对应的歌单amid | | -| play | num | 收藏数 | | -| collect | num | 点赞数 | | -| comment | num | 评论数 | | -| share | num | 分享数 | | - -`data`数组中的`audios`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | --- | ------- | --- | -| 0 | obj | 音频1 | | -| n | obj | 音频(n+1) | | -| …… | obj | …… | …… | - -`audios`数组中的`audios`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | --- | ---- | ------- | -| id | num | 音频id | | -| title | str | 音频标题 | | -| duration | num | 音频时长 | 单位:秒(s) | - - - -**示例:** - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/menu/rank' \ - ---data-urlencode 'ps=1' \ - ---data-urlencode 'pn=6' -``` - -使用参数:`ps=1&qn=6` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "curPage": 1, - "pageCount": 2, - "totalSize": 12, - "pageSize": 6, - "data": [{ - "menuId": 10624, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "新曲推荐", - "cover": "http://i0.hdslb.com/bfs/music/a32c1ed4f6ec3f74f8240f4486a750dda3a509e5.jpg", - "intro": "每天11:00更新,为你推送最新音乐", - "type": 2, - "off": 0, - "ctime": 1501209433, - "curtime": 1655713346, - "statistic": { - "sid": 10624, - "play": 2366255, - "collect": 20565, - "comment": 1104, - "share": 622 - }, - "snum": 16, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 1572281, - "title": "【Mitchie M】Nechusho No!No! (feat. 初音未来 & MEIKO)", - "duration": 112 - }, { - "id": 1551077, - "title": "【洛天依原创】双星伴生", - "duration": 197 - }, { - "id": 1544428, - "title": "【小柔】寄り酔い(cover)", - "duration": 216 - }] - }, { - "menuId": 10627, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "热歌榜(每日11:00更新)", - "cover": "http://i0.hdslb.com/bfs/music/bc735b32ab123f7ddc602b9194defae2cd66062f.jpg", - "intro": "每日上午11:00更新,精选三日内热门投稿作品。", - "type": 2, - "off": 0, - "ctime": 1501211353, - "curtime": 1655713346, - "statistic": { - "sid": 10627, - "play": 2289612, - "collect": 11437, - "comment": 434, - "share": 223 - }, - "snum": 20, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 1955567, - "title": "山海(原唱:草东没有派对)", - "duration": 215 - }, { - "id": 923884, - "title": "platiunm", - "duration": 181 - }, { - "id": 1954370, - "title": "Dark Dawn v1", - "duration": 200 - }] - }, { - "menuId": 10628, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "原创榜(每日11:00更新)", - "cover": "http://i0.hdslb.com/bfs/music/58782504cefb307878d12422fd365ed7f971fad1.jpg", - "intro": "每日上午11:00更新,精选三日内原创投稿音乐。", - "type": 2, - "off": 0, - "ctime": 1501211627, - "curtime": 1655713346, - "statistic": { - "sid": 10628, - "play": 395817, - "collect": 2583, - "comment": 314, - "share": 88 - }, - "snum": 20, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 923884, - "title": "platiunm", - "duration": 181 - }, { - "id": 1954370, - "title": "Dark Dawn v1", - "duration": 200 - }, { - "id": 1954654, - "title": "张真源 - 你要快乐 (Live)", - "duration": 235 - }] - }, { - "menuId": 10629, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "中文人声三日榜", - "cover": "http://i0.hdslb.com/bfs/music/f547e3b96d3f283eaa6a3a071de22092fb5101f8.jpg", - "intro": "每日上午11:00更新,精选三日内中文人声投稿音乐。", - "type": 2, - "off": 0, - "ctime": 1501211818, - "curtime": 1655713346, - "statistic": { - "sid": 10629, - "play": 842507, - "collect": 5102, - "comment": 362, - "share": 137 - }, - "snum": 20, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 1955567, - "title": "山海(原唱:草东没有派对)", - "duration": 215 - }, { - "id": 1955546, - "title": "爱你", - "duration": 86 - }, { - "id": 1954654, - "title": "张真源 - 你要快乐 (Live)", - "duration": 235 - }] - }, { - "menuId": 10630, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "日文人声三日榜", - "cover": "http://i0.hdslb.com/bfs/music/7dd5d629f50481e22e2f5eced510f5fbd89f5233.jpg", - "intro": "每日上午11:00更新,精选三日内日文人声投稿音乐。", - "type": 2, - "off": 0, - "ctime": 1501211959, - "curtime": 1655713346, - "statistic": { - "sid": 10630, - "play": 891268, - "collect": 8671, - "comment": 601, - "share": 169 - }, - "snum": 20, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 1954053, - "title": "派对浪客诸葛孔明 插入歌『ChocoPate』久远七海 starring Lezel", - "duration": 117 - }, { - "id": 1956316, - "title": "ただ君に晴れ(只给予你的晴天)", - "duration": 196 - }, { - "id": 1956321, - "title": "うまぴょい伝説(马儿蹦跳传说)", - "duration": 262 - }] - }, { - "menuId": 10631, - "uid": 32708543, - "uname": "大家的音乐姬", - "title": "VOCALOID三日榜", - "cover": "http://i0.hdslb.com/bfs/music/ce8b1646cbbd5513de7976ba81d0fd9c340c1899.jpg", - "intro": "每日上午11:00更新,精选三日内VOCALOID投稿音乐。", - "type": 2, - "off": 0, - "ctime": 1501212166, - "curtime": 1655713346, - "statistic": { - "sid": 10631, - "play": 170112, - "collect": 2900, - "comment": 528, - "share": 60 - }, - "snum": 10, - "attr": 0, - "isDefault": 0, - "collectionId": 0, - "audios": [{ - "id": 1954717, - "title": "弦歌引-翻调", - "duration": 230 - }, { - "id": 1956148, - "title": "告RADIO - 春色リップ", - "duration": 253 - }, { - "id": 1954302, - "title": "susan说", - "duration": 195 - }] - }] - } -} -``` - -</details> diff --git a/docs/audio/musicstream_url.md b/docs/audio/musicstream_url.md deleted file mode 100644 index 26f9c2c..0000000 --- a/docs/audio/musicstream_url.md +++ /dev/null @@ -1,279 +0,0 @@ -# 音频流URL - -<img src="../../assets/img/download.svg" width="100" height="100"/> - -## 音质qn参数定义 - -音质`qn`参数: - -| 代码 | 含义 | -| ---- | -------------------- | -| 0 | 流畅 128K | -| 1 | 标准 192K | -| 2 | 高品质 320K | -| 3 | 无损 FLAC (大会员) | - -## 获取音频流URL(web端) - -> https://www.bilibili.com/audio/music-service-c/web/url - -*请求方式:GET* - -**注:web端无法播放完整付费歌曲,付费歌曲为30s试听片段** - -本接口仅能获取192K音质的音频 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | -| quality | num | 2 | 不必要 | | -| privilege | num | 2 | 不必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ----------------------------------------------------------- | -| code | num | 返回值 | 0: 成功<br />4511006: 已跳过无法播放的歌曲<br />7201006:未找到或已下架<br />72000000:请求错误 | -| message | str | 返回值 | 字符串形式的 code | -| msg | str | 返回信息 | 成功为 success | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | --------- | --------------------------------------- | -| sid | num | 音频auid | | -| type | num | 音质标识 | -1:试听片段(192K)<br />1:192K | -| info | str | 空 | | -| timeout | num | 有效时长 | 单位为秒<br />一般为3h | -| size | num | 文件大小 | 单位为字节<br />当`type`为-1时`size`为0 | -| cdns | array | 音频流url | | -| qualities | null | | | -| title | str | 空 | | -| cover | str | 空 | | - -`data`对象的`cdns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | str | 音频流url | | -| 1 | str | 备用音频流url | 可能不存在 | - -**示例:** - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/url' \ ---data-urlencode 'sid=777180' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "sid": 777180, - "title": "", - "cover": "", - "type": 1, - "info": "", - "timeout": 10800, - "size": 5579903, - "cdns": [ - "https://upos-sz-mirrorcos.bilivideo.com/ugaxcode/m190314ws1dikiap1oivtapctuj1agjc-192k.m4a?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1725013547&gen=playurlv2&os=cosbv&oi=1746706124&trid=493923009cef4225ab8e1b9bda42c635B&mid=0&platform=pc&og=cos&upsig=043779511e2770cf6c3da04ed8a89f25&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&bvc=vod&nettype=0&orderid=0,1&logo=00000000" - ], - "qualities": null - }, - "message": "0", - "msg": "success" -} -``` - -</details> - -## 获取音频流URL(可获取付费音频) - -> https://api.bilibili.com/audio/music-service-c/url - -*请求方式:GET* - -认证方式:APP或Cookie(SESSDATA) - -**注:付费音乐需要有带大会员或音乐包的账号登录(Cookie或APP),否则为试听片段** - -无损音质需要登录的用户为会员 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | -------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| songid | num | 音频auid | 必要 | | -| quality | num | 音质代码 | 必要 | **详情见上表** | -| privilege | num | 必须为`2` | 必要 | | -| mid | num | 当前用户mid | 必要 | 可为任意值 | -| platform | str | 平台标识 | 必要 | 可为任意值 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ----------------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />7201006:未找到或已下架<br />72000000:请求错误 | -| msg | str | 错误信息 | 默认为success | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ----------- | ------------------------------------------------------------ | -| sid | num | 音频auid | | -| type | num | 音质标识 | -1:试听片段(192K)<br />0:128K<br />1:192K<br />2:320K<br />3:FLAC | -| info | str | 空 | **作用尚不明确** | -| timeout | num | 有效时长 | 单位为秒<br />一般为3h | -| size | num | 文件大小 | 单位为字节<br />当`type`为-1时`size`为0 | -| cdns | array | 音频流url | | -| qualities | array | 音质列表 | | -| title | str | 音频标题 | | -| cover | str | 音频封面url | | - -`data`对象的`cdns`数组: - - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | str | 音频流url | | -| 1 | str | 备用音频流url | | - -`data`对象的`qualities`数组: - - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---------------- | -| 0 | obj | 音质1 | 音质由高向低顺序 | -| n | obj | 音质(n+1) | | - -`qualities`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ---------------------- | -| type | num | 音质代码 | **详情见上表** | -| desc | str | 音质名称 | | -| size | num | 该音质的文件大小 | 单位为字节 | -| bps | str | 比特率标签 | | -| tag | str | 音质标签 | | -| require | num | 是否需要会员权限 | 0:不需要<br />1:需要 | -| requiredesc | str | 会员权限标签 | | - -**示例:** - -获取音频`au682118`的音频流url,音质为`3(无损)` - -Cookie方式: - -```shell -curl -G 'https://api.bilibili.com/audio/music-service-c/url' \ ---data-urlencode 'songid=682118' \ ---data-urlencode 'quality=3' \ ---data-urlencode 'privilege=2' \ ---data-urlencode 'platform=android' \ ---data-urlencode 'mid=293793435' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/audio/music-service-c/url' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'songid=682118' \ ---data-urlencode 'quality=3' \ ---data-urlencode 'privilege=2' \ ---data-urlencode 'platform=android' \ ---data-urlencode 'mid=293793435' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "sid": 682118, - "type": 3, - "info": "", - "timeout": 10800, - "size": 34456494, - "cdns": [ - "https://upos-sz-mirrorkodo.bilivideo.com/ugaxcode/m190102ws2pzf6jitbem841vq2x0du5x-flac.flac?deadline=1595332269&gen=uga&os=kodobv&uparams=deadline,gen,os&upsig=ac2284d97a61ef8758681eccf621c56d", - "https://upos-sz-mirrorks3.bilivideo.com/ugaxcode/m190102ws2pzf6jitbem841vq2x0du5x-flac.flac?deadline=1595332269&gen=uga&os=ks3bv&uparams=deadline,gen,os&upsig=3ac7d94dda5664f6f95dbfffeb289744" - ], - "qualities": [ - { - "type": 3, - "desc": "无损音质", - "size": 34456494, - "bps": "", - "tag": "SQ", - "require": 1, - "requiredesc": "付费享受" - }, - { - "type": 2, - "desc": "高品质", - "size": 10788682, - "bps": "320kbit/s", - "tag": "HQ", - "require": 0, - "requiredesc": "" - }, - { - "type": 1, - "desc": "标准", - "size": 6491973, - "bps": "192kbit/s", - "tag": "", - "require": 0, - "requiredesc": "" - }, - { - "type": 0, - "desc": "流畅", - "size": 4343667, - "bps": "128kbit/s", - "tag": "", - "require": 0, - "requiredesc": "" - } - ], - "title": "aLIEz", - "cover": "http://i0.hdslb.com/bfs/music/61d3f8cfdce14d2d1b006af59559c9bd22a2d21b.jpg" - } -} -``` - -</details> - -## 音频流的获取 - -将 `data.cdns[n]` 作为 URL 进行 GET 操作 - -需要验证请求头 `User-Agent` 不为空且不含敏感字串, 且 `Referer` 必须在 `.bilibili.com` 下 - -**示例:** - -使用 cURL + FFPlay 直接从音频流播放 - -```shell -curl -G "https://upos-sz-mirrorcos.bilivideo.com/ugaxcode/7bf6a3a3e94421ccc653f005457b1e8c-192k.m4a?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1725013121&gen=playurlv2&os=cosbv&oi=1823807031&trid=1a4703f1e7344bb891691c5857e8cfb9B&mid=0&platform=pc&og=cos&upsig=e3a9fba59b46ab2720c8b1807844e9f3&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&bvc=vod&nettype=0&orderid=0,1&logo=00000000" \ ---referer 'https://www.bilibili.com/' -A 'Mozilla/5.0' \ ---output - | ffplay - -``` diff --git a/docs/audio/rank.md b/docs/audio/rank.md deleted file mode 100644 index ff2a809..0000000 --- a/docs/audio/rank.md +++ /dev/null @@ -1,1160 +0,0 @@ -# 音频榜单 - -以下接口均来自页面 https://music.bilibili.com/pc/rank - -## 获取音频榜单每期列表 - -> https://api.bilibili.com/x/copyright-music-publicity/toplist/all_period - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ------------------------ | ------ | ---------------------- | -| list_type | num | 榜单类型 | 必要 | 1:热榜<br />2:原创榜 | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| list | obj | 年份索引 | | - -`data`中的`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---------------------- | ---- | -| {年份} | array | 对应年份索引的每期信息 | | -| …… | array | …… | | - -`list`中的`{年份}`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | ---- | -| 0 | obj | 该年中的单期数据 | | -| …… | obj | …… | …… | - -`{年份}`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | -------- | -------- | -| ID | num | 榜单 id | | -| priod | num | 榜单期数 | | -| publish_time | num | 发布时间 | 秒时间戳 | - -**示例:** - -```bash -curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/all_period' \ - --data-urlencode 'list_type=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": { - "2022": [ - { - "ID": 38, - "priod": 29, - "publish_time": 1672394399 - }, - { - "ID": 36, - "priod": 28, - "publish_time": 1671789599 - }, - { - "ID": 34, - "priod": 27, - "publish_time": 1671184800 - }, - { - "ID": 32, - "priod": 26, - "publish_time": 1670579999 - }, - { - "ID": 30, - "priod": 25, - "publish_time": 1669976540 - }, - { - "ID": 28, - "priod": 24, - "publish_time": 1669370757 - }, - { - "ID": 26, - "priod": 23, - "publish_time": 1668766987 - }, - { - "ID": 22, - "priod": 22, - "publish_time": 1668163419 - }, - { - "ID": 21, - "priod": 21, - "publish_time": 1667558276 - }, - { - "ID": 20, - "priod": 20, - "publish_time": 1666951199 - }, - { - "ID": 19, - "priod": 19, - "publish_time": 1666346399 - }, - { - "ID": 18, - "priod": 18, - "publish_time": 1665741599 - }, - { - "ID": 17, - "priod": 17, - "publish_time": 1665136799 - }, - { - "ID": 16, - "priod": 16, - "publish_time": 1664531999 - }, - { - "ID": 15, - "priod": 15, - "publish_time": 1663927199 - }, - { - "ID": 14, - "priod": 14, - "publish_time": 1663322399 - }, - { - "ID": 13, - "priod": 13, - "publish_time": 1662717599 - }, - { - "ID": 12, - "priod": 12, - "publish_time": 1662113559 - }, - { - "ID": 11, - "priod": 11, - "publish_time": 1661508657 - }, - { - "ID": 10, - "priod": 10, - "publish_time": 1660903199 - }, - { - "ID": 9, - "priod": 9, - "publish_time": 1660298400 - }, - { - "ID": 8, - "priod": 8, - "publish_time": 1659693599 - }, - { - "ID": 7, - "priod": 7, - "publish_time": 1659088799 - }, - { - "ID": 6, - "priod": 6, - "publish_time": 1658483999 - }, - { - "ID": 5, - "priod": 5, - "publish_time": 1657879200 - }, - { - "ID": 4, - "priod": 4, - "publish_time": 1657274399 - }, - { - "ID": 3, - "priod": 3, - "publish_time": 1656669600 - }, - { - "ID": 2, - "priod": 2, - "publish_time": 1656064800 - }, - { - "ID": 1, - "priod": 1, - "publish_time": 1655460091 - } - ], - "2023": [ - { - "ID": 76, - "priod": 48, - "publish_time": 1683885696 - }, - { - "ID": 74, - "priod": 47, - "publish_time": 1683281010 - }, - { - "ID": 72, - "priod": 46, - "publish_time": 1682675999 - }, - { - "ID": 70, - "priod": 45, - "publish_time": 1682071442 - }, - { - "ID": 68, - "priod": 44, - "publish_time": 1681466400 - }, - { - "ID": 66, - "priod": 43, - "publish_time": 1680861599 - }, - { - "ID": 64, - "priod": 42, - "publish_time": 1680256799 - }, - { - "ID": 62, - "priod": 41, - "publish_time": 1679652088 - }, - { - "ID": 60, - "priod": 40, - "publish_time": 1679047199 - }, - { - "ID": 58, - "priod": 39, - "publish_time": 1678442399 - }, - { - "ID": 56, - "priod": 38, - "publish_time": 1677837600 - }, - { - "ID": 54, - "priod": 37, - "publish_time": 1677232800 - }, - { - "ID": 52, - "priod": 36, - "publish_time": 1676628000 - }, - { - "ID": 50, - "priod": 35, - "publish_time": 1676023199 - }, - { - "ID": 48, - "priod": 34, - "publish_time": 1675418399 - }, - { - "ID": 46, - "priod": 33, - "publish_time": 1674813599 - }, - { - "ID": 44, - "priod": 32, - "publish_time": 1674208799 - }, - { - "ID": 42, - "priod": 31, - "publish_time": 1673603999 - }, - { - "ID": 40, - "priod": 30, - "publish_time": 1672999199 - } - ] - } - } -} -``` - -</details> - -## 查询音频榜单单期信息 - -> https://api.bilibili.com/x/copyright-music-publicity/toplist/detail - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | ------------------------------------------------ | -| list_id | num | 榜单 id | 必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ----------------------- | ------------------------------------------------------------ | -| listen_fid | num | 畅听版歌单收藏夹原始 id | 非真实收藏夹 mlid<br />需要在后方拼接用户 mid 的后两位,如`16484498`->`1648449844` | -| all_fid | num | 完整版歌单收藏夹原始 id | 非真实收藏夹 mlid<br />算法同上 | -| fav_mid | num | 绑定收藏夹用户的 mid | 例如`1164440244`([音乐热榜bot](https://space.bilibili.com/1164440244)账号) | -| cover_url | str | 榜单封面 url | | -| is_subscribe | bool | 是否已订阅榜单 | `true`:已订阅<br />`false`:未订阅<br />需要登录(Cookie 或 APP),未登录恒为`false` | -| listen_count | num | 平台有版权音频的数量 | | - -**示例:** - -查询 [第 48 期音频榜单](https://music.bilibili.com/pc/rank?list_id=76)(id=76) 信息 - -```bash -curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/detail' \ - --data-urlencode 'list_id=76' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "listen_fid": 23317138, - "all_fid": 23672948, - "fav_mid": 1164440244, - "cover_url": "http://i0.hdslb.com/bfs/music-publicity/d8509dc6ee94dd5cc4658a2cbca4f525b4396df5.png", - "is_subscribe": false, - "listen_count": 5 - } -} -``` - -</details> - -## 获取音频榜单单期内容 - -> https://api.bilibili.com/x/copyright-music-publicity/toplist/music_list - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | ------------------------------------------------ | -| list_id | num | 榜单 id | 必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ---- | -| list | array | 内容列表 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 榜单内容 1 | | -| n | obj | 榜单内容 (n+1) | | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ------------------ | ------------------------------------------- | -| music_id | str | 音频 MAID | 例如`MA409252256362326366` | -| music_title | str | 音频标题 | | -| singer | str | 音频作者 | | -| album | str | 音频专辑 | | -| mv_aid | num | 音频 MV 的 avid | 若该音频无 MV 则该字段为 0 | -| mv_bvid | str | 音频 MV 的 bvid | | -| mv_cover | str | 音频封面 url | | -| heat | num | 热度值 | | -| rank | num | 排序值 | 1 为最高排序,DESC 方式 | -| can_listen | bool | 平台是否有版权 | `true`:平台有版权<br />`false`:平台无版权 | -| recommendation | str | (?) | | -| creation_aid | num | 关联稿件 avid | | -| creation_bvid | str | 关联稿件 bvid | | -| creation_cover | str | 关联稿件封面 url | | -| creation_title | str | 关联稿件标题 | | -| creation_up | num | 关联稿件 UP 主 mid | | -| creation_nickname | str | 关联稿件 UP 主昵称 | | -| creation_duration | num | 关联稿件时长 | 单位为秒 | -| creation_play | num | 关联稿件播放量 | | -| creation_reason | str | 关联稿件二级分区名 | | -| achievements | array | 获得成就 | | -| material_id | num | (?) | | -| material_use_num | num | (?) | | -| material_duration | num | (?) | | -| material_show | num | (?) | | -| song_type | num | (?) | | - -`list`数组中的对象中的`achievements`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | str | 成就文案 1 | | -| n | str | 成就文案 (n+1) | | -| …… | str | …… | …… | - -**示例:** - -查询 [第 48 期音频榜单](https://music.bilibili.com/pc/rank?list_id=76)(id=76) 榜单内容列表 - -```bash -curl -G 'https://api.bilibili.com/x/copyright-music-publicity/toplist/music_list' \ - --data-urlencode 'list_id=76' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "music_id": "MA409252256362326366", - "music_title": "極楽浄土", - "singer": "GARNiDELiA", - "album": "約束 -Promise code-", - "mv_aid": 28361833, - "mv_bvid": "BV1us41137Fd", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/07e0d9826c574e37df25387cab6df062.jpg", - "heat": 5328979, - "rank": 1, - "can_listen": true, - "recommendation": "", - "creation_aid": 910787823, - "creation_bvid": "BV1HM4y1b79Z", - "creation_cover": "http://i1.hdslb.com/bfs/archive/5780a05437ec9880301ed093537d6af97b0f8bdb.jpg", - "creation_title": "【MARiA】乘风2023初舞台!《极乐净土》,虽迟但到!", - "creation_up": 110352985, - "creation_nickname": "GARNiDELiA", - "creation_duration": 100, - "creation_play": 13487670, - "creation_reason": "官方现场", - "achievements": [ - "重回榜单", - "最高排名1" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA456045402056087707", - "music_title": "アイドル", - "singer": "YOASOBI", - "album": "アイドル", - "mv_aid": 227499491, - "mv_bvid": "BV17h411u7sb", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/4bf2fe90e9d2361c3c4ddf59064c6e69.jpg", - "heat": 1856277, - "rank": 2, - "can_listen": false, - "recommendation": "", - "creation_aid": 952765045, - "creation_bvid": "BV1Ws4y1A7fS", - "creation_cover": "http://i0.hdslb.com/bfs/archive/8326350bab039ffee9274d7e1f94240d170fa096.jpg", - "creation_title": "【中文字幕】我推的孩子「アイドル」官方MV(4K 60帧/Hi-Res)", - "creation_up": 11585165, - "creation_nickname": "爱莉丝青贝尔克", - "creation_duration": 226, - "creation_play": 3742892, - "creation_reason": "音乐MV", - "achievements": [ - "本期排名持平", - "最高排名1" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA458652518440821364", - "music_title": "野火wildfire", - "singer": "HOYO- Mix,Jonathan Steingard", - "album": "雪融于烬", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/e0825a2cfee22ce77f02d4d80826a1d9.jpg", - "heat": 1767135, - "rank": 3, - "can_listen": false, - "recommendation": "", - "creation_aid": 355732312, - "creation_bvid": "BV1ZX4y117Dx", - "creation_cover": "http://i0.hdslb.com/bfs/archive/c98bd629876e8b7b4c056d39bcfeaabe7327e996.jpg", - "creation_title": "这首“野火”神曲,我还能再听亿遍!!!", - "creation_up": 394861137, - "creation_nickname": "Hanserのcece", - "creation_duration": 219, - "creation_play": 2158925, - "creation_reason": "动画创作", - "achievements": [ - "本期排名↑1", - "最高排名3" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA459088929228874460", - "music_title": "不问别离", - "singer": "指尖笑", - "album": "不问别离", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/b1507c1649500a0dcf0295b4b68e4b15.jpg", - "heat": 1576823, - "rank": 4, - "can_listen": false, - "recommendation": "", - "creation_aid": 740818022, - "creation_bvid": "BV1Sk4y1E7qH", - "creation_cover": "http://i2.hdslb.com/bfs/archive/5301b2fee7ad520c8946b5eb92888cf8be563a80.jpg", - "creation_title": "日推歌单 | \"我叹那春花秋月不问别离 长风起孤城笛声里全是你\" |《不问ciaga》", - "creation_up": 550445292, - "creation_nickname": "peach63", - "creation_duration": 164, - "creation_play": 274898, - "creation_reason": "音乐MV", - "achievements": [ - "本期排名↑10", - "最高排名4" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA459819223808501000", - "music_title": "Spicy", - "singer": "aespa", - "album": "MY WORLD - The 3rd Mini Album", - "mv_aid": 570920682, - "mv_bvid": "BV1qz4y1a7m8", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6455687e7d72dd838ffd2aa753fd7761.jpg", - "heat": 1441365, - "rank": 5, - "can_listen": false, - "recommendation": "", - "creation_aid": 570920682, - "creation_bvid": "BV1qz4y1a7m8", - "creation_cover": "http://i2.hdslb.com/bfs/archive/cd5456735bd645343a51b8df9b4a91236b08e657.jpg", - "creation_title": "aespa《Spicy》MV", - "creation_up": 3493085782739496, - "creation_nickname": "SMTOWN", - "creation_duration": 205, - "creation_play": 2363321, - "creation_reason": "官方MV", - "achievements": [ - "新晋上榜", - "最高排名5" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA458946536466866804", - "music_title": "UNFORGIVEN (feat. Nile Rodgers)", - "singer": "LE SSERAFIM,Nile Rodgers", - "album": "UNFORGIVEN", - "mv_aid": 528370662, - "mv_bvid": "BV1LM41137Pc", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/47e6685cfe44185ec4daab5e765e3b26.jpg", - "heat": 1362593, - "rank": 6, - "can_listen": true, - "recommendation": "", - "creation_aid": 698312930, - "creation_bvid": "BV1wm4y1y76i", - "creation_cover": "http://i1.hdslb.com/bfs/archive/4f097f5067fc3408118f7d59b2c36d8278660dd9.jpg", - "creation_title": "假如让金采源唱全曲......", - "creation_up": 496743369, - "creation_nickname": "YuueFriloeyyy_", - "creation_duration": 183, - "creation_play": 319267, - "creation_reason": "歌曲演唱", - "achievements": [ - "本期排名↑3", - "最高排名6" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA451591354456234292", - "music_title": "雪 Distance", - "singer": "Capper,罗言", - "album": "Uniconfication", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/5899008cea7ed157b8bdb6f9b89dd7ff.jpg", - "heat": 1233174, - "rank": 7, - "can_listen": false, - "recommendation": "", - "creation_aid": 355903423, - "creation_bvid": "BV1QX4y127jq", - "creation_cover": "http://i2.hdslb.com/bfs/archive/e3542cf8d7cf7cc58268c840d845bb12d4c52662.jpg", - "creation_title": "⚡️“可是雪啊,埋进土里”⚡️", - "creation_up": 22169833, - "creation_nickname": "寒了个羽", - "creation_duration": 158, - "creation_play": 2622705, - "creation_reason": "音乐创作", - "achievements": [ - "本期排名↓1", - "最高排名3" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA460246447678301091", - "music_title": "Ghost Face (鬼脸) (LIVE版)", - "singer": "法老", - "album": "中国说唱巅峰对决2023 第一期", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/0d4050feb7cac1a568849832d5fa9f67.jpg", - "heat": 1163291, - "rank": 8, - "can_listen": false, - "recommendation": "", - "creation_aid": 355995337, - "creation_bvid": "BV1qX4y1y78r", - "creation_cover": "http://i0.hdslb.com/bfs/archive/f5e7a51dbe1f48441042dad1e45148c400a3f9fe.jpg", - "creation_title": "【法老Pharaoh】虽迟但到!说唱巅峰对决《Ghost Face》live", - "creation_up": 12807175, - "creation_nickname": "法老爷爷", - "creation_duration": 79, - "creation_play": 885856, - "creation_reason": "官方现场", - "achievements": [ - "新晋上榜", - "最高排名8" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA458974797167092444", - "music_title": "F*ck My Life", - "singer": "SEVENTEEN", - "album": "SEVENTEEN 10th Mini Album 'FML'", - "mv_aid": 313423265, - "mv_bvid": "BV1tP41117mv", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6723df38fcca9b2ab85b564e3809426e.jpg", - "heat": 735517, - "rank": 9, - "can_listen": true, - "recommendation": "", - "creation_aid": 313423265, - "creation_bvid": "BV1tP41117mv", - "creation_cover": "http://i1.hdslb.com/bfs/archive/38377552bd74cc32851d6466343dc3a26983c3b6.jpg", - "creation_title": "SEVENTEEN 'F*ck My Life' Official MV", - "creation_up": 692206640, - "creation_nickname": "SEVENTEEN", - "creation_duration": 220, - "creation_play": 1008830, - "creation_reason": "官方MV", - "achievements": [ - "新晋上榜", - "最高排名9" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA460247474041267107", - "music_title": "Control's Wishes", - "singer": "Steven Grove,塞壬唱片-MSR", - "album": "孤星OST", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/6068f2c64c6796f68b8dae7772f891ac.jpg", - "heat": 628233, - "rank": 10, - "can_listen": false, - "recommendation": "", - "creation_aid": 740625544, - "creation_bvid": "BV1ck4y1E7KJ", - "creation_cover": "http://i1.hdslb.com/bfs/archive/11381997120391d655c91b19bc08e110ca8201e5.jpg", - "creation_title": "【小提琴/钢琴】明日方舟四周年孤星PV曲《Control's Wishes》", - "creation_up": 2016022052, - "creation_nickname": "-桑榆墨景-", - "creation_duration": 193, - "creation_play": 37881, - "creation_reason": "器乐演奏", - "achievements": [ - "新晋上榜", - "最高排名10" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA459266635128138957", - "music_title": "花园种花(在小小的花园里种小小的花)", - "singer": "桃子老师花开富贵", - "album": "花园种花", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/fb1d6a44bb8337edf6c9d32c421e9c89.jpg", - "heat": 623604, - "rank": 11, - "can_listen": false, - "recommendation": "", - "creation_aid": 398216313, - "creation_bvid": "BV1uo4y1x7UF", - "creation_cover": "http://i0.hdslb.com/bfs/archive/9562b126010376f7dcfedf0397170696eb1a19c5.jpg", - "creation_title": "姬子老师:开拓者家长们,路上有点堵车,这节挖呀挖呀挖课来晚了", - "creation_up": 391636983, - "creation_nickname": "动漫跳舞姬", - "creation_duration": 33, - "creation_play": 566777, - "creation_reason": "动画创作", - "achievements": [ - "新晋上榜", - "最高排名11" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA455203227252613620", - "music_title": "Cupid", - "singer": "FIFTY FIFTY", - "album": "The Beginning: Cupid", - "mv_aid": 226830843, - "mv_bvid": "BV1sh41137rs", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/e91891c4e2573f4d4ada329db9a86b30.jpg", - "heat": 562273, - "rank": 12, - "can_listen": false, - "recommendation": "", - "creation_aid": 485862497, - "creation_bvid": "BV19T411b7nE", - "creation_cover": "http://i2.hdslb.com/bfs/archive/ece27463e3eb13f9fbbcb799436375495a795e3c.jpg", - "creation_title": "挑战在cp29和一百位coser比心!", - "creation_up": 1477074, - "creation_nickname": "菌儿rikushi", - "creation_duration": 148, - "creation_play": 1216246, - "creation_reason": "COSPLAY创作", - "achievements": [ - "重回榜单", - "最高排名12" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA457806074590836885", - "music_title": "星间旅行", - "singer": "HOYO-MiX,茶理理理子", - "album": "崩坏星穹铁道-星间旅行 Interstellar Journ", - "mv_aid": 612992200, - "mv_bvid": "BV1rh4y1n77f", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/20ddff696bbbd7f00fc8b76f7b5334f7.jpg", - "heat": 515238, - "rank": 13, - "can_listen": false, - "recommendation": "", - "creation_aid": 995418876, - "creation_bvid": "BV1vs4y197gt", - "creation_cover": "http://i0.hdslb.com/bfs/archive/2d6997320bd2bb20f50b363a894033f325fed871.jpg", - "creation_title": "《星穹铁道玩家现状》", - "creation_up": 551188239, - "creation_nickname": "企鹅带带北极熊", - "creation_duration": 88, - "creation_play": 1570181, - "creation_reason": "音乐创作", - "achievements": [ - "本期排名↓10", - "最高排名2" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA434298821720206219", - "music_title": "可愛くてごめん (feat. かぴ)", - "singer": "HoneyWorks,かぴ", - "album": "告白実行委員会 -FLYING SONGS- 恋してる", - "mv_aid": 779733306, - "mv_bvid": "BV1iy4y1Z7Ri", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/45ce3f52d31386741589a3a5ca9a420c.jpg", - "heat": 438720, - "rank": 14, - "can_listen": true, - "recommendation": "", - "creation_aid": 862702118, - "creation_bvid": "BV1gG4y117nV", - "creation_cover": "http://i1.hdslb.com/bfs/archive/38d94515fe5f6294bf7712d8b26eb049ec3cf627.jpg", - "creation_title": "这么可爱真是抱歉!❤️(*/∇\*)天台宅舞", - "creation_up": 434476793, - "creation_nickname": "优联酱uu", - "creation_duration": 140, - "creation_play": 1199819, - "creation_reason": "舞蹈创作", - "achievements": [ - "重回榜单", - "最高排名2" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA440555130794857381", - "music_title": "阳光开朗大男孩", - "singer": "卦者灵风", - "album": "阳光开朗大男孩", - "mv_aid": 421697247, - "mv_bvid": "BV1z341187Y9", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/220c674ca22acb91114f6e0705d0f426.jpg", - "heat": 371851, - "rank": 15, - "can_listen": true, - "recommendation": "", - "creation_aid": 995281134, - "creation_bvid": "BV1as4y1d7QR", - "creation_cover": "http://i0.hdslb.com/bfs/archive/4628837eb5baf879a2be79b16836c90e0466dd6c.jpg", - "creation_title": "【灵能手书】阳光开朗大男孩", - "creation_up": 8504036, - "creation_nickname": "kipoki", - "creation_duration": 81, - "creation_play": 627123, - "creation_reason": "动画创作", - "achievements": [ - "重回榜单", - "最高排名1" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA406539170333366962", - "music_title": "此生不换", - "singer": "青鸟飞鱼", - "album": "仙剑奇侠传三 电视剧原声带", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "http://i0.hdslb.com/bfs/station_src/music_metadata/450bd04688ef6a691b1adb816ace6155.jpg", - "heat": 361410, - "rank": 16, - "can_listen": false, - "recommendation": "", - "creation_aid": 545438082, - "creation_bvid": "BV1Cq4y1J7Ge", - "creation_cover": "http://i1.hdslb.com/bfs/archive/1b8b80f7ba9dccaf648cfb641b40e1d38965a4a4.jpg", - "creation_title": "开口爷青回!男生宿舍回忆向翻唱仙剑3插曲《此生不换》|我和室友的翻唱日常.", - "creation_up": 346782115, - "creation_nickname": "陈家淇_B11", - "creation_duration": 258, - "creation_play": 2976435, - "creation_reason": "歌曲演唱", - "achievements": [ - "重回榜单", - "最高排名15" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA444928930235832050", - "music_title": "太空电梯", - "singer": "阿鲲", - "album": "流浪地球2电影原声大碟", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/c64c10b911ace04ae45b3172abe3a1d8.jpg", - "heat": 352572, - "rank": 17, - "can_listen": false, - "recommendation": "", - "creation_aid": 269421756, - "creation_bvid": "BV1ic41157cc", - "creation_cover": "http://i0.hdslb.com/bfs/archive/39a27b9d804750325b260f6bc69a3afa8c01a1dc.jpg", - "creation_title": "都说是涂装问题了,看,这战斗力不就上来了吗!", - "creation_up": 478832800, - "creation_nickname": "大刀王五EP", - "creation_duration": 87, - "creation_play": 706377, - "creation_reason": "动画创作", - "achievements": [ - "重回榜单", - "最高排名1" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA400017093531020491", - "music_title": "兰亭序", - "singer": "周杰伦", - "album": "魔杰座", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/a03f7d174c3b01e4c6b3907a115c5434.jpg", - "heat": 347017, - "rank": 18, - "can_listen": false, - "recommendation": "", - "creation_aid": 825572396, - "creation_bvid": "BV1kg4y1L7v6", - "creation_cover": "http://i0.hdslb.com/bfs/archive/59e8436511ff45402e3d5dcf2c01feeb94897103.jpg", - "creation_title": "无关风月我题序等你回《兰亭序》", - "creation_up": 628615890, - "creation_nickname": "qqq还在梦里", - "creation_duration": 125, - "creation_play": 522133, - "creation_reason": "歌曲演唱", - "achievements": [ - "重回榜单", - "最高排名6" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA457811156946443719", - "music_title": "I'll Do It", - "singer": "Heidi Montag", - "album": "Superficial", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/e1d95f62257da69db1dc36e949f789f5.jpg", - "heat": 345773, - "rank": 19, - "can_listen": false, - "recommendation": "", - "creation_aid": 313275936, - "creation_bvid": "BV1XP411y7UD", - "creation_cover": "http://i1.hdslb.com/bfs/archive/c42e54074a50ee1eaddbd5495091c2152aad8ecf.jpg", - "creation_title": "“嗨,老婆” 【崩坏星穹铁道】", - "creation_up": 14158002, - "creation_nickname": "Ishi丶", - "creation_duration": 61, - "creation_play": 103542, - "creation_reason": "动画创作", - "achievements": [ - "本期排名↓12", - "最高排名6" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - }, - { - "music_id": "MA409255441550338398", - "music_title": "失恋阵线联盟", - "singer": "草蜢", - "album": "失恋阵线联盟", - "mv_aid": 0, - "mv_bvid": "", - "mv_cover": "https://i0.hdslb.com/bfs/station_src/music_metadata/5d6b27035d5f7c0e7781b779871aca04.jpg", - "heat": 337176, - "rank": 20, - "can_listen": false, - "recommendation": "", - "creation_aid": 415864088, - "creation_bvid": "BV1QV411b7CT", - "creation_cover": "http://i1.hdslb.com/bfs/archive/8735563d73f86ef7073ed580a41e12c409bd2a5b.jpg", - "creation_title": "年会舞蹈《失恋阵线联盟》完整版", - "creation_up": 451425930, - "creation_nickname": "舞大师舞蹈工作室", - "creation_duration": 135, - "creation_play": 5336890, - "creation_reason": "舞蹈创作", - "achievements": [ - "重回榜单", - "最高排名20" - ], - "material_id": 0, - "material_use_num": 0, - "material_duration": 0, - "material_show": 1, - "song_type": 2 - } - ] - } -} -``` - -</details> - -## 订阅或退订榜单 - -> https://api.bilibili.com/x/copyright-music-publicity/toplist/subscribe/update - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | --------------- | ------------------------------------------------ | -| state | num | 操作代码 | 必要 | 1:订阅<br />2:退订 | -| list_id | num | 榜单 id | 非必要 | 见 [获取音频榜单每期列表](#获取音频榜单每期列表) | -| csrf | str | CSRF Token(位于cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 验证失败<br />400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -```bash -curl 'https://api.bilibili.com/x/copyright-music-publicity/toplist/subscribe/update' \ - --data-urlencode 'state=1' \ - --data-urlencode 'state=76' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/audio/status_number.md b/docs/audio/status_number.md deleted file mode 100644 index 62621c1..0000000 --- a/docs/audio/status_number.md +++ /dev/null @@ -1,63 +0,0 @@ -# 音频状态数 - -## 歌曲状态数 - ->https://www.bilibili.com/audio/music-service-c/web/stat/song - -*请求方式:GET* - -唯缺投币数2333333 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| sid | num | 音频auid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------------------------- | -| code | num | 返回值 | 0:成功<br />72000000:参数错误 | -| msg | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| sid | num | 音频auid | | -| play | num | 播放次数 | | -| collect | num | 收藏数 | | -| comment | num | 评论数 | | -| share | num | 分享数 | | - -**示例:** - -查询歌曲`au15664`的状态数 - -```shell -curl -G 'https://www.bilibili.com/audio/music-service-c/web/stat/song' \ ---data-urlencode 'sid=15664' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "data": { - "sid": 15664, - "play": 1377390, - "collect": 44340, - "comment": 2756, - "share": 4114 - } -} -``` - -</details> diff --git a/docs/bangumi/follow.md b/docs/bangumi/follow.md deleted file mode 100644 index a614e27..0000000 --- a/docs/bangumi/follow.md +++ /dev/null @@ -1,124 +0,0 @@ -# 追番相关 - -## 追番 -> https://api.bilibili.com/pgc/web/follow/add - -*请求方式:POST* - -鉴权方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|--------|-----|-----| -| season_id | str | 剧集ssid | 必要 | | -| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------- | -| code | num | 返回值 | 0:成功<br />-111:csrf校验失败 | -| message | str | 信息 | 成功时:success | -| result | obj |见下表| | - -根对象中的`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| fmid | num | 0 | | -| relation | bool | false | | -| status | num | 2 | | -| toast | str | 自己追的番就要好好看完哟^o^ | | - -**示例:** - -追番`ssid=41410`的番剧 - -```shell -curl -G 'https://api.bilibili.com/pgc/web/follow/add' \ ---data-urlencode 'season_id=41410' \ ---data-urlencode 'csrf=xxx' \ -``` - -<details> - -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "fmid": 0, - "relation": false, - "status": 2, - "toast": "自己追的番就要好好看完哟^o^" - } -} -``` -</details> - -## 取消追番 - -> https://api.bilibili.com/pgc/web/follow/del - -*请求方式:POST* - -鉴权方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ----------------------------------- | ------ | ---- | -| season_id | str | 剧集ssid | 必要 | | -| csrf | str | csrf token(位于cookies中的bili_jct) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------- | -| code | num | 返回值 | 0:成功<br />-111:csrf校验失败 | -| message | str | 信息 | 成功时:success | -| result | obj | 见下表 | | - -根对象中的`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| fmid | num | 0 | | -| relation | bool | true | | -| status | num | 0 | | -| toast | str | 已取消追番 | | - -**示例:** - -取消`ssid=41410`的追番 - -```shell -curl -G 'https://api.bilibili.com/pgc/web/follow/del' \ ---data-urlencode 'season_id=41410' \ ---data-urlencode 'csrf=xxx' \ -``` - -<details> - -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "fmid": 0, - "relation": false, - "status": 0, - "toast": "已取消追番" - } -} -``` -</details> diff --git a/docs/bangumi/info.md b/docs/bangumi/info.md deleted file mode 100644 index 6345107..0000000 --- a/docs/bangumi/info.md +++ /dev/null @@ -1,1510 +0,0 @@ -# 剧集地区一览 - -| ID | 名称 | -|----|-------| -| 1 | 中国大陆 | -| 2 | 日本 | -| 3 | 美国 | -| 4 | 英国 | -| 5 | 加拿大 | -| 6 | 中国香港 | -| 7 | 中国台湾 | -| 8 | 韩国 | -| 9 | 法国 | -| 10 | 泰国 | -| 11 | 马来西亚 | -| 12 | 新加坡 | -| 13 | 西班牙 | -| 14 | 俄罗斯 | -| 15 | 德国 | -| 16 | 其他 | -| 17 | 丹麦 | -| 18 | 乌克兰 | -| 19 | 以色列 | -| 20 | 伊朗 | -| 21 | 保加利亚 | -| 22 | 克罗地亚 | -| 23 | 冰岛 | -| 24 | 匈牙利 | -| 25 | 南非 | -| 26 | 印尼 | -| 27 | 印度 | -| 28 | 哥伦比亚 | -| 30 | 土耳其 | -| 31 | 墨西哥 | -| 32 | 委内瑞拉 | -| 33 | 巴西 | -| 34 | 希腊 | -| 35 | 意大利 | -| 36 | 挪威 | -| 37 | 捷克 | -| 38 | 摩洛哥 | -| 39 | 新西兰 | -| 40 | 智利 | -| 41 | 比利时 | -| 42 | 波兰 | -| 43 | 澳大利亚 | -| 44 | 爱尔兰 | -| 45 | 瑞典 | -| 46 | 瑞士 | -| 47 | 芬兰 | -| 48 | 苏联 | -| 49 | 荷兰 | -| 50 | 越南 | -| 51 | 阿根廷 | -| 52 | 马耳他 | -| 53 | 古巴 | -| 54 | 菲律宾 | -| 55 | 哈萨克斯坦 | -| 56 | 黎巴嫩 | -| 57 | 塞浦路斯 | -| 58 | 卡塔尔 | -| 59 | 阿联酋 | -| 60 | 奥地利 | -| 61 | 西德 | -| 62 | 卢森堡 | -| 63 | 罗马尼亚 | -| 64 | 印度尼西亚 | -| 65 | 南斯拉夫 | -| 66 | 蒙古 | -| 70 | 葡萄牙 | - -# 剧集基本信息 - -## 剧集基本信息(mdid方式) - -> https://api.bilibili.com/pgc/review/user - -*请求方式:GET* - -鉴权方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|--------|-----|-----| -| media_id | str | 剧集mdid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|----------------------------------| -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| result | obj | 信息本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------|-----|--------|----------| -| media | obj | 剧集信息 | | -| review | obj | 用户操作信息 | 仅登录时存在此项 | - -`result`中的`media`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------------|-------|-----------|--------------------------------------------------------------| -| areas | array | 地区 | | -| cover | str | 封面图片url | | -| horizontal_picture | str | 横板封面图片url | | -| media_id | num | 剧集mdid | | -| new_ep | obj | 最新一话信息 | | -| rating | obj | 评分信息 | | -| season_id | num | 剧集ssid | | -| share_url | url | 剧集详情页连接 | | -| title | str | 标题 | | -| type | num | 剧集类型id | 1:番剧<br/>2:电影<br/>3:纪录片<br/>4:国创<br/>5:电视剧<br/>6:漫画<br/>7:综艺 | -| type_name | str | 剧集类型 | | - -`media`中的`areas`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-----------|-----| -| 0 | obj | 地区信息1 | | -| n | obj | 地区信息(n+1) | | -| …… | obj | …… | | - -`areas`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|-------------------| -| id | num | 所属地区编号 | [剧集地区一览](#剧集地区一览) | -| name | str | 所属地区名称 | | - -`media`中的`new_ep`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-----|-----------|--------------------| -| id | num | 最新一话的epid | | -| index | str | 最新一话名称 | | -| index_show | str | 最新一话显示名称 | eg. `第1话`、`更新至第4话` | - -`media`中的`rating`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-----|--------|-----| -| count | num | 总计评分人数 | | -| score | num | 评分 | | - -`result`中的`review`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|-----|--------| -| is_coin | num | 0 | 作用尚不明确 | -| is_open | num | 1 | 作用尚不明确 | - -**示例:** - -查询剧集`md28220978`的基本信息 - -```shell -curl -G 'https://api.bilibili.com/pgc/review/user' \ ---data-urlencode 'media_id=28220978' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "media": { - "areas": [ - { - "id": 2, - "name": "日本" - } - ], - "cover": "http://i0.hdslb.com/bfs/bangumi/8aa0bfce050c72c6626b63d3093a88527c251026.jpg", - "horizontal_picture": "http://i0.hdslb.com/bfs/bangumi/8aa0bfce050c72c6626b63d3093a88527c251026.jpg", - "media_id": 28220978, - "new_ep": { - "id": 21278, - "index": "14", - "index_show": "全14话" - }, - "rating": { - "count": 80693, - "score": 9.9 - }, - "season_id": 1172, - "share_url": "https://www.bilibili.com/bangumi/media/md28220978", - "title": "轻音少女 第一季", - "type": 1, - "type_name": "番剧" - } - } -} -``` - -</details> - -## 获取剧集明细(web端)(ssid/epid方式) - -> https://api.bilibili.com/pgc/view/web/season - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----------|-----|--------|--------|---------------------| -| season_id | num | 番剧ssid | 必要(可选) | season_id与ep_id任选其一 | -| ep_id | num | 剧集epid | 必要(可选) | season_id与ep_id任选其一 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-------------------| -| code | num | 返回值 | 0:成功<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| result | obj | 信息本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------------|-------|----------------|----------------------------------------------------------| -| activity | obj | 参与的活动 | | -| actors | str | | | -| alias | str | 空 | 作用尚不明确 | -| areas | array | | | -| bkg_cover | str | 网页背景图片url | 无则为空 | -| cover | str | 剧集封面图片url | | -| delivery_fragment_video | bool | | | -| enable_vt | bool | | | -| episodes | array | 正片剧集列表 | | -| evaluate | str | 简介 | | -| freya | obj | | | -| hide_ep_vv_vt_dm | num | | | -| icon_font | obj | | | -| jp_title | str | 空 | 作用尚不明确 | -| link | str | 简介页面url | | -| media_id | num | 剧集mdid | | -| mode | num | 2 | 作用尚不明确 | -| multi_view_info | obj | | | -| new_ep | obj | 更新信息 | | -| payment | obj | 会员&付费信息 | 若无相关内容则无此项 | -| payPack | obj | 付费包信息 | 目前只有霹雳布袋戏付费套餐一种 | -| play_strategy | obj | | | -| positive | obj | | | -| publish | obj | 发布信息 | | -| rating | obj | 评分信息 | 若无相关内容则无此项 | -| record | str | 备案号 | 无则为空 | -| rights | obj | 属性标志信息 | | -| season_id | num | 番剧ssid | | -| season_title | str | 剧集标题 | | -| seasons | array | 同系列所有季信息 | | -| section | array | 花絮、PV、番外等非正片内容 | 若无相关内容则无此项 | -| section_bottom_desc | str | | | -| series | obj | 系列信息 | | -| share_copy | str | 《{标题}》+{备注} | | -| share_sub_title | str | 备注 | | -| share_url | str | 番剧播放页面url | | -| show | obj | 网页全屏标志 | | -| show_season_type | num | 1,2,3,4,5,7 | | -| square_cover | str | 方形封面图片url | | -| staff | str | 制作人员信息 | | -| stat | obj | 状态数 | | -| status | num | | | -| styles | array | 标签 | | -| subtitle | str | 剧集副标题 | | -| title | str | 剧集标题 | | -| total | num | 总计正片集数 | 未完结:大多为-1<br />已完结:正整数 | -| type | num | 剧集类型 | 1:番剧<br />2:电影<br />3:纪录片<br />4:国创<br />5:电视剧<br />7:综艺 | -| up_info | obj | UP主信息 | 若无相关内容则无此项 | -| user_status | obj | | | - -`result`中的`activity`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-------|------|--------| -| cover | str | | | -| head_bg_url | str | 空 | 作用尚不明确 | -| id | num | 活动id | | -| link | str | | | -| pendants | array | | | -| title | str | 活动标题 | | - -`activity`中的`pendants`数组 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| image | str | | | -| name | str | | | -| pid | num | | | - -`result`中的`areas`数组 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|--------|-------------------| -| id | num | 所属地区编号 | [剧集地区一览](#剧集地区一览) | -| name | str | 所属地区名称 | | - -`result`中的`episodes`数组: - -| 项 | 类型 | 内容 | 备注 | -|----|-----|-----------|--------| -| 0 | obj | 正片第1集 | | -| n | obj | 正片第(n+1)集 | 按照顺序排列 | -| …… | obj | | | - -`episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------------|-------|---------------------|----------------| -| aid | num | 单集稿件avid | | -| archive_attr | num | | | -| badge | str | 标签文字 | 例如`会员`、`限免`等 | -| badge_info | obj | | | -| badge_type | num | | | -| bvid | str | 单集稿件bvid | | -| cid | num | 视频cid | | -| cover | str | 单集封面url | | -| dimension | obj | 分辨率信息 | | -| duration | num | | | -| enable_vt | bool | | | -| ep_id | num | | | -| from | str | | | -| id | num | 单集epid | | -| interaction | obj | | | -| is_sub_view | bool | | | -| is_view_hide | bool | | | -| link | str | 单集网页url | | -| long_title | str | 单集完整标题 | | -| multi_view_eps | array | | | -| pub_time | num | 发布时间 | 时间戳 | -| pv | num | 0 | 作用尚不明确 | -| release_date | str | 空 | 作用尚不明确 | -| rights | obj | | | -| section_type | num | | | -| share_copy | str | 《{标题}》+第n话+{单集完整标题} | | -| share_url | str | 单集网页url | | -| short_link | str | 单集网页url短链接 | | -| show_title | str | | | -| showDrmLoginDialog | bool | | | -| skip | obj | | | -| status | num | | | -| subtitle | str | 单集副标题 | 观看次数文字 | -| title | str | 单集标题 | | -| toast_title | str | | | -| vid | str | 单集vid | vupload_+{cid} | - -`episodes`中的`badge_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|----|----| -| bg_color | str | | | -| bg_color_night | str | | | -| text | str | | | - -`episodes`中的`dimension`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------|-----|----|----| -| height | num | | | -| rotate | num | | | -| width | num | | | - -`episodes`中的`interaction`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|------|----|----| -| graph_version | num | | | -| interaction | bool | | | - -`episodes`中的`multi_view_eps`数组 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| ep_id | num | | | - -`episodes`中的`rights`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|----|----| -| allow_demand | num | | | -| allow_dm | num | | | -| allow_download | num | | | -| area_limit | num | | | - -`episodes`中的`skip`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----|-----|----|----| -| ed | obj | | | -| op | obj | | | - -`skip`对象中的`ed`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| end | num | | | -| start | num | | | - -`skip`对象中的`op`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| end | num | | | -| start | num | | | - -`result`中的`freya`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------------|-----|----|----| -| bubble_desc | str | | | -| bubble_show_cnt | num | | | -| icon_show | num | | | - -`result`中的`icon_font`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|----|----| -| name | str | | | -| text | str | | | - -`result`中的`multi_view_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------------|------|----|----| -| changing_dance | str | | | -| is_multi_view_season | bool | | | - -`result`中的`new_ep`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------|-----|----------|--------------| -| desc | str | 更新备注 | | -| id | num | 最新一话epid | | -| is_new | num | 是否最新发布 | 0:否<br />1:是 | -| title | str | 最新一话标题 | | - -`result`中的`payment`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------------|-----|---------|--------| -| discount | num | 折扣 | 100为原价 | -| pay_type | obj | 支付相关 | | -| price | str | 售价 | | -| promotion | str | 推广信息 | | -| tip | str | | | -| view_start_time | num | | | -| vip_discount | num | 大会员折扣 | | -| vip_first_promotion | str | | | -| vip_price | str | 大会员售价 | | -| vip_promotion | str | 大会员推广信息 | | - -`payment`中的`pay_type`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------------|-----|---------|----------------------| -| allow_discount | num | 启用折扣 | 0:否<br />1:是<br />下同 | -| allow_pack | num | | | -| allow_ticket | num | 启用票券 | | -| allow_time_limit | num | 启用时间限制 | | -| allow_vip_discount | num | 启用大会员折扣 | | -| forbid_bb | num | 禁止使用B币券 | | - -`result`中的`payPack`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------------------|-----|----|----| -| id | num | | | -| not_paid_text_for_app | str | | | -| paid_text_for_app | str | | | -| pay_pack_url | str | | | -| status | num | | | -| title | str | | | - -`result`中的`play_strategy`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------------|-------|----|----| -| strategies | array | | | - -`result`中的`positive`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| id | num | | | -| title | str | | | - -`result`中的`publish`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|----------|----------------------| -| is_finish | num | 完结状态 | 0:未完结<br />1:已完结 | -| is_started | num | 是否发布 | 0:未发布<br />1:已发布 | -| pub_time | str | 发布时间 | YYYY-MM-DDD hh:mm:ss | -| pub_time_show | str | 发布时间文字介绍 | | -| unknow_pub_date | num | 0 | 作用尚不明确 | -| weekday | num | 0 | 作用尚不明确 | - -`result`中的`rating`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-----|--------|----| -| count | num | 总计评分人数 | | -| score | num | 评分 | | - -`result`中的`rights`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|-----|------|---------------------------| -| allow_bp | num | | | -| allow_bp_rank | num | | | -| allow_download | num | | | -| allow_review | num | | | -| area_limit | num | | | -| ban_area_show | num | | | -| can_watch | num | | | -| copyright | str | 版权标志 | bilibili:授权<br />dujia:独家 | -| forbid_pre | num | | | -| freya_white | num | | | -| is_cover_show | num | | | -| is_preview | num | | | -| only_vip_download | num | | | -| resource | str | | | -| watch_platform | num | | | - -`result`中的`seasons`数组: - -| 项 | 类型 | 内容 | 备注 | -|----|-----|------------|--------| -| 0 | obj | 同系列剧集1 | | -| n | obj | 同系列剧集(n+1) | 按照顺序排列 | -| …… | obj | | | - -`seasons`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------------|------|----|----| -| badge | str | | | -| badge_info | obj | | | -| badge_type | num | | | -| cover | str | | | -| enable_vt | bool | | | -| horizontal_cover_1610 | str | | | -| horizontal_cover_169 | str | | | -| icon_font | obj | | | -| media_id | num | | | -| new_ep | obj | | | -| season_id | num | | | -| season_title | str | | | -| season_type | num | | | -| stat | obj | | | - -`seasons`中的`badge_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|----|----| -| bg_color | str | | | -| bg_color_night | str | | | -| text | str | | | - -`seasons`中的`icon_font`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|----|----| -| name | str | | | -| text | str | | | - -`seasons`中的`new_ep`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------------|-----|----|----| -| cover | str | | | -| id | num | | | -| index_show | str | | | - -`seasons`中的`stat`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|-----|----|----| -| favorites | num | | | -| series_follow | num | | | -| views | num | | | -| vt | num | | | - -`result`中的`section`数组: - -| 项 | 类型 | 内容 | 备注 | -|----|-----|------------|--------| -| 0 | obj | 其他内容块1 | | -| n | obj | 其他内容块(n+1) | 按照顺序排列 | -| …… | obj | | | - -`section`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-------|-------|----| -| attr | num | | | -| episode_id | num | 0 | | -| episode_ids | array | | | -| episodes | array | 板块内容 | | -| id | num | 板块id? | | -| report | obj | | | -| title | str | 板块标题 | | -| type | num | ? | | -| type2 | num | | | - -`episodes`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------------------|------|----|----| -| aid | num | | | -| archive_attr | num | | | -| badge | str | | | -| badge_info | obj | | | -| badge_type | num | | | -| bvid | str | | | -| cid | num | | | -| cover | str | | | -| dimension | obj | | | -| duration | num | | | -| enable_vt | bool | | | -| ep_id | num | | | -| from | str | | | -| icon_font | obj | | | -| id | num | | | -| interaction | obj | | | -| is_view_hide | bool | | | -| link | str | | | -| link_type | str | | | -| long_title | str | | | -| pub_time | num | | | -| pv | num | | | -| release_date | str | | | -| report | obj | | | -| rights | obj | | | -| section_type | num | | | -| share_copy | str | | | -| share_url | str | | | -| short_link | str | | | -| show_title | str | | | -| showDrmLoginDialog | bool | | | -| skip | obj | | | -| stat | obj | | | -| stat_for_unity | obj | | | -| status | num | | | -| subtitle | str | | | -| title | str | | | -| toast_title | str | | | -| up_info | obj | | | -| vid | str | | | - -`badge_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|----|----| -| bg_color | str | | | -| bg_color_night | str | | | -| text | str | | | - -`dimension`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------|-----|----|----| -| height | num | | | -| rotate | num | | | -| width | num | | | - -`icon_font`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|----|----| -| name | str | | | -| text | str | | | - -`interaction`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|------|----|----| -| graph_version | num | | | -| interaction | bool | | | - -`report`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------------|-----|----|----| -| aid | str | | | -| ep_title | str | | | -| position | str | | | -| season_id | str | | | -| season_type | str | | | -| section_id | str | | | -| section_type | str | | | - -`rights`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|----|----| -| allow_demand | num | | | -| allow_dm | num | | | -| allow_download | num | | | -| area_limit | num | | | - -`skip`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----|-----|----|----| -| ed | obj | | | -| op | obj | | | - -`ed`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| end | num | | | -| start | num | | | - -`op`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| end | num | | | -| start | num | | | - -`stat_for_unity`对象 - -### 根对象 -> `result`对象 -> `section`数组中的对象 -> `episodes`数组中的对象 -> `stat_for_unity`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|----|----| -| coin | num | | | -| danmaku | obj | | | -| likes | num | | | -| reply | num | | | -| vt | obj | | | - -`danmaku`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|----|----| -| icon | str | | | -| pure_text | str | | | -| text | str | | | -| value | num | | | - -`vt`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|----|----| -| icon | str | | | -| pure_text | str | | | -| text | str | | | -| value | num | | | - -`stat`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------|-----|----|----| -| coin | num | | | -| danmakus | num | | | -| likes | num | | | -| play | num | | | -| reply | num | | | -| vt | num | | | - -`up_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------------|-----|----|----| -| avatar | str | | | -| follower | num | | | -| is_follow | num | | | -| mid | num | | | -| uname | str | | | -| verify_type | num | | | -| verify_type2 | num | | | - -`report`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------------|-----|----|----| -| season_id | str | | | -| season_type | str | | | -| sec_title | str | | | -| section_id | str | | | -| section_type | str | | | - - -`result`中的`series`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|------|----| -| display_type | num | | | -| series_id | num | 系列id | | -| series_title | str | 系列名 | | - -`result`中的`show`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|------|----------------| -| wide_screen | num | 是否全屏 | 0:正常<br />1:全屏 | - -`result`中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|-----|----| -| coins | num | 投币数 | | -| danmakus | num | 弹幕数 | | -| favorite | num | | | -| favorites | num | 收藏数 | | -| follow_text | str | | | -| hot | num | | | -| likes | num | 点赞数 | | -| reply | num | 评论数 | | -| share | num | 分享数 | | -| views | num | 播放数 | | -| vt | num | | | - -`result`中的`up_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------------|-----|---------|----| -| avatar | str | 头像图片url | | -| avatar_subscript_url | str | | | -| follower | num | 粉丝数 | | -| is_follow | num | 0 | | -| mid | num | UP主mid | | -| nickname_color | str | | | -| pendant | obj | | | -| theme_type | num | 0 | | -| uname | str | UP主昵称 | | -| verify_type | num | | | -| vip_label | obj | | | -| vip_status | num | | | -| vip_type | num | | | - -`up_info`中的`pendant`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-----|----|----| -| image | str | | | -| name | str | | | -| pid | num | | | - -`up_info`中的`vip_label`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------------|-----|----|----| -| bg_color | str | | | -| bg_style | num | | | -| border_color | str | | | -| text | str | | | -| text_color | str | | | - -`result`中的`user_status`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|-----|----|----| -| area_limit | num | | | -| ban_area_show | num | | | -| follow | num | | | -| follow_status | num | | | -| login | num | | | -| pay | num | | | -| pay_pack_paid | num | | | -| sponsor | num | | | - -# 获取剧集分集信息 - -> https://api.bilibili.com/pgc/web/season/section - -*请求方式:GET* - -鉴权方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----------|-----|--------|-----|-----| -| season_id | str | 剧集ssid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-------------------| -| code | num | 返回值 | 0:成功<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| result | obj | 信息本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-------|--------|-----| -| main_section | obj | 正片信息 | | -| section | array | 花絮、PV等 | | - -`result`中的`main_section`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-------|------------------------------|-----| -| episodes | array | 分集信息 | | -| id | num | 分组id | | -| type | num | 0:正片<br/>1:PV&其他<br/>2:OP&ED | | -| title | str | | | - -`episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|----------|-----| -| aid | num | 视频av号 | | -| badge | str | | | -| badge_info | obj | | | -| badge_type | num | 0 | | -| cid | num | 分集cid | | -| cover | str | 分集封面 | | -| from | str | bangumi | | -| id | num | 分集epId | | -| is_premiere | num | 0 | | -| long_title | str | 长标题 | | -| share_url | str | 分集播放页url | | -| status | num | 2 | | -| title | str | 短标题 | | -| vid | str | | | - -`badge_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------|-----|-----|-----| -| bg_color | str | | | -| bg_color_night | str | | | -| text | str | | | - -`section`数组中的对象: - -**同`main_section`对象** - -**示例:** - -```shell -curl -L -X GET 'https://api.bilibili.com/pgc/web/season/section?season_id=42290' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "main_section": { - "episodes": [ - { - "aid": 300876247, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 772096113, - "cover": "http://i0.hdslb.com/bfs/archive/c09aec64c1787e287b0187498a4443177cc2112c.jpg", - "from": "bangumi", - "id": 606591, - "is_premiere": 0, - "long_title": "瞒天过海!罪犯新选组", - "share_url": "https://www.bilibili.com/bangumi/play/ep606591", - "status": 2, - "title": "1", - "vid": "" - }, - { - "aid": 555940678, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 779868818, - "cover": "http://i0.hdslb.com/bfs/archive/52ccef75fc179c7f8a4f2ff989a1249c78f564e0.jpg", - "from": "bangumi", - "id": 606592, - "is_premiere": 0, - "long_title": "光芒四射!遗物日本刀", - "share_url": "https://www.bilibili.com/bangumi/play/ep606592", - "status": 2, - "title": "2", - "vid": "" - }, - { - "aid": 216208730, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 779450100, - "cover": "http://i0.hdslb.com/bfs/archive/7eee64ff758fb426b6cd16bc7d525f4de98fd4dc.jpg", - "from": "bangumi", - "id": 606596, - "is_premiere": 0, - "long_title": "乔装打扮!潜入花街", - "share_url": "https://www.bilibili.com/bangumi/play/ep606596", - "status": 2, - "title": "3", - "vid": "" - }, - { - "aid": 386385026, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 786667756, - "cover": "http://i0.hdslb.com/bfs/archive/6851be597e1fa496a8b1486000e83654c2fac45c.jpg", - "from": "bangumi", - "id": 606597, - "is_premiere": 0, - "long_title": "一探究竟!神秘妖刀", - "share_url": "https://www.bilibili.com/bangumi/play/ep606597", - "status": 2, - "title": "4", - "vid": "" - }, - { - "aid": 729094525, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 793386614, - "cover": "http://i0.hdslb.com/bfs/archive/5dfa30d48188b26c616a05745132a59f6823dade.jpg", - "from": "bangumi", - "id": 606598, - "is_premiere": 0, - "long_title": "展现无遗!和尚与医生的决心", - "share_url": "https://www.bilibili.com/bangumi/play/ep606598", - "status": 2, - "title": "5", - "vid": "" - }, - { - "aid": 599314561, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 798315932, - "cover": "http://i0.hdslb.com/bfs/archive/3daae9ee434d335ff9e5a9d8244bc1e6b7ffa8d0.jpg", - "from": "bangumi", - "id": 606599, - "is_premiere": 0, - "long_title": "直捣敌巢!败德白川屋", - "share_url": "https://www.bilibili.com/bangumi/play/ep606599", - "status": 2, - "title": "6", - "vid": "" - }, - { - "aid": 259686552, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 807199844, - "cover": "http://i0.hdslb.com/bfs/archive/9ff73932c210abe64373be6f3959c2eee6c7470b.jpg", - "from": "bangumi", - "id": 606600, - "is_premiere": 0, - "long_title": "全力阻止!新选组解散", - "share_url": "https://www.bilibili.com/bangumi/play/ep606600", - "status": 2, - "title": "7", - "vid": "" - }, - { - "aid": 514942530, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 814175863, - "cover": "http://i0.hdslb.com/bfs/archive/31a19bf3af61e58f1e8c4a387779fc3272cb47a7.jpg", - "from": "bangumi", - "id": 606601, - "is_premiere": 0, - "long_title": "激烈战斗!池田屋事件", - "share_url": "https://www.bilibili.com/bangumi/play/ep606601", - "status": 2, - "title": "8", - "vid": "" - }, - { - "aid": 515024193, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 819960797, - "cover": "http://i0.hdslb.com/bfs/archive/68a0a12a74e99b6cd85cfa0fb7be70d82d8b6558.jpg", - "from": "bangumi", - "id": 606602, - "is_premiere": 0, - "long_title": "真心炸裂!人之思绪 鬼之念想", - "share_url": "https://www.bilibili.com/bangumi/play/ep606602", - "status": 2, - "title": "9", - "vid": "" - }, - { - "aid": 430293537, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 827739564, - "cover": "http://i0.hdslb.com/bfs/archive/6411f71c947ba9b011ca0fe2891334147ef1e14d.jpg", - "from": "bangumi", - "id": 606603, - "is_premiere": 0, - "long_title": "全力守护!美利坚黑船", - "share_url": "https://www.bilibili.com/bangumi/play/ep606603", - "status": 2, - "title": "10", - "vid": "" - }, - { - "aid": 858116183, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 833436271, - "cover": "http://i0.hdslb.com/bfs/archive/48736284b5cf0f3515cddb95f1c1b8658ec6c5ff.jpg", - "from": "bangumi", - "id": 606604, - "is_premiere": 0, - "long_title": "勇往直前!京都大决战", - "share_url": "https://www.bilibili.com/bangumi/play/ep606604", - "status": 2, - "title": "11", - "vid": "" - }, - { - "aid": 773279679, - "badge": "会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "会员" - }, - "badge_type": 0, - "cid": 840839493, - "cover": "http://i0.hdslb.com/bfs/archive/316f7c8a750699bf53ee44d43669fabb0271be86.jpg", - "from": "bangumi", - "id": 606605, - "is_premiere": 0, - "long_title": "替身传说!罪犯新选组", - "share_url": "https://www.bilibili.com/bangumi/play/ep606605", - "status": 13, - "title": "12", - "vid": "" - } - ], - "id": 81861, - "title": "正片", - "type": 0 - }, - "section": [ - { - "episodes": [ - { - "aid": 898153042, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 766274696, - "cover": "http://i0.hdslb.com/bfs/archive/ac27ed20081e99fc36720ef0714f81d8df2c279a.png", - "from": "bangumi", - "id": 576387, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep576387", - "status": 2, - "title": "PV", - "vid": "" - }, - { - "aid": 215937670, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 773008915, - "cover": "http://i0.hdslb.com/bfs/archive/0a6b589e9175dfee1d9699fb55c5c0677941994a.png", - "from": "bangumi", - "id": 606995, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep606995", - "status": 2, - "title": "西川贵教", - "vid": "" - }, - { - "aid": 813460609, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 773007362, - "cover": "http://i0.hdslb.com/bfs/archive/6c8f4136731c1c2f8171f5c006f79f0603d11bdf.png", - "from": "bangumi", - "id": 606998, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep606998", - "status": 2, - "title": "幕末替身声优采访", - "vid": "" - }, - { - "aid": 556287340, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 785468206, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 660464, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep660464", - "status": 2, - "title": "声优对谈 01", - "vid": "" - }, - { - "aid": 984099086, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 792637456, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 669591, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep669591", - "status": 2, - "title": "声优对谈 02", - "vid": "" - }, - { - "aid": 259364452, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 798995285, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 670446, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep670446", - "status": 2, - "title": "声优对谈 03", - "vid": "" - }, - { - "aid": 772146427, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 808201440, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 672539, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep672539", - "status": 2, - "title": "声优对谈 04", - "vid": "" - }, - { - "aid": 687381109, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 814826609, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 676133, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep676133", - "status": 2, - "title": "声优对谈 05", - "vid": "" - }, - { - "aid": 730289528, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 826951152, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 676134, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep676134", - "status": 2, - "title": "声优对谈 07", - "vid": "" - }, - { - "aid": 602813211, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 826951370, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 676135, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep676135", - "status": 2, - "title": "声优对谈 08", - "vid": "" - }, - { - "aid": 515295782, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 826951255, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 676137, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep676137", - "status": 2, - "title": "声优对谈 09", - "vid": "" - }, - { - "aid": 815269384, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 826951558, - "cover": "http://i0.hdslb.com/bfs/archive/77564ca30f1a4d3a64cfc292a7fd989c09a30027.png", - "from": "bangumi", - "id": 676138, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep676138", - "status": 2, - "title": "声优对谈 10", - "vid": "" - } - ], - "id": 82126, - "title": "PV&其他", - "type": 1 - }, - { - "episodes": [ - { - "aid": 556712105, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 794382832, - "cover": "http://i0.hdslb.com/bfs/archive/1f4ab8b9af0689900e7c486c4e676e27988091be.png", - "from": "bangumi", - "id": 670062, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep670062", - "status": 2, - "title": "NCOP", - "vid": "" - }, - { - "aid": 259129266, - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "text": "" - }, - "badge_type": 0, - "cid": 794382772, - "cover": "http://i0.hdslb.com/bfs/archive/d08738a452187a0229c3b99beaf1cb4ff868a030.png", - "from": "bangumi", - "id": 670063, - "is_premiere": 0, - "long_title": "", - "share_url": "https://www.bilibili.com/bangumi/play/ep670063", - "status": 2, - "title": "NCED", - "vid": "" - } - ], - "id": 85065, - "title": "OP&ED", - "type": 2 - } - ] - } -} -``` - -</details> diff --git a/docs/bangumi/season_index.md b/docs/bangumi/season_index.md deleted file mode 100644 index 013227d..0000000 --- a/docs/bangumi/season_index.md +++ /dev/null @@ -1,806 +0,0 @@ -# 剧集索引 - -## 获取剧集索引 - -> https://api.bilibili.com/pgc/season/index/result -> -*请求方式:GET* - -鉴权方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------------- | ---- | --------------- | -------------- | --------------------------------------------------------------------------------------- | -| season_type | num | 类别 | 必要 | 番剧:`1`   电影:`2`   纪录片:`3`<br>国创:`4`   电视剧:`5`   综艺:`7` | -| type | num | 未知作用 | 必要 | 固定为 `1` | -| page | num | 页码 | 非必要 | 默认为 `1` | -| pagesize | num | 每页项数 | 非必要 | 定义域:[1,∞),<br>超出最大项数则返回最大项数 | -| season_version | num | 类型 | 非必要 | 全部:`-1`   正片:`1`   电影:`2`   其他:`3` | -| spoken_language_type | num | 配音 | 非必要 | 全部:`-1`   原声:`1`   中文配音:`2` | -| area | str | 地区 | 非必要 | 地区代码列表 ∈N∩[1,70] 例如日本:`2` 中国:`1,6,7` [完整地区代码见表](info.md#剧集地区一览)<br>`-1`代表全部,前端页面有具体国家则可以单独请求具体国家如日本`2`,<br>将[1,70]中前端页面有的国家排除后一一列出则代表其他如`1,4,5,6,7,8...69,70` | -| is_finish | num | 状态 | 非必要 | 全部:`-1`   完结:`1`   连载:`0` | -| copyright | str | 版权 | 非必要 | 全部:`-1`   独家:`3`   其他:`1,2,4` | -| season_status | str | 付费类型 | 非必要 | 全部:`-1`   免费:`1`   付费:`2,6`   大会员:`4,6` | -| season_month | num | 季度 | 非必要 | 全部:`-1`   一月:`1`   四月:`4`   七月:`7`   十月:`10` | -| year | str | 年份 | 非必要 | 适用于`国创`和`番剧`类别<br>除了`-1`代表全部外,其他情况以左闭右开区间形式表示,<br>如`[2025,2026)`代表2025年,`[2010,2015)`代表2010-2014年,`[1990,2000)`代表90年代,`[,1980)`代表更早 | -| release_date | str | 年份 | 非必要 | 适用于`电影`,`电视剧`和`纪录片`类别<br>和year参数类似只是精确到秒级,<br>如`[2025-01-01 00:00:00,2026-01-01 00:00:00)`代表2025年,<br>`[1990-01-01 00:00:00,2000-01-01 00:00:00)`代表90年代 | -| style_id | num | 风格 | 非必要 | 全部:`-1`   特定风格则值为该风格id,如原创:`10010` | -| producer_id | num | 出品方 | 非必要 | 全部:`-1`   特定出品方则值为该出品方id,如央视:`4` | -| order | num | 排序指标 | 非必要 | 更新时间:`0`   弹幕数量:`1`   播放数量:`2`  <br>追剧人数:`3`   最高评分:`4`   开播时间:`5`   上映时间:`6` | -| sort | num | 排序方向 | 非必要 | 增序:`1`   降序:`0` 默认为降序 | -| st | num | 未知作用 | 非必要 | 值与 `season_type` 相同,合理怀疑是其缩写 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------|------|----------|--------------------------------------------| -| code | num | 返回值 | 0:成功<br>-400:请求错误<br>-404:错误 | -| message | str | 错误信息 | 默认为 success | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------|--------|------------|--------------------| -| has_next | num | 是否有下一页 | 1:有<br>0:无 | -| list | array | 剧集列表 | | -| num | num | 当前页码 | | -| size | num | 每页数量 | | -| total | num | 总剧集数 | | - -`data` 中的 `list` 数组: - -| 项 | 类型 | 内容 | 备注 | -|------|------|-----------------|------| -| 0 | obj | 剧集信息 1 | | -| n | obj | 剧集信息 (n+1) | | -| …… | obj | …… | | - -`list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------|--------|----------------|----------------------------------------------------------------------| -| badge | str | 角标文本 | 例如 `大会员`、`独家` 等 | -| badge_info | obj | 角标信息 | | -| badge_type | num | 角标类型 | | -| cover | str | 封面图片 URL | | -| first_ep | obj | 第一话信息 | | -| index_show | str | 剧集进度显示 | 例如 `全48话` | -| is_finish | num | 是否完结 | `1`:完结<br>`0`:未完结 | -| link | str | 剧集播放页链接 | | -| media_id | num | 剧集 md id | | -| order | str | 排序显示文本 | 例如 `9.9分` | -| order_type | str | 排序类型 | | -| score | str | 评分 | | -| season_id | num | 剧集 ss id | | -| season_status | num | 剧集状态 | 普通剧集为 `2`,大会员或独家等有角标的剧集为 `13` | -| season_type | num | 剧集类别 | 值同参数中的 `season_type` | -| subTitle | str | 副标题 | | -| title | str | 标题 | | -| title_icon | str | 标题图标 URL | | - -`list` 项中的 `badge_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|------|-------------|----------| -| bg_color | str | 角标背景色 | 日间模式 | -| bg_color_night | str | 角标背景色 | 夜间模式 | -| text | str | 角标文本 | | - -`list` 项中的 `first_ep` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|------|----------------|------| -| cover | str | 第一话封面 URL | | -| ep_id | num | 第一话 ep id | | - -**示例:** - -查询番剧类别索引按最高评分降序排序 - -```shell -curl -G 'https://api.bilibili.com/pgc/season/index/result' \ ---data-urlencode 'type=1' \ ---data-urlencode 'season_type=1' \ ---data-urlencode 'order=4' \ ---data-urlencode 'sort=0' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "has_next": 1, - "list": [ - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/dc1d94ded94ae470db35d76edeb106f606e27e96.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/0a8ca0a60401b16838c8fae3d09223ead44f445a.png", - "ep_id": 2197678 - }, - "index_show": "全48话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss113090", - "media_id": 27736357, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 113090, - "season_status": 13, - "season_type": 1, - "subTitle": "平成刑侦风假面骑士", - "title": "假面骑士驰骑", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/834bdb5d36c401179b9e91fdc1de520a6664c2a7.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/ba36c397ede8ba668cc726c34e0aaf5c0195958c.jpg", - "ep_id": 1404783 - }, - "index_show": "全24话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss80512", - "media_id": 24449643, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 80512, - "season_status": 13, - "season_type": 1, - "subTitle": "穿越百夜,仰望千空", - "title": "Dr.STONE 石纪元 (第四季)", - "title_icon": "" - }, - { - "badge": "独家", - "badge_info": { - "bg_color": "#00C0FF", - "bg_color_night": "#0B91BE", - "text": "独家" - }, - "badge_type": 1, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/dcd6e746842fdb988775c8b5f8217ad19b6d4de2.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/400927077a6718848bd44de634bf09a3ad029d22.jpg", - "ep_id": 1938328 - }, - "index_show": "全12话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss102891", - "media_id": 26714035, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 102891, - "season_status": 13, - "season_type": 1, - "subTitle": "可燃乌龙茶又回来了", - "title": "碧蓝之海 第二季", - "title_icon": "" - }, - { - "badge": "独家", - "badge_info": { - "bg_color": "#00C0FF", - "bg_color_night": "#0B91BE", - "text": "独家" - }, - "badge_type": 1, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/c72d6ee8b3cba39355af14bebd4857935b4fb083.png", - "first_ep": { - "cover": "https://i0.hdslb.com/bfs/bangumi/image/f9c6876d58c7dc77f04f9780d51fcac08863f9fb.png", - "ep_id": 1655818 - }, - "index_show": "更新至第13话", - "is_finish": 0, - "link": "https://www.bilibili.com/bangumi/play/ss91812", - "media_id": 25581526, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 91812, - "season_status": 13, - "season_type": 1, - "subTitle": "一马当先,万马无光", - "title": "赛马娘 芦毛灰姑娘", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "http://i0.hdslb.com/bfs/bangumi/image/087b862b772ee4e644478a36c757a26db476193d.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/bangumi/1e47fe925cb543c09250a142c31c8e42ab4bcbbd.jpg", - "ep_id": 393434 - }, - "index_show": "全200话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss38157", - "media_id": 28233839, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 38157, - "season_status": 13, - "season_type": 1, - "subTitle": "最无厘头的热血动画", - "title": "银魂", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/f3ebb500b701a387f5abde67516c5c96bbd2faff.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/6f20908042a02bcbb4ab1e0e5f36c06cfb4eb781.png", - "ep_id": 779775 - }, - "index_show": "全28话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss46089", - "media_id": 21087073, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 46089, - "season_status": 13, - "season_type": 1, - "subTitle": "花海盛开,故人归来", - "title": "葬送的芙莉莲", - "title_icon": "" - }, - { - "badge": "独家", - "badge_info": { - "bg_color": "#00C0FF", - "bg_color_night": "#0B91BE", - "text": "独家" - }, - "badge_type": 1, - "cover": "http://i0.hdslb.com/bfs/bangumi/image/f6709b76e88f50aa132d1e09e2d8de9663a09b3e.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/bangumi/69c9e8b5548356e04f8a52a5a7e270fc1786123d.jpg", - "ep_id": 293001 - }, - "index_show": "全24话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss4213", - "media_id": 28223483, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 4213, - "season_status": 13, - "season_type": 1, - "subTitle": "真是high到不行", - "title": "JOJO的奇妙冒险 星尘远征军 埃及篇", - "title_icon": "" - }, - { - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "" - }, - "badge_type": 0, - "cover": "http://i0.hdslb.com/bfs/bangumi/065926cbda8f464a31293758054620cca15e5589.jpg", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/315d88aa2b1e723089b29ddc2febb5b937ef68c9.jpg", - "ep_id": 249469 - }, - "index_show": "全55话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss357", - "media_id": 132112, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 357, - "season_status": 2, - "season_type": 1, - "subTitle": "童年经典,百看不厌", - "title": "猫和老鼠 旧版", - "title_icon": "" - }, - { - "badge": "", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "" - }, - "badge_type": 0, - "cover": "http://i0.hdslb.com/bfs/bangumi/e46cc26d95a6b09541a8bda484f041eebb474c1a.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/bangumi/e15c1305e4d54ca1a92f44e0953eee5d6006397e.jpg", - "ep_id": 247270 - }, - "index_show": "全203话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss1376", - "media_id": 1376, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 1376, - "season_status": 2, - "season_type": 1, - "subTitle": "我的老师是婴儿", - "title": "家庭教师HITMAN REBORN!", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "http://i0.hdslb.com/bfs/bangumi/image/d432ca132f5b8e8d72257704817f270595f92148.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/c0fa966ef05e15a52625a764b8c829b9a204c984.jpg", - "ep_id": 396924 - }, - "index_show": "全52话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss38385", - "media_id": 28234069, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 38385, - "season_status": 13, - "season_type": 1, - "subTitle": "那一年,我变为了光", - "title": "迪迦奥特曼(中配)", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "http://i0.hdslb.com/bfs/bangumi/image/00e9bc51f9f3677f88dc9cea41fbf430ee4eff7a.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/adc9c65cd4b224da7d3c8a70593cf3b4ee0f4906.png", - "ep_id": 397306 - }, - "index_show": "全64话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss38158", - "media_id": 28233840, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 38158, - "season_status": 13, - "season_type": 1, - "subTitle": "最无厘头的热血动画", - "title": "银魂 第二季", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/60a1806c76d5816ddabf80ab5641c1a2bb112117.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/18ead60d3895843e4476bc8459a8cada1e55fba1.png", - "ep_id": 2081361 - }, - "index_show": "全13话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss109360", - "media_id": 27366597, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 109360, - "season_status": 13, - "season_type": 1, - "subTitle": "用怪兽打败怪兽", - "title": "奥特银河 大怪兽之战 无尽的圣战", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/8eb3d284a1109218ab6c61768d18942011b4a101.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/6912de2f07dd6223b1d321b3fabfc7ce031f8ba1.png", - "ep_id": 2081328 - }, - "index_show": "全13话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss109321", - "media_id": 27362342, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 109321, - "season_status": 13, - "season_type": 1, - "subTitle": "用怪兽打败怪兽", - "title": "奥特银河 大怪兽之战", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/c4bc29a81716afdcaa4e859176e889366a554021.png", - "first_ep": { - "cover": "https://i0.hdslb.com/bfs/bangumi/image/a5c64d1762845307cf8bb5de00327eaf7969d773.png", - "ep_id": 1718028 - }, - "index_show": "全1话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss99364?theme=movie", - "media_id": 26339285, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 99364, - "season_status": 13, - "season_type": 1, - "subTitle": "日剧感强的假面骑士", - "title": "假面骑士圣刃 深罪三重奏", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/f72fac0118e212e577ee4a3a0b0b0e3021c90e58.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/7b9294cbed2bd10e880a449923968d60762ae4e0.png", - "ep_id": 1692216 - }, - "index_show": "全13话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss98694", - "media_id": 26271690, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 98694, - "season_status": 13, - "season_type": 1, - "subTitle": "少年获得神奇手表", - "title": "少年骇客 第一季 中文配音", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/00983f73ba7043f14f8a473051e8ccdf502b4466.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/d49a210847788bb9b56ccdf7d117f67377470139.jpg", - "ep_id": 1670641 - }, - "index_show": "全26话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss97528", - "media_id": 26154494, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 97528, - "season_status": 13, - "season_type": 1, - "subTitle": "快看!是彩虹小马!", - "title": "小马宝莉 友谊的魔法 第一季 中文配音", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/f0aa6018ab3d68b981a874a2ffc2881a8eb1d3a9.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/8037892942512985339b60cb022a268596561eeb.png", - "ep_id": 1568817 - }, - "index_show": "全12话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss91765", - "media_id": 25576803, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 91765, - "season_status": 13, - "season_type": 1, - "subTitle": "天才变谐星?!", - "title": "失忆投捕", - "title_icon": "" - }, - { - "badge": "独家", - "badge_info": { - "bg_color": "#00C0FF", - "bg_color_night": "#0B91BE", - "text": "独家" - }, - "badge_type": 1, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/56af151182c0b499b37e59b582d756d7bae6bc9d.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/ea0fd1b78b85f5fd4242643eeec77e965c651aed.png", - "ep_id": 1518097 - }, - "index_show": "全1话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss91516", - "media_id": 25551928, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 91516, - "season_status": 13, - "season_type": 1, - "subTitle": "主打一个不滑滑板", - "title": "无限滑板 特别篇", - "title_icon": "" - }, - { - "badge": "独家", - "badge_info": { - "bg_color": "#00C0FF", - "bg_color_night": "#0B91BE", - "text": "独家" - }, - "badge_type": 1, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/2f5946880c07914d1cccd112702884f232b647e0.png", - "first_ep": { - "cover": "https://i0.hdslb.com/bfs/bangumi/image/e38897af6ec62b387918c5966d1fa60f27affff5.png", - "ep_id": 1524613 - }, - "index_show": "全12话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss90684", - "media_id": 25467691, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 90684, - "season_status": 13, - "season_type": 1, - "subTitle": "让AI顺应你的心", - "title": "末日后酒店", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/d2c1d3d379d385b2c6abcffd48a55a93deb6889d.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/cf4aca7382f42d01c3d2b10f3c8a0dcc9fd011a1.jpg", - "ep_id": 1404755 - }, - "index_show": "全13话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss76133", - "media_id": 24006597, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 76133, - "season_status": 13, - "season_type": 1, - "subTitle": "教练,我想学滑冰!", - "title": "金牌得主", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/6b431f3e7aef2fd476a11a59449096f20e5c34a4.jpg", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/57d3f50996c97c804ec03dbd769b2feee9ae6f3f.png", - "ep_id": 1113923 - }, - "index_show": "全12话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss48811", - "media_id": 23053814, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 48811, - "season_status": 13, - "season_type": 1, - "subTitle": "治愈之旅的延续", - "title": "夏目友人帐 第七季", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/6e9309a647368c4afabbfb23537f37e7b311a014.png", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/847348eeaec3e4617eaffd102a402409b1905106.png", - "ep_id": 835243 - }, - "index_show": "全40话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss48643", - "media_id": 22923892, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 48643, - "season_status": 13, - "season_type": 1, - "subTitle": "小羊肖恩拯救不开心", - "title": "小羊肖恩 第一季", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/93c420e293be6135c7b3474394239fce339bfc99.jpg", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/33d907c4af25805ea283aa3bdd1223f95653acad.png", - "ep_id": 812175 - }, - "index_show": "全50话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss47245", - "media_id": 21195727, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 47245, - "season_status": 13, - "season_type": 1, - "subTitle": "本大爷要支配世界!", - "title": "虫王战队超王者", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/67f7082099cf201a50a979a5788490c9b6989931.jpg", - "first_ep": { - "cover": "http://i0.hdslb.com/bfs/archive/df4429a10a9a113a9eac97aec1fd63d05ba475ad.png", - "ep_id": 771376 - }, - "index_show": "全272话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss45840", - "media_id": 20342554, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 45840, - "season_status": 13, - "season_type": 1, - "subTitle": "活泼又聪明的蓝精灵", - "title": "蓝精灵 中文配音", - "title_icon": "" - }, - { - "badge": "大会员", - "badge_info": { - "bg_color": "#FB7299", - "bg_color_night": "#D44E7D", - "text": "大会员" - }, - "badge_type": 0, - "cover": "https://i0.hdslb.com/bfs/bangumi/image/05b90f3e078e2f67a92df5cbf150bdd85d9f824b.jpg", - "first_ep": { - "cover": "https://i0.hdslb.com/bfs/bangumi/image/9e267f05ae866de3c368317983e5702cf46cbd72.jpg", - "ep_id": 744262 - }, - "index_show": "全52话", - "is_finish": 1, - "link": "https://www.bilibili.com/bangumi/play/ss45014", - "media_id": 20222550, - "order": "9.9分", - "order_type": "4", - "score": "9.9", - "season_id": 45014, - "season_status": 13, - "season_type": 1, - "subTitle": "如何在游戏中学习", - "title": "布鲁伊 第三季", - "title_icon": "" - } - ], - "num": 1, - "size": 25, - "total": 4147 - }, - "message": "success" -} -``` - -</details> diff --git a/docs/bangumi/timeline.md b/docs/bangumi/timeline.md deleted file mode 100644 index 6742cb7..0000000 --- a/docs/bangumi/timeline.md +++ /dev/null @@ -1,799 +0,0 @@ -# 番剧或影视时间线 - -## 获取番剧或影视时间线 - -> https://api.bilibili.com/pgc/web/timeline -*请求方式:GET* - -鉴权方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------ | ------ | ----------------------------- | -| types | str | 类别 | 必要 | 1:`番剧`<br />3:`电影`<br />4:`国创` | -| before | num | 开始于前几日 | 必要 | ∈N∩[0,7] | -| after | num | 结束于后几日 | 必要 | ∈N∩[0,7] | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| result | array | 信息本体 | | - -`result`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------------------- | ---- | -| 0 | obj | `before`天前信息 | | -| n | obj | 从`before`天前开始第n天信息 | | -| …… | obj | …… | | - -`result`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------------- | ----------------- | -| date | str | 当日日期 | | -| date_ts | num | 当日日期时间戳 | | -| day_of_week | num | 一周中第几天 | ∈N∩[1,7] | -| episodes | array | 剧集列表 | | -| is_today | num | 是否今日 | | - -`result`数组中的对象中的`episodes`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 剧集1 | | -| n | obj | 剧集(n+1) | | -| …… | obj | …… | | - -`episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | --------------- | -| cover | str | 封面图url | | -| delay | num | 是否推迟 | | -| delay_id | num | 推迟一话epid | | -| delay_index | str | 推迟一话名称 | | -| delay_reason | str | 推迟原因 | | -| ep_cover | str | 最新一话图url | | -| episode_id | num | 最新一话的epid | | -| pub_index | str | 最新一话名称 | | -| pub_time | str | 发布时间 | | -| pub_ts | num | 发布时间戳 | | -| published | num | 是否已发布 | | -| follows | str | - | | -| plays | str | - | | -| season_id | num | 剧集ssid | | -| square_cover | str | 缩略图url | | -| title | str | 剧集标题 | | - -**示例:** - -查询从`3`天前到`7`天后的`番剧`时间轴 - -```shell -curl -G 'https://api.bilibili.com/pgc/web/timeline' \ ---data-urlencode 'types=1' \ ---data-urlencode 'before=3' \ ---data-urlencode 'after=7' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": [ - { - "date": "5-15", - "date_ts": 1652544000, - "day_of_week": 7, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/9918f6e67c26d6bd1ddad8dab70bcc7af3bfae9b.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/0067a09911e2fa252a3ef5126d8dc5392189dd8a.jpg", - "episode_id": 508403, - "follows": "-", - "plays": "-", - "pub_index": "第3话", - "pub_time": "01:30", - "pub_ts": 1652549400, - "published": 1, - "season_id": 41416, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/926fd09277605204c2f7c94b322de3156ef9da52.png", - "title": "式守同学不只可爱而已" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/3a9815ca239735c51fc7daf2399c3721bbe00160.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/56e8d4b13dac855c51060dcda286be049fde4a46.png", - "episode_id": 466766, - "follows": "-", - "plays": "-", - "pub_index": "第6话", - "pub_time": "11:00", - "pub_ts": 1652583600, - "published": 1, - "season_id": 41005, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/b3dd92da1ca35758f329fa5aa649991b118a98ca.png", - "title": "鬼灭之刃 无限列车篇 中配版" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/71d54cae830d32a5af776dcc46632146fbdba868.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/00c1dff8457183671f0402e0a2826313a1994a9b.jpg", - "episode_id": 480434, - "follows": "-", - "plays": "-", - "pub_index": "第240话", - "pub_time": "17:30", - "pub_ts": 1652607000, - "published": 1, - "season_id": 5978, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/3121473d5dd03a9bcccb8490034207e724e731b3.jpg", - "title": "博人传 火影忍者新时代" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/91e75030be41d67b9f19b96bb512b0c98ae781bd.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/e701f39cef52e6b0737e3463faf7cb0cee61e935.jpg", - "episode_id": 510647, - "follows": "-", - "plays": "-", - "pub_index": "第4话", - "pub_time": "20:00", - "pub_ts": 1652616000, - "published": 1, - "season_id": 41557, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4329384cba4ab0390eae1a84a719e4649bf61cfb.png", - "title": "这个治疗有点烦" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/c9723d8c77d881a8debba2852d580e97826b43d0.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/2a01ab590fd8b1331096b94cc6fc09dbdad1bbec.png", - "episode_id": 478918, - "follows": "-", - "plays": "-", - "pub_index": "第7话", - "pub_time": "21:00", - "pub_ts": 1652619600, - "published": 1, - "season_id": 41591, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1ffa24e100583c3aa96812dea680943291c5c384.jpg", - "title": "恋爱游戏世界对路人角色很不友好" - } - ], - "is_today": 0 - }, - { - "date": "5-16", - "date_ts": 1652630400, - "day_of_week": 1, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/e468c854628b97b5373baaf4c43e1346a9806baa.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/219161297558531d2475da73e863dc237e83baa1.png", - "episode_id": 511342, - "follows": "-", - "plays": "-", - "pub_index": "第1话", - "pub_time": "20:00", - "pub_ts": 1652702400, - "published": 1, - "season_id": 41419, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/75a291010c128ce2de17267fd2a4842d19898236.png", - "title": "魔法使黎明期" - } - ], - "is_today": 0 - }, - { - "date": "5-17", - "date_ts": 1652716800, - "day_of_week": 2, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/bf37e15c52889a7a9dca16346354bb7c6663c899.png", - "episode_id": 510132, - "follows": "-", - "plays": "-", - "pub_index": "第146话", - "pub_time": "18:00", - "pub_ts": 1652781600, - "published": 1, - "season_id": 23841, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg", - "title": "美妙☆频道" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/9eef1df9ab157be52d2c4d70d3500442f00cafc3.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/archive/d9831c3170bcbba38edc2204ee5059f583823913.png", - "episode_id": 509043, - "follows": "-", - "plays": "-", - "pub_index": "第11话", - "pub_time": "18:00", - "pub_ts": 1652781600, - "published": 1, - "season_id": 38950, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13fd7c96659a20c61409e155a2a913a59348d122.png", - "title": "魔法纪录 魔法少女小圆外传 第二季" - } - ], - "is_today": 0 - }, - { - "date": "5-18", - "date_ts": 1652803200, - "day_of_week": 3, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/fba0229f1a6eec6ed692b7ae91c634d5cbde0727.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/0ebefe529449ff98d544395d1576402bb0d0ae5b.png", - "episode_id": 510498, - "follows": "-", - "plays": "-", - "pub_index": "第7话", - "pub_time": "21:00", - "pub_ts": 1652878800, - "published": 0, - "season_id": 41413, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/247f8326019e035338529306e94baea3336c43b4.png", - "title": "盾之勇者成名录 第二季" - } - ], - "is_today": 1 - }, - { - "date": "5-19", - "date_ts": 1652889600, - "day_of_week": 4, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/99277ce3f41d1cb4dcda9f6010ebe9c9e6d345e5.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c989d496e3a075e8bc134b0d4d53d6ca5c2ae634.jpg", - "episode_id": 510760, - "follows": "-", - "plays": "-", - "pub_index": "第2话", - "pub_time": "12:00", - "pub_ts": 1652932800, - "published": 0, - "season_id": 41417, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ef45828cb99309169e95d1bf54ec833d7968bf22.png", - "title": "夏日重现" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/1cd26af47cf9d9ca045ec36f56ce14a66867438d.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/3dc8d348937528779b7ad9a3070d37276518080f.png", - "episode_id": 399655, - "follows": "-", - "plays": "-", - "pub_index": "第50话", - "pub_time": "18:00", - "pub_ts": 1652954400, - "published": 0, - "season_id": 38353, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4bd7b0a4c270ce62ca2adf3e18487a96e4fde92e.png", - "title": "通灵王" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/5f5b16bc8edd1310fbf0ac8bce04a11144dc858e.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/aed167a32445ed294ea75ed674442c766d56cb2a.png", - "episode_id": 511494, - "follows": "-", - "plays": "-", - "pub_index": "第4话", - "pub_time": "23:00", - "pub_ts": 1652972400, - "published": 0, - "season_id": 41422, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/924c550415ccdd142145dbf102bd81fcbb018ffd.png", - "title": "骸骨骑士大人奇幻世界冒险中" - } - ], - "is_today": 0 - }, - { - "date": "5-20", - "date_ts": 1652976000, - "day_of_week": 5, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/a29f3b00a94d1b4a029054f72963cc10d98bae99.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/4b9b98677b039b9126614f5a5259aa1484cea227.jpg", - "episode_id": 510757, - "follows": "-", - "plays": "-", - "pub_index": "第2话", - "pub_time": "01:28", - "pub_ts": 1652981280, - "published": 0, - "season_id": 41520, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/2a0ca7be587039eef380f802f8ae71bd21d2ea2c.png", - "title": "街角魔族 第二季" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/ecb52c79def9f5a6099c5a0770f56e20479fb008.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/36d3079e1b24395b07f9f95128adc9568459c3e5.png", - "episode_id": 478238, - "follows": "-", - "plays": "-", - "pub_index": "第17话", - "pub_time": "02:25", - "pub_ts": 1652984700, - "published": 0, - "season_id": 40873, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13f437706d3f27dee7566a5e489928605663e40f.png", - "title": "川尻小玉的懒散生活" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/a7517ca25c5c7a132a16f589e3a3c4d9f49af196.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/17f34f6c51b8b9371af1998f0612d51f0ba03df2.png", - "episode_id": 508842, - "follows": "-", - "plays": "-", - "pub_index": "第6话", - "pub_time": "07:00", - "pub_ts": 1653001200, - "published": 0, - "season_id": 41534, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/3267da68f7f832ccfc7eaa77c6ab3fb806d2de98.png", - "title": "银河英雄传说:全新命题 激战" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/fecb68763f24d371167389abedf05742b0bf024f.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/f4116e5dcc44d6104cd72d9e0e833cde3959a835.png", - "episode_id": 476164, - "follows": "-", - "plays": "-", - "pub_index": "第32话", - "pub_time": "18:25", - "pub_ts": 1653042300, - "published": 0, - "season_id": 38366, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/56b8e4369871fc0c55bfa9df3f3f8002d40f0691.png", - "title": "妖怪手表" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/81c9dc929e6071a2d42f1b5a207bbcef4a1aead7.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/7c62ad9f559ee6b0fafc1c08d990636c21c4fa8d.png", - "episode_id": 510653, - "follows": "-", - "plays": "-", - "pub_index": "第7话", - "pub_time": "21:30", - "pub_ts": 1653053400, - "published": 0, - "season_id": 41432, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/930ae7ff644dc31ada9abcb3ea30fee5fbc6f397.png", - "title": "约会大作战 第四季" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/d464543dd6720efd43e5487acee74b646423b4d1.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/ca7a19d51feb54162d8f286af416aa5a804e72c4.png", - "episode_id": 511497, - "follows": "-", - "plays": "-", - "pub_index": "第7话", - "pub_time": "22:00", - "pub_ts": 1653055200, - "published": 0, - "season_id": 41418, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ab50117450baffba62c71c80052ecbad1842a1f3.png", - "title": "恋爱要在世界征服后" - } - ], - "is_today": 0 - }, - { - "date": "5-21", - "date_ts": 1653062400, - "day_of_week": 6, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/68aee547fc85b1eab8be3d5c7e946276e4252b79.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/75583ce830522c6fd391cd6ffac31e3ab96db50e.png", - "episode_id": 510568, - "follows": "-", - "plays": "-", - "pub_index": "第8话", - "pub_time": "00:30", - "pub_ts": 1653064200, - "published": 0, - "season_id": 39725, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/a4fa3f4ecaa4efc883aa1ef2ca7ed736edb38b8c.png", - "title": "理科生坠入情网,故尝试证明。 第二季" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/f711a34e0f18293ba5068fd85d8de891bb01c2be.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/aa3e0fc7ecb422c7c8ed107267befaa18f6dcf89.png", - "episode_id": 510935, - "follows": "-", - "plays": "-", - "pub_index": "第8话", - "pub_time": "00:30", - "pub_ts": 1653064200, - "published": 0, - "season_id": 41506, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/d2dea82606b8dd0ee7934c62dbc7016b0a17255f.png", - "title": "处刑少女的生存之道" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/91ec1f4bc4af307dbfbd68c9ba6d838b27adee0f.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/6d9499e4e5453e5e353939980524102c3b707edb.png", - "episode_id": 477129, - "follows": "-", - "plays": "-", - "pub_index": "第8话", - "pub_time": "01:25", - "pub_ts": 1653067500, - "published": 0, - "season_id": 39180, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/f23cf19d1d6068e83edfd6b3d207ce692ef58ef3.png", - "title": "测不准的阿波连同学" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/bad807ac5a8d4094ead26c08ec2d9b97dbb8c4a1.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/8e563a29a9fb6b91df791a12eb5f869d038fc1e9.png", - "episode_id": 510677, - "follows": "-", - "plays": "-", - "pub_index": "第2话", - "pub_time": "02:00", - "pub_ts": 1653069600, - "published": 0, - "season_id": 41533, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4ef341fa95646a7c2549e08ba00358b411fba0ee.png", - "title": "舞动不止" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/4ab5cf1efbd1c5883b8f0580cb0304f5452c4665.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/8ea1f90444d04a0b989584df9f18e59a824b0e90.png", - "episode_id": 341403, - "follows": "-", - "plays": "-", - "pub_index": "第71话", - "pub_time": "09:30", - "pub_ts": 1653096600, - "published": 0, - "season_id": 34425, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ae36d43ebe7ea7176d18bab794de3d8930284feb.png", - "title": "勇者斗恶龙 达伊的大冒险" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/23f393513ab8fdfbb351aa80e8b7423e7361ad98.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/d470a1bf53c96210f2238024dc1947f52cb58f3a.png", - "episode_id": 510681, - "follows": "-", - "plays": "-", - "pub_index": "第2话", - "pub_time": "18:00", - "pub_ts": 1653127200, - "published": 0, - "season_id": 41535, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/f3f69f8747e8464ba46b9bbe24678966809c8021.png", - "title": "Love All Play热血羽毛球" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/38e2a273f528fd01c34f1fc4df0f69c64487efad.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/6c108526eade13d04882b803f1d1e0dfe2a1886e.png", - "episode_id": 459329, - "follows": "-", - "plays": "-", - "pub_index": "第1101话", - "pub_time": "19:30", - "pub_ts": 1653132600, - "published": 0, - "season_id": 33378, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/ecc9a64f3f43eb00ee2bf1549b6ab76182cf5f8b.png", - "title": "名侦探柯南" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/f641f81aa1933d73c91d5ef76b525acbcdbcf3e7.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c7ccf71fcf65b4e5655403b01a7af3529d2891e8.png", - "episode_id": 510754, - "follows": "-", - "plays": "-", - "pub_index": "第10话", - "pub_time": "20:00", - "pub_ts": 1653134400, - "published": 0, - "season_id": 39433, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1b4cc42a3909ad2d03563d3163b105c6cad80d20.png", - "title": "鬼灭之刃 游郭篇" - } - ], - "is_today": 0 - }, - { - "date": "5-22", - "date_ts": 1653148800, - "day_of_week": 7, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/3a9815ca239735c51fc7daf2399c3721bbe00160.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/30908825b7c8076b9d7b58d8cd949a87f48866e6.png", - "episode_id": 466767, - "follows": "-", - "plays": "-", - "pub_index": "第7话", - "pub_time": "11:00", - "pub_ts": 1653188400, - "published": 0, - "season_id": 41005, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/b3dd92da1ca35758f329fa5aa649991b118a98ca.png", - "title": "鬼灭之刃 无限列车篇 中配版" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/71d54cae830d32a5af776dcc46632146fbdba868.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/3baf5335e3f1df882b54d69c0c6c9ffa76069eef.png", - "episode_id": 480435, - "follows": "-", - "plays": "-", - "pub_index": "第241话", - "pub_time": "17:30", - "pub_ts": 1653211800, - "published": 0, - "season_id": 5978, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/3121473d5dd03a9bcccb8490034207e724e731b3.jpg", - "title": "博人传 火影忍者新时代" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/91e75030be41d67b9f19b96bb512b0c98ae781bd.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/cff6617c1c7e28f8cd9db3d33d5366a5029e3aa9.png", - "episode_id": 510648, - "follows": "-", - "plays": "-", - "pub_index": "第5话", - "pub_time": "20:00", - "pub_ts": 1653220800, - "published": 0, - "season_id": 41557, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/4329384cba4ab0390eae1a84a719e4649bf61cfb.png", - "title": "这个治疗有点烦" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/c9723d8c77d881a8debba2852d580e97826b43d0.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/c91b2b96c272eb28aa3dd74aa58fc272fc62d577.png", - "episode_id": 478919, - "follows": "-", - "plays": "-", - "pub_index": "第8话", - "pub_time": "21:00", - "pub_ts": 1653224400, - "published": 0, - "season_id": 41591, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/1ffa24e100583c3aa96812dea680943291c5c384.jpg", - "title": "恋爱游戏世界对路人角色很不友好" - } - ], - "is_today": 0 - }, - { - "date": "5-23", - "date_ts": 1653235200, - "day_of_week": 1, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/e468c854628b97b5373baaf4c43e1346a9806baa.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/26f87214a2481680a93bfda294ac080c0b336a40.png", - "episode_id": 511343, - "follows": "-", - "plays": "-", - "pub_index": "第2话", - "pub_time": "20:00", - "pub_ts": 1653307200, - "published": 0, - "season_id": 41419, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/75a291010c128ce2de17267fd2a4842d19898236.png", - "title": "魔法使黎明期" - } - ], - "is_today": 0 - }, - { - "date": "5-24", - "date_ts": 1653321600, - "day_of_week": 2, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/4e6c505b1b1631c542ea76c3da1ce08bb43faad6.jpg", - "episode_id": 510133, - "follows": "-", - "plays": "-", - "pub_index": "第147话", - "pub_time": "18:00", - "pub_ts": 1653386400, - "published": 0, - "season_id": 23841, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/5c2f289eac0ec49bc5e6b9483f4191c42ffa2254.jpg", - "title": "美妙☆频道" - }, - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/9eef1df9ab157be52d2c4d70d3500442f00cafc3.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/a651c55bb430cdea19d5f4253969d1f7b83567c7.png", - "episode_id": 509044, - "follows": "-", - "plays": "-", - "pub_index": "第12话", - "pub_time": "18:00", - "pub_ts": 1653386400, - "published": 0, - "season_id": 38950, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/13fd7c96659a20c61409e155a2a913a59348d122.png", - "title": "魔法纪录 魔法少女小圆外传 第二季" - } - ], - "is_today": 0 - }, - { - "date": "5-25", - "date_ts": 1653408000, - "day_of_week": 3, - "episodes": [ - { - "cover": "http://i0.hdslb.com/bfs/bangumi/image/fba0229f1a6eec6ed692b7ae91c634d5cbde0727.png", - "delay": 0, - "delay_id": 0, - "delay_index": "", - "delay_reason": "", - "ep_cover": "http://i0.hdslb.com/bfs/bangumi/image/0ebefe529449ff98d544395d1576402bb0d0ae5b.png", - "episode_id": 510499, - "follows": "-", - "plays": "-", - "pub_index": "第8话", - "pub_time": "21:00", - "pub_ts": 1653483600, - "published": 0, - "season_id": 41413, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/247f8326019e035338529306e94baea3336c43b4.png", - "title": "盾之勇者成名录 第二季" - } - ], - "is_today": 0 - } - ] -} -``` - -</details> \ No newline at end of file diff --git a/docs/bangumi/videostream_url.md b/docs/bangumi/videostream_url.md deleted file mode 100644 index e8a53da..0000000 --- a/docs/bangumi/videostream_url.md +++ /dev/null @@ -1,359 +0,0 @@ -# 视频流URL - -<img src="../../assets/img/download.svg" width="100" height="100"/> - -B站的番剧视频为http流媒体,需要对应的api以视频id获取取流url,并进行取流 - -## qn视频清晰度标识 - -**注:该值在dash模式且非下载模式时无效** - -| 值 | 含义 | 备注 | -|-----|-------------|-----------------------------------------------------------------------------| -| 6 | 240P 极速 | 仅mp4方式支持 | -| 16 | 360P 流畅 | | -| 32 | 480P 清晰 | | -| 64 | 720P 高清 | web端默认值<br />B站前端需要登录才能选择,但是直接发送请求可以不登录就拿到720P的取流地址<br />**无720P时则为720P60** | -| 74 | 720P60 高帧率 | 需要认证登录账号 | -| 80 | 1080P 高清 | TV端与APP端默认值<br />需要认证登录账号 | -| 100 | 智能修复 | 仅支持dash方式<br />需要`fnval&12240=12240`<br />需要认证登录账号 | -| 112 | 1080P+ 高码率 | 大多情况需求认证大会员账号 | -| 116 | 1080P60 高帧率 | 大多情况需求认证大会员账号 | -| 120 | 4K 超清 | 需要`fnval&128=128`且`fourk=1`<br />大多情况需求认证大会员账号 | -| 125 | HDR 真彩色 | 仅支持dash方式<br />需要`fnval&64=64`<br />大多情况需求认证大会员账号 | -| 126 | 杜比视界 | 仅支持dash方式<br />需要`fnval&512=512`<br />大多情况需求认证大会员账号 | -| 127 | 8K 超高清 | 仅支持dash方式<br />需要`fnval&1024=1024`<br />大多情况需求认证大会员账号 | - -例如:请求1080P+的视频,则`qn=112` - -## fnver视频流版本标识 - -目前该值恒为0,即`fnver=0` - -## fnval视频流格式标识 - -该代码为二进制属性位,如需组合功能需要使用`OR`运算结合一下数值 - -| 值 | 含义 | 备注 | -|------|-------------|-------------------------------------------------------------| -| 0 | flv格式 | 仅H.264编码<br />部分老视频存在分段现象<br />与mp4格式及dash格式互斥 | -| 1 | mp4格式 | 仅H.264编码<br />不存在视频分段<br />与flv格式及dash格式互斥 | -| 16 | dash格式 | H.264编码或H.265编码<br />部分老视频的清晰度上限低于flv格式<br />与mp4格式及flv格式互斥 | -| 64 | 是否需求 HDR 视频 | 必须为dash格式<br />需要`qn=125`<br />大多情况需求认证大会员账号 | -| 128 | 是否需求 4K 分辨率 | 该值与`fourk`字段协同作用<br />需要`qn=120`<br />大多情况需求认证大会员账号 | -| 256 | 是否需求杜比音频 | 必须为dash格式<br />大多情况需求认证大会员账号 | -| 512 | 是否需求杜比视界 | 必须为dash格式<br />大多情况需求认证大会员账号 | -| 1024 | 是否需求 8K 分辨率 | 必须为dash格式<br />需要`qn=127`<br />大多情况需求认证大会员账号 | -| 2048 | 是否需求 av1 编码 | 必须为dash格式 | -| 12240 | 是否需求智能修复 | 必须为dash格式<br />需要认证大会员账号 | - -例如:请求dash格式且需要HDR的视频流,则`fnval=16|64=80` - -## 视频编码代码 - -| 值 | 含义 | 备注 | -|-----|--------|----------| -| 7 | AVC编码 | 8K视频无此格式 | -| 12 | HEVC编码 | | -| 13 | AV1编码 | | - -## 视频伴音音质代码 - -| 值 | 含义 | -|-------|------| -| 30216 | 64K | -| 30232 | 132K | -| 30280 | 192K | - -## 获取番剧视频流URL - -> https://api.bilibili.com/pgc/player/web/playurl - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - ---- - -关于视频流会员鉴权: - -- 获取480P及以上清晰度视频时需要登录(Cookie) - -- 获取高帧率(1080P60)/高码率(1080P+)视频时需要有大会员的账号登录(Cookie) - -- 获取会员专属番剧视频时需要登录(Cookie) - ---- - -获取的url有效时间为120min,超时失效需要重新获取 - -**部分视频**会有**分段**,需要特别注意 - -若视频有分P,仅为单P的视频的url,换P则需更换cid重新获取 - -需要设置Referer为`https://www.bilibili.com`,否则无法获取1080清晰度以上的流信息。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------------|-----|----------|--------|--------------------------------------------------------------------------------------------------| -| avid | num | 稿件avid | 非必要 | | -| bvid | str | 稿件bvid | 非必要 | | -| ep_id | num | 稿件epid | 必要(可选) | ep_id与cid任选一个 | -| cid | num | 视频cid | 必要(可选) | ep_id与cid任选一个 | -| qn | num | 视频清晰度选择 | 非必要 | 未登录默认32(480P)<br />登录默认64(720P)<br />**值含义见上表**<br />注:dash方式无效 | -| fnval | num | 视频获取方式选择 | 非必要 | 默认为0<br />0 2:flv方式(可能会有分段)<br />1:低清mp4方式(仅240P与360P,且限速65K/s)<br />16 80:dash方式(音视频分流,支持H.265) | -| fnver | num | 0 | 非必要 | 固定为0 | -| fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P:0<br />画质最高4K:1 | -| session | str | | 非必要 | 从视频播放页的网页源码中获取 | -| from_client | str | BROWSER | 非必要 | | -| drm_tech_type | num | 2 | 非必要 | | - - - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----------------------|------|------------------------------------| -| code | num | 返回值 | 0:成功 <br />-400:请求错误<br />-404:无视频 | -| message | str | 错误信息 | 成功为success | -| result | 有效时:obj<br />无效时:null | 数据本体 | | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------------|-------|-----------------------------------|----------------------------| -| code | num | 0 | 作用尚不明确 | -| is_preview | num | 0 | 作用尚不明确 | -| fnver | num | 请求时提供的fnver | | -| fnval | num | 请求时提供的fnval | | -| video_project | bool | true | | -| type | str | 视频流类型(DASH、FLV、MP4) | DASH | -| bp | num | 是否可以承包 | 0 | -| vip_type | num | 当前用户大会员类型 | | -| vip_status | num | 当前用户大会员状态 | | -| is_drm | bool | false | | -| no_rexcode | num | 0 | | -| has_paid | bool | false | | -| status | num | 2 | | -| from | str | local | 作用尚不明确 | -| result | str | suee | 作用尚不明确 | -| message | str | 空 | 作用尚不明确 | -| quality | num | 当前的视频分辨率代码 | **值含义见上表** | -| format | str | 视频格式 | | -| timelength | num | 视频长度 | 单位为毫秒<br />不同分辨率/格式可能有略微差异 | -| accept_format | str | 视频支持的全部格式 | 每项用`,`分隔 | -| accept_description | array | 视频支持的分辨率列表 | | -| accept_quality | array | 视频支持的分辨率代码列表 | **值含义见上表** | -| video_codecid | num | 默认选择视频流的编码id | 见**视频编码代码** | -| seek_param | str | 固定值:start | 作用尚不明确 | -| seek_type | str | offset(dash、flv)<br/> second(mp4) | 作用尚不明确 | -| durl | array | 视频分段 | **注:仅flv/mp4存在此项** | -| dash | obj | dash音视频流信息 | **注:仅dash存在此项** | -| support_formats | array | 支持格式的详细信息 | | -| clip_info_list | array | | 空,待补充 | -| record_info | obj | 备案登记信息 | | - -`result`中的`accept_description`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|------------|-----| -| 0 | str | 分辨率名称1 | | -| n | str | 分辨率名称(n+1) | | -| …… | str | …… | | - -`result`中的`accept_quality`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|------------|-----| -| 0 | str | 分辨率代码1 | | -| n | str | 分辨率代码(n+1) | | -| …… | str | …… | | - -`result`中的`support_formats`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|---------------|-----| -| 0 | obj | 播放格式详细信息1 | | -| n | obj | 播放格式详细信息(n+1) | | -| …… | obj | …… | | - -`support_formats`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-------|---------|-----| -| quality | num | 视频清晰度代码 | | -| format | str | 视频格式 | | -| new_description | str | 格式描述 | | -| description | str | 格式描述 | | -| display_desc | str | 格式描述 | | -| superscript | str | (?) | | -| codecs | array | 编码格式列表 | | -| need_login | bool | 需要登录 | | -| need_vip | bool | 需要大会员 | | - -`support_formats`中的`codecs`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|------|-----------------------------| -| 0 | str | 编码格式 | 如:avc1.640032,意为AVC编码 | -| 1 | str | 编码格式 | 如:hev1.1.6.L153.90,意为HEVC编码 | - -`result`中的`record_info`对象: - -| 项 | 类型 | 内容 | 备注 | -|-------------|-----|------|-----------------------| -| record_icon | str | 空串 | | -| record | str | 显示文案 | 登记号:10417060172092207 | - ---- - -**flv/mp4方式:** - -`result`中的`durl`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-------------|------------------| -| 0 | obj | 视频分段1信息 | **注:仅flv方式具有分段** | -| n | obj | 视频分段(n+1)信息 | | -| …… | obj | …… | | - -`durl`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-------|--------|-----------------------------------| -| order | num | 视频分段序号 | 某些视频会分为多个片段(从1顺序增长) | -| length | num | 视频长度 | 单位为毫秒 | -| size | num | 视频大小 | 单位为Byte | -| vhead | str | 空 | 作用尚不明确 | -| url | str | 视频流url | **注:url内容存在转义符**<br />有效时间为120min | -| backup_url | array | 备用视频流 | | - -`durl`数组中的对象中的`backup_url`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|----------------|-----------------------------------| -| 0 | str | 备用视频流url 1 | **注:url内容存在转义符**<br />有效时间为120min | -| n | str | 备用视频流url (n+1) | | -| …… | str | …… | | - -**示例:** - -**视频无分段时:** - -获取视频`ep85046`/`av2325306`中的1P(cid=`3629601`)的视频流url,清晰度为480p,使用flv方式获取 - -avid/epid方式: - -```shell -curl -G 'https://api.bilibili.com/pgc/player/web/playurl' \ ---data-urlencode 'avid=2325306' \ ---data-urlencode 'cid=3629601' \ ---data-urlencode 'ep_id=85046' \ --b 'SESSDATA=xxx' -``` -https://api.bilibili.com/pgc/player/web/playurl?avid=2325306&cid=3629601&ep_id=85046 - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "success", - "result": { - "accept_format": "flv480,mp4", - "code": 0, - "seek_param": "start", - "is_preview": 0, - "fnval": 0, - "video_project": true, - "fnver": 0, - "type": "FLV", - "bp": 0, - "result": "suee", - "seek_type": "offset", - "from": "local", - "video_codecid": 7, - "record_info": { - "record_icon": "", - "record": "" - }, - "durl": [ - { - "size": 111138876, - "ahead": "", - "length": 1394090, - "vhead": "", - "backup_url": [ - "https://upos-sz-mirrorcoso1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=coso1bv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=878be08cc0e6bdea705952529e7e6785&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&agrr=1&bw=79726&logo=40000000", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=cosbv&oi=2946990771&trid=a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=8c31064c84d8e981704815992cfe315c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=2,3&agrr=1&bw=79726&logo=40000000" - ], - "url": "https://cn-lnsy-cu-v-02.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098195&gen=playurlv2&os=bcache&oi=2946990771&trid=0000a1db84b216ea45dd89225f02a09093fdp&mid=0&platform=pc&upsig=7a5c4f25b9056359127191390a73bedc&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&cdnid=3281&bvc=vod&nettype=0&orderid=0,3&agrr=1&bw=79726&logo=80000000", - "order": 1, - "md5": "" - } - ], - "no_rexcode": 0, - "format": "flv480", - "support_formats": [ - { - "display_desc": "480P", - "superscript": "", - "codecs": [ ], - "format": "flv480", - "description": "清晰 480P", - "quality": 32, - "new_description": "480P 清晰" - }, - { - "display_desc": "360P", - "superscript": "", - "codecs": [ ], - "format": "mp4", - "description": "流畅 360P", - "quality": 16, - "new_description": "360P 流畅" - } - ], - "message": "", - "accept_quality": [ - 32, - 16 - ], - "quality": 32, - "timelength": 1394090, - "has_paid": false, - "clip_info_list": [ ], - "accept_description": [ - "清晰 480P", - "流畅 360P" - ], - "status": 2 - } -} -``` - -</details> - -## 视频的取流(web端及APP端) - -**注意:** - -1. 如flv模式则可能产生分段情况,将`$.data.durl[1-n].url`或`$.data.durl[1-n].backup_url[0]`中的内容作为url进行GET操作, 如果有多个视频, 需要手动合并处理 -2. 如mp4模式则需要获取对应的视频流(方法同上) -3. 如dash模式则需要同时获取对应的视频流和伴音流(方法同上) -4. web端取流需要验证防盗链,即`referer`为 `.bilibili.com`域名下且UA不能为空;app端也需要验证防盗链,即UA需要含有`Mozilla/5.0 BiliDroid/*.*.* (bbcallen@gmail.com)`(*为版本);如`referer`或UA错误的情况会被判定为盗链,返回403 Forbidden故无法取流 -5. **注意unicode转义符** - -以上述视频流url为例: - -```shell -wget 'https://upos-sz-mirrorhwo1.bilivideo.com/upgcxcode/01/96/3629601/3629601_da8-1-32.flv?e=ig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1656098026&gen=playurlv2&os=hwo1bv&oi=0&trid=f0a1d2d854264369803462f3dd524154p&mid=0&platform=pc&upsig=76c1438153942fda51fbf4eb07e6e5a1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=0,2&agrr=1&bw=79726&logo=80000000' \ ---referer 'https://www.bilibili.com' \ --O 'Download_video.flv' -``` - -响应正文将返回一个flv文件 diff --git a/docs/blackroom/banlist.md b/docs/blackroom/banlist.md deleted file mode 100644 index 9895a0c..0000000 --- a/docs/blackroom/banlist.md +++ /dev/null @@ -1,301 +0,0 @@ -# 封禁公示 - -## Enum类型代码 - -### 表1:已知的封禁原因类型代码总览 - -| 代码 | 含义 | -| ---- | -------------------- | -| 1 | 刷屏 | -| 2 | 抢楼 | -| 3 | 发布色情低俗信息 | -| 4 | 发布赌博诈骗信息 | -| 5 | 发布违禁相关信息 | -| 6 | 发布垃圾广告信息 | -| 7 | 发布人身攻击言论 | -| 8 | 发布侵犯他人隐私信息 | -| 9 | 发布引战言论 | -| 10 | 发布剧透信息 | -| 11 | 恶意添加无关标签 | -| 12 | 恶意删除他人标签 | -| 13 | 发布色情信息 | -| 14 | 发布低俗信息 | -| 15 | 发布暴力血腥信息 | -| 16 | 涉及恶意投稿行为 | -| 17 | 发布非法网站信息 | -| 18 | 发布传播不实信息 | -| 19 | 发布怂恿教唆信息 | -| 20 | 恶意刷屏 | -| 21 | 账号违规 | -| 22 | 恶意抄袭 | -| 23 | 冒充自制原创 | -| 24 | 发布青少年不良内容 | -| 25 | 破坏网络安全 | -| 26 | 发布虚假误导信息 | -| 27 | 仿冒官方认证账号 | -| 28 | 发布不适宜内容 | -| 29 | 违反运营规则 | -| 30 | 恶意创建话题 | -| 31 | 发布违规抽奖 | -| 32 | 恶意冒充他人 | - -### 表2:已知的违规类型代码 - -| 代码 | 含义 | -| ---- | -------- | -| 0 | 全部类型 | -| 1 | 评论 | -| 2 | 弹幕 | -| 3 | 私信 | -| 4 | 标签 | -| 5 | 个人资料 | -| 6 | 投稿 | -| 8 | 专栏 | -| 10 | 动态 | -| 11 | 相簿 | - -## 获取封禁用户公示列表 - -> https://api.bilibili.com/x/credit/blocked/list - -*请求方式:GET* - -每页最多10项 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ------------------------------------------------------------ | -| btype | num | 来源筛选 | 非必要 | 空:全部类型<br />`0`:系统封禁<br />`1`:风纪仲裁(仲裁系统升级后此类型已不再更新) | -| otype | num | 类型筛选 | 非必要 | **见[表2](#表2已知的违规类型代码)**<br />默认为`0`:全部类型 | -| pn | num | 页码 | 非必要 | 默认为`1` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------ | -| code | num | 返回值 | `0`:成功 | -| message | str | 错误信息 | 默认为`0` | -| ttl | num | `1` | | -| data | array | 公示列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ------ | --------------- | ---- | -| 0 | object | 封禁公示1 | | -| n | object | 封禁公示(n+1) | | -| …… | object | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ---------------- | ------------------------------------------- | -| id | num | 封禁公示id | | -| uname | str | 对象用户名 | | -| face | str | 对象用户头像url | | -| uid | num | 对象用户mid | | -| originTitle | str | 来源标题 | | -| blockedRemark | str | | | -| originUrl | str | 来源url | | -| originContentModify | str | 裁决正文 | | -| originType | num | 来源类型 | **见[表2](#表2已知的违规类型代码)** | -| originTypeName | str | 来源名 | | -| punishTitle | str | 公示标题 | | -| punishTime | num | 处罚时间 | 时间戳 | -| punishType | num | 处理手段类型 | `2`:封禁<br />`3`:永久封禁 | -| punishTypeName | str | 处理手段名 | | -| moralNum | num | `0`节操值 | 被封禁用户节操值均为`0` | -| blockedDays | num | 封禁天数 | 永封为`0` | -| publishStatus | num | `1` | 作用尚不明确 | -| blockedType | num | 处理来源 | `0`:系统封禁<br />1:风纪仲裁 | -| blockedForever | num | 是否永封 | `0`:非永封<br />`1`:永封 | -| reasonType | num | 封禁原因类型 | **见[表1](#表1已知的封禁原因类型代码总览)** | -| reasonTypeName | str | 封禁原因类型名称 | | -| operatorName | str | 空 | 作用尚不明确 | -| caseId | num | 仲裁信息id | 系统封禁时固定为0 | -| ctime | num | 创建时间 | 时间戳 | -| commentSum | num | 该条目评论数 | | - -**示例:** - -查询所有类型,所有来源的第1页的封禁公示列表 - -```shell -curl -G 'https://api.bilibili.com/x/credit/blocked/list' \ ---data-urlencode 'btype=' \ ---data-urlencode 'otype=0' \ ---data-urlencode 'pn=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "id": 1118220, - "uname": "漫城林语", - "face": "http://i2.hdslb.com/bfs/face/970f2da4a58f83879e69e259f4a9d3587cba03f0.jpg", - "uid": 135913, - "originTitle": "【罗翔】聊聊网络喷子与键盘侠", - "blockedRemark": "内容涉及人身攻击", - "originUrl": "https://www.bilibili.com/video/av752825895", - "originContentModify": "<p>案情:</p><p>1、大量刷屏/引战</p><p>我看新闻了,竹鼠全部被ZF无害化处理了,看的爽死我了,亏死你们,啊哈哈哈(x10)</p><p>【BV16g4y187he,2020-4-21 10:46:23~10:46:47】</p><p>2、大量人身攻击</p><p>N * * L</p><p>Deine Mu**er ist tot. (x10)</p><p>【BV1rk4y1R7id,2020-4-21 20:31:08~20:32:23】</p><p>3、引战</p><p>每次看他厨房乱七八糟的,可能有数不清的小强,你们还看美食看的有味也是奇PA</p><p>【BV1Kg4y1z7mA,2020-4-22  00:52:37】<br/></p><p>批注:</p><p>满地狼藉招摇过,人皆愤懑怒拳握。</p><p>余恶不堪漏夜扫,正气于心涤龌龊。</p><p><br/></p><p>(发现违规引战、人身攻击、刷屏评论,请按照相应分类进行举报。若发现反复进行上述行为,可联系工作人员反馈相关违规账号信息,我们会予以排查。)</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p><p><br/></p>", - "originType": 1, - "originTypeName": "评论", - "punishTitle": "在评论中发布人身攻击言论", - "punishTime": 1587494264, - "punishType": 3, - "punishTypeName": "永久封禁", - "moralNum": 0, - "blockedDays": 0, - "publishStatus": 1, - "blockedType": 0, - "blockedForever": 1, - "reasonType": 7, - "reasonTypeName": "发布人身攻击言论", - "operatorName": "", - "caseId": 0, - "ctime": 1587494264, - "commentSum": 606 - }, { - "id": 1091621, - "uname": "风纪委员会会长零八", - "face": "http://i1.hdslb.com/bfs/face/6ea4296f7591b9a724f540a41d48df728a0881b0.jpg", - "uid": 305542374, - "originTitle": "巅峰赛大乔游走辅助,队友说自家法师湖南卫视都不敢像法师这么演哈哈!", - "blockedRemark": "内容涉及传播不实信息", - "originUrl": "https://www.bilibili.com/video/av882552073", - "originContentModify": "<p>具体违规情况说明:</p><ol class=\" list-paddingleft-2\" style=\"list-style-type: decimal;\"><li><p>经查实确认,该账号<span style=\"text-decoration: underline;\">从未申请</span>亦<span style=\"text-decoration: underline;\">从未担任</span>过风纪委员职务。</p></li><li><p>发布多条 “您的稿件/评论涉及违规,即将下架/删除”的恐吓性言论。</p></li><li><p>谎称曾经封禁了某个up主,事实上风纪委员<span style=\"text-decoration: underline;\">无法封禁up主投稿</span>,且该up也从未被封禁。</p></li><li><p>威胁他人“要不要到小黑屋坐坐”,事实上风纪委员无法直接封禁用户。通过管理员封禁或风纪委员投票封禁的账号亦有据实申诉的机会。</p></li><li><p>故意挑衅他人“那你可以试着骂我,我们试试(举报)有没有用”。</p></li><li><p>误导他人“此评论区和弹幕无需保持礼仪”。</p></li></ol><p>批注:</p><p>如您发现:假冒风纪委员身份招摇撞骗、炫耀风纪委员身份、借风纪委员职务之便威胁恐吓他人、在风纪观点中发布违规内容等违规行为,请及时联系我们进行举报。您可直接将举报材料发送至judgement@bilibili.com。</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p>", - "originType": 1, - "originTypeName": "评论", - "punishTitle": "在评论中发布传播不实信息", - "punishTime": 1585560309, - "punishType": 2, - "punishTypeName": "封禁", - "moralNum": 0, - "blockedDays": 15, - "publishStatus": 1, - "blockedType": 0, - "blockedForever": 0, - "reasonType": 18, - "reasonTypeName": "发布传播不实信息", - "operatorName": "", - "caseId": 0, - "ctime": 1585560309, - "commentSum": 2379 - }, - ………… - ] -} -``` - -</details> - -## 封禁处理公示详情 - -> https://api.bilibili.com/x/credit/blocked/info - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | ---- | -| id | num | 封禁公示id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此信息 | -| message | str | 错误信息 | 默认为`0` | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ---------------- | ------------------------------------------- | -| id | num | 封禁公示id | | -| uname | str | 对象用户名 | | -| face | str | 对象用户头像url | | -| uid | num | 对象用户mid | | -| originTitle | str | 来源标题 | | -| blockedRemark | str | | | -| originUrl | str | 来源url | | -| originContentModify | str | 裁决正文 | | -| originType | num | 来源类型 | **见[表2](#表2已知的违规类型代码)** | -| originTypeName | str | 来源名 | | -| punishTitle | str | 公示标题 | | -| punishTime | num | 处罚时间 | 时间戳 | -| punishType | num | 处理手段类型 | `2`:封禁<br />`3`:永久封禁 | -| punishTypeName | str | 处理手段名 | | -| moralNum | num | `0`节操值 | 被封禁用户节操值均为`0` | -| blockedDays | num | 封禁天数 | 永封为`0` | -| publishStatus | num | `1` | 作用尚不明确 | -| blockedType | num | 处理来源 | `0`:系统封禁<br />`1`:风纪仲裁 | -| blockedForever | num | 是否永封 | `0`:非永封<br />`1`:永封 | -| reasonType | num | 封禁原因类型 | **见[表1](#表1已知的封禁原因类型代码总览)** | -| reasonTypeName | str | 封禁原因类型名称 | | -| operatorName | str | 空 | 作用尚不明确 | -| caseId | num | 仲裁信息id | 系统封禁时固定为0 | -| ctime | num | 创建时间 | 时间戳 | -| commentSum | num | 该条目评论数 | | - -**示例:** - -查询公示id为`1091621`的公示详情 - -```shell -curl -G 'https://api.bilibili.com/x/credit/blocked/info' \ ---data-urlencode 'id=1091621' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1091621, - "uname": "风纪委员会会长零八", - "face": "http://i1.hdslb.com/bfs/face/6ea4296f7591b9a724f540a41d48df728a0881b0.jpg", - "uid": 305542374, - "originTitle": "巅峰赛大乔游走辅助,队友说自家法师湖南卫视都不敢像法师这么演哈哈!", - "blockedRemark": "内容涉及传播不实信息", - "originUrl": "https://www.bilibili.com/video/BV1qK4y1C7dd", - "originContentModify": "<p>具体违规情况说明:</p><ol class=\" list-paddingleft-2\" style=\"list-style-type: decimal;\"><li><p>经查实确认,该账号<span style=\"text-decoration: underline;\">从未申请</span>亦<span style=\"text-decoration: underline;\">从未担任</span>过风纪委员职务。</p></li><li><p>发布多条 “您的稿件/评论涉及违规,即将下架/删除”的恐吓性言论。</p></li><li><p>谎称曾经封禁了某个up主,事实上风纪委员<span style=\"text-decoration: underline;\">无法封禁up主投稿</span>,且该up也从未被封禁。</p></li><li><p>威胁他人“要不要到小黑屋坐坐”,事实上风纪委员无法直接封禁用户。通过管理员封禁或风纪委员投票封禁的账号亦有据实申诉的机会。</p></li><li><p>故意挑衅他人“那你可以试着骂我,我们试试(举报)有没有用”。</p></li><li><p>误导他人“此评论区和弹幕无需保持礼仪”。</p></li></ol><p>批注:</p><p>如您发现:假冒风纪委员身份招摇撞骗、炫耀风纪委员身份、借风纪委员职务之便威胁恐吓他人、在风纪观点中发布违规内容等违规行为,请及时联系我们进行举报。您可直接将举报材料发送至judgement@bilibili.com。</p><p>(案例感想请发布在小黑屋评论区讨论,请勿骚扰被封禁的用户)</p><p>【本次判罚为管理员判定,请注意案件右上无蓝色标记(风纪委员众裁)】</p>", - "originType": 1, - "originTypeName": "评论", - "punishTitle": "在评论中发布传播不实信息", - "punishTime": 1585560309, - "punishType": 2, - "punishTypeName": "封禁", - "moralNum": 0, - "blockedDays": 15, - "publishStatus": 1, - "blockedType": 0, - "blockedForever": 0, - "reasonType": 18, - "reasonTypeName": "发布传播不实信息", - "operatorName": "", - "caseId": 0, - "ctime": 1585560309, - "commentSum": 2379 - } -} -``` - -</details> diff --git a/docs/blackroom/jury/action.md b/docs/blackroom/jury/action.md deleted file mode 100644 index 700fed3..0000000 --- a/docs/blackroom/jury/action.md +++ /dev/null @@ -1,361 +0,0 @@ -# 仲裁操作 - -## 申请加入风纪委员会 - -> https://api.bilibili.com/x/credit/v2/jury/apply - -*请求方式:POST* - -认证方式:Cookie - -只有用户会员90天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会 - - -申请成功后可获得30天资格 - -**正文参数( application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | -| ------ | ---- | ---------------------- | ------ | -| csrf | str | cookie中`bili_jct`的值 | 必要 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />25001:申请等级限制(会员等级<3)<br />25002:没有实名认证<br />25003:90天内有封禁记录<br />25013:不能重复申请风纪委资格<br />25016:当日风纪委员名额已发完 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | - - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -#### 旧API -<details> -<summary>查看旧版API:</summary> - -> https://api.bilibili.com/x/credit/jury/apply - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -只有用户会员等级≥Lv4、90天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会 - -每日10:00开放新名额 - -申请成功后可获得30天资格 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />25001:申请等级限制(会员等级<3)<br />25002:没有实名认证<br />25003:90天内有封禁记录<br />25013:不能重复申请风纪委资格<br />25016:当日风纪委员名额已发完 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/apply' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/apply' \ ---data-urlencode 'access_key=xxx' -``` -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> -</details> - -## 拉取新案件 - -> https://api.bilibili.com/x/credit/v2/jury/case/next - -*请求方式:GET* - -认证方式:Cookie - -**标头参数(Headers):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ------ | ---- | -| Cookie | str | Cookie | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br/>25006:风纪委员资格已过期<br />25008:没有案件<br/>25014:已审满 | -| message | str | 信息 | 默认为0,当code不为0时,显示错误信息 | -| ttl | num | 1 | 作用尚不明确 | -| data | object | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ---- | -| case_id | str | 仲裁案件id | | - -**示例:** - -Cookie方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/next' \ ---header 'cookie: XXXXX' -``` - - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "case_id": "AC2m4HlrIrHv" - } -} -``` - -</details> - -#### 旧API -<details> -<summary>查看旧版API:</summary> - -> https://api.bilibili.com/x/credit/jury/caseObtain - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br/>25005:不是风纪委员<br />25008:没有案件<br/>25014:已审满 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | object | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| id | num | 仲裁案件id | | - -**示例:** - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/caseObtain' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1239790 - } -} -``` - -</details> -</details> - - -## 进行仲裁投票 - -> https://api.bilibili.com/x/credit/v2/jury/vote - -*请求方式:POST* - -认证方式:Cookie - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ---------------------- | ------ | ----------------------------------------------------- | -| case_id | str | 案件id | 必要 | | -| vote | num | 投票类型 | 必要 | 见「[众裁信息](judgement_info.md)」中表 | -| insiders | num | 是否观看此类视频 | 非必要 | 默认值为0<br/>见「[众裁信息](judgement_info.md)」中表 | -| content | str | 理由 | 非必要 | | -| anonymous | num | 是否匿名 | 非必要 | 默认值为0<br/>0:不匿名<br />1:匿名 | -| csrf | str | cookie中`bili_jct`的值 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br/>-101:未登录<br />-111:csrf 错误<br />-400:请求错误(投票类型错误)<br />25005:不是风纪委员<br />25011:投票类型错误<br />25018:不能进行此操作<br/><br/>*注:新版本对于一个不存在的`case_id`,不会报错。* | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | - - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -#### 旧API -<details> -<summary>查看旧版API:</summary> -> https://api.bilibili.com/x/credit/jury/vote - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------------------------ | -------------- | --------------------------------------- | -| cid | num | 案件id | 必要 | | -| vote | num | 投票类型 | 必要 | 见「[众裁信息](judgement_info.md)」中表 | -| content | str | 理由 | 非必要 | 见「[众裁信息](judgement_info.md)」中表 | -| likes | nums | 支持的观点 | 非必要 | | -| hates | nums | 反对的观点 | 非必要 | | -| attr | num | 是否匿名 | 非必要 | 0:匿名<br />1:不匿名 | -| apply_type | num | 是否更改原因 | 非必要 | 0:保持原来原因<br />1:投票给新原因 | -| origin_reason | num | 原始原因 | 非必要 | 见「封禁公示」中表 | -| apply_reason | num | 新原因 | 非必要 | 见「封禁公示」中表 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br/>-101:未登录<br />-111:csrf 错误<br />-400:请求错误(投票类型错误)<br />25005:不是风纪委员<br />25009: 案件不存在<br/>25011:投票类型错误<br />25012:重复投票 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | - -**示例:** - -为案件`2333`投票,建议封禁,无理由,不匿名,无支持/反对观点,不修改投票原因 - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/vote' \ ---data-urlencode 'cid=2333' \ ---data-urlencode 'vote=1' \ ---data-urlencode 'content=' \ ---data-urlencode 'likes=' \ ---data-urlencode 'hates=' \ ---data-urlencode 'attr=1' \ ---data-urlencode 'apply_type=0' \ ---data-urlencode 'origin_reason=' \ ---data-urlencode 'apply_reason=' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/vote' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'cid=2333' \ ---data-urlencode 'vote=1' \ ---data-urlencode 'content=' \ ---data-urlencode 'likes=' \ ---data-urlencode 'hates=' \ ---data-urlencode 'attr=1' \ ---data-urlencode 'apply_type=0' \ ---data-urlencode 'origin_reason=' \ ---data-urlencode 'apply_reason=' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> -</details> \ No newline at end of file diff --git a/docs/blackroom/jury/base_info.md b/docs/blackroom/jury/base_info.md deleted file mode 100644 index c86c9fc..0000000 --- a/docs/blackroom/jury/base_info.md +++ /dev/null @@ -1,331 +0,0 @@ -# 风纪委员会用户基本信息 - -## 基本数据 - -> https://api.bilibili.com/x/credit/v2/jury/jury - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 信息 | 默认为 0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | -------------------------------------------------------------------------------------------------- | -| allow_apply | bool | true | 尚不明确(用户从未担任风纪委员时也为 true) | -| apply_status | num | 任期审核状态 | -1 资格失效,且未申请<br />0 刚申请连任时<br />5 申请后,等待审核<br />3 申请连任成功,status 为 1 | -| case_total | num | 总众裁数 | | -| err_msg | str | 空 | 尚不明确 | -| face | str | 用户头像 url | | -| status | num | 当前资格状态 | 0 未曾拥有资格<br />1 任期内<br />2 资格失效 | -| term_end | num | 任期结束时间 | 时间戳(秒级),无任期时为 0 | -| uname | str | 用户昵称 | | - -## 基本数据(旧API) - -部分字段信息停留在 2021 年 10 月。 - -<details> -<summary>查看折叠内容:</summary> - -> https://api.bilibili.com/x/credit/jury/jury - -根数据与新 API 一致,`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------------- | ---------------------------- | -| caseTotal | num | 总众裁数 | | -| face | str | 用户头像 url | | -| restDays | num | 当前资格剩余天数 | 自 2021 年 10 月起,固定为 0 | -| rightRadio | num | 当前裁决正确率百分比 | 裁决数小于 3 时固定为 50 | -| status | num | 当前状态 | 1:具有资格<br />2:资格失效 | -| uname | str | 用户昵称 | | - -</details> - -## 统计信息 - -新API(2021年10月任期之后) - ->https://api.bilibili.com/x/credit/v2/jury/kpi - -*方式:GET* - -认证方式:Cookie - -**备注**:该api只收录2021年10月开始,风纪委员改版之后的数据,且每次只返回一次任期的数据。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------- | ------------ | -------------------------------------- | -| term_id | num | 任期 id | 可不传此参数或将值留空或设为`0` | 未传参或留空时,**只**返回最近一次已结束的任期的数据 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />25018:不能进行此操作(还没有成为新风纪委员,或传入了不属于你的`term_id`) | -| message | str | 信息 | 默认为 0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 项 | 类型 | 内容 | 备注 | -| --------------- | ------ | ------------------ | ------------------------------------------------------------ | -| mid | num | 用户 UID | | -| uname | str | 留空 | | -| face | str | 留空 | | -| term_id | num | 任期 ID | 未传入`term_id`时,返回的是最近一次已结束的任期的id | -| term_start | num | 任期开始时间 | 时间戳,精确到秒 | -| term_end | num | 任期结束时间 | 时间戳,精确到秒 | -| case_total | num | 任内总投票数 | | -| active_days | num | 活跃天数 | | -| like_num | num | 发表观点,被点赞数 | | -| accuracy_rate | num | 投中率 | 所选观点与大多数风纪委员一致,记为一次“投中” | -| pass | num | 任期是否合格 | 0 不合格<br />1 合格 | -| status | num | 当前资格状态 | 0 未曾拥有资格<br />1 任期内<br />2 资格失效 | -| apply_status | num | 当前资格申请状态 | -1 资格失效,且未申请<br />0 刚申请连任时<br />5 申请后,等待审核<br />3 申请连任成功,status 为 1 | -| prev_term_id | num | 上一任期的任期 ID | 新版风纪委员启用后的第一个任期,此项的值为 0 | -| next_term_id | num | 下一任期的任期 ID | 若当前任期尚未结束,此项的值为 0 | -| rewards | object | 任期奖励 | 有`pendant`和`coin`两个子项 | -| rewards.pendant | num | 头像挂件礼包 ID | 合格后一般为 1,不合格为 0 | -| rewards.coin | num | 硬币礼包 ID | 合格后一般为 3,不合格为 0 | - -<details> -<summary>查看响应示例:</summary> - -注:本示例未传入`term_id`,返回的是最近一次已结束任期的统计结果 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 10001, - "uname": "", - "face": "", - "term_id": 300009, - "term_start": 1669100000, - "term_end": 1671690000, - "case_total": 591, - "active_days": 30, - "like_num": 0, - "accuracy_rate": 74, - "pass": 1, - "status": 1, - "apply_status": 3, - "prev_term_id": 300007, - "next_term_id": 0, - "rewards": { - "pendant": 1, - "coin": 3 - } - } -} -``` -</details> - -## 统计信息(旧API) - -<details> -<summary>查看折叠内容:</summary> - -> https://api.bilibili.com/x/credit/jury/kpi - -*方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**备注**:该api只统计到2021年9月任期,风纪委员改版之前。风纪委员改版之后的数据未收录 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 数据本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 第1个月统计 | | -| n | obj | 第(n+1)个月统计 | | -| …… | obj | …… | …… | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------------------------- | --------------------- | -| id | num | 0 | | -| mid | num | 用户id | | -| number | num | 风纪委员编号 | | -| day | num | 数据生成时间(也是任期结束时间) | 时间戳,精确到秒 | -| rate | num | 任期完成度 | 1=A;2=S;3=S+;4=S++ | -| rank | num | 尚不明确 | | -| rankper | num | 尚不明确 | | -| rankTotal | num | 尚不明确 | | -| point | num | 32767 | | -| activeDays | num | 活跃天数 | | -| voteTotal | num | 投票总数 | | -| voteRadio | num | 投中率 | | -| blockedTotal | num | 尚不明确 | | -| termStart | num | 任期开始时间 | 时间戳,精确到秒 | -| termEnd | num | 任期结束时间(数据生成时间一致) | 时间戳,精确到秒 | -| opinion_likes | num | 观点获赞 | | - -**示例:** - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/credit/jury/kpi' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/kpi' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 0, - "mid": 114343368, - "number": 199046, - "day": 1539792000, - "rate": 1, - "rank": 0, - "rankper": 1, - "rankTotal": 39584, - "point": 32767, - "activeDays": 23, - "voteTotal": 422, - "voteRadio": 0, - "blockedTotal": 0, - "termStart": 1537200000, - "termEnd": 1539792000, - "opinion_likes": 18 - } - ] -} -``` - -</details> -</details> - -## 检查申请风纪委员会资格 - -> ~~https://api.bilibili.com/x/credit/jury/requirement~~ (旧版) - -> https://api.bilibili.com/x/credit/v2/jury/requirement (新版) - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -新版 api 与旧版的区别仅在新版没有 `level` 字段(新版风纪委员没有等级限制)。 - -只有用户~~会员等级≥Lv4、~~ 90 天内无违规、实名认证且非封禁状态才可以申请加入风纪委员会。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ------------------------------------- | -| blocked | bool | 是否被封禁 | true:是<br />false:否<br />**下同** | -| cert | bool | 是否实名认证 | | -| level | bool | 等级是否>=4 | 新版无该字段 | -| rule | bool | 是否90天内无违规 | | - -**示例:** - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/credit/v2/jury/requirement' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/v2/jury/requirement' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "blocked": false, - "cert": true, - "rule": true - } -} -``` - -</details> diff --git a/docs/blackroom/jury/judgement_info.md b/docs/blackroom/jury/judgement_info.md deleted file mode 100644 index 9b2d9d3..0000000 --- a/docs/blackroom/jury/judgement_info.md +++ /dev/null @@ -1,978 +0,0 @@ -# 众裁信息 - -## Enum类型代码 - -### 投票类型码总览 - -| 代码 | 含义 | -| ---- | --- | -| 0 | 未投票 | -| 1 | 封禁 | -| 2 | 否 | -| 3 | 弃权 | -| 4 | 删除 | - -### 投票选项码总览 - -<table> - <tr> - <th>任务类型</th> - <th>代码</th> - <th>含义</th> - </tr> - <tr> - <td rowspan="4">单条评论(弹幕)</td> - <td>1</td> - <td>合适</td> - </tr> - <tr> - <td>2</td> - <td>一般</td> - </tr> - <tr> - <td>3</td> - <td>不合适</td> - </tr> - <tr> - <td>4</td> - <td>无法判断</td> - </tr> - <tr> - <td rowspan="4">评论(弹幕)氛围</td> - <td>11</td> - <td>好</td> - </tr> - <tr> - <td>12</td> - <td>一般</td> - </tr> - <tr> - <td>13</td> - <td>差</td> - </tr> - <tr> - <td>14</td> - <td>无法判断</td> - </tr> -</table> - - - -## 获取单个案件信息 - -> https://api.bilibili.com/x/credit/v2/jury/case/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -可查询任意案件,无论自己是否参与投票。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------------ | ------ | ------------- | ------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| case_id | str | 案件id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 信息 | 默认为 0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ------ | -------------------------------- | -------------------------------------------------------------- | -| case_id | str | 案件id | | -| case_type | num | 任务类型 | 1:单条评论<br />2:评论氛围<br />3:单条弹幕<br />4:弹幕氛围 | -| jury_state | num | `1` | 改版后未见过其它值 | -| participate | num | 是否投票 | 0:未投票<br />1:已投票 | -| vote_items | object | 投票选项 | 见开头「投票选项码总览」 | -| default_vote | num | 默认投票选项 | `4` 或 `14` 即 `无法判断` | -| status | num | 裁决状态(新版) | 0:进行中<br />1:已结束 | -| origin_start | num | 案件关联视频,播放进度条起始坐标 | 单位:`秒` | -| avid | num | 视频av号 | | -| cid | num | 弹幕 dmid | | -| vote_cd | num | `-1` | 暂不明确 | -| result | num | 众议结论 | 见开头「投票选项码总览」 | -| result_text | str | 众议结论文本 | 见开头「投票选项码总览」 | -| title | str | 视频标题 | | -| case_info | object | 案件信息 | | -| my_point | object | 我的观点 | 仅自己投过票才有该字段 | -| vote_info | object | 投票信息 | | - -`data` 对象下的`case_info`对象 - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ------ | ------------ | ----------------------------------------------- | -| comment | object | 单条评论信息 | 仅当`case_type`为`1`有值。见「对象:评论信息」 | -| danmu_img | str | 弹幕截图 | 仅当`case_type`为`4`有值,截图URL | -| comments | object | 若干条评论 | 仅当`case_type`为`2`有值。见「对象:评论信息」 | -| single_danmu | str | 单条弹幕信息 | 仅当`case_type`为`3`有值。见「对象:评论信息)」 | - - -对象:评论信息 - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ------ | ------------------------ | -------------------------------------------------------------- | -| mid | num | 用户uid | | -| uname | str | 用户名 | | -| face | str | 用户头像 | 头像URL | -| content | str | 评论内容 | | -| child_comments | object | 子评论(对该评论的回复) | 见「对象:评论信息」,单条评论和子评论下无`child_comments`字段 | - - -对象:弹幕信息 - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------- | -| id_str | str | 弹幕dmid | | -| content | str | 弹幕内容 | | -| progress | num | | 尚不明确 | - -`data` 对象下的`my_point`对象 - -记录了自己的投票(观点)信息,仅当自己投过票才有该字段。 - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ------------------------------------------------------------ | -| opid | num | 观点编号 | 每当某个一个风纪委员给某个仲裁案件发表观点,就+1 | -| mid | num | 风纪委员用户ID | | -| uname | str | 风纪委员用户名 | 风纪委勾选匿名投票则显示“匿名用户” | -| face | str | 头像URL | 头像 | -| vote | num | 投票选项 | “合适题”分别为 `1` 或者 `2` 或者 `3` 或者 `4`,<br/>对应:“合适”、“一般”、“不合适”、“无法判断”<br/><br/>“氛围题”分别为 `11` 或者 `12` 或者 `13` 或者 `14`,<br/>对应:“好”、“一般”、“差”、“无法判断”<br/><br/>注释<br/>合适题:“单条弹幕(评论)是否合适?”<br/>氛围题:“弹幕(评论区)氛围如何” | -| vote_text | | 内容为空 | *现在系统已不再展示其他风纪委所投的票* | -| content | str | 观点内容 | 该风纪委员所发表的观点内容 | -| anonymous | num | 0 | 尚不明确 | -| like | num | 被点赞数量 | | -| hate | num | 被点踩数量 | | -| like_status | num | 点赞(踩)状态 | 本账号是否给该条评论点赞:<br/>0:没做操作;1:给评论点赞;2:给评论点踩 | -| vote_time | num | 投票时间 | 时间戳,精确到秒 | -| insiders | num | 是否观看此类视频 | 1:平时观看此类视频;0:平时不观看此类视频 | - -`data` 对象下的`vote_info`对象 - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | -------- | -------------------------------------------- | -| all_count | num | 总投票数 | | -| counts | array | 观点分布 | 格式:`[合适, 一般, 不合适, 无法判断]` | -| insiders_counts | array | 行为分布 | 格式:`[平时会看此类视频, 平时不看此类视频]` | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/info' \ - --data-urlencode 'case_id=AC2SiaD8jlrL' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "case_id": "AC2SiaD8jlrL", - "case_type": 3, - "jury_state": 1, - "participate": 1, - "vote_items": [ - { - "vote": 1, - "vote_text": "合适" - }, - { - "vote": 2, - "vote_text": "一般" - }, - { - "vote": 3, - "vote_text": "不合适" - }, - { - "vote": 4, - "vote_text": "无法判断" - } - ], - "default_vote": 4, - "status": 1, - "origin_start": 0, - "avid": 727792866, - "cid": 756815216, - "vote_cd": -1, - "result": 3, - "result_text": "不合适", - "title": "“国家队”守门员和朋友打赌,谁能在湿滑的地面踢进足球就送美刀", - "case_info": { - "comment": null, - "danmu_img": "", - "comments": null, - "single_danmu": { - "id_str": "1086612690354524160", - "content": "这守门员干啥呢?给块骨头我家狗都比他防的好", - "progress": 27859 - } - }, - "my_point": { - "opid": 10001, - "mid": 10001, - "uname": "风纪委员用户名", - "face": "http://i0.hdslb.com/bfs/face/e48952d599dbf011c2235239fafa2bf0deccef5a.jpg", - "vote": 3, - "vote_text": "不合适", - "content": "", - "anonymous": 0, - "like": 0, - "hate": 0, - "like_status": 0, - "vote_time": 1663655000, - "insiders": 1 - }, - "vote_info": { - "all_count": 306, - "counts": [90, 33, 177, 6], - "insiders_counts": [245, 61] - } - } -} -``` -</details> - -**旧 api:** - -<details> -<summary>查看旧 api:</summary> - -> https://api.bilibili.com/x/credit/jury/juryCase - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -只能查询自己参与众裁的 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------------ | ------ | ------------- | ------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| cid | num | 案件id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误<br />25010:没有权限查看案件 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | -------- | ------------ | -| id | num | 案件id | | -| mid | num | 被举报用户mid | | -| status | num | 裁决状态 | 1:投票中<br />2:停止发放<br />3:复核中(结案中)<br />4:已裁决<br />5:待重启<br />6:未裁决<br />7:冻结中<br />8:队列中 | -| statusTitle | str | 封禁时间文字 | `judgeType`=1时有效 | -| originType | num | 来源类型 | 见「封禁公示」中表 | -| reasonType | num | 原因类型 | 见「封禁公示」中表 | -| originContent | str | 被举报的原文 | | -| punishResult | num | 处理结果 | 0:无<br />1:封禁3天<br />2:封禁7天<br />3:永封<br />4:其他封禁天数<br />5:封禁15天<br />6:仅删除不封禁 | -| punishTitle | str | 处罚原因 | | -| judgeType | num | 裁决类型 | `status`=4时有效<br />0:未裁决<br/>1:违规<br/>2:不违规 | -| originUrl | str | 来源url | | -| blockedDays | num | 封禁时间 | `judgeType`=1时有效 | -| putTotal | num | ??? | 作用尚不明确 | -| voteRule | num | 投票不违规人数 | | -| voteBreak | num | 投票建议封禁人数 | | -| voteDelete | num | 投票建议删除人数 | | -| startTime | num | 裁决起始时间 | 时间戳 | -| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 | -| ctime | num | 举报创建时间 | 时间戳 | -| mtime | num | 开始拉取时间 | 时间戳 | -| originTitle | str | 来源标题 | | -| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} | -| face | str | 被举报用户头像url | | -| uname | str | 被举报用户昵称 | | -| vote | num | 我的投票 | **见上表** | -| case_type | num | 众裁类型 | 0:小众众裁<br />1:大众众裁 | - -**示例:** - -查询案件`1239790`的信息 - -Cookie方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ ---data-urlencode 'cid=1239790' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'cid=1239790' \ -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1239790, - "mid": 351783425, - "status": 4, - "statusTitle": "封禁7天", - "originType": 1, - "reasonType": 9, - "originContent": "up主,在和平精英里的喷子是霰(xian)弹枪,不是散(san)弹枪。", - "punishResult": 0, - "punishTitle": "在评论中发布引战言论", - "judgeType": 2, - "originUrl": "https://www.bilibili.com/video/BV15x411X7eV/#reply1728344012", - "blockedDays": 7, - "putTotal": 272, - "voteRule": 409, - "voteBreak": 17, - "voteDelete": 89, - "startTime": 1594467941, - "endTime": 1594471525, - "ctime": 1594464499, - "mtime": 1594471678, - "originTitle": "和平精英揭秘真相68:氪金试水最新抽奖活动,到底是亏了还是赚了?", - "relationId": "1728344012-1-57465308", - "face": "http://i2.hdslb.com/bfs/face/e1018566c615059b664dc6eae3a5235c31cd92fe.jpg", - "uname": "零酱a", - "vote": 4, - "case_type": 0 - } -} -``` - -</details> -</details> - -## 查询案件众裁信息 - -注:这是一个旧版的API,暂未找到对应的新版API。 -<details> -<summary>展开:</summary> -> https://api.bilibili.com/x/credit/jury/caseInfo - -*请求方式:GET* - -注:该接口无需登录 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ------ | ---- | -| cid | num | 案件id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | -------------------------------- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:object<br />无效时:null | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ----------------- | ------------------------------------------------------------ | -| id | num | 案件id | | -| mid | num | 被举报用户mid | | -| status | num | 裁决状态 | 1:投票中<br />2:停止发放<br />3:复核中(结案中)<br />4:已裁决<br />5:待重启<br />6:未裁决<br />7:冻结中<br />8:队列中 | -| originType | num | 来源类型 | 见「封禁公示」中表 | -| reasonType | num | 原因类型 | 见「封禁公示」中表 | -| originContent | str | 被举报的原文 | | -| punishResult | num | 处理结果 | 0:无<br />1:封禁3天<br />2:封禁7天<br />3:永封<br />4:其他封禁天数<br />5:封禁15天<br />6:仅删除不封禁 | -| judgeType | num | 裁决类型 | `status`=4时有效<br />0:未裁决<br/>1:违规<br/>2:不违规 | -| originUrl | str | 来源url | | -| blockedDays | num | 封禁时间 | `judgeType`=1时有效 | -| putTotal | num | ??? | 作用尚不明确 | -| voteRule | num | 投票不违规人数 | | -| voteBreak | num | 投票建议封禁人数 | | -| voteDelete | num | 投票建议删除人数 | | -| startTime | num | 裁决起始时间 | 时间戳 | -| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 | -| ctime | num | 举报创建时间 | 时间戳 | -| mtime | num | 开始拉取时间 | 时间戳 | -| originTitle | str | 来源标题 | | -| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} | -| face | str | 被举报用户头像url | | -| uname | str | 被举报用户昵称 | | -| vote | num | 0 | 固定为0 | -| case_type | num | 众裁类型 | 0:小众众裁<br />1:大众众裁 | - -**示例:** - -查询案件`1239790`的信息 - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/juryCase' \ ---data-urlencode 'cid=1239790' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1239790, - "mid": 351783425, - "status": 4, - "originType": 1, - "reasonType": 9, - "originContent": "up主,在和平精英里的喷子是霰(xian)弹枪,不是散(san)弹枪。", - "punishResult": 0, - "judgeType": 2, - "originUrl": "https://www.bilibili.com/video/BV15x411X7eV/#reply1728344012", - "blockedDays": 7, - "putTotal": 272, - "voteRule": 409, - "voteBreak": 17, - "voteDelete": 89, - "startTime": 1594467941, - "endTime": 1594471525, - "ctime": 1594464499, - "mtime": 1594471678, - "originTitle": "和平精英揭秘真相68:氪金试水最新抽奖活动,到底是亏了还是赚了?", - "relationId": "1728344012-1-57465308", - "face": "http://i2.hdslb.com/bfs/face/e1018566c615059b664dc6eae3a5235c31cd92fe.jpg", - "uname": "零酱a", - "vote": 0, - "case_type": 0 - } -} -``` -</details> -</details> - -## 查询我的众裁记录 - -> https://api.bilibili.com/x/credit/v2/jury/case/list - -*请求方式:GET* - -认证方式:Cookie - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | -------------------- | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页显示数量 | 非必要 | 默认为30<br />最大30 | - -**Headers参数** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| cookie | str | | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------ | ------------ | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | -| data.total | num | 仲裁案例数 | | -| data.list | array | 仲裁记录列表 | | - -`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ------ | --------------- | ------------ | -| 0 | object | 仲裁记录1 | | -| n | object | 仲裁记录(n+1) | 按照时间顺序 | -| …… | object | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ------------------------------------------------------------ | -| case_id | str | 案件id | | -| case_type | num | 案件类型 | 1:单条评论<br/>2:评论氛围<br/>3:单条弹幕<br/>4:弹幕氛围 | -| status | num | 裁决状态 | 0:投票中<br />1:已结束 | -| vote | num | 投票选项 | “单条评论(弹幕)”分别为 `1` 或者 `2` 或者 `3` 或者 `4`,<br/>对应:“合适”、“一般”、“不合适”、“无法判断”<br/><br/>“评论(弹幕)氛围”分别为 `11` 或者 `12` 或者 `13` 或者 `14`,<br/>对应:“好”、“一般”、“差”、“无法判断” | -| vote_text | str | 投票选项文本 | *参考上条* | -| vote_time | num | 投票时间 | 时间戳,精确到秒 | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "total": 5428, - "list": [ - { - "case_id": "AC2sOiNenwj1", - "case_type": 4, - "status": 1, - "vote": 11, - "vote_text": "好", - "vote_time": 1662700609 - } - ] - } -} -``` - -</details> - -## 查询案件众裁信息(旧 api) - -<details> -<summary>查看旧版API:</summary> - -> https://api.bilibili.com/x/credit/jury/caseList - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------------ | ------ | ------------- | ------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页显示数量 | 非必要 | 默认为30<br />最大30 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 仲裁记录列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ------ | --------------- | ------------ | -| 0 | object | 仲裁记录1 | | -| n | object | 仲裁记录(n+1) | 按照时间顺序 | -| …… | object | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ----------------- | ------------------------------------------------------------ | -| id | num | 案件id | | -| mid | num | 被举报用户mid | | -| status | num | 裁决状态 | 1:投票中<br />2:停止发放<br />3:复核中(结案中)<br />4:已裁决<br />5:待重启<br />6:未裁决<br />7:冻结中<br />8:队列中 | -| originType | num | 来源类型 | 见「封禁公示」中表 | -| reasonType | num | 原因类型 | 见「封禁公示」中表 | -| originContent | str | 被举报的原文 | | -| punishResult | num | 处理结果 | 0:无<br />1:封禁3天<br />2:封禁7天<br />3:永封<br />4:其他封禁天数<br />5:封禁15天<br />6:仅删除不封禁 | -| punishTitle | str | 处罚原因 | | -| judgeType | num | 裁决类型 | `status`=4时有效<br />0:未裁决<br/>1:违规<br/>2:不违规 | -| originUrl | str | 来源url | | -| blockedDays | num | 封禁时间 | `judgeType`=1时有效 | -| putTotal | num | ??? | 作用尚不明确 | -| voteRule | num | 投票不违规人数 | | -| voteBreak | num | 投票建议封禁人数 | | -| voteDelete | num | 投票建议删除人数 | | -| startTime | num | 裁决起始时间 | 时间戳 | -| endTime | num | 裁决截止时间 | 时间戳<br />未结案固定为24小时 | -| ctime | num | 举报创建时间 | 时间戳 | -| mtime | num | 开始拉取时间 | 时间戳 | -| originTitle | str | 来源标题 | | -| relationId | str | 违规关系标识字 | {评论rpid}-{违规类型id}-{来源对象id} | -| face | str | 被举报用户头像url | | -| uname | str | 被举报用户昵称 | | -| vote | num | 我的投票 | **见上表** | -| voteTime | num | 我的裁决时间 | 毫秒 时间戳 | -| case_type | num | 众裁类型 | 0:小众众裁<br />1:大众众裁 | - -**示例:** - -查询我的历史众裁,第1页,每页显示1个案件 - -Cookie方式: - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \ ---data-urlencode 'ps=1' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -APP方式: -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/caseList' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'ps=1' \ ---data-urlencode 'pn=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 1241808, - "mid": 298264370, - "status": 4, - "originType": 1, - "reasonType": 9, - "originContent": "别在发这种傻逼视频了好吗?真要搞到禁摩才甘心。", - "punishResult": 6, - "punishTitle": "在评论中发布引战言论", - "judgeType": 1, - "originUrl": "https://www.bilibili.com/video/av328669697/#reply3165369965", - "blockedDays": 7, - "putTotal": 251, - "voteRule": 14, - "voteBreak": 140, - "voteDelete": 373, - "startTime": 1594528662, - "endTime": 1594530687, - "ctime": 1594528108, - "mtime": 1594530802, - "originTitle": "我这里有记录仪!略略略略略略哈哈哈,干得漂亮!", - "relationId": "3165369965-1-328669697", - "face": "http://i1.hdslb.com/bfs/face/d69912bb2a51f08176bcdbf4ba15e4c2b0962ad9.jpg", - "uname": "MyLSTicKnight", - "vote": 4, - "voteTime": 1594528700000, - "case_type": 0 - } - ] -} -``` - -</details> -</details> - -## 获取众议观点 - -> https://api.bilibili.com/x/credit/v2/jury/case/opinion - -*请求方式:GET* - -认证方式:Cookie - -**标头参数(Headers):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ------ | ---- | -| Cookie | str | Cookie | 必要 | | - -**URL参数(Query Params):** - -| 参数名 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ------------------------------------------- | -| case_id | str | 仲裁案件id | **必填** | -| pn | num | | 显示第x页(default = 1) | -| ps | num | | 每页显示y条观点(Max = 20)(default = 10) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功;<br />-400:`ps`参数大于可允许的最大值`20` | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | object | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | -------------------------- | ---- | -| total | num | 当前案件众议观点总数 | | -| list | array | 无数据时是一个空数组:“[]” | | - -`data.list`对象是一个数组,里面包含`ps`个object(参数`ps`见上文,object结构见「[附表4](#附表4data-对象下的my_point对象)」) - -**示例:** - -查看案件`AC1xx411c7ac`的众议观点,每页`2`项,查看第`1`页 - -```shell -curl -G 'https://api.bilibili.com/x/credit/v2/jury/case/opinion' \ ---data-urlencode 'case_id=AC1xx411c7ac' \ ---data-urlencode 'pn=1' \ ---data-urlencode 'ps=2' \ ---header 'cookie: xxxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "total": 48, - "list": [ - { - "opid": 46087379, - "mid": 22006415, - "uname": "匿名用户", - "face": "http://i0.hdslb.com/bfs/face/e48952d599dbf011c2235239fafa2bf0deccef5a.jpg", - "vote": 11, - "vote_text": "", - "content": "正常评论", - "anonymous": 1, - "like": 0, - "hate": 0, - "like_status": 0, - "vote_time": 1661430391, - "insiders": 1 - }, - { - "opid": 46087280, - "mid": 19243907, - "uname": "匿名用户", - "face": "http://i0.hdslb.com/bfs/face/e85d7ab3425d3dd0f0796bd7f945b47ac27ca82a.jpg", - "vote": 11, - "vote_text": "", - "content": "并未发现明显问题。", - "anonymous": 1, - "like": 0, - "hate": 0, - "like_status": 0, - "vote_time": 1661430337, - "insiders": 0 - } - ] - } -} -``` - -</details> - -**旧 api** - -<details> -<summary>查看旧版API:</summary> - -> https://api.bilibili.com/x/credit/jury/case/opinion - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------------ | ------ | ------------- | ------------- | -| cid | num | 案件id | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为10 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 信息 | 默认为0 | -| ttl | num | 1 | | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | -------- | ------------ | -| count | num | 观点总数 | | -| opinion | 有效时:array<br />无效时:null | 观点列表 | | - -`data` 中的`opinion` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ------ | ----------- | ------------ | -| 0 | object | 观点1 | | -| n | object | 观点(n+1) | 按照时间顺序 | -| …… | object | …… | …… | - -`opinion` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | -------- | ------------ | -| mid | num | 用户mid | 仅非匿名有此项 | -| face | str | 用户头像 | 仅非匿名有此项 | -| name | str | 用户昵称 | 仅非匿名有此项 | -| opid | num | 观点id | | -| vote | num | 投票选择 | **见上表** | -| content | str | 观点内容 | | -| attr | num | 是否匿名 | 0:匿名<br />1:不匿名 | -| hate | num | 喜欢人数 | | -| like | num | 不喜欢人数 | | - -**示例:** - -查看案件`1239790`的众议观点,每页10项,查看第一页 - -```shell -curl -G 'https://api.bilibili.com/x/credit/jury/case/opinion' \ ---data-urlencode 'cid=1239790' \ ---data-urlencode 'ps=10' \ ---data-urlencode 'pn=1' \ -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 23, - "opinion": [ - { - "opid": 250943982, - "vote": 2, - "content": "不懂,正常的科普也有人杠吗?没文化真可怕", - "attr": 0, - "hate": 0, - "like": 0 - }, - { - "mid": 59894, - "face": "http://i2.hdslb.com/bfs/face/0cc48fc40867537d5a09a125e90f76183efbfdfa.gif", - "name": "雷歐諾斯", - "opid": 250956267, - "vote": 2, - "content": "这个虽然不是正确的说法,但本身是一种观点。而且已经成为一种梗了。不属于引战。", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "opid": 250956259, - "vote": 2, - "content": "正常科普,不构成引战。", - "attr": 0, - "hate": 0, - "like": 0 - }, - { - "mid": 215020429, - "face": "http://i1.hdslb.com/bfs/face/1d43c302e67db4d21b9c5c0f0dc0b8786e8086d5.jpg", - "name": "瞎子广_广告歌41", - "opid": 250955160, - "vote": 2, - "content": "这个其实也没啥事真的", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "mid": 108194360, - "face": "http://i0.hdslb.com/bfs/face/b78c92a69ff9977b7d08d4f7edc0a051a3d6ea3e.jpg", - "name": "籽云奕", - "opid": 250953998, - "vote": 2, - "content": "仅仅是科普评论,无过激言论", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "mid": 34503714, - "face": "http://i2.hdslb.com/bfs/face/eb2d0853235a56d035303f4f3614dcb6e0cf66fa.jpg", - "name": "十六夜紅月丶", - "opid": 250950982, - "vote": 2, - "content": "无过激言论,正常科普罢了", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "opid": 250950973, - "vote": 2, - "content": "其实两种读法都是正确的,虽然想要纠正别人的错误。不过自己本身就错了。还是保留吧,没什么引战的", - "attr": 0, - "hate": 0, - "like": 0 - }, - { - "mid": 436136443, - "face": "http://i1.hdslb.com/bfs/face/6b4151d8e030eddd073add6ef18ccbb00aa48d0f.jpg", - "name": "兄弟好牛啤", - "opid": 250950417, - "vote": 2, - "content": "有点经典的争议,但可能还会有人不知道", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "mid": 87385400, - "face": "http://i2.hdslb.com/bfs/face/0f567e7fa49bcef22010f3ff78e90553d8fffb09.jpg", - "name": "小学生de王者荣耀", - "opid": 250950402, - "vote": 2, - "content": "合理纠正up主的错误,建议追究恶意举报者的责任", - "attr": 1, - "hate": 0, - "like": 0 - }, - { - "opid": 250949840, - "vote": 2, - "content": "正常科普,没有过激言论,建议保留", - "attr": 0, - "hate": 0, - "like": 0 - } - ] - } -} -``` - -</details> -</details> diff --git a/docs/broadcast/readme.md b/docs/broadcast/readme.md deleted file mode 100644 index a99fedd..0000000 --- a/docs/broadcast/readme.md +++ /dev/null @@ -1,180 +0,0 @@ -# 全站广播 - -## 获取广播服务器地址 - -> https://api.bilibili.com/x/web-interface/broadcast/servers - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | --------------------------------- | -| platform | str | 平台选择 | 必要 | 为web时输出域名<br />其他时输出ip | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ------ | ------------------ | ---- | -| domain | str | 广播服务器url | | -| tcp_port | num | tcp端口 | | -| ws_port | num | websocket端口 | | -| wss_port | num | websocket ssl端口 | | -| heartbeat | num | 最大心跳包间隔时间 | | -| nodes | array | 服务节点地址列表 | | -| backoff | obj | ??? | | -| heartbeat_max | num | ??? | | - -`data`中的`nodes`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | str | 服务节点1 | | -| n | str | 服务节点(n+1) | | -| …… | str | …… | | - -`data`中的`backoff`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------ | ---- | -| max_delay | num | ??? | | -| base_delay | num | ??? | | -| factor | num | ??? | | -| jitter | num | ??? | | - -示例: - -当`platform`=`web`时,不显示节点ip - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \ ---data-urlencode 'platform=web' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "domain": "broadcast.chat.bilibili.com", - "tcp_port": 7821, - "ws_port": 7822, - "wss_port": 7823, - "heartbeat": 30, - "nodes": ["broadcast.chat.bilibili.com"], - "backoff": { - "max_delay": 300, - "base_delay": 3, - "factor": 1.8, - "jitter": 0.3 - }, - "heartbeat_max": 3 - } -} -``` - -</details> - -当`platform`=其他时,显示节点ip - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/broadcast/servers' \ ---data-urlencode 'platform=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "domain": "broadcast.chat.bilibili.com", - "tcp_port": 7821, - "ws_port": 7822, - "wss_port": 7823, - "heartbeat": 30, - "nodes": ["134.175.207.130", "120.92.150.90", "120.92.150.212", "192.144.173.136", "154.8.217.108"], - "backoff": { - "max_delay": 300, - "base_delay": 3, - "factor": 1.8, - "jitter": 0.3 - }, - "heartbeat_max": 3 - } -} -``` - -</details> - -## 服务器数据包 - -连接服务器分为三种方式,分别是ws wss tcp,数据包分为上行和下行 - -单个数据包分为头部和正文 - -其中上行的有认证包 心跳包,下行的有认证包回复 心跳包回复 普通包 - -建立连接后超过30s内未发送认证包,或握手后30s内未发送心跳包,或发送了错误的认证包,都会被强制断开连接 - -操作流程: - -1.发送认证包,等待接收认证回复 - -2.确认握手成功后,每30s内发送心跳包,并立即接收心跳包回复 - -3.空闲时间接收普通包 - -### 数据包结构 - -头部通用于上行和下行数据包 - -头部格式: - -| 偏移量 | 长度(字节) | 类型 | 含义 | -| ------ | ------------ | ------ | ---------------------------------------------------- | -| 0x00 | 4 | uint32 | 封包总大小(头部大小+正文大小) | -| 0x04 | 2 | uint16 | 头部大小(一般为0x0012,18字节) | -| 0x06 | 2 | uint16 | 协议版本,可取常数1 | -| 0x08 | 4 | uint32 | 操作码(包类型)<br />**见下表** | -| 0x0C | 4 | uint32 | sequence(请求次数),可取常数1<br />对于普通包恒为0 | -| 0x10 | 2 | uint16 | 保留,一般为0 | - -操作码: - -| 代码 | 含义 | -| ---- | -------- | -| 2 | 心跳 | -| 3 | 心跳回复 | -| 7 | 认证 | -| 8 | 认证回复 | -| 1000 | 实时弹幕 | - -**示例:** - -以下为一个认证包示例,正文为文本`test` - -``` -00000000 00 00 00 16 00 12 00 01 00 00 00 07 00 00 00 01 |................| -00000010 00 00 74 65 73 74 |..test| -``` - - diff --git a/docs/broadcast/video_room.md b/docs/broadcast/video_room.md deleted file mode 100644 index b0dd551..0000000 --- a/docs/broadcast/video_room.md +++ /dev/null @@ -1,144 +0,0 @@ -# 视频实时信息 - -## 认证包(上行) - -**正文内容json:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ------ | -------- | ------------------------------ | -| room_id | str | 目标视频 | `video://{稿件avid}/{视频cid}` | -| platform | str | 平台标识 | 默认为`web` | -| accepts | array | 操作标识 | | - -`array`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ------------ | -| 0 | num | 1000 | 作用尚不明确 | -| 1 | num | 1015 | 作用尚不明确 | - -**示例:** - -发送视频`av706`(1P的cid为` 3724723 `)的认证包 - -``` -00000000 00 00 00 55 00 12 00 01 00 00 00 07 00 00 00 01 |...U............| -00000010 00 00 7b 22 72 6f 6f 6d 5f 69 64 22 3a 22 76 69 |..{"room_id":"vi| -00000020 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 34 37 32 |deo://706/372472| -00000030 33 22 2c 22 70 6c 61 74 66 72 6f 6d 22 3a 22 77 |3","platfrom":"w| -00000040 65 62 22 2c 22 61 63 63 65 70 74 73 22 3a 5b 31 |eb","accepts":[1| -00000050 30 30 30 2c 31 30 31 35 5d 7d |000,1015]}| -``` - -## 认证包回复(下行) - -**正文内容json:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为OK | -| version | num | 版本号 | | - -示例: - -``` -00000000 00 00 00 37 00 12 00 01 00 00 00 08 00 00 00 01 |...7............| -00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes| -00000020 73 61 67 65 22 3a 22 4f 4b 22 2c 22 76 65 72 73 |sage":"OK","vers| -00000030 69 6f 6e 22 3a 31 7d |ion":1}| -``` - -## 心跳包(上行) - -正文可为任意内容或为空 - -**示例:** - -正文为空的示例 - -``` -00000000 00 00 00 12 00 12 00 01 00 00 00 02 00 00 00 01 |................| -00000010 00 00 |..| -``` - -正文为`[object Object]`的示例 - -``` -00000000 00 00 00 21 00 12 00 01 00 00 00 02 00 00 00 01 |...!............| -00000010 00 00 5b 6f 62 6a 65 63 74 20 4f 62 6a 65 63 74 |..[object Object| -00000020 5d |]| -``` - -## 心跳包回复(实时观看数)(下行) - -**正文内容json:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为OK | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | ---- | -| room | obj | 视频实时观看信息 | | - -`data`中的`room`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------ | ------------------------------ | -| online | num | 实时观看人数 | | -| room_id | str | 目标视频 | `video://{稿件avid}/{视频cid}` | - -**示例:** - -当前视频`av706`实时观看人数为13 - -``` -00000000 00 00 00 68 00 12 00 01 00 00 00 03 00 00 00 01 |...h............| -00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes| -00000020 73 61 67 65 22 3a 22 30 22 2c 22 64 61 74 61 22 |sage":"0","data"| -00000030 3a 7b 22 72 6f 6f 6d 22 3a 7b 22 6f 6e 6c 69 6e |:{"room":{"onlin| -00000040 65 22 3a 31 33 2c 22 72 6f 6f 6d 5f 69 64 22 3a |e":13,"room_id":| -00000050 22 76 69 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 |"video://706/372| -00000060 34 37 32 33 22 7d 7d 7d |4723"}}}| -``` - -## 普通包(实时弹幕)(下行) - -**正文内容json:** - -根数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ------------------------------------------------------------ | -| 0 | str | 弹幕属性信息 | 详见[「弹幕」中的属性 p](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/danmaku/danmaku_xml.md) | -| 1 | str | 弹幕内容 | | - -**示例:** - -弹幕属性为`0.25,1,25,16777215,1588433046,1588431486568150,0,33ad5d91,32134068443807747` - -弹幕内容为`此生无悔入东方,来世愿生幻想乡` - -``` -00000000 00 00 00 91 00 12 00 01 00 00 03 e8 00 00 00 00 |................| -00000010 00 00 5b 22 30 2e 32 35 2c 31 2c 32 35 2c 31 36 |..["0.25,1,25,16| -00000020 37 37 37 32 31 35 2c 31 35 38 38 34 33 33 30 34 |777215,158843304| -00000030 36 2c 31 35 38 38 34 33 31 34 38 36 35 36 38 31 |6,15884314865681| -00000040 35 30 2c 30 2c 33 33 61 64 35 64 39 31 2c 33 32 |50,0,33ad5d91,32| -00000050 31 33 34 30 36 38 34 34 33 38 30 37 37 34 37 22 |134068443807747"| -00000060 2c 22 e6 ad a4 e7 94 9f e6 97 a0 e6 82 94 e5 85 |,"此 生 无 悔| -00000070 a5 e4 b8 9c e6 96 b9 ef bc 8c e6 9d a5 e4 b8 96 |入 东 方 ,来 世 | -00000080 e6 84 bf e7 94 9f e5 b9 bb e6 83 b3 e4 b9 a1 22 |愿 生 幻 想 乡"| -00000090 5d |]| -``` diff --git a/docs/cheese/info.md b/docs/cheese/info.md deleted file mode 100644 index b3f0b89..0000000 --- a/docs/cheese/info.md +++ /dev/null @@ -1,640 +0,0 @@ -# 课程基本信息 - -课程ssid与epid和番剧不互通 - -课程avid与普通视频绝大部分api接口不能互通,少部分互通接口如下: - -1. 获取视频简介 -2. 查询视频状态数 -3. 查询分P列表 -4. 视频快照 -5. 获取弹幕(使用cid) -6. 发送弹幕 -7. 高能进度条(使用cid) - -## 获取课程基本信息 - -> https://api.bilibili.com/pugv/view/web/season - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:referer为 `.bilibili.com`域名下 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------------ | -------------------------------------------------- | -| season_id | num | 课程ssid | 必要(可选) | season_id与ep_id任选其一<br />**与番剧ssid不互通** | -| ep_id | num | 课程epid | 必要(可选) | season_id与ep_id任选其一<br />**与番剧epid不互通** | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------- | -| code | num | 返回值 | 0:成功<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ------ | ----------------------------- | ------------------------------------------------------------ | -| brief | obj | 课程概述信息 | | -| coupon | obj | 优惠信息 | 若无优惠则无此项 | -| cover | str | 课程封面url | | -| episode_page | obj | 课程分集信息 | | -| episode_sort | num | 1 | **作用尚不明确** | -| episodes | array | 课程分集列表 | | -| faq | obj | 常见问题信息1 | 合并格式 | -| faq1 | obj | 常见问题信息2 | 分离格式 | -| payment | obj | 付费信息 | | -| purchase_note | obj | 购买须知信息 | | -| purchase_protocol | obj | 付费内容协议信息 | | -| release_bottom_info | str | 底部更新状态文字 | | -| release_info | str | 更新状态文字+更新连载状态文字 | | -| release_info2 | str | 更新连载状态文字 | | -| release_status | str | 更新状态文字 | | -| season_id | num | 课程ssid | **与番剧ssid不互通** | -| share_url | str | 页面url | | -| short_link | str | bilibili uri链接 | | -| stat | obj | 播放数信息 | | -| status | num | 10 | **作用尚不明确** | -| subtitle | str | 课程简介信息 | | -| title | str | 课程标题 | | -| up_info | obj | UP主信息 | | -| user_status | obj | 用户状态信息 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`** | - -`data`中的`brief`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ---- | -| content | str | 空 | | -| img | array | 简介图片 | | -| title | str | 课程概述 | | -| type | num | 2 | | - -`brief`中的`img`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 简介图片1 | | -| n | obj | 简介图片(n+1) | | -| …… | obj | …… | …… | - -`img`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ----------- | ---------------- | -| aspect_ratio | num | ??? | **作用尚不明确** | -| url | str | 简介图片url | | - -`data`中的`coupon`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | --------- | ------------------- | -| amount | num | 折扣乘数 | | -| expire_time | str | 结束时间 | YYYY-MM-DD HH:MM:SS | -| start_time | str | 起始时间 | YYYY-MM-DD HH:MM:SS | -| status | num | ??? | **作用尚不明确** | -| title | str | 优惠标题 | | -| token | str | 领取token | | - -`data`中的`episode_page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---- | -| next | bool | false | | -| num | num | 1 | | -| size | num | 总计集数 | | -| total | num | 总计集数 | | - -`data`中的`episodes`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 课程分集1 | | -| n | obj | 课程分集(n+1) | | -| …… | obj | …… | …… | - -`episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------- | ------------------------------------------------------------ | -| aid | num | 课程分集avid | **与普通稿件avid部分不互通** | -| cid | num | 课程分集cid | **与普通视频cid部分不互通** | -| duration | num | 课程分集时间长度 | 单位为秒 | -| from | str | pugv | | -| id | num | 课程分集epid | **与番剧epid不互通** | -| index | num | 课程分集数 | | -| page | num | 1 | | -| play | num | 课程分集播放量 | | -| release_date | num | 课程分集发布时间 | 时间戳 | -| status | num | 分集权限属性 | 1:可观看<br />2:不可观看 | -| title | str | 课程分集标题 | | -| watched | bool | 是否观看该集 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`**<br />false:未观看<br />true:已观看 | -| watchedHistory | num | 该集观看历史 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`** | - -`data`中的`faq`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | --------------- | ---- | -| content | str | 常见问题信息 | | -| link | str | 常见问题页面url | | -| title | str | 常见问题 | | - -`data`中的`faq1`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ------------ | ---- | -| items | array | 常见问题列表 | | -| title | str | 常见问题 | | - -`faq1`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 常见问题1 | | -| n | obj | 常见问题(n+1) | | -| …… | obj | …… | …… | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| answer | str | 回答信息 | | -| question | str | 问题信息 | | - -`data`中的`payment`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------------------- | ----------------------- | -| desc | str | 付费价格说明 | | -| discount_desc | str | 折扣说明信息 | 若无优惠则无此项 | -| discount_prefix | str | 折扣类型前缀 | 若无优惠则无此项 | -| pay_shade | str | 观看所有视频付费说明 | | -| price | num | 课程价格 | 单位为B币(折扣后价格) | -| price_format | str | 课程价格 | 单位为B币折扣后价格) | - -`data`中的`purchase_note`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------------------- | ---- | -| content | str | 购买须知信息文字内容 | | -| link | str | 购买须知页面url | | -| title | str | 购买须知 | | - -`data`中的`purchase_protocol`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------------- | ---- | -| link | str | 付费内容协议页面url | | -| title | str | 付费内容协议 | | - -`data`中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------- | ---- | -| play | num | 播放量 | | -| play_desc | str | 播放量文字信息 | | - -`data`中的`up_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ------------------------------------------------------------ | -| avatar | str | UP主头像url | | -| brief | str | UP主备注 | 非个人签名 | -| follower | num | UP主粉丝数 | | -| is_follow | num | 是否关注UP主 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`**<br />0:未关注<br />1:已关注 | -| link | str | UP主空间url | | -| mid | num | UP主uid | | -| pendant | obj | ??? | **作用尚不明确** | -| uname | str | UP主昵称 | | - -`up_info`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---- | ---------------- | -| image | str | 空 | **作用尚不明确** | -| name | str | 空 | **作用尚不明确** | -| follower | num | 0 | **作用尚不明确** | - -`data`中的`user_status`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------- | ------------------------ | -| favored | num | 是否收藏 | 0:未收藏<br />1:已收藏 | -| favored_count | num | 1 | **作用尚不明确** | -| payed | num | 是否购买 | 0:未购买<br />1:已购买 | -| progress | obj | 课程进度 | 未登录无此项 | - -`user_status`中的`progress`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------ | -------- | -| last_ep_id | num | 最后观看的epid | | -| last_ep_index | str | 最后观看的标题 | | -| last_time | num | 最后观看的时间进度 | 单位为秒 | - -**示例:** - -查询课程`ss61`或分集`ep790`的信息 - -ssid方式: - -```shell -curl -G 'https://api.bilibili.com/pugv/view/web/season' \ ---data-urlencode 'season_id=61' \ --b 'SESSDATA=xxx' \ --e 'https://www.bilibili.com' -``` - -epid方式: - -```shell -curl -G 'https://api.bilibili.com/pugv/view/web/season' \ ---data-urlencode 'ep_id=790' \ --b 'SESSDATA=xxx' \ --e 'https://www.bilibili.com' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "brief": { - "content": "", - "img": [ - { - "aspect_ratio": 0.9375, - "url": "http://i0.hdslb.com/bfs/archive/29942f338ee570632838403a09871bad130cfe9a.jpg" - }, - { - "aspect_ratio": 0.9375, - "url": "http://i0.hdslb.com/bfs/archive/913e5c37d836d7954ae9ca19da62a43ba5b34219.jpg" - }, - { - "aspect_ratio": 1.3359375, - "url": "http://i0.hdslb.com/bfs/archive/a974555bd4a52f0aa865bd192c1e3401ed4cb0ad.jpg" - }, - { - "aspect_ratio": 1.3359375, - "url": "http://i0.hdslb.com/bfs/archive/73cd7669b251db9d2b62b921bee49a137c3d65dc.jpg" - }, - { - "aspect_ratio": 1.0625, - "url": "http://i0.hdslb.com/bfs/archive/b084ac8f6710c8eddbc58770a4254508de75eb02.jpg" - }, - { - "aspect_ratio": 1.2890625, - "url": "http://i0.hdslb.com/bfs/archive/44e32c2cf64b894563829ce65bbef199220f4121.jpg" - }, - { - "aspect_ratio": 1.3203125, - "url": "http://i0.hdslb.com/bfs/archive/90764fd095810565713b92606dc9cd0cfb25adae.jpg" - }, - { - "aspect_ratio": 1.15234375, - "url": "http://i0.hdslb.com/bfs/archive/c35ca0ced0ad075a2c13b8fdc1e47b88573bce45.jpg" - } - ], - "title": "课程概述", - "type": 2 - }, - "coupon": { - "amount": 0.66, - "expire_time": "2020-06-30 00:00:00", - "start_time": "2020-05-21 00:00:00", - "status": 1, - "title": "【上新限时6.6折】《唐盾:0-N4日语精讲》", - "token": "B20200521135929161905873" - }, - "cover": "http://i0.hdslb.com/bfs/archive/95d4de9e6691ccc2b18f087f5f654652dee3c01b.jpg", - "episode_page": { - "next": false, - "num": 1, - "size": 66, - "total": 66 - }, - "episode_sort": 1, - "episodes": [ - { - "aid": 76973173, - "cid": 132105993, - "duration": 2223, - "from": "pugv", - "id": 790, - "index": 1, - "page": 1, - "play": 2406406, - "release_date": 1574762407, - "status": 1, - "title": "唐盾:一起从0基础学日语吧(含50音 词汇试听)", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 77114885, - "cid": 132110244, - "duration": 3003, - "from": "pugv", - "id": 795, - "index": 2, - "page": 1, - "play": 49100, - "release_date": 1574766759, - "status": 2, - "title": "50音あ行假名/音调/送气与不送气音", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 77120689, - "cid": 131913553, - "duration": 3253, - "from": "pugv", - "id": 797, - "index": 3, - "page": 1, - "play": 49518, - "release_date": 1574770029, - "status": 2, - "title": "50音图的か行、さ行、た行假名", - "watched": false, - "watchedHistory": 0 - }, - ………… - ], - "faq": { - "content": "Q:课程在什么时间更新?\nA:课程更新频次以页面前端展示为准。购买成功后,课程更新将通过账号动态提示,方便及时观看。\n\nQ:课程购买后有收看时间限制吗?\nA:购买后除不可抗力因素外,课程均可永久收看,请您放心购买。\n\nQ:原价购买课程后,如遇到优惠折扣,是否可以退还差价或重新购买?\nA:虚拟商品付款后无法返还,请您随时留意各类课程折扣信息,按需购买。\n\nQ:购买课程后是否可以加入老师的粉丝群或者用户群?\nA:如老师设置用户群,我们将邀您加入,但我们无法承诺所有老师均提供用户群服务,感谢理解。", - "link": "http://m.bilibili.com", - "title": "常见问题" - }, - "faq1": { - "items": [ - { - "answer": "课程更新频次以页面前端展示为准。购买成功后,课程更新将通过账号动态提示,方便及时观看。", - "question": "课程在什么时间更新?" - }, - { - "answer": "购买后除不可抗力因素外,课程均可永久收看,请您放心购买。", - "question": "课程购买后有收看时间限制吗?" - }, - { - "answer": "虚拟商品付款后无法返还,请您随时留意各类课程折扣信息,按需购买。", - "question": "原价购买课程后,如遇到优惠折扣,是否可以退还差价或重新购买?" - }, - { - "answer": "如老师设置用户群,我们将邀您加入,但我们无法承诺所有老师均提供用户群服务,感谢理解。", - "question": "购买课程后是否可以加入老师的粉丝群或者用户群?" - } - ], - "title": "常见问题" - }, - "payment": { - "desc": "券后 262.68 B币起/53期", - "discount_desc": "262.68 B币", - "discount_prefix": "券后", - "pay_shade": "券后支付 262.68 B币即可观看所有视频", - "price": 398.0, - "price_format": "398" - }, - "purchase_note": { - "content": "1. 本内容为付费内容,购买成功后方可观看。<br/>2. 本内容为虚拟服务,已购买内容不支持退款,敬请谅解。<br/>3. 实际购买价格以页面展示的价格及订单结算页显示价格为准。<br/>4. 如您在购买付费内容时有任何疑问,可随时咨询在线客服。<br/>完整的购买协议,请点击阅读<a href=\"https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html\" color=\"#0ba395\" target=\"_blank\">《bilibili付费内容购买协议》</a>", - "link": "https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html", - "title": "购买须知" - }, - "purchase_protocol": { - "link": "https://www.bilibili.com/blackboard/activity-y-SJTTYBp.html", - "title": "bilibili付费内容购买协议" - }, - "release_bottom_info": "没有更多啦~", - "release_info": "已完结,共53期", - "release_info2": "共53期", - "release_status": "已完结", - "season_id": 61, - "share_url": "https://m.bilibili.com/cheese/play/ss61", - "short_link": "bilibili://cheese/season/61", - "stat": { - "play": 2878146, - "play_desc": "287.8万播放" - }, - "status": 10, - "subtitle": "新东方名师唐盾的精品日语课,包含50音/N5/N4的词汇/语法/课文/练习精讲,让我们一起轻松学日语~", - "title": "唐盾:0-N4日语精讲", - "up_info": { - "avatar": "http://i1.hdslb.com/bfs/face/564421428d1f74314ed50e16a8f570ad968828b0.jpg", - "brief": "唐盾:前新东方日语名师,倾注日语教学、翻译14年。曾任新东方欧亚教育长沙中心总监。", - "follower": 21333, - "is_follow": 0, - "link": "https://space.bilibili.com/19452605", - "mid": 19452605, - "pendant": { - "image": "", - "name": "", - "pid": 0 - }, - "uname": "盾盾桑教你学日语" - }, - "user_status": { - "favored": 1, - "favored_count": 1, - "payed": 0, - "progress": { - "last_ep_id": 790, - "last_ep_index": "唐盾:一起从0基础学日语吧(含50音 词汇试听)", - "last_time": 1 - } - } - }, - "message": "success" -} -``` - -</details> - -## 获取课程分集列表 - -> https://api.bilibili.com/pugv/view/web/ep/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:referer为 `.bilibili.com`域名下 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | -------------------- | -| season_id | num | 课程ssid | 必要 | **与番剧ssid不互通** | -| ps | num | 每页项数 | 非必要 | 默认为50 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------- | -| code | num | 返回值 | 0:成功<br />-404:错误 | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ------------ | ---- | -| items | array | 课程分集列表 | | -| page | obj | 列表分页信息 | | - -`data`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 课程分集1 | | -| n | obj | 课程分集(n+1) | | -| …… | obj | …… | …… | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------- | ------------------------------------------------------------ | -| aid | num | 课程分集avid | **与普通稿件avid部分不互通** | -| cid | num | 课程分集cid | **与普通视频cid部分不互通** | -| duration | num | 课程分集时间长度 | 单位为秒 | -| from | str | pugv | | -| id | num | 课程分集epid | **与番剧epid不互通** | -| index | num | 课程分集数 | | -| page | num | 1 | | -| play | num | 课程分集播放量 | | -| release_date | num | 课程分集发布时间 | 时间戳 | -| status | num | 分集权限属性 | 1:可观看<br />2:不可观看 | -| title | str | 课程分集标题 | | -| watched | bool | 是否观看该集 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`**<br />false:未观看<br />true:已观看 | -| watchedHistory | num | 该集观看历史 | **需要登录(SESSDATA)且referer为`https://www.bilibili.com`** | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------- | ----------------------------------------- | -| next | bool | 是否存在下一页 | false:不存在下一页<br />true:存在下一页 | -| num | num | 当前页码 | | -| size | num | 每页项数 | | -| total | num | 总价项数 | | - -**示例:** - -按照每页5项查询课程`ss61`的分集列表第1页 - -```shell -curl -G 'https://api.bilibili.com/pugv/view/web/ep/list' \ ---data-urlencode 'season_id=61' \ ---data-urlencode 'ps=5 ' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' \ --e 'https://www.bilibili.com' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "items": [ - { - "aid": 76973173, - "cid": 132105993, - "duration": 2223, - "from": "pugv", - "id": 790, - "index": 1, - "page": 1, - "play": 2406951, - "release_date": 1574762407, - "status": 1, - "title": "唐盾:一起从0基础学日语吧(含50音 词汇试听)", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 77114885, - "cid": 132110244, - "duration": 3003, - "from": "pugv", - "id": 795, - "index": 2, - "page": 1, - "play": 49106, - "release_date": 1574766759, - "status": 2, - "title": "50音あ行假名/音调/送气与不送气音", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 77120689, - "cid": 131913553, - "duration": 3253, - "from": "pugv", - "id": 797, - "index": 3, - "page": 1, - "play": 49522, - "release_date": 1574770029, - "status": 2, - "title": "50音图的か行、さ行、た行假名", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 77606110, - "cid": 132897199, - "duration": 2823, - "from": "pugv", - "id": 806, - "index": 4, - "page": 1, - "play": 35800, - "release_date": 1575128696, - "status": 2, - "title": "50音图的な行、は行、ま行假名", - "watched": false, - "watchedHistory": 0 - }, - { - "aid": 78015255, - "cid": 133651764, - "duration": 2165, - "from": "pugv", - "id": 812, - "index": 5, - "page": 1, - "play": 25842, - "release_date": 1575446218, - "status": 2, - "title": "や行、ら行、わ行假名、拨音", - "watched": false, - "watchedHistory": 0 - } - ], - "page": { - "next": true, - "num": 1, - "size": 5, - "total": 66 - } - }, - "message": "success" -} -``` - -</details> diff --git a/docs/cheese/videostream_url.md b/docs/cheese/videostream_url.md deleted file mode 100644 index fee29dd..0000000 --- a/docs/cheese/videostream_url.md +++ /dev/null @@ -1,222 +0,0 @@ -# 课程视频流URL - -<img src="../../assets/img/download.svg" width="100" height="100"/> - -## 获取课程视频流URL(web端) - -> https://api.bilibili.com/pugv/player/web/playurl - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**注:** - -1. 本接口为课程视频专用,故与普通视频不互通 -2. 大部分使用方法及视频的取流方法继承[视频流url文档](../video/videostream_url.md) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------------- | ------ | ------------------------------------------------------------ | -| avid | num | 课程avid | 必要 | | -| ep_id | num | 课程epid | 必要 | | -| cid | num | 视频cid | 必要 | | -| qn | num | 视频清晰度选择 | 非必要 | 参考[qn定义](../video/videostream_url.md#qn视频清晰度标识) | -| fnver | num | 视频流版本 | 非必要 | 参考[fnver定义](../video/videostream_url.md#fnver视频流版本标识) | -| fnval | num | 视频流类型 | 非必要 | 参考[fnval定义](../video/videostream_url.md#fnval视频流格式标识) | -| fourk | num | 是否允许4K视频 | 非必要 | 默认为0<br />画质最高1080P:0<br />画质最高4K:1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 <br />-400:请求错误<br />-404:无视频<br />-403:权限不足(未购买) | -| message | str | 错误信息 | 默认为success | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ------ | ---------------------- | ---------------------------------------- | -| accept_format | str | 视频支持的分辨率的格式 | | -| code | num | 0 | | -| durl | array | 视频分段 | | -| seek_param | str | start | | -| no_rexcode | num | 0 | | -| format | str | 视频格式 | | -| fnval | num | 0 | | -| video_project | bool | true | | -| fnver | num | 0 | | -| message | str | 空 | | -| type | str | 视频格式 | | -| accept_quality | array | 视频支持的分辨率列表 | | -| quality | num | 视频分辨率代码 | **值含义见上表** | -| timelength | num | 视频长度 | 单位为毫秒<br />不同分辨率可能有略微差异 | -| result | str | suee | **作用尚不明确** | -| seek_type | str | offset | **作用尚不明确** | -| has_paid | bool | false | **作用尚不明确** | -| supportFormats | array | 视频分辨率详细列表 | | -| from | str | local | **作用尚不明确** | -| video_codecid | num | ??? | **作用尚不明确** | -| accept_description | array | 视频支持的分辨率列表 | | -| status | num | 0 | **作用尚不明确** | - -`data`中的`durl`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 视频分段1信息 | | -| n | obj | 视频分段(n+1)信息 | | -| …… | obj | …… | | - -`durl`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------ | ------------ | ---------------------------------- | -| size | num | 视频大小 | 单位为Byte | -| ahead | str | 空 | 作用尚不明确 | -| length | num | 视频长度 | 单位为毫秒 | -| vhead | str | 空 | 作用尚不明确 | -| backup_url | array | 备用视频流 | | -| url | str | 视频流url | 链接有效时间为120min | -| order | num | 视频分段序号 | 某些视频会分为多个片段 | - -`durl`数组中的对象中的`backup_url`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------- | -| 0 | str | 备用视频流url | 有效时间为120min | - -`data`中的`supportFormats`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---- | -| 0 | obj | 分辨率详细信息1 | | -| n | obj | 分辨率详细信息(n+1) | | -| …… | obj | …… | …… | - -`supportFormats`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------- | ---- | -| format | str | 分辨率名称 | | -| description | atr | 分辨率备注 | | -| quality | num | 分辨率代码 | | - -`data`中的`accept_description`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 分辨率名称1 | | -| n | str | 分辨率名称(n+1) | | -| …… | str | …… | …… | - -**示例:** - -获取课程`ep790`(cid=`132105993`,avid=`76973173`)的视频流url,清晰度为1080P60 - -```shell -curl -G 'https://api.bilibili.com/pugv/player/web/playurl' \ ---data-urlencode 'ep_id=790' \ ---data-urlencode 'avid=76973173' \ ---data-urlencode 'cid=132105993' \ ---data-urlencode 'qn=116' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "accept_format": "flv_p60,flv720_p60,flv,flv720,flv480,flv360", - "code": 0, - "durl": [ - { - "size": 1105854161, - "ahead": "", - "length": 2222204, - "vhead": "", - "backup_url": [ - "https://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/93/59/132105993/132105993_da2-1-116.flv?e=ig8euxZM2rNcNbNghzTBhwdlhbNz7bUVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1591596728&gen=playurl&os=ks3cbv&oi=606633803&trid=76bea9a9e56f4cb89a9aff2f8213c9acu&platform=pc&upsig=b271bf493bff32ffe62969582c8d18b4&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=1,2&logo=40000000" - ], - "url": "https://upos-sz-mirrorks3.bilivideo.com/upgcxcode/93/59/132105993/132105993_da2-1-116.flv?e=ig8euxZM2rNcNbNghzTBhwdlhbNz7bUVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1591596728&gen=playurl&os=ks3bv&oi=606633803&trid=76bea9a9e56f4cb89a9aff2f8213c9acu&platform=pc&upsig=6a8ae3711bd0bb2a484ec2427d659b14&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=0&orderid=0,2&logo=80000000", - "order": 1, - "md5": "" - } - ], - "seek_param": "start", - "no_rexcode": 0, - "format": "flv_p60", - "fnval": 0, - "video_project": true, - "fnver": 0, - "message": "", - "type": "FLV", - "accept_quality": [ - 116, - 74, - 80, - 64, - 32, - 16 - ], - "quality": 116, - "timelength": 2222204, - "result": "suee", - "seek_type": "offset", - "has_paid": false, - "supportFormats": [ - { - "format": "flv_p60", - "description": "高清 1080P60", - "quality": 116 - }, - { - "format": "flv720_p60", - "description": "高清 720P60", - "quality": 74 - }, - { - "format": "flv", - "description": "高清 1080P", - "quality": 80 - }, - { - "format": "flv720", - "description": "高清 720P", - "quality": 64 - }, - { - "format": "flv480", - "description": "清晰 480P", - "quality": 32 - }, - { - "format": "flv360", - "description": "流畅 360P", - "quality": 16 - } - ], - "from": "local", - "video_codecid": 7, - "accept_description": [ - "高清 1080P60", - "高清 720P60", - "高清 1080P", - "高清 720P", - "清晰 480P", - "流畅 360P" - ], - "status": 0 - }, - "message": "success" -} -``` - -</details> \ No newline at end of file diff --git a/docs/clientinfo/ip.md b/docs/clientinfo/ip.md deleted file mode 100644 index a767cff..0000000 --- a/docs/clientinfo/ip.md +++ /dev/null @@ -1,157 +0,0 @@ -# 通过ip确定地理位置 - -## 根据请求IP确定属地 - -> https://api.bilibili.com/x/web-interface/zone -> -> https://api.live.bilibili.com/xlive/web-room/v1/index/getIpInfo -> -> https://app.bilibili.com/x/resource/ip - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------- | ------------ | -| addr | str | 公网IP地址 | | -| country | str | 国家/地区名 | | -| province | str | 省/州 | 非必须存在项 | -| city | str | 城市 | 非必须存在项 | -| isp | str | 运营商名 | | -| latitude | num | 纬度 | | -| longitude | num | 经度 | | -| zone_id | num | ip数据库id | 第二个接口无 | -| country_code | num | 国家/地区代码 | 第二个接口无 | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/web-interface/zone' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "addr":"36.40.120.145", - "country":"中国", - "province":"陕西", - "city":"渭南", - "isp":"电信", - "latitude":34.4995, - "longitude":109.492821, - "zone_id":4472912, - "country_code":86 - } -} -``` - -</details> - -## 查询任意 IP 地址的归属地 - -> https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr -> https://api.live.bilibili.com/client/v1/Ip/getInfoNew - -注: 以上接口等效 - -*请求方式:GET* - -**URL参数:** - - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| ip | str | IP地址 | 不必要 | IPv4或IPv6地址不限, 留空与[根据请求IP确定地理位置](#根据请求ip确定地理位置)基本相同 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为空 | -| msg | str | 错误信息 | 同message | -| data | obj | 信息本体 | 出错时为空数组 | - -`data`对象: - -与[根据请求IP确定地理位置](#根据请求ip确定地理位置)回复的`data`对象基本相同, 但无 `zone_id` `country_code` 字段 - -**示例:** - -查询请求IP地址的归属地: - -```shell -curl -G 'https://api.live.bilibili.com/client/v1/Ip/getInfoNew' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "addr": "104.28.156.113", - "country": "新加坡", - "province": "新加坡", - "city": "", - "isp": "cloudflare.com", - "latitude": "1.352083", - "longitude": "103.819836" - } -} -``` - -</details> - -查询IP地址`8.8.8.8`的归属地: - -```shell -curl -G 'https://api.live.bilibili.com/ip_service/v1/ip_service/get_ip_addr' \ ---data-urlencode 'ip=8.8.8.8' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "addr": "8.8.8.8", - "country": "GOOGLE.COM", - "province": "GOOGLE.COM", - "city": "", - "isp": "level3.com", - "latitude": "", - "longitude": "" - } -} -``` - -</details> diff --git a/docs/comment/action.md b/docs/comment/action.md deleted file mode 100644 index a0f4823..0000000 --- a/docs/comment/action.md +++ /dev/null @@ -1,535 +0,0 @@ -# 评论区操作 - -## 发表评论 - -> https://api.bilibili.com/x/v2/reply/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| root | num | 根评论rpid | 非必要 | 二级评论以上使用 | -| parent | num | 父评论rpid | 非必要 | 二级评论同根评论id<br />大于二级评论为要回复的评论id | -| message | str | 发送评论内容 | 必要 | 最大1000字符<br />表情使用表情转义符 | -| plat | num | 发送平台标识 | 非必要 | 1:web端<br />2:安卓客户端<br />3:ios客户端<br />4:wp客户端<br />默认为1 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- |-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />-509:请求过于频繁<br />12001:已经存在评论主题<br />12002:评论区已关闭<br />12003:禁止回复<br />12006:没有该评论<br />12009:评论主体的type不合法<br />12015:需要评论验证码<br />12016:评论内容包含敏感信息<br />12025:评论字数过多<br />12035:该账号被UP主列入评论黑名单<br />12051:重复评论,请勿刷屏<br />12052:评论区已关闭<br />12045:购买后即可发表评论<br/>**(其他错误码有待补充)** | -| message | str | 错误信息 | <br /> | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----------------------------- | -------------- | ------------------------------------------------------------ | -| success_action | num | 0 | **作用尚不明确** | -| success_toast | str | 状态文字 | | -| need_captcha | bool | false | 评论需要验证码(未证实) | -| url | str | 空 | **作用尚不明确** | -| rpid | num | 评论rpid | | -| rpid_str | str | 评论rpid | 字串格式 | -| dialog | num | 回复对方rpid | 若为一级评论则为0<br />若为二级评论则为该评论id<br />大于二级评论为上一级评论id | -| dialog_str | str | 回复对方rpid | 字串格式 | -| root | num | 根评论rpid | 若为一级评论则为0<br />大于一级评论则为根评论id | -| root_str | str | 根评论rpid | 字串格式 | -| parent | num | 回复父评论rpid | 若为一级评论则为0<br />若为二级评论则为根评论id<br />大于二级评论为上一级评论id | -| parent_str | str | 回复父评论rpid | 字串格式 | -| emote | obj | 表情转义符信息 | [对象定义见表](readme.md#评论条目对象) | -| reply | 有效时:obj<br />无效时:null | | [对象定义见表](readme.md#评论条目对象) | - -**示例:** - -给视频`av243322853`发送内容为`测试test[泠鸢yousa_awsl]`的评论(带有表情转义符),平台标识为1(web端) - -```shell -curl 'https://api.bilibili.com/x/v2/reply/add' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=243322853' \ ---data-urlencode 'message=测试test[泠鸢yousa_awsl]' \ ---data-urlencode 'plat=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "success_action": 0, - "success_toast": "发送成功", - "need_captcha": false, - "url": "", - "rpid": 3043212039, - "rpid_str": "3043212039", - "dialog": 0, - "dialog_str": "0", - "root": 0, - "root_str": "0", - "parent": 0, - "parent_str": "0", - "emote": { - "[泠鸢yousa_awsl]": { - "id": 2086, - "package_id": 93, - "state": 0, - "type": 3, - "attr": 0, - "text": "[泠鸢yousa_awsl]", - "url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png", - "meta": { - "size": 2 - }, - "mtime": 1589776042 - } - }, - "reply": { - "rpid": 3043212039, - "oid": 243322853, - "type": 1, - "mid": 293793435, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592233764, - "rpid_str": "3043212039", - "root_str": "0", - "parent_str": "0", - "like": 0, - "action": 0, - "member": { - "mid": "293793435", - "uname": "社会易姐QwQ", - "sex": "男", - "sign": "高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨", - "avatar": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "rank": "10000", - "DisplayRank": "0", - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 1888, - "name": "泠鸢yousa", - "image": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1612454400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip" - } - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 1888, - "name": "泠鸢yousa", - "image": "http://i0.hdslb.com/bfs/garb/item/3e66e712b8e70c6b02393c54ad5fd8d993eb39f9.png", - "jump_url": "", - "type": "suit" - }, - "cardbg": null, - "cardbg_with_focus": null - } - }, - "content": { - "message": "测试test[泠鸢yousa_awsl]", - "plat": 1, - "device": "", - "members": [], - "emote": { - "[泠鸢yousa_awsl]": { - "id": 2086, - "package_id": 93, - "state": 0, - "type": 3, - "attr": 0, - "text": "[泠鸢yousa_awsl]", - "url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png", - "meta": { - "size": 2 - }, - "mtime": 1589776042 - } - }, - "jump_url": {}, - "max_line": 0 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false - } - } -} -``` - -</details> - -## 点赞评论 - -> https://api.bilibili.com/x/v2/reply/action - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -点赞成功后会同时消去该评论的点踩 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| rpid | num | 目标评论rpid | 必要 | | -| action | num | 操作代码 | 非必要 | 默认为0<br />0:取消赞<br />1:点赞 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12004:禁止操作 赞或踩<br />12006:没有该评论<br />12009:评论主体的type不合法<br />12011:不合法的赞或踩<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -点赞视频`av243322853`下评论`rpid=3039053308` - -```shell -curl 'https://api.bilibili.com/x/v2/reply/action' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=243322853' \ ---data-urlencode 'rpid=3039053308' \ ---data-urlencode 'action=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 点踩评论 - -> https://api.bilibili.com/x/v2/reply/hate - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -点踩成功后会同时消去该评论的点赞 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| rpid | num | 目标评论rpid | 必要 | | -| action | num | 操作代码 | 非必要 | 默认为0<br />0:取消踩<br />1:点踩 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12004:禁止操作 赞或踩<br />12006:没有该评论<br />12009:评论主体的type不合法<br />12011:不合法的赞或踩<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -点踩视频`av243322853`下评论`rpid=3039053308` - -```shell -curl 'https://api.bilibili.com/x/v2/reply/hate' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=243322853' \ ---data-urlencode 'rpid=3039053308' \ ---data-urlencode 'action=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 删除评论 - -> https://api.bilibili.com/x/v2/reply/del - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -只能删除自己的评论,或自己管理的评论区下的评论 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| rpid | num | 目标评论rpid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-403:权限不足<br />-404:无此项<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12009:评论主体的type不合法<br />12022:已经被删除了<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | **作用尚不明确** | - -**示例:** - -删除`av243322853`下评论`rpid=3039053308` - -```shell -curl 'https://api.bilibili.com/x/v2/reply/del' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=243322853' \ ---data-urlencode 'rpid=3039053308' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 置顶评论 - -> https://api.bilibili.com/x/v2/reply/top - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -只能置顶自己管理的评论区中的一级评论 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| rpid | num | 目标评论rpid | 必要 | | -| action | num | 操作代码 | 非必要 | 默认为0<br />0:取消置顶<br />1:设为置顶 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-403:权限不足<br />-404:无此项<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12006:没有该评论<br />12009:评论主体的type不合法<br />12029:已经有置顶评论<br />12030:不能置顶非一级评论<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -置顶视频`av243322853`下评论`rpid=2940645593` - -```shell -curl 'https://api.bilibili.com/x/v2/reply/top' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=243322853' \ ---data-urlencode 'rpid=2940645593' \ ---data-urlencode 'action=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 举报评论 - -> https://api.bilibili.com/x/v2/reply/report - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区id | 必要 | | -| rpid | num | 目标评论rpid | 必要 | | -| reason | num | 举报类型 | 必要 | **类型代码见下表** | -| content | str | 其他举报备注 | 非必要 | `reason=0`时有效 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -举报类型`reason`: - -| 代码 | 含义 | -| ---- | -------------- | -| 0 | 其他 | -| 1 | 垃圾广告 | -| 2 | 色情 | -| 3 | 刷屏 | -| 4 | 引战 | -| 5 | 剧透 | -| 6 | 政治 | -| 7 | 人身攻击 | -| 8 | 内容不相关 | -| 9 | 违法违规 | -| 10 | 低俗 | -| 11 | 非法网站 | -| 12 | 赌博诈骗 | -| 13 | 传播不实信息 | -| 14 | 怂恿教唆信息 | -| 15 | 侵犯隐私 | -| 16 | 抢楼 | -| 17 | 青少年不良信息 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-403:权限不足<br />-404:无此项<br />-500:服务器错误<br />-509:请求过于频繁<br />12002:评论区已关闭<br />12006:没有该评论<br />12008:已经举报过了<br />12009:评论主体的type不合法<br />12019:举报过于频繁<br />12077:其他举报理由过长或过短<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -举报视频` av752881391 `下评论`rpid=3062537442`,理由是`引战` - -```shell -curl 'https://api.bilibili.com/x/v2/reply/report' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=752881391' \ ---data-urlencode 'rpid=3062537442' \ ---data-urlencode 'reason=4' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/comment/list.md b/docs/comment/list.md deleted file mode 100644 index e371a4e..0000000 --- a/docs/comment/list.md +++ /dev/null @@ -1,3722 +0,0 @@ -# 评论区明细 - -## 获取评论区明细_翻页加载 - -> https://api.bilibili.com/x/v2/reply - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | -------------------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | -| oid | num | 目标评论区 id | 必要 | | -| sort | num | 排序方式 | 非必要 | 默认为0<br />0:按时间<br />1:按点赞数<br />2:按回复数 | -| nohot | num | 是否不显示热评 | 非必要 | 默认为0<br />1:不显示<br />0:显示 | -| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-20 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12002:评论区已关闭<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | -------------------------------- | -------- | ---------------- | -| page | obj | 页信息 | | -| config | obj | 评论区显示控制 | | -| replies | 禁用时:null<br />正常时:array | 评论列表 | | -| hots | 禁用时:null<br />正常时:array | 热评列表 | | -| upper | obj | 置顶评论 | | -| top | null | (?) | | -| notice | 无效时:null<br />有效时:obj | 评论区公告信息 | | -| vote | num | 投票评论? | | -| blacklist | num | (?) | | -| assist | num | (?) | | -| mode | num | 评论区类型id | | -| support_mode | array | 评论区支持的类型id | | -| folder | obj | 折叠相关信息 | | -| lottery_card | null | (?) | | -| show_bvid | bool | 显示bvid? | | -| control | obj | 评论区输入属性 | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ---- | -| num | num | 当前页码 | | -| size | num | 每页项数 | | -| count | num | 根评论条数 | | -| acount | num | 总计评论条数 | | - -`data`中的`config`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------------- | ---- | -| showadmin | num | 是否显示管理置顶 | | -| showentry | num | (?) | | -| showfloor | num | 是否显示楼层号 | | -| showtopic | num | 是否显示话题 | | -| show_up_flag | bool | 是否显示“UP 觉得很赞”标志 | | -| read_only | bool | 是否只读评论区 | | -| show_del_log | bool | 是否显示删除记录 | | - -`data`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------------------------------------- | -| 0 | obj | 评论条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 评论条目 (n+1) | 按照指定的顺序排列 | -| …… | obj | …… | …… | - -`data`中的`hots`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------------------------------------- | -| 0 | obj | 热评条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 热评条目 (n+1) | 按照热评热度排列 | -| …… | obj | …… | …… | - -`data`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----------------------------- | ---------- | -------------------------------------- | -| mid | num | UP 主 mid | | -| top | 有效时:obj<br />无效时:null | 置顶条目 | [对象定义见表](readme.md#评论条目对象) | -| vote | 有效时:obj<br />无效时:null | 投票评论? | | - -`data`中的`notice`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ---- | -| content | str | 公告正文 | | -| id | num | 公告 id | | -| link | str | 公告页面链接 url | | -| title | str | 公告标题 | | - -`data`中的`folder`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------------- | ---- | -| has_folded | bool | 评论区是否存在折叠评论 | | -| is_folded | bool | 是否折叠? | | -| rule | str | 相关规则页面 url | | - -`data`中的`control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | ------------------ | ----------------------------------- | -| input_disable | bool | 是否禁止新增评论 | 用户涉及合约争议,锁定该用户所有稿件、动态的评论区,不允许新增评论,`root_input_text`和`child_input_text`值为“当前评论区不可新增评论” | -| root_input_text | str | 评论框文字 | | -| child_input_text | str | 评论框文字 | | -| bg_text | str | 空评论区文字 | | -| web_selection | bool | 评论是否筛选后可见 | false:无需筛选<br />true:需要筛选 | -| answer_guide_text | str | 答题页面链接文字 | | -| answer_guide_icon_url | str | 答题页面图标 url | | -| answer_guide_ios_url | str | 答题页面 ios url | | -| answer_guide_android_url | str | 答题页面安卓 url | | - -**示例:** - -获取视频`av2`的评论区明细,不显示热评,按照热度排序,每页5项,查看第1页 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=2' \ ---data-urlencode 'sort=1' \ ---data-urlencode 'ps=5' \ ---data-urlencode 'pn=1' \ ---data-urlencode 'nohot=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "page": { - "num": 1, - "size": 5, - "count": 60971, - "acount": 76792 - }, - "config": { - "showadmin": 1, - "showentry": 1, - "showfloor": 0, - "showtopic": 1, - "show_up_flag": true, - "read_only": false, - "show_del_log": false - }, - "replies": [ - { - "rpid": 104192624480, - "oid": 2, - "type": 1, - "mid": 621197713, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1646205507, - "rpid_str": "104192624480", - "root_str": "0", - "parent_str": "0", - "like": 1, - "action": 0, - "member": { - "mid": "621197713", - "uname": "小鹿不跑路", - "sex": "保密", - "sign": "", - "avatar": "http://i1.hdslb.com/bfs/face/3e220c95ead8f2bc72bd2dcee72d195b723192fa.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 4, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1648051200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "我赶上了我们这个年龄段二次元的末班车,这一年,巨人出了最终季,诚哥的新作玲芽户缔(好像是叫这个)也要在今年秋上映,后悔没有早进入这个圈子,现在只好紧追慢赶,慢慢的补番,我小时候都在干什么啊[大哭]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[大哭]": { - "id": 5, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[大哭]", - "url": "http://i0.hdslb.com/bfs/emote/2caafee2e5db4db72104650d87810cc2c123fc86.png", - "meta": { - "size": 1 - }, - "mtime": 1597738918, - "jump_title": "大哭" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "6小时前发布" - } - }, - { - "rpid": 104184937184, - "oid": 2, - "type": 1, - "mid": 560450695, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1646199089, - "rpid_str": "104184937184", - "root_str": "0", - "parent_str": "0", - "like": 0, - "action": 0, - "member": { - "mid": "560450695", - "uname": "還講幾韆", - "sex": "保密", - "sign": "", - "avatar": "http://i1.hdslb.com/bfs/face/e8bcd1f3fed1a8b266e83f7e5952db525b692227.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 3, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "电视宇宙第二个视频[滑稽][滑稽][滑稽]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[滑稽]": { - "id": 27, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[滑稽]", - "url": "http://i0.hdslb.com/bfs/emote/d15121545a99ac46774f1f4465b895fe2d1411c3.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "滑稽" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "7小时前发布" - } - }, - { - "rpid": 104179775904, - "oid": 2, - "type": 1, - "mid": 1616523766, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1646195814, - "rpid_str": "104179775904", - "root_str": "0", - "parent_str": "0", - "like": 1, - "action": 0, - "member": { - "mid": "1616523766", - "uname": "关查者网", - "sex": "保密", - "sign": "", - "avatar": "http://i1.hdslb.com/bfs/face/8bb6aab1f6bcc960f4482aa97b8ca4e61cf81d0d.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 3, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626451200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "考古队已到达[doge]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[doge]": { - "id": 26, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[doge]", - "url": "http://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "doge" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "8小时前发布" - } - }, - { - "rpid": 104163851152, - "oid": 2, - "type": 1, - "mid": 27553613, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1646183484, - "rpid_str": "104163851152", - "root_str": "0", - "parent_str": "0", - "like": 1, - "action": 0, - "member": { - "mid": "27553613", - "uname": "念晚心", - "sex": "男", - "sign": "", - "avatar": "http://i2.hdslb.com/bfs/face/8b8f32c22651904a23eeb83b048041b7c1c8ffd6.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 74, - "name": "大会员2018年度勋章", - "image": "http://i2.hdslb.com/bfs/face/421179426c929dfeaed4117461c83f5d07ffb148.png", - "image_small": "http://i0.hdslb.com/bfs/face/682001c2e1c2ae887bdf2a0e18eef61180c48f84.png", - "level": "稀有勋章", - "condition": "2018.6.26-7.8某一天是年度大会员" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1650470400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": { - "id": 5476, - "name": "嘉然今天吃什么", - "image": "http://i0.hdslb.com/bfs/garb/item/4442641bd4001214518a81fa8f790ae7469d3cf7.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/5461?navhide=1&mid=27553613&from=reply", - "fan": { - "is_fan": 1, - "number": 14705, - "color": "#f76a6b", - "name": "嘉然今天吃什么", - "num_desc": "014705" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "当时只看优酷和土豆", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "12小时前发布" - } - }, - { - "rpid": 104163545120, - "oid": 2, - "type": 1, - "mid": 31937033, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1646183209, - "rpid_str": "104163545120", - "root_str": "0", - "parent_str": "0", - "like": 1, - "action": 0, - "member": { - "mid": "31937033", - "uname": "夜声已尽", - "sex": "男", - "sign": "六八四十二", - "avatar": "http://i2.hdslb.com/bfs/face/e35e81a00596883532ba47c58ca0434618fab3d0.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 33465, - "name": "乃琳Queen", - "image": "http://i2.hdslb.com/bfs/garb/item/4ad130e4068f88c54728ac510a172b97e187826f.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/4ad130e4068f88c54728ac510a172b97e187826f.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 62, - "name": "有爱大佬", - "image": "http://i0.hdslb.com/bfs/face/a10ee6b613e0d68d2dfdac8bbf71b94824e10408.png", - "image_small": "http://i2.hdslb.com/bfs/face/54f4c31ab9b1f1fa2c29dbbc967f66535699337e.png", - "level": "普通勋章", - "condition": "当前持有粉丝勋章最高等级>=15级" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1671465600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 33465, - "name": "乃琳Queen", - "image": "http://i0.hdslb.com/bfs/garb/item/4ad130e4068f88c54728ac510a172b97e187826f.png", - "jump_url": "", - "type": "suit", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/4ad130e4068f88c54728ac510a172b97e187826f.png", - "image_enhance_frame": "" - }, - "cardbg": { - "id": 33494, - "name": "乃琳Queen", - "image": "http://i0.hdslb.com/bfs/garb/item/34f8c1ef43332883f62e17fed44c1a70930e4811.png", - "jump_url": "https://www.bilibili.com/h5/mall/fans/recommend/33498?navhide=1&mid=31937033&from=reply", - "fan": { - "is_fan": 1, - "number": 50766, - "color": "#576690", - "name": "乃琳Queen", - "num_desc": "050766" - }, - "type": "suit" - }, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "考古", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "12小时前发布" - } - } - ], - "hots": [], - "upper": { - "mid": 2, - "top": null, - "vote": null - }, - "top": null, - "notice": null, - "vote": 0, - "blacklist": 0, - "assist": 0, - "mode": 3, - "support_mode": [ - 1, - 2, - 3 - ], - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "lottery_card": null, - "show_bvid": false, - "control": { - "input_disable": false, - "root_input_text": "发一条友善的评论", - "child_input_text": "", - "giveup_input_text": "不发没关系,请继续友善哦~", - "bg_text": "看看下面~来发评论吧", - "web_selection": false, - "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", - "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", - "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", - "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", - "show_type": 1, - "show_text": "", - "disable_jump_emote": false - } - } -} -``` - -</details> - -## 获取评论区明细_懒加载 - -> https://api.bilibili.com/x/v2/reply/wbi/main - -> ~~https://api.bilibili.com/x/v2/reply/main~~ - -*请求方式:GET* - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -注: Wbi 签名错误时返回 -403 而非 -352 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ------------------------------------------------------------ | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | -| oid | num | 目标评论区 id | 必要 | | -| mode | num | 排序方式 | 非必要 | 默认为 3<br />0 3:仅按热度<br />1:按热度+按时间<br />2:仅按时间 | -| next | num | 翻页 | 非必要 | 不推荐, 已弃用, 优先级比 `pagination_str` 高 | -| pagination_str | obj | 分页信息 | 非必要 | 见下 | -| plat | num | 平台类型 | 非必要 | 如 `1` | -| seek_rpid | str | 空 | 非必要 | 当获取第一页评论时存在 | -| web_location | str | 1315875 | 非必要 | | - -`pagination_str`: - -| 参数名 | 类型 | 内容 | 备注 | -| ----- | - | ------|------| -| offset | str | 一个套着字符串皮的 JSON Object | 上次响应 `data.cursor.pagination_reply.next_offset` 的值, 获取第一页时为空, 其余见下参考 | - -`pagination_str` 中的 `offset`: - -| 参数名 | 类型 | 内容 | 备注 | -| ----- | ---- | -- | - | -| type | num | 类型 | 当 URL 参数 mode 为 2 时, 此项为 3<br />当 URL 参数 mode 为 3 时, 此项为 1 | -| direction | num | 方向 | 1: 正序(默认)<br />2: 倒序 | -| data | obj | 分页数据 | 当 type 为 1 时存在 | -| Data | obj | 分页数据 | 当 type 为 3 时存在 | -<!--not typo here--> - -`offset` 中的 `data` (type=1): - -| 参数名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| pn | num | 页码 (上次响应 `data.cursor.next` 的值) | | - -`offset` 中的 `Data` (type=3): - -| 参数名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| cursor | num | 上次响应 `data.cursor.next` 的值 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12002:评论区已关闭<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | -------------------------------- | -------- | ---------------- | -| cursor | obj | 游标信息 | | -| hots | 禁用时:null<br />正常时:array | 热评列表 | | -| notice | 无效时:null<br />有效时:obj | 评论区公告信息 | | -| replies | 禁用时:null<br />正常时:array | 评论列表 | | -| top | obj | 置顶信息 | | -| top_replies | obj | 置顶评论 | [对象定义见表](readme.md#评论条目对象) | -| lottery_card | null | 抽奖评论 | | -| folder | obj | 评论折叠信息 | | -| up_selection | obj | (?) | | -| cm | obj | 广告 | | -| cm_info | obj | 广告控制 | | -| effects | obj | (?) | | -| assist | num | (?) | | -| blacklist | num | (?) | | -| vote | num | (?) | | -| lottery | num | (?) | | -| config | obj | 评论区显示控制 | | -| upper | obj | UP主信息 | | -| show_bvid | bool | 显示 bvid? | | -| control | obj | 评论区输入属性 | | -| note | num | 1 | | -| esports_grade_card | null | | | -| callbacks | null | | | -| context_feature | str | | | - -`data`中的`cursor`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | -------------- | ----------------------- | -| all_count | num | 全部评论条数 | | -| is_begin | bool | 是否为第一页 | false:否<br />true:是 | -| prev | num | 上页页码 | | -| next | num | 下页页码 | | -| is_end | bool | 是否为最后页 | false:否<br />true:是 | -| mode | num | 排序方式 | | -| support_mode | array | 支持的排序方式 | | -| name | str | 评论区类型名 | | -| pagination_reply | str | 用于下一次请求的偏移信息 | | -| session_id | str | 空 | | - -`cursor`中的`pagination_reply`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -- | - | -| next_offset | str | 用于下一次请求的偏移信息 | | -| prev_offset | str | 用于本次请求的偏移信息 | | - -`data`中的`config`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------------- | ---- | -| showadmin | num | 是否显示管理置顶 | | -| showentry | num | ? | | -| showfloor | num | 是否显示楼层号 | | -| showtopic | num | 是否显示话题 | | -| show_up_flag | bool | 是否显示“UP 觉得很赞”标志 | | -| read_only | bool | 是否只读评论区 | | -| show_del_log | bool | 是否显示删除记录 | | - -`data`中的`hots`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------------------------------------- | -| 0 | obj | 热评条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 热评条目 (n+1) | 按照热评热度排列 | -| …… | obj | …… | …… | - -`data`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------------------------------------- | -| 0 | obj | 评论条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 评论条目 (n+1) | 按照指定的顺序排列 | -| …… | obj | …… | …… | - -`data`中的`top`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----------------------------- | -------------- | -------------------------------------- | -| admin | 有效时:obj<br />无效时:null | 管理员置顶条目 | [对象定义见表](readme.md#评论条目对象) | -| upper | 有效时:obj<br />无效时:null | UP 主置顶条目 | [对象定义见表](readme.md#评论条目对象) | -| vote | 有效时:obj<br />无效时:null | 投票置顶条目 | [对象定义见表](readme.md#评论条目对象) | - -`data`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| mid | num | UP 主 mid | | - -`data`中的`notice`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ---- | -| content | str | 公告正文 | | -| id | num | 公告 id | | -| link | str | 公告页面链接 url | | -| title | str | 公告标题 | | - -`data`中的`folder`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------------- | ---- | -| has_folded | bool | 评论区是否存在折叠评论 | | -| is_folded | bool | 是否折叠? | | -| rule | str | 相关规则页面 url | | - -`data`中的`control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | ------------------ | ----------------------------------- | -| input_disable | bool | (?) | | -| root_input_text | str | 评论框文字 | | -| child_input_text | str | 评论框文字 | | -| bg_text | str | 空评论区文字 | | -| web_selection | bool | 评论是否筛选后可见 | false:无需筛选<br />true:需要筛选 | -| answer_guide_text | str | 答题页面链接文字 | | -| answer_guide_icon_url | str | 答题页面图标 url | | -| answer_guide_ios_url | str | 答题页面 ios url | | -| answer_guide_android_url | str | 答题页面安卓 url | | - -**示例:** - -获取视频`av2`的评论区明细, 按时间排序, 第一页 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply/wbi/main' \ ---data-urlencode 'oid=2' \ ---data-urlencode 'type=1' \ ---data-urlencode 'mode=2' \ ---data-urlencode 'w_rid=xxx' \ ---data-urlencode 'wts=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "cursor": { - "is_begin": true, - "prev": 71880, - "next": 71859, - "is_end": false, - "mode": 2, - "mode_text": "", - "all_count": 86234, - "support_mode": [ - 2, - 3 - ], - "name": "最新评论", - "pagination_reply": { - "next_offset": "{\"type\":3,\"direction\":1,\"Data\":{\"cursor\":71859}}" - }, - "session_id": "" - }, - "replies": [ - { - "rpid": 237740291920, - "oid": 2, - "type": 1, - "mid": 1201423076, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1723639342, - "mid_str": "1201423076", - "oid_str": "2", - "rpid_str": "237740291920", - "root_str": "0", - "parent_str": "0", - "dialog_str": "0", - "like": 0, - "action": 0, - "member": { - "mid": "1201423076", - "uname": "天堂いyoulin", - "sex": "保密", - "sign": "", - "avatar": "https://i2.hdslb.com/bfs/face/d0925e782198cadc0c400a3ed4fbdf94142357fb.jpg", - "rank": "10000", - "face_nft_new": 0, - "is_senior_member": 0, - "senior": {}, - "level_info": { - "current_level": 4, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0 - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "user_sailing_v2": {}, - "is_contractor": false, - "contract_desc": "", - "nft_interaction": null, - "avatar_item": { - "container_size": { - "width": 1.8, - "height": 1.8 - }, - "fallback_layers": { - "layers": [ - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.9, - "axis_y": 0.9 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "AVATAR_LAYER": {} - }, - "is_critical": true, - "layer_mask": { - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.9, - "axis_y": 0.9 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "mask_src": { - "src_type": 3, - "draw": { - "draw_type": 1, - "fill_mode": 1, - "color_config": { - "day": { - "argb": "#FF000000" - } - } - } - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 1, - "placeholder": 6, - "remote": { - "url": "https://i2.hdslb.com/bfs/face/d0925e782198cadc0c400a3ed4fbdf94142357fb.jpg", - "bfs_style": "widget-layer-avatar" - } - } - } - } - } - ], - "is_critical_group": true - }, - "mid": "1201423076" - } - }, - "content": { - "message": "好多20年和18年的[辣眼睛]", - "members": [], - "emote": { - "[辣眼睛]": { - "id": 2374, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[辣眼睛]", - "url": "https://i0.hdslb.com/bfs/emote/35d62c496d1e4ea9e091243fa812866f5fecc101.png", - "meta": { - "size": 1, - "suggest": [ - "" - ] - }, - "mtime": 1668688325, - "jump_title": "辣眼睛" - } - }, - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "up_action": { - "like": false, - "reply": false - }, - "invisible": false, - "reply_control": { - "max_line": 6, - "time_desc": "21分钟前发布", - "location": "IP属地:河北" - }, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "dynamic_id_str": "0", - "note_cvid_str": "0", - "track_info": "" - }, - // ... - { - "rpid": 237689432448, - "oid": 2, - "type": 1, - "mid": 1647250883, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1723624563, - "mid_str": "1647250883", - "oid_str": "2", - "rpid_str": "237689432448", - "root_str": "0", - "parent_str": "0", - "dialog_str": "0", - "like": 1, - "action": 0, - "member": { - "mid": "1647250883", - "uname": "小烟同学424", - "sex": "保密", - "sign": "墓前玩使命,墓前暑假", - "avatar": "https://i2.hdslb.com/bfs/face/930661ca1bcacf8005efcca499b7380dcd4c2716.jpg", - "rank": "10000", - "face_nft_new": 0, - "is_senior_member": 0, - "senior": {}, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0 - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "user_sailing_v2": {}, - "is_contractor": false, - "contract_desc": "", - "nft_interaction": null, - "avatar_item": { - "container_size": { - "width": 1.8, - "height": 1.8 - }, - "fallback_layers": { - "layers": [ - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.9, - "axis_y": 0.9 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "AVATAR_LAYER": {} - }, - "is_critical": true, - "layer_mask": { - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.9, - "axis_y": 0.9 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "mask_src": { - "src_type": 3, - "draw": { - "draw_type": 1, - "fill_mode": 1, - "color_config": { - "day": { - "argb": "#FF000000" - } - } - } - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 1, - "placeholder": 6, - "remote": { - "url": "https://i2.hdslb.com/bfs/face/930661ca1bcacf8005efcca499b7380dcd4c2716.jpg", - "bfs_style": "widget-layer-avatar" - } - } - } - } - } - ], - "is_critical_group": true - }, - "mid": "1647250883" - } - }, - "content": { - "message": "还。。。有人吗?", - "members": [], - "jump_url": {}, - "max_line": 6 - }, - "replies": [], - "assist": 0, - "up_action": { - "like": false, - "reply": false - }, - "invisible": false, - "reply_control": { - "max_line": 6, - "time_desc": "4小时前发布", - "location": "IP属地:陕西" - }, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "dynamic_id_str": "0", - "note_cvid_str": "0", - "track_info": "" - } - ], - "top": { - "admin": null, - "upper": null, - "vote": null - }, - "top_replies": [], - "up_selection": { - "pending_count": 0, - "ignore_count": 0 - }, - "effects": { - "preloading": "" - }, - "assist": 0, - "blacklist": 0, - "vote": 0, - "config": { - "showtopic": 1, - "show_up_flag": true, - "read_only": false - }, - "upper": { - "mid": 2 - }, - "control": { - "input_disable": false, - "root_input_text": "你渴望拥有力量吗?评论让力量更强大", - "child_input_text": "你渴望拥有力量吗?评论让力量更强大", - "giveup_input_text": "不发没关系,请继续友善哦~", - "screenshot_icon_state": 1, - "upload_picture_icon_state": 1, - "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", - "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", - "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", - "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", - "bg_text": "", - "empty_page": null, - "show_type": 1, - "show_text": "", - "web_selection": false, - "disable_jump_emote": false, - "enable_charged": false, - "enable_cm_biz_helper": false, - "preload_resources": null - }, - "note": 1, - "esports_grade_card": null, - "callbacks": null, - "context_feature": "" - } -} -``` - -</details> - -## 获取指定评论的回复 - -> https://api.bilibili.com/x/v2/reply/reply - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -按照回复顺序排序 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---------------------------------------- | -| access_key | str | APP登录 Token | APP 方式必要 | | -| type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | -| oid | num | 目标评论区 id | 必要 | | -| root | num | 根回复 rpid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-49 <br /> 但 data_replies 的最大内容数为20,因此设置为49其实也只会有20条回复被返回 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12002:评论区已关闭<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------------- | -------------------------------------- | -| config | obj | 评论区显示控制 | | -| control | obj | 评论区输入属性 | | -| page | obj | 页面信息 | | -| replies | array | 评论对话树列表 | 最大内容数为20 | -| root | obj | 根评论信息 | [对象定义见表](readme.md#评论条目对象) | -| show_bvid | bool | 显示 bvid? | | -| show_text | str | (?) | | -| show_type | num | (?) | | -| upper | obj | UP主 mid | | - -`data`中的`config`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------------ | ---- | -| showadmin | num | 是否显示管理置顶 | | -| showentry | num | ? | | -| showfloor | num | 是否显示楼层号 | | -| showtopic | num | 是否显示话题 | | -| show_up_flag | bool | 是否显示“UP觉得很赞”标志 | | -| read_only | bool | 是否只读评论区 | | -| show_del_log | bool | 是否显示删除记录 | | - -`data`中的`control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | ------------------ | ----------------------------------- | -| input_disable | bool | (?) | | -| root_input_text | str | 评论框文字 | | -| child_input_text | str | 评论框文字 | | -| bg_text | str | 空评论区文字 | | -| web_selection | bool | 评论是否筛选后可见 | false:无需筛选<br />true:需要筛选 | -| answer_guide_text | str | 答题页面链接文字 | | -| answer_guide_icon_url | str | 答题页面图标 url | | -| answer_guide_ios_url | str | 答题页面 ios url | | -| answer_guide_android_url | str | 答题页面安卓 url | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | ---- | -| count | num | 二级评论数 | | -| num | num | 当前页码 | | -| size | num | 每页项数 | | - -`data`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | -------------------------------------- | -| 0 | obj | 对话评论条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 对话评论条目 (n+1) | 按照回复顺序排列 | -| …… | obj | …… | …… | - -`data`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| mid | num | UP 主 mid | | - -**示例:** - -获取视频`av201022189`下评论`rpid=3030790837`的回复,每页5项,获取第1页 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply/reply' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=201022189' \ ---data-urlencode 'root=3030790837' \ ---data-urlencode 'ps=5' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "config": { - "showadmin": 0, - "showentry": 0, - "showfloor": 0, - "showtopic": 0, - "show_up_flag": false, - "read_only": false, - "show_del_log": false - }, - "control": { - "input_disable": false, - "root_input_text": "发一条友善的评论", - "child_input_text": "", - "giveup_input_text": "不发没关系,请继续友善哦~", - "bg_text": "看看下面~来发评论吧", - "web_selection": false, - "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", - "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", - "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", - "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", - "show_type": 1, - "show_text": "", - "disable_jump_emote": false - }, - "page": { - "count": 230, - "num": 1, - "size": 5 - }, - "replies": [ - { - "rpid": 3030802207, - "oid": 201022189, - "type": 1, - "mid": 172604528, - "root": 3030790837, - "parent": 3030790837, - "dialog": 3030802207, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592018067, - "rpid_str": "3030802207", - "root_str": "3030790837", - "parent_str": "3030790837", - "like": 41, - "action": 0, - "member": { - "mid": "172604528", - "uname": "超高校级的认真", - "sex": "男", - "sign": "just do it for yourself", - "avatar": "http://i2.hdslb.com/bfs/face/d0d957faa6162388467cb0750a9d33cf616e73e9.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "怎么上p站呀,翻吗", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - }, - { - "rpid": 3030810089, - "oid": 201022189, - "type": 1, - "mid": 342581997, - "root": 3030790837, - "parent": 3030802207, - "dialog": 3030802207, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592018123, - "rpid_str": "3030810089", - "root_str": "3030790837", - "parent_str": "3030802207", - "like": 7, - "action": 0, - "member": { - "mid": "342581997", - "uname": "VAN样斯基", - "sex": "保密", - "sign": "", - "avatar": "http://i0.hdslb.com/bfs/face/bc9c6d37b5a4c8b3b0a3cd483fd66e63b1ae0cec.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @中等校级的努力 :是啊", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - }, - { - "rpid": 3030843245, - "oid": 201022189, - "type": 1, - "mid": 92586428, - "root": 3030790837, - "parent": 3030790837, - "dialog": 3030843245, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592018688, - "rpid_str": "3030843245", - "root_str": "3030790837", - "parent_str": "3030790837", - "like": 588, - "action": 0, - "member": { - "mid": "92586428", - "uname": "浪潮工作室", - "sex": "保密", - "sign": "洞见时代的浪潮。", - "avatar": "http://i2.hdslb.com/bfs/face/67f183f13f8fe3afb374916d32f9810df8ef042a.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": 0, - "desc": "专栏优质UP主" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "不会吧不会吧,不会真的有人上P站不是为了学习吧", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - }, - { - "rpid": 3030881609, - "oid": 201022189, - "type": 1, - "mid": 393121222, - "root": 3030790837, - "parent": 3030802207, - "dialog": 3030802207, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592019208, - "rpid_str": "3030881609", - "root_str": "3030790837", - "parent_str": "3030802207", - "like": 110, - "action": 0, - "member": { - "mid": "393121222", - "uname": "鱼氏博物馆", - "sex": "保密", - "sign": "", - "avatar": "http://i1.hdslb.com/bfs/face/f61a8ea36828884d760d855293136a838fa9e848.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1602691200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @中等校级的努力 :p是什么,当然是plane啦,plane站其实就是✈场[doge]所以去p站就是去✈场啦", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[doge]": { - "id": 26, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[doge]", - "url": "http://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "doge" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - }, - { - "rpid": 3030978856, - "oid": 201022189, - "type": 1, - "mid": 11814633, - "root": 3030790837, - "parent": 3030790837, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592020635, - "rpid_str": "3030978856", - "root_str": "3030790837", - "parent_str": "3030790837", - "like": 60, - "action": 0, - "member": { - "mid": "11814633", - "uname": "我到四川省来", - "sex": "保密", - "sign": "保持内心的平静", - "avatar": "http://i0.hdslb.com/bfs/face/1c7cad967633c718ddef302f4aa39efaed53a2e4.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 3, - "name": "白银殿堂", - "image": "http://i0.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png", - "image_small": "http://i0.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png", - "level": "高级勋章", - "condition": "单个自制视频总播放数>=10万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1715270400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "jump_url": "", - "type": "vip", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "看有机化学考研视频", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - } - ], - "root": { - "rpid": 3030790837, - "oid": 201022189, - "type": 1, - "mid": 342581997, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 268, - "rcount": 230, - "state": 0, - "fansgrade": 0, - "attr": 768, - "ctime": 1592017909, - "rpid_str": "3030790837", - "root_str": "0", - "parent_str": "0", - "like": 8018, - "action": 0, - "member": { - "mid": "342581997", - "uname": "VAN样斯基", - "sex": "保密", - "sign": "", - "avatar": "http://i0.hdslb.com/bfs/face/bc9c6d37b5a4c8b3b0a3cd483fd66e63b1ae0cec.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626364800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "去P站当然只是为了学习啊[doge]", - "plat": 0, - "device": "", - "members": [], - "emote": { - "[doge]": { - "id": 26, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[doge]", - "url": "http://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png", - "meta": { - "size": 1 - }, - "mtime": 1645206695, - "jump_title": "doge" - } - }, - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "https://www.bilibili.com/blackboard/foldingreply.html" - }, - "up_action": { - "like": true, - "reply": true - }, - "show_follow": false, - "invisible": false, - "card_label": [ - { - "rpid": 3030790837, - "text_content": "UP主觉得很赞", - "text_color_day": "#757575", - "text_color_night": "#939393", - "label_color_day": "#F4F4F4", - "label_color_night": "#1E1E1E", - "image": "", - "type": 0, - "background": "", - "background_width": 0, - "background_height": 0, - "jump_url": "" - } - ], - "reply_control": { - "up_reply": true, - "sub_reply_entry_text": "共230条回复", - "sub_reply_title_text": "相关回复共230条", - "time_desc": "627天前发布" - } - }, - "show_bvid": true, - "show_text": "", - "show_type": 2, - "upper": { - "mid": 92586428 - } - } -} -``` - -</details> - -## 获取指定评论对话树 - -> https://api.bilibili.com/x/v2/reply/dialog/cursor - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -按照对话链排列 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---------------------------------------- | -| access_key | str | APP登录 Token | APP 方式必要 | | -| type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | -| oid | num | 目标评论区 id | 必要 | | -| root | num | 根回复 rpid | 必要 | | -| dialog | num | 对话树根 rpid | 必要 | | -| size | num | 每页最大项数 | 必要 | | -| min_floor | num | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12002:评论区已关闭<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------------- | ---- | -| cursor | obj | 页楼层信息 | | -| dialog | obj | 对话楼层信息 | | -| replies | array | 评论对话树列表 | | -| assist | num | (?) | | -| blacklist | num | (?) | | -| vote | num | (?) | | -| lottery | num | (?) | | -| config | obj | 评论区显示控制 | | -| upper | obj | UP主 mid | | -| show_bvid | bool | 显示 bvid? | | -| control | obj | 评论区输入属性 | | -| note | num | (?) | | - -`data`中的`cursor`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------------- | ---- | -| min_floor | num | 本页最低对话楼层 | | -| max_floor | num | 本页最高对话楼层 | | -| size | num | 本页项数 | | - -`data`中的`dialog`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------------- | ---- | -| min_floor | num | 二级评论最低对话楼层 | | -| max_floor | num | 二级评论最高对话楼层 | | - -`data`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | -------------------------------------- | -| 0 | obj | 对话评论条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 对话评论条目 (n+1) | 按照对话链排列 | -| …… | obj | …… | …… | - -`data`中的`config`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------------- | ---- | -| showadmin | num | 是否显示管理置顶 | | -| showentry | num | ? | | -| showfloor | num | 是否显示楼层号 | | -| showtopic | num | 是否显示话题 | | -| show_up_flag | bool | 是否显示“UP 觉得很赞”标志 | | -| read_only | bool | 是否只读评论区 | | -| show_del_log | bool | 是否显示删除记录 | | - -`data`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| mid | num | UP 主 mid | | - -`data`中的`control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | ------------------ | ----------------------------------- | -| input_disable | bool | (?) | | -| root_input_text | str | 评论框文字 | | -| child_input_text | str | 评论框文字 | | -| bg_text | str | 空评论区文字 | | -| web_selection | bool | 评论是否筛选后可见 | false:无需筛选<br />true:需要筛选 | -| answer_guide_text | str | 答题页面链接文字 | | -| answer_guide_icon_url | str | 答题页面图标 url | | -| answer_guide_ios_url | str | 答题页面 ios url | | -| answer_guide_android_url | str | 答题页面安卓 url | | - -**示例:** - -获取视频`av201022189`下评论`rpid=3030790837`的对话`rpid=3030978856`,每页最大5项 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply/dialog/cursor' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=201022189' \ ---data-urlencode 'root=3030790837' \ ---data-urlencode 'dialog=3030978856' \ ---data-urlencode 'size=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "cursor": { - "min_floor": 5, - "max_floor": 99, - "size": 5 - }, - "dialog": { - "min_floor": 0, - "max_floor": 243 - }, - "replies": [ - { - "rpid": 3030978856, - "oid": 201022189, - "type": 1, - "mid": 11814633, - "root": 3030790837, - "parent": 3030790837, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "floor": 5, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592020635, - "rpid_str": "3030978856", - "root_str": "3030790837", - "parent_str": "3030790837", - "like": 60, - "action": 0, - "member": { - "mid": "11814633", - "uname": "我到四川省来", - "sex": "保密", - "sign": "保持内心的平静", - "avatar": "http://i0.hdslb.com/bfs/face/1c7cad967633c718ddef302f4aa39efaed53a2e4.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 3, - "name": "白银殿堂", - "image": "http://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png", - "image_small": "http://i0.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png", - "level": "高级勋章", - "condition": "单个自制视频总播放数>=10万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1715270400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "jump_url": "", - "type": "vip", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "看有机化学考研视频", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "627天前发布" - } - }, - { - "rpid": 3049044835, - "oid": 201022189, - "type": 1, - "mid": 34598825, - "root": 3030790837, - "parent": 3032092982, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "floor": 54, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592368714, - "rpid_str": "3049044835", - "root_str": "3030790837", - "parent_str": "3032092982", - "like": 1, - "action": 0, - "member": { - "mid": "34598825", - "uname": "人宇君sayo", - "sex": "男", - "sign": "", - "avatar": "http://i2.hdslb.com/bfs/face/bf61490cabaedd8e98740f2c98a342ac6d2c607d.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1629561600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @緑箭口香糖 :牛的", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "623天前发布" - } - }, - { - "rpid": 3049581999, - "oid": 201022189, - "type": 1, - "mid": 479083152, - "root": 3030790837, - "parent": 3030978856, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "floor": 93, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592378703, - "rpid_str": "3049581999", - "root_str": "3030790837", - "parent_str": "3030978856", - "like": 2, - "action": 0, - "member": { - "mid": "479083152", - "uname": "人间多了许茫然", - "sex": "保密", - "sign": "无聊...\n", - "avatar": "http://i0.hdslb.com/bfs/face/6e7ee177b5cc681b9609c07f8d5eb574b52d409c.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1632240000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": null, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @我到四川省来 :哈哈,考研不考化学吧", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "623天前发布" - } - }, - { - "rpid": 3049578129, - "oid": 201022189, - "type": 1, - "mid": 11814633, - "root": 3030790837, - "parent": 3049581999, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "floor": 94, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592378760, - "rpid_str": "3049578129", - "root_str": "3030790837", - "parent_str": "3049581999", - "like": 1, - "action": 0, - "member": { - "mid": "11814633", - "uname": "我到四川省来", - "sex": "保密", - "sign": "保持内心的平静", - "avatar": "http://i0.hdslb.com/bfs/face/1c7cad967633c718ddef302f4aa39efaed53a2e4.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 3, - "name": "白银殿堂", - "image": "http://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png", - "image_small": "http://i0.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png", - "level": "高级勋章", - "condition": "单个自制视频总播放数>=10万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1715270400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 1885, - "name": "公主连结凯露", - "image": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "jump_url": "", - "type": "vip", - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/ecf1b11044845abc92e576dfdf93ad4f5e5a0958.png", - "image_enhance_frame": "" - }, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @转手告别旧生活 :专业课 考啊", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "623天前发布" - } - }, - { - "rpid": 3049748009, - "oid": 201022189, - "type": 1, - "mid": 39891232, - "root": 3030790837, - "parent": 3032092982, - "dialog": 3030978856, - "count": 0, - "rcount": 0, - "floor": 99, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1592382373, - "rpid_str": "3049748009", - "root_str": "3030790837", - "parent_str": "3032092982", - "like": 1, - "action": 0, - "member": { - "mid": "39891232", - "uname": "夏次一町and庵野一洋", - "sex": "保密", - "sign": "嘚儿~驾!", - "avatar": "http://i1.hdslb.com/bfs/face/79fbbc56271053565f6dd4395cd77120bad7c568.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 452, - "name": "灵笼", - "image": "http://i1.hdslb.com/bfs/face/9c5f14d6749daded668f3f66998baf4a50e7d8da.png", - "expire": 0, - "image_enhance": "http://i1.hdslb.com/bfs/face/9c5f14d6749daded668f3f66998baf4a50e7d8da.png", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1628870400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": { - "pendant": { - "id": 452, - "name": "灵笼", - "image": "http://i0.hdslb.com/bfs/face/9c5f14d6749daded668f3f66998baf4a50e7d8da.png", - "jump_url": "", - "type": "vip", - "image_enhance": "http://i0.hdslb.com/bfs/face/9c5f14d6749daded668f3f66998baf4a50e7d8da.png", - "image_enhance_frame": "" - }, - "cardbg": null, - "cardbg_with_focus": null - }, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "回复 @緑箭口香糖 :不收费啊", - "plat": 0, - "device": "", - "members": [], - "jump_url": {}, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": { - "time_desc": "623天前发布" - } - } - ], - "assist": 0, - "blacklist": 0, - "vote": 0, - "lottery": 0, - "config": { - "showadmin": 1, - "showentry": 1, - "showfloor": 0, - "showtopic": 1, - "show_up_flag": true, - "read_only": false, - "show_del_log": true - }, - "upper": { - "mid": 92586428 - }, - "show_bvid": false, - "control": { - "input_disable": false, - "root_input_text": "发一条友善的评论", - "child_input_text": "", - "giveup_input_text": "不发没关系,请继续友善哦~", - "bg_text": "看看下面~来发评论吧", - "web_selection": false, - "answer_guide_text": "需要升级成为lv2会员后才可以评论,先去答题转正吧!", - "answer_guide_icon_url": "http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png", - "answer_guide_ios_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12", - "answer_guide_android_url": "https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6", - "show_type": 1, - "show_text": "", - "disable_jump_emote": false - }, - "note": 1 - } -} -``` - -</details> - -## 获取评论区热评 - -> https://api.bilibili.com/x/v2/reply/hot - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -按照热评排列 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---------------------------------------- | -| access_key | str | APP登录 Token | APP 方式必要 | | -| type | num | 评论区类型代码 | 必要 | [类型代码见表](readme.md#评论区类型代码) | -| oid | num | 目标评论区 id | 必要 | | -| root | num | 根回复 rpid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为20<br />定义域:1-49 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12002:评论区已关闭<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| page | obj | 页面信息 | | -| replies | obj | 热评列表 | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| acount | num | 总评论数 | | -| count | num | 热评数 | | -| num | num | 当前页码 | | -| size | num | 每页项数 | | - -`data`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------------------------------------- | -| 0 | obj | 热评条目 1 | [对象定义见表](readme.md#评论条目对象) | -| n | obj | 热评条目 (n+1) | 按照热评排列 | -| …… | obj | …… | …… | - -**示例:** - -获取视频`av2`的评论区热评,每页5项,查看第1页 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply/hot' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=2' \ ---data-urlencode 'ps=5' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "page": { - "acount": 76796, - "count": 60975, - "num": 1, - "size": 5 - }, - "replies": [ - { - "rpid": 476670, - "oid": 2, - "type": 1, - "mid": 58426, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 2733, - "rcount": 2608, - "floor": 2, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1291350931, - "like": 90425, - "action": 0, - "member": null, - "content": { - "message": "貌似没人来", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - }, - { - "rpid": 917945205, - "oid": 2, - "type": 1, - "mid": 34762090, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 461, - "rcount": 365, - "floor": 17977, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1532071373, - "like": 29795, - "action": 0, - "member": null, - "content": { - "message": "7.20日,站长被封7天\n\n历史性留名[2233娘_卖萌]", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - }, - { - "rpid": 2576184175, - "oid": 2, - "type": 1, - "mid": 24512285, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 1066, - "rcount": 1000, - "floor": 40932, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1584945297, - "like": 44309, - "action": 0, - "member": null, - "content": { - "message": "人类最古のav号(挂了的不算)也变成bv了[大哭][大哭][大哭]青春结束了", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - }, - { - "rpid": 495059, - "oid": 2, - "type": 1, - "mid": 2, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 898, - "rcount": 838, - "floor": 5, - "state": 2, - "fansgrade": 0, - "attr": 0, - "ctime": 1291918239, - "like": 34224, - "action": 0, - "member": null, - "content": { - "message": "wwwww", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - }, - { - "rpid": 646408628, - "oid": 2, - "type": 1, - "mid": 33066927, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 173, - "rcount": 160, - "floor": 10914, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 1519135750, - "like": 7197, - "action": 0, - "member": null, - "content": { - "message": "第一首:来夢緑 - kagome-kagome ~ 月の眷属達カラオケ\n第二首:dBu music - 千年幻想郷 -Aurora sky edition-\n第三首:Sensitive Heart - 千年幻想郷 ~ History of the Moon\n第四首:Yellow-Zebra - 月の律动~Rhythm of the moon~(东方永夜抄 “千年幻想郷 ~ History of the Moon”)\n第五首:工藤舞 - D.S.F.S(ヴォヤージュ1969)\n第六首:Angelic Quasar - かの郷は永き幻の\n第七首:東方永夜抄 - 黒髪のアマンダ\n第八首:君の美術館 - 千年幻想郷 ~ History of the Moon\n\n------------------------\n这些是av:2出现的音乐,应该不会缺少的喵~。(笑) 如果有需要有兴趣的话欢迎复制喵~~(`・ω・´)\n复制的9818楼的\n前排提示:本视频只有大会员能看", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - } - ] - } -} -``` - -</details> - -## 获取指定评论信息 - -该接口已经弃用 - -<details> -<summary>点击展开折叠内容:</summary> - -> https://api.bilibili.com/x/v2/reply/info - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------------- | ------ | -------------------------------------------- | -| type | num | 评论区类型代码 | 非必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区 id | 非必要 | | -| rpid | num | 目标评论 rpid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 评论条目 | [对象定义见表](readme.md#评论条目对象) | - -**示例:** - -获取视频`av379743801`评论区下`rpid=95737567200`的信息 - -```bash -curl -G 'https://api.bilibili.com/x/v2/reply/info' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=379743801' \ ---data-urlencode 'rpid=95737567200' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "rpid": 95737567200, - "oid": 379743801, - "type": 1, - "mid": 293793435, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 34, - "rcount": 34, - "floor": 382, - "state": 0, - "fansgrade": 0, - "attr": 514, - "ctime": 1639916028, - "like": 154, - "action": 0, - "member": { - "mid": "293793435", - "uname": "社会易姐QwQ", - "sex": "男", - "sign": "普通带砖技术宅,爱好MC 编程 电子,是车万人也是术术人,粉丝群:1136462265,博客:shakianee.top", - "avatar": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "rank": "10000", - "DisplayRank": "0", - "face_nft_new": 0, - "is_senior_member": 0, - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 2511, - "name": "初音未来13周年", - "image": "http://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i2.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i0.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1675785600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "nickname_color": "#FB7299" - }, - "fans_detail": null, - "following": 0, - "is_followed": 0, - "user_sailing": null, - "is_contractor": false, - "contract_desc": "" - }, - "content": { - "message": "这款机器背后发热超级严重。。。。。最烫的时候有60-70℃手不敢摸,而发烫后会降频,最低会降到0.6Ghz[笑哭][笑哭]\n现在解决办法已经出来了https://b23.tv/suUd3g7", - "plat": 0, - "device": "", - "members": null, - "jump_url": null, - "max_line": 999 - }, - "replies": null, - "assist": 0, - "folder": { - "has_folded": false, - "is_folded": false, - "rule": "" - }, - "up_action": { - "like": false, - "reply": false - }, - "show_follow": false, - "invisible": false, - "reply_control": {} - } -} -``` - -</details> - -</details> - -## 获取评论区评论总数 - -> https://api.bilibili.com/x/v2/reply/count - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------------- | ------ | -------------------------------------------- | -| type | num | 评论区类型代码 | 必要 | **[类型代码见表](readme.md#评论区类型代码)** | -| oid | num | 目标评论区 id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无此项<br />12009:评论主体的type不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---- | -| count | num | 评论条数 | | - -**示例:** - -获取视频`av2`的评论区总计评论条数 - -```shell -curl -G 'https://api.bilibili.com/x/v2/reply/count' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=2' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 65521 - } -} -``` - -</details> - diff --git a/docs/comment/readme.md b/docs/comment/readme.md deleted file mode 100644 index e9ba1a7..0000000 --- a/docs/comment/readme.md +++ /dev/null @@ -1,349 +0,0 @@ -# 评论区 - -<img src="../../assets/img/comment.svg" width="100" height="100"/> - -评论系统为全站通用,且APP与web端接口共用,以type标明对象类型,以oid指向响应的对象id - ---- - -**继续查看:** - -- [查询类](list.md) -- [操作类](action.md) - -## 评论区类型代码 - -(PS:以下部分内容来源不明,有待验证) - -| 代码 | 评论区类型 | oid 的意义 | -| ---- | ----------------------- | ----------- | -| 1 | 视频稿件 | 稿件 avid | -| 2 | 话题 | 话题 id | -| 4 | 活动 | 活动 id | -| 5 | 小视频 | 小视频 id | -| 6 | 小黑屋封禁信息 | 封禁公示 id | -| 7 | 公告信息 | 公告 id | -| 8 | 直播活动 | 直播间 id | -| 9 | 活动稿件 | (?) | -| 10 | 直播公告 | (?) | -| 11 | 相簿(图片动态) | 相簿 id | -| 12 | 专栏 | 专栏 cvid | -| 13 | 票务 | (?) | -| 14 | 音频 | 音频 auid | -| 15 | 风纪委员会 | 众裁项目 id | -| 16 | 点评 | (?) | -| 17 | 动态(纯文字动态&分享) | 动态 id | -| 18 | 播单 | (?) | -| 19 | 音乐播单 | (?) | -| 20 | 漫画 | (?) | -| 21 | 漫画 | (?) | -| 22 | 漫画 | 漫画 mcid | -| 33 | 课程 | 课程 epid | - -## 评论条目对象 - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ------------------------------- | ------------------ | ------------------------------------------------------------ | -| rpid | num | 评论 rpid | | -| oid | num | 评论区对象 id | | -| type | num | 评论区类型代码 | **类型代码见上表** | -| mid | num | 发送者 mid | | -| root | num | 根评论 rpid | 若为一级评论则为 0<br />大于一级评论则为根评论 id | -| parent | num | 回复父评论 rpid | 若为一级评论则为 0<br />若为二级评论则为根评论 rpid<br />大于二级评论为上一级评 论 rpid | -| dialog | num | 回复对方 rpid | 若为一级评论则为 0<br />若为二级评论则为该评论 rpid<br />大于二级评论为上一级评论 rpid | -| count | num | 二级评论条数 | | -| rcount | num | 回复评论条数 | | -| floor | num | 评论楼层号 | **注:若不支持楼层则无此项** | -| state | num | 评论状态 | 0: 正常<br />17: 被阿瓦隆系统隐藏 (无法被别人看到, 只能自己看到) | -| fansgrade | num | 是否具有粉丝标签 | 0:无<br />1:有 | -| attr | num | 某属性位? | | -| ctime | num | 评论发送时间 | 时间戳 | -| rpid_str | str | 评论rpid | 字串格式 | -| root_str | str | 根评论rpid | 字串格式 | -| parent_str | str | 回复父评论rpid | 字串格式 | -| like | num | 评论获赞数 | | -| action | num | 当前用户操作状态 | 需要登录(Cookie 或 APP) <br />否则恒为 0<br />0:无<br />1:已点赞<br />2:已点踩 | -| member | obj | 评论发送者信息 | | -| content | obj | 评论信息 | | -| replies | 无效时:null<br />有效时:array | 评论回复条目预览 | **仅嵌套一层**<br />否则为 null | -| assist | num | (?) | | -| folder | obj | 折叠信息 | | -| up_action | obj | 评论 UP 主操作信息 | | -| show_follow | bool | (?) | | -| invisible | bool | 评论是否被隐藏 | | -| card_label | obj | 右上角卡片标签信息 | | -| reply_control | obj | 评论提示文案信息 | | - -`评论条目`中的`member`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----------------------------- | ---------------------- | ------------------------------------------------------------ | -| mid | str | 发送者 mid | | -| uname | str | 发送者昵称 | | -| sex | str | 发送者性别 | 男 女 保密 | -| sign | str | 发送者签名 | | -| avatar | str | 发送者头像 url | | -| rank | str | (?) | | -| DisplayRank | str | (?) | | -| level_info | obj | 发送者等级 | | -| pendant | obj | 发送者头像框信息 | | -| nameplate | obj | 发送者勋章信息 | | -| official_verify | obj | 发送者认证信息 | | -| vip | obj | 发送者会员信息 | | -| fans_detail | 无效时:null<br />有效时:obj | 发送者粉丝标签 | | -| following | num | 是否关注该用户 | 需要登录(Cookie或APP) <br />否则恒为0<br />0:未关注<br />1:已关注 | -| is_followed | num | 是否被该用户关注 | 需要登录(Cookie或APP) <br />否则恒为0<br />0:未关注<br />1:已关注 | -| user_sailing | obj | 发送者评论条目装扮信息 | | -| is_contractor | bool | 是否为合作用户? | | -| contract_desc | str | 合作用户说明? | | - -`member`中的`level_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------- | ---- | -| current_level | num | 用户等级 | | -| current_min | num | 0 | | -| current_exp | num | 0 | | -| next_exp | num | 0 | | - -`member`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | -------------- | ---- | -| pid | num | 头像框 id | | -| name | str | 头像框名称 | | -| image | str | 头像框图片 url | | -| expire | num | 0 | | -| image_enhance | str | 头像框图片 url | | -| image_enhance_frame | str | (?) | | - -`member`中的`nameplate`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------------- | ---- | -| nid | num | 勋章 id | | -| name | str | 勋章名称 | | -| image | str | 挂件图片 url 正常 | | -| image_small | str | 勋章图片 url 小 | | -| level | str | 勋章等级 | | -| condition | str | 勋章条件 | | - -`member`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---------------------------------------- | -| type | num | 认证类型 | -1:无<br />0:个人认证<br />1:机构认证 | -| desc | str | 认证信息 | 无为空 | - -`member`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | -------------- | --------------------------------------- | -| vipType | num | 大会员类型 | 0:无<br />1:月会员<br />2:年以上会员 | -| vipDueDate | num | 大会员到期时间 | 毫秒 时间戳 | -| dueRemark | str | (?) | | -| accessStatus | num | (?) | | -| vipStatus | num | 大会员状态 | 0:无<br />1:有 | -| vipStatusWarn | str | (?) | | -| theme_type | num | 会员样式 id | | -| label | obj | 会员铭牌样式 | | -| avatar_subscript | num | (?) | | -| avatar_subscript_url | str | (?) | | -| nickname_color | str | 昵称颜色 | | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ------------------------------------------------------------ | -| path | str | (?) | | -| text | str | 会员类型文案 | | -| label_theme | str | 会员类型 | vip:大会员<br />annual_vip:年度大会员<br />ten_annual_vip:十年大会员<br />hundred_annual_vip:百年大会员 | -| text_color | str | 文字颜色? | | -| bg_style | num | (?) | | -| bg_color | str | 背景颜色? | | -| border_color | str | 描边颜色? | | - -`member`中的`fans_detail`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ---- | -| uid | num | 用户 mid | | -| medal_id | num | 粉丝标签 id | | -| medal_name | str | 粉丝标签名 | | -| score | num | (?) | | -| level | num | 当前标签等级 | | -| intimacy | num | (?) | | -| master_status | num | (?) | | -| is_receive | num | (?) | | - -`member`中的`user_sailing`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----------------------------- | ------------ | ---- | -| pendant | 无效时:null<br />有效时:obj | 头像框信息 | | -| cardbg | 无效时:null<br />有效时:obj | 评论卡片装扮 | | -| cardbg_with_focus | null | (?) | | - -`user_sailing`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | -------------- | -------------------------------------- | -| id | num | 头像框 id | | -| name | str | 头像框名称 | | -| image | str | 头像框图片 url | | -| jump_url | str | 空 | | -| type | str | 装扮类型 | suit:一般装扮<br />vip_suit:vip 装扮 | -| image_enhance | str | (?) | | -| image_enhance_frame | str | (?) | | - -`user_sailing`中的`cardbg`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------------------ | -------------------------------------- | -| id | num | 评论条目装扮 id | | -| name | str | 评论条目装扮名称 | | -| image | str | 评论条目装扮图片 url | | -| jump_url | str | 评论条目装扮商城页面 url | | -| fan | obj | 粉丝专属信息 | | -| type | str | 装扮类型 | suit:一般装扮<br />vip_suit:vip 装扮 | - -`cardbg`中的`fan`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------------ | ---------------- | -| is_fan | num | 是否为粉丝专属装扮 | 0:否<br />1:是 | -| number | num | 粉丝专属编号 | | -| color | str | 数字颜色 | 颜色码 | -| name | str | 装扮名称 | | -| num_desc | str | 粉丝专属编号 | 字串格式 | - -`评论条目`中的`content`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------------------ | ------------------------------------------------------------ | -| message | str | 评论内容 | **重要** | -| plat | num | 评论发送端 | 1:web端<br />2:安卓客户端<br />3:ios 客户端<br />4:wp 客户端 | -| device | str | 评论发送平台设备 | | -| members | array | at 到的用户信息 | | -| emote | obj | 需要渲染的表情转义 | 评论内容无表情则无此项 | -| jump_url | obj | 需要高亮的超链转义 | | -| max_line | num | 6 | 收起最大行数 | -| pictures | array | 评论图片数组 | | - -`content`中的`members`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | -------------------------------- | -| 0 | obj | at到的用户 1 | 基本同`评论条目`中的`member`对象 | -| n | obj | at到的用户 (n+1) | 项数为at到的不同的用户数 | -| …… | obj | …… | …… | - -`content`中的`emote`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------- | -------- | -| {表情转义符} | obj | 表情转义符信息 1 | | -| …… | obj | 表情转义符信息 n | 向下扩展 | - -`emote`中的`{表情转义符}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | -------------------------------------------------------- | -| id | num | 表情 id | | -| package_id | num | 表情包 id | | -| state | num | 0 | | -| type | num | 表情类型 | 1:免费<br />2:会员专属<br />3:购买所得<br />4:颜文字 | -| attr | num | (?) | | -| text | str | 表情转义符 | | -| url | str | 表情图片 url | | -| meta | obj | 属性信息 | | -| mtime | num | 表情创建时间 | 时间戳 | -| jump_title | str | 表情名称 | | - -`{表情转义符}`中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---------------- | -| size | num | 表情尺寸信息 | 1:小<br />2:大 | -| alias | str | 简写名 | 无则无此项 | - -`content`中的`jump_url`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------- | -------- | -| {超链转义} | obj | 超链转义信息 1 | | -| …… | obj | 超链转义信息 n | 向下扩展 | - -`jump_url`中的`{超链转义}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------- | ---- | -| title | str | 标题 | | -| state | num | 图标 url | | -| prefixIcon | str | (?) | | -| appUrlSchema | str | (?) | | -| appName | str | (?) | | -| appPackageName | str | (?) | | -| clickReport | str | 上报 id | | - -`content`中的`pictures`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | -------- | -| img_src | str | 图片地址 | | -| img_width | num | 图片宽度 | | -| img_height | num | 图片高度 | | -| img_size | num | 图片大小 | 单位KB | - -`评论条目`中的`replies`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ------------------------------------------------------------ | -| 0 | obj | 回复条目1 | **为本对象的递归嵌套**<br />**仅可嵌套一层**<br />按照热度顺序排列 | -| 1 | obj | 回复条目2 | | -| 2 | obj | 回复条目3 | 最后一项 | - -`评论条目`中的`folder`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------------- | ---- | -| has_folded | bool | 是否有被折叠的二级评论 | | -| is_folded | bool | 评论是否被折叠 | | -| rule | str | 相关规则页面 url | | - -`评论条目`中的`up_action`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------------- | ----------------------- | -| like | bool | 是否UP主觉得很赞 | false:否<br />true:是 | -| reply | bool | 是否被UP主回复 | false:否<br />true:是 | - -`评论条目`中的`card_label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ------------ | ----------------------------- | -| rpid | num | 评论 rpid | | -| text_content | str | 标签文本 | 已知有`妙评` | -| text_color_day | str | 日间文本颜色 | 十六进制颜色值,下同 | -| text_color_night | str | 夜间文本颜色 | | -| label_color_day | str | 日间标签颜色 | | -| label_color_night | str | 夜间标签颜色 | | -| image | str | | 作用不明 | -| type | str | 1 | 作用不明 | -| background | str | 背景图片 url | | -| background_width | num | 背景图片宽度 | | -| background_height | num | 背景图片高度 | | -| jump_url | str | 跳转链接 | | -| effect | num | 0 | 作用不明,可能用于控制动画,下同 | -| effect_start_time | num | 0 | | - -`评论条目`中的`reply_control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | -------- | -------------------- | -| max_line | num | 6 | 用于控制折叠状态下的最大显示行数 | -| sub_reply_entry_text | str | 回复提示 | `共 xx 条回复` | -| sub_reply_title_text | str | 回复提示 | `相关回复共有 xx 条` | -| time_desc | str | 时间提示 | `xx 天/小时 前发布` | -| location | str | IP属地 | `IP属地:xx`<br />评论者发送评论时的IP地址属地<br />仅对2022-07-25 11:00及以后发布的评论有效<br />需要登录| -| support_share | bool | 是否可分享 | false:否<br />true:是 | diff --git a/docs/creativecenter/opus.md b/docs/creativecenter/opus.md deleted file mode 100644 index 75f18fe..0000000 --- a/docs/creativecenter/opus.md +++ /dev/null @@ -1,110 +0,0 @@ -# 图文操作 - -## 删除动态 - -> https://api.bilibili.com/x/dynamic/feed/operate/remove - -*请求方法: POST* - -认证方式:Cookie (SESSDATA) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ------ | ---- | ------ | ---- | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | -| platform | string | 平台标识 | 不必要 | 如 `web` | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ------ | -------------- | ------ | ---- | -| dyn_id_str | string | 动态的 opus id | 必要 | | -| dyn_type | number | 动态类型? | 不必要 | | -| rid_str | string | | 不必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ------ | ---- | -| code | number | 返回值 | 0: 成功<br />-101: 帐号未登录<br />-111: csrf 校验失败<br />-400: 请求错误<br />4101001: 参数错误<br />4101144: 只能删除自身的动态 | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | -| data | object | 空对象 | | - -**示例:** - -删除动态 `667831766353969169` - -```shell -curl 'https://api.bilibili.com/x/dynamic/feed/operate/remove' \ ---url-query 'csrf=05fa8d65755655c2893d40d3692d4c70' \ --H 'content-type: application/json' ---data-raw '{"dyn_id_str":"667831766353969169"}' \ --b 'SESSDATA=xxxxxx' \ -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 删除专栏 - -> <https://member.bilibili.com/x/web/article/delete> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| aid | num | 文章cvid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />37104:无权限操作他人专栏 | -| message | str | 错误信息 | 默认为`0` | -| ttl | num | 1 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/article/delete' \ - --data-urlencode 'aid=114514' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/creativecenter/railgun.md b/docs/creativecenter/railgun.md deleted file mode 100644 index 8b171bb..0000000 --- a/docs/creativecenter/railgun.md +++ /dev/null @@ -1,274 +0,0 @@ -# 电磁力相关 - -电磁力每周日下午刷新 - -## 获取电磁力等级(web端) - -> https://api.bilibili.com/studio/up-rating/v3/rating/info - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ---------------- | -| mid | num | 当前用户mid | | -| level | num | 电磁力等级 | | -| score | num | 电磁力分数 | | -| credit | num | 信用分 | | -| state | num | ? | 一直是2 | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/elec/user' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": ***, - "level": 4, - "score": 326, - "credit": 100, - "state": 2, - "update_date": 1694966400 - } -} -``` - -</details> - -## (失效)获取电磁力详细数值(双端) - -> https://api.bilibili.com/studio/up-rating/rating/summary - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | -------------- | ---- | -| date | str | 数据刷新时间 | YYYY-MM-DD | -| level | obj | 电磁力等级 | | -| creative | obj | 创作力 | | -| influence | obj | 影响力 | | -| credit | obj | 信用分 | | - -`data`中的`level` `creative` `influence` `credit`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| data | num | 数值 | | -| prev | num | ??? | **作用尚不明确** | -| desc | str | 描述 | | -| date | num | 刷新时间 | 时间戳 | - -**示例:** - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/studio/up-rating/rating/summary' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/studio/up-rating/rating/summary' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "date": "2020-07-05", - "level": { - "data": 1, - "prev": 0, - "desc": "正式开启创作之路,希望未来的路上我们携手相伴,创作更多优质内容~", - "date": 1593878400 - }, - "creative": { - "data": 39, - "prev": 39, - "desc": "考察近一年来的创作行为,良好的原创投稿行为和互动数据有助于提升创作力。", - "date": 1593878400 - }, - "influence": { - "data": 54, - "prev": 54, - "desc": "根据近一年活跃粉丝数据进行评估,良好的粉丝活跃度是影响力的基础。", - "date": 1593878400 - }, - "credit": { - "data": 100, - "prev": 100, - "desc": "良好的投稿记录将维持较高的信用分,违反投稿公约的行为将扣除信用分。", - "date": 1594106147 - } - } -} -``` - -</details> - -## 获取电磁力数值历史变化(双端) - -> https://api.bilibili.com/studio/up-rating/rating/history - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | -------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 目标数据类型 | 必要 | 类型代码见下表 | - -类型代码`type`: - -| 代码 | 含义 | -| ---- | ------ | -| 1 | 创作力 | -| 2 | 影响力 | -| 3 | 信用分 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ------------ | -------- | -| date | array | 数据记录时间 | 每周更新 | -| score | array | 电磁力等级 | 每周更新 | - -`data`中的`date`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------------- | -| 0 | str | 1周前的日期 | MM-DD | -| n | str | (n+1)周前的日期 | 与数值一一对应 | -| …… | str | …… | …… | -| 7 | str | 8周前的日期 | 最后一条 | - -`data`中的`score`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------------- | -| 0 | num | 1周前的数值 | | -| n | num | (n+1)周前的数值 | 与日期一一对应 | -| …… | num | …… | …… | -| 7 | num | 8周前的数值 | 最后一条 | - -**示例:** - -查询创作力的历史变化 - -Cookie方式: - -```shell -curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \ ---data-urlencode 'type=1' \ --b 'SESSDATA=xxx' -``` - -APP方式: - -```shell -curl -G 'https://api.bilibili.com/studio/up-rating/rating/history' \ ---data-urlencode 'type=1' \ ---data-urlencode 'access_key=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "date": [ - "05-17", - "05-24", - "05-31", - "06-07", - "06-14", - "06-21", - "06-28", - "07-05" - ], - "score": [ - 48, - 48, - 49, - 49, - 49, - 49, - 49, - 49 - ] - } -} -``` - -</details> diff --git a/docs/creativecenter/season.md b/docs/creativecenter/season.md deleted file mode 100644 index 8290bde..0000000 --- a/docs/creativecenter/season.md +++ /dev/null @@ -1,1088 +0,0 @@ -# 合集管理 - -关于用户空间的合集及视频列表参见 [合集和视频列表信息](../video/collection.md) - -## 获取合集列表 - -> https://member.bilibili.com/x2/creative/web/seasons - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ----------- | ----------------- | -| pn | num | 页码 | 必要 | 默认为 1 | -| ps | num | 每页数量 | 必要 | 默认为 30 | -| order | str | 排序方式 | 不必要 | 创建时间: ctime<br />修改时间: mtime | -| sort | str | 排序方式 | 不必要 | 创建时间: asc<br />修改时间: desc | -| draft | num | 1 | 不必要 | 作用尚不明确 | - -**JSON回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| seasons | arr | 合集列表 | | -| tip | obj | 内容 `title` `url` 均为空 | | -| total | num | 合集总数 | | -| play_type | num | 1 | 作用尚不明确 | - -`seasons`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| season | obj | 合集信息 | | -| course | null | | | -| checkin | obj | 审核信息? | | -| seasonStat | obj | 合集统计信息 | | -| sections | obj | 小节列表 | | -| part_episodes | arr | 合集视频列表 | | - -`seasons`数组中的对象中的`season`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| id | num | 合集 ID | | -| title | str | 合集标题 | | -| desc | str | 合集描述 | | -| cover | str | 合集封面 URL | | -| isEnd | num | 是否已完结? | 0: 未完结 | -| mid | num | 合集作者 ID | | -| isAct | num | 是否为活动合集? | 0: 否 | -| is_pay | num | 是否付费? | 0: 否 | -| state | num | 合集状态? | 0: 正常显示<br />-6: 正在审核 | -| partState | num | 合集分段状态? | 0 | -| signState | num | 合集签名状态? | 0 | -| rejectReason | str | 合集拒绝原因? | | -| ctime | num | 创建时间 | | -| mtime | num | 修改时间 | | -| no_section | num | 是否设小节 | 1: 不设小节 | -| forbid | num | 合集是否禁止? | 0: 否 | -| protocol_id | str | 空 | | -| ep_num | num | 0 | | -| season_price | num | 合集价格? | 0: 免费 | -| is_opened | num | 是否公开? | 1: 公开 | -| has_charging_pay | num | 是否充电付费? | 0: 否 | - -`seasons`数组中的对象中的`checkin`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| status | num | 状态? | 0: 正常显示 | -| status_reason | str | 状态原因? | | -| season_status | num | 合集审核状态? | 1: 审核通过 | - -`seasons`数组中的对象中的`seasonStat`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| view | num | 播放量 | | -| danmaku | num | 弹幕数 | | -| reply | num | 评论数 | | -| fav | num | 收藏数 | | -| coin | num | 硬币数 | | -| share | num | 分享数 | | -| nowRank | num | 当前排名? | | -| hisRank | num | 历史最高排名? | | -| like | num | 点赞数 | | -| subscription | num | 订阅数 | | -| vt | num | 0 | | - -`seasons`数组中的对象中的`sections`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| sections | arr | 小节列表 | 套了个娃 | - -`seasons`数组中的对象中的`sections`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| id | num | 小节 ID | | -| type | num | 1 | | -| seasonId | num | 合集 ID | | -| title | str | 小节标题 | | -| order | num | 排序 | | -| state | num | 状态? | 0: 正常 | -| partState | num | 合集分段状态? | 0: 正常 | -| rejectReason | str | 拒绝原因? | | -| ctime | num | 创建时间 | | -| mtime | num | 修改时间 | | -| epCount | num | 视频数量 | | -| cover | str | 封面 URL | | -| has_charging_pay | num | 是否充电付费? | 0: 否 | -| Episodes | null | | | - -`seasons`数组中的对象中的`part_episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| id | num | 合集内视频 ID | | -| title | str | 视频标题 | | -| aid | num | 视频 aid | | -| bvid | str | 视频 bvid | | -| cid | num | 视频 cid | | -| seasonId | num | 合集 ID | | -| sectionId | num | 小节 ID | | -| order | num | 排序编号 | | -| videoTitle | str | 空 | | -| archiveTitle | str | 空 | | -| archiveState | num | 0 | | -| rejectReason | str | 拒绝理由? | | -| state | num | 0 | | -| cover | str | 封面 URL | | -| is_free | num | 是否免费? | 0: 免费 | -| aid_owner | bool | false | | -| charging_pay | num | 充电付费? | 0: 否 | - -**示例:** - -```shell -curl -G 'https://member.bilibili.com/x2/creative/web/seasons' \ ---data-urlencode 'pn=1' \ ---data-urlencode 'ps=30' \ --b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "seasons": [ - { - "season": { - "id": 3541247, - "title": "🍥Debian", - "desc": "这里是泽生折腾 Debian GNU/Linux 的珍贵影像记录喵~", - "cover": "https://archive.biliimg.com/bfs/archive/ec51de61b53159c5e2430cf963f5f97e692baeaf.jpg", - "isEnd": 0, - "mid": 645769214, - "isAct": 0, - "is_pay": 0, - "state": 0, - "partState": 0, - "signState": 0, - "rejectReason": "", - "ctime": 1722573640, - "mtime": 1722577206, - "no_section": 1, - "forbid": 0, - "protocol_id": "", - "ep_num": 0, - "season_price": 0, - "is_opened": 1, - "has_charging_pay": 0 - }, - "course": null, - "checkin": { - "status": 0, - "status_reason": "", - "season_status": 1 - }, - "seasonStat": { - "view": 6793, - "danmaku": 21, - "reply": 93, - "fav": 64, - "coin": 26, - "share": 12, - "nowRank": 0, - "hisRank": 0, - "like": 141, - "subscription": 0, - "vt": 0 - }, - "sections": { - "sections": [ - { - "id": 3954033, - "type": 1, - "seasonId": 3541247, - "title": "正片", - "order": 1, - "state": 0, - "partState": 0, - "rejectReason": "", - "ctime": 1722573640, - "mtime": 1722577206, - "epCount": 2, - "cover": "http://i2.hdslb.com/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", - "has_charging_pay": 0, - "Episodes": null - } - ] - }, - "part_episodes": [ - { - "id": 77260687, - "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", - "aid": 1906473802, - "bvid": "BV1MU411S7iJ", - "cid": 1625992822, - "seasonId": 3541247, - "sectionId": 3954033, - "order": 1, - "videoTitle": "", - "archiveTitle": "", - "archiveState": 0, - "rejectReason": "", - "state": 0, - "cover": "http://i2.hdslb.com/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", - "is_free": 0, - "aid_owner": false, - "charging_pay": 0 - }, - { - "id": 77260688, - "title": "十多年前的电脑运行Debian12的启动过程", - "aid": 1956170305, - "bvid": "BV1Ay411i7Ph", - "cid": 1607067247, - "seasonId": 3541247, - "sectionId": 3954033, - "order": 2, - "videoTitle": "", - "archiveTitle": "", - "archiveState": 0, - "rejectReason": "", - "state": 0, - "cover": "http://i0.hdslb.com/bfs/archive/0bff6624fdfcbf3326fba1837fef093d455c846a.jpg", - "is_free": 0, - "aid_owner": false, - "charging_pay": 0 - } - ] - }, - { - "season": { - "id": 3541327, - "title": "BACollect", - "desc": "", - "cover": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "isEnd": 0, - "mid": 645769214, - "isAct": 0, - "is_pay": 0, - "state": 0, - "partState": 0, - "signState": 0, - "rejectReason": "", - "ctime": 1722574656, - "mtime": 1722574658, - "no_section": 1, - "forbid": 0, - "protocol_id": "", - "ep_num": 0, - "season_price": 0, - "is_opened": 1, - "has_charging_pay": 0 - }, - "course": null, - "checkin": { - "status": 0, - "status_reason": "", - "season_status": 0 - }, - "seasonStat": { - "view": 0, - "danmaku": 0, - "reply": 0, - "fav": 0, - "coin": 0, - "share": 0, - "nowRank": 0, - "hisRank": 0, - "like": 0, - "subscription": 0, - "vt": 0 - }, - "sections": { - "sections": [ - { - "id": 3954127, - "type": 1, - "seasonId": 3541327, - "title": "正片", - "order": 1, - "state": 0, - "partState": 0, - "rejectReason": "", - "ctime": 1722574656, - "mtime": 1722574656, - "epCount": 0, - "cover": "http://static.hdslb.com/images/transparent.gif", - "has_charging_pay": 0, - "Episodes": null - } - ] - }, - "part_episodes": null - } - ], - "tip": { - "title": "", - "url": "" - }, - "total": 2, - "play_type": 1 - } -} -``` - -</details> - -## 创建合集 - -> ttps://member.bilibili.com/x2/creative/web/season/add - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -注: 有人工审核 - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| title | str | 合集标题 | 必要 | | -| desc | str | 合集简介 | 不必要 | | -| cover | str | 封面图 | 必要 | 从 [上传封面](upload.md#上传封面) 处获取 | -| season_price | num | 0 | 不必要 | 作用尚不明确 | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | num | 合集 ID | | - -**示例:** - -```shell -curl -X POST 'https://member.bilibili.com/x2/creative/web/season/add' \ ---data-urlencode 'title=🍥Debian' \ ---data-urlencode 'desc=这里是泽生折腾 Debian GNU/Linux 的珍贵影像记录喵~' \ ---data-urlencode 'cover=https://archive.biliimg.com/bfs/archive/ec51de61b53159c5e2430cf963f5f97e692baeaf.jpg' \ ---data-urlencode 'season_price=0' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": 3541247 -} -``` - -</details> - -## 添加视频到合集 - -> https://member.bilibili.com/x2/creative/web/season/section/episodes/add - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| episode | array | 视频列表 | 必要 | | -| section_id | num | 合集小节 ID | 必要 | | - -`episode` 数组中的对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| aid | num | 视频 aid | 必要 | | -| cid | num | 稿件 cid | 必要 | | -| title | str | 合集内单集标题 | 必要 | | -| charging_pay | num | 0 | 不必要 | 作用尚不明确 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | - -**示例:** - -假设您已经把请求有效荷载放在 `payload.json` 文件中: - -```json -{ - "sectionId": 3954033, - "episodes": [ - { - "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", - "aid": 1906473802, - "cid": 1625992822, - "charging_pay": 0 - }, - { - "title": "十多年前的电脑运行Debian12的启动过程", - "aid": 1956170305, - "cid": 1607067247, - "charging_pay": 0 - } - ] -} -``` - -```shell -curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/section/episodes/add' \ ---url-query 'csrf=xxx' \ --H 'Content-Type: application/json' \ ---data-binary @payload.json \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 编辑合集小节 - -> https://member.bilibili.com/x2/creative/web/season/section/edit - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| section | obj | 小节信息 | 必要 | | -| sorts | array | 排序列表 | 必要 | | - -`section` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 小节 ID | 必要 | | -| seasonId | num | 合集 ID | 必要 | | -| title | str | 小节标题 | 必要 | | -| type | num | 1 | 必要 | | - -`sorts` 数组中的对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 合集内视频 ID | 必要 | | -| order | num | 排序位置 | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | - -**示例:** - -假设您已经把请求有效荷载放在 `payload.json` 文件中: - -```json -{ - "section": { - "id": 3954033, - "type": 1, - "seasonId": 3541247, - "title": "正片" - }, - "sorts": [ - { - "id": 77260687, - "sort": 1 - }, - { - "id": 77260688, - "sort": 2 - } - ] -} -``` - -```shell -curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/section/edit' \ ---url-query 'csrf=xxx' \ --H 'Content-Type: application/json' \ ---data-binary @payload.json \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 编辑合集信息 - -> https://member.bilibili.com/x2/creative/web/season/edit - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -注: 也有人工审核 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| season | obj | 合集信息 | 必要 | | -| sorts | array | 排序列表 | 必要 | | - -`season` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 合集 ID | 必要 | | -| title | str | 合集标题 | 必要 | | -| cover | str | 封面图 | 必要 | 从 [上传封面](upload.md#上传封面) 处获取 | -| desc | str | 合集简介 | 不必要 | | -| season_price | num | 0 | 不必要 | 作用尚不明确 | -| isEnd | num | 是否完结 | 不必要 | 0:未完结<br />1:完结 | - -`sorts` 数组中的对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 小节 ID | 必要 | | -| sort | num | 排序位置 | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | - -**示例:** - -假设您已经把请求有效荷载放在 `payload.json` 文件中: - -```json -{ - "season": { - "cover": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "id": 3541327, - "title": "IWILLBEDEL" - }, - "sorts": [ - { - "id": 3954127, - "sort": 1 - } - ] -} -``` - -```shell -curl -X POST --url 'https://member.bilibili.com/x2/creative/web/season/edit' \ ---url-query 'csrf=xxx' \ --H 'Content-Type: application/json' \ ---data-binary @payload.json \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 删除合集 - -> https://member.bilibili.com/x2/creative/web/season/del - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| id | num | 合集 ID | 必要 | | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | - -**示例:** - -删除合集 `id=3541327` - -```shell -curl -X POST 'https://member.bilibili.com/x2/creative/web/season/del' \ ---data-urlencode 'id=3541327' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 获取合集小节中的视频 - -> https://member.bilibili.com/x2/creative/web/season/section - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -可以在给合集排序时使用, 可以获取别人的 - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| id | num | 合集 ID | 必要 | | - -**JSON 回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| section | obj | 小节信息 | | -| episodes | arr | 小节中的视频 | | - -`data` 对象中的 `section` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| id | num | 小节 ID | | -| type | num | 小节类型 | | -| seasonId | num | 合集 ID | | -| title | str | 小结标题 | | -| order | str | 排序编号? | | -| isEnd | num | 是否已完结? | 0: 未完结 | -| state | num | 合集状态? | 0: 正常显示<br />-6: 正在审核 | -| partState | num | 合集分段状态? | 0 | -| rejectReason | str | 合集拒绝原因? | | -| ctime | num | 创建时间 | | -| mtime | num | 修改时间 | | -| epCount | num | 小节视频总数 | | -| cover | num | 合集封面 | | -| show | num | 是否公开? | 1: 公开 | -| has_charging_pay | num | 是否充电付费? | 0: 否 | -| Episodes | null | | | -| has_pugv_pay | num | 是否 PUGV 付费? | 0: 否 | - -`data` 对象中的 `episodes`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| id | num | 合集内视频 ID | | -| title | str | 视频标题 | | -| aid | num | 视频 aid | | -| bvid | str | 视频 bvid | | -| cid | num | 视频 cid | | -| seasonId | num | 合集 ID | | -| sectionId | num | 小节 ID | | -| order | num | 排序编号 | | -| videoTitle | str | 视频标题 | | -| archiveTitle | str | 看起来也是标题 | | -| archiveState | num | 0 | | -| rejectReason | str | 拒绝理由? | | -| state | num | 0 | | -| cover | str | 封面 URL | | -| is_free | num | 是否免费? | 0: 免费 | -| aid_owner | bool | 是否视频所有者 | true:是所有者 | -| charging_pay | num | 充电付费? | 0: 否 | - - -**示例:** - -获取合集小节 176088 的视频 - -```shell -curl -G --url 'https://member.bilibili.com/x2/creative/web/season/section' \ ---url-query 'id=176088' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -会返回全部的,由于很长,这里只保留三个作为例子 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "section": { - "id": 176088, - "type": 1, - "seasonId": 152812, - "title": "正片", - "order": 1, - "state": 0, - "partState": 0, - "rejectReason": "", - "ctime": 1643250822, - "mtime": 1739466002, - "epCount": 112, - "cover": "http://i1.hdslb.com/bfs/archive/4439a182b142d92a169609e6e14e7217b3e14e0d.jpg", - "has_charging_pay": 0, - "Episodes": null, - "show": 1, - "has_pugv_pay": 0 - }, - "episodes": [ - { - "id": 109100674, - "title": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", - "aid": 113997323963614, - "bvid": "BV14BNfeSE5c", - "cid": 28376042631, - "seasonId": 152812, - "sectionId": 176088, - "order": 1, - "videoTitle": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", - "archiveTitle": "「开箱评测」三星Note8 EMR2笔对比公版Wacom笔 套娃笔首选 10寸 RK PX30 Wacom 电子书 天喻墨学 M2 M3", - "archiveState": 0, - "rejectReason": "", - "state": 0, - "cover": "", - "is_free": 0, - "aid_owner": true, - "charging_pay": 0, - "member_first": 0, - "pugv_pay": 0 - }, - { - "id": 108733886, - "title": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", - "aid": 113982291576104, - "bvid": "BV1YyNvetEbX", - "cid": 28325121446, - "seasonId": 152812, - "sectionId": 176088, - "order": 2, - "videoTitle": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", - "archiveTitle": "「开箱评测」拆解 椭圆形的第三方AirTag GRTSZ S2 Tag", - "archiveState": 0, - "rejectReason": "", - "state": 0, - "cover": "", - "is_free": 0, - "aid_owner": true, - "charging_pay": 0, - "member_first": 0, - "pugv_pay": 0 - }, - { - "id": 106045797, - "title": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", - "aid": 113892936122993, - "bvid": "BV1ZFFKeTEkr", - "cid": 28087484764, - "seasonId": 152812, - "sectionId": 176088, - "order": 3, - "videoTitle": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", - "archiveTitle": "「开箱评测」这帕姆怎么射不出来呢! 星穹铁道 KFC联动 财神帕姆 太可爱了", - "archiveState": 0, - "rejectReason": "", - "state": 0, - "cover": "", - "is_free": 0, - "aid_owner": true, - "charging_pay": 0, - "member_first": 0, - "pugv_pay": 0 - } - ] - } -} -``` - -</details> - -## 编辑投稿视频合集 - -> https://member.bilibili.com/x2/creative/web/season/switch -*请求方式: POST* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | - -**正文参数(application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| aid | num | 视频 ID | 必要 | | -| season_id | num | null | 合集 ID | 必要 | null 表示从合集中移除 | -| section_id | num | null | 小节 ID | 必要 | null 表示从小节中移除 | -| title | str | 视频标题 | 必要 | | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 非必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| season_id | num | null | | | -| section_id | num | null | | | -| title | str | 标题 | | -| aid | num | aid | | -| csrf | num | CSRF Token (位于 Cookie 中 bili_jct) | | - -**示例:** - -```shell -curl -X POST "https://member.bilibili.com/x2/creative/web/season/switch" \ ---url-query "csrf=xxxxxxxxxxxx" \ --H "Content-Type: application/json" \ ---data '{ - "aid": 123456, - "season_id": 654321, - "section_id": 789012, - "title": "新视频标题" -}' \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "season_id": null, - "section_id": null, - "title": "标题", - "aid": 123, - "csrf": "eqweeqw" -} -``` - -</details> - -## aid反查合集id - -> https://member.bilibili.com/x2/creative/web/season/aid -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 视频 aid | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - - - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| season | obj | 合集信息 | | - - -`season` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| id | num | 合集 ID | | -| title | str | 合集标题 | | -| cover | str | 合集封面 URL | | -| desc | str | 合集描述 | | -| isEnd | num | 是否已完结 | 0: 未完结<br />1: 已完结 | -| mid | num | 合集作者 ID | | -| isAct | num | 是否为活动合集 | 0: 否<br />1: 是 | -| is_pay | num | 是否付费 | 0: 否<br />1: 是 | -| state | num | 合集状态 | 0: 正常显示<br />-6: 正在审核 | -| partState | num | 合集分段状态 | 0: 正常 | -| signState | num | 合集签名状态 | 0: 正常 | -| rejectReason | str | 合集拒绝原因 | | -| ctime | num | 创建时间 | UNIX 时间戳 | -| mtime | num | 修改时间 | UNIX 时间戳 | -| no_section | num | 是否设小节 | 1: 不设小节 | -| forbid | num | 合集是否禁止 | 0: 否<br />1: 是 | -| protocol_id | str | 协议 ID | | -| ep_num | num | 视频数量 | | -| season_price | num | 合集价格 | 0: 免费 | -| is_opened | num | 是否公开 | 1: 公开<br />0: 不公开 | -| has_charging_pay | num | 是否充电付费 | 0: 否<br />1: 是 | -| has_pugv_pay | num | 是否 PUGV 付费 | 0: 否<br />1: 是 | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x2/creative/web/season/aid" \ ---data-urlencode "id=123456" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 12, - "title": "合集标题", - "desc": "", - "cover": "", - "isEnd": 0, - "mid": 123, - "isAct": 0, - "is_pay": 0, - "state": 0, - "partState": 0, - "signState": 0, - "rejectReason": "", - "ctime": 1667232000, - "mtime": 1667232000, - "no_section": 1, - "forbid": 0, - "protocol_id": "", - "ep_num": 0, - "season_price": 0, - "is_opened": 1, - "has_charging_pay": 0, - "has_pugv_pay": 0 - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/creativecenter/statistics&data.md b/docs/creativecenter/statistics&data.md deleted file mode 100644 index bfaef6f..0000000 --- a/docs/creativecenter/statistics&data.md +++ /dev/null @@ -1,890 +0,0 @@ -# 统计与数据 - -统计与数据次日中午12刷新 - -## UP主视频状态数据 - -> https://member.bilibili.com/x/web/index/stat - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | -------------- | ---- | -| inc_coin | num | 新增投币数 | | -| inc_elec | num | 新增充电数 | | -| inc_fav | num | 新增收藏数 | | -| inc_like | num | 新增点赞数 | | -| inc_share | num | 新增分享数 | | -| incr_click | num | 新增播放数 | | -| incr_dm | num | 新增弹幕数 | | -| incr_fans | num | 新增粉丝数 | | -| incr_reply | num | 新增评论数 | | -| total_click | num | 总计播放数 | | -| total_coin | num | 总计投币数 | | -| total_dm | num | 总计弹幕数 | | -| total_elec | num | 总计充电数 | | -| total_fans | num | 总计粉丝数 | | -| total_fav | num | 总计收藏数 | | -| total_like | num | 总计点赞数 | | -| total_reply | num | 总计评论数 | | -| total_share | num | 总计分享数 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/index/stat' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "inc_coin": 0, - "inc_elec": 0, - "inc_fav": 0, - "inc_like": 0, - "inc_share": 0, - "incr_click": 0, - "incr_dm": 0, - "incr_fans": 1, - "incr_reply": 0, - "total_click": 9, - "total_coin": 1, - "total_dm": 0, - "total_elec": 0, - "total_fans": 29, - "total_fav": 1, - "total_like": 1, - "total_reply": 0, - "total_share": 0 - } -} -``` - -</details> - -## 新版UP主视频数据比较 - -> https://member.bilibili.com/x/web/data/archive_diagnose/compare - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | -------------- | -| t | num | 时间戳 | 可选 | | -| size | num | 比较最近的N条视频 | 可选,默认5 | 似乎没有最大值,或者最大值很大 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | ---- | -| list | list | 最近的视频 | | - -`data`中的`list`项: -> [!TIP] -> 这里的数字一般都是百分比,小数点后保留两位,100代表1%,10000代表100% - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | ---- | -| aid | num | av号 | | -| bvid | str | bv号 | | -| cover | str | 封面url | | -|title| str|标题| -|pubtime|num|发布时间| -|duration|num|视频长度(秒)| -|play|num|播放数|| -|vt|num|未知 -|like|num|点赞数 -|comment|num|评论数 -|dm|num|弹幕数 -|fav|num|收藏数| -|coin|num|投币数 -|share|num|分享数 -|full_play_ratio|num|完播比,用户平均在百分之多少退出 -|play_viewer_rate|num|游客播放数,这个视频有多少是游客播放 -|active_fans_rate|num|粉丝观看率,多少粉丝看了这个视频 -|active_fans_med|num|? -|tm_rate|num|封标点击率 -|tm_rate_med|num|你自己平均封标点击率 -|tm_fan_simi_rate_med|num|同类up粉丝封标点击率 -|tm_viewer_simi_rate_med|num|同类up游客封标点击率 -|tm_fan_rate|num|粉丝封标点击率 -|tm_viewer_rate|num|游客封标点击率 -|tm_pass_rate|num|封标点击率超过n%同类稿件 -|tm_fan_pass_rate|num|粉丝封标点击率超过n%同类稿件 -|tm_viewer_pass_rate|num|游客封标点击率超过n%同类稿件 -|crash_rate|num|3秒退出率 -|crash_rate_med|num|? -|crash_fan_simi_rate_med|num|同类up粉丝3秒退出率 -|crash_viewer_simi_rate_med|num|同类up游客3秒退出率 -|crash_fan_rate|num|粉丝3秒退出率 -|crash_viewer_rate|num|游客3秒退出率 -|interact_rate|num|互动率 -|interact_rate_med|num| -|interact_fan_simi_rate_med|num|同类up粉丝互动率 -|interact_viewer_simi_rate_med|num|同类up游客互动率 -|interact_fan_rate|num|粉丝互动率 -|interact_viewer_rate|num|游客互动率 -|avg_play_time|num|平均播放时间|注意:此字段总是0,可能b站正在写代码,或者和播放量改播放时长有关? -|total_new_attention_cnt|num|涨粉 -|play_trans_fan_rate|num|播转粉率 -|play_trans_fan_rate_med|num|其他up平均播转粉率 - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/data/archive_diagnose/compare?size=10' \ --b 'SESSDATA=xxx' -``` - -## UP主专栏状态数据 - -> https://member.bilibili.com/x/web/data/article - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | ---- | -| view | num | 总计阅读数 | | -| reply | num | 总计评论数 | | -| like | num | 总计点赞数 | | -| coin | num | 总计投币数 | | -| fav | num | 总计收藏数 | | -| share | num | 总计分享数 | | -| incr_view | num | 新增阅读数 | | -| incr_reply | num | 新增评论数 | | -| incr_like | num | 新增点赞数 | | -| incr_coin | num | 新增投币数 | | -| incr_fav | num | 新增收藏数 | | -| incr_share | num | 新增分享数 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/data/article' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "view": 290, - "reply": 17, - "like": 34, - "coin": 9, - "fav": 15, - "share": 7, - "incr_view": 6, - "incr_reply": 0, - "incr_like": 0, - "incr_coin": 0, - "incr_fav": 0, - "incr_share": 0 - } -} -``` - -</details> - -## 视频数据增量趋势 - -> https://member.bilibili.com/x/web/data/pandect - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -数据为前30天 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | -------------- | -| type | num | 目标数据类型 | 必要 | 类型代码见下表 | - -类型代码`type`: - -| 代码 | 含义 | -| ---- | ---- | -| 1 | 播放 | -| 2 | 弹幕 | -| 3 | 评论 | -| 4 | 分享 | -| 5 | 投币 | -| 6 | 收藏 | -| 7 | 充电 | -| 8 | 点赞 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | array | 趋势列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------- | -| 0 | obj | 1天前的数据 | | -| n | obj | (n+1)天前的数据 | | -| …… | obj | …… | …… | -| 29 | obj | 30天前的数据 | 最后一条 | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | -------------------- | -| date_key | num | 对应时间 | 时间戳 前一天的8:00 | -| total_inc | num | 增加数量 | 意义为数据类型决定 | - -**示例:** - -查询30天前的视频播放增量趋势,可知`2020-04-05`的播放增量为`46`,`2020-04-04`的播放增量为`58` - -```shell -curl -G 'https://member.bilibili.com/x/web/data/pandect' \ ---data-urlencode 'type=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "date_key": 1586044800, - "total_inc": 46 - }, { - "date_key": 1585958400, - "total_inc": 58 - }, { - "date_key": 1585872000, - "total_inc": 81 - }, { - "date_key": 1585785600, - "total_inc": 90 - }, { - "date_key": 1585699200, - "total_inc": 62 - }, { - "date_key": 1585612800, - "total_inc": 70 - }, - ………… - ] -} -``` - -</details> - -## 专栏数据增量趋势 - -> https://member.bilibili.com/x/web/data/article/thirty - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -数据为前30天 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | -------------- | -| type | num | 目标数据类型 | 必要 | 类型代码见下表 | - -类型代码`type`: - -| 代码 | 含义 | -| ---- | ---- | -| 1 | 阅读 | -| 2 | 评论 | -| 3 | 分享 | -| 4 | 投币 | -| 5 | 收藏 | -| 6 | 点赞 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | array | 趋势列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | -------- | -| 0 | obj | 30天前的数据 | | -| n | obj | (30-n)天前的数据 | | -| …… | obj | …… | …… | -| 29 | obj | 1天前的数据 | 最后一条 | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | -------------------- | -| date_key | num | 对应时间 | 时间戳 前一天的8:00 | -| total_inc | num | 增加数量 | 意义为数据类型决定 | - -**示例:** - -查询30天前的文章阅读增量趋势,可知`2020-04-05`的阅读增量为`6`,`2020-04-04`的阅读增量为`6` - -```shell -curl -G 'https://member.bilibili.com/x/web/data/article/thirty' \ ---data-urlencode 'type=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - ………… - { - "date_key": 1585699200, - "total_inc": 6 - }, { - "date_key": 1585785600, - "total_inc": 6 - }, { - "date_key": 1585872000, - "total_inc": 4 - }, { - "date_key": 1585958400, - "total_inc": 6 - }, { - "date_key": 1586044800, - "total_inc": 6 - }] -} -``` - -</details> - -## 稿件操作来源占比情况 - -> https://member.bilibili.com/x/web/data/survey - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -数据为上一天的 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | -------------- | -| type | num | 目标数据类型 | 必要 | 类型代码见下表 | - -类型代码`type`: - -| 代码 | 含义 | -| ---- | ---- | -| 1 | 播放 | -| 2 | 弹幕 | -| 3 | 评论 | -| 4 | 分享 | -| 5 | 投币 | -| 6 | 收藏 | -| 7 | 充电 | -| 8 | 点赞 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ------------ | -| {YYYYMMDD} | obj | 上一天的情况 | 字段名为日期 | - -`data`中的`{YYYYMMDD}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | ------------ | ---- | -| arc_inc | array | 稿件情况 | | -| total_inc | num | 总计增长情况 | | -| type_rank | obj | 分区排名情况 | | - -`{YYYYMMDD}`中的`arc_inc`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 稿件1 | | -| n | obj | 稿件(n+1) | | -| …… | obj | …… | …… | - -`{YYYYMMDD}`中的`arc_inc`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ------------ | -| aid | num | 稿件avid | | -| bvid | str | 稿件bvid | | -| daytime | num | 统计时间 | 时间戳 | -| incr | num | 稿件增长情况数 | | -| interactive | num | 0 | 作用尚不明确 | -| ptime | num | 稿件发布时间 | 时间戳 | -| title | str | 稿件标题 | | - -`{YYYYMMDD}`中的`type_rank`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| {分区名} | num | 该排名数 | | -| …… | num | …… | …… | - -**示例:** - -查询我的稿件来源占比情况 - -```shell -curl -G 'https://member.bilibili.com/x/web/data/survey' \ ---data-urlencode 'type=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "20200418": { - "arc_inc": [{ - "aid": 94916552, - "bvid": "BV1ZE411K7ux", - "incr": 18, - "title": "【8-bit】影 流 之 主(爱河)", - "daytime": 1587155030, - "ptime": 1583760165, - "interactive": 0 - }, { - "aid": 98948772, - "bvid": "BV1n741127LD", - "incr": 14, - "title": "【特斯拉线圈】组装迷你SSTC", - "daytime": 1587155030, - "ptime": 1585054436, - "interactive": 0 - }, { - "aid": 37294890, - "bvid": "BV1kt411D7yW", - "incr": 9, - "title": "【病毒】彩虹猫可以调速还带有计时器 MEMZ重构升级版", - "daytime": 1587155030, - "ptime": 1543775696, - "interactive": 0 - }, - ………… - ], - "total_inc": 55, - "type_rank": { - "生活": 1392, - "科技": 1597, - "音乐": 1058 - } - } - } -} -``` - -</details> - -## 播放来源占比情况(平台及方式) - -> https://member.bilibili.com/x/web/data/playsource - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------ | ---- | -| page_source | obj | 播放方式情况 | | -| play_proportion | obj | 播放平台情况 | | - -`data`中的`page_source`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------------- | ---- | -| dynamic | num | 通过动态 | | -| other | num | 其他方式 | | -| related_video | num | 通过推荐列表 | | -| search | num | 通过搜索 | | -| space | num | 空间列表播放 | | -| tenma | num | 天马(APP推荐信息流)来源 | | - -`data`中的`play_proportion`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------ | ---- | -| android | num | 安卓端 | | -| h5 | num | 移动端h5页面 | | -| ios | num | ios端 | | -| out | num | 站外 | | -| pc | num | 电脑版网页 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/data/playsource' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "play_proportion": { - "android": 6060, - "h5": 410, - "ios": 1325, - "out": 0, - "pc": 2137 - }, - "page_source": { - "dynamic": 173, - "other": 1440, - "related_video": 1813, - "search": 1980, - "space": 501, - "tenma": 4087 - } - } -} -``` - -</details> - -## 播放分布情况(粉丝与路人) - -> https://member.bilibili.com/x/web/data/base - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ---- | -| period | obj | 提示信息 | | -| viewer_area | obj | 播放地区情况 | | -| viewer_base | obj | 播放数据情况 | | - -`data`中的`period`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---- | ---- | -| module_one | str | ??? | | -| module_two | str | ??? | | -| module_three | str | ??? | | -| module_four | str | ??? | | - -`data`中的`viewer_area`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ---- | -| fan | obj | 粉丝播放地区情况 | | -| not_fan | obj | 路人播放地区情况 | | - -`viewer_area`中的`fan`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------------ | ---------------- | -| {行政区名} | num | 该地区的粉丝播放量 | 字段名为行政区名 | -| …… | num | …… | …… | - -`viewer_area`中的`not_fan`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------------ | ---------------- | -| {行政区名} | num | 该地区的路人播放量 | 字段名为行政区名 | -| …… | num | …… | …… | - -`data`中的`viewer_base`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ---- | -| fan | obj | 粉丝播放数据情况 | | -| not_fan | obj | 路人播放数据情况 | | - -`viewer_base`中的`fan`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------------ | ---- | -| male | num | 男性粉丝播放数 | | -| female | num | 女性粉丝播放数 | | -| age_one | num | 0-16岁粉丝播放数 | | -| age_two | num | 16-25岁粉丝播放数 | | -| age_three | num | 25-40岁粉丝播放数 | | -| age_four | num | 40+岁粉丝播放数 | | -| plat_pc | num | pc网页端粉丝播放数 | | -| plat_h5 | num | 移动h5端粉丝播放数 | | -| plat_out | num | 站外端粉丝播放数 | | -| plat_ios | num | ios端粉丝播放数 | | -| plat_android | num | 安卓端粉丝播放数 | | -| plat_other_app | num | 其他粉丝播放数 | | - -`viewer_base`中的`not_fan`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------------ | ---- | -| male | num | 男性路人播放数 | | -| female | num | 女性路人播放数 | | -| age_one | num | 0-16岁路人播放数 | | -| age_two | num | 16-25岁路人播放数 | | -| age_three | num | 25-40岁路人播放数 | | -| age_four | num | 40+岁路人播放数 | | -| plat_pc | num | pc网页端路人播放数 | | -| plat_h5 | num | 移动h5端路人播放数 | | -| plat_out | num | 站外端路人播放数 | | -| plat_ios | num | ios端路人播放数 | | -| plat_android | num | 安卓端路人播放数 | | -| plat_other_app | num | 其他路人播放数 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/data/base' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "period": { - "module_one": "各维度每日12:00 a.m. 更新前一日数据", - "module_two": "每日12:00 a.m. 更新前一日数据", - "module_three": "每周二12:00 a.m. 更新前一周数据", - "module_four": "各维度每日12:00 a.m. 更新前一日数据" - }, - "viewer_area": { - "fan": { - "上海": 7, - "中国台湾": 2, - "云南": 6, - "内蒙古": 8, - "北京": 14, - "吉林": 4, - "四川": 4, - "天津": 11, - "宁夏": 1, - "安徽": 8, - "山东": 18, - "山西": 10, - "广东": 50, - "广西": 7, - "新疆": 2, - "江苏": 17, - "江西": 6, - "河北": 13, - "河南": 13, - "浙江": 20, - "海南": 1, - "湖北": 13, - "湖南": 13, - "甘肃": 4, - "福建": 10, - "贵州": 4, - "辽宁": 9, - "重庆": 5, - "陕西": 93, - "香港特别行政区": 1, - "黑龙江": 12 - }, - "not_fan": { - "上海": 28, - "中国台湾": 3, - "云南": 22, - "内蒙古": 15, - "北京": 53, - "吉林": 20, - "四川": 60, - "天津": 18, - "宁夏": 7, - "安徽": 43, - "山东": 81, - "山西": 31, - "广东": 176, - "广西": 81, - "新疆": 11, - "江苏": 93, - "江西": 26, - "河北": 50, - "河南": 84, - "浙江": 97, - "海南": 10, - "湖北": 43, - "湖南": 43, - "甘肃": 14, - "福建": 54, - "西藏": 1, - "贵州": 16, - "辽宁": 47, - "重庆": 31, - "陕西": 102, - "青海": 2, - "香港特别行政区": 4, - "黑龙江": 25 - } - }, - "viewer_base": { - "fan": { - "male": 153, - "female": 24, - "age_one": 91, - "age_two": 174, - "age_three": 77, - "age_four": 53, - "plat_pc": 12072, - "plat_h5": 186, - "plat_out": 0, - "plat_ios": 23453, - "plat_android": 87387, - "plat_other_app": 1631 - }, - "not_fan": { - "male": 462, - "female": 72, - "age_one": 425, - "age_two": 445, - "age_three": 360, - "age_four": 188, - "plat_pc": 64760, - "plat_h5": 660, - "plat_out": 1, - "plat_ios": 111259, - "plat_android": 467767, - "plat_other_app": 3408 - } - } - } -} -``` - -</details> diff --git a/docs/creativecenter/upload.md b/docs/creativecenter/upload.md deleted file mode 100644 index 2dd94da..0000000 --- a/docs/creativecenter/upload.md +++ /dev/null @@ -1,1927 +0,0 @@ -# 投稿 - -## 上传封面 - -> https://member.bilibili.com/x/vu/web/cover/up - -*请求方式: POST* - -认证方式:Cookie(SESSDATA) - -注: 目前看来上传的图片似乎不会自动删除 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | -| cover | base64 | 视频封面 | 必要 | 经过 base64 编码的图片数据 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误<br />-111: csrf 校验失败<br />-101: 账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| url | str | 封面 URL | | - -**示例:** - -假设已经把需要发送的数据进行编码存放在文件 `./b64` 中: - -```text -csrf=xxxxxxxxxxxx&cover=data%3Aimage%2Fjpeg%3Bbase64%2C%2F9j%2F4AAQSkZJRgABA... -``` - -发送请求: - -```shell -curl -X POST --url "https://member.bilibili.com/x/vu/web/cover/up" \ ---url-query "ts=$(date +%s%3N)" \ ---data-binary @b64 \ --b "SESSDATA=xxxxxx; bili_jct=xxxxxx" -``` - -JavaScript (Node.js) 请求[示例](https://gist.github.com/SessionHu/5e47a3a1a351ac5486c87e3d63930e7a) - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "https://archive.biliimg.com/bfs/archive/77906db03b1eefac02613de184afad03f7bc58d7.jpg" - } -} -``` - -</details> - -## 获取上传模板列表 - -> https://member.bilibili.com/x/vupre/web/tpls - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 模板列表 | | - - - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| tid | num | 模板 ID | | -| name | str | 模板名称 | | -| typeid | num | 分区 ID | | -| title | str | 标题 | | -| tags | str | 标签 | | -| description | str | 描述 | | -| copyright | num | 版权类型 | 1: 自制<br />2: 转载 | -| attribute | num | 属性 | 0 或其他 | -| is_default | num | 是否默认 | 0: 否<br />1: 是 | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/vupre/web/tpls" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "tid": 12, - "name": "直播录像", - "typeid": 173, - "title": " 标题", - "tags": "可爱", - "description": "描述", - "copyright": 1, - "attribute": 0, - "is_default": 0 - }, - ] -} -``` - -</details> - -## 编辑上传模板 - -> https://member.bilibili.com/x/vupre/web/tpl/update - -*请求方式: POST* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**正文参数(application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| tid | num | 模板 ID | 必要 | | -| name | str | 模板名称 | 非必要 | | -| title | str | 标题 | 非必要 | | -| keywords | str | 标签 | 非必要 | 多个标签用 `,` 分隔 | -| description | str | 描述 | 非必要 | | -| typeid | num | 分区 ID | 非必要 | | -| arctype | str | 版权类型 | 非必要 | "Original": 自制<br />"Copy": 转载 | -| is_default | num | 是否默认 | 非必要 | 0: 否<br />1: 是 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -```shell -curl -X POST "https://member.bilibili.com/x/vupre/web/tpl/update" \ ---url-query "t=$(date +%s%3N)" \ --H "Content-Type: application/json" \ ---data '{ - "tid": 12, - "name": "新模板名称", - "title": "新标题", - "keywords": "标签1,标签2", - "description": "新描述", - "typeid": 173, - "arctype": "Original", - "is_default": 1, - "csrf": "xxxxxxxxxxxx" -}' \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 查询话题 - -> https://member.bilibili.com/x/vupre/web/topic/type - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ---- | -| type_id | num | 分区 ID | 非必要 | | -| pn | num | 页码 | 必要 | 从 0 开始 | -| ps | num | 每页个数 | 必要 | | -| title | str | 视频标题 | 非必要 | | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 话题列表 | | - - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| topic_id | num | 话题 ID | | -| topic_name | str | 话题名称 | | -| description | str | 话题描述 | | -| mission_id | num | 任务 ID | | -| activity_text | str | 活动文本 | | -| activity_description | str | 活动描述 | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/vupre/web/topic/type" \ ---data-urlencode "pn=0" \ ---data-urlencode "ps=20" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "topics": [ - { - "topic_id": 1245317, - "topic_name": "疯狂打游戏", - "description": "疯狂于游戏的世界吧!愿你在这场虚拟的战斗中展现出你非凡的智慧与勇气,让每一个夜晚都充满了激情与荣耀!", - "mission_id": 1742462, - "activity_text": "有奖活动", - "activity_description": "@神魂の魇 发起" - } - ], - "tags": null, - "maxpage": 200, - "request_id": "123" - } -} -``` - -</details> - -## 话题搜索 - -> https://member.bilibili.com/x/vupre/web/topic/search - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | ---- | -| page_size | num | 每页个数 | 非必要 | | -| offset | num | 个数偏移 | 非必要 | 并非页数 | -| keywords | str | 关键字 | 非必要 | | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - - - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| result | obj | 搜索结果 | | - - - -`result` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| has_create_jurisdiction | bool | ? | | -| is_new_topic | bool | 是否为新话题? | | -| tips | str | 提示信息 | | -| page_info | obj | 分页信息 | | -| topics | array | 话题列表 | | - - - -`page_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| has_more | bool | 是否有更多 | | -| offset | num | 偏移量 | | -| page_number | num | 页码 | | - - - -`topics`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| act_protocol | str | ? | | -| activity_sign | str | ? | | -| description | str | 话题描述 | | -| id | num | 话题 ID | | -| mission_id | num | 任务 ID | | -| name | str | 话题名称 | | -| state | num | 状态? | | -| uname | str | ? | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/vupre/web/topic/search" \ ---data-urlencode "page_size=20" \ ---data-urlencode "offset=0" \ ---data-urlencode "keywords=example" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "result": { - "topics": [ - { - "id": 1200265, - "name": "巴黎最前线", - "uname": "", - "state": 0, - "description": "巴黎体育盛会前线速递!", - "mission_id": 0, - "activity_sign": "", - "act_protocol": "" - } - ], - "page_info": { - "page_num": 0, - "offset": 1, - "has_more": true - }, - "is_new_topic": false, - "has_create_jurisdiction": true, - "tips": "该话题是UP主活动相关话题,您在话题下的稿件信息可能会被提供给发起话题的UP主,并可能被UP主用于二次创作" - } - } -} -``` - -</details> - -## 标签可用性检查 - -> https://member.bilibili.com/x/vupre/web/topic/tag/check - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| tag | str | 需要检查的标签 | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - - - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| code | num | 标签状态 | 0: 可用<br />其他: 不可用 | -| content | str | 错误返回 | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/vupre/web/topic/tag/check" \ ---data-urlencode "tag=example_tag" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "code": 0, - "content": "" - } -} -``` - -```json -{ - "code": 16025, - "message": "tag已经被封印了~", - "ttl": 1, - "data": { - "code": 1, - "content": "服务器错误" - } -} -``` - -</details> - -## 获取简介相关信息 - -> https://member.bilibili.com/x/vupre/web/archive/desc/format - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ---- | -| typeid | num | 分区 ID | 必要 | | -| copyright | num | 版权类型 | 必要 | 1:自制<br/>2:转载 | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | null | 信息本体 | | - -注:某个时间点后,没有发现 data 为 null 的情况了,过去为 null 时简介上限250字 - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| typeid | num | 分区 ID | | -| id | num | ID | | -| lang | num | 未知 | | -| copyright | num | 版权类型| 1:自制<br/>2:转载 | -| components | str | 简介输入框提示文字 | JSON 字符串 | - -`components` 示例: -`'[{"name":"相关游戏","index":1,"type":"text","required":"1","box":"请输入本视频所涉及的游戏名称,以顿号分隔,例:英雄联盟、塞尔达传说、刺客信条"},{"name":"简介补充","index":2,"type":"textarea","required":"1","box":""}]'` - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/vupre/web/archive/desc/format" \ ---data-urlencode "typeid=65" \ ---data-urlencode "copyright=1" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "typeid": 65, - "id": 1, - "lang": 0, - "copyright": 1, - "components": "[{\"name\":\"相关游戏\",\"index\":1,\"type\":\"text\",\"required\":\"1\",\"box\":\"请输入本视频所涉及的游戏名称,以顿号分隔,例:英雄联盟、塞尔达传说、刺客信条\"},{\"name\":\"简介补充\",\"index\":2,\"type\":\"textarea\",\"required\":\"1\",\"box\":\"\"}]" - } -} -``` - -</details> - -## 获取上传线路 - -> https://member.bilibili.com/preupload?r=probe - -*请求方式: GET* - -认证方式:无 - -**URL参数:** - -无 - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| OK | num | 返回值 | 1: 成功<br />其他: 失败 | -| lines | array | 上传线路列表 | | -| probe | obj | 未知 | | - -probe 中的对象: -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | ----- | -| post | float | 未知 | 固定0.1 | - -lines 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | ----- | -| os | str | 操作系统 | | -| query | str | 查询参数 | | -| probe_url | str | 探测 URL | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/preupload?r=probe" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "OK": 1, - "lines": [ - { - "os": "upos", - "query": "probe_version=20221109&upcdn=tx&zone=cs", - "probe_url": "//upos-cs-upcdntx.bilivideo.com/OK" - }, - { - "os": "upos", - "query": "probe_version=20221109&upcdn=bldsa&zone=cs", - "probe_url": "//upos-cs-upcdnbldsa.bilivideo.com/OK" - }, - { - "os": "upos", - "query": "probe_version=20221109&upcdn=bda2&zone=cs", - "probe_url": "//upos-cs-upcdnbda2.bilivideo.com/OK" - } - ], - "probe": { - "post": 0.1 - } -} -``` - -</details> - -## 预测稿件类型 - -> https://member.bilibili.com/x/vupre/web/archive/types/predict - -*请求方式: POST* - -认证方式: Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | - -**正文参数(multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| filename | str | 视频文件名 | 必要 | 从视频上传接口获取, 无后缀名, 可为空 | -| title | str | 视频标题 | 不必要 || -| upload_id | str | 上传 ID | 不必要 | 如 `616368979_1723455540876_8794` | - -**JSON回复:** - -根对象: - -|字段|类型|内容|备注| -|---|-|-|---| -|code|num|返回值|0: 成功<br />-400: 请求错误<br />-111: csrf 校验失败<br />-101: 账号未登录| -|message|str|错误信息|默认为 0| -|ttl|num|1|| -|data|array|信息本体|| - -`data` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| 0 | obj | 视频类型 1 | | -| 1 | obj | 视频类型 2 | | -| …… | obj | …… | | -| n | obj | 视频类型 (n+1) | | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| id | num | 子分区 ID | | -| parent | num | 总分区 ID | | -| parent_name | str | 总分区名称 | | -| name | str | 子分区名称 | | -| description | str | 子分区描述 | | -| desc | str | 子分区描述 | 同 `description` | -| intro_original | str | 原创简介说明 | | -| intro_copy | str | 转载简介说明 | | -| notice | str | 注意事项 | | -| copy_right | num | 版权信息? | 0 | -| show | bool | 是否显示? | true | -| rank | num | 排序权重? | | -| max_video_count | num | 最大视频数量? | | -| request_id | str | 空 | | -| human_type | obj\|null | 新分区ID,好像除第一个之外都是null | - -`human_type` 参数 -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| id | num | 新分区id | 可在 [获取新分区ID](#获取新分区ID) 找到对应名称 | - -**示例:** - -```shell -curl -X POST --url 'https://member.bilibili.com/x/vupre/web/archive/types/predict' \ ---url-query 'csrf=d51eadf05ba3bc6c5f76def7fbcc0185' \ ---data-urlencode 'filename=' \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 122, - "parent": 36, - "parent_name": "知识", - "name": "野生技能协会", - "description": "技能展示或技能教学分享类视频", - "desc": "技能展示或技能教学分享类视频", - "intro_original": "可对视频内容进行补充说明,并对所使用的视频素材进行标明。\n如是系列,也可附带上期视频地址。\n请勿加入涉政或具较大争议性的文字简介,否则将做打回处理。", - "intro_copy": "转载稿件需标明出处,请注明原作者、原作者频道名或原作者投稿地址。\n可对相关内容进行补充说明。\n请勿加入涉政或具较大争议性的文字简介,否则将做打回处理。\n如是系列,也可附带上期视频地址。", - "notice": "清晰明了表明内容亮点的标题会更受观众欢迎哟!", - "copy_right": 0, - "show": true, - "rank": 75, - "max_video_count": 100, - "request_id": "" - }, - { - "id": 21, - "parent": 160, - "parent_name": "生活", - "name": "日常", - "description": "一般日常向的生活类视频", - "desc": "一般日常向的生活类视频", - "intro_original": "能够选择自制的必须是up主个人或工作室自己制作剪辑的视频,除此之外的搬运视频字幕制作,对于视频进行加速、慢放等简易二次创作,在视频中添加前后贴片或者打水印等行为均不被认作自制", - "intro_copy": "转载需写明请注明转载作品详细信息原作者、原标题及出处(需为该视频最原始出处,如所标注明显为非原始出处的话会被打回)", - "notice": "", - "copy_right": 0, - "show": true, - "rank": 4, - "max_video_count": 50, - "request_id": "" - }, - { - "id": 242, - "parent": 5, - "parent_name": "娱乐", - "name": "娱乐粉丝创作", - "description": "粉丝向创作视频", - "desc": "粉丝向创作视频", - "intro_original": "", - "intro_copy": "", - "notice": "清晰明了表明内容亮点的标题会更受观众欢迎哟!", - "copy_right": 0, - "show": true, - "rank": 40, - "max_video_count": 50, - "request_id": "" - }, - { - "id": 65, - "parent": 4, - "parent_name": "游戏", - "name": "网络游戏", - "description": "多人在线游戏为主要内容的相关视频", - "desc": "多人在线游戏为主要内容的相关视频", - "intro_original": "建议在简介和TAG中添加正确的游戏名,以便在分区和搜索中得到更好的展示。\n录制他人直播(包括授权转载、授权录制)不属于自制内容,请选转载。", - "intro_copy": "建议在简介和TAG中添加正确的游戏名。\n搬运转载内容请添加原作者、原链接地址信息。录制他人直播内容请添加原主播信息、直播时间。\n未添加正确转载、录播信息的稿件可能被打回。", - "notice": "【UP主/节目名】+《游戏名》+主要标题+期号", - "copy_right": 0, - "show": true, - "rank": 30, - "max_video_count": 50, - "request_id": "" - }, - { - "id": 138, - "parent": 160, - "parent_name": "生活", - "name": "搞笑", - "description": "搞笑挑战、剪辑、表演、配音以及各类日常沙雕视频", - "desc": "搞笑挑战、剪辑、表演、配音以及各类日常沙雕视频", - "intro_original": "能够选择自制的必须是up主个人或工作室自己制作剪辑的视频,除此之外的搬运视频字幕制作,对于视频进行加速、慢放等简易二次创作,在视频中添加前后贴片或者打水印等行为均不被认作自制", - "intro_copy": "转载需写明请注明转载作品详细信息原作者、原标题及出处(需为该视频最原始出处,如所标注明显为非原始出处的话会被打回)", - "notice": "", - "copy_right": 0, - "show": true, - "rank": 30, - "max_video_count": 50, - "request_id": "" - } - ] -} -``` - -</details> - -## 预测稿件标签 - -> https://member.bilibili.com/x/vupre/web/tag/recommend - -*请求方式: GET* - -认证方式: Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| upload_id | str | 同 [预测稿件类型](#预测稿件类型) 的 `upload_id` | 不必要 | | -| subtype_id | int | 子分区 ID | 不必要 | | -| title | str | 视频标题 | 不必要 | | -| filename | str | 同 [预测稿件类型](#预测稿件类型) 的 `filename` | 不必要 | | -| description | str | 视频简介 | 不必要 | | -| cover_url | str | 视频封面 URL | 不必要 | 不含 `https:` 或 `http:` 字串 | -| t | int | 当前 UNIX 毫秒时间戳 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | int | 返回值 | 0: 成功<br />-101: 账号未登录 | -| data | array | 标签信息 | | -| message | str | 错误信息 | 默认为 0 | -| request_id | str | 请求 ID | | - -`data` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| 0 | obj | 标签 1 | | -| 1 | obj | 标签 2 | | -| …… | obj | …… | | -| n | obj | 标签 (n+1) | | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| tag | str | 标签名称 | | -| checked | int | 0 | | -| request_id | str | 请求 ID | 同根对象 | - -**示例:** - -```shell -curl -G 'https://member.bilibili.com/x/vupre/web/tag/recommend' \ ---url-query 'subtype_id=122' \ ---url-query 'title=Telnet手打HTTP' \ ---url-query 'description=测试用 Telnet 手打 HTTP/1.x 协议访问本地服务器, 无 SSL/TLS 支持' --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": [ - { - "tag": "学习", - "checked": 0, - "request_id": "TAG_1723543336295_3371" - }, - { - "tag": "编程", - "checked": 0, - "request_id": "" - }, - { - "tag": "课程", - "checked": 0, - "request_id": "" - }, - { - "tag": "学习心得", - "checked": 0, - "request_id": "" - }, - { - "tag": "经验分享", - "checked": 0, - "request_id": "" - } - ], - "message": "0", - "request_id": "TAG_1723543336295_3371" -} -``` - -</details> - -## 投递视频稿件(Web) - -> https://member.bilibili.com/x/vu/web/add/v3 - -*请求方式: POST* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| ts | num | 当前时间 | 不必要 | UNIX 毫秒时间戳 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | - -**正文参数(application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| videos | array | 视频信息 | 必要 | 若为分 P 视频, 请注意数组元素顺序 | -| cover | str | 视频封面 URL | 非必要 | 如果不传会自动取封面,参见[上传视频封面](#上传视频封面) | -| cover43 | str | 视频封面 URL (比例为 4:3) | 非必要 | 可为空 | -| title | str | 视频标题 | 必要 | 最多 80 字 | -| copyright | num | 1: 自制<br />2: 转载 | 必要 | | -| tid | num | 分区 ID | 必要 | Web端此参数已无法手动设置,参数值为从[预测稿件类型](#预测稿件类型)中获取第一个固定id | -| human_type2 | num | 新分区ID | 非必要| 从 [新分区ID](#获取新分区ID) 获取 | -| tag | str | 视频标签 | 必要 | 多个标签用 `,` 分隔, 最多 10 个 | -| desc_format_id | num | 简介格式 ID? | 必要 | 9999: 纯文本 | -| desc | str | 视频简介 | 非必要 | 最多 2000 字 | -| desc_v2 | str | 视频简介额外信息 | 非必要 | 比如有艾特操作时传递,见备注 | -| recreate | num | 是否允许二创 | 必要 | -1: 允许(默认)<br />1: 不允许 | -| dynamic | str | 粉丝动态 | 必要 | | -| interactive | num | 互动视频? | 必要 | 0: 否 | -| act_reserve_create | num | 活动预约? | 必要 | 0: 否 | -| no_disturbance | num | 是否推送到动态| 必要 | 0:不推送,1:推送| -| no_reprint | num | 是否允许转载 | 必要 | 1: 允许<br />0: 不允许 | -| subtitle | obj | 字幕信息 | 必要 | | -| dolby | num | 杜比音效 | 必要 | 0: 否(默认)<br />1: 是 | -| lossless_music | num | 无损音乐 | 必要 | 0: 否(默认)<br />1: 是 | -| up_selection_reply | bool | 精选评论 | 必要 | | -| up_close_reply | bool | 关闭评论 | 必要 | | -| up_close_danmu | bool | 关闭弹幕 | 必要 | | -| web_os | num | 平台类型? | 必要 | 3 | -| is_only_self | 可见性 | 非必要 | 0:公开<br/>1:仅自己可见 | -| topic_id | 话题id | 非必要 | 可从[查询话题](./upload.md#查询话题)等相关接口获取 | -| mission_id | 任务id | 非必要 | 可从[查询话题](./upload.md#查询话题)等相关接口获取 | -| is_360 | num | 是否全景 | 非必要 | -1:非全景<br/>1:全景 | -| neutral_mark | str | 创作者声明 | 非必要 | | - -`videos` 数组中的对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| filename | str | 视频文件名 | 必要 | 从视频上传接口获取, 无后缀名 | -| title | str | 分 P 标题 | 必要 | | -| desc | str | 分 P 简介 | 必要 | | -| cid | num | 分 P cid | 必要 | 从视频上传接口获取, 即 `biz_id` | - -`subtitle` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| open | num | 是否启用字幕投稿 | 必要 | 0: 启用(默认)<br />1: 不启用 | -| lan | str | 字幕投稿语言 | 必要 | 可为空 | - -**desc_v2举例:** - -```js -{ - // 如果两者不一致,可能导致后续在web修改出现错误 - "desc": "前面@陈睿 后面", - "desc_v2": [ // 纯文字type是1,艾特用户type是2,biz_id为用户uid - { - "biz_id": "", - "raw_text": "前面", - "type": 1 - }, - { - "biz_id": "208259", // uid - "raw_text": "陈睿", // 用户名 - "type": 2 - }, - { - "biz_id": "", - "raw_text": " 后面", - "type": 1 - } - ] -} -``` - -**示例:** - -假设已经把需要发送的数据存放在文件 `./data.json` 中: - -```json -{ - "videos": [ - { - "filename": "n240728ad33h52yqhxbtw51cb06sq9gx", - "title": "Telnet手打HTTP", - "desc": "", - "cid": 500001629877726 - } - ], - "cover": "https://archive.biliimg.com/bfs/archive/85447ea20431ef799382c403c84b4bfb82a41053.jpg", - "cover43": "", - "title": "Telnet手打HTTP", - "copyright": 1, - "tid": 122, - "tag": "telnet,socket,tcp,linux,http", - "desc_format_id": 9999, - "desc": "测试用 Telnet 手打 HTTP/1.x 协议访问本地服务器, 无 SSL/TLS 支持", - "recreate": -1, - "dynamic": "for testing", - "interactive": 0, - "act_reserve_create": 0, - "no_disturbance": 0, - "no_reprint": 1, - "subtitle": { - "open": 0, - "lan": "" - }, - "dolby": 0, - "lossless_music": 0, - "up_selection_reply": false, - "up_close_reply": false, - "up_close_danmu": false, - "web_os": 3, - "csrf": "xxxxxxxxxxxxxxxxxxxxxxxx" -} -``` - -发送请求: - -```shell -curl -X POST --url "https://member.bilibili.com/x/vu/web/add/v3" \ ---url-query "ts=$(date +%s%3N)" \ ---url-query "csrf=xxxxxxxxxxxxxxxxxxxxxxxx" \ --H "Content-Type: application/json; charset=utf-8" \ ---data @data.json \ --b "SESSDATA=xxxxxx; bili_jct=xxxxxxxxxxxxxxxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 112861976201494, - "bvid": "BV181vnexEmB" - } -} -``` - -</details> - -## 编辑视频稿件(Web) - -> https://member.bilibili.com/x/vu/web/edit - -*请求方式: POST* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | - -**正文参数(application/json):** - -绝大部分参数与上传一致,部分参数只有不对编辑生效 - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| aid | num | 视频 ID | 必要 | | -| videos | array | 视频信息 | 必要 | 若为分 P 视频, 请注意数组元素顺序 | -| title | str | 视频标题 | 必要 | 最多 80 字 | -| cover | str | 视频封面 URL | 非必要 | 如果不传会自动取封面,参见[上传视频封面](#上传视频封面) | -| cover43 | str | 视频封面 URL (比例为 4:3) | 非必要 | 可为空 | -| copyright | num | 1: 自制<br />2: 转载 | 必要 | | -| tid | num | 分区 ID | 必要 | | -| tag | str | 视频标签 | 必要 | 多个标签用 `,` 分隔, 最多 10 个 | -| desc_format_id | num | 简介格式 ID? | 必要 | 9999: 纯文本 | -| desc | str | 视频简介 | 非必要 | 最多 2000 字 | -| desc_v2 | str | 视频简介额外信息 | 非必要 | 比如有艾特操作时传递,见上传视频 | -| recreate | num | 是否允许二创 | 必要 | -1: 允许(默认)<br />1: 不允许 | -| dynamic | str | 粉丝动态 | 必要 | | -| interactive | num | 互动视频? | 必要 | 0: 否 | -| act_reserve_create | num | 活动预约? | 必要 | 0: 否 | -| no_disturbance | num | 是否推送到动态 | 必要 | 0:不推送<br />1:推送 | -| no_reprint | num | 是否允许转载 | 必要 | 1: 允许<br />0: 不允许 | -| subtitle | obj | 字幕信息 | 必要 | | -| web_os | num | 操作系统 | 必要 | 1: Web | -| mission_id | num | 任务 ID | 非必要 | 0: 无 | -| csrf | str | CSRF Token (位于 Cookie 中 bili_jct) | 必要 | | -| new_web_edit | num | 未知 | 非必要 | 未知 | -| is_360 | num | 是否全景 | 非必要 | -1:非全景<br/>1:全景 | -| is_only_self | 可见性 | 非必要 | 0:公开<br/>1:仅自己可见 | - - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 123456, - "bvid": "BV1xx411c7mD" - } -} -``` - -</details> - -## 获取新分区ID - -> https://member.bilibili.com/x/vupre/web/archive/human/type2/list - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| t | num | 当前时间 | 非必要 | UNIX 毫秒时间戳 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| code | num | 返回值 | 0: 成功<br />其他: 失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| type_list | array | 信息本体 | | - -`type_list` 对象: - -| 参数名 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| id | num | 分区ID | | -| name | str | 分区名 | | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "type_list": [ - { - "id": 1001, - "name": "影视" - }, - { - "id": 1002, - "name": "娱乐" - }, - { - "id": 1003, - "name": "音乐" - }, - { - "id": 1004, - "name": "舞蹈" - }, - { - "id": 1005, - "name": "动画" - }, - { - "id": 1006, - "name": "绘画" - }, - { - "id": 1007, - "name": "鬼畜" - }, - { - "id": 1008, - "name": "游戏" - }, - { - "id": 1009, - "name": "资讯" - }, - { - "id": 1010, - "name": "知识" - }, - { - "id": 1011, - "name": "人工智能" - }, - { - "id": 1012, - "name": "科技数码" - }, - { - "id": 1013, - "name": "汽车" - }, - { - "id": 1014, - "name": "时尚美妆" - }, - { - "id": 1015, - "name": "家装房产" - }, - { - "id": 1016, - "name": "户外潮流" - }, - { - "id": 1017, - "name": "健身" - }, - { - "id": 1018, - "name": "体育运动" - }, - { - "id": 1019, - "name": "手工" - }, - { - "id": 1020, - "name": "美食" - }, - { - "id": 1021, - "name": "小剧场" - }, - { - "id": 1022, - "name": "旅游出行" - }, - { - "id": 1023, - "name": "三农" - }, - { - "id": 1024, - "name": "动物" - }, - { - "id": 1025, - "name": "亲子" - }, - { - "id": 1026, - "name": "健康" - }, - { - "id": 1027, - "name": "情感" - }, - { - "id": 1029, - "name": "vlog" - }, - { - "id": 1030, - "name": "生活兴趣" - }, - { - "id": 1031, - "name": "生活经验" - } - ] - } -} -``` - -</details> - -## 上传视频文件 - -注: 目前看来上传的视频文件似乎不会自动删除, 而且似乎不是视频也可以上传的样子, 但是下载认证字段有效期只有 5 天 - -### 上传流程 - -整个上传流程较为复杂, 详细参见[Demo](#Demo) - -1. `GET` `preupload` 接口, [获取上传元数据](#获取上传元数据-预上传) - -2. `POST` 第 1 步得到的地址, [上传视频元数据](#上传视频元数据) - -3. `PUT` 第 1 步得到的地址, [分片上传视频文件](#分片上传视频文件) - -4. `POST` 第 1 步得到的地址, [结束上传视频文件](#结束上传视频文件) - -5. `GET` 第 1 步得到的地址, [下载已上传的视频文件](#下载已上传的视频文件) , 确认上传成功 (可选) - -### 上传接口 - -#### 获取上传元数据 (预上传) - -> https://member.bilibili.com/preupload - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| name | str | 文件名 | 必要 | 会影响返回的上传地址 | -| r | str | 上传区域? | 必要 | upos | -| profile | str | 上传配置? | 必要 | 普通视频: ugcfx/bup<br />提交反馈: feedback/bup | -| probe_version | num | 上传版本? | 不必要 | 20221109 | -| upcdn | str | 上传 CDN? | 不必要 | txa | -| zone | str | 上传区域? | 不必要 | cs | -| ssl | num | 是否使用 SSL? | 不必要 | 0 | -| version | str | 上传版本? | 不必要 | 2.14.0.0 | -| build | str | 上传版本? | 不必要 | 2140000 | -| size | num | 文件大小 | 不必要 | 视频文件大小, 单位 字节 | -| webVersion | str | 上传版本? | 不必要 | 2.13.0 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| OK | num | 1 | | -| auth | str | 上传凭证 | 作为后面请求中请求头, 有效期 5 天 | -| biz_id | num | 业务 ID? | | -| chunk_retry | num | 重试次数? | | -| chunk_retry_delay | num | 重试延迟? | | -| chunk_size | num | 分块大小 | 后面要用 | -| endpoint | str | 上传节点 | 后面要用 | -| endpoints | array | 上传节点列表 | | -| expose_params | null | | | -| put_query | str | 上传参数? | | -| threads | num | 上传线程数 | | -| timeout | num | 超时时间? | | -| uip | str | 你的 IP | | -| upos_uri | str | 上传地址 | 后面要用 | - -`endpoints` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ----- | -| 0 | str | 上传节点1 | | -| …… | str | …… | | -| n | str | 上传节点n | | - -**示例:** - -假设视频文件名为 `2024-07-28_15-37-50.mkv`, 视频大小为 `305333744` 字节 - -```shell -curl -G "https://member.bilibili.com/preupload" \ ---data-urlencode "name=2024-07-28_15-37-50.mkv" \ ---data-urlencode "r=upos" \ ---data-urlencode "profile=ugcfx/bup" \ --b "SESSDATA=xxxxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "OK": 1, - "auth": "ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=b6c5cc520a281200906aea97e190b098×tamp=1722155211.324&uid=616368979&uip=108.181.24.77&uport=52096&use_dqp=0", - "biz_id": 500001630152509, - "chunk_retry": 10, - "chunk_retry_delay": 3, - "chunk_size": 10485760, - "endpoint": "//upos-cs-upcdntxa.bilivideo.com", - "endpoints": [ - "//upos-cs-upcdntxa.bilivideo.com", - "//upos-cs-upcdnalia.bilivideo.com" - ], - "expose_params": null, - "put_query": "os=upos&profile=ugcfx%2Fbup", - "threads": 3, - "timeout": 1200, - "uip": "108.181.24.77", - "upos_uri": "upos://ugcfx2lf/n240728ad1p51if4g3ke4s3o95sznogy.mkv" -} -``` - -</details> - -#### 上传视频元数据 - -> URL 拼接格式: `"https"` + [上一个接口](#获取上传元数据-预上传)的`endpoint` + 上一个接口的`upos_uri`去掉协议名 -> JavaScript 模板字符串: `https:${preupload.endpoint}/${endpoint.upos_uri.replace("upos://", "")}` - -*请求方式: POST* - -认证方式:请求头 `X-Upos-Auth` 为上一接口得到的 `auth` - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| uploads | str | 留空 | 必要 | 留空 | -| output | str | 输出格式 | 不必要 | 默认为 json(推荐), 留空为 xml | -| profile | str | 上传配置? | 必要 | 与上一个接口保持相同 | -| filesize | num | 文件大小 | 必要 | 视频文件大小, 单位 字节<br />feedback/bup 不必要 | -| partsize | num | 分块大小 | 必要 | 上一个接口返回, 且后面要用<br />feedback/bup 不必要 | -| biz_id | num | 业务 ID? | 必要 | 上一个接口返回, 且后面要用<br />feedback/bup 不必要 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----- | -| OK | num | 1 | | -| bucket | str | 空间名? | | -| key | str | 文件名? | | -| upload_id | str | 上传 ID | 后面要用 | - -**示例:** - -假设上一接口返回的 -`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=4004b35628e982bc90b59cec86f8c441×tamp=1722173443.298&uid=616368979&uip=104.28.153.18&uport=44282&use_dqp=0`, -`biz_id` 为`500001630454700`, -`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, -`upos_uri` 为 `upos://ugcfx2lf/n240728adhejliqv0kqyg2s5n6huv501.mkv`, -`chunk_size` 为 `10485760`. -视频文件大小为 `305333744` 字节. - -```shell -curl -X POST --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240728adhejliqv0kqyg2s5n6huv501.mkv` \ ---url-query "uploads=" \ ---url-query "output=json" \ ---url-query "profile=ugcfx/bup" \ ---url-query "filesize=305333744" \ ---url-query "partsize=10485760" \ ---url-query "biz_id=500001630454700" \ --H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=4004b35628e982bc90b59cec86f8c441×tamp=1722173443.298&uid=616368979&uip=104.28.153.18&uport=44282&use_dqp=0" \ --b "SESSDATA=xxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "OK": 1, - "bucket": "ugcfx2lf", - "key": "/n240728adhejliqv0kqyg2s5n6huv501.mkv", - "upload_id": "26c674b4-0dce-45f5-a9cd-a199d9c982bf" -} -``` - -</details> - -#### 分片上传视频文件 - -> URL 同 [上一个接口](#上传视频元数据) - -*请求方式: PUT* - -认证方式:请求头 `X-Upos-Auth` 为上上一接口得到的 `auth` - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| partNumber | num | 分块序号 | 必要 | 从 1 开始 | -| uploadId | str | 上传 ID | 必要 | 上一个接口返回 | -| chunk | num | 分块序号 | 必要 | 从 0 开始 | -| chunks | num | 分块总数 | 必要 | 自行计算: 文件大小除以分块大小并向上取整 | -| size | num | 该分块大小 | 必要 | 该实际上传字节数 | -| start | num | 该分块开始位置 | 必要 | 已实际上传字节数 | -| end | num | 该分块结束位置 | 必要 | 该分块上传结束后实际上传总字节数 | -| total | num | 总大小 | 必要 | 视频文件大小, 单位 字节 | - -**正文参数(application/octet-stream):** - -视频文件在该分块的字节流 - -**纯文本回复:** - -```text -MULTIPART_PUT_SUCCESS -``` - -**示例:** - -假设上上一接口返回的 -`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, -`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, -`upos_uri` 为 `upos://ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, -`chunk_size` 为 `10485760`. - -上一接口返回的 -`upload_id` 为 `8130090a-16f7-4fe6-8a29-198f5abce913`. - -视频文件名为 `20240724-remove-linux-then-install.tar.xz`, 文件大小为 `278255704` 字节. - -假设您要上传的分块序号为 `1`, -该分块大小为 `10485760`, -该分块开始位置为 `0`, -该分块结束位置为 `10485760`, -该分块实际上传字节数为 `10485760`, -您已将文件分块存放至 `part01.tar.xz`, `part02.tar.xz`, ..., `part27.tar.xz`. - -```shell -curl -X PUT --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ ---url-query "partNumber=1" \ ---url-query "uploadId=8130090a-16f7-4fe6-8a29-198f5abce913" \ ---url-query "chunk=0" \ ---url-query "chunks=27" \ ---url-query "size=10485760" \ ---url-query "start=0" \ ---url-query "end=10485760" \ ---url-query "total=278255704" \ --H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ --H "Content-Type: application/octet-stream" \ ---data-binary @part01.tar.xz \ --b "SESSDATA=xxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```text -MULTIPART_PUT_SUCCESS -``` - -</details> - -#### 结束上传视频文件 - -> URL 同 [上一个接口](#分片上传视频文件) - -*请求方式: POST* - -认证方式:请求头 `X-Upos-Auth` 为上上上一接口得到的 `auth` - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| output | str | 输出格式 | 不必要 | 默认为 json(推荐), 留空为 xml | -| name | str | 文件名 | 必要 | 视频文件名 | -| profile | str | 上传配置? | 必要 | 与上一个接口相同, 普通视频: ugcfx/bup | -| uploadId | str | 上传 ID | 必要 | 与上一个接口相同 | -| biz_id | num | 业务 ID? | 必要 | 与上上一个接口相同 | - -**正文参数(application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| parts | array | 各分块信息 | 必要 | 按实际上传顺序而不是分块序号顺序 | - -`parts` 数组: - -| 项 | 类型 | 内容 | 必要性 | 备注 | -| --- | ---- | ---- | ------ | ---- | -| 0 | obj | 分块信息1 | 必要 | 按实际上传顺序而不是分块序号顺序 | -| 1 | obj | 分块信息2 | 必要 | | -| …… | obj | …… | | | -| n | obj | 分块信息n | 必要 | | - -`parts` 数组中的对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| partNumber | num | 分块序号 | 必要 | 从 1 开始 | -| eTag | str | `etag` | 必要 | | - -**JSON回复:** - -与 [上上一个接口](#上传视频元数据) 相同 - -**示例:** - -假设上上上一接口返回的 -`auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, -`endpoint` 为 `//upos-cs-upcdntxa.bilivideo.com`, -`upos_uri` 为 `upos://ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, -`biz_id` 为 `500001630826789`. - -上上一接口返回的 -`upload_id` 为 `8130090a-16f7-4fe6-8a29-198f5abce913`. - -视频文件名为 `20240724-remove-linux-then-install.tar.xz`, 文件大小为 `278255704` 字节. - -假设您已经全部上传完毕, 共上传 `27` 个分块, 本次请求上传的的内容存放在 `body.json` 文件中. - -```shell -curl -X PUT --url "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ ---url-query "output=json" \ ---url-query "name=20240724-remove-linux-then-install.tar.xz" \ ---url-query "profile=ugcfx%2Fbup" \ ---url-query "uploadId=8130090a-16f7-4fe6-8a29-198f5abce913" \ ---url-query "biz_id=500001630826789" \ --H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ --H "Content-Type: application/json" \ ---data-binary @body.json \ --b "SESSDATA=xxxxxxxxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "OK": 1, - "location": "ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz", - "bucket": "ugcfx2lf", - "key": "/n240729ad7gxi43yaoml312h2nbt2pnf.xz" -} -``` - -</details> - -#### 下载已上传的视频文件 - -> URL 同 [上一个接口](#结束上传视频文件) - -*请求方式: GET* - -认证方式:请求头 `X-Upos-Auth` 为上上上上一接口得到的 `auth` - -注: 由于 `X-Upos-Auth` 有效期只有 5 天, 过期请求将返回 HTTP 403 如下 - -```http -HTTP/1.1 403 Forbidden -Bili-Trace-Id: 3e3f2db61366adbf -Server: upos@hcsgw@jscs-bvc-hcsgw-public-02 -X-Bili-Trace-Id: 0d8ca1af6d3510253e3f2db61366adbf -X-Upos-Auth: AUTH_TS_GT_5DAY AUTH=ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0 Now=1722662669 DURATION=449893 -Content-Length: 0 -Connection: keep-alive -Date: Sat, 03 Aug 2024 05:24:29 GMT -EO-LOG-UUID: 4296647794590631154 -EO-Cache-Status: MISS -``` - -**字节流回复:** - -视频文件字节流 - -**示例:** - -假设请求上一接口时的 URL 为 `https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz`, -请求头的 `X-Upos-Auth` 为 `ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0`, -您想要下载到运行目录下的 `file.tar.xz` 文件 - -```shell -curl -G "https://upos-cs-upcdntxa.bilivideo.com/ugcfx2lf/n240729ad7gxi43yaoml312h2nbt2pnf.xz" \ --H "X-Upos-Auth: ak=1494471752&cdn=%2F%2Fupos-cs-upcdntxa.bilivideo.com&os=upos&sign=911dd5b995895805d785aa607b4153b6×tamp=1722212776.333&uid=616368979&uip=108.181.24.77&uport=36044&use_dqp=0" \ ---output file.tar.xz -``` - -<details> -<summary>查看检查示例:</summary> - -```text - % Total % Received % Xferd Average Speed Time Time Time Current - Dload Upload Total Spent Left Speed -100 265M 100 265M 0 0 9493k 0 0:00:28 0:00:28 --:--:-- 10.3M -$ sha512sum file.tar.xz -abfbedf1ac4f251c81103beb4d5406af1e0b64b9d54e99bfc77d2a8a9c4913a9fd2f1751828ace8aac036f6385609d99e251437b07a0491caca2ad7069a57003 file.tar.xz -$ sha512sum ~/Documents/video-proj/20240724-remove-linux-then-install.tar.xz -abfbedf1ac4f251c81103beb4d5406af1e0b64b9d54e99bfc77d2a8a9c4913a9fd2f1751828ace8aac036f6385609d99e251437b07a0491caca2ad7069a57003 /home/sess/Documents/video-proj/20240724-remove-linux-then-install.tar.xz -``` - -</details> - -### Demo - -#### Java - -注: 需要 Gson 依赖, Java 8+, 单线程上传, 无异常处理, 仅供参考 - -```java -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URI; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.StringJoiner; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonSyntaxException; - -/** - * A demo class for uploading videos to Bilibili. - * - * @author SessX6cf - */ -public class BiliVideoUploader { - - private static String SESSDATA; - private static File VIDEO_FILE; - - public static void main(String[] args) throws IOException { - long ts = System.currentTimeMillis(); - if (args.length < 2) { - System.out.println("Usage: java BiliVideoUploader <video_file> <sessdata>"); - return; - } else { - VIDEO_FILE = new File(args[0]); - if (!VIDEO_FILE.isFile()) { - System.out.println("It is not a file!"); - return; - } else if (!VIDEO_FILE.canRead()) { - System.out.println("Cannot read the file!"); - return; - } else if (VIDEO_FILE.isDirectory()) { - System.out.println("You can play a directory?!"); - return; - } - SESSDATA = args[1]; - } - // step 1: preupload video - System.out.println("step 1: preupload video"); - JsonObject preuploadVideo = preuploadVideo(); - // step 2: post video meta - System.out.println("step 2: post video meta"); - JsonObject postVideoMeta = postVideoMeta(preuploadVideo); - // step 3: upload video - System.out.println("step 3: upload video"); - int chunks = uploadVideo(preuploadVideo, postVideoMeta); - // step 4: end upload - System.out.println("step 4: end upload"); - endupload(preuploadVideo, postVideoMeta, chunks); - // finished - System.out.println("finished (" + (System.currentTimeMillis() - ts) + "ms)"); - } - - private static String querypart(String key, String value) throws IOException { - return key + "=" + URLEncoder.encode(value, "UTF-8"); - } - - private static HttpURLConnection conn(String url, String method) throws IOException { - HttpURLConnection conn; - try { - conn = (HttpURLConnection) new URI(url).toURL().openConnection(); - } catch (java.net.URISyntaxException e) { - throw new IOException(e); - } - conn.setRequestMethod(method); - // conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"); - if (url.contains("bilibili.com")) conn.setRequestProperty("Cookie", "SESSDATA=" + SESSDATA); - return conn; - } - - private static byte[] inputStreamToString(HttpURLConnection conn) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - InputStream in; - in = conn.getInputStream(); - int b; - while ((b = in.read()) != -1) { - baos.write(b); - } - in.close(); - return baos.toByteArray(); - } - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - - private static JsonObject preuploadVideo() throws IOException { - StringJoiner url = new StringJoiner("&", "https://member.bilibili.com/preupload?", ""); - url.add(querypart("name", VIDEO_FILE.getName())); - // url.add(querypart("size", String.valueOf(VIDEO_FILE.length()))); - url.add(querypart("r", "upos")); - url.add(querypart("profile", "ugcfx/bup")); - HttpURLConnection conn = conn(url.toString(), "GET"); - System.out.println("GET " + url.toString()); - String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); - try { - JsonObject json = GSON.fromJson(response, JsonObject.class); - System.out.println(GSON.toJson(json)); - return json; - } catch (JsonSyntaxException e) { - System.out.println(response); - throw e; - } - } - - private static JsonObject postVideoMeta(JsonObject preuploadVideo) throws IOException { - String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); - String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); - StringJoiner url = new StringJoiner("&", schemeandhost + path + "?", ""); - url.add(querypart("uploads", "")); // WARNING: this is not a typo, it's required, or 404 - url.add(querypart("output", "json")); - url.add(querypart("profile", "ugcfx/bup")); - url.add(querypart("filesize", String.valueOf(VIDEO_FILE.length()))); - url.add(querypart("partsize", preuploadVideo.get("chunk_size").getAsString())); - url.add(querypart("biz_id", preuploadVideo.get("biz_id").getAsString())); - HttpURLConnection conn = conn(url.toString(), "POST"); - conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); // 403 without it - System.out.println("POST " + url.toString()); - String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); - try { - JsonObject json = GSON.fromJson(response, JsonObject.class); - System.out.println(GSON.toJson(json)); - return json; - } catch (JsonSyntaxException e) { - System.out.println(response); - throw e; - } - } - - private static int uploadVideo(JsonObject preuploadVideo, JsonObject postVideoMeta) throws IOException { - long startts = System.currentTimeMillis() - 1; - String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); - String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); - String urlp = schemeandhost + path + "?"; - long length = VIDEO_FILE.length(); - byte[] buffer = new byte[preuploadVideo.get("chunk_size").getAsInt()]; - int size = 0; - int chunks = (int) Math.ceil(length / (double) buffer.length); - InputStream in = new FileInputStream(VIDEO_FILE); - for (int chunk = 0; chunk < chunks; chunk++) { - System.out.println("speed: " + (chunk * buffer.length) / (System.currentTimeMillis() - startts) + "bytes/s"); - System.out.println("chunk: " + (chunk + 1) + "/" + chunks); - size = in.read(buffer, 0, buffer.length); - if (size == -1) { - break; - } - StringJoiner url = new StringJoiner("&", urlp, ""); - url.add(querypart("partNumber", String.valueOf(chunk + 1))); - url.add(querypart("uploadId", postVideoMeta.get("upload_id").getAsString())); - url.add(querypart("chunk", String.valueOf(chunk))); - url.add(querypart("chunks", String.valueOf(chunks))); - url.add(querypart("size", String.valueOf(size))); - url.add(querypart("start", String.valueOf(chunk * buffer.length))); - url.add(querypart("end", String.valueOf((chunk) * buffer.length + size))); - url.add(querypart("total", String.valueOf(length))); - HttpURLConnection conn = conn(url.toString(), "PUT"); - conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); - conn.setRequestProperty("Content-Type", "application/octet-stream"); - conn.setRequestProperty("Content-Length", String.valueOf(size)); - conn.setDoOutput(true); - conn.getOutputStream().write(buffer, 0, size); - System.out.println("PUT " + url.toString()); - String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); - System.out.println(response); - } - in.close(); - return chunks; - } - - private static void endupload(JsonObject preuploadVideo, JsonObject postVideoMeta, int chunks) throws IOException { - String schemeandhost = "https:" + preuploadVideo.get("endpoint").getAsString(); - String path = preuploadVideo.get("upos_uri").getAsString().replaceFirst("upos:/", ""); - StringJoiner url = new StringJoiner("&", schemeandhost + path + "?", ""); - url.add(querypart("output", "json")); - url.add(querypart("name", VIDEO_FILE.getName())); - url.add(querypart("profile", "ugcfx/bup")); - url.add(querypart("uploadId", postVideoMeta.get("upload_id").getAsString())); - url.add(querypart("biz_id", preuploadVideo.get("biz_id").getAsString())); - JsonArray parts = new JsonArray(); - for (int i = 1; i <= chunks; i++) { - JsonObject part = new JsonObject(); - part.addProperty("partNumber", i); - part.addProperty("eTag", "etag"); - parts.add(part); - } - JsonObject body = new JsonObject(); - body.add("parts", parts); - HttpURLConnection conn = conn(url.toString(), "POST"); - conn.setRequestProperty("X-Upos-Auth", preuploadVideo.get("auth").getAsString()); - conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); - conn.setDoOutput(true); - conn.getOutputStream().write(body.toString().getBytes(StandardCharsets.UTF_8)); - System.out.println("POST " + url.toString()); - String response = new String(inputStreamToString(conn), StandardCharsets.UTF_8); - try { - JsonObject json = GSON.fromJson(response, JsonObject.class); - System.out.println(GSON.toJson(json)); - } catch (JsonSyntaxException e) { - System.out.println(response); - throw e; - } - } - -} -``` diff --git a/docs/creativecenter/videos.md b/docs/creativecenter/videos.md deleted file mode 100644 index 6a800fd..0000000 --- a/docs/creativecenter/videos.md +++ /dev/null @@ -1,555 +0,0 @@ -# 视频相关杂项 - -## 获取稿件列表 - -> https://member.bilibili.com/x2/creative/web/archives/sp - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -注: 该接口返回内容大多为无实际意义的空值, 具体内容建议通过常规接口获取 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ----------- | ----------------- | -| pn | num | 页码 | 必要 | 默认为 1 | -| ps | num | 每页数量 | 必要 | 默认为 10, 留空为 100 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | ---- | -| class | null | 作用尚不明确 | | -| arc_audits | array | 稿件列表 | | -| page | obj | 分页信息 | | -| play_type | num | 1 | | - -`arc_audits` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| Archive | obj | 稿件信息 | | -| Videos | null | | | -| stat | obj | 稿件统计信息 | | -| state_panel | num | 0 | | -| parent_tname | str | 空 | | -| typename | str | 空 | | -| open_appeal | num | 0 | | -| activity | null | | | -| season_add_state | num | 是否可加入合集 | 0: 可以<br />1: 不可以 | - -`Archive` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| aid | num | av 号 | | -| bvid | str | bv 号 | | -| mid | num | 0 | | -| tid | num | 0 | | -| tp_info | null | | | -| title | str | 稿件标题 | | -| author | str | 空 | | -| cover | str | 封面图 | 位于 bfs 需要自行拼接 URL | -| reject_reason | str | 空 | | -| reject_reason_url | str | 空 | | -| tag | str | 空 | | -| duration | num | 0 | | -| copyright | num | 0 | | -| no_reprint | num | 0 | | -| ugcpay | num | 0 | | -| order_id | num | 0 | | -| order_name | str | 空 | | -| adorder_id | num | 0 | | -| adorder_name | str | 空 | | -| adorder_no | str | 空 | | -| online_time | num | 0 | | -| new_adorder_info | null | | | -| desc | str | 稿件简介 | | -| mission_id | num | 0 | | -| mission_name | str | 空 | | -| attribute | num | 0 | | -| state | num | 0 | | -| state_desc | str | 空 | | -| state_panel | num | 0 | | -| source | str | 空 | | -| desc_format_id | num | 0 | | -| attrs | null | | | -| porder | null | | | -| dynamic | str | 空 | | -| poi_object | null | | | -| dtime | num | 0 | | -| ptime | num | 0 | | -| ctime | num | 0 | | -| ugcpay_info | null | | | -| staffs | null | | | -| vote | null | | | -| activity | null | | | -| interactive | num | 0 | | -| hl | null | | | -| no_background | num | 0 | | -| dynamic_video | num | 0 | | -| no_public | num | 0 | | -| is_360 | num | 0 | | -| is_dolby | num | 0 | | -| lossless_music | num | 0 | | -| bs_editor | num | 0 | | -| up_from | num | 0 | | -| desc_v2 | null | | | -| dynamic_v2 | null | | | -| topic_id | num | 0 | | -| topic_name | str | 空 | | -| topic_stat | num | 0 | | -| premiere | num | 0 | | -| is_ugcpay_v2 | num | 0 | | -| recreate | null | | | -| charging_pay | num | 0 | | -| neutral_mark | str | 空 | | -| preview | null | | | -| upower_level | null | | | -| cover43 | str | 空 | | -| had_passed | bool | false | | -| is_staff | num | 0 | | -| is_pugv | num | 0 | | -| upower_mode | num | 0 | | -| upower_unit_price | num | 0 | | - -`stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| aid | num | av 号 | | -| view | num | 播放量 | | -| danmaku | num | 弹幕数 | | -| reply | num | 评论数 | | -| favorite | num | 收藏数 | | -| coin | num | 硬币数 | | -| share | num | 分享数 | | -| now_rank | num | 0 | 当前排名 | -| his_rank | num | 0 | 历史最高排名 | -| like | num | 点赞数 | | -| dislike | num | 点踩数 | 恒为 0 | -| vt | num | 0 | | -| vv | num | 播放量 | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x2/creative/web/archives/sp" \ ---data-urlencode "pn=1" \ ---data-urlencode "ps=3" \ --b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "class": null, - "arc_audits": [ - { - "Archive": { - "aid": 1906473802, - "bvid": "BV1MU411S7iJ", - "mid": 0, - "tid": 0, - "tp_info": null, - "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", - "author": "", - "cover": "/bfs/archive/b76c0b574862f5a8e8eb133f5f33fcbcd602401a.jpg", - "reject_reason": "", - "reject_reason_url": "", - "tag": "", - "duration": 0, - "copyright": 0, - "no_reprint": 0, - "ugcpay": 0, - "order_id": 0, - "order_name": "", - "adorder_id": 0, - "adorder_name": "", - "adorder_no": "", - "online_time": 0, - "new_adorder_info": null, - "desc": "", - "mission_id": 0, - "mission_name": "", - "attribute": 0, - "state": 0, - "state_desc": "", - "state_panel": 0, - "source": "", - "desc_format_id": 0, - "attrs": null, - "porder": null, - "dynamic": "", - "poi_object": null, - "dtime": 0, - "ptime": 0, - "ctime": 0, - "ugcpay_info": null, - "staffs": null, - "vote": null, - "activity": null, - "interactive": 0, - "hl": null, - "no_background": 0, - "dynamic_video": 0, - "no_public": 0, - "is_360": 0, - "is_dolby": 0, - "lossless_music": 0, - "bs_editor": 0, - "up_from": 0, - "desc_v2": null, - "dynamic_v2": null, - "topic_id": 0, - "topic_name": "", - "topic_stat": 0, - "premiere": 0, - "is_ugcpay_v2": 0, - "recreate": null, - "political_media": 0, - "political_editable": 0, - "charging_pay": 0, - "neutral_mark": "", - "preview": null, - "upower_level": null, - "cover43": "", - "had_passed": false, - "is_staff": 0, - "is_pugv": 0, - "upower_mode": 0, - "upower_unit_price": 0 - }, - "Videos": null, - "stat": { - "aid": 1906473802, - "view": 4036, - "danmaku": 8, - "reply": 56, - "favorite": 53, - "coin": 12, - "share": 8, - "now_rank": 0, - "his_rank": 0, - "like": 99, - "dislike": 0, - "vt": 0, - "vv": 4036 - }, - "state_panel": 0, - "parent_tname": "", - "typename": "", - "open_appeal": 0, - "activity": null, - "season_add_state": 0 - }, - { - "Archive": { - "aid": 1956170305, - "bvid": "BV1Ay411i7Ph", - "mid": 0, - "tid": 0, - "tp_info": null, - "title": "十多年前的电脑运行Debian12的启动过程", - "author": "", - "cover": "/bfs/archive/0bff6624fdfcbf3326fba1837fef093d455c846a.jpg", - "reject_reason": "", - "reject_reason_url": "", - "tag": "", - "duration": 0, - "copyright": 0, - "no_reprint": 0, - "ugcpay": 0, - "order_id": 0, - "order_name": "", - "adorder_id": 0, - "adorder_name": "", - "adorder_no": "", - "online_time": 0, - "new_adorder_info": null, - "desc": "", - "mission_id": 0, - "mission_name": "", - "attribute": 0, - "state": 0, - "state_desc": "", - "state_panel": 0, - "source": "", - "desc_format_id": 0, - "attrs": null, - "porder": null, - "dynamic": "", - "poi_object": null, - "dtime": 0, - "ptime": 0, - "ctime": 0, - "ugcpay_info": null, - "staffs": null, - "vote": null, - "activity": null, - "interactive": 0, - "hl": null, - "no_background": 0, - "dynamic_video": 0, - "no_public": 0, - "is_360": 0, - "is_dolby": 0, - "lossless_music": 0, - "bs_editor": 0, - "up_from": 0, - "desc_v2": null, - "dynamic_v2": null, - "topic_id": 0, - "topic_name": "", - "topic_stat": 0, - "premiere": 0, - "is_ugcpay_v2": 0, - "recreate": null, - "political_media": 0, - "political_editable": 0, - "charging_pay": 0, - "neutral_mark": "", - "preview": null, - "upower_level": null, - "cover43": "", - "had_passed": false, - "is_staff": 0, - "is_pugv": 0, - "upower_mode": 0, - "upower_unit_price": 0 - }, - "Videos": null, - "stat": { - "aid": 1956170305, - "view": 2747, - "danmaku": 13, - "reply": 37, - "favorite": 11, - "coin": 14, - "share": 4, - "now_rank": 0, - "his_rank": 0, - "like": 42, - "dislike": 0, - "vt": 0, - "vv": 2747 - }, - "state_panel": 0, - "parent_tname": "", - "typename": "", - "open_appeal": 0, - "activity": null, - "season_add_state": 0 - }, - { - "Archive": { - "aid": 910326709, - "bvid": "BV1GM4y1a7Vn", - "mid": 0, - "tid": 0, - "tp_info": null, - "title": "Minecraft终末之诗,但是谷歌翻译20遍", - "author": "", - "cover": "/bfs/archive/09b7f2542f3e66973ec7de1a3c806cdd45b95426.jpg", - "reject_reason": "", - "reject_reason_url": "", - "tag": "", - "duration": 0, - "copyright": 0, - "no_reprint": 0, - "ugcpay": 0, - "order_id": 0, - "order_name": "", - "adorder_id": 0, - "adorder_name": "", - "adorder_no": "", - "online_time": 0, - "new_adorder_info": null, - "desc": "原内容来源:Minecraft Wiki\n使用的工具:Google Translate\n视频仅供娱乐,请勿当真", - "mission_id": 0, - "mission_name": "", - "attribute": 0, - "state": 0, - "state_desc": "", - "state_panel": 0, - "source": "", - "desc_format_id": 0, - "attrs": null, - "porder": null, - "dynamic": "", - "poi_object": null, - "dtime": 0, - "ptime": 0, - "ctime": 0, - "ugcpay_info": null, - "staffs": null, - "vote": null, - "activity": null, - "interactive": 0, - "hl": null, - "no_background": 0, - "dynamic_video": 0, - "no_public": 0, - "is_360": 0, - "is_dolby": 0, - "lossless_music": 0, - "bs_editor": 0, - "up_from": 0, - "desc_v2": null, - "dynamic_v2": null, - "topic_id": 0, - "topic_name": "", - "topic_stat": 0, - "premiere": 0, - "is_ugcpay_v2": 0, - "recreate": null, - "political_media": 0, - "political_editable": 0, - "charging_pay": 0, - "neutral_mark": "", - "preview": null, - "upower_level": null, - "cover43": "", - "had_passed": false, - "is_staff": 0, - "is_pugv": 0, - "upower_mode": 0, - "upower_unit_price": 0 - }, - "Videos": null, - "stat": { - "aid": 910326709, - "view": 533, - "danmaku": 6, - "reply": 4, - "favorite": 15, - "coin": 13, - "share": 4, - "now_rank": 0, - "his_rank": 0, - "like": 29, - "dislike": 0, - "vt": 0, - "vv": 533 - }, - "state_panel": 0, - "parent_tname": "", - "typename": "", - "open_appeal": 0, - "activity": null, - "season_add_state": 0 - } - ], - "page": { - "pn": 1, - "ps": 3, - "count": 32 - }, - "play_type": 1 - } -} -``` - -</details> - -## 视频基础信息 - -> https://member.bilibili.com/x/web/archive/videos - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---- | ---- | ---- | ---- | ---- | -| aid | num | av 号 | 必要 | | - -**JSON回复:** - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| archive | obj | 稿件信息 | | -| videos | array | 视频信息 | | - -`archive` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| aid | num | av 号 | | -| bvid | str | bvid | | -| title | str | 标题 | | - -`videos` 数组: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | -- | --- | -| cid | num | 分P cid | | -| index | num | 分P 序号 | | -| title | str | 分P 标题 | | -| duration | num | 0 | | - -**示例:** - -```shell -curl -G "https://member.bilibili.com/x/web/archive/videos" \ ---data-urlencode "aid=1906473802" \ --b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "archive": { - "aid": 1906473802, - "bvid": "BV1MU411S7iJ", - "title": "Linux小寄巧: 原地卸载内核然后尝试救活!" - }, - "videos": [ - { - "cid": 1625992822, - "index": 1, - "title": "Linux小寄巧: 原地卸载内核然后尝试救活!", - "duration": 0 - } - ] - } -} -``` - -</details> diff --git a/docs/customerservice/msg.md b/docs/customerservice/msg.md deleted file mode 100644 index 06b5645..0000000 --- a/docs/customerservice/msg.md +++ /dev/null @@ -1,115 +0,0 @@ -# 客服消息 - -## 心跳 - -> https://customerservice.bilibili.com/x/custom/session_svr/v1/heart_beat - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| shop_id | num | 0 | 非必要 | | -| shop_father_id | num | 0 | 非必要 | | -| build | num | 客户端版本 | 非必要 | web: 0 | -| mobi_app | str | 客户端类型 | 非必要 | 如 `web` | - -**JSON回复:** - -|字段|类型|内容|备注| -|-|-|-|-| -|code|num|返回值|0: 成功| -|msg|str|`ok`|失败时不存在| -|message|str|错误信息|成功时为 `ok`| -|ttl|num|1|| - -**示例:** - -```shell -curl -G "https://customerservice.bilibili.com/x/custom/session_svr/v1/heart_beat" \ --b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "ttl": 1 -} -``` - -</details> - -## 上传文件 - -> https://customerservice.bilibili.com/x/custom/msg_svr/v1/upload - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -注: 上传的文件 15 分钟内有效, 过期后下载会返回 HTTP 403 - -**正文参数 (multipart/form-data):** - -|参数名|类型|内容|必要性|备注| -|-|-|-|-|-| -|file|file|文件内容|必要|| -|filename|str|文件名|必要|| -|mid|num|用户 mid|必要|| -|csrf|str|CSRF Token (位于 Cookie 中 bili_jct)|必要|| - -**JSON回复:** - -根对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|code|num|返回值|0: 成功<br />1000011: 仅支持上传300M内的文件<br />1200201: 获取用户信息失败| -|message|str|错误信息|成功时为 `ok`| -|ttl|num|1|| -|data|obj|上传结果|| - -`data` 对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|key|str|文件名|| -|url|str|文件 URL|注意转义| - -**示例:** - -上传文件 `./headers/xx-out.xcf`, 文件名 `ihavenoname` - -```shell -curl -X POST "https://customerservice.bilibili.com/x/custom/msg_svr/v1/upload" \ --F 'file=@./headers/xx-out.xcf' \ --F 'filename=ihavenoname' \ --F 'mid=1070915568' \ --F 'csrf=xxx' \ --b 'SESSDATA=xxx; bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "ok", - "ttl": 1, - "data": { - "key": "1a0c88d240852155a111e4cc6893be39.xcf", - "url": "https://jssz-boss.hdslb.com/customer-video-upload/1a0c88d240852155a111e4cc6893be39.xcf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=f9TxwsagojnE1DWM%2F20240803%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20240803T115447Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=cef962c8e503c6ff564fd485bdef1079df1b4a7e38f4fbd9c21a5667207f406e" - } -} -``` - -</details> diff --git a/docs/danmaku/action.md b/docs/danmaku/action.md deleted file mode 100644 index 95e34c4..0000000 --- a/docs/danmaku/action.md +++ /dev/null @@ -1,828 +0,0 @@ -# 弹幕操作 - -## 发送视频弹幕 - -> https://api.bilibili.com/x/v2/dm/post - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -此接口与漫画弹幕相同 - -`mode=6`的逆向弹幕与`mode=8`的代码弹幕不可发送 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| web_location | str | 普通视频: 1315873 | 不必要 | | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | Cookie 方式必要 | | -| w_rid | str | Wbi 签名 | 必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | str | UNIX 秒级时间戳 | 必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------------------------- | --------------- | ------------------------------------------------------------ | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| type | num | 弹幕类选择 | 必要 | 1:视频弹幕<br />2:漫画弹幕 | -| oid | num | 视频 cid | 必要 | | -| msg | str | 弹幕内容 | 必要 | 长度小于 100 字符 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒<br />默认为0 | -| color | num | 弹幕颜色设置 | 非必要 | 十进制 RGB888 值<br />如`16777215`为 #FFFFFF 即白色 | -| fontsize | num | 弹幕字号设置 | 非必要 | 默认为 25<br />极小:12<br />超小:16<br />小:18<br />标准:25<br />大:36<br />超大:45<br />极大:64 | -| pool | num | 弹幕池选择 | 非必要 | 0:普通池<br />1:字幕池<br />2:特殊池(代码/BAS弹幕)<br />默认为0 | -| mode | num | 弹幕类型选择 | 必要 | 1:普通弹幕<br />4:底部弹幕<br />5:顶部弹幕<br />7:高级弹幕<br />9:BAS弹幕(`pool`必须为2) | -| rnd | num | 当前时间戳*1000000 | 非必要 | **若无此项,则发送弹幕冷却时间限制为90s**<br />若有此项,则发送弹幕冷却时间限制为5s | -| colorful | num | 彩色弹幕 | 非必要 | 60001:专属渐变彩色(需要会员) | -| checkbox_type | num | 是否带 UP 身份标识 | 非必要 | 0:普通<br />4:带有标识 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />36700:系统升级中<br />36701:弹幕包含被禁止的内容<br />36702:弹幕长度大于100<br />36703:发送频率过快<br />36704:禁止向未审核的视频发送弹幕<br />36705:您的等级不足,不能发送弹幕<br />36706:您的等级不足,不能发送顶端弹幕<br />36707:您的等级不足,不能发送底端弹幕<br />36708:您的等级不足,不能发送彩色弹幕<br />36709:您的等级不足,不能发送高级弹幕<br />36710:您的权限不足,不能发送这种样式的弹幕<br />36711:该视频禁止发送弹幕<br />36712:level 1用户发送弹幕的最大长度为20<br />36713:稿件未付费<br />36714:弹幕发送时间不合法<br />36715:当日操作数量超过上限<br />36718:目前您不是大会员,无法使用会员权益 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---------- | ------------------ | -------------------------------- | -| action | str | (?) | | -| animation | str | 弹幕样式 Json? | | -| colorful_src | str 或 obj | 渐变彩色样式信息? | 当请求参数`colorful=60001`时有效 | -| dm_content | str | (?) | | -| dmid | num | 弹幕 dmid | | -| dmid_str | str | 弹幕 dmid | 字串形式 | -| visible | bool | (?) | | - -`data`中的`colorful_src`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| type | num | 60001 | | -| src | str | 渐变色样式 Json? | | - -**示例:** - -为视频`av2`/`BV1xx411c7mD`(cid为`62131`)的 5000ms 位置发送一条弹幕`前来考古`(颜色为 #FFFFFF,字号 25,普通弹幕,游动弹幕) - -```shell -curl 'https://api.bilibili.com/x/v2/dm/post' \ - --data-urlencode 'type=1' \ - --data-urlencode 'oid=62131' \ - --data-urlencode 'msg=前来考古' \ - --data-urlencode 'aid=2' \ - --data-urlencode 'progress=5000' \ - --data-urlencode 'color=16777215' \ - --data-urlencode 'fontsize=25' \ - --data-urlencode 'pool=0' \ - --data-urlencode 'mode=1' \ - --data-urlencode 'rnd=3456789987654321' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "action":"", - "dmid":32161968826613767, - "dmid_str":"32161968826613767", - "visible":true - } -} -``` - -</details> - -## 发送互动弹幕 - -> https://api.bilibili.com/x/v2/dm/command/post - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -2020-09-25 B站更新了互动弹幕功能,包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能 - -详情见: - -[【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) - - [引导关注卡片]( https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 互动弹幕类型 | 必要 | 1:UP主头像弹幕<br />2:关联视频弹幕<br />5:视频内嵌引导关注按钮 | -| aid | num | 稿件avid | 必要 | | -| cid | num | 视频cid | 必要 | | -| progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒<br />默认为0 | -| plat | num | 平台标识 | 必要 | 1:web端<br />2:安卓端<br />8:视频管理页面 | -| data | str | json序列 | 必要 | | -| dmid | num | 修改互动弹幕的弹幕id | 非必要 | 注:修改弹幕`plat`必须为8 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -`data`参数json序列: - -类型为【UP主头像弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| msg | str | 弹幕内容 | | - -类型为【关联视频弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| msg | str | 弹幕内容 | | -| bvid | str | 关联视频的bvid | | - -类型为【视频内嵌引导关注按钮】时: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | --------------- | -| duration | num | 持续时间 | 单位为毫秒 | -| posX | num | X坐标 | 区间:[118-549] | -| posY | num | Y坐标 | 区间:[82-293] | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />-500:服务器错误<br />36711:该视频禁止发送弹幕<br />79026:发送失败,请勿填写当前稿件bvid<br />79024:发送失败,请输入正确的bvid<br />79036:该指令弹幕超出限制<br />79037:关注弹幕坐标溢出 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 正确时:obj<br />错误时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------------------- | ------------------------------------------------------------ | -| command | str | 指令? | UP主头像弹幕:#UP#<br />关联视频弹幕:#LINK#<br />视频内嵌引导关注按钮:#ATTENTION# | -| content | str | 弹幕内容 | | -| extra | str | 弹幕数据 | json序列 | -| id | num | 弹幕dmid | | -| idStr | str | 弹幕dmid | 字串形式 | -| mid | num | 用户mid | | -| oid | num | 视频cid | | -| progress | num | 弹幕出现在视频内的时间 | | -| type | num | 互动弹幕类型 | 1:UP主头像弹幕<br />2:关联视频弹幕<br />5:视频内嵌引导关注按钮 | - -`extra`序列数据: - -类型为【UP主头像弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| icon | str | UP主头像url | | - -类型为【关联视频弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------- | ---- | -| aid | num | 关联视频的avid | | -| title | str | 关联视频的标题 | | -| bvid | str | 关联视频的bvid | | - -类型为【视频内嵌引导关注按钮】时: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | ------------------------------------------ | -| duration | num | 持续时间 | 单位为毫秒 | -| posX | num | X坐标 | 区间:[118-549] | -| posY | num | Y坐标 | 区间:[82-293] | -| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | -| type | num | 关注按钮类型 | 0:仅关注<br />1:仅三联<br />2:关注+三联 | - -**示例:** - -为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条UP主头像弹幕`test` - -```shell -curl 'https://api.bilibili.com/x/v2/dm/command/post' \ ---data-urlencode 'type=1' \ ---data-urlencode 'aid=201947622' \ ---data-urlencode 'cid=230709860' \ ---data-urlencode 'progress=5000' \ ---data-urlencode 'plat=1' \ ---data-urlencode 'data={"msg":"test"}' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 39053842117558279, - "oid": 230709860, - "mid": 293793435, - "type": 1, - "command": "#UP#", - "content": "test", - "extra": "{\"icon\":\"http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg\"}", - "idStr": "39053842117558279" - } -} -``` - -</details> - -为视频`av201947622`(cid为`230709860`)的5000ms位置发送一条发送关联视频弹幕`测试1234`关联视频为`BV1kz4y1X7XP` - -```shell -curl 'https://api.bilibili.com/x/v2/dm/command/post' \ ---data-urlencode 'type=2' \ ---data-urlencode 'aid=201947622' \ ---data-urlencode 'cid=230709860' \ ---data-urlencode 'progress=5000' \ ---data-urlencode 'plat=1' \ ---data-urlencode 'data={"bvid":"BV1kz4y1X7XP","msg":"测试1234"}' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 39054383689236483, - "oid": 230709860, - "mid": 293793435, - "type": 2, - "command": "#LINK#", - "content": "测试1234", - "progress": 11925, - "extra": "{\"aid\":583785685,\"title\":\"【cmd】访问api 命令行也能上B站\",\"bvid\":\"BV1kz4y1X7XP\"}", - "idStr": "39054383689236483" - } -} -``` - -</details> - - -为视频`av201947622`(cid为`230709860`)的5000ms位置发送视频内嵌引导关注按钮,X坐标为118,Y坐标为82,持续时间为5000ms - -```shell -curl 'https://api.bilibili.com/x/v2/dm/command/post' \ ---data-urlencode 'type=5' \ ---data-urlencode 'aid=201947622' \ ---data-urlencode 'cid=230709860' \ ---data-urlencode 'progress=5000' \ ---data-urlencode 'plat=1' \ ---data-urlencode 'data={"duration":5000,"posX":118,"posY":82}' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 39055158405496839, - "oid": 230709860, - "mid": 293793435, - "type": 5, - "command": "#ATTENTION#", - "progress": 5000, - "extra": "{\"duration\":5000,\"posX\":118,\"posY\":82}", - "idStr": "39055158405496839" - } -} -``` - -</details> - -## 发送打分弹幕 - -> https://api.bilibili.com/x/v2/dm/command/grade/post - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -<!--{ - "gh": [220] -}--> - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| aid | num | 稿件 aid | 必要 | | -| cid | num | 分 P cid | 必要 | | -| progress | num | 播放进度 | 必要 | 单位为毫秒 | -| grade_id | num | 打分 id | 必要 | | -| grade_score | num | 分数 | 偶数, 最大 10 | -| polaris_app_id | num | 100 | 不必要 | -| polaris_platfrom | num | 5 | 不必要 | | -| spmid | str | 333.788.0.0 | 不必要 | | -| from_spmid | str | 来源 spmid | 不必要 | | -| csrf | str | CSRF Token (即 Cookie 中的 bili_jct) | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dmid | num | 弹幕dmid | | -| dmid_str | str | 弹幕dmid | 字串形式 | -| visible | bool | 是否可见 | | -| action | str | 动作 | `"grade:"` + (请求的分数 / 2) | - -**示例:** - -```shell -curl -X POST 'https://api.bilibili.com/x/v2/dm/command/grade/post' \ ---data-urlencode 'aid=112861976201494' \ ---data-urlencode 'cid=500001629877726' \ ---data-urlencode 'progress=32000' \ ---data-urlencode 'grade_id=3651137' \ ---data-urlencode 'grade_score=10' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "dmid": 1651556419721443584, - "dmidStr": "1651556419721443584", - "visible": true, - "action": "grade:5" - } -} -``` - -</details> - -## 撤回弹幕 - -> https://api.bilibili.com/x/dm/recall - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -仅能撤回自己两分钟内的弹幕,且每天只有3次机会 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| dmid | num | 弹幕dmid | 必要 | | -| cid | num | 视频cid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-400:请求错误<br />-404:无此项<br />36301:撤回失败,弹幕发送已过2分钟<br />36302:撤回失败,弹幕已经被删除或撤回<br />36303:撤回失败,今天撤回的机会已经用完<br />36304:撤回失败,服务器出错 | -| message | str | 错误信息 | 成功后显示剩余次数 | -| ttl | num | 1 | | - -**示例:** - -撤回`cid=168901231`下的弹幕`32310301474947077`的弹幕 - -```shell -curl 'https://api.bilibili.com/x/dm/recall' \ ---data-urlencode 'cid=168901231' \ ---data-urlencode 'dmid=32310301474947077' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "撤回成功,你还有3次撤回机会" -} -``` - -</details> - -## 购买高级弹幕发送权限 - -> https://api.bilibili.com/x/dm/adv/buy - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -购买一次需要2硬币,同时向up主发送请求 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| mode | str | sp | 必要 | | -| cid | num | 视频cid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-102:账号被封停<br />-111:csrf校验失败<br />-107:硬币不足<br />-400:请求错误<br />36007:不允许购买<br />36009:正在确认中<br />36010:已购买 | -| message | str | 返回信息 | | -| ttl | num | 1 | | - -示例: - -购买视频cid为`168901231`的高级弹幕发送权限 - -```shell -curl 'https://api.bilibili.com/x/dm/adv/buy' \ ---data-urlencode 'cid=168901231' \ ---data-urlencode 'mode=sp' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"已成功购买" -} -``` - -</details> - -## 检测高级弹幕发送权限 - -> https://api.bilibili.com/x/dm/adv/state - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| mode | str | sp | 必要 | | -| cid | num | 视频cid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | ---------------- | -------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />--400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj<br />无效时:null | 有效时:信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------------- | ------------------------------------------ | -| coins | num | 需要支付的硬币数 | | -| confirm | num | 是否同意 | 1:同意<br />2:未同意<br />未购买时无此项 | -| accept | bool | 是否允许申请 | true:允许<br />false:不允许 | -| hasBuy | bool | 是否已购买 | true:已购买<br />未购买时无此项 | - -**示例:** - -查询视频cid为`168901231`的视频高级弹幕权限购买状态 - -当前状态为已购买且同意 - -```shell -curl -G 'https://api.bilibili.com/x/dm/adv/state' \ ---data-urlencode 'cid=168901231' \ ---data-urlencode 'mode=sp' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "coins": 2, - "confirm": 1, - "accept": true, - "hasBuy": true - } -} -``` - -</details> - -## 点赞弹幕 - -> https://api.bilibili.com/x/v2/dm/thumbup/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -查询指定弹幕点赞状态参阅文档 [弹幕点赞查询](thumbup.md) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| dmid | num | 目标弹幕 dmid | 必要 | | -| oid | num | 目标弹幕所在视频 cid | 必要 | | -| op | num | 操作 | 必要 | 1:点赞<br />2:取消点赞 | -| platform | str | 平台标识 | 非必要 | web_player:web 播放器<br />android:安卓端 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />36106:该弹幕已被删除<br/>36805:该视频禁止点赞弹幕<br/>65004:取消赞失败 未点赞过<br />65006:已赞过 | -| message | str | 错误信息 | 默认为0 | -| tll | num | 1 | | - -**示例** - -为`cid=145928946`下的弹幕`35600074482384899`点赞 - -```shell -curl 'https://api.bilibili.com/x/v2/dm/thumbup/add' \ - --data-urlencode 'dmid=35600074482384899' \ - --data-urlencode 'oid=145928946' \ - --data-urlencode 'op=1' \ - --data-urlencode 'platform=web_player' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -</details> - -## 举报弹幕 - -> https://api.bilibili.com/x/dm/report/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| cid | num | 视频cid | 必要 | | -| dmid | num | 弹幕dmid | 必要 | | -| reason | num | 举报类型 | 必要 | **类型代码见下表** | -| content | str | 其他举报备注 | 非必要 | `reason=11`时有效 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -举报类型`reason`: - -| 代码 | 含义 | -| ---- | ---------- | -| 1 | 违法违禁 | -| 2 | 色情低俗 | -| 3 | 赌博诈骗 | -| 4 | 人身攻击 | -| 5 | 侵犯隐私 | -| 6 | 垃圾广告 | -| 7 | 引战 | -| 8 | 剧透 | -| 9 | 恶意刷屏 | -| 10 | 视频无关 | -| 11 | 其他 | -| 12 | 青少年不良 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />36201:举报弹幕不存在<br />36203:举报原因类型错误<br />36204:已举报 | -| message | str | 错误信息 | 默认为空 | -| tll | num | 1 | 举报失败时 | - -**示例** - -举报`cid=145928946`下的弹幕`35600074482384899`,理由是`引战` - -```shell -curl 'https://api.bilibili.com/x/dm/report/add' \ ---data-urlencode 'cid=145928946' \ ---data-urlencode 'dmid=35600074482384899' \ ---data-urlencode 'reason=7' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"" -} -``` - -</details> - -## 保护&删除弹幕 - -> https://api.bilibili.com/x/v2/dm/edit/state - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) 或APP - -注:只能操作自己的稿件或有骑士权限的稿件 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | --------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 弹幕类选择 | 必要 | 1:视频弹幕 | -| oid | num | 视频cid | 必要 | | -| dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 | -| state | num | 操作代码 | 必要 | 1:删除弹幕<br />2:弹幕保护<br />3:取消保护 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例** - -删除`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531` - -```shell -curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=145928946' \ ---data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \ ---data-urlencode 'state=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -</details> - -## 修改字幕池 - -> https://api.bilibili.com/x/v2/dm/edit/pool - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) 或APP - -注:只能操作自己的稿件或有骑士权限的稿件 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| type | num | 弹幕类选择 | 必要 | 1:视频弹幕 | -| oid | num | 视频cid | 必要 | | -| dmids | nums | 弹幕dmid | 必要 | 多个id之间用`,`分隔 | -| pool | num | 操作代码 | 必要 | 0:移出字幕池<br />1:移入字幕池 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例** - -将`cid=145928946`下的弹幕`35600074482384899`、`39067304918515717`、`39082777041174531`移入字幕池 - -```shell -curl 'https://api.bilibili.com/x/v2/dm/edit/state' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=145928946' \ ---data-urlencode 'pool=1' \ ---data-urlencode 'dmids=35600074482384899,39067304918515717,39082777041174531' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -</details> diff --git a/docs/danmaku/buzzword.md b/docs/danmaku/buzzword.md deleted file mode 100644 index 5f65356..0000000 --- a/docs/danmaku/buzzword.md +++ /dev/null @@ -1,508 +0,0 @@ -# 名词解释 - -该功能用于解释和科普 B 站弹幕、评论等的专有名词及梗,展示其出处,并推荐相关站内内容 - -可使用页面 https://www.bilibili.com/blackboard/activity-joFQ0txEQd.html?type_id=4 查看名词列表 - -可使用页面 https://www.bilibili.com/blackboard/activity-WroMZNunfa.html?id=1 查看名词解释详情 - -## 拉取名词解释列表 - -> https://api.bilibili.com/x/v2/dm/buzzword/list - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | -------- | ------ | ---------------------------------------------- | -| type_id | num | 名词类型 | 必要 | 如:4代表“哔哩哔哩热词图鉴”<br />5代表“语言类” | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | 默认为20 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -| type | obj | 类型信息 | | -| buzzwords | array | 词语列表 | | -| page | obj | 页面信息 | | - -`data`中的`type`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ------ | -| id | num | 类型 id | | -| name | str | 类型名称 | | -| name_pinyin | obj | 拼音信息 | 见副表 | - -`data`中的`buzzwords`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 名词条目 1 | | -| n | obj | 名词条目(n+1) | | -| …… | obj | …… | …… | - -`buzzwords`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ----------------------------------------- | -| id | num | 名词 id | 用于[查询名词解释详情](#查询名词解释详情) | -| name | str | 名词 | | -| name_pinyin | obj | 拼音信息 | 见副表 | -| picture | str | 名词图片 url | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---- | -| num | num | 当前页码 | | -| size | num | 每页项数 | | -| total | num | 总计项数 | | -| cnt | num | (?) | | - -副表:拼音`name_pinyin`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------- | ---- | -| 对应单个汉字 1 | str | 拼音字串 | | -| 对应单个汉字 n | str | 拼音字串 | | -| …… | str | …… | …… | - -**示例:** - -拉取对应`哔哩哔哩热词图鉴`的名词列表,以20项为一页拉取第1页 - -```bash -curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/list' \ ---data-urlencode 'type_id=4' \ ---data-urlencode 'ps=10' \ ---data-urlencode 'pn=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "type": { - "id": 4, - "name": "哔哩哔哩热词图鉴", - "name_pinyin": { - "哔": "bì", - "哩": "lī", - "图": "tú", - "热": "rè", - "词": "cí", - "鉴": "jiàn" - }, - "level": 0 - }, - "buzzwords": [ - { - "id": 145, - "name": "麦乐鸡侠", - "name_pinyin": { - "乐": "lè", - "侠": "xiá", - "鸡": "jī", - "麦": "mài" - }, - "picture": "https://i0.hdslb.com/bfs/archive/1cdec1ff86733a38c1a9ff824dde6d4121955aee.png" - }, - { - "id": 146, - "name": "金钱豹", - "name_pinyin": { - "豹": "bào", - "金": "jīn", - "钱": "qián" - }, - "picture": "https://i0.hdslb.com/bfs/archive/3d492f4c01da7d15073d3175871e14ed56f0f78a.png" - }, - { - "id": 11, - "name": "通辽可汗", - "name_pinyin": { - "可": "kě", - "汗": "hàn", - "辽": "liáo", - "通": "tōng" - }, - "picture": "https://i0.hdslb.com/bfs/archive/ca332fb5f9da48497298cf26fe07b1f061e53a0b.jpg" - }, - { - "id": 123, - "name": "资本马桶搋", - "name_pinyin": { - "搋": "chuāi", - "本": "běn", - "桶": "tǒng", - "资": "zī", - "马": "mǎ" - }, - "picture": "https://i0.hdslb.com/bfs/archive/aaf33dced1941af0946f37c62f4b48fcaba9c9a2.jpg" - }, - { - "id": 133, - "name": "马了顶大", - "name_pinyin": { - "了": "le", - "大": "dà", - "顶": "dǐng", - "马": "mǎ" - }, - "picture": "https://i0.hdslb.com/bfs/archive/9653bd7f8d2c804aceb8043ebd5c8360a93e26c0.png" - }, - { - "id": 9, - "name": "退钱", - "name_pinyin": { - "退": "tuì", - "钱": "qián" - }, - "picture": "https://i0.hdslb.com/bfs/archive/2540db0bc94792b1f5be75e19aa05d33666e3036.jpg" - }, - { - "id": 141, - "name": "森林冰火人", - "name_pinyin": { - "人": "rén", - "冰": "bīng", - "林": "lín", - "森": "sēn", - "火": "huǒ" - }, - "picture": "https://i0.hdslb.com/bfs/archive/bc5ca101313d4db223c395d64779e76eb3482d60.jpg" - }, - { - "id": 22, - "name": "学霸题", - "name_pinyin": { - "学": "xué", - "霸": "bà", - "题": "tí" - }, - "picture": "https://i0.hdslb.com/bfs/archive/a67a0a57ec48beb8c8dcc9f26c7bb66cd0ed5da7.jpg" - }, - { - "id": 10, - "name": "张三", - "name_pinyin": { - "三": "sān", - "张": "zhāng" - }, - "picture": "https://i0.hdslb.com/bfs/archive/f4dac6fdc5c58639b79ae87385e9b9f7eae3b263.png" - }, - { - "id": 5, - "name": "饮茶先啦", - "name_pinyin": { - "先": "xiān", - "啦": "la", - "茶": "chá", - "饮": "yǐn" - }, - "picture": "https://i0.hdslb.com/bfs/archive/4c90ad207f0041e2dccd586827028aea50c2dc7d.jpg" - } - ], - "page": { - "num": 1, - "size": 10, - "total": 143, - "cnt": 0 - } - } -} -``` - -</details> - -## 查询名词解释详情 - -> https://api.bilibili.com/x/v2/dm/buzzword/detail - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ------ | -------------------------------- | -| id | num | 名词id | 必要 | 如:1代表“kksk”<br />2代表“打脸” | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --------------------------------- | -------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:不存在该名词 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有数据时:obj<br />无数据时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ------------------------------- | -------------------- | ----------------------------- | -| id | num | 名词id | | -| name | str | 名词 | | -| description | str | 名词解释 | | -| picture | str | 名词图片 url | | -| types | array | 父分类列表 | 该名词可能隶属多个父分类 | -| related_words | array | 近义词/相关词 | | -| uppers | 有数据:array<br />无数据:null | 相关 UP 列表 | 该名词(梗)出处 | -| related_ugc | 有数据:array<br />无数据:null | 相关 ucg 视频列表 | 该名词(梗)出处 | -| related_ogv | 有数据:array<br />无数据:null | 相关 pgc 视频列表 | 该名词(梗)出处 | -| guides | obj | 推荐创作信息 | | -| related_buzzwords | array | 推荐名词列表 | | -| topic | obj | 关联话题信息 | | -| show_dynamic | bool | 是否展示话题动态聚合 | `true`展示<br />`false`不展示 | - -`data`中的`types`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 父分类 1 | | -| n | obj | 父分类(n+1) | | -| …… | obj | …… | …… | - -`types`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ---- | -| id | num | 类型 id | | -| name | str | 类型名称 | | -| name_pinyin | null | | | -| level | num | 权重? | | - -`data`中的`related_words`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------------- | ---- | -| 0 | str | 近义词/相关词1 | | -| n | str | 近义词/相关词(n+1) | | -| …… | str | …… | …… | - -`data`中的`uppers`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 相关 UP 1 | | -| n | obj | 相关 UP(n+1) | | -| …… | obj | …… | …… | - -`uppers`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------- | ------------------------------------------------------------ | -| id | num | UP 主 mid | | -| recommend | str | | | -| name | str | UP 主昵称 | | -| face | str | UP 主头像 url | | -| official | obj | UP 主认证信息 | | -| followed | bool | 是否关注 | 需要登录(Cookie 或 APP)<br />`true`已关注<br />`false`未关注 | -| fans_count | num | 粉丝数 | | - -`data`中的`related_ugc`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------------- | ---- | -| 0 | obj | 相关 ucg 视频 1 | | -| n | obj | 相关 ucg 视频(n+1) | | -| …… | obj | …… | …… | - -`related_ugc`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | -------- | -| aid | num | 稿件 avid | | -| cid | num | 视频 cid | | -| name | str | 视频标题 | | -| link | str | 空 | | -| play | num | 播放数 | | -| danmaku | num | 弹幕数 | | -| duration | num | 视频时长 | 单位为秒 | -| cover | str | 视频封面 url | | - -`data`中的`related_ogv`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------------- | ---- | -| 0 | obj | 相关 pgc 视频 1 | | -| n | obj | 相关 pgc 视频(n+1) | | -| …… | obj | …… | …… | - -`related_ogv`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ------------------------------------- | -| season_id | num | 剧集 ssid | | -| name | str | 剧集标题 | | -| play | num | 播放数 | | -| followed | num | 追剧/番数 | | -| is_followed | bool | 是否追剧/番 | `true`已追剧/番<br />`false`未追剧/番 | -| new_ep | str | 最新一集信息 | | -| cover | str | 剧集封面 url | | -| episodes | null | | | -| follow_info | obj | | | - -`data`中的`guides`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | ---------------- | ---- | -| description | str | 创作推介文案 | | -| contribute_tags | array | 创作跳转按钮信息 | | - -`guides`中的`contribute_tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---- | -| 0 | obj | 创作跳转按钮 1 | | -| n | obj | 创作跳转按钮(n+1) | | -| …… | obj | …… | …… | - -`contribute_tags`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | -------------------------- | -| title | str | 按钮文案 | | -| link | str | 跳转 uri | 跳转至必剪或客户端创作入口 | - -`data`中的`related_buzzwords`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 推荐名词 1 | | -| n | obj | 推荐名词(n+1) | | -| …… | obj | …… | …… | - -`related_buzzwords`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------- | ----------------------------------------- | -| id | num | 名词 id | 用于[查询名词解释详情](#查询名词解释详情) | -| name | str | 名词 | | -| name_pinyin | null | | | -| picture | str | 空 | | - -`data`中的`topic`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ---- | -| topic_id | num | 关联话题id | | -| topic_name | str | 关联话题名称 | | - -**示例:** - -查询名词`kksk`的详情 - -```bash -curl -G 'https://api.bilibili.com/x/v2/dm/buzzword/detail' \ ---data-urlencode 'id=1' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1, - "name": "kksk", - "description": "该梗是日语“ここすき”罗马音的字母缩写,翻译为喜欢这里。一般作为赞扬认可的弹幕出现在视频画面中。由于在2017年随着以《恶魔人》为BGM和语音剪辑素材的《美洲豹人》系列作品的传播,让这个梗快速的通过弹幕流行开,并频繁出现在各类稿件经典画面中。", - "picture": "https://i0.hdslb.com/bfs/archive/c269c9ca1b5eb730ee1d77aadd28e3165eaa4d6d.png", - "types": [ - { - "id": 4, - "name": "哔哩哔哩热词图鉴", - "name_pinyin": null, - "level": 0 - }, - { - "id": 5, - "name": "语言类", - "name_pinyin": null, - "level": 0 - }, - { - "id": 9, - "name": "空耳", - "name_pinyin": null, - "level": 0 - } - ], - "related_words": [ - "恶魔人", - "美洲豹人", - "喜欢这里" - ], - "uppers": [ - { - "id": 488450, - "recommend": "", - "name": "PXN1", - "face": "http://i2.hdslb.com/bfs/face/96dd8cc4f2922bd81e5a938f6ad02b3e3041debe.jpg", - "official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "followed": false, - "fans_count": 1416 - } - ], - "related_ugc": [ - { - "aid": 30056798, - "cid": 52388183, - "name": "恶 魔 人", - "link": "", - "play": 3434500, - "danmaku": 8292, - "duration": 188, - "cover": "http://i0.hdslb.com/bfs/archive/f0433d2dacf4b3397a9390ab982cefd138dbf8c8.jpg" - } - ], - "related_ogv": null, - "guides": { - "description": "使用同款热梗素材创作你的专属作品吧!添加热梗主题#kksk是什么梗#参与投稿,优质稿件会优先展示在哔哩哔哩热词图鉴相关推荐中哦!", - "contribute_tags": [ - { - "title": "拍同款", - "link": "bilibili://uper/appTraffic?appScheme=bcut%3A%2F%2Fstudio%2Fmaterial_editor%2F%3Ftab_id%3D1%26sub_id%3D90160%26third_id%3D150281&appName=com.bilibili.studio&appID=1299589486" - } - ] - }, - "related_buzzwords": null, - "topic": { - "topic_id": 7642, - "topic_name": "kksk是什么梗" - }, - "show_dynamic": false - } -} -``` - -</details> diff --git a/docs/danmaku/config.md b/docs/danmaku/config.md deleted file mode 100644 index 9cd760f..0000000 --- a/docs/danmaku/config.md +++ /dev/null @@ -1,71 +0,0 @@ -# 弹幕个人配置修改 - -## 修改弹幕个人配置(web端) - -> https://api.bilibili.com/x/v2/dm/web/config - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ------ | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| dm_switch | bool | 弹幕开关 | 非必要 | true:开启<br />false:关闭 | -| blockscroll | bool | 屏蔽类型-滚动 | 非必要 | true:不屏蔽<br />false:屏蔽 | -| blocktop | bool | 屏蔽类型-顶部 | 非必要 | 同上 | -| blockbottom | bool | 屏蔽类型-底部 | 非必要 | 同上 | -| blockcolor | bool | 屏蔽类型-彩色 | 非必要 | 同上 | -| blockspecial | bool | 屏蔽类型-特殊 | 非必要 | 同上 | -| ai_switch | bool | 是否打开智能云屏蔽 | 非必要 | true:开启<br />false:关闭 | -| ai_level | num | 智能云屏蔽等级 | 非必要 | 区间:[0-10]<br />0为默认等级(3级) | -| preventshade | bool | 防挡弹幕(底部15%) | 非必要 | true:开启<br />false:关闭 | -| dmask | bool | 智能防挡弹幕(人像蒙版) | 非必要 | 同上 | -| opacity | num | 弹幕不透明度 | 非必要 | 区间:[0-1] | -| dmarea | num | 弹幕显示区域 | 非必要 | 100:不重叠<br />75:3/4屏<br />50:半瓶<br />25:1/4屏<br />0:不限 | -| speedplus | num | 弹幕速度 | 非必要 | 区间:[0.4-1.6] | -| fontsize | num | 字体大小 | 非必要 | 区间:[0.4-1.6] | -| screensync | bool | 跟随屏幕缩放比例 | 非必要 | true:开启<br />false:关闭 | -| speedsync | bool | 根据播放倍速调整速度 | 非必要 | 同上 | -| fontfamily | str | 字体类型 | 非必要 | 未启用 | -| bold | bool | 粗体 | 非必要 | 未启用 | -| fontborder | num | 描边类型 | 非必要 | 0:重墨<br />1:描边<br />2:45°投影 | -| drawType | string | 渲染类型 | 非必要 | 未启用 | -| ts | num | 当前时间戳 | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />23004:数据没有修改 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -关闭弹幕 - -```shell -curl 'https://api.bilibili.com/x/v2/dm/web/config' \ ---data-urlencode 'dm_switch=false' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -</details> \ No newline at end of file diff --git a/docs/danmaku/danmaku_proto.md b/docs/danmaku/danmaku_proto.md deleted file mode 100644 index b21bd32..0000000 --- a/docs/danmaku/danmaku_proto.md +++ /dev/null @@ -1,115 +0,0 @@ -# protobuf弹幕 - -2020年5月23日,哔哩哔哩网页端及移动端启用了新的默认弹幕 API,网页端弹幕显示的上限变为原弹幕池上限的两倍。 - -新的 API 是以 6min 为一个单位加载,即每次加载 6min 内的弹幕 - -## 获取实时弹幕 - -> https://api.bilibili.com/x/v2/dm/web/seg.so (web端) -> -> https://api.bilibili.com/x/v2/dm/wbi/web/seg.so (web 端新接口,需要 wbi 认证) -> -> https://api.bilibili.com/x/v2/dm/list/seg.so (APP端) -> -> https://i0.hdslb.com/bfs/dm/{data}.bin (BAS/代码弹幕专包) - -*请求方式:GET* -*认证方式:半匿名(部分视频在无 Cookie: SESSDATA 时只返回部分弹幕)* - -此接口与漫画弹幕相同 - -只能返回普通弹幕(`pool=1` `mode=1-7`)和代码弹幕(`pool=2` `mode=8`),BAS弹幕(`pool=2` `mode=9`)请从[弹幕元数据](danmaku_view_proto.md)中获取 - -互动弹幕(UP 主头像弹幕、关联视频、内嵌关注按钮)也不存在这个接口,请从[弹幕元数据](danmaku_view_proto.md)中获取 - -**注:仅获取 6min 的整数倍时间内的弹幕,6min 内最多弹幕数为 6000 条(如第一包中弹幕`progress`值域为0-360000)** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | --------- | ------ | ---------------------------- | -| type | num | 弹幕类 | 必要 | 1:视频弹幕<br />2:漫画弹幕 | -| oid | num | 视频 cid | 必要 | | -| pid | num | 稿件 avid | 非必要 | | -| segment_index | num | 分包 | 必要 | 6min 一包 | -| pull_mode | num | (?) | 非必要 | | -| ps | num | (?) | 非必要 | | -| pe | num | (?) | 非必要 | | - -**proto回复:** - -proto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](../../grpc_api/bilibili/community/service/dm/v1/dm.proto) - -- [protogen.marcgravell](https://protogen.marcgravell.com/): 在线编译 protogen 工具, 无需再安装本地编译器(生成文件需加后缀`_pb2.py`才可使用) - -- [protobuf pip](https://pypi.org/project/protobuf/): 可一键安装的 Python 的 protogen 解析库 - -消息`DmSegMobileReply`: - -| 名称 | 类型 | 含义 | 备注 | -| ----- | -------------------- | -------- | ---- | -| elems | repeated DanmakuElem | 弹幕条目 | | - -消息`DanmakuElem`: - -| 名称 | 类型 | 含义 | 备注 | -| --------- | ------ | ------------------ | ------------------------------------------------------------ | -| id | int64 | 弹幕 dmid | 唯一 可用于操作参数 | -| progress | int32 | 视频内弹幕出现时间 | 毫秒 | -| mode | int32 | 弹幕类型 | 1 2 3:普通弹幕<br />4:底部弹幕<br />5:顶部弹幕<br />6:逆向弹幕<br />7:高级弹幕<br />8:代码弹幕<br />9:BAS 弹幕(仅限于特殊弹幕专包) | -| fontsize | int32 | 弹幕字号 | 18:小<br />25:标准<br />36:大 | -| color | uint32 | 弹幕颜色 | 十进制 RGB888 值 | -| midHash | string | 发送者 mid 的 HASH | 用于屏蔽用户和查看用户发送的所有弹幕,也可反查用户id | -| content | string | 弹幕内容 | utf-8编码 | -| ctime | int64 | 弹幕发送时间 | 时间戳 | -| weight | int32 | 权重 | 用于智能屏蔽,根据弹幕语义及长度通过AI识别得出<br />范围:[0-10]<br />值越大权重越高 | -| action | string | 动作? | | -| pool | int32 | 弹幕池 | 0:普通池<br />1:字幕池<br />2:特殊池(代码/BAS弹幕) | -| idStr | string | 弹幕 dmid | 字串形式<br />唯一 可用于操作参数 | -| attr | int32 | 弹幕属性位 | bit0:保护<br />bit1:直播<br />bit2:高赞 | -| animation | string | 动画? | | - -**示例:** - -获取视频`av810872(cid=1176840)`(炮姐)的实时弹幕分包 1 - -**注:以下[proto定义](../grpc_api/bilibili/community/service/dm/v1/dm.proto)需要编译,`bilibili.community.service.dm.v1.dm_pb2`并非通过 pypi 安装** - -```python -import requests -import google.protobuf.text_format as text_format -import bilibili.community.service.dm.v1.dm_pb2 as Danmaku - -url = 'https://api.bilibili.com/x/v2/dm/web/seg.so' -params = { - 'type': 1, # 弹幕类型 - 'oid': 1176840, # cid - 'pid': 810872, # avid - 'segment_index': 1 # 弹幕分段 -} -resp = requests.get(url, params) -data = resp.content - -danmaku_seg = Danmaku.DmSegMobileReply() -danmaku_seg.ParseFromString(data) - -print(text_format.MessageToString(danmaku_seg.elems[0], as_utf8=True)) -``` - -输出: - -``` -id: 711923911 -progress: 47880 -mode: 1 -fontsize: 18 -color: 10092288 -midHash: "59417e95" -content: "世界第一电击公主殿下,遇到你是我一生最美好的风景!吾炮赛高,永生不离!唯我超电磁炮永世长存! " -ctime: 1418799826 -weight: 6 -idStr: "711923911" -attr: 1 -``` - diff --git a/docs/danmaku/danmaku_view_proto.md b/docs/danmaku/danmaku_view_proto.md deleted file mode 100644 index 4c761e3..0000000 --- a/docs/danmaku/danmaku_view_proto.md +++ /dev/null @@ -1,288 +0,0 @@ -# 弹幕元数据 - -2020-09-25 B站更新了互动弹幕功能,包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能 - -详情见: - -- [【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) -- [引导关注卡片](https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) - -## 获取弹幕个人配置与互动弹幕及BAS(代码)弹幕专包(web端) - -> https://api.bilibili.com/x/v2/dm/web/view - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ----------- | -| type | num | 弹幕类 | 必要 | 1:视频弹幕 | -| oid | num | 视频cid | 必要 | | -| pid | num | 稿件avid | 非必要 | | - -**proto回复:** - -消息`DmWebViewReply`: - -| 名称 | 类型 | 含义 | 备注 | -| ---------- | -------------------- | ---------------------- | ---------------------------- | -| state | int32 | 弹幕开放状态 | 0:开放弹幕<br />1:禁止弹幕 | -| text | string | ? | | -| textSide | string | ? | | -| dmSge | DmSegConfig | 分段弹幕包信息? | | -| flag | DanmakuFlagConfig | ? | | -| specialDms | repeated string | BAS(代码)弹幕专包url | | -| checkBox | bool | ? | | -| count | int64 | 实际弹幕总数 | 具有1500-6000不等的上限 | -| commandDms | repeated CommandDm | 互动弹幕条目 | | -| dmSetting | DanmuWebPlayerConfig | 弹幕个人配置 | 仅登录后存在 | - -消息`dmSge`: - -| 名称 | 类型 | 含义 | 备注 | -| -------- | ----- | ------------ | ---------- | -| pageSize | int64 | 分段时间? | 单位为毫秒 | -| total | int64 | 最大分页数? | | - -消息`flag`: - -| 名称 | 类型 | 含义 | 备注 | -| --------- | ------ | ---- | ---- | -| recFlag | int32 | ? | | -| recText | string | ? | | -| recSwitch | int32 | ? | | - -消息`commandDms`: - -| 名称 | 类型 | 含义 | 备注 | -| -------- | ------ | ------------ | ------------------------------------------------------------ | -| id | int64 | 弹幕dmid | | -| oid | int64 | 视频cid | | -| mid | int64 | 发送者mid | | -| command | string | 弹幕指令 | `#UP#`:UP主头像弹幕<br />`#LINK#`:关联视频弹幕<br />`#ATTENTION#`:视频内嵌引导关注按钮 | -| content | string | 弹幕文字 | | -| progress | int32 | 弹幕出现时间 | 单位为毫秒 | -| ctime | string | 创建时间? | 此项为空 | -| mtime | string | 修改时间? | 此项为空 | -| extra | string | 弹幕负载数据 | json序列字串 | -| idStr | string | 弹幕dmid | 字串形式 | - -`extra`json序列: - -类型为【UP主头像弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| icon | str | UP主头像url | | - -类型为【关联视频弹幕】时: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------------- | ---- | -| aid | num | 关联视频的avid | | -| title | str | 关联视频的标题 | | -| icon | str | 关联视频按钮图片url | | -| bvid | str | 关联视频的bvid | | - -类型为【视频内嵌引导关注按钮】时: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | ------------------------------------------ | -| duration | num | 持续时间 | 单位为毫秒 | -| posX | num | X坐标 | 区间:[118-549] | -| posY | num | Y坐标 | 区间:[82-293] | -| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | -| type | num | 关注按钮类型 | 0:仅关注<br />1:仅三连<br />2:关注+三连 | - -消息`dmSetting`: - -| 名称 | 类型 | 含义 | 备注 | -| ------------ | ------ | ------------------------ | ------------------------------------------------------------ | -| dmSwitch | bool | 弹幕开关 | true:开启<br />false:关闭 | -| aiSwitch | bool | 智能云屏蔽 | 同上 | -| aiLevel | int32 | 智能云屏蔽级别 | 区间:[1-10] | -| blocktop | bool | 屏蔽类型-顶部 | true:不屏蔽<br />false:屏蔽 | -| blockscroll | bool | 屏蔽类型-滚动 | 同上 | -| blockbottom | bool | 屏蔽类型-底部 | 同上 | -| blockcolor | bool | 屏蔽类型-彩色 | 同上 | -| blockspecial | bool | 屏蔽类型-特殊 | 同上 | -| preventshade | bool | 防挡弹幕(底部15%) | true:开启<br />false:关闭 | -| dmask | bool | 智能防挡弹幕(人像蒙版) | 同上 | -| opacity | float | 弹幕不透明度 | 区间:[0-1] | -| dmarea | int32 | 弹幕显示区域 | 100:不重叠<br />75:3/4屏<br />50:半瓶<br />25:1/4屏<br />0:不限 | -| speedplus | float | 弹幕速度 | 区间:[0.4-1.6] | -| fontsize | float | 字体大小 | 区间:[0.4-1.6] | -| screensync | bool | 跟随屏幕缩放比例 | | -| speedsync | bool | 根据播放倍速调整速度 | | -| fontfamily | string | 字体类型? | 未启用 | -| bold | bool | 粗体? | 未启用 | -| fontborder | int32 | 描边类型 | 0:重墨<br />1:描边<br />2:45°投影 | -| drawType | string | 渲染类型? | 未启用 | - -protobuf结构体: - -**web_dmview.proto** - -```protobuf -syntax = "proto3"; - -//分段弹幕包信息? -message DmSegConfig { - int64 pageSize = 1; //分段时间? - int64 total = 2; //最大分页数? -} - -// -message DanmakuFlagConfig { - int32 recFlag = 1; // - string recText = 2; // - int32 recSwitch = 3; // -} - -// 互动弹幕条目 -message CommandDm { - int64 id = 1; //弹幕dmid - int64 oid = 2; //视频cid - int64 mid = 3; //发送者mid - string command = 4; //弹幕指令 - string content = 5; //弹幕文字 - int32 progress = 6; //弹幕出现时间 - string ctime = 7; // - string mtime = 8; // - string extra = 9; //弹幕负载数据 - string idStr = 10; //弹幕dmid(字串形式) -} - -//弹幕个人配置 -message DanmuWebPlayerConfig{ - bool dmSwitch=1; //弹幕开关 - bool aiSwitch=2; //智能云屏蔽 - int32 aiLevel=3; //智能云屏蔽级别 - bool blocktop=4; //屏蔽类型-顶部 - bool blockscroll=5; //屏蔽类型-滚动 - bool blockbottom=6; //屏蔽类型-底部 - bool blockcolor=7; //屏蔽类型-彩色 - bool blockspecial=8; //屏蔽类型-特殊 - bool preventshade=9; //防挡弹幕(底部15%) - bool dmask=10; //智能防挡弹幕(人像蒙版) - float opacity=11; //弹幕不透明度 - int32 dmarea=12; //弹幕显示区域 - float speedplus=13; //弹幕速度 - float fontsize=14; //字体大小 - bool screensync=15; //跟随屏幕缩放比例 - bool speedsync=16; //根据播放倍速调整速度 - string fontfamily=17; //字体类型? - bool bold=18; //粗体? - int32 fontborder=19; //描边类型 - string drawType=20; //渲染类型? -} - -message DmWebViewReply { - int32 state = 1; //弹幕开放状态 - string text = 2; // - string textSide = 3; // - DmSegConfig dmSge = 4; //分段弹幕包信息? - DanmakuFlagConfig flag = 5; // - repeated string specialDms = 6; //BAS(代码)弹幕专包url - bool checkBox = 7; // - int64 count = 8; //实际弹幕总数 - repeated CommandDm commandDms = 9; //互动弹幕条目 - DanmuWebPlayerConfig dmSetting = 10; //弹幕个人配置 -} -``` - -**示例:** - -获取视频`av797164471(cid=236871317)`的弹幕元数据 - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/web/view' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=236871317' \ ---data-urlencode 'pid=797164471' \ --b 'SESSDATA=xxx' \ --o 'danmaku_view.bin' -``` - -响应正文为protubuf二进制数据 - -## 实例 - -### 获取互动弹幕 - -获取并显示视频`av797164471(cid=236871317)`的所有互动弹幕 - -```python -import web_dmview_pb2 -import requests - -AVID = 797164471 -CID = 236871317 -url = f'https://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}' - -data = requests.get(url) -target = web_dmview_pb2.DmWebViewReply() -target.ParseFromString(data.content) - -print(f'互动弹幕数={len(target.commandDms)}') -for i in target.commandDms: - print(f'''\ ----弹幕ID={i.id} ----视频cid={i.oid} ----发送者mid={i.mid} ----弹幕指令={i.command} ----弹幕文字={i.content} ----弹幕出现时间={i.progress} ----弹幕负载数据={i.extra} ----弹幕ID(字串)={i.idStr}''' -) -``` - -输出为: - -``` -互动弹幕数=1 ----弹幕ID=38469676112019463 ----视频cid=236871317 ----发送者mid=501183549 ----弹幕指令=#UP# ----弹幕文字=这个视频没有恰饭!别紧张! ----弹幕出现时间=157818 ----弹幕负载数据={"icon":"https://i1.hdslb.com/bfs/face/559abe31f561f71f3106d8ee7b2065cac50c1235.jpg"} ----弹幕ID(字串)=38469676112019463 -``` - -### 获取BAS(代码)弹幕专包 - -BAS弹幕(`pool=2` `mode=9`)只能从此包获取,代码弹幕(`pool=2` `mode=8`)也能从此包获取 - -获取并显示视频`av2(cid=62131)`的所有BAS(代码)弹幕专包 - -```python -import web_dmview_pb2 -import requests - -AVID = 2 -CID = 62131 -url = f'https://api.bilibili.com/x/v2/dm/web/view?type=1&oid={CID}&pid={AVID}' - -data = requests.get(url) -target = web_dmview_pb2.DmWebViewReply() -target.ParseFromString(data.content) - -print(f'特殊弹幕包数={len(target.specialDms)}') -for i in target.specialDms: - print(f'特殊弹幕包url={i}') -``` - -输出为: - -``` -特殊弹幕包数=1 -特殊弹幕包url=https://i0.hdslb.com/bfs/dm/b0d5f08c12be59292aa0d4e09b6dd8e54c2ba886.bin -``` - -使用[普通分段包弹幕](danmaku_proto.md#获取实时弹幕)的proto结构体反序列化此bin数据 diff --git a/docs/danmaku/danmaku_xml.md b/docs/danmaku/danmaku_xml.md deleted file mode 100644 index a5ea9ca..0000000 --- a/docs/danmaku/danmaku_xml.md +++ /dev/null @@ -1,145 +0,0 @@ -# xml弹幕 - -实时弹幕池容量有限(根据视频类型500-8000条不等),占满后再发送会使实时弹幕池底部的弹幕压入历史弹幕池(类似于堆栈) - -## 获取实时弹幕1 - -> https://api.bilibili.com/x/v1/dm/list.so - -*请求方式:GET* - -**使用deflate压缩,注意解码** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------- | ------ | ---- | -| oid | num | 视频cid | 必要 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/v1/dm/list.so' \ ---data-urlencode 'oid=144541892' \ ---compressed -o 'danmaku.xml' -``` - -## 获取实时弹幕2 - -> https://comment.bilibili.com/{cid}.xml - -*请求方式:GET* - -效果与前者相同 - -**使用deflate压缩,注意解码** - -**url路径:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------- | ------ | ---- | -| cid | num | 视频cid | 必要 | | - -**示例:** - -```shell -curl 'https://comment.bilibili.com/144541892.xml' ---compressed -o 'danmaku.xml' -``` - -**xml回复:** - -<details> -<summary>查看响应示例:</summary> - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<i> - <chatserver>chat.bilibili.com</chatserver> - <chatid>144541892</chatid> - <mission>0</mission> - <maxlimit>1500</maxlimit> - <state>0</state> - <real_name>0</real_name> - <source>e-r</source> - <d p="490.19100,1,25,16777215,1584268892,0,a16fe0dd,29950852386521095">从结尾回来看这里,更感动了!</d> - <d p="18.77300,1,25,16777215,1584268920,0,4fe08d3,29950867226492933">咦三体居然还有动画</d> - <d p="52.88400,1,25,16777215,1584268954,0,4fe08d3,29950885214289927">哈哈哈哈开心</d> - <d p="25.51600,1,25,16777215,1584268957,0,e4b18b37,29950886612566021">红岸么</d> - <d p="144.45200,1,25,16777215,1584269076,0,e4b18b37,29950948716576775">我就是想看我的世界里水滴长啥样</d> - <d p="112.64100,1,25,16777215,1584269109,0,96606007,29950966302244871">有手指?</d> - <d p="222.84000,1,25,16777215,1584269154,0,e4b18b37,29950989809745923">侦测到在途的聚变打击</d> - <d p="284.77800,1,25,16777215,1584269216,0,e4b18b37,29951022237483011">都是虫子</d> - <d p="398.00500,1,25,16777215,1584269329,0,e4b18b37,29951081615196163">ocean</d> - <d p="432.17900,1,25,16777215,1584269363,0,e4b18b37,29951099571535943">村民,哼~</d> - <d p="467.41900,1,25,16777215,1584269399,0,e4b18b37,29951118364639237">黄河之水天上来</d> - <d p="6.71900,1,25,16777215,1584269422,0,70ba16f4,29951130398621699">镇站之宝</d> - <d p="313.08600,1,25,16777215,1584269425,0,e531c9dc,29951131798994947">这水</d> - <d p="587.87900,1,25,16777215,1584269519,0,e4b18b37,29951181142360071">海的那边是什么</d> - <d p="618.05000,1,25,16777215,1584269549,0,e4b18b37,29951196901933061">折跃门准备完毕</d> - ………… -<i> -``` - -</details> - -## 弹幕格式 - -### xml格式结构 - -- 标签 i - - - 标签 chatserver:chat.bilibili.com - - 标签 chatid:视频cid - - 标签 mission:0 - - 标签 maxlimit:实时弹幕池最大容量 - - 标签 state:弹幕状态(0:正常 1:弹幕已关闭) - - 标签 real_name:0 - - 标签 source:e-r - - - 标签 d (带有属性 p):弹幕内容 - -### 属性 p - -字符串内每项用逗号`,`分隔 - -| 项 | 含义 | 类型 | 备注 | -| ---- | ------------------ | ------ | ------------------------------------------------------------ | -| 0 | 视频内弹幕出现时间 | float | 秒 | -| 1 | 弹幕类型 | int32 | 1 2 3:普通弹幕<br />4:底部弹幕<br />5:顶部弹幕<br />6:逆向弹幕<br />7:高级弹幕<br />8:代码弹幕<br />9:BAS弹幕(`pool`必须为2) | -| 2 | 弹幕字号 | int32 | 18:小<br />25:标准<br />36:大 | -| 3 | 弹幕颜色 | int32 | 十进制RGB888值 | -| 4 | 弹幕发送时间 | int32 | 时间戳 | -| 5 | 弹幕池类型 | int32 | 0: 普通池<br />1: 字幕池<br />2: 特殊池 (代码/BAS弹幕)<br />3: 互动池?| -| 6 | 发送者mid的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户id | -| 7 | 弹幕dmid | int64 | 唯一 可用于操作参数 | -| 8 | 弹幕的屏蔽等级 | int32 | 0-10,低于用户设定等级的弹幕将被屏蔽<br />(新增,下方样例未包含) | - -```xml -<d p="490.19100,1,25,16777215,1584268892,0,a16fe0dd,29950852386521095">从结尾回来看这里,更感动了!</d> -``` - -弹幕内容为:“从结尾回来看这里,更感动了!” - -参数为:视频内出现的时间是490.19100秒,类型是普通弹幕,字号为标准,颜色为白色(#FFFFFF),发送时间是2020/3/15 18:41:32......... - -### web版标准颜色 - -弹幕的颜色属性使用**十进制RGB888**值 - -| 颜色 | HEX(RGB888) | DEC(RGB888) | -| -------------------------------------- | ----------------------------------------- | ------------------------------------------- | -| <font v-pre color="#FE0302">红色</font> | <font v-pre color="#FE0302">FE0302</font> | <font v-pre color="#FE0302">16646914‬</font> | -| <font v-pre color="#FF7204">橘红</font> | <font v-pre color="#FF7204">FF7204</font> | <font v-pre color="#FF7204">16740868</font> | -| <font v-pre color="#FFAA02">橘黄</font> | <font v-pre color="#FFAA02">FFAA02</font> | <font v-pre color="#FFAA02">16755202</font> | -| <font v-pre color="#FFD302">淡黄</font> | <font v-pre color="#FFD302">FFD302</font> | <font v-pre color="#FFD302">16765698</font> | -| <font v-pre color="#FFFF00">黄色</font> | <font v-pre color="#FFFF00">FFFF00</font> | <font v-pre color="#FFFF00">16776960</font> | -| <font v-pre color="#A0EE00">草绿</font> | <font v-pre color="#A0EE00">A0EE00</font> | <font v-pre color="#A0EE00">10546688</font> | -| <font v-pre color="#00CD00">绿色</font> | <font v-pre color="#00CD00">00CD00</font> | <font v-pre color="#00CD00">52480</font> | -| <font v-pre color="#019899">墨绿</font> | <font v-pre color="#019899">019899</font> | <font v-pre color="#019899">104601</font> | -| <font v-pre color="#4266BE">紫色</font> | <font v-pre color="#4266BE">4266BE</font> | <font v-pre color="#4266BE">4351678</font> | -| <font v-pre color="#89D5FF">青色</font> | <font v-pre color="#89D5FF">89D5FF</font> | <font v-pre color="#89D5FF">9022215</font> | -| <font v-pre color="#CC0273">品红</font> | <font v-pre color="#CC0273">CC0273</font> | <font v-pre color="#CC0273">13369971</font> | -| <font v-pre color="#222222">黑色</font> | <font v-pre color="#222222">222222</font> | <font v-pre color="#222222">2236962</font> | -| <font v-pre color="#9B9B9B">灰色</font> | <font v-pre color="#9B9B9B">9B9B9B</font> | <font v-pre color="#9B9B9B">10197915</font> | -| <font v-pre color="#FFFFFF">白色</font> | <font v-pre color="#FFFFFF">FFFFFF</font> | <font v-pre color="#FFFFFF">16777215</font> | diff --git a/docs/danmaku/history.md b/docs/danmaku/history.md deleted file mode 100644 index a20f15a..0000000 --- a/docs/danmaku/history.md +++ /dev/null @@ -1,240 +0,0 @@ -# 历史弹幕 - -**注:历史弹幕的xml接口已经失效,现已改为protobuf接口** - -## 查询历史弹幕日期 - -> https://api.bilibili.com/x/v2/dm/history/index - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**注:查询历史弹幕需要登录** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ------- | -| type | num | 1 | 必要 | | -| oid | num | 视频cid | 必要 | | -| month | str | 查询目标年月 | 必要 | YYYY-MM | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有弹幕:array<br />无弹幕:null | 日期列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---------- | -| 0 | str | 存在弹幕的日期1 | YYYY-MM-DD | -| n | str | 存在弹幕的日期(n+1) | YYYY-MM-DD | -| …… | str | …… | …… | - -**示例:** - -查询了cid为144541892的视频位于2020年1月中有历史弹幕记录的日期 - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=144541892' \ ---data-urlencode 'month=2020-01' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - "2020-01-21", - "2020-01-22", - "2020-01-23", - "2020-01-24", - "2020-01-25", - "2020-01-26", - "2020-01-27", - "2020-01-28", - "2020-01-29", - "2020-01-30", - "2020-01-31" - ] -} -``` - -</details> - -返回结果的 `data` 项说明这些日期有弹幕发送。若查询的月份中视频无弹幕,则 `data` 项为 `null` - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/history/index' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=144541892' \ ---data-urlencode 'month=2019-12' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": null -} -``` - -</details> - -## 获取历史弹幕protobuf接口 - -> https://api.bilibili.com/x/v2/dm/web/history/seg.so - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ----------- | -| type | num | 弹幕类 | 必要 | 1:视频弹幕 | -| oid | num | 视频cid | 必要 | | -| date | str | 弹幕日期 | 必要 | YYYY-MM-DD | - -**proto回复:** - -porto定义见:[bilibili.community.service.dm.v1.DmSegMobileReply](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/grpc_api/bilibili/community/service/dm/v1/dm.proto) - -详细说明见[protobuf弹幕](danmaku_proto.md) - -获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕 - -**注:proto定义需要编译** - -```python -import requests -import google.protobuf.text_format as text_format -import bilibili.community.service.dm.v1_pb2 as Danmaku - -url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so' -params = { - 'type':1, #弹幕类型 - 'oid':144541892, #cid - 'date':'2020-01-21' #弹幕日期 -} -cookies = { - 'SESSDATA':'xxx' -} -resp = requests.get(url,params,cookies=cookies) -data = resp.content - -danmaku_seg = Danmaku.DmSegMobileReply() -danmaku_seg.ParseFromString(data) - -print(text_format.MessageToString(danmaku_seg.elems[0],as_utf8=True)) -``` - -输出: - -``` -id: 27532611677585408 -progress: 300507 -mode: 1 -fontsize: 25 -color: 16777215 -midHash: "2a28d4a6" -content: "章北海的老爹" -ctime: 1579621359 -idStr: "27532611677585408" -``` - -## 获取历史弹幕xml接口 - -<details> -<summary>查看折叠内容:</summary> - -> https://api.bilibili.com/x/v2/dm/history - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**注:查询历史弹幕需要登录** - -结果为[标准xml格式弹幕](danmaku_xml.md#弹幕格式) - -**使用deflate压缩,注意解码** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---------- | -| type | num | 1 | 必要 | | -| oid | num | 视频cid | 必要 | | -| date | str | 弹幕日期 | 必要 | YYYY-MM-DD | - -**示例:** - -获取视频`av84271171(cid=144541892)`2020-01-21的历史弹幕 - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/history' \ ---data-urlencode 'type=1' \ ---data-urlencode 'oid=144541892' \ ---data-urlencode 'date=2020-01-21' \ --b 'SESSDATA=xxx' \ ---compressed -o 'danmaku.xml' -``` - -<details> -<summary>查看响应示例:</summary> - -```xml -<?xml version="1.0" encoding="UTF-8"?> -<i> - <chatserver>chat.bilibili.com</chatserver> - <chatid>144541892</chatid> - <mission>0</mission> - <maxlimit>1500</maxlimit> - <state>0</state> - <real_name>0</real_name> - <d p="473.43400,1,25,15138834,1579622380,0,ec16f2d,27532609919123456">敬礼</d> - <d p="3.10200,1,25,16777215,1579622362,0,a2bd7474,27532609920696320">悄默声的更新啊怎么</d> - <d p="17.52300,1,25,16777215,1579622357,0,972c932b,27532609906016258">久等了</d> - <d p="40.81800,1,25,16777215,1579622343,0,bbca6701,27532609906540546">不都是乱纪元才浸泡</d> - <d p="243.39800,1,25,15138834,1579622336,0,77b00ed9,27532609924890624">已阅,狗屁不通。大字报在地上搞搞就行,别弄到天上去</d> - <d p="559.80000,1,25,16777215,1579622334,0,9affc7f5,27532609909686274">CSSC。。。</d> - <d p="398.29700,1,25,16777215,1579622331,0,18d4707,27532609926463488">看到了个寂寞</d> - <d p="34.81000,1,25,38979,1579622327,0,319d7700,27532609926987776">有耳朵了!</d> - <d p="18.65700,1,25,16777215,1579622321,0,bbca6701,27532609912307714">雪天不用浸泡吧</d> - <d p="305.99800,1,25,16777215,1579622316,0,878c315b,27532609928560640">未来史学派</d> - <d p="7.86200,1,25,16777215,1579622309,0,c5136613,27532609913880578">浸泡!!!!!!!</d> - <d p="368.95600,1,25,16777215,1579622302,0,18d4707,27532609914404866">章召忠</d> - <d p="25.19800,1,25,16777215,1579622286,0,4dab6898,27532609931706368">mi24av</d> - <d p="41.10100,1,25,16777215,1579622274,0,33d31036,27532609932230656">泪奔</d> - <d p="627.69800,1,25,16777215,1579622264,0,d79a826a,27532609933279232">组建太空军</d> - <d p="310.58900,1,25,16777215,1579622243,0,18d4707,27532609918074882">是未来史学派?</d> - <d p="723.34800,1,25,16777215,1579622239,0,844fa9e7,27532609919123458">刘培强还行</d> - ………… -<i> -``` - -</details> - -</details> diff --git a/docs/danmaku/snapshot.md b/docs/danmaku/snapshot.md deleted file mode 100644 index 69f098b..0000000 --- a/docs/danmaku/snapshot.md +++ /dev/null @@ -1,88 +0,0 @@ -# 弹幕快照 - -## 获取弹幕快照 - -> https://api.bilibili.com/x/v2/dm/ajax - -*请求方式:GET* - -最近产生的几条弹幕内容,**最多20条** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | -------- | ------------------ | ------ | ---- | -| aid | num或str | 稿件avid或稿件bvid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | --------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 预览列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | -------- | -| 0 | str | 预览内容1 | | -| n | str | 预览内容(n+1) | | -| …… | str | …… | …… | -| 19 | str | 预览内容20 | 最后一条 | - -**示例:** - -获取视频`av43337021`/`BV1rb411m7gE`的弹幕快照,总计20条 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \ ---data-urlencode 'aid=43337021' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/v2/dm/ajax' \ ---data-urlencode 'aid=BV1rb411m7gE' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - "漫画比动漫好看而且血腥", - "666", - "金木小天使", - "太喜欢了", - "每天一遍防止抑郁", - "我还记得土豆那时候还有的看", - "把在给我摸摸~", - "突然泪目", - "感谢野生字幕君", - "993-7", - "刚刚出的时候小学看,现在高二了", - "原版op有这么长吗?搞笑,肯定做了剪辑,op会给你放全歌?", - "让你看个op 3 : 5 4 秒?", - "说原版不原版的都是弱智", - "樱花", - "请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,请打开洗脑循环食用,", - "再来亿遍", - "错的不是我,而是这个世界。", - "吃货的第一季的最后一季足以让他封神!", - "+" - ] -} -``` - -</details> diff --git a/docs/danmaku/thumbup.md b/docs/danmaku/thumbup.md deleted file mode 100644 index 0d59ff9..0000000 --- a/docs/danmaku/thumbup.md +++ /dev/null @@ -1,104 +0,0 @@ -# 弹幕点赞查询 - -## 查询指定dmid的点赞数 - -> https://api.bilibili.com/x/v2/dm/thumbup/stats - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------------- | ------ | --------------------- | -| oid | num | 视频 cid | 必要 | | -| ids | nums | 欲查询的弹幕 dmid | 必要 | 多个 id 之间用`,`分隔 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------------------------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 弹幕 id 与之对应数据的 Map | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------------------- | ---- | -| {弹幕 dmid} | obj | {弹幕 dmid} 对应的点赞信息 | | - -`{弹幕 dmid}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ---------------------- | ------------------------------------------------------- | -| likes | num | 对应弹幕所获得的点赞数 | | -| user_like | num | 当前用户是否点赞 | 0:未点赞<br />1:已点赞<br />需要登录(Cookie 或 APP) | -| id_str | str | 弹幕 dmid 字符串形式 | | -| show_threshold | num | (?) | | -| reply_count | num | (?) | | -| gray_release_control | obj | (?) | | - -`gray_release_control`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------ | ---- | -| show_dm_reply | bool | (?) | | - -**示例:** - -获取视频 BV1AP411d7Qa 1P(cid=1131648710)下的几个弹幕 dmid`1318231376180646144,1318231518484950784,1318231736680887808` - -```bash -curl -G 'https://api.bilibili.com/x/v2/dm/thumbup/stats' \ - --data-urlencode 'oid=1131648710' \ - --data-urlencode 'ids=1318231376180646144,1318231518484950784,1318231736680887808' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "1318231376180646144": { - "likes": 0, - "user_like": 0, - "id_str": "1318231376180646144", - "show_threshold": 10, - "reply_count": 0, - "gray_release_control": { - "show_dm_reply": false - } - }, - "1318231518484950784": { - "likes": 0, - "user_like": 0, - "id_str": "1318231518484950784", - "show_threshold": 10, - "reply_count": 0, - "gray_release_control": { - "show_dm_reply": false - } - }, - "1318231736680887808": { - "likes": 0, - "user_like": 0, - "id_str": "1318231736680887808", - "show_threshold": 10, - "reply_count": 0, - "gray_release_control": { - "show_dm_reply": false - } - } - } -} -``` - -</details> diff --git a/docs/danmaku/webmask.md b/docs/danmaku/webmask.md deleted file mode 100644 index ab0fff8..0000000 --- a/docs/danmaku/webmask.md +++ /dev/null @@ -1,80 +0,0 @@ -# 智能防挡弹幕 - -B 站部分视频提供“智能防挡弹幕”功能,其原理是提供了一个 webmask 二进制文件,其中保存了视频中各个位置的 svg 格式蒙版。 - -首先需要获取 webmask 资源的地址。 - -## 获取 webmask 资源地址 - -通过 [web 播放器资源接口](../video/player.md) 获取 webmask 二进制文件的地址。 - - -## webmask 资源 - -获取的 url 没有权鉴,不需要后面的参数也可以获取。 - -示例: - -```shell -curl -G https://upos-sz-staticcos-cmask.bilivideo.com/cmaskboss/825851971_30_0.webmask >> 825851971_30_0.webmask -``` - -下载后是二进制文件。 - - -## webmask 二进制读取 - -参考:[andrewvy/webmask-renderer](https://github.com/andrewvy/webmask-renderer) - -name | offset | length | type | desc ---- | ------ | ------ | ---- | ---- -mask | 0 | 4 | char | 'MASK' 文件头 -version| 4 | 4 | int | 是1 -vU | 8 | 4 | ? | 不知道是干什么的 -Ly | 12 | 4 | int | 后续数据的段数 -time_1 | 16 | 8 | long | 第一段对应视频开始时间 -offset_1 | 24 | 8 | long | 第一段蒙版信息开始处对应二进制偏移 -...|...|...|...|... -time_{Ly} |16+(Ly-1)*16| 8 | long | 第 `Ly` 段对应视频开始时间 -offset_{Ly} |24+(Ly-1)*16| 8 | long | 第 `Ly` 段蒙版信息开始处对应二进制偏移 -segments_1| 由前面offset_1提供 | 由 `offset_2-offset_1` 计算得到 | binary | 蒙版信息块,使用 gzip 压缩 -...|...|...|...|... - - -蒙版信息块是经过 gzip 压缩文本得到的二进制。解压缩后得到一个字节串。 - -前 16 字节是两个 long,记为 `left` 和 `right`,暂时不清楚其作用。`left` 似乎和平均每张蒙版的时间有关。`right` 总是 `i*10000`,`i` 是从 0 开始数的数据段次序。 - -后面是各个 svg 文本直接拼起来,可以直接通过 svg 格式头 `data:image/svg+xml;base64,` 分开。 - - -Python 示例: -```python -from struct import unpack -import gzip - -f = open('你的 webmask', 'rb') -buf = f.read() -_Ly = buf[12:16] -Ly = unpack('>i', _Ly)[0] # 大端序 int - -times = [] -offsets = [] -for idx in range(Ly): - op = 16 + idx * 16 # 个人习惯,我算偏移时喜欢用 `op` 和 `ed` 作为开始和结束的名字。 - time = unpack('>q', buf[op: op+8])[0] - offset = unpack('>q', buf[op+8: op+16])[0] - times.append(time) - offsets.append(offset) - -frames = [] -for idx in range(Ly): - op = offsets[idx] - if idx == Ly - 1: ed = len(buf) - else: ed = offsets[idx+1] - ba = buf[op: ed] - bad = gzip.decompress(ba) - badl = bad.split(b'data:image/svg+xml;base64,') - # badl[0]是16字节,`left` 和 `right` - frames.append(badl[1: ]) -``` diff --git a/docs/dynamic/action.md b/docs/dynamic/action.md deleted file mode 100644 index aa55d2b..0000000 --- a/docs/dynamic/action.md +++ /dev/null @@ -1,351 +0,0 @@ -# 动态操作 - -## 点赞动态 - -> https://api.bilibili.com/x/dynamic/feed/dyn/thumb - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------ | ------ | ------ | ---- | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ------ | -------- | ------ | ---- | -| dyn_id_str | string | 动态 id | 必要 | | -| up | number | 点赞状态 | 必要 | 0: 切换<br />1: 点赞<br />2: 取消点赞 | -| spmid | string | `333.1369.0.0` | 不必要 | | -| from_spmid | string | `333.999.0.0` | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-101: 账号未登录<br />-111: csrf 校验失败<br />4100001: 参数错误 | -| message | string | 错误消息 | 成功时为 `0` | -| ttl | number | `1` | | -| data | object | 空对象 | | - -**示例:** - -点赞动态 `1057955152016703512` - -```shell -curl -X POST 'https://api.bilibili.com/x/dynamic/feed/dyn/thumb' \ - --url-query 'csrf=xxx' \ - -b 'SESSDATA=xxxxx' \ - -H 'content-type: application/json' \ - --data-raw '{"dyn_id_str":"1057955152016703512","up":1}' -``` -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 点赞动态 (旧版) - -> https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/thumb - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -**正文参数 (application/x-www-form-urlencoded):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ------ | -------- | ------ | ---- | -| dynamic_id | string | 动态 id | 必要 | | -| up | number | 点赞状态 | 必要 | 0: 切换<br />1: 点赞<br />2: 取消点赞 | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-101: 账号未登录<br />-111: csrf 校验失败<br />4100001: 参数错误 | -| message | string | 错误消息 | 成功时为 `0` | -| ttl | number | `1` | | -| data | object | 空对象 | | - -**示例:** - -点赞动态 `1060771233257226247` - -```shell -curl -X POST 'https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/thumb' \ --data-urlencode 'csrf=xxxxxx' \ - --data-urlencode 'dynamic_id=1060771233257226247' \ - --data-urlencode 'up=1' \ - -b 'SESSDATA=xxx' -``` -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 删除动态 - -参见 [创作中心 -> 图文操作 -> 删除动态](../creativecenter/opus.md#删除动态) - -## 删除动态 (旧版) - -> <https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------ | ------ | ---- | -| dynamic_id | num | 动态id | 必要 | | -| csrf_token | str | csrf | 必要 | | -| csrf | str | csrf | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />500404:已经删除过该动态<br />500406:动态不是自己的 | -| msg | str | 错误信息 | 成功时为空文本 | -| message | str | 错误信息 | 同`msg` | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---- | ---------------- | -| \_gt\_ | num | 0 | **作用尚不明确** | - -**示例:** - -删除动态`dynamic_id=588320531406678918` - -```shell -curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/rm_dynamic' \ - --data-urlencode 'dynamic_id=588320531406678918' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "_gt_": 0 - } -} -``` - -</details> - -## 删除定时发布动态 - -> <https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------ | ---- | -| draft_id | num | 定时发布动态id | 必要 | | -| csrf_token | str | csrf | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------ | -| code | num | 返回值 | 0:成功<br />4120015:系统异常 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 数据本体 | 空对象,即`{}` | - -**示例:** - -删除定时发布动态`draft_id=755409289278914611` - -```shell -curl 'https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/rm_draft' \ - --data-urlencode 'draft_id=755409289278914611' \ - --data-urlencode 'csrf=xxxx' - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 设置置顶动态 - -> https://api.bilibili.com/x/dynamic/feed/space/set_top - -**请求方法: POST** - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie 中 `buvid3` 不为空 - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------ | ------ | ------ | ---- | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ------ | -------- | ------ | ---- | -| dyn_str | string | 动态 id | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-101: 账号未登录<br />-111: csrf 校验失败<br />4100001: 参数错误 | -| message | string | 错误消息 | 成功时为 `0` | -| ttl | number | `1` | | -| data | object | 空对象 | | - -**示例:** - - -置顶动态 `1063487284684259332` - -```shell -curl -X POST 'https://api.bilibili.com/x/dynamic/feed/space/set_top' \ - --url-query 'csrf=xxx' \ - -b 'SESSDATA=xxxxx; buvid3=aaa' \ - -H 'content-type: application/json' \ - --data-raw '{"dyn_str":"1063487284684259332"}' -``` -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 取消置顶动态 - -> https://api.bilibili.com/x/dynamic/feed/space/rm_top - -**请求方法: POST** - -认证方式: Cookie (SESSDATA) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------ | ------ | ------ | ---- | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ------ | -------- | ------ | ---- | -| dyn_str | string | 动态 id | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />-101: 账号未登录<br />-111: csrf 校验失败<br />4100001: 参数错误 | -| message | string | 错误消息 | 成功时为 `0` | -| ttl | number | `1` | | -| data | object | 空对象 | | - -**示例:** - - -取消置顶动态 `1063487284684259332` - -```shell -curl -X POST 'https://api.bilibili.com/x/dynamic/feed/space/rm_top' \ - --url-query 'csrf=xxx' \ - -b 'SESSDATA=xxxxx' \ - -H 'content-type: application/json' \ - --data-raw '{"dyn_str":"1063487284684259332"}' -``` -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> diff --git a/docs/dynamic/all.md b/docs/dynamic/all.md deleted file mode 100644 index 8c69ddf..0000000 --- a/docs/dynamic/all.md +++ /dev/null @@ -1,7770 +0,0 @@ -# 获取动态列表 - -## 获取全部动态列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 必要性 | 内容 | 备注 | -| --- | --- | --- | --- | --- | -| timezone_offset | str | 非必要 | `-480` | 新版无 | -| type | str | 非必要 | 分类 | 新版无, `all`:全部(默认)<br/>`video`:视频投稿<br/>`pgc`:追番追剧<br/>`article`:专栏 | -| host_mid | num | 非必要 | UP主UID | 仅新版, 如 `293793435` | -| offset | num | 非必要 | 分页偏移量 | 默认为空, 翻页时使用 | -| update_baseline | str | 非必要 | 更新基线 | 获取新动态时使用 | -| page | num | 非必要 | 页数 | 无效参数 | -| platform | str | 非必要 | 平台 | 仅新版, 如 `web` | -| features | str | 非必要 | 功能开关? | 旧版 `itemOpusStyle,listOnlyfans`<br />新版 `itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,decorationCard,onlyfansAssetsV2,forwardListHidden,ugcDelete` | -| web_location | str | 非必要 | 333.1365 | 仅新版存在 | - -**JSON回复:** - -根: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 响应码 | 0:成功<br/>-101:账号未登录 | -| message | str | | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| has_more | bool | 是否有更多数据 | | -| items | array | 数据数组 | | -| offset | str | 偏移量 | 等于`items`中最后一条记录的id<br/>获取下一页时使用 | -| update_baseline | str | 更新基线 | 等于`items`中第一条记录的id | -| update_num | num | 本次获取获取到了多少条新动态 | 在更新基线以上的动态条数 | - -`data.items[n]`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| basic | obj | | | -| id_str | str | 动态id | | -| modules | obj | 动态信息 | | -| type | str | 动态类型 | [动态类型](./dynamic_enum.md#动态类型) | -| visible | bool | 是否显示 | `true`:正常显示<br/>`false`:折叠动态 | -| orig | obj | 原动态信息 | 仅动态类型为`DYNAMIC_TYPE_FORWARD`的情况下存在 | - -`data.items[n].basic`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| comment_id_str | str | 见 [动态类型](./dynamic_enum.md#动态类型) | -| comment_type | num | | 见 [动态类型](./dynamic_enum.md#动态类型) | -| like_icon | obj | | 见下 | -| rid_str | str | | 见 [动态类型](./dynamic_enum.md#动态类型) | - -`data.items[n].basic.like_icon`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| action_url | str | `空串` | | -| end_url | str | `空串` | | -| id | num | `0` | | -| start_url | str | `空串` | | - -`data.items[n].modules`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| module_author | obj | UP主信息 | 参见 [MODULE_TYPE_AUTHOR](../opus/features.md#module-type-author) 中的 `module_author` 对象 | -| module_dynamic | obj | 动态内容信息 | | -| module_more | obj | 动态右上角三点菜单 | 参见 [module_more](../opus/features.md#module-more) 中的 `module_more` 对象 | -| module_stat | obj | 动态统计数据 | 参见 [MODULE_TYPE_STAT](../opus/features.md#module-type-stat) 中的 `module_stat` 对象 | -| module_interaction | obj | 热度评论 | | -| module_fold | obj | 动态折叠信息 | | -| module_dispute | obj | 争议小黄条 | | -| module_tag | obj | 置顶信息 | | - -`data.items[n].modules.module_dynamic`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| additional | obj | 相关内容卡片信息 | | -| desc | obj | 动态文字内容 |其他动态时为null | -| major | obj | 动态主体对象 |转发动态时为null | -| topic | obj | 话题信息 | 无时为 null, 参见 [MODULE_TYPE_TOPIC](../opus/features.md#module-type-topic) | - -`data.items[n].modules.module_dynamic.additional`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| common | obj | 一般类型 | `ADDITIONAL_TYPE_COMMON`类型独有 | -| type | str | 卡片类型 | [相关内容卡片类型](./dynamic_enum.md#相关内容卡片类型) | -| reserve | obj | 预约信息 | `ADDITIONAL_TYPE_RESERVE`类型独有 | -| goods | obj | 商品内容 | `ADDITIONAL_TYPE_GOODS`类型独有 | -| vote | obj | 投票信息 | `ADDITIONAL_TYPE_VOTE`类型独有 | -| ugc | obj | 视频信息 | `ADDITIONAL_TYPE_UGC`类型独有 | -| match | object | 比赛信息? | `ADDITIONAL_TYPE_MATCH`类型独有, 参见 [MODULE_TYPE_CONTENT](../opus/features.md#module-type-content) 的 `module_content.paragraphs[].link_card.match` | -| upower_lottery | object | 充电专属抽奖信息 | `ADDITIONAL_TYPE_UPOWER_LOTTERY`类型独有, 参见 [MODULE_TYPE_CONTENT](../opus/features.md#module-type-content) 的 `module_content.paragraphs[].link_card.upower_lottery` | - -`data.items[n].modules.module_dynamic.additional.common`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| button | obj | 按钮内容 | | -| cover | str | 左侧封面图 | | -| desc1 | str | 描述1 | | -| desc2 | str | 描述2 | | -| head_text | str | 卡片头文本 | | -| id_str | str | 相关id | | -| jump_url | str | 跳转URL | | -| style | num | `1` | | -| sub_type | str | 子类型 | `game`<br/>`decoration`<br/>`ogv` | -| title | str | 卡片标题 | | - -`data.items[n].modules.module_dynamic.additional.common.button`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| jump_style | obj | 跳转类型 | `game`和`decoration`类型特有 | -| jump_url | str | 跳转URL | | -| type | num | | 1:`game`和`decoration`类型<br/>2:`ogv`类型 | -| check | obj | | `ogv`类型特有 | -| status | num | `1` | | -| uncheck | obj | | `ogv`类型特有 | - -`data.items[n].modules.module_dynamic.additional.common.button.jump_style`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | `空串` | | -| text | str | 按钮显示文案 | game:`进入`<br/>decoration:`去看看` | - -`data.items[n].modules.module_dynamic.additional.common.button.check`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | 按钮图片URL | | -| text | str | 按钮显示文案 | `ogv`:已追剧 | - -`data.items[n].modules.module_dynamic.additional.common.button.uncheck`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | 按钮图片URL | | -| text | str | 按钮显示文案 | `ogv`:追剧 | - -`data.items[n].modules.module_dynamic.additional.reserve`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| button | obj | 按钮信息 | | -| desc1 | obj | 预约时间 | | -| desc2 | obj | 预约观看量 | | -| jump_url | str | 跳转URL | | -| reserve_total | num | 预约人数 | | -| rid | num | | | -| state | num | `0` | | -| stype | num | `1` `2` | | -| title | str | 预约标题 | | -| up_mid | num | 预约发起人UID | | -| desc3 | obj | 预约有奖信息 | | - -`data.items[n].modules.module_dynamic.additional.reserve.button`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| check | obj | 已预约状态显示内容 | | -| status | num | 预约状态 | 1:未预约,使用`uncheck`<br/>2:已预约,使用`check` | -| type | num | 类型 | 1:视频预约,使用`jump_style`<br/>2:直播预约,使用`check`和`uncheck` | -| uncheck | obj | 未预约状态显示内容 | | -| jump_style | obj | 跳转按钮 | | -| jump_url | str | 跳转URL | | - -`data.items[n].modules.module_dynamic.additional.reserve.button.check`对象" - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | `空串` | | -| text | str | 按钮显示文案 | `已预约` | - -`data.items[n].modules.module_dynamic.additional.reserve.button.uncheck`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | 显示图标URL | | -| text | str | 按钮显示文案 | | -| toast | str | 预约成功显示提示文案 | | -| disable | num | 是否不可预约 | 1:是 | - -`data.items[n].modules.module_dynamic.additional.reserve.button.jump_style`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon_url | str | `空串` | | -| text | str | 按钮显示文案 | `去观看` | - -`data.items[n].modules.module_dynamic.additional.reserve.desc1`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| style | num | 类型 | 0:`视频预约` `11-05 20:00 直播` `预计今天 17:05发布`<br/>1:`直播中` | -| text | str | 显示文案 | | - -`data.items[n].modules.module_dynamic.additional.reserve.desc2`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| style | num | `0` | | -| text | str | 显示文案 | `2人预约`<br/>`743观看`<br/>`1.0万人看过`<br/>`2151人气` | -| visible | bool | 是否显示 | true:显示文案<br/>false:显示已结束 | - -`data.items[n].modules.module_dynamic.additional.reserve.desc3`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| jump_url | str | 开奖信息跳转URL | | -| style | num | `1` | | -| text | str | 奖品信息显示文案 | | - -`data.items[n].modules.module_dynamic.additional.goods`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| head_icon | str | `空串` | | -| head_text | str | 卡片头显示文案 | | -| items | array | 商品信息列表 | | -| jump_url | str | `空串` | | - -`data.items[n].modules.module_dynamic.additional.goods.items`数组中的: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| brief | str | 商品副标题 | | -| cover | str | 商品封面 | | -| id | str | 商品ID | | -| jump_desc | str | 跳转按钮显示文案 | | -| jump_url | str | 跳转URL | | -| name | str | 商品名称 | | -| price | str | 商品价格 | | - -`data.items[n].modules.module_dynamic.additional.vote`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| choice_cnt | num | `1` | | -| default_share | num | 是否默认勾选`同时分享至动态` | 1:勾选 | -| desc | str | 投票标题 | | -| end_time | num | 剩余时间 | 单位:秒 | -| join_num | num | 已参与人数 | | -| status | num | `1` | | -| type | null | `null` | | -| uid | num | 发起人UID | | -| vote_id | num | 投票ID | | - -`data.items[n].modules.module_dynamic.additional.ugc`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cover | str | 封面 | | -| desc_second | str | 播放量与弹幕数 | | -| duration | str | 视频长度 | | -| head_text | str | `空串` | | -| id_str | str | 视频AV号 | | -| jump_url | str | 视频跳转URL | | -| multi_line | bool | `true` | | -| title | str | 视频标题 | | - -`data.items[n].modules.module_dynamic.desc`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型) | -| text | str | 动态的文字内容 | | - -`data.items[n].modules.module_dynamic.major`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | str | 动态主体类型 | [动态主体类型](./dynamic_enum.md#动态主体类型) | -| ugc_season | obj | 合集信息 | `MAJOR_TYPE_UGC_SEASON` | -| article | obj | 专栏类型 | `MAJOR_TYPE_ARTICLE` | -| draw | obj | 带图动态 | `MAJOR_TYPE_DRAW` | -| archive | obj | 视频信息 | `MAJOR_TYPE_ARCHIVE` | -| live_rcmd | obj | 直播状态 | `MAJOR_TYPE_LIVE_RCMD` | -| common | obj | 一般类型 | `MAJOR_TYPE_COMMON` | -| pgc | obj | 剧集信息 | `MAJOR_TYPE_PGC` | -| courses | obj | 课程信息 | `MAJOR_TYPE_COURSES` | -| music | obj | 音频信息 | `MAJOR_TYPE_MUSIC` | -| opus | obj | 图文动态 | `MAJOR_TYPE_OPUS` | -| live | obj | | | -| none | obj | 动态失效 | `MAJOR_TYPE_NONE` | -| upower_common | obj | 充电相关 | `MAJOR_TYPE_UPOWER_COMMON` | - -`data.items[].modules.module_dynamic.major.upower_common` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| background | object | 背景 | | -| button | object | 按钮 | | -| icon | object | 图标 | | -| jump_url | string | 跳转 URL | | -| rid | string | 关联 id | | -| title | string | 标题 | | -| title_prefix | string | 标题前缀 | | -| type | number | 类型 | | -| up_mid | number | UP 主 mid (UID) | | -| upower_action_state | number | 充电操作状态? | | -| upower_level | number | 充电级别? | | - -`data.items[].modules.module_dynamic.major.upower_common.background` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dark_src | string | 深色背景 | | -| light_src | string | 浅色背景 | | - -`data.items[].modules.module_dynamic.major.upower_common.button` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_style | object | 跳转样式 | | -| jump_url | string | 跳转 URL | | -| type | number | 类型 | | - -`data.items[].modules.module_dynamic.major.upower_common.button.jump_style` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| text | string | 文本 | | - -`data.items[].modules.module_dynamic.major.upower_common.icon` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dark_src | string | 深色图标 URL | | -| light_src | string | 浅色图标 URL | | - -<!-- Generated by json-apidoc-gen @ 2025-07-20T07:08:06.175919645Z --> - -`data.items[n].modules.module_dynamic.major.ugc_season`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| aid | num | 视频AV号 | | -| badge | obj | 角标信息 | | -| cover | str | 视频封面 | | -| desc | str | 视频简介 | | -| disable_preview | num | `0` | | -| duration_text | str | 时长 | | -| jump_url | str | 跳转URL | | -| stat | obj | 统计信息 | | -| title | str | 视频标题 | | - -`data.items[n].modules.module_dynamic.major.ugc_season.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景颜色 | | -| color | str | 字体颜色 | | -| text | str | 角标文案 | | - -`data.items[n].modules.module_dynamic.major.ugc_season.stat`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| danmaku | str | 弹幕数 | | -| play | str | 播放数 | | - -`data.items[n].modules.module_dynamic.major.article`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| covers | array | 封面图数组 | 最多三张 | -| desc | str | 文章摘要 | | -| id | num | 文章CV号 | | -| jump_url | str | 文章跳转地址 | | -| label | str | 文章阅读量 | | -| title | str | 文章标题 | | - -`data.items[n].modules.module_dynamic.major.draw`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 对应相簿id | | -| items | array | 图片信息列表 | | - -`data.items[n].modules.module_dynamic.major.draw.items[o]`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| height | num | 图片高度 | | -| size | num | 图片大小 | 单位KB | -| src | str | 图片URL | | -| tags | array | | | -| width | num | 图片宽度 | | - -`data.items[n].modules.module_dynamic.major.archive`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| aid | str | 视频AV号 | | -| badge | obj | 角标信息 | | -| bvid | str | 视频BVID | | -| cover | str | 视频封面 | | -| desc | str | 视频简介 | | -| disable_preview | num | `0` | | -| duration_text | str | 视频长度 | | -| jump_url | str | 跳转URL | | -| stat | obj | 统计信息 | | -| title | str | 视频标题 | | -| type | num | `1` | | - -`data.items[n].modules.module_dynamic.major.archive.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景颜色 | | -| color | str | 字体颜色 | | -| text | str | 角标文案 | | - -`data.items[n].modules.module_dynamic.major.archive.stat`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| danmaku | str | 弹幕数 | | -| play | str | 播放数 | | - -`data.items[n].modules.module_dynamic.major.live_rcmd`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| content | str | 直播间内容JSON | | -| reserve_type | num | `0` | | - -`data.items[n].modules.module_dynamic.major.common`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| badge | obj | 角标信息 | | -| biz_type | num | `0` | | -| cover | str | 左侧图片封面 | | -| desc | str | 右侧描述信息 | | -| id | str | | | -| jump_url | str | 跳转地址 | | -| label | str | `空串` | | -| sketch_id | str | | | -| style | num | `1` | | -| title | str | 右侧标题 | | - -`data.items[n].modules.module_dynamic.major.common.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景色 | | -| color | str | 前景色 | | -| text | str | 文本 | | - -`data.items[n].modules.module_dynamic.major.pgc`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| badge | obj | 角标信息 | | -| cover | str | 视频封面 | | -| epid | num | 分集EpId | | -| jump_url | str | 跳转URL | | -| season_id | num | 剧集SeasonId | | -| stat | obj | 统计信息 | | -| sub_type | num | 剧集类型 | 1:番剧<br/>2:电影<br/>3:纪录片<br/>4:国创<br/>5:电视剧<br/>6:漫画<br/>7:综艺 | -| title | str | 视频标题 | | -| type | num | `2` | | - -`data.items[n].modules.module_dynamic.major.pgc.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景颜色 | | -| color | str | 字体颜色 | | -| text | str | 角标文案 | | - -`data.items[n].modules.module_dynamic.major.pgc.stat`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| danmaku | str | 弹幕数 | | -| play | str | 播放数 | | - -`data.items[n].modules.module_dynamic.major.courses`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| badge | obj | 角标信息 | | -| cover | str | 封面图URL | | -| desc | str | 更新状态描述 | | -| id | num | 课程id | | -| jump_url | str | 跳转URL | | -| sub_title | str | 课程副标题 | | -| title | str | 课程标题 | | - -`data.items[n].modules.module_dynamic.major.courses.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景颜色 | | -| color | str | 字体颜色 | | -| text | str | 角标文案 | | - -`data.items[n].modules.module_dynamic.major.music`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cover | str | 音频封面 | | -| id | num | 音频AUID | | -| jump_url | str | 跳转URL | | -| label | str | 音频分类 | | -| title | str | 音频标题 | | - -`data.items[n].modules.module_dynamic.major.opus`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| fold_action | array | 展开收起 | | -| jump_url | str | 跳转URL | | -| pics | array | 图片信息 | | -| summary | obj | 动态内容 | | -| title | str | 动态标题 | 没有标题时为null | - -`data.items[n].modules.module_dynamic.major.opus.summary`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| rich_text_nodes | array | 富文本节点列表 | 和`desc`对象中的`rich_text_nodes`数组结构一样 | -| text | str | 评论内容 | | - -`data.items[n].modules.module_dynamic.major.live`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| badge | obj | 角标信息 | | -| cover | str | 直播封面 | | -| desc_first | str | 直播主分区名称 | | -| desc_second | str | 观看人数 | | -| id | num | 直播间id | | -| jump_url | str | 直播间跳转URL | | -| live_state | num | 直播状态 | 0:直播结束<br/>1:正在直播 | -| reserve_type | num | `0` | | -| title | str | 直播间标题 | | - -`data.items[n].modules.module_dynamic.major.live.badge`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| bg_color | str | 背景颜色 | | -| color | str | 字体颜色 | | -| text | str | 角标文案 | | - -`data.items[n].modules.module_dynamic.major.none`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| tips | str | 动态失效显示文案 | deprecated? | - -`data.items[n].modules.module_interaction`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| items | array | 信息列表 | | - -`data.items[n].modules.module_interaction.items`数组中的: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| desc | obj | 点赞/评论信息 | | -| type | num | 类型 | 0:点赞信息<br/>1:评论信息 | - -`data.items[n].modules.module_interaction.items[o].desc`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| rich_text_nodes | array | 富文本节点列表 | [富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型) | -| text | str | 评论内容 | | - -`data.items[n].modules.module_fold`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| ids | array | 被折叠的动态id列表 | | -| statement | str | 显示文案 | 例:展开x条相关动态 | -| type | num | `1` | | -| users | array | `空数组` | | - -`data.items[n].modules.module_dispute`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| desc | str | | | -| jump_url | str | | | -| title | str | 提醒文案 | 例:视频内含有危险行为,请勿模仿 | - -`data.items[n].modules.module_tag`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| text | str | '置顶' | 置顶动态出现这个对象,否则没有 | - -**示例:** - -```shell -curl -L -X GET 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all?type=all' \ --H 'Cookie: SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "has_more": true, - "items": [ - { - "basic": { - "comment_id_str": "112981396619958", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "112981396619958" - }, - "id_str": "966887968322093078", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/b1c15dd8814d79e648008815517aa5ef50a2fb9c.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "3546730050096047" - }, - "face": "https://i2.hdslb.com/bfs/face/b1c15dd8814d79e648008815517aa5ef50a2fb9c.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/3546730050096047/dynamic", - "label": "", - "mid": 3546730050096047, - "name": "青岛LUCIFER", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "刚刚", - "pub_ts": 1723959548, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "112981396619958", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1oeWNebEv2", - "cover": "http://i2.hdslb.com/bfs/archive/0e3d26d90eb0642d90c7552e63ce690e2fe7f8ce.jpg", - "desc": "给老板娘贴睫毛贴了半天,老登眼皮总动,夹睫毛疼了还骂我,不开心哈哈哈。", - "disable_preview": 0, - "duration_text": "00:16", - "jump_url": "//www.bilibili.com/video/BV1oeWNebEv2/", - "stat": { - "danmaku": "0", - "play": "0" - }, - "title": "老板娘今天是可爱鬼呀!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 0, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "1756441068", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1756441068" - }, - "id_str": "966873782060843027", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/726060100f7b80f3ab17889aa9fb8f380a53b9da.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "266765166" - }, - "face": "https://i0.hdslb.com/bfs/face/726060100f7b80f3ab17889aa9fb8f380a53b9da.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/266765166/dynamic", - "label": "", - "mid": 266765166, - "name": "漫士沉思录", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "55分钟前", - "pub_ts": 1723956245, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "1756441068", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1d4421Z7nW", - "cover": "http://i1.hdslb.com/bfs/archive/df067c178714da9b511f10bde11e1bc75ea676d9.jpg", - "desc": "使用3b1b开发的manim引擎制作", - "disable_preview": 0, - "duration_text": "14:25", - "jump_url": "//www.bilibili.com/video/BV1d4421Z7nW/", - "stat": { - "danmaku": "217", - "play": "1.4万" - }, - "title": "【漫士科普】如何最简单且本质地理解欧拉公式?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 142, - "forbidden": false - }, - "forward": { - "count": 6, - "forbidden": false - }, - "like": { - "count": 1959, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "325833790", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325833790" - }, - "id_str": "966831498138222598", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "233114659" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", - "fan": { - "color": "#903AC2", - "color_format": { - "colors": [ - "#903AC2FF", - "#903AC2FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "000001", - "number": 1 - }, - "id": 1706163888001, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", - "name": "龙腾啾跃-动态卡片粉丝", - "type": 3 - }, - "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/233114659/dynamic", - "label": "", - "mid": 233114659, - "name": "碧蓝航线", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", - "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", - "n_pid": 1987, - "name": "碧蓝航线2020", - "pid": 1987 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "3小时前", - "pub_ts": 1723946400, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1729526400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "common": { - "button": { - "jump_style": { - "icon_url": "", - "text": "进入" - }, - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "type": 1 - }, - "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", - "desc1": "养成", - "desc2": "指挥官,欢迎回港", - "head_text": "相关游戏", - "id_str": "97", - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "style": 1, - "sub_type": "game", - "title": "碧蓝航线" - }, - "type": "ADDITIONAL_TYPE_COMMON" - }, - "desc": { - "rich_text_nodes": [ - { - "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", - "orig_text": "#碧蓝航线#", - "text": "#碧蓝航线#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " ", - "text": " ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF%E6%BC%AB%E5%B1%95", - "orig_text": "#碧蓝航线漫展#", - "text": "#碧蓝航线漫展#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " ", - "text": " ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=2024%E6%B8%AF%E5%8C%BA%E7%9B%9B%E5%A4%8F%E6%B8%85%E5%87%89%E8%8A%82", - "orig_text": "#2024港区盛夏清凉节#", - "text": "#2024港区盛夏清凉节#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", - "text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "#碧蓝航线# #碧蓝航线漫展# #2024港区盛夏清凉节#\n◆ 「港区盛夏清凉节」长沙站·街区快闪 DAY1 现场直击!◆ \n\n城市街巷,专属惊喜,\n绘就绚丽夏日!\n和少女们一同记录这场特别邂逅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。" - }, - "major": { - "draw": { - "id": 325833790, - "items": [ - { - "height": 4000, - "size": 16103.947, - "src": "http://i0.hdslb.com/bfs/new_dyn/31b32e6dcf2f1a6328552f0fa666302d233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 3905, - "size": 16620.71, - "src": "http://i0.hdslb.com/bfs/new_dyn/e507c60207f486824708a5850d07d1bb233114659.jpg", - "tags": [], - "width": 5858 - }, - { - "height": 4000, - "size": 16195.393, - "src": "http://i0.hdslb.com/bfs/new_dyn/7a7ef9513bb32edc3de887d787a4df43233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 4672, - "size": 11758.82, - "src": "http://i0.hdslb.com/bfs/new_dyn/a21461b944e10306e68672df3e92c1b9233114659.jpg", - "tags": [], - "width": 7008 - }, - { - "height": 4672, - "size": 3962.4902, - "src": "http://i0.hdslb.com/bfs/new_dyn/b2c4baa47b4999cabb9c8c338c2da36c233114659.jpg", - "tags": [], - "width": 7008 - }, - { - "height": 4672, - "size": 11276.51, - "src": "http://i0.hdslb.com/bfs/new_dyn/8cf06e142fce875d2c3b83961abbc668233114659.jpg", - "tags": [], - "width": 7008 - }, - { - "height": 3735, - "size": 13969.533, - "src": "http://i0.hdslb.com/bfs/new_dyn/c56cd277f281ba8cc4a395dbe5d9fa54233114659.jpg", - "tags": [], - "width": 5603 - }, - { - "height": 3106, - "size": 12942.339, - "src": "http://i0.hdslb.com/bfs/new_dyn/9049a5c39ebafdd1cb488b26da4f99da233114659.jpg", - "tags": [], - "width": 4659 - }, - { - "height": 3802, - "size": 18643.953, - "src": "http://i0.hdslb.com/bfs/new_dyn/564e469ba092d2381b23547da37ca3c0233114659.jpg", - "tags": [], - "width": 5703 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 151, - "forbidden": false - }, - "forward": { - "count": 31, - "forbidden": false - }, - "like": { - "count": 2827, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "37231101", - "comment_type": 12, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "37231101" - }, - "id_str": "966827503780888593", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "407045223" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", - "name": "2233娘", - "type": 1 - }, - "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/407045223/dynamic", - "label": "", - "mid": 407045223, - "name": "二次元的中科院物理所", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了文章", - "pub_location_text": "", - "pub_time": "3小时前", - "pub_ts": 1723945470, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1745769600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "article": { - "covers": [ - "https://i0.hdslb.com/bfs/article/f59f635a3784c49eb174da7d589c4e75407045223.jpg" - ], - "desc": "西游记中,孙悟空为了保护师傅,在地上画了一个圈,由此便可限制住妖怪。今天小编带大家布置法术场地,只需在上面画出图案,便可控制水滴的行动!实验器材火柴、蜡烛、空易拉罐、所标杯、细竹签实验步骤安全提示:本实验有明火,请小朋友在家长的陪同下完成,或在空旷的地方进行,避免着火,注意安全。第一步:首先布置施法场地,通过蜡烛将易拉罐底部附着满炭黑。注意此步骤中应保持易拉罐内含一定水分,否则会产生烫伤等风险!第二步:向施法场地滴入水滴,观察场地效果。可以看到水滴在场地内不收约束,自由滑行第三步:当用细竹签等在场地中画出", - "id": 37231101, - "jump_url": "//www.bilibili.com/read/cv37231101/", - "label": "12万阅读", - "title": "带你在家里学会孙悟空的“画地为牢” 丨正经玩" - }, - "type": "MAJOR_TYPE_ARTICLE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 9, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 583, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_ARTICLE", - "visible": true - }, - { - "basic": { - "comment_id_str": "1306462278", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1306462278" - }, - "id_str": "966792134707380227", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_animation": { - "webp_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "686127" - }, - "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/686127/dynamic", - "label": "", - "mid": 686127, - "name": "籽岷", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance_frame": "", - "n_pid": 2066, - "name": "百年大会员", - "pid": 2066 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "6小时前", - "pub_ts": 1723937235, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 4845196800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", - "label_theme": "hundred_annual_vip", - "path": "", - "text": "百年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "1306462278", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV14M4m1175k", - "cover": "http://i1.hdslb.com/bfs/archive/7f8060fe1669b1a0a980844bb90e8150a859499c.jpg", - "desc": "https://www.curseforge.com/minecraft/mc-mods/desert-behemoths-sandworms/", - "disable_preview": 0, - "duration_text": "04:24", - "jump_url": "//www.bilibili.com/video/BV14M4m1175k/", - "stat": { - "danmaku": "297", - "play": "10.1万" - }, - "title": "我的世界 巨大沙虫", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "bili_49990770610:", - "rid": "3546583341730698", - "text": "bili_49990770610:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/1597302b98827463f5b75c7cac1f29ea6ce572c4.png", - "size": 1, - "text": "[给心心]", - "type": 1 - }, - "orig_text": "[给心心]", - "text": "[给心心]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "[给心心]" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 248, - "forbidden": false - }, - "forward": { - "count": 10, - "forbidden": false - }, - "like": { - "count": 10276, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "325813964", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325813964" - }, - "id_str": "966695334756483089", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "293793435" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/item/c0cf2235089ed314d92f30efa855c9b5611fa2cd.png", - "fan": { - "color": "#07b6d5", - "color_format": { - "colors": [ - "#07b6d5FF", - "#07b6d5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "005638", - "number": 5638 - }, - "id": 2513, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=2513\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=293793435\u0026native.theme=1\u0026navhide=1", - "name": "初音未来粉丝专属", - "type": 3 - }, - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/293793435/dynamic", - "label": "", - "mid": 293793435, - "name": "社会易姐QwQ", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png", - "n_pid": 2511, - "name": "初音未来13周年", - "pid": 2511 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "12小时前", - "pub_ts": 1723914697, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1739116800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "非常好冰箱贴,爱来自硬先生😋😋", - "text": "非常好冰箱贴,爱来自硬先生😋😋", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@硬核拆解 ", - "rid": "427494870", - "text": "@硬核拆解 ", - "type": "RICH_TEXT_NODE_TYPE_AT" - } - ], - "text": "非常好冰箱贴,爱来自硬先生😋😋@硬核拆解 " - }, - "major": { - "draw": { - "id": 325813964, - "items": [ - { - "height": 1277, - "size": 98.36, - "src": "http://i0.hdslb.com/bfs/new_dyn/60d92e9e0d89a5394a2da69aba6f9710293793435.jpg", - "tags": [], - "width": 958 - }, - { - "height": 1080, - "size": 905.82, - "src": "http://i0.hdslb.com/bfs/new_dyn/0f9bff1938d824ce206a569d539455df293793435.jpg", - "tags": [], - "width": 1440 - }, - { - "height": 1080, - "size": 693.59, - "src": "http://i0.hdslb.com/bfs/new_dyn/ab3332061b793361ec08901ace1782db293793435.jpg", - "tags": [], - "width": 1440 - }, - { - "height": 1080, - "size": 988.15, - "src": "http://i0.hdslb.com/bfs/new_dyn/8e62512db6d04b381dae3814adb95d5e293793435.jpg", - "tags": [], - "width": 1440 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 11, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "966692349750018048", - "comment_type": 17, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "966692349750018048" - }, - "id_str": "966692349750018048", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "36081646" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/item/684f6dc32decd32fe9db901b81b83b9a1fe39574.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 49922, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=49922\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=36081646\u0026native.theme=1\u0026navhide=1", - "name": "古色花香洛天依", - "type": 1 - }, - "face": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/36081646/dynamic", - "label": "", - "mid": 36081646, - "name": "洛天依", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", - "image_enhance_frame": "", - "n_pid": 1720437918001, - "name": "洛天依心律共鸣头像框", - "pid": -1843967695 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "12小时前", - "pub_ts": 1723914002, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1764777600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "恭喜", - "text": "恭喜", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@从一到无穷大Infinity", - "rid": "697565874", - "text": "@从一到无穷大Infinity", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "@qwq啊啊啊啊啊噜", - "rid": "189799722", - "text": "@qwq啊啊啊啊啊噜", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "@有时名字不能取太长", - "rid": "3546388151405126", - "text": "@有时名字不能取太长", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "等5位同学中奖,已私信通知,详情请点击抽奖查看。", - "text": "等5位同学中奖,已私信通知,详情请点击抽奖查看。", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "恭喜@从一到无穷大Infinity@qwq啊啊啊啊啊噜@有时名字不能取太长等5位同学中奖,已私信通知,详情请点击抽奖查看。" - }, - "major": null, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "明ちゃん王:", - "rid": "1280664625", - "text": "明ちゃん王:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "哇,非常不错呢,跟天依挺搭配的", - "text": "哇,非常不错呢,跟天依挺搭配的", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/63c9d1a31c0da745b61cdb35e0ecb28635675db2.png", - "size": 1, - "text": "[星星眼]", - "type": 1 - }, - "orig_text": "[星星眼]", - "text": "[星星眼]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "哇,非常不错呢,跟天依挺搭配的[星星眼]" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 88, - "forbidden": false - }, - "forward": { - "count": 12, - "forbidden": false - }, - "like": { - "count": 3088, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "939874290505875465", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "36081646" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/item/684f6dc32decd32fe9db901b81b83b9a1fe39574.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 49922, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=49922\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=36081646\u0026native.theme=1\u0026navhide=1", - "name": "古色花香洛天依", - "type": 1 - }, - "face": "https://i1.hdslb.com/bfs/face/78cdc5ba930ab171ebfe1ecc848cabcd4b0e0974.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/36081646/dynamic", - "label": "", - "mid": 36081646, - "name": "洛天依", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/open/aafcb0ea3a0bc237634240f98bf93b3b6ac2d337.png", - "image_enhance_frame": "", - "n_pid": 1720437918001, - "name": "洛天依心律共鸣头像框", - "pid": -1843967695 - }, - "pub_action": "", - "pub_time": "", - "pub_ts": 1717669936, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1764777600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "goods": { - "head_icon": "", - "head_text": "UP主的推荐", - "items": [ - { - "brief": "", - "cover": "https://i0.hdslb.com/bfs/mall/mall/ef/9d/2cb00b3649bcb232f62b3169be95407d.png", - "id": "901140704120020992", - "jump_desc": "去看看", - "jump_url": "https://mall.bilibili.com/neul-next/detailuniversal/detail.html?isMerchant=1\u0026page=detailuniversal_detail\u0026saleType=0\u0026itemsId=10406556\u0026loadingShow=1\u0026noTitleBar=1\u0026msource=cps_Mdynamic_36081646\u0026from=\u0026contentId=\u0026track_id=__BGMT__", - "name": "天羽川 洛天依 短袖水手服纯色裙长短袜套装", - "price": "¥49" - } - ], - "jump_url": "" - }, - "type": "ADDITIONAL_TYPE_GOODS" - }, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "​互动抽奖", - "rid": "301330", - "text": "​互动抽奖", - "type": "RICH_TEXT_NODE_TYPE_LOTTERY" - }, - { - "orig_text": "洛天依X", - "text": "洛天依X", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@天羽川JK ", - "rid": "394187581", - "text": "@天羽川JK ", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~", - "text": "联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "http://i0.hdslb.com/bfs/emote/9826fb4f77944387767a37552143fbec40159fa5.png", - "size": 2, - "text": "[洛天依_礼物]", - "type": 3 - }, - "orig_text": "[洛天依_礼物]", - "text": "[洛天依_礼物]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?", - "text": "\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/8034b3cb55370d19b1683eb38e7747c5c6c5dba6.png", - "size": 2, - "text": "[洛天依蝶变_星星眼]", - "type": 3 - }, - "orig_text": "[洛天依蝶变_星星眼]", - "text": "[洛天依蝶变_星星眼]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "\n", - "text": "\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "​互动抽奖洛天依X@天羽川JK 联名水手服\u0026长短袜套装 新品预售即将开启啦!\n转发关注天依,揪5位小伙伴送出联名款长短袜1双~[洛天依_礼物]\n\n❀联名服饰\n-洛天依联名款水手服\n-洛天依还原款长短袜\n\n❀预售时间\n6月8日20:00 起\n\n日常\u0026cos皆宜,大家有没有发现结合了天依的哪些元素呀?[洛天依蝶变_星星眼]\n" - }, - "major": { - "draw": { - "id": 318324614, - "items": [ - { - "height": 1280, - "size": 662.59, - "src": "http://i0.hdslb.com/bfs/new_dyn/1f23b61786eadb8c3e3f4c137730715036081646.jpg", - "tags": [], - "width": 904 - }, - { - "height": 1280, - "size": 614.83, - "src": "http://i0.hdslb.com/bfs/new_dyn/7d679216308bb7c65aeba38b4eafdd8936081646.jpg", - "tags": [], - "width": 904 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": { - "id": 1156147, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1156147\u0026topic_name=%E5%A4%A9%E4%BE%9D%E7%9A%84%E5%91%A8%E8%BE%B9", - "name": "天依的周边" - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "325807840", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325807840" - }, - "id_str": "966677390370537527", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "485703766" - }, - "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/485703766/dynamic", - "label": "", - "mid": 485703766, - "name": "英伟达GeForce", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "13小时前", - "pub_ts": 1723910520, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 2000563200000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili", - "text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@祗殁", - "rid": "12299496", - "text": "@祗殁", - "type": "RICH_TEXT_NODE_TYPE_AT" - } - ], - "text": "直面天命,还有 2 天!\nRTX. ON!\n\n投稿来自于:Bilibili@祗殁" - }, - "major": { - "draw": { - "id": 325807840, - "items": [ - { - "height": 1073, - "size": 66.29785, - "src": "https://i0.hdslb.com/bfs/new_dyn/b47b271135c7c496923d76c6b794e596485703766.png", - "tags": [], - "width": 1213 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 105, - "forbidden": false - }, - "forward": { - "count": 7, - "forbidden": false - }, - "like": { - "count": 872, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "1606450518", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1606450518" - }, - "id_str": "966647978674618373", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/bb23fb77a033759a145f8eda7b5e3a15386f637c.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1503187" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/archive/e495de36cab75f9a610fb6f2d0ba29a87b794cc6.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "002484", - "number": 2484 - }, - "id": 66898, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=108\u0026from=post\u0026f_source=garb\u0026-Abrowser=live\u0026hybrid_set_header=2\u0026navhide=1\u0026anchor_task=1", - "name": "BLG 信念干杯勋章", - "type": 3 - }, - "face": "https://i1.hdslb.com/bfs/face/bb23fb77a033759a145f8eda7b5e3a15386f637c.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/1503187/dynamic", - "label": "", - "mid": 1503187, - "name": "和谐号舰长", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "昨天 22:07", - "pub_ts": 1723903670, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1732204800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "1606450518", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV152421Z7bV", - "cover": "http://i1.hdslb.com/bfs/archive/e87786447779ff1a4fb2d941a3321f9750a65300.jpg", - "desc": "多来点这样的更新,太快乐了", - "disable_preview": 0, - "duration_text": "03:39", - "jump_url": "//www.bilibili.com/video/BV152421Z7bV/", - "stat": { - "danmaku": "406", - "play": "6.6万" - }, - "title": "官方:矿车怎么就不能是飞船?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "吉吉国民开水儿:", - "rid": "43514654", - "text": "吉吉国民开水儿:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "致敬传奇宰人航空大师张泰玩", - "text": "致敬传奇宰人航空大师张泰玩", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "致敬传奇宰人航空大师张泰玩" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 218, - "forbidden": false - }, - "forward": { - "count": 15, - "forbidden": false - }, - "like": { - "count": 5694, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "1506427569", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1506427569" - }, - "id_str": "966629209415876628", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "407045223" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", - "name": "2233娘", - "type": 1 - }, - "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/407045223/dynamic", - "label": "", - "mid": 407045223, - "name": "二次元的中科院物理所", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "昨天 20:55", - "pub_ts": 1723899301, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1745769600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~", - "text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~ 错过直播的小伙伴可以来这里补课~" - }, - "major": { - "archive": { - "aid": "1506427569", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1uS42197b5", - "cover": "http://i1.hdslb.com/bfs/archive/e13db3349cdc91a00041be9730bbbe42c3e8df55.jpg", - "desc": "光是什么?光是我们看到的五彩斑斓的世界,光是自然界能量的来源,光是一种电磁波。我们利用光可以做些什么?如何收集太阳的能量?如何产生光?让我们在本集课程中寻找这些问题的答案~", - "disable_preview": 0, - "duration_text": "44:45", - "jump_url": "//www.bilibili.com/video/BV1uS42197b5/", - "stat": { - "danmaku": "1", - "play": "3364" - }, - "title": "光照下多姿多彩的世界——光化学和我们的生活【中国科学院科学公开课S06E15】", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": { - "id": 1073121, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1073121\u0026topic_name=%E4%B8%AD%E5%9B%BD%E7%A7%91%E5%AD%A6%E9%99%A2%E7%A7%91%E5%AD%A6%E5%85%AC%E5%BC%80%E8%AF%BE", - "name": "中国科学院科学公开课" - } - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 3, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 741, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "325765582", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325765582" - }, - "id_str": "966583356402696224", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "946974" - }, - "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/946974/dynamic", - "label": "", - "mid": 946974, - "name": "影视飓风", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "昨天 17:57", - "pub_ts": 1723888625, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1975248000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "reserve": { - "button": { - "check": { - "icon_url": "", - "text": "已预约" - }, - "status": 1, - "type": 2, - "uncheck": { - "icon_url": "https://i0.hdslb.com/bfs/album/1d6af68e116985828780dd843ef435ccd6307e63.png", - "text": "预约" - } - }, - "desc1": { - "style": 0, - "text": "今天 20:00 直播" - }, - "desc2": { - "style": 0, - "text": "4153人预约", - "visible": true - }, - "jump_url": "", - "reserve_total": 4153, - "rid": 4003487, - "state": 0, - "stype": 2, - "title": "直播预约:飓风商店夏促来了!", - "up_mid": 946974 - }, - "type": "ADDITIONAL_TYPE_RESERVE" - }, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!", - "text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "飓风商店夏季活动来啦!\n8月18日周日晚20:00,直播间每15分钟天选抽送【热升华键帽】!\n\n👇新品看这边\n呼声超高的mini托特挂件、防泼水拎包、新版车贴,首发好价!\n👇福利看这边\n经典热销款全场9折,夏秋两季可穿,硬件同享折扣!\n\n总之,记得预约!" - }, - "major": { - "draw": { - "id": 325765582, - "items": [ - { - "height": 9829, - "size": 5198.785, - "src": "http://i0.hdslb.com/bfs/new_dyn/9d690134c84c03f6bacf83cf4d21bd73946974.jpg", - "tags": [], - "width": 2251 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 3104, - "forbidden": false - }, - "forward": { - "count": 154, - "forbidden": false - }, - "like": { - "count": 4703, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "325753910", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325753910" - }, - "id_str": "966552037496979456", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_animation": { - "webp_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "686127" - }, - "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/686127/dynamic", - "label": "", - "mid": 686127, - "name": "籽岷", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance_frame": "", - "n_pid": 2066, - "name": "百年大会员", - "pid": 2066 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "昨天 15:55", - "pub_ts": 1723881333, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 4845196800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", - "label_theme": "hundred_annual_vip", - "path": "", - "text": "百年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "type": "ADDITIONAL_TYPE_UPOWER_LOTTERY", - "upower_lottery": { - "button": { - "jump_style": { - "icon_url": "", - "text": "6元充电" - }, - "jump_url": "https://www.bilibili.com/h5/upower/index?mid=686127\u0026default_level=10\u0026levels=10\u0026navhide=1\u0026lotteryId=313280\u0026businessId=966552037496979456\u0026prePage=lotteryCard", - "type": 1 - }, - "desc": { - "jump_url": "https://www.bilibili.com/h5/lottery/result?business_id=966552037496979456\u0026business_type=12", - "style": 1, - "text": "【籽岷定制手偶】*10份" - }, - "hint": { - "style": 0, - "text": "加入当前UP主的「6元档包月充电」即可参与" - }, - "jump_url": "https://www.bilibili.com/h5/lottery/result?business_id=966552037496979456\u0026business_type=12", - "rid": 313280, - "state": 0, - "title": "石粒专属抽奖", - "up_mid": 686127, - "upower_action_state": 2, - "upower_level": 10 - } - }, - "desc": { - "rich_text_nodes": [ - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/garb/ebeae1235fa9397e6e5598ce1e5e2955bb345a8b.png", - "size": 2, - "text": "[UPOWER_686127_闪亮登场]", - "type": 11 - }, - "orig_text": "[UPOWER_686127_闪亮登场]", - "text": "[UPOWER_686127_闪亮登场]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~", - "text": "今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "[UPOWER_686127_闪亮登场]今天给大家奉上一波新福利,抽10人(籽岷定制手偶)~\n感谢一直为我包月充电的观众们~\n活动开奖时间为8月21日23点59分,大家快来抽奖吧~" - }, - "major": { - "draw": { - "id": 325753910, - "items": [ - { - "height": 800, - "size": 596.8096, - "src": "http://i0.hdslb.com/bfs/new_dyn/1b03b7888b105765d985f3093e5d6e4a686127.png", - "tags": [], - "width": 800 - }, - { - "height": 800, - "size": 393.75098, - "src": "http://i0.hdslb.com/bfs/new_dyn/b69ee39531bf8864471ec9fbc7de4402686127.png", - "tags": [], - "width": 800 - }, - { - "height": 800, - "size": 364.8711, - "src": "http://i0.hdslb.com/bfs/new_dyn/0c3fb5268abe60023b0053902bccde66686127.png", - "tags": [], - "width": 800 - }, - { - "height": 800, - "size": 198.65234, - "src": "http://i0.hdslb.com/bfs/new_dyn/693a40f83d2ac6a4952c9541365e1265686127.png", - "tags": [], - "width": 800 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": { - "id": 1006239, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1006239\u0026topic_name=%E7%B1%BD%E5%B2%B7%E5%93%81%E9%89%B4%E5%9B%A2", - "name": "籽岷品鉴团" - } - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 28, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 2686, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "1456450441", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1456450441" - }, - "id_str": "966513421411418114", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/94183796acd85f2e80f3dca740bc1c3d5cae6410.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "3493131246897478" - }, - "face": "https://i1.hdslb.com/bfs/face/94183796acd85f2e80f3dca740bc1c3d5cae6410.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/3493131246897478/dynamic", - "label": "", - "mid": 3493131246897478, - "name": "电解碳酸钠", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "昨天 13:25", - "pub_ts": 1723872342, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1744732800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "给脚专用的“按键” 我觉得他不应该这么贵", - "text": "给脚专用的“按键” 我觉得他不应该这么贵", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "给脚专用的“按键” 我觉得他不应该这么贵" - }, - "major": { - "archive": { - "aid": "1456450441", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1Yi421a7FC", - "cover": "http://i1.hdslb.com/bfs/archive/b56700e0a1d28ecff2ff135a7cc51e9b09cace79.jpg", - "desc": "用到的配件:\n·带有热插拔轴体功能的任何全新\u0026二手键盘 只要功能正常即可\n·追求极致性价比的 可以直接买剪线键盘进行改造\n·TFS-1脚踏脚踩开关(我买的3.2一个)\n要注意这些脚踏开关有可能是3线 分为常闭和常开\n对于这个型号的开关 我接的是红线+白线 为踩下触发\n·焊油(推荐针管式单手操作)", - "disable_preview": 0, - "duration_text": "06:01", - "jump_url": "//www.bilibili.com/video/BV1Yi421a7FC/", - "stat": { - "danmaku": "149", - "play": "2.7万" - }, - "title": "商家别看!脚踩键盘DIY超值方案?市场售价凭啥那么贵!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 161, - "forbidden": false - }, - "forward": { - "count": 17, - "forbidden": false - }, - "like": { - "count": 2699, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "966495069003579398", - "comment_type": 17, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "966495069003579398" - }, - "id_str": "966495069003579398", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "946974" - }, - "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/946974/dynamic", - "label": "", - "mid": 946974, - "name": "影视飓风", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "昨天 12:14", - "pub_ts": 1723868069, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1975248000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~", - "text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "周末啦,希望大家喜欢这期科普分享!我们的官网也加上了电影节的科普和信息汇总,欢迎大家取用~" - }, - "major": null, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 101, - "forbidden": false - }, - "forward": { - "count": 7, - "forbidden": false - }, - "like": { - "count": 5247, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "966197633939931139", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "946974" - }, - "face": "https://i0.hdslb.com/bfs/face/c1733474892caa45952b2c09a89323157df7129a.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/946974/dynamic", - "label": "", - "mid": 946974, - "name": "影视飓风", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_time": "", - "pub_ts": 1723798817, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1975248000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "挺久没有更新的看懂电影系列!", - "text": "挺久没有更新的看懂电影系列!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "挺久没有更新的看懂电影系列!" - }, - "major": { - "archive": { - "aid": "1506437840", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV13S42197ja", - "cover": "http://i1.hdslb.com/bfs/archive/50d4705b2d804a76f3c19af269dd7804479aa94e.jpg", - "desc": "国内外总共有3000多个大大小小的电影节。那么,短片可以参加电影节吗?什么时候投递获奖概率才大一些?这次我们想和你分享一些投递和参加电影节的门道。我们还整理了一份有关电影节的科普文档,可以来我们的官网看看:https://filmfestival.ysjf.com/。\n如果你喜欢这期视频,请多多支持我们,并将视频分享给其他朋友一起看看!", - "disable_preview": 0, - "duration_text": "10:55", - "jump_url": "//www.bilibili.com/video/BV13S42197ja/", - "stat": { - "danmaku": "2067", - "play": "64.1万" - }, - "title": "全世界3000多个电影节,都在办些啥?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "37185041", - "comment_type": 12, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "37185041" - }, - "id_str": "966484129969340422", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "407045223" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=407045223\u0026native.theme=1\u0026navhide=1", - "name": "2233娘", - "type": 1 - }, - "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/407045223/dynamic", - "label": "", - "mid": 407045223, - "name": "二次元的中科院物理所", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了文章", - "pub_location_text": "", - "pub_time": "昨天 11:32", - "pub_ts": 1723865522, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1745769600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "article": { - "covers": [ - "https://i0.hdslb.com/bfs/article/708ab38ac38df8fe7851a63c0258fa64407045223.jpg" - ], - "desc": "经历过密码解锁和手势解锁后 真感慨指纹解锁是天才的创造 可惜遇到湿手油手经常失效 甚至擦干了还是这样 这是为什么呢问答导航Q1 鸡蛋在母鸡体内有气室吗?Q2 为什么弹簧是螺旋型的?Q3 闪电为什么总是自上而下,有没有自下而上的闪电呢?Q4 当一束光使电子发生了能级跃迁,原先的光子去哪儿了,消失了吗?Q5 为什么有茶叶的水在转时茶叶会趋向中间而不是两边呢?Q6 为什么塑料相比于其它物质,更容易起静电?Q7 为什么会有空集?空集的存在有什么物理意义? Q8 为什么有纹理的木擦了木蜡油之后会纹理变深,更容易被看", - "id": 37185041, - "jump_url": "//www.bilibili.com/read/cv37185041/", - "label": "16.3万阅读", - "title": "手指沾水擦干但是指纹识别还是失败,这是什么原因?| No.422" - }, - "type": "MAJOR_TYPE_ARTICLE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 23, - "forbidden": false - }, - "forward": { - "count": 7, - "forbidden": false - }, - "like": { - "count": 727, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_ARTICLE", - "visible": true - }, - { - "basic": { - "comment_id_str": "966475883631083553", - "comment_type": 17, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "966475883631083553" - }, - "id_str": "966475883631083553", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "233114659" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", - "fan": { - "color": "#903AC2", - "color_format": { - "colors": [ - "#903AC2FF", - "#903AC2FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "000001", - "number": 1 - }, - "id": 1706163888001, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", - "name": "龙腾啾跃-动态卡片粉丝", - "type": 3 - }, - "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/233114659/dynamic", - "label": "", - "mid": 233114659, - "name": "碧蓝航线", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", - "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", - "n_pid": 1987, - "name": "碧蓝航线2020", - "pid": 1987 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "昨天 11:00", - "pub_ts": 1723863602, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1729526400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "恭喜", - "text": "恭喜", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@两百斤的橘猫猫0w0", - "rid": "8391364", - "text": "@两百斤的橘猫猫0w0", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "@一位隐身的Z23厨", - "rid": "382382091", - "text": "@一位隐身的Z23厨", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "@默涛默随波", - "rid": "230373473", - "text": "@默涛默随波", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "等8位同学中奖,已私信通知,详情请点击抽奖查看。", - "text": "等8位同学中奖,已私信通知,详情请点击抽奖查看。", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "恭喜@两百斤的橘猫猫0w0@一位隐身的Z23厨@默涛默随波等8位同学中奖,已私信通知,详情请点击抽奖查看。" - }, - "major": null, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 227, - "forbidden": false - }, - "forward": { - "count": 20, - "forbidden": false - }, - "like": { - "count": 3126, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "963893770559946786", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "233114659" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", - "fan": { - "color": "#903AC2", - "color_format": { - "colors": [ - "#903AC2FF", - "#903AC2FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "000001", - "number": 1 - }, - "id": 1706163888001, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", - "name": "龙腾啾跃-动态卡片粉丝", - "type": 3 - }, - "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/233114659/dynamic", - "label": "", - "mid": 233114659, - "name": "碧蓝航线", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", - "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", - "n_pid": 1987, - "name": "碧蓝航线2020", - "pid": 1987 - }, - "pub_action": "", - "pub_time": "", - "pub_ts": 1723262407, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1729526400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "common": { - "button": { - "jump_style": { - "icon_url": "", - "text": "进入" - }, - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "type": 1 - }, - "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", - "desc1": "养成", - "desc2": "指挥官,欢迎回港", - "head_text": "相关游戏", - "id_str": "97", - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "style": 1, - "sub_type": "game", - "title": "碧蓝航线" - }, - "type": "ADDITIONAL_TYPE_COMMON" - }, - "desc": { - "rich_text_nodes": [ - { - "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", - "orig_text": "#碧蓝航线#", - "text": "#碧蓝航线#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " ", - "text": " ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "互动抽奖", - "rid": "312103", - "text": "互动抽奖", - "type": "RICH_TEXT_NODE_TYPE_LOTTERY" - }, - { - "orig_text": " \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注", - "text": " \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@碧蓝航线", - "rid": "233114659", - "text": "@碧蓝航线", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~", - "text": " 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "#碧蓝航线# 互动抽奖 \n兰夜放灯祈相守,\n纤手弄糕思今宵。\n\n关注@碧蓝航线 并转发该内容,我们将于8月17日抽取3位指挥官送出【JUUs时间 花园Q版手办】,抽取5位指挥官送出【心智魔方-系列浴球(随机一款)】。\n\n金风玉露,值此良宵,愿与君共度~" - }, - "major": { - "draw": { - "id": 324938558, - "items": [ - { - "height": 3038, - "size": 2025.2646, - "src": "http://i0.hdslb.com/bfs/new_dyn/b0068d1603aee2849ca46a58642fa99e233114659.jpg", - "tags": [], - "width": 5400 - }, - { - "height": 5063, - "size": 7377.1143, - "src": "http://i0.hdslb.com/bfs/new_dyn/c047aafcf90a48b578a63c3e1b86c1de233114659.jpg", - "tags": [], - "width": 9000 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "1456253104", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "1456253104" - }, - "id_str": "966374603744083976", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_animation": { - "webp_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "686127" - }, - "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/686127/dynamic", - "label": "", - "mid": 686127, - "name": "籽岷", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/0dcf03aa499a64524fe25871d26d95f49f880928.png", - "image_enhance_frame": "", - "n_pid": 2066, - "name": "百年大会员", - "pid": 2066 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "昨天 04:27", - "pub_ts": 1723840021, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 4845196800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", - "label_theme": "hundred_annual_vip", - "path": "", - "text": "百年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "1456253104", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1ai421h7nT", - "cover": "http://i1.hdslb.com/bfs/archive/0245f30593e2963b883cd5953881034ad033fbd5.jpg", - "desc": "https://www.minecraft.net/en-us/article/minecraft-snapshot-24w33a", - "disable_preview": 0, - "duration_text": "16:22", - "jump_url": "//www.bilibili.com/video/BV1ai421h7nT/", - "stat": { - "danmaku": "2149", - "play": "24.5万" - }, - "title": "收纳袋、红石、矿车大改 我的世界新版本介绍 1.21.2 24w33a", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": { - "id": 1028161, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1028161\u0026topic_name=%E6%95%B4%E7%82%B9%E7%94%B5%E5%AD%90%E6%A6%A8%E8%8F%9C", - "name": "整点电子榨菜" - } - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "名字永远是个谜:", - "rid": "2022349482", - "text": "名字永远是个谜:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!", - "text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "我们轨道交通圈有福了啊啊啊啊啊啊啊!" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 921, - "forbidden": false - }, - "forward": { - "count": 51, - "forbidden": false - }, - "like": { - "count": 23138, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "325694432", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325694432" - }, - "id_str": "966306597269667840", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "485703766" - }, - "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/485703766/dynamic", - "label": "", - "mid": 485703766, - "name": "英伟达GeForce", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "昨天 00:03", - "pub_ts": 1723824187, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 2000563200000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili", - "text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@祗殁 ", - "rid": "12299496", - "text": "@祗殁 ", - "type": "RICH_TEXT_NODE_TYPE_AT" - } - ], - "text": "直面天命,还有 3 天!\nRTX. ON!\n\n投稿来自于:Bilibili@祗殁 " - }, - "major": { - "draw": { - "id": 325694432, - "items": [ - { - "height": 1280, - "size": 59.246094, - "src": "http://i0.hdslb.com/bfs/new_dyn/2e42c52d5e1383fe443f0984a41a9624485703766.jpg", - "tags": [], - "width": 1282 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 115, - "forbidden": false - }, - "forward": { - "count": 3, - "forbidden": false - }, - "like": { - "count": 876, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "325690655", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "325690655" - }, - "id_str": "966298866306515029", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "233114659" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/garb/bb140043341137b879e957d09b649ce7c3257820.png", - "fan": { - "color": "#903AC2", - "color_format": { - "colors": [ - "#903AC2FF", - "#903AC2FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": true, - "num_prefix": "NO.", - "num_str": "000001", - "number": 1 - }, - "id": 1706163888001, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=1706163888001\u0026isdiy=0\u0026part=card\u0026from=post\u0026f_source=garb\u0026vmid=233114659\u0026native.theme=1\u0026navhide=1", - "name": "龙腾啾跃-动态卡片粉丝", - "type": 3 - }, - "face": "https://i1.hdslb.com/bfs/face/1fd5b43d5f619e6df8c8adcf13c962a3e80ee971.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/233114659/dynamic", - "label": "", - "mid": 233114659, - "name": "碧蓝航线", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/item/fe1267f786bf69f1471aff715f8d38ec0e486df5.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/0aa9fd33133ed3fd9f11c857cc6ca848d6804113.webp", - "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/3052b412defbbc7704e887fefde8de539e8027c5.png", - "n_pid": 1987, - "name": "碧蓝航线2020", - "pid": 1987 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "2天前", - "pub_ts": 1723822387, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1729526400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": { - "common": { - "button": { - "jump_style": { - "icon_url": "", - "text": "进入" - }, - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "type": 1 - }, - "cover": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", - "desc1": "养成", - "desc2": "指挥官,欢迎回港", - "head_text": "相关游戏", - "id_str": "97", - "jump_url": "https://www.biligame.com/detail?id=97\u0026sourceFrom=1005", - "style": 1, - "sub_type": "game", - "title": "碧蓝航线" - }, - "type": "ADDITIONAL_TYPE_COMMON" - }, - "desc": { - "rich_text_nodes": [ - { - "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF", - "orig_text": "#碧蓝航线#", - "text": "#碧蓝航线#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " ", - "text": " ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%E7%A2%A7%E8%93%9D%E8%88%AA%E7%BA%BF%E6%BC%AB%E5%B1%95", - "orig_text": "#碧蓝航线漫展#", - "text": "#碧蓝航线漫展#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " ", - "text": " ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=2024%E6%B8%AF%E5%8C%BA%E7%9B%9B%E5%A4%8F%E6%B8%85%E5%87%89%E8%8A%82", - "orig_text": "#2024港区盛夏清凉节#", - "text": "#2024港区盛夏清凉节#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", - "text": "\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "#碧蓝航线# #碧蓝航线漫展# #2024港区盛夏清凉节#\n◆ 「港区盛夏清凉节」长沙站·街区快闪 到达!◆ \n\n碧蓝夏日,映照专属的街景~\n街区快闪即将开启,\n与少女们一同踏上这场特别的城市漫步之旅吧!\n\n◆ 互动游戏开放时间:2024年8月17日~8月18日,每日10:00~12:00及14:00~19:00\n◆ 街区快闪体验地址:湖南省长沙市开福区潮宗街历史文化街区\n◆ 参与方式:无需预约,前往现场即可参与体验~\n◆ 体验须知:\n※8月17日~8月18日期间,指挥官可前往潮宗街历史文化街区现场参与体验。\n※指挥官关注《碧蓝航线》官方B站账号后,可参与互动游戏,集章兑换周边礼品哟!\n※兑换周边每日数量有限,兑完即止。\n※天气炎热,请指挥官做好防暑准备,出行注意安全哟。" - }, - "major": { - "draw": { - "id": 325690655, - "items": [ - { - "height": 6000, - "size": 2737.6729, - "src": "http://i0.hdslb.com/bfs/new_dyn/722dc5e7eba3c3f6861b294f6bf3020c233114659.jpg", - "tags": [], - "width": 4000 - }, - { - "height": 4000, - "size": 4852.4023, - "src": "http://i0.hdslb.com/bfs/new_dyn/b04110f894184880666ee8b204000846233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 4000, - "size": 3941.9678, - "src": "http://i0.hdslb.com/bfs/new_dyn/8ce3c1e6f2d33a47d42f35193b9e5f55233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 4000, - "size": 4461.9707, - "src": "http://i0.hdslb.com/bfs/new_dyn/ab9a5bf2215f88fed6026d67d98ec901233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 4000, - "size": 3137.0205, - "src": "http://i0.hdslb.com/bfs/new_dyn/18e62cf8ebc7c07b99e042ac4cdeeaaa233114659.jpg", - "tags": [], - "width": 6000 - }, - { - "height": 4000, - "size": 9561.615, - "src": "http://i0.hdslb.com/bfs/new_dyn/1036f447fcbec195e717e2a5b3091a73233114659.jpg", - "tags": [], - "width": 6000 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "豌豆羹:", - "rid": "3493280973064560", - "text": "豌豆羹:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "大帝皮肤加彩蛋!", - "text": "大帝皮肤加彩蛋!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "大帝皮肤加彩蛋!" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 446, - "forbidden": false - }, - "forward": { - "count": 47, - "forbidden": false - }, - "like": { - "count": 4352, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "966281785469042740", - "comment_type": 17, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "966281785469042740" - }, - "id_str": "966281785469042740", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "178429408" - }, - "face": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/178429408/dynamic", - "label": "", - "mid": 178429408, - "name": "老弟一号", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "2天前", - "pub_ts": 1723818410, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1728576000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/0DFy9BHgwE.gif", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d7e624d13d3e134251e4174a7318c19a8edbd71.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/uckjAv3Npy.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "不管怎么样,我先把香槟开了", - "text": "不管怎么样,我先把香槟开了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/bf7e00ecab02171f8461ee8cf439c73db9797748.png", - "size": 1, - "text": "[脱单doge]", - "type": 1 - }, - "orig_text": "[脱单doge]", - "text": "[脱单doge]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "要是褒姒,直播抽一百个爵柏电源", - "text": "要是褒姒,直播抽一百个爵柏电源", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "不管怎么样,我先把香槟开了[脱单doge]要是褒姒,直播抽一百个爵柏电源" - }, - "major": null, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "芊芊老猫的日常:", - "rid": "1284100140", - "text": "芊芊老猫的日常:", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "还是好人多啊", - "text": "还是好人多啊", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/4683fd9ffc925fa6423110979d7dcac5eda297f4.png", - "size": 1, - "text": "[OK]", - "type": 1 - }, - "orig_text": "[OK]", - "text": "[OK]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "还是好人多啊[OK]" - }, - "type": 1 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消关注", - "type": "THREE_POINT_FOLLOWING" - }, - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "module_stat": { - "comment": { - "count": 156, - "forbidden": false - }, - "forward": { - "count": 1, - "forbidden": false - }, - "like": { - "count": 1367, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "966274874613956608", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/4c9095a6fc7d6ef7bf97ee1c65767f537763c60c.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "652239032" - }, - "face": "https://i2.hdslb.com/bfs/face/4c9095a6fc7d6ef7bf97ee1c65767f537763c60c.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/652239032/dynamic", - "label": "", - "mid": 652239032, - "name": "IGN中国", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_time": "", - "pub_ts": 1723816801, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", - "text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。" - }, - "major": { - "archive": { - "aid": "1456400345", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1Ti421a7dv", - "cover": "http://i2.hdslb.com/bfs/archive/fd87a4e75738b0de1388df60f5e4ce5011b1367a.jpg", - "desc": "《黑神话:悟空》绝对可以说是一座中国游戏行业的里程碑,它所呈现的优秀品质对得起这四年来它背负的所有期待,这是真正意义上放在全球市场也是极具竞争力的国产游戏,我相信它会成为今年年度游戏的有力竞争者,而游戏科学也将在此役之后毫无疑问成为全球顶尖ARPG游戏开发商之一。", - "disable_preview": 0, - "duration_text": "10:00", - "jump_url": "//www.bilibili.com/video/BV1Ti421a7dv/", - "stat": { - "danmaku": "4.6万", - "play": "595.1万" - }, - "title": "【IGN】10分,《黑神话:悟空》评测:踏平坎坷成大道", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - } - ], - "offset": "966281785469042740", - "update_baseline": "966888011247648768", - "update_num": 5 - } -} -``` - -</details> - -## 检测是否有新动态 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all/update - -*请求方式:GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| - | - | - | - | - | -| type | str | 动态类型 | 不必要 | 默认为 `all` | -| update_baseline | id | 更新基线 | 必要 | 用于检测是否有新动态, 默认为上次请求 [获取全部动态列表](#获取全部动态列表) 返回的 `update_baseline`, 实测填 `0` 也可正常获取 | -| web_location | str | 333.1365 | 不必要 | | - -**JSON回复:** - -根: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| code | num | 返回值 | 0: 成功<br />-101: 账号未登录<br />-400: 请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` : - -| 字段 | 类型 | 内容 | 备注 | -| - | - | - | - | -| update_num | num | 有新动态的数量 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/all/update' \ ---data-urlencode 'update_baseline=114514' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "update_num": 9 - } -} -``` - -</details> diff --git a/docs/dynamic/atlist.md b/docs/dynamic/atlist.md deleted file mode 100644 index a73734f..0000000 --- a/docs/dynamic/atlist.md +++ /dev/null @@ -1,238 +0,0 @@ -# 根据关键字搜索用户 (at别人时的填充列表) - -**注意关键字不一定顺序匹配,如最后示例** - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/mention/search - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---------- | ------ | ---------------------------------- | -| keyword | str | 搜索关键字 | 非必要 | 若无此项,则返回所有关注用户的信息 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 成功时为 `0` | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | -------- | ---------------------------------------------- | -| groups | array | 用户分组 | 根据是否关注该用户来分组,未找到用户时为空数组 | - -`groups`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 分组1 | | -| n | obj | 分组(n+1) | | -| …… | obj | …… | …… | - -`groups`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------- | ------------------------ | -| group_name | str | 分组名称 | `我的关注`或`其他` | -| group_type | num | 分组类型 | 2:我的关注<br />4:其他 | -| items | array | 搜索到的用户信息 | 按照认证状态与粉丝数排序 | - -`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | | -| …… | obj | …… | …… | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ------------ | ---------------------------------------- | -| face | str | 用户头像url | | -| fans | num | 用户粉丝数 | | -| name | str | 用户昵称 | | -| official_verify_type | num | 用户认证状态 | -1:无<br />0:个人认证<br />1:机构认证 | -| uid | str | 用户mid | | - -**示例:** - -搜索关键字为`社会易`的用户 - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/mention/search' \ ---data-urlencode 'keyword=社会易' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "groups": [ - { - "group_name": "我的关注", - "group_type": 2, - "items": [ - { - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "fans": 3613, - "name": "社会易姐QwQ", - "official_verify_type": -1, - "uid": "293793435" - } - ] - }, - { - "group_name": "其他", - "group_type": 4, - "items": [ - { - "face": "https://i0.hdslb.com/bfs/face/dbc456bdec5e7a4806c9d0311d95ebcc6be674cf.jpg", - "fans": 23464, - "name": "社会易老师", - "official_verify_type": -1, - "uid": "484031754" - }, - { - "face": "https://i1.hdslb.com/bfs/face/5497859a550a017d0a51c640d232c539c2f48991.jpg", - "fans": 11, - "name": "栄禧貿易株式会社", - "official_verify_type": -1, - "uid": "4991467" - }, - { - "face": "https://i2.hdslb.com/bfs/face/311cecf9298158b8a5f47ed3e641328ab5c0cfcd.jpg", - "fans": 10, - "name": "社会李易儒", - "official_verify_type": -1, - "uid": "442101413" - }, - { - "face": "https://i2.hdslb.com/bfs/face/2dad05e4748b5e91e1ec5d3c5d4f0904a5bcdaf0.jpg", - "fans": 8, - "name": "日本国立貿易株式会社", - "official_verify_type": -1, - "uid": "3546589855484501" - }, - { - "face": "http://i0.hdslb.com/bfs/face/2ae12d7f71173baa8e00c4cfe97acb5a3de31566.jpg", - "fans": 6, - "name": "社会小伙肖子易", - "official_verify_type": -1, - "uid": "250129011" - }, - { - "face": "https://i2.hdslb.com/bfs/face/1ebb0d4aa8e2c4b532f82983503ec38b62a1820f.jpg", - "fans": 4, - "name": "社会主义接班人小易", - "official_verify_type": -1, - "uid": "486568790" - }, - { - "face": "http://i0.hdslb.com/bfs/face/dccb52f3c15ba1bb99aac3c86e9825842cc95295.jpg", - "fans": 2, - "name": "社会你易易", - "official_verify_type": -1, - "uid": "497214639" - }, - { - "face": "https://i1.hdslb.com/bfs/face/1902cc0b07ab4a5de6110f5adb2691cbf7051f2b.jpg", - "fans": 1, - "name": "社会打工不容易", - "official_verify_type": -1, - "uid": "3546742186314202" - }, - { - "face": "https://i0.hdslb.com/bfs/face/19ee1b5975969a47ba085cd1f628d86a479b9950.jpg", - "fans": 0, - "name": "社会交易", - "official_verify_type": -1, - "uid": "3493291412687622" - }, - { - "face": "https://i0.hdslb.com/bfs/face/de6afbda484e114b7cedeb621c3cbbaef7800988.jpg", - "fans": 0, - "name": "不谦易会社恐", - "official_verify_type": -1, - "uid": "1602175830" - }, - { - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 8, - "name": "社会易总", - "official_verify_type": -1, - "uid": "155817540" - }, - { - "face": "https://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 0, - "name": "社会存在与社会易逝", - "official_verify_type": -1, - "uid": "3546578331634371" - }, - { - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 0, - "name": "社会易姐QAQ", - "official_verify_type": -1, - "uid": "1983403996" - }, - { - "face": "http://i1.hdslb.com/bfs/face/510cde8f4e3eb27aa50177d619a4200bb501797b.jpg", - "fans": 0, - "name": "社会易大佬人狠话不多", - "official_verify_type": -1, - "uid": "408471763" - }, - { - "face": "http://i1.hdslb.com/bfs/face/7324adb53362527a1bf5f20141a6ae4307011ea7.jpg", - "fans": 0, - "name": "社会易轩", - "official_verify_type": -1, - "uid": "384672256" - }, - { - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 0, - "name": "社会易哥", - "official_verify_type": -1, - "uid": "284984452" - }, - { - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 0, - "name": "社会易姐", - "official_verify_type": -1, - "uid": "249112673" - }, - { - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "fans": 0, - "name": "社会易大佬", - "official_verify_type": -1, - "uid": "167967213" - } - ] - } - ] - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/dynamic/banner.md b/docs/dynamic/banner.md deleted file mode 100644 index 2df8329..0000000 --- a/docs/dynamic/banner.md +++ /dev/null @@ -1,132 +0,0 @@ -# 首页公告栏 - -## 动态首页公告栏 (新版) - -> https://api.bilibili.com/x/dynamic/feed/dyn/banner - -*请求方法: GET* - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| platform | number | 平台? | 不必要 | 默认为 `1`, 留空无 | -| position | string | 位置? | 不必要 | 默认为 `web动态`, 留空无 | -| web_location | string | `333.1365` | 不必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| banners | object[] | 横幅们 | 套了个娃 | - -`data.banners[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| banner_id | number | 横幅 id | 旧版接口无 | -| end_time | number | 结束时间 | UNIX 秒级时间戳 | -| img_url | string | 图片 URL | | -| link | string | 跳转链接 | | -| platform | number | 平台 | 与请求参数对应 | -| position | string | 位置 | 与请求参数对应 | -| start_time | number | 开始时间 | UNIX 秒级时间戳 | -| title | string | 标题 | | -| weight | number | 权重 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/dynamic/feed/dyn/banner?platform=1&position=web动态&web_location=333.1365' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "banners": [ - { - "banner_id": 20, - "end_time": 2056204800, - "img_url": "https://i0.hdslb.com/bfs/vc/9c699f2acbcad00197e92c401b835d2c6aba8a55.png", - "link": "https://www.bilibili.com/blackboard/activity-5zJxM3spoS.html", - "platform": 1, - "position": "web动态", - "start_time": 1582862523, - "title": "点击进入", - "weight": 1 - } - ] - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-05-01T00:21:48.81113265Z --> - -## 动态首页公告栏 (旧版) - -> https://api.vc.bilibili.com/banner_svr/v1/banner_svr/show - - -*请求方法: GET* - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| platform | number | 平台? | 不必要 | 默认为 `1` | -| position | string | 位置? | 不必要 | 默认为 `web动态` | - -**JSON 回复:** - -与 [动态首页公告栏 (新版)](#动态首页公告栏-新版) 相同, 除了少了个 `data.banners[].banner_id` - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/banner_svr/v1/banner_svr/show' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "banners": [ - { - "img_url": "https://i0.hdslb.com/bfs/vc/9c699f2acbcad00197e92c401b835d2c6aba8a55.png", - "title": "点击进入", - "link": "https://www.bilibili.com/blackboard/activity-5zJxM3spoS.html", - "platform": 1, - "weight": 1, - "position": "web动态", - "start_time": 1582862523, - "end_time": 2056204800 - } - ] - } -} -``` - -</details> diff --git a/docs/dynamic/basicInfo.md b/docs/dynamic/basicInfo.md deleted file mode 100644 index b4b836a..0000000 --- a/docs/dynamic/basicInfo.md +++ /dev/null @@ -1,1581 +0,0 @@ -# 动态基本信息 - -## 动态转发列表 - -> https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/repost_detail - -请求方式:GET - -==Attention: 转发列表总计超过550部分继续获取可能被限制。== - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| :--------: | :--: | :----: | :----: | :--: | -| dynamic_id | id | 动态id | 必要 | | -| offset | - | - | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 默认为空 | -| msg | num | 空 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------- | ------------ | -| has_more | bool | 是否还有下一页 | 每页最多20条 | -| total | int | 总计包含 | 不超过20条 | -| _gt_ | num | 0 | 作用尚不明确 | - -`data`中的`items`对象: - -由于参数过多,这里不一一列举,请自行参阅其他文件理解。 - -**示例:** - -获取`哔哩哔哩弹幕网`的动态id为`669016644742283288`动态 - -```shell -curl -G 'https://api.vc.bilibili.com/dynamic_repost/v1/dynamic_repost/repost_detail' \ ---data-urlencode 'dynamic_id=669016644742283288' -``` - -<details> -<summary>查看响应示例</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "has_more": 0, - "total": 3, - "items": [ - { - "desc": { - "uid": 478909651, - "type": 1, - "rid": 669023160171702063, - "acl": 0, - "view": 0, - "repost": 0, - "like": 0, - "is_liked": 0, - "dynamic_id": 669023160201379864, - "timestamp": 1654607493, - "pre_dy_id": 669016644742283288, - "orig_dy_id": 669007814298959974, - "orig_type": 2, - "user_profile": { - "info": { - "uid": 478909651, - "uname": "-牛马之玉", - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "face_nft": 0 - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "rank": "10000", - "sign": "", - "level_info": { - "current_level": 2 - } - }, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669023160201379864", - "pre_dy_id_str": "669016644742283288", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669023160171702063", - "origin": { - "uid": 392836434, - "type": 2, - "rid": 196658860, - "acl": 1024, - "view": 46111, - "repost": 1446, - "like": 0, - "dynamic_id": 669007814298959974, - "timestamp": 1654603920, - "pre_dy_id": 0, - "orig_dy_id": 0, - "uid_type": 1, - "stype": 0, - "r_type": 0, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669007814298959974", - "pre_dy_id_str": "0", - "orig_dy_id_str": "0", - "rid_str": "196658860" - }, - "previous": { - "uid": 9617619, - "type": 1, - "rid": 669016644698939384, - "acl": 1024, - "view": 1381, - "repost": 3, - "like": 0, - "dynamic_id": 669016644742283288, - "timestamp": 1654605976, - "pre_dy_id": 669007814298959974, - "orig_dy_id": 669007814298959974, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669016644742283288", - "pre_dy_id_str": "669007814298959974", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669016644698939384" - } - }, - "card": "{ \"user\": { \"uid\": 478909651, \"uname\": \"-牛马之玉\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/member\\/noface.jpg\" }, \"item\": { \"rp_id\": 669023160171702063, \"uid\": 478909651, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品...\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 0, \"label\": { \"path\": \"\", \"text\": \"年度大会员\", \"label_theme\": \"annual_vip\", \"text_color\": \"#FFFFFF\", \"bg_style\": 1, \"bg_color\": \"#FB7299\", \"border_color\": \"\" }, \"avatar_subscript\": 1, \"nickname_color\": \"#FB7299\", \"role\": 3, \"avatar_subscript_url\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/vip\\/icon_Certification_big_member_22_3x.png\" }, \"pendant\": { \"pid\": 0, \"name\": \"\", \"image\": \"\", \"expire\": 0, \"image_enhance\": \"\", \"image_enhance_frame\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", - "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品...\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":478909651},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.fast_repost\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", - "display": { - "origin": { - "emoji_info": { - "emoji_details": [ - { - "emoji_name": "[打call]", - "id": 510, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[打call]", - "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", - "meta": { - "size": 1 - }, - "mtime": 1648834168 - } - ] - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - } - }, - { - "desc": { - "uid": 37906788, - "type": 1, - "rid": 669022472968542526, - "acl": 0, - "view": 0, - "repost": 0, - "like": 0, - "is_liked": 0, - "dynamic_id": 669022473022341136, - "timestamp": 1654607333, - "pre_dy_id": 669016644742283288, - "orig_dy_id": 669007814298959974, - "orig_type": 2, - "user_profile": { - "info": { - "uid": 37906788, - "uname": "整天就想吃桃子", - "face": "http://i0.hdslb.com/bfs/face/388f29bb0e426d625378b99eec690775467ebb00.jpg", - "face_nft": 0 - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1712073600000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "rank": "10000", - "sign": "", - "level_info": { - "current_level": 5 - } - }, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669022473022341136", - "pre_dy_id_str": "669016644742283288", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669022472968542526", - "origin": { - "uid": 392836434, - "type": 2, - "rid": 196658860, - "acl": 1024, - "view": 46111, - "repost": 1446, - "like": 0, - "dynamic_id": 669007814298959974, - "timestamp": 1654603920, - "pre_dy_id": 0, - "orig_dy_id": 0, - "uid_type": 1, - "stype": 0, - "r_type": 0, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669007814298959974", - "pre_dy_id_str": "0", - "orig_dy_id_str": "0", - "rid_str": "196658860" - }, - "previous": { - "uid": 9617619, - "type": 1, - "rid": 669016644698939384, - "acl": 1024, - "view": 1381, - "repost": 3, - "like": 0, - "dynamic_id": 669016644742283288, - "timestamp": 1654605976, - "pre_dy_id": 669007814298959974, - "orig_dy_id": 669007814298959974, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669016644742283288", - "pre_dy_id_str": "669007814298959974", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669016644698939384" - } - }, - "card": "{ \"user\": { \"uid\": 37906788, \"uname\": \"整天就想吃桃子\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/388f29bb0e426d625378b99eec690775467ebb00.jpg\" }, \"item\": { \"rp_id\": 669022472968542526, \"uid\": 37906788, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉...\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 0, \"label\": { \"path\": \"\", \"text\": \"年度大会员\", \"label_theme\": \"annual_vip\", \"text_color\": \"#FFFFFF\", \"bg_style\": 1, \"bg_color\": \"#FB7299\", \"border_color\": \"\" }, \"avatar_subscript\": 1, \"nickname_color\": \"#FB7299\", \"role\": 3, \"avatar_subscript_url\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/vip\\/icon_Certification_big_member_22_3x.png\" }, \"pendant\": { \"pid\": 0, \"name\": \"\", \"image\": \"\", \"expire\": 0, \"image_enhance\": \"\", \"image_enhance_frame\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", - "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉...\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":37906788},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.fast_repost\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", - "display": { - "origin": { - "emoji_info": { - "emoji_details": [ - { - "emoji_name": "[打call]", - "id": 510, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[打call]", - "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", - "meta": { - "size": 1 - }, - "mtime": 1648834168 - } - ] - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - } - }, - { - "desc": { - "uid": 586724890, - "type": 1, - "rid": 669019754258423810, - "acl": 0, - "view": 0, - "repost": 0, - "like": 0, - "is_liked": 0, - "dynamic_id": 669019754292314181, - "timestamp": 1654606700, - "pre_dy_id": 669016644742283288, - "orig_dy_id": 669007814298959974, - "orig_type": 2, - "user_profile": { - "info": { - "uid": 586724890, - "uname": "雪羽枭白", - "face": "http://i1.hdslb.com/bfs/face/a270f0df9a621d6d7f05a0ff94c64bad5fcb6964.jpg", - "face_nft": 0 - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "rank": "10000", - "sign": "芜湖,起飞~", - "level_info": { - "current_level": 4 - } - }, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669019754292314181", - "pre_dy_id_str": "669016644742283288", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669019754258423810", - "origin": { - "uid": 392836434, - "type": 2, - "rid": 196658860, - "acl": 1024, - "view": 46111, - "repost": 1446, - "like": 0, - "dynamic_id": 669007814298959974, - "timestamp": 1654603920, - "pre_dy_id": 0, - "orig_dy_id": 0, - "uid_type": 1, - "stype": 0, - "r_type": 0, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669007814298959974", - "pre_dy_id_str": "0", - "orig_dy_id_str": "0", - "rid_str": "196658860" - }, - "previous": { - "uid": 9617619, - "type": 1, - "rid": 669016644698939384, - "acl": 1024, - "view": 1381, - "repost": 3, - "like": 0, - "dynamic_id": 669016644742283288, - "timestamp": 1654605976, - "pre_dy_id": 669007814298959974, - "orig_dy_id": 669007814298959974, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "669016644742283288", - "pre_dy_id_str": "669007814298959974", - "orig_dy_id_str": "669007814298959974", - "rid_str": "669016644698939384" - } - }, - "card": "{ \"user\": { \"uid\": 586724890, \"uname\": \"雪羽枭白\", \"face\": \"http:\\/\\/i1.hdslb.com\\/bfs\\/face\\/a270f0df9a621d6d7f05a0ff94c64bad5fcb6964.jpg\" }, \"item\": { \"rp_id\": 669019754258423810, \"uid\": 586724890, \"content\": \"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉落,记得好好蹲守哦~明天15点,2022KPL夏季赛我们不见不散>>>网页链接\", \"ctrl\": \"[{\\\"location\\\":2,\\\"length\\\":7,\\\"data\\\":\\\"9617619\\\",\\\"type\\\":1}]\", \"orig_dy_id\": 669007814298959974, \"pre_dy_id\": 669016644742283288, \"timestamp\": 0, \"at_uids\": [ 9617619 ], \"orig_type\": 2 }, \"origin\": \"{\\\"item\\\":{\\\"at_control\\\":\\\"[{\\\\\\\"location\\\\\\\":0,\\\\\\\"length\\\\\\\":4,\\\\\\\"data\\\\\\\":\\\\\\\"4\\\\\\\",\\\\\\\"type\\\\\\\":2}]\\\",\\\"category\\\":\\\"daily\\\",\\\"description\\\":\\\"互动抽奖 【上B站,看KPL】\\\\r\\\\nKPL首届夏季赛即将来袭,6月8日15:00B站55官方直播间等你来看!你最期待哪场对决呢?更有多位明星主播陪你观赛,趣味吐槽花式解说开赛首日~\\\\r\\\\n\\\\r\\\\n55直播间马超-无双飞将皮肤助力金撒不停,赛事全程天选好礼每局掉落,观赛还能领取游戏内道具!APP端参与直播间【热议】讨论,更有机会获超多奖励。\\\\r\\\\n\\\\r\\\\nKPL赛事征稿开赛日同步上线,带#KPL激励计划#话题投稿,瓜分30万奖金~\\\\r\\\\n战火将燃,谁将勇夺开门红,让我们拭目以待! [打call]\\\\n\\\\n直播间TP:https:\\\\\\/\\\\\\/live.bilibili.com\\\\\\/55 \\\\n赛事预测:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/competition?spm_id_from=444.42.0.0 \\\\n更多比赛:https:\\\\\\/\\\\\\/www.bilibili.com\\\\\\/v\\\\\\/game\\\\\\/match\\\\\\/schedule?mid=0&gid=0&tid=0&time=1639785600000&spm_id_from=444.42.0.0\\\",\\\"id\\\":196658860,\\\"is_fav\\\":0,\\\"pictures\\\":[{\\\"img_height\\\":6758,\\\"img_size\\\":4693.3251953125,\\\"img_src\\\":\\\"https:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/album\\\\\\/d4fd33fe00c80938daf6f14641f15901bc4a0d17.jpg\\\",\\\"img_tags\\\":null,\\\"img_width\\\":1080}],\\\"pictures_count\\\":1,\\\"reply\\\":128,\\\"role\\\":[],\\\"settings\\\":{\\\"copy_forbidden\\\":\\\"0\\\"},\\\"source\\\":[],\\\"title\\\":\\\"\\\",\\\"upload_time\\\":1654603920},\\\"user\\\":{\\\"head_url\\\":\\\"http:\\\\\\/\\\\\\/i0.hdslb.com\\\\\\/bfs\\\\\\/face\\\\\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\\\",\\\"name\\\":\\\"哔哩哔哩王者荣耀赛事\\\",\\\"uid\\\":392836434,\\\"vip\\\":{\\\"avatar_subscript\\\":1,\\\"due_date\\\":1661097600000,\\\"label\\\":{\\\"label_theme\\\":\\\"annual_vip\\\",\\\"path\\\":\\\"\\\",\\\"text\\\":\\\"年度大会员\\\"},\\\"nickname_color\\\":\\\"#FB7299\\\",\\\"status\\\":1,\\\"theme_type\\\":0,\\\"type\\\":2,\\\"vip_pay_type\\\":0}}}\", \"origin_extension\": { \"lott\": \"{\\\"lottery_id\\\":96074}\" }, \"origin_extend_json\": \"{\\\"ctrl\\\":[{\\\"data\\\":\\\"4\\\",\\\"length\\\":4,\\\"location\\\":0,\\\"type\\\":2}],\\\"from\\\":{\\\"emoji_type\\\":1,\\\"from\\\":\\\"create.dynamic.web\\\",\\\"verify\\\":{\\\"aegis_enable\\\":true,\\\"asw\\\":{},\\\"cc\\\":{},\\\"csw\\\":{},\\\"dc\\\":{},\\\"gc\\\":{},\\\"ra\\\":{},\\\"sp\\\":{},\\\"sw\\\":{},\\\"ur\\\":{},\\\"verify_first\\\":true}},\\\"like_icon\\\":{\\\"action\\\":\\\"\\\",\\\"action_url\\\":\\\"\\\",\\\"end\\\":\\\"\\\",\\\"end_url\\\":\\\"\\\",\\\"start\\\":\\\"\\\",\\\"start_url\\\":\\\"\\\"},\\\"lott\\\":{\\\"lottery_id\\\":96074},\\\"topic\\\":{\\\"is_attach_topic\\\":1}}\", \"origin_user\": { \"info\": { \"uid\": 392836434, \"uname\": \"哔哩哔哩王者荣耀赛事\", \"face\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/face\\/50de7906e50260c0e596d54ca51687e58ed7a9ba.jpg\", \"face_nft\": 0 }, \"card\": { \"official_verify\": { \"type\": 1, \"desc\": \"哔哩哔哩王者荣耀赛事官方帐号\" } }, \"vip\": { \"vipType\": 2, \"vipDueDate\": 1661097600000, \"vipStatus\": 1, \"themeType\": 0, \"label\": { \"path\": \"\", \"text\": \"年度大会员\", \"label_theme\": \"annual_vip\", \"text_color\": \"#FFFFFF\", \"bg_style\": 1, \"bg_color\": \"#FB7299\", \"border_color\": \"\" }, \"avatar_subscript\": 1, \"nickname_color\": \"#FB7299\", \"role\": 3, \"avatar_subscript_url\": \"http:\\/\\/i0.hdslb.com\\/bfs\\/vip\\/icon_Certification_big_member_22_3x.png\" }, \"pendant\": { \"pid\": 0, \"name\": \"\", \"image\": \"\", \"expire\": 0, \"image_enhance\": \"\", \"image_enhance_frame\": \"\" }, \"rank\": \"10000\", \"sign\": \"哔哩哔哩王者荣耀赛事官方账号\", \"level_info\": { \"current_level\": 6 } } }", - "extend_json": "{\"\":{\"at_mids\":[{\"at_type\":2,\"mid_list\":[9617619]}],\"content\":\"\\/\\/@哔哩哔哩直播:6月8日KPL首届夏季赛火热开赛,明星主播花式解说!开赛首日直播间礼品不定时掉落,记得好好蹲守哦~明天15点,2022KPL夏季赛我们不见不散>>>网页链接\",\"data_type\":2,\"need_send_msg\":true,\"publisher\":586724890},\"ctrl\":[{\"data\":\"9617619\",\"length\":7,\"location\":2,\"type\":1}],\"from\":{\"emoji_type\":1,\"from\":\"create.dynamic.web\",\"verify\":{\"aegis_enable\":true,\"asw\":{},\"cc\":{},\"csw\":{},\"dc\":{},\"gc\":{},\"ra\":{},\"sp\":{},\"sw\":{},\"ur\":{}}},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"}}", - "display": { - "origin": { - "emoji_info": { - "emoji_details": [ - { - "emoji_name": "[打call]", - "id": 510, - "package_id": 1, - "state": 0, - "type": 1, - "attr": 0, - "text": "[打call]", - "url": "http://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", - "meta": { - "size": 1 - }, - "mtime": 1648834168 - } - ] - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - }, - "relation": { - "status": 1, - "is_follow": 0, - "is_followed": 0 - } - } - } - ], - "_gt_": 0 - } -} -``` -</details> - - -## 动态点赞列表 - -> https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/spec_item_likes - -请求方式:GET - -==Attention: 点赞列表总计超过25K部分继续获取可能被限制。== - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------ | ------- | ---- | -|dynamic_id|int64 | 动态id | 必须 | | -|pn|int64 | 页码 | 非必须 | | -|ps|int64 | 每页数量 | 非必须 |该值不得大于20 | - -**json回复:** -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 默认为空 | -| msg | num | 空 | | - -`data`对象: - -| 字段 | 类型 | 用途 | 备注 | -| -------- | ---- | -------------- | ------------ | -|item_likes|list |点赞信息列表主体 | | -| has_more | bool | 是否还有下一页 | 每页最多20条 | -| total_count | int | 总计点赞数 | | -| _gt_ | num | 0 | 作用尚不明确 | - -`data`中的`item_likes`对象: - -由于参数过多,这里不一一列举,请自行参阅其他文件理解。 - -**示例:** - -获取`哔哩哔哩弹幕网`的动态id为`669016644742283288`动态 -```shell -curl -G 'https://api.vc.bilibili.com/dynamic_like/v1/dynamic_like/spec_item_likes' \ ---data-urlencode 'dynamic_id=669016644742283288' -``` - -<details> -<summary>查看响应示例</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "item_likes": [ - { - "uid": 660169578, - "time": 1654946013, - "face_url": "http://i0.hdslb.com/bfs/face/346ce28e99cc0a7d9cc05b0c0951957445cbcb61.jpg", - "uname": "空蓝奇观", - "user_info": { - "uid": 660169578, - "uname": "空蓝奇观", - "face": "http://i0.hdslb.com/bfs/face/346ce28e99cc0a7d9cc05b0c0951957445cbcb61.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1656604800000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "", - "role": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "。。。", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 522318130, - "time": 1654901839, - "face_url": "http://i1.hdslb.com/bfs/face/3159660d82bf0ffc878265cd11f7bb55122848a8.jpg", - "uname": "114514号饼干机器人", - "user_info": { - "uid": 522318130, - "uname": "114514号饼干机器人", - "face": "http://i1.hdslb.com/bfs/face/3159660d82bf0ffc878265cd11f7bb55122848a8.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1655740800000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "", - "role": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 473098535, - "time": 1654874055, - "face_url": "http://i2.hdslb.com/bfs/face/ae37c4c8a7512322186eaf1c1cb170362c604215.jpg", - "uname": "花式送人头的感觉", - "user_info": { - "uid": 473098535, - "uname": "花式送人头的感觉", - "face": "http://i2.hdslb.com/bfs/face/ae37c4c8a7512322186eaf1c1cb170362c604215.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626451200000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 32446, - "name": "EDG战队", - "image": "http://i2.hdslb.com/bfs/garb/item/422c8bd354989845bd9ed64bd00cfa1048e92580.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/422c8bd354989845bd9ed64bd00cfa1048e92580.png", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 297957406, - "time": 1654870870, - "face_url": "http://i1.hdslb.com/bfs/face/c28b431177fa6faffc4b928b9506a7057f002f73.jpg", - "uname": "冷水ensq", - "user_info": { - "uid": 297957406, - "uname": "冷水ensq", - "face": "http://i1.hdslb.com/bfs/face/c28b431177fa6faffc4b928b9506a7057f002f73.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1657036800000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "这个人很神秘,只写了这么点东西", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 384080149, - "time": 1654869742, - "face_url": "http://i1.hdslb.com/bfs/face/74efb9ca3fc68679cb3ddbf331ceffc246f13929.jpg", - "uname": "嵇獬", - "user_info": { - "uid": 384080149, - "uname": "嵇獬", - "face": "http://i1.hdslb.com/bfs/face/74efb9ca3fc68679cb3ddbf331ceffc246f13929.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1583942400000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "这个人很懒,也不知道写什么\n我会一直做自己", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 666484726, - "time": 1654867375, - "face_url": "http://i1.hdslb.com/bfs/face/8e7c02c5d98d8ee52d0643227aed59b4fca1420d.jpg", - "uname": "未未成年累月", - "user_info": { - "uid": 666484726, - "uname": "未未成年累月", - "face": "http://i1.hdslb.com/bfs/face/8e7c02c5d98d8ee52d0643227aed59b4fca1420d.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626624000000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 3 - } - }, - "attend": 0 - }, - { - "uid": 298557818, - "time": 1654865058, - "face_url": "http://i2.hdslb.com/bfs/face/b3bea3c029e4a35788625228a8ffbcec6c00eaea.jpg", - "uname": "爱吃星河的饼干", - "user_info": { - "uid": 298557818, - "uname": "爱吃星河的饼干", - "face": "http://i2.hdslb.com/bfs/face/b3bea3c029e4a35788625228a8ffbcec6c00eaea.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1603209600000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "规矩,既是束缚,也是保护。", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 431901641, - "time": 1654845296, - "face_url": "http://i2.hdslb.com/bfs/face/88bf1a1c0cbbdf39032fa766e0b2324716b5315e.jpg", - "uname": "水粉墨殇", - "user_info": { - "uid": 431901641, - "uname": "水粉墨殇", - "face": "http://i2.hdslb.com/bfs/face/88bf1a1c0cbbdf39032fa766e0b2324716b5315e.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1655740800000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 5305, - "name": "明日方舟音律系列", - "image": "http://i2.hdslb.com/bfs/garb/item/615a1653281141ddf64cbb98c792ddaee78f7f40.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/516ecdf2d495a62f1bac31497c831b711823140c.webp", - "image_enhance_frame": "http://i2.hdslb.com/bfs/garb/item/c0751afbf950373c260254d02768eabf30ff3906.png" - }, - "sign": "", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 670417135, - "time": 1654833667, - "face_url": "http://i1.hdslb.com/bfs/face/f8fddf339016be034736c45714b52fbb148d5252.jpg", - "uname": "阿布不喜欢我", - "user_info": { - "uid": 670417135, - "uname": "阿布不喜欢我", - "face": "http://i1.hdslb.com/bfs/face/f8fddf339016be034736c45714b52fbb148d5252.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1626451200000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 339203848, - "time": 1654798783, - "face_url": "http://i1.hdslb.com/bfs/face/6bead07c483681db51d519aed8b8d00de265e8ae.jpg", - "uname": "XD君233", - "user_info": { - "uid": 339203848, - "uname": "XD君233", - "face": "http://i1.hdslb.com/bfs/face/6bead07c483681db51d519aed8b8d00de265e8ae.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1620748800000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "大爱火柴人,我的世界和一些求生枪战游戏", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 199624899, - "time": 1654792330, - "face_url": "http://i0.hdslb.com/bfs/face/59526a5bfbe6985a0741ddaacffaee3c90c5e34a.jpg", - "uname": "猛Pink", - "user_info": { - "uid": 199624899, - "uname": "猛Pink", - "face": "http://i0.hdslb.com/bfs/face/59526a5bfbe6985a0741ddaacffaee3c90c5e34a.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1598112000000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "这个人很神秘,什么都看不了=●ω●=", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 451151619, - "time": 1654791995, - "face_url": "http://i0.hdslb.com/bfs/face/9322b5a5802b5c831b2382afed073f5290be6e38.jpg", - "uname": "七城关", - "user_info": { - "uid": 451151619, - "uname": "七城关", - "face": "http://i0.hdslb.com/bfs/face/9322b5a5802b5c831b2382afed073f5290be6e38.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1655827200000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 6249, - "name": "星座系列:处女座", - "image": "http://i0.hdslb.com/bfs/garb/item/cd82b1c35fe0ea221c4fd56525893bc58ec53300.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/cd82b1c35fe0ea221c4fd56525893bc58ec53300.png", - "image_enhance_frame": "" - }, - "sign": "强迫症", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 375385022, - "time": 1654785903, - "face_url": "http://i2.hdslb.com/bfs/face/fbdfa7917e8f874382f4b42fcccd9c7296461cb9.jpg", - "uname": "想变成魔法少女的笙绘", - "user_info": { - "uid": 375385022, - "uname": "想变成魔法少女的笙绘", - "face": "http://i2.hdslb.com/bfs/face/fbdfa7917e8f874382f4b42fcccd9c7296461cb9.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1643472000000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "希望自己的原创作品可以成为自活过的证明", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 291506521, - "time": 1654782383, - "face_url": "http://i1.hdslb.com/bfs/face/887f13f658cfbee23e3e200fe61755f1a8d5823c.jpg", - "uname": "星が落ちた日", - "user_info": { - "uid": 291506521, - "uname": "星が落ちた日", - "face": "http://i1.hdslb.com/bfs/face/887f13f658cfbee23e3e200fe61755f1a8d5823c.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1673884800000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 4104, - "name": "良辰美景·不问天", - "image": "http://i1.hdslb.com/bfs/garb/item/4dbf08aae75f9479a21db2bb289229b8d71631e1.png", - "expire": 0, - "image_enhance": "http://i1.hdslb.com/bfs/garb/item/253bf41272ddef301c1f6a0361abd49d772bfafc.webp", - "image_enhance_frame": "http://i1.hdslb.com/bfs/garb/item/c4934a1ffdb3865fe79b319de439af3973b53ec9.png" - }, - "sign": "一时摸鱼一时爽,一直摸鱼一直爽!", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 179333519, - "time": 1654780391, - "face_url": "http://i2.hdslb.com/bfs/face/89a58c10bf500fb7c9530ba8f28f73208c510d22.jpg", - "uname": "纳眉兹www", - "user_info": { - "uid": 179333519, - "uname": "纳眉兹www", - "face": "http://i2.hdslb.com/bfs/face/89a58c10bf500fb7c9530ba8f28f73208c510d22.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1646496000000, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "人生", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 497821251, - "time": 1654780363, - "face_url": "http://i0.hdslb.com/bfs/face/a7bf301db14cb7fa094dba5f68d13faa7c5798d2.jpg", - "uname": "不器用な・ジョゼ", - "user_info": { - "uid": 497821251, - "uname": "不器用な・ジョゼ", - "face": "http://i0.hdslb.com/bfs/face/a7bf301db14cb7fa094dba5f68d13faa7c5798d2.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1683216000000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 299, - "name": "梦塔·雪谜城", - "image": "http://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/face/c93e1eeb77b1bb0753eff243d49c006bf18d69c5.png", - "image_enhance_frame": "" - }, - "sign": "・花无凋零之日,爱无传达之时,爱情亘古不变,紫罗兰永世长存\n・人活着就是为了樱岛麻衣\nキャ━━━━(゚∀゚)━━━━!!", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - }, - { - "uid": 1054063538, - "time": 1654779485, - "face_url": "http://i2.hdslb.com/bfs/face/bc60a7b5c3b5fd624043050a3ab15e2c4c871803.jpg", - "uname": "贪吃的ZZ", - "user_info": { - "uid": 1054063538, - "uname": "贪吃的ZZ", - "face": "http://i2.hdslb.com/bfs/face/bc60a7b5c3b5fd624043050a3ab15e2c4c871803.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "(ฅ>ω<*ฅ)", - "level_info": { - "current_level": 3 - } - }, - "attend": 0 - }, - { - "uid": 305663999, - "time": 1654777857, - "face_url": "http://i2.hdslb.com/bfs/face/3a2b2f84990ec182af8380ef97db8256c6ecec25.jpg", - "uname": "qw夕颜", - "user_info": { - "uid": 305663999, - "uname": "qw夕颜", - "face": "http://i2.hdslb.com/bfs/face/3a2b2f84990ec182af8380ef97db8256c6ecec25.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 436616802, - "time": 1654776381, - "face_url": "http://i0.hdslb.com/bfs/face/e1ddfcdac95b39217e4710f3605005abfecb53a1.jpg", - "uname": "桐影映江边", - "user_info": { - "uid": 436616802, - "uname": "桐影映江边", - "face": "http://i0.hdslb.com/bfs/face/e1ddfcdac95b39217e4710f3605005abfecb53a1.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1664208000000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "", - "role": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 1990, - "name": "明日方舟", - "image": "http://i0.hdslb.com/bfs/garb/item/0c8e7d627a35c378b757f39419889ef1fcc0ed9b.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/1815c81da71069ea3db4553cad7d233f782da2f2.webp", - "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/ed2b4ef1da228c0b937753542b33af8f04d1d70c.png" - }, - "sign": "追寻着你的身影,从迷失的世界起航,直到深海的尽头~", - "level_info": { - "current_level": 4 - } - }, - "attend": 0 - }, - { - "uid": 266536964, - "time": 1654775142, - "face_url": "http://i2.hdslb.com/bfs/face/b15e60d6e5403075f212d5bd3d30dc0fb3016088.jpg", - "uname": "君九j", - "user_info": { - "uid": 266536964, - "uname": "君九j", - "face": "http://i2.hdslb.com/bfs/face/b15e60d6e5403075f212d5bd3d30dc0fb3016088.jpg", - "rank": "10000", - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1683648000000, - "vipStatus": 1, - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 1293, - "name": "碧蓝航线", - "image": "http://i2.hdslb.com/bfs/face/2508daec59b2aaada2784f26f9c1c28069f28e43.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/face/2508daec59b2aaada2784f26f9c1c28069f28e43.png", - "image_enhance_frame": "" - }, - "sign": "", - "level_info": { - "current_level": 5 - } - }, - "attend": 0 - } - ], - "has_more": 1, - "total_count": 2367, - "_gt_": 0 - } -} -``` - -</details> - -## 获取草稿列表 - -> https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/get_drafts - -请求方式:GET - -认证方式:Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 正常为"0" | -| ttl | num | 1 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | -------- | ---- | -| drafts | array | 草稿列表 | | - -`drafts`列表的每一项: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | -------------------- | ------------------------------------------------------------ | -| draft_id | str | 草稿id | | -| publish_time | num | 定时发送的秒级时间戳 | | -| type | num | 动态类型 | 请参考[获取特定动态卡片信息](get_dynamic_detail.md) | -| uid | num | 自己的mid | | -| user_profile | obj | 自己的用户信息 | 请参考[用户基本信息](../user/info.md) | -| request | str | 动态内容 | 该项为json转成str,内容请参考[发表纯文本动态](publish.md#发表纯文本动态) | diff --git a/docs/dynamic/card_info.md b/docs/dynamic/card_info.md deleted file mode 100644 index 89dcc31..0000000 --- a/docs/dynamic/card_info.md +++ /dev/null @@ -1,604 +0,0 @@ -# 动态卡片信息字段 - -不同动态内容卡片的具体信息。包含在 [获取特定动态卡片信息](get_dynamic_detail.md#获取特定动态卡片信息) 等 API 的 JSON 回复中 - -以card字段的形式出现,内容为一个可被解析为Json对象的字符串。 - -不同类型的动态内容拥有不同的字段。 - -注: 本处 `type` 一般不包含在 `card` 字符串代表的对象内 - -**** - -## 转发动态 (type=1) - -需注意账号转发视频投稿,其他用户的动态以及分享收藏夹等均为转发类内容,并不属于type=4300的收藏类动态等。 - -在type=1的转发类动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| user | obj | 转发者用户信息 | 包含用户名,用户id和头像 | -| item | obj | 转发相关信息 | `content`字段为转发附言 | | -| origin | str | 被转发动态信息 | 即本文档所描述的动态详细信息字段。<br/>动态类型为`item`对象的`orig_type`字段 | -| origin_extend_json | str | 被转发动态补充信息 | | -| origin_user | obj | 被转发用户信息 | | -| activity_infos | obj | 被转发动态参与的活动 | | - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "user": { - "uid": 1704629193, - "uname": "钢板狗的狐", - "face": "https://i0.hdslb.com/bfs/face/443bfd128429f84c0d81c20c4354ea5007f7480c.jpg" - }, - "item": { - "rp_id": 587236631985408400, - "uid": 1704629193, - "content": "#阅机无数#这是什么本子", - "ctrl": "", - "orig_dy_id": 587058081595689300, - "pre_dy_id": 587058081595689300, - "timestamp": 1635565083, - "reply": 0, - "orig_type": 8 - }, - "origin": "{\"aid\":933765713,\"attribute\":0,\"cid\":433047365,\"copyright\":1,\"ctime\":1635523511,\"desc\":\"-\",\"dimension\":{\"height\":1920,\"rotate\":0,\"width\":1080},\"duration\":200,\"dynamic\":\"\",\"first_frame\":\"https:\\/\\/i2.hdslb.com\\/bfs\\/storyff\\/n211029a2nf13h6fhybt231isumtaj9x_firsti.jpg\",\"jump_url\":\"bilibili:\\/\\/video\\/933765713\\/?page=1&player_preload=null&player_width=1080&player_height=1920&player_rotate=0\",\"owner\":{\"face\":\"https:\\/\\/i0.hdslb.com\\/bfs\\/face\\/e4c06054bc9d6c564637f70a7565a6a2d24ee521.jpg\",\"mid\":492755628,\"name\":\"Leojdj\"},\"pic\":\"https:\\/\\/i2.hdslb.com\\/bfs\\/archive\\/8b3bd4387d4041389ba7f02ce813b17f96a7f1e2.jpg\",\"player_info\":null,\"pubdate\":1635523511,\"rights\":{\"autoplay\":1,\"bp\":0,\"download\":0,\"elec\":0,\"hd5\":0,\"is_cooperation\":0,\"movie\":0,\"no_background\":0,\"no_reprint\":1,\"pay\":0,\"ugc_pay\":0,\"ugc_pay_preview\":0},\"short_link\":\"https:\\/\\/b23.tv\\/BV16T4y1R7H9\",\"short_link_v2\":\"https:\\/\\/b23.tv\\/BV16T4y1R7H9\",\"stat\":{\"aid\":933765713,\"coin\":0,\"danmaku\":0,\"dislike\":0,\"favorite\":1,\"his_rank\":0,\"like\":2,\"now_rank\":0,\"reply\":2,\"share\":1,\"view\":70},\"state\":0,\"tid\":95,\"title\":\"试图安装Windows10\",\"tname\":\"数码\",\"up_from_v2\":9,\"videos\":1}", - "origin_extend_json": "{\"\":{\"ogv\":{\"ogv_id\":0}},\"dispute\":{\"content\":\"\"},\"from\":{\"from\":\"\"},\"like_icon\":{\"action\":\"\",\"action_url\":\"\",\"end\":\"\",\"end_url\":\"\",\"start\":\"\",\"start_url\":\"\"},\"topic\":{\"is_attach_topic\":1}}", - "origin_user": { - "info": { - "uid": 492755628, - "uname": "Leojdj", - "face": "https://i0.hdslb.com/bfs/face/e4c06054bc9d6c564637f70a7565a6a2d24ee521.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "vipStatus": 0, - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "rank": "10000", - "sign": "", - "level_info": { - "current_level": 3 - } - }, - "activity_infos": { - "details": [ - { - "type": 1, - "detail": "{\"is_show\":1,\"topic_id\":10511051,\"topic_link\":\"https:\\/\\/member.bilibili.com\\/york\\/punch-card?navhide=1\",\"topic_name\":\"打卡挑战\"}" - } - ] - } -} -``` - -</details> - -## 图片动态 (type=2) - -在type=2的图片动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| item | obj | 图片动态内容 | `description`字段为文字内容<br/>`pictures`字段图片 | | -| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | - - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "item": { - "at_control": "", - "category": "daily", - "description": "#阅机无数#已知这个笔记本的品牌为Dell,隶属于灵越系列,主打外观的设计,目测应该是4代酷睿之前的型号,CPU应该是低压i5/i3,不知道能否找出具体型号", - "id": 172408258, - "is_fav": 0, - "pictures": [ - { - "img_height": 2400, - "img_size": 1425.97998046875, - "img_src": "https://i0.hdslb.com/bfs/album/3716f26eeede4d77874f3eeacd49b0e2e597fcc3.jpg", - "img_tags": null, - "img_width": 1080 - } - ], - "pictures_count": 1, - "reply": 2, - "role": [], - "settings": { - "copy_forbidden": "0" - }, - "source": [], - "title": "", - "upload_time": 1635433727 - }, - "user": { - "head_url": "https://i1.hdslb.com/bfs/face/98f88e00306ac92d30bae013f8295d26bd018093.jpg", - "name": "LostCity失落之城", - "uid": 169216498, - "vip": { - "avatar_subscript": 0, - "due_date": 0, - "label": { - "label_theme": "", - "path": "", - "text": "" - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0, - "vip_pay_type": 0 - } - } -} -``` - -</details> - -## 文字动态 (type=4) - -在type=4的文字动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| item | obj | 文字动态内容 | `description`字段为文字内容 | | -| user | obj | 发布者用户信息 | 包含用户名,用户id和头像 | - - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "user": { - "uid": 403417570, - "uname": "杯子人一君羊", - "face": "https://i1.hdslb.com/bfs/face/cf0772f2e4d76f75ca4c230d9ab1b50012a8bbfa.jpg" - }, - "item": { - "rp_id": 586612173803463700, - "uid": 403417570, - "content": "#阅机无数# 文字题\nthinkpad 09-15年\n触控笔\nenergy star\ncore i5\n[藏狐]", - "ctrl": "", - "orig_dy_id": 0, - "pre_dy_id": 0, - "timestamp": 1635419690, - "reply": 2 - } -} -``` - -</details> - -## 视频投稿动态 (type=8) - -在type=8的视频投稿动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| aid | num | 视频avid | | -| attribute | num | `0` | [可能已弃用](https://shakaianee.top/archives/9/) | -| cid | num | 视频cid | | -| copyright | num | 原创信息 | 1为原创,2为转载 | -| desc | str | 视频简介 | | -| dimension | obj |视频1p分辨率| | -| duration | num | 视频时长 | 单位秒 | -| dynamic | str | 动态文字内容 | | -| first_frame | str | 视频第一帧图片 | 图片链接 | -| jump_url | str | 视频跳转链接 | | -| mission_id | num | 稿件参与的活动id | | -| owner | obj | 动态作者信息 | 即up主 | -| pic | str | 视频封面 | | -| player_info | ? | 可能是播放器信息 | | -| pubdate | num | 发布时间 | 时间戳 | -| rights | obj | 联合投稿,是否付费等信息 | 可能用来代替原`attribute`字段 | -| stat | obj | 视频数据 | 点赞投币等 | -| state | num | 视频状态 | 详情见**属性数据文档** | -| tid | num | 视频分区编号 | | -| title | str | 视频标题 | | -| tname | str | 视频分区名称 | | -| video | num | 视频数| | - - - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "aid": 506318410, - "attribute": 0, - "cid": 432711595, - "copyright": 1, - "ctime": 1635403080, - "desc": "我看谁敢欺负天依依?都别动啊,放那儿让我来!\n好久不写萌歌歌了,耐心心看到结尾,有天依依激萌嚎叫(不\n\n作曲曲/编曲曲/混音音:iKz @Signal-E | 作词词:叫叫与壶壶\n唱歌歌:洛天依 | 调校校:Creuzer\n曲绘绘:pelokio & 贝贝web & 壶芬奇\nPVV:AYWC八毛 @Signal-E\n制作人:iKz\n\n蛀牙牙版:BV1FR4y1n7rt", - "dimension": { - "height": 1080, - "rotate": 0, - "width": 1920 - }, - "duration": 265, - "dynamic": "我看谁敢欺负天依依?都别动啊,放那儿让我来!\n好久不写萌歌歌了,耐心心看到结尾,有洛天依激萌嚎叫(不", - "first_frame": "https://i1.hdslb.com/bfs/storyff/n211029a21oldgobzh2ob1uf3tqav4yy_firsti.jpg", - "jump_url": "bilibili://video/506318410/?page=1&player_preload=null&player_width=1920&player_height=1080&player_rotate=0", - "mission_id": 122069, - "owner": { - "face": "https://i1.hdslb.com/bfs/face/4935c75aecf986c3c129400882ee9c5ceeeec4b5.jpg", - "mid": 25681, - "name": "iKz_茶壶" - }, - "pic": "https://i0.hdslb.com/bfs/archive/06749bfe8b9505b00bd572950615912fecadb513.jpg", - "player_info": null, - "pubdate": 1635501604, - "rights": { - "autoplay": 1, - "bp": 0, - "download": 0, - "elec": 0, - "hd5": 1, - "is_cooperation": 1, - "movie": 0, - "no_background": 0, - "no_reprint": 1, - "pay": 0, - "ugc_pay": 0, - "ugc_pay_preview": 0 - }, - "short_link": "https://b23.tv/BV13u411o7Ht", - "short_link_v2": "https://b23.tv/BV13u411o7Ht", - "stat": { - "aid": 506318410, - "coin": 5490, - "danmaku": 486, - "dislike": 0, - "favorite": 6017, - "his_rank": 0, - "like": 8526, - "now_rank": 0, - "reply": 597, - "share": 568, - "view": 44737 - }, - "state": 0, - "tid": 30, - "title": "【超萌萌洛天依!万圣节原创】嘤嘤大作战【iKz-茶壶壶】", - "tname": "VOCALOID·UTAU", - "videos": 1 -} -``` - -</details> - -## 小视频 (type=16) - -## 戏剧? (type=32) - -## 专栏投稿动态 (type=64) - -在type=64的专栏投稿动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| id | num | 专栏的id,即cv号 | | -| category | obj | 分类号和分类名称 | | -| categories | obj | 分类信息 | | -| title | str | 专栏标题 | | -| summary | str | 专栏简介 | | -| banner_url | str | 头图链接 | | -| template_id | num | 模板信息 | | -| state | num | 专栏状态 | | -| author | obj | 作者信息 | 包含了头像挂件和勋章等 | -| reprint | num | 可能是转载 | | -| image_urls | obj | 图片链接 | | -| publish_time | num | 发布时间 | 时间戳,应该指专栏 | -| ctime | num | 发布时间 | 时间戳,应该指动态 | -| stats | obj | 专栏数据,点赞之类 | 有点踩字段,但并未实装此功能 | -| words | num | 字数 | | -| origin_image_urls | obj | 源图片地址 | | -| list | ? | 可能为文集 | | -| is_like | bool | 是否点赞 | | -| media | obj | 番剧电影相关内容 | 影评的分数,是否有剧透等 | -| apply_time | ? | ? | | -| check_time | ? | ? | | -| original | num | 是否原创 | | -| act_id | num | ? | | -| dispute | ? | 可能为是否争议内容 | | -| authenMark | ? | ? | | -| cover_avid | num | 相关视频id | 例如笔记专栏的原视频 | -| top_video_info | ? | ? | | -| type | num | 可能是专栏类别 | | - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "id": 12457797, - "category": { - "id": 42, - "parent_id": 41, - "name": "全部笔记" - }, - "categories": [ - { - "id": 41, - "parent_id": 0, - "name": "笔记" - }, - { - "id": 42, - "parent_id": 41, - "name": "全部笔记" - } - ], - "title": "【编曲教程】弦乐如何编写?二十分钟学会弦乐基础写法~", - "summary": "点击进入查看全文", - "banner_url": "https://i0.hdslb.com/bfs/archive/9c0f743f0d79bf3f73ea196eced55a9211ef363f.jpg", - "template_id": 4, - "state": 0, - "author": { - "mid": 310236726, - "name": "珞林ltyxh", - "face": "https://i0.hdslb.com/bfs/face/8c4aebb01b3cc34154168be51241b0345f110aeb.webp", - "pendant": { - "pid": 2155, - "name": "洛天依8th生日纪念", - "image": "https://i0.hdslb.com/bfs/garb/item/e98718ae0d09e48bc85df969820b88241bc06883.png", - "expire": 0 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "https://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "https://i2.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数>=1万" - }, - "vip": { - "type": 2, - "status": 1, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299" - } - }, - "reprint": 0, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/banner/6daa4ac60ddec2456bb720dbb4979b07dd705e8a.png" - ], - "publish_time": 1627921161, - "ctime": 1627921161, - "stats": { - "view": 107, - "favorite": 5, - "like": 11, - "dislike": 0, - "reply": 1, - "share": 0, - "coin": 1, - "dynamic": 0 - }, - "words": 225, - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/banner/6daa4ac60ddec2456bb720dbb4979b07dd705e8a.png" - ], - "list": null, - "is_like": false, - "media": { - "score": 0, - "media_id": 0, - "title": "", - "cover": "", - "area": "", - "type_id": 0, - "type_name": "", - "spoiler": 0, - "season_id": 0 - }, - "apply_time": "", - "check_time": "", - "original": 1, - "act_id": 0, - "dispute": null, - "authenMark": null, - "cover_avid": 57337301, - "top_video_info": null, - "type": 2 -} -``` - -</details> - -## 音频投稿动态 (type=256) - -在type=256的音频投稿动态中,解析出的对象包含以下内容: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| id | num | 投稿编号 | 即au号 | -| upId | num | 音乐人id | 与用户uid不同 | -| title | str | 音频标题 | | -| upper | str | 上传者名称 | | -| cover | str | 封面图链接 | | -| author | str | 作者名称 | | -| ctime | num | 上传时间 | 时间戳的后面加了三个0 | -| playCnt | num | 播放量 | | -| intro | str | 音频介绍 | | -| schema | str | 跳转链接 | 似乎并不只是url | -| typeInfo | str | 分区信息 | | -| upperAvatar | str | 上传者的头像链接 | | - -<details> -<summary>查看字段内容示例:</summary> - -```json -{ - "id": 2562895, - "upId": 482834, - "title": "[蓝猫原创伴奏]无衣", - "upper": "NBluecat", - "cover": "https://i0.hdslb.com/bfs/music/1e7c4d04bd405159b66893d4cb68977ddf784b42.jpg", - "author": "NBluecat", - "ctime": 1632115270000, - "replyCnt": 1, - "playCnt": 252, - "intro": "_(:з」∠)_这是无衣的伴奏,非常简单", - "schema": "bilibili://music/detail/2562895?name=%5B%E8%93%9D%E7%8C%AB%E5%8E%9F%E5%88%9B%E4%BC%B4%E5%A5%8F%5D%E6%97%A0%E8%A1%A3&uperName=&cover_url=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Fmusic%2F1e7c4d04bd405159b66893d4cb68977ddf784b42.jpg&upperId=&author=NBluecat", - "typeInfo": "音乐 · 纯音乐/演奏", - "upperAvatar": "https://i2.hdslb.com/bfs/face/d5bf3c9f179803134172ff1c6090ba6b999651c6.jpg" -} -``` - -</details> - -## 番剧 (type=512) - -## ??? (type=1000) - -## ??? (type=1001) - -## ??? (type=1024) - -## H5 活动动态 (type=2048) - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| rid | number | 动态 id | | -| sketch | object | 动态卡片内容 | | -| user | object | 用户信息 | | -| vest | object | 动态正文内容 | | - -`sketch` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cover_url | string | 封面 URL | | -| desc_text | string | 描述文本 | | -| sketch_id | number | 卡片 id | 即动态 id | -| target_url | string | 目标 URL | | -| text | string | 文本? | 空? | -| title | string | 标题 | | - -`user` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| face | string | 头像 URL | | -| uid | number | mid (UID) | | -| uname | string | 用户名 | | - -`vest` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| content | string | 内容 | | -| uid | number | 用户 mid (UID) | | - -**示例:** - -<details> -<summary>查看示例:</summary> - -```json -{ - "rid": 1093384350151475200, - "sketch": { - "cover_url": "https://i0.hdslb.com/bfs/game/65e4fa4b3cf2d177148328e2ff76535500bc563c.png", - "desc_text": "分享了一条动态", - "sketch_id": 1093755435448533000, - "target_url": "https://space.bilibili.com/645769214", - "text": "", - "title": "你好,世界" - }, - "user": { - "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "uid": 645769214, - "uname": "Session小胡" - }, - "vest": { - "content": "[笑哭]", - "uid": 645769214 - } -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-26T01:40:56.464495209Z --> - -## 漫画分享 (type=2049) - -## PGC 番剧 (type=4097) - -## 电影 (type=4098) - -## 电视剧 (type=4099) - -## 国创动漫 (type=4100) - -## 纪录片 (type=4101) - -## 直播 (type=4200) - -## 直播 (type=4201) - -## 收藏夹 (type=4300) - -## 付费课程 (type=4302) - -## 付费课程 (type=4303) - -## 直播 (type=4308) - -## 合集 (type=4310) - -## ??? (type=4311) - -## ??? (type=268435455) diff --git a/docs/dynamic/content.md b/docs/dynamic/content.md deleted file mode 100644 index 5164f4b..0000000 --- a/docs/dynamic/content.md +++ /dev/null @@ -1,1034 +0,0 @@ -# 动态信息 - -## 获取正在直播的已关注者 - -> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | -------- | -| size | num | 每页显示数 | 非必要 | 默认为10 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 默认为0 | -| msg | num | 空 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------- | ------------ | -| count | num | 直播者数量 | | -| group | str | "default" | 作用尚不明确 | -| items | array | 直播者列表 | | -| _gt_ | num | 0 | 作用尚不明确 | - -`data`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 第一位直播者 | | -| n | obj | 第(n+1)位直播者 | | -| …… | obj | …… | …… | - -`data`中的`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | ---- | -| face | str | 直播者头像 | | -| link | str | 直播链接 | | -| title | str | 直播标题 | | -| uid | num | 直播者id | | -| uname | str | 直播者昵称 | | - -**示例:** - -```shell -curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_live_users' \ ---data-urlencode 'size=10' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "count": 4, - "group": "default", - "items": [ - { - "uid": 430774867, - "uname": "AIofficial", - "face": "https://i0.hdslb.com/bfs/face/f9a65c15bd1e9871419e6566aeee891eef420c5b.jpg", - "link": "https://live.bilibili.com/21412734", - "title": "【罚站AI】换装24小时AI直播间唱聊~" - }, - { - "uid": 456664753, - "uname": "央视新闻", - "face": "https://i1.hdslb.com/bfs/face/5a6808606bf1f7a2390b77e14df8d0d1d04680d9.jpg", - "link": "https://live.bilibili.com/21686237", - "title": "8.19中国医师节 一起“医”路同行" - }, - { - "uid": 5755666, - "uname": "可爱的大枣子", - "face": "https://i1.hdslb.com/bfs/face/248428206eca5b9ca34514dc2df54d456fbecb9e.jpg", - "link": "https://live.bilibili.com/2116488", - "title": "早上好" - }, - { - "uid": 290515513, - "uname": "地球频道", - "face": "https://i1.hdslb.com/bfs/face/33b60973ae3608beb27189947b02ccc2164a96d5.jpg", - "link": "https://live.bilibili.com/9196015", - "title": "【直播】从太空看地球" - } - ], - "_gt_": 0 - } -} -``` - -</details> - -## 获取发布新动态的已关注者 - -> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist - -*请求方式:GET* - -认证方式:Cookie(SESSDSTA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------- | ---- | ------------------ | ------ | ---------------- | -| teenagers_mode | num | 是否开启青少年模式 | 非必要 | 否:0<br />是:1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------- | -| code | num | 返回值 | 0:成功<br />-6:未登录 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 默认为0 | -| msg | num | 空 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ----- | ---------- | ------------ | -| button_statement | str | 空 | 作用尚不明确 | -| items | array | 更新者列表 | | -| _gt_ | num | 0 | 作用尚不明确 | - -`data`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 第一位更新者 | | -| n | obj | 第(n+1)位更新者 | | -| …… | obj | …… | …… | - -**示例:** - -```shell -curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/w_dyn_uplist' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "button_statement": "", - "items": [{ - "user_profile": { - "info": { - "uid": 332704117, - "uname": "白上吹雪Official", - "face": "https://i1.hdslb.com/bfs/face/26298b21c4a059d95ee9d009bbdf1dca94da951f.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主、直播签约主播" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1634832000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "hololive一期生,虚拟白发狐狸白上吹雪是也(^・ω・^§)ノ 画师:凪白みと 协力:白上吹雪字幕组 商务合作请私信", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 282994, - "uname": "泠鸢yousa", - "face": "https://i2.hdslb.com/bfs/face/28f95c383f2805dbed32e93007c91ccfda28775f.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 2019百大UP主、直播签约主播" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1649001600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 301, - "name": "实验品家庭", - "image": "https://i1.hdslb.com/bfs/face/6fbee28f782926612eb1ad71d6c8aa7264206fe9.png", - "expire": 0, - "image_enhance": "https://i1.hdslb.com/bfs/face/6fbee28f782926612eb1ad71d6c8aa7264206fe9.png" - }, - "rank": "10000", - "sign": "虚拟艺人团体VirtuaReal Star成员,微博&网易云等搜:泠鸢yousa ", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 13765857, - "uname": "LShang001", - "face": "https://i2.hdslb.com/bfs/face/4bc59f57e6d31fcf868d7e935f643a043dd6b99f.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1599926400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "Excelsior", - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 410527811, - "uname": "WhatOnEarth一探究竟", - "face": "https://i0.hdslb.com/bfs/face/0ef3c74f61c4f5f0ef70ddbf3f1f0ebfed18a1b8.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名科普UP主" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1599494400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "硬核人文科普,精彩社会案例,尽在WOE。", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 519253600, - "uname": "火柴人AlanBecker", - "face": "https://i1.hdslb.com/bfs/face/75e1219501e9ca3e82cad2c4a466fb4b5c7d0557.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "Alan Becker官方帐号,动画UP主" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1594137600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "Alan Becker官方频道", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 293793435, - "uname": "社会易姐QwQ", - "face": "https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1612454400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨,粉丝群:1136462265", - "level_info": { - "current_level": 5, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 5755666, - "uname": "可爱的大枣子", - "face": "https://i1.hdslb.com/bfs/face/248428206eca5b9ca34514dc2df54d456fbecb9e.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1645286400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "檐外清风惊落一池桃花染", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 51270387, - "uname": "挽竹Killer", - "face": "https://i2.hdslb.com/bfs/face/3a9f7b01c8b7d235fa2fa8d761b94520fb82bd20.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1613404800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "(15w粉女装直播嗷)粉丝群:872444546", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 4409391, - "uname": "估读", - "face": "https://i0.hdslb.com/bfs/face/f0d6b44b38eff3ce023b354f692cdb5ae0013772.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1578412800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "关注一下这只硬核up吧~ 脑洞能开,双手能做,立志把硬核内容做得易于食用ヾ(✿゚▽゚)ノ 粉丝群971392670。微博ID“估读酱”", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 70547713, - "uname": "Dr丶寻一", - "face": "https://i1.hdslb.com/bfs/face/fb2f66c64b1de4da329b8ccdbe4cc2db19bab488.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1598025600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 2360, - "name": "#EveOneCat", - "image": "https://i1.hdslb.com/bfs/garb/item/3a6053f073f979a776e02e088dd7dd7694c5b1f3.png", - "expire": 0, - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/6c7f2ccb92627b11101dfbb616524845cac8f216.webp" - }, - "rank": "10000", - "sign": "准备开黑乐谱的坑,有时还会弄点其他的红石音乐。有什么好的黑乐谱可以私信我下载链接,只要是我电脑上的fl能够成功导入,看实际情况施工。", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 591856754, - "uname": "卢正义的雕刻时光", - "face": "https://i0.hdslb.com/bfs/face/5acc7be5c21c1dc7a4d0ebe8d741e60555971029.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1624377600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "我是卢正义,年方二十有七\n初来贵站,还望各位多多关照\n商务合作⭐ JOJOMONO\n木品咨询⭐ lym11336699\n", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 361818130, - "uname": "是田小浪呀", - "face": "https://i1.hdslb.com/bfs/face/917d7f539e24860a52ccca2e8dbf8d6d6ca0e66b.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "", - "level_info": { - "current_level": 3, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 108572682, - "uname": "月下玄月", - "face": "https://i1.hdslb.com/bfs/face/9cb69b21cd23fce7545c441415db17f2d57af159.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1619712000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "QQ1群:701762419;QQ2群:1062508843", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 7450650, - "uname": "超果果mc", - "face": "https://i2.hdslb.com/bfs/face/0202ae8b377d750fe3fbeff4f9b8219b48071ee5.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名游戏UP主、直播签约主播" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1645113600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "希望做出大家看了都会开心的视频 微博@超果果mc 商业合作加qq:169113409", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 4958429, - "uname": "Mukyo木西", - "face": "https://i0.hdslb.com/bfs/face/15c9b8360e524332a61b998360dd4958e0d1fd31.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 1, - "vipDueDate": 1582992000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "各个音乐平台搜 Mukyo木西。微博@Mukyo木西就是狗狗。", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 26321770, - "uname": "和猫住の", - "face": "https://i2.hdslb.com/bfs/face/a0f1e2e8fa05317c12064b7026a20900bdb25b5a.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1627488000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 303, - "name": "喂,看见耳朵啦", - "image": "https://i1.hdslb.com/bfs/face/09f3180cb0a4a0a479045fe4fad705f9b92a82d2.png", - "expire": 0, - "image_enhance": "https://i1.hdslb.com/bfs/face/09f3180cb0a4a0a479045fe4fad705f9b92a82d2.png" - }, - "rank": "10000", - "sign": "年轻人的猫咪救援领养平台,微博/公众号:和猫住 客服v:公众号和猫住菜单“联系我”", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 37556366, - "uname": "NickZhuOfficial", - "face": "https://i0.hdslb.com/bfs/face/e3a45f58368a70c5277af394bb40e32156ca2a23.jpg" - }, - "card": { - "official_verify": { - "type": -1, - "desc": "" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 2248, - "name": "搞笑专属头像挂件", - "image": "https://i2.hdslb.com/bfs/garb/item/bab219d170a1662c26beede8944c6afbc6bc2bb4.png", - "expire": 0, - "image_enhance": "https://i2.hdslb.com/bfs/garb/item/bab219d170a1662c26beede8944c6afbc6bc2bb4.png" - }, - "rank": "10000", - "sign": "鬼畜人", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 438345816, - "uname": "盲人母亲曹世美", - "face": "https://i2.hdslb.com/bfs/face/61111e0fa1ce0e8224b7aa48cc8b4dddc2ec6046.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主" - } - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "来自贵州纳雍大山深处的一家三口,父亲腿脚残疾,母亲看不见,还有一个脑瘫儿子,盲人母亲就这样用她一双手撑起了一个家想了解v:llj104890", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 486633990, - "uname": "我是江无情", - "face": "https://i1.hdslb.com/bfs/face/bf667a09070a9345c881ec8e3e6844d8ecb043ca.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名科普UP主" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1617379200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "一个做视频的,商务请私信微博:我是江无情", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 1 - }, - { - "user_profile": { - "info": { - "uid": 13337125, - "uname": "GoldenEggs", - "face": "https://i0.hdslb.com/bfs/face/11a78303bf3c69a1bf34cab25bb219eeee47961e.jpg" - }, - "card": { - "official_verify": { - "type": 0, - "desc": "bilibili 知名游戏UP主" - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1649865600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "" - }, - "rank": "10000", - "sign": "脑洞区up主,常借助Minecraft平台实现一些好玩的想法 // 创意交流群:871449268/合作QQ:1558854197", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "0" - } - }, - "has_update": 0 - }], - "_gt_": 0 - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/dynamic/detail.md b/docs/dynamic/detail.md deleted file mode 100644 index 2018cea..0000000 --- a/docs/dynamic/detail.md +++ /dev/null @@ -1,2327 +0,0 @@ -# 获取动态详情 - -## 动态详情 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail -> https://api.bilibili.com/x/polymer/web-dynamic/desktop/v1/detail - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) (非必要) - -鉴权方式: Cookie (User-Agent) (必要), [Wbi 签名](../misc/sign/wbi.md) (非必要) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| id | num | 动态 ID | 必要 | | -| timezone_offset | num | -480 | 非必要 | | -| platform | str | 平台 | 非必要 | `web` | -| gaia_source | str | 来源 | 非必要 | `main_web` | -| features | str | 功能 | 必要 | `itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,commentsNewVersion`, 参见 [图文 功能模块](../opus/features.md) | -| web_location | str | `333.1368` | 非必要 | | -| x-bili-device-req-json | obj | 设备信息? | 非必要 | `{"platform":"web","device":"pc"}` | -| x-bili-web-req-json | obj | 请求信息? | 非必要 | `{"spm_id":"333.1368"}` | -| w_rid | str | Wbi 签名 | 不必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 不必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | - -**JSON回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|------|--------------------------| -| code | num | 响应码 | 0: 成功<br/>-352: 风控校验失败<br />500: 服务器错误<br />4101139: 4101139 | -| message | str | | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|-----|-----| -| item | obj | | | - -`data.item`对象: - -参照 [获取动态列表](./all.md#获取动态列表) - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail' \ - -A 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' \ - -b 'SESSDATA=xxxxxx' \ - --url-query 'id=967717348014293017' \ - --url-query 'w_rid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' \ - --url-query 'wts=1724986186' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "item": { - "basic": { - "comment_id_str": "326122895", - "comment_type": 11, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "326122895" - }, - "id_str": "967717348014293017", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "645769214" - }, - "decorate": { - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": { - "color": "", - "color_format": null, - "is_fan": false, - "num_prefix": "", - "num_str": "", - "number": 0 - }, - "id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28&isdiy=0&part=card&from=post&f_source=garb&vmid=645769214&native.theme=1&navhide=1", - "name": "2233娘", - "type": 1 - }, - "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/645769214/dynamic", - "label": "", - "mid": 645769214, - "name": "Session小胡", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "2024年08月20日 19:17", - "pub_ts": 1724152653, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1665158400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知.", - "text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知.", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知." - }, - "major": { - "draw": { - "id": 326122895, - "items": [ - { - "height": 1080, - "size": 1005.29, - "src": "http://i0.hdslb.com/bfs/new_dyn/0f6f939334104ddc347566514fa4bfa7645769214.jpg", - "tags": [], - "width": 1440 - } - ] - }, - "type": "MAJOR_TYPE_DRAW" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "967717348014293017", - "dyn_type": 2, - "rid_str": "326122895" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 34, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 65, - "forbidden": false, - "status": true - } - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - } - } -} -``` - -</details> - -## 动态赞与转发列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/reaction - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -注: 登录任意账号即可, 若不登录则返回数为 0 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| id | num | 动态 id | 必要 | | -| offset | obj | 偏移量 | 非必要 | 用于翻页, 即响应的 `data.offset` | -| web_location | str | 333.1369 | 非必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| has_more | bool | 是否有更多 | | -| items | array | 赞与转发列表 | | -| offset | str | 偏移量 | 套了一层字符串的 JSON 对象, 用于下次请求 | -| total | num | 总数 | | - -`data` 对象中的 `items` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| action | str | 操作类型 | 赞了/转发了 | -| attend | num | 参与数 | 1: 对方仅关注了发送者<br />2: 发送者关注了对方 | -| desc | str | 描述 | | -| face | str | 头像 URL | | -| mid | num | 用户 mid | | -| name | str | 用户名 | | - -**示例:** - -获取动态 `967717348014293017` 的赞与转发列表 - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/reaction' \ ---url-query 'id=967717348014293017' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "has_more": true, - "items": [ - { - "action": "赞了", - "attend": 2, - "desc": "", - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "mid": "293793435", - "name": "社会易姐QwQ" - }, - { - "action": "转发了", - "attend": 2, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/a8c0d532c19085ff14385abb51450d9c32afe93f.jpg", - "mid": "662407339", - "name": "XhuOffice" - }, - { - "action": "赞了", - "attend": 2, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/a8c0d532c19085ff14385abb51450d9c32afe93f.jpg", - "mid": "662407339", - "name": "XhuOffice" - }, - { - "action": "转发了", - "attend": 2, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/2c506dcf0b6507041b0bfafea7505cb1badf6ccd.jpg", - "mid": "616368979", - "name": "淡紫玲儿" - }, - { - "action": "赞了", - "attend": 2, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/2c506dcf0b6507041b0bfafea7505cb1badf6ccd.jpg", - "mid": "616368979", - "name": "淡紫玲儿" - }, - { - "action": "赞了", - "attend": 2, - "desc": "", - "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "mid": "645769214", - "name": "Session小胡" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了3个Up主", - "face": "https://i0.hdslb.com/bfs/face/2ac46bacfdedebf9aecf6415b95dd58636b1e22a.jpg", - "mid": "340463550", - "name": "折耳喵之心" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/ec855a27a42e174521399d7508cece6c0c02c6ff.jpg", - "mid": "628114249", - "name": "at白日梦想家" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了3个Up主", - "face": "https://i1.hdslb.com/bfs/face/81362ba3f99b2702b9746ca7fe67ffc76d3a97c4.jpg", - "mid": "198175", - "name": "傲娇金发黑丝双马尾" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i2.hdslb.com/bfs/face/df1c9bc7d79c84b7227486a944d7a748093fbb31.jpg", - "mid": "1007349302", - "name": "用户9420594" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i0.hdslb.com/bfs/face/f17befd18cab5e157844ab986bd6c60d58d74738.jpg", - "mid": "1180456113", - "name": "人工智能小冰_yoyo" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了2个Up主", - "face": "https://i0.hdslb.com/bfs/face/f1b0ebdf19c2f4b768c5a3e57cbd50e404ad9549.jpg", - "mid": "273008643", - "name": "LV1渡劫失败降到" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i0.hdslb.com/bfs/face/a7732df2624c6a0b6e5856ceb27f3c96598a2fd4.jpg", - "mid": "452290620", - "name": "评论永远比视频精彩" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i0.hdslb.com/bfs/face/cc2ea9088f066b33f24d39434d23aa68cb8ab761.png", - "mid": "91671246", - "name": "樱樱之雪" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了3个Up主", - "face": "http://i1.hdslb.com/bfs/face/d20eae4d6339cef2267b36c1c262ae6466395b64.jpg", - "mid": "340632388", - "name": "天神永恒hb" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了21个Up主", - "face": "https://i0.hdslb.com/bfs/face/368b2a33eed5dc146bd9ab8bf62bc9667653a350.jpg", - "mid": "38120922", - "name": "vgwik" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了2个Up主", - "face": "https://i2.hdslb.com/bfs/face/efbd8bb841ea6340f39854b82d9741f47cb3351e.jpg", - "mid": "691494413", - "name": "熬夜肝不好" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/c46fe783ac7a5291dac4773744b3d35d7cebd77f.jpg", - "mid": "1486540726", - "name": "o_90" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/fece6f971d14fddbddcede65a42edc63d01884d4.jpg", - "mid": "34474963", - "name": "Neko_vecter" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了8个Up主", - "face": "https://i0.hdslb.com/bfs/face/e1d66345bdb6f8c75b782ed5c4b93440860c894d.jpg", - "mid": "88466370", - "name": "没有钱的首富" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了15个Up主", - "face": "https://i0.hdslb.com/bfs/face/f8a6e77e5839e64a7448ddeb7112af86eb47aa48.jpg", - "mid": "14625981", - "name": "龙凌洛" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i2.hdslb.com/bfs/face/18c0bb87fbc8f9fde0d7f92ab88917e517e53df1.jpg", - "mid": "36708269", - "name": "alcoholmole" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i0.hdslb.com/bfs/face/39f0e0ec39e6828b01afc28ad001471d1efa8c66.jpg", - "mid": "52874964", - "name": "黑暗战师" - }, - { - "action": "赞了", - "attend": 1, - "desc": "对方关注了你", - "face": "https://i0.hdslb.com/bfs/face/07d73f7d01c8e8cfb9173d8fe6e40a0c8cb5713d.jpg", - "mid": "702368712", - "name": "-御帝哥哥-" - }, - { - "action": "赞了", - "attend": 0, - "desc": "共同关注了22个Up主", - "face": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "mid": "398095475", - "name": "meipeter" - }, - { - "action": "赞了", - "attend": 0, - "desc": "", - "face": "https://i1.hdslb.com/bfs/face/a4a1566d7218307839345a079651bf58a69a028f.jpg", - "mid": "101358808", - "name": "香香软软的小阿芙" - } - ], - "offset": "{\"page\":2,\"like\":101358808,\"repost\":-1}", - "total": 65 - } -} -``` - -</details> - -## 动态抽奖详情 - -> https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice - -*请求方法: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | -------- | ------ | ---- | -| business_id | num | 动态 id | 必要 | | -| bussiness_type | num | 业务类型? | 必要 | 1: 动态抽奖 | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct 字段) | 不必要 | | -| web_location | str | 333.1330 | 不必要 | | - -<details> -<summary>旧版参数:</summary> - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | -------- | ------ | ---- | -| dynamic_id | num | 动态 id | 必要 | | - -</details> - -**JSON回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| code | num | 返回值 | 0: 成功<br />-9999: 服务系统错误 | -| message | str | 错误信息 | 无则为空串 | -| msg | str | 错误信息 | 无则为空串 | -| data | obj | 信息本体 | 错误时为空对象 | - -`data`对象: - -| 字段名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| lottery_id | num | 抽奖 id | | -| sender_uid | num | 发送者 mid | | -| business_type | num | 业务类型 | 1: 动态抽奖 | -| business_id | num | 业务 id | 可能与请求参数不同 | -| status | num | 抽奖状态 | 0: 未开奖<br />2: 已开奖 | -| lottery_time | num | 开奖时间 | UNIX 秒级时间戳 | -| lottery_at_num | num | at 人数? | | -| lottery_feed_limit | num | 转发限制? | | -| need_post | num | 是否需要发布? | | -| pay_status | num | 支付状态? | | -| first_prize | num | 一等奖数量 | | -| second_prize | num | 二等奖数量 | | -| third_prize | num | 三等奖数量 | | -| ts | num | 发布时间 | UNIX 秒级时间戳 | -| participants | num | 参与人数 | | -| has_charge_right | bool | 是否有充值权? | | -| participated | bool | 是否参与过? | | -| followed | bool | 是否关注过 | | -| reposted | bool | 是否转发过 | | -| lottery_detail_url | str | 抽奖详情页 URL? | | -| first_prize_cmt | str | 一等奖奖品名称 | | -| third_prize_cmt | str | 三等奖奖品名称 | | -| first_prize_pic | str | 一等奖奖品图片 URL | | -| second_prize_pic | str | 二等奖奖品图片 URL | | -| third_prize_pic | str | 三等奖奖品图片 URL | | -| vip_batch_sign | str | ? | | -| prize_type_first | obj | 一等奖奖品类型 | | -| prize_type_second | obj | 二等奖奖品类型 | 无则不存在 | -| prize_type_third | obj | 三等奖奖品类型 | 无则不存在 | -| lottery_result | obj | 抽奖结果 | 无则不存在 | - -`data`对象中的`prize_type_first`对象: - -| 字段名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| type | num | 奖品类型? | 0 | -| value | obj | 奖品价值? | | - -`prize_type_first`对象中的`value`对象: - -| 字段名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| stype | num | 子奖品类型? | 0 | - -`data`对象中的`prize_type_second`对象: - -与 `prize_type_first` 格式相同 - -`data`对象中的`prize_type_third`对象: - -与 `prize_type_first` 格式相同 - -`data`对象中的`lottery_result`对象: - -| 字段名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| first_prize_result | array | 一等奖结果 | | -| second_prize_result | array | 二等奖结果 | 无则不存在 | -| third_prize_result | array | 三等奖结果 | 无则不存在 | - -`lottery_result`对象中的`first_prize_result`数组: - -| 项名 | 类型 | 内容 | 备注 | -| - | - | - | - | -| uid | num | 中奖者 mid | | -| name | str | 中奖者名称 | | -| face | str | 中奖者头像 URL | | -| hongbao_money | num | 奖品金额? | | - -`lottery_result`对象中的`second_prize_result`数组: - -与 `first_prize_result` 格式相同 - -`lottery_result`对象中的`third_prize_result`数组: - -与 `first_prize_result` 格式相同 - -**示例:** - -```shell -curl -G 'https://api.vc.bilibili.com/lottery_svr/v1/lottery_svr/lottery_notice' \ ---url-query 'business_id=969916293954142214' \ ---url-query 'business_type=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "lottery_id": 314834, - "sender_uid": 36081646, - "business_type": 1, - "business_id": 969916293954142214, - "status": 2, - "lottery_time": 1724860800, - "lottery_at_num": 0, - "lottery_feed_limit": 1, - "need_post": 0, - "pay_status": 0, - "first_prize": 1, - "second_prize": 0, - "third_prize": 0, - "ts": 1724922650, - "participants": 9230, - "has_charge_right": false, - "participated": false, - "followed": false, - "reposted": false, - "lottery_detail_url": "", - "first_prize_cmt": "S档门票", - "third_prize_cmt": "", - "first_prize_pic": "", - "second_prize_pic": "", - "third_prize_pic": "", - "vip_batch_sign": "", - "prize_type_first": { - "type": 0, - "value": { - "stype": 0 - } - }, - "lottery_result": { - "first_prize_result": [ - { - "uid": 1014634854, - "name": "lty世界第一吃货殿下", - "face": "https://i0.hdslb.com/bfs/face/c746083b15f6761ea75c602661123e68784c6b1c.jpg", - "hongbao_money": 0 - } - ] - } - }, - "message": "", - "msg": "" -} -``` - -</details> - -## 动态转发列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/forward - -*请求方法: GET* - -鉴权方式: `User-Agent` 为有效浏览器等 - -<!-- #1343 --> - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | -------- | ------ | ---- | -| id | number | 动态 id | 必要 | | -| offset | string | 偏移 | 不必要 | 来自上一次请求的 `data.offset` | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />4101001: 参数错误<br />-352: 风控校验失败 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| has_more | boolean | 是否有更多数据 | | -| items | object[] | 转发列表 | | -| offset | string | 下一页偏移 | 用于下一次请求 | -| total | number | 总数 | | - -`data.items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | object | 描述 | | -| id_str | string | 进行转发的动态 id | | -| pub_time | string | 发布时间 | | -| user | object | 用户 | | - -`data.items[].desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| rich_text_nodes | object[] | 富文本节点 | 参见 [富文本节点](../opus/rich_text_nodesmd) | -| text | string | 纯文本 | | - -`data.items[].user` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| face | string | 头像 URL | | -| face_nft | boolean | 是否为 NFT 头像 | | -| mid | number | 用户 mid (UID) | | -| name | string | 用户名 | | -| official | object | 认证信息 | | -| pendant | object | 装扮信息 | | -| vip | object | 大会员信息 | | - -`data.items[].user.official` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | string | | | -| role | number | | | -| title | string | | | -| type | number | | | - -`data.items[].user.pendant` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| expire | number | | | -| image | string | | | -| image_enhance | string | | | -| image_enhance_frame | string | | | -| n_pid | number | | | -| name | string | | | -| pid | number | | | - -`data.items[].user.vip` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| avatar_icon | object | | | -| avatar_subscript | number | | | -| avatar_subscript_url | string | | | -| due_date | number | | | -| label | object | | | -| nickname_color | string | | | -| role | number | | | -| status | number | | | -| theme_type | number | | | -| tv_due_date | number | | | -| tv_vip_pay_type | number | | | -| tv_vip_status | number | | | -| type | number | | | -| vip_pay_type | number | | | - -`data.items[].user.vip.avatar_icon` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| icon_resource | object | | | - -`data.items[].user.vip.avatar_icon.icon_resource` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`data.items[].user.vip.label` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| bg_color | string | | | -| bg_style | number | | | -| border_color | string | | | -| img_label_uri_hans | string | | | -| img_label_uri_hans_static | string | | | -| img_label_uri_hant | string | | | -| img_label_uri_hant_static | string | | | -| label_theme | string | | | -| path | string | | | -| text | string | | | -| text_color | string | | | -| use_img_label | boolean | | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/forward' \ ---url-query 'id=1091904489085993012' \ --A 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "has_more": true, - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "恭喜恭喜​//", - "text": "恭喜恭喜​//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce ", - "rid": "485703766", - "text": "@英伟达GeForce ", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "恭喜恭喜​//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092279955170000920", - "pub_time": "1分钟前", - "user": { - "face": "https://i2.hdslb.com/bfs/face/c831cf26f1012338306a178d70a436a7ac2d79fb.jpg", - "face_nft": false, - "mid": 58964126, - "name": "see_ka", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1699977600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092279895003758596", - "pub_time": "1分钟前", - "user": { - "face": "https://i2.hdslb.com/bfs/face/d62d4f1d1e8e74a5bc3befd1367c0e0cace13390.jpg", - "face_nft": false, - "mid": 3546652805696378, - "name": "小大宙", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "许愿幸运呀嘿嘿,加油加油", - "text": "许愿幸运呀嘿嘿,加油加油", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/garb/c2cb4128fd28a727b4aec120e26adc4adf0f4e75.png", - "size": 2, - "text": "[Akie秋绘七周年_阳光可爱]", - "type": 3 - }, - "orig_text": "[Akie秋绘七周年_阳光可爱]", - "text": "[Akie秋绘七周年_阳光可爱]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/garb/c2cb4128fd28a727b4aec120e26adc4adf0f4e75.png", - "size": 2, - "text": "[Akie秋绘七周年_阳光可爱]", - "type": 3 - }, - "orig_text": "[Akie秋绘七周年_阳光可爱]", - "text": "[Akie秋绘七周年_阳光可爱]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "​//", - "text": "​//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce ", - "rid": "485703766", - "text": "@英伟达GeForce ", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "许愿幸运呀嘿嘿,加油加油[Akie秋绘七周年_阳光可爱][Akie秋绘七周年_阳光可爱]​//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092279663073427464", - "pub_time": "2分钟前", - "user": { - "face": "https://i2.hdslb.com/bfs/face/2286199120c79b81bd77f1c21849288a656e52d3.webp", - "face_nft": false, - "mid": 1627169000, - "name": "咚咚咚巴拉嘎嘎", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092278962995855364", - "pub_time": "5分钟前", - "user": { - "face": "https://i0.hdslb.com/bfs/face/b829e7e3a9e7b1dc8e2fb0486ddcd60e61ca9bca.jpg", - "face_nft": false, - "mid": 3493274574654105, - "name": "雷冬冬加油呀", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092278920047230984", - "pub_time": "5分钟前", - "user": { - "face": "https://i1.hdslb.com/bfs/face/97630265e04024f6ae169ffc513480821058fe10.jpg", - "face_nft": false, - "mid": 612768016, - "name": "宇宙尽头是被窝", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092278580747960353", - "pub_time": "6分钟前", - "user": { - "face": "https://i0.hdslb.com/bfs/face/a5ae348d6ab686e17ab0e2acd5a0d12f4908f55f.jpg", - "face_nft": false, - "mid": 1603962291, - "name": "天堂尿壶_全神贯注", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "jump_url": "https://b23.tv/7cYpOev", - "orig_text": "https://b23.tv/7cYpOev", - "text": "网页链接", - "type": "RICH_TEXT_NODE_TYPE_WEB" - }, - { - "orig_text": "\ncncs", - "text": "\ncncs", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/garb/55b2580bd5c24f87d3910ef8bd7bd70bb6bc22de.png", - "size": 2, - "text": "[青春烟火静态表情包_比心心]", - "type": 3 - }, - "orig_text": "[青春烟火静态表情包_比心心]", - "text": "[青春烟火静态表情包_比心心]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/garb/55b2580bd5c24f87d3910ef8bd7bd70bb6bc22de.png", - "size": 2, - "text": "[青春烟火静态表情包_比心心]", - "type": 3 - }, - "orig_text": "[青春烟火静态表情包_比心心]", - "text": "[青春烟火静态表情包_比心心]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "orig_text": "​//", - "text": "​//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce ", - "rid": "485703766", - "text": "@英伟达GeForce ", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "https://b23.tv/7cYpOev\ncncs[青春烟火静态表情包_比心心][青春烟火静态表情包_比心心]​//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092278374586384390", - "pub_time": "7分钟前", - "user": { - "face": "https://i0.hdslb.com/bfs/baselabs/ad8743f86fbf3c0afe80505ef2fcf7c567d99cd5.png", - "face_nft": true, - "mid": 3546570991601673, - "name": "敷料", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/open/e9857ee50a657bf8bc004296d1486522489f9ce9.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/open/e9857ee50a657bf8bc004296d1486522489f9ce9.png", - "image_enhance_frame": "", - "n_pid": 1733371830001, - "name": "元大头像挂件", - "pid": -1794957583 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1724774400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "//", - "text": "//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092277777626824725", - "pub_time": "9分钟前", - "user": { - "face": "https://i0.hdslb.com/bfs/face/3283cc839ebb4f745891ef2b3eb52b608dc6287e.jpg", - "face_nft": false, - "mid": 241814478, - "name": "巧克力糖三角", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1756569600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": " 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092277631582208005", - "pub_time": "10分钟前", - "user": { - "face": "https://i2.hdslb.com/bfs/face/44b28a33ee43080ba8ce3b004f61c6f6a8f84ae2.jpg", - "face_nft": false, - "mid": 385330502, - "name": "LunariaFox", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1671292800000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - } - }, - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "转发动态//", - "text": "转发动态//", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@英伟达GeForce", - "rid": "485703766", - "text": "@英伟达GeForce", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "text": ":热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E8%A3%82%E5%8F%98%E5%A4%A9%E5%9C%B0s1%23", - "orig_text": "#裂变天地s1#", - "text": "#裂变天地s1#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23CS2%23", - "orig_text": "#CS2#", - "text": "#CS2#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23TYLOO%23", - "orig_text": "#TYLOO#", - "text": "#TYLOO#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%23%E4%B8%AD%E5%9B%BD%E5%A4%A9%E7%A6%84%E5%88%9B%E5%8E%86%E5%8F%B2%E5%A4%BA%E5%86%A0%23", - "orig_text": "#中国天禄创历史夺冠#", - "text": "#中国天禄创历史夺冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - } - ], - "text": "转发动态//@英伟达GeForce:热爱从未褪色,拼搏终有回响!\n恭喜 TYLOO 站上了世界冠军的领奖台!\n这就是 GEFORCE,这就是 CS:GO,这就是 TYLOO!\n关注@英伟达GeForce 并转发该条动态内容,我们将抽选 3 位小伙伴获得【100元京东E卡】一张!\n#裂变天地s1##CS2##TYLOO##中国天禄创历史夺冠#" - }, - "id_str": "1092276742539706437", - "pub_time": "13分钟前", - "user": { - "face": "https://i0.hdslb.com/bfs/face/3485b31e66a5edcc35da91daccf92d8374b75109.jpg", - "face_nft": false, - "mid": 261738771, - "name": "ak青旗沽酒", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1721318400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - } - } - ], - "offset": "1092276742539706437", - "total": 1290 - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-22T03:25:21.567940914Z --> - -## 获取动态中图片 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/pic - -*请求方法: GET* - -<!-- #1303 --> - -**URL 参数:** - -| 字段 | 类型 | 内容 | 必要性 | 备注 | -| ---- | ------ | ------- | ------ | ---- | -| id | number | 动态 id | 必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | | -| data | object[] | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | 图片高度 | | -| size | number | 图片大小 | k | -| src | string | 图片 URL | | -| width | number | 图片宽度 | | - -**示例:** - -```shell --curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/pic' \ ---url-query 'id=1092404028147499014' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": [ - { - "height": 20112, - "size": 9609.4560546875, - "src": "http://i0.hdslb.com/bfs/new_dyn/b3ca19b4a65c2f847fa91d925495eb3f36081646.jpg", - "width": 4167 - }, - { - "height": 21146, - "size": 6948.43359375, - "src": "http://i0.hdslb.com/bfs/new_dyn/60b1549d91ce580a8499f63368b283fc36081646.jpg", - "width": 4167 - }, - { - "height": 29531, - "size": 10990.845703125, - "src": "http://i0.hdslb.com/bfs/new_dyn/598a158fff8a5814fe85ae0f9212b1cf36081646.jpg", - "width": 4167 - } - ], - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-23T01:44:31.058550428Z --> - -## 获取转发动态信息 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/forward/item - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**URL 参数:** - -| 字段 | 类型 | 内容 | 必要性 | 备注 | -| ---- | ------ | ------ | ---- | ---- | -| id | number | 动态 id | 必要 | | -| timezone_offset | number | 时区偏移 | 非必要 | `(new Date).getTimezoneOffset()` | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功<br />500: 加载错误,请稍后再试<br />4101105: 请求数据发生错误, 请刷新或稍后重试 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| item | object | 动态信息 | 套了个娃 | - -`data.item` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | object | 动态内容 | | -| id_str | string | 动态 id 字符串 | | -| pub_time | string | 发布时间 | | -| user | object | 发布用户信息 | | - -`data.item.desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| rich_text_nodes | object[] | 富文本节点 | 参见 [富文本节点](../opus/rich_text_node.md) | -| text | string | 纯文本内容 | | - -`data.item.user` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| face | string | 头像 URL | | -| face_nft | boolean | | | -| mid | number | 用户 mid (UID) | | -| name | string | 用户名 | | -| official | object | 认证信息 | | -| pendant | object | 装扮信息 | | -| vip | object | 大会员信息 | | - -`data.item.user.official` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | string | | | -| role | number | | | -| title | string | | | -| type | number | | | - -`data.item.user.pendant` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| expire | number | | | -| image | string | | | -| image_enhance | string | | | -| image_enhance_frame | string | | | -| n_pid | number | | | -| name | string | | | -| pid | number | | | - -`data.item.user.vip` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| avatar_icon | object | | | -| avatar_subscript | number | | | -| avatar_subscript_url | string | | | -| due_date | number | | | -| label | object | | | -| nickname_color | string | | | -| role | number | | | -| status | number | | | -| theme_type | number | | | -| tv_due_date | number | | | -| tv_vip_pay_type | number | | | -| tv_vip_status | number | | | -| type | number | | | -| vip_pay_type | number | | | - -`data.item.user.vip.avatar_icon` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| icon_resource | object | | | -| icon_type | number | | | - -`data.item.user.vip.avatar_icon.icon_resource` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`data.item.user.vip.label` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| bg_color | string | | | -| bg_style | number | | | -| border_color | string | | | -| img_label_uri_hans | string | | | -| img_label_uri_hans_static | string | | | -| img_label_uri_hant | string | | | -| img_label_uri_hant_static | string | | | -| label_theme | string | | | -| path | string | | | -| text | string | | | -| text_color | string | | | -| use_img_label | boolean | | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/detail/forward/item' \ ---url-query 'id=1100082020923473952' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "item": { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "分享视频", - "text": "分享视频", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "分享视频" - }, - "id_str": "1074491510557245446", - "pub_time": "06月04日", - "user": { - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "face_nft": false, - "mid": 293793435, - "name": "社会易姐QwQ", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png", - "n_pid": 2511, - "name": "初音未来13周年", - "pid": 2511 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1770825600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 1640793600, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - } - } - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-08-12T08:52:29.430524983Z --> diff --git a/docs/dynamic/dynamic_enum.md b/docs/dynamic/dynamic_enum.md deleted file mode 100644 index 6e2fa5b..0000000 --- a/docs/dynamic/dynamic_enum.md +++ /dev/null @@ -1,240 +0,0 @@ -# 动态类型对照 - -## 动态类型 - -| 类型 | 说明 | comment_id_str | comment_type |rid_str| 示例 | -| --- | --- | --- | --- | --- | --- | -| DYNAMIC_TYPE_NONE | 无效动态 |||| [716510857084796964](https://t.bilibili.com/716510857084796964) | -| DYNAMIC_TYPE_FORWARD | 动态转发 |动态本身id|17||| -| DYNAMIC_TYPE_AV | 投稿视频 |视频AV号| 1 |视频AV号|| -| DYNAMIC_TYPE_PGC | 剧集(番剧、电影、纪录片) |剧集分集AV号| 1 |剧集分集EP号|| -| DYNAMIC_TYPE_COURSES | ||| || -| DYNAMIC_TYPE_WORD | 纯文字动态 |动态本身id|17|| [718377531474968613](https://t.bilibili.com/718377531474968613) | -| DYNAMIC_TYPE_DRAW | 带图动态 |相簿id|11|相簿id| [718384798557536290](https://t.bilibili.com/718384798557536290) | -| DYNAMIC_TYPE_ARTICLE | 投稿专栏 |专栏cv号|12|专栏cv号| [718372214316990512](https://t.bilibili.com/718372214316990512) | -| DYNAMIC_TYPE_MUSIC | 音乐 | 音频au号 | 14 | 音频au号 | [128788657410273954](https://t.bilibili.com/128788657410273954) | -| DYNAMIC_TYPE_COMMON_SQUARE | 装扮<br/>剧集点评<br/>普通分享 ||17|| [551309621391003098](https://t.bilibili.com/551309621391003098)<br/>[716503778995470375](https://t.bilibili.com/716503778995470375)<br/>[716481612656672789](https://t.bilibili.com/716481612656672789) | -| DYNAMIC_TYPE_COMMON_VERTICAL | ||| || -| DYNAMIC_TYPE_LIVE | 直播间分享 |动态本身id||直播间id| [216042859353895488](https://t.bilibili.com/216042859353895488) | -| DYNAMIC_TYPE_MEDIALIST | 收藏夹 |收藏夹ml号|19|收藏夹ml号| [534428265320147158](https://t.bilibili.com/534428265320147158) | -| DYNAMIC_TYPE_COURSES_SEASON | 课程 |||| [717906712866062340](https://t.bilibili.com/717906712866062340) | -| DYNAMIC_TYPE_COURSES_BATCH | |||| | -| DYNAMIC_TYPE_AD | ||| || -| DYNAMIC_TYPE_APPLET | ||| || -| DYNAMIC_TYPE_SUBSCRIPTION | ||| || -| DYNAMIC_TYPE_LIVE_RCMD | 直播开播 |动态本身id|17|live_id| [718371505648435205](https://t.bilibili.com/718371505648435205) | -| DYNAMIC_TYPE_BANNER | ||| || -| DYNAMIC_TYPE_UGC_SEASON | 合集更新 |视频AV号|1|视频AV号| [718390979031203873](https://t.bilibili.com/718390979031203873) | -| DYNAMIC_TYPE_SUBSCRIPTION_NEW | ||| || - -## 富文本节点类型 - -参见 [图文富文本节点类型](../opus/rich_text_nodes.md#富文本节点类型) - -## 作者类型 - -| 类型 | 说明 | 示例 | -|------------------------|------|-----| -| AUTHOR_TYPE_NONE | | | -| AUTHOR_TYPE_NORMAL | 普通更新 | | -| AUTHOR_TYPE_PGC | 剧集更新 | | -| AUTHOR_TYPE_UGC_SEASON | 合集更新 | | - -## - -| 类型 | 说明 | 示例 | -|-----------------|-----|-----| -| EMOJI_TYPE_NONE | | | -| EMOJI_TYPE_OLD | | | -| EMOJI_TYPE_NEW | | | -| EMOJI_TYPE_VIP | | | - -## 相关内容卡片类型 - -| 类型 | 说明 | 示例 | -|-------------------------|------|--------------------------------------------------------------------------| -| ADDITIONAL_TYPE_NONE | | | -| ADDITIONAL_TYPE_PGC | | | -| ADDITIONAL_TYPE_GOODS | 商品信息 | | -| ADDITIONAL_TYPE_VOTE | 投票 | [716365292050055176](https://t.bilibili.com/716365292050055176) | -| ADDITIONAL_TYPE_COMMON | 一般类型 | 游戏<br/>[716357878942793745](https://t.bilibili.com/716357878942793745) | -| ADDITIONAL_TYPE_MATCH | 比赛信息? | | -| ADDITIONAL_TYPE_UP_RCMD | | | -| ADDITIONAL_TYPE_UGC | 视频跳转 | [716489253410832401](https://t.bilibili.com/716489253410832401) | -| ADDITIONAL_TYPE_RESERVE | | 直播预约<br/>[716524987542929443](https://t.bilibili.com/716524987542929443) | -| ADDITIONAL_TYPE_UPOWER_LOTTERY | 充电专属抽奖 | | - -## - -| 类型 | 说明 | 示例 | -|-------------------------------|-----|-----| -| ADDITIONAL_BUTTON_TYPE_NONE | | | -| ADDITIONAL_BUTTON_TYPE_JUMP | | | -| ADDITIONAL_BUTTON_TYPE_BUTTON | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------------------|-----|-----| -| ADDITIONAL_BUTTON_STATUS_NONE | | | -| ADDITIONAL_BUTTON_STATUS_UNCHECK | | | -| ADDITIONAL_BUTTON_STATUS_CHECK | | | - -## - -| 类型 | 说明 | 示例 | -|-------------------------------|-----|-----| -| ADD_BUTTON_CLICK_TYPE_NONE | | | -| ADD_BUTTON_CLICK_TYPE_RESERVE | | | - -## - -| 类型 | 说明 | 示例 | -|-------------------------|-----|-----| -| DISABLE_STATE_HIGHLIGHT | | | -| DISABLE_STATE_GRAY | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------------|-----|-----| -| ADD_BUTTON_BG_STYLE_FILL | | | -| ADD_BUTTON_BG_STYLE_STROKE | | | -| ADD_BUTTON_BG_STYLE_GRAY | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------------------|-----|-----| -| HIGHLIGHT_TEXT_STYLE_TYPE_NONE | | | -| HIGHLIGHT_TEXT_STYLE_TYPE_ACTIVE | | | - -## 动态主体类型 - -| 类型 | 说明 | 示例 | -|-----------------------------|-------|-----------------------------------------------------------------| -| MAJOR_TYPE_NONE | 动态失效 | [716510857084796964](https://t.bilibili.com/716510857084796964) | -| MAJOR_TYPE_NONE | 转发动态 | [866756840240709701](https://www.bilibili.com/opus/866756840240709701) | -| MAJOR_TYPE_OPUS | 图文动态 | [870176712256651305](https://www.bilibili.com/opus/870176712256651305) | -| MAJOR_TYPE_ARCHIVE | 视频 | [716526237365829703](https://t.bilibili.com/716526237365829703) | -| MAJOR_TYPE_PGC | 剧集更新 | [645981661420322824](https://t.bilibili.com/645981661420322824) | -| MAJOR_TYPE_COURSES | | | -| MAJOR_TYPE_DRAW | 带图动态 | [716358050743582725](https://t.bilibili.com/716358050743582725) | -| MAJOR_TYPE_ARTICLE | | | -| MAJOR_TYPE_MUSIC | 音频更新 | | -| MAJOR_TYPE_COMMON | 一般类型 | [716481612656672789](https://t.bilibili.com/716481612656672789) | -| MAJOR_TYPE_LIVE | 直播间分享 | [267505569812738175](https://t.bilibili.com/267505569812738175) | -| MAJOR_TYPE_MEDIALIST | | | -| MAJOR_TYPE_APPLET | | | -| MAJOR_TYPE_SUBSCRIPTION | | | -| MAJOR_TYPE_LIVE_RCMD | 直播状态 | | -| MAJOR_TYPE_UGC_SEASON | 合计更新 | [716509100448415814](https://t.bilibili.com/716509100448415814) | -| MAJOR_TYPE_SUBSCRIPTION_NEW | | | -| MAJOR_TYPE_UPOWER_COMMON | 充电相关 | [1087983622038749191](https://t.bilibili.com/1087983622038749191) | - -## - -| 类型 | 说明 | 示例 | -|-----------------|-----|-----| -| MEDIA_TYPE_NONE | | | -| MEDIA_TYPE_UGC | | | -| MEDIA_TYPE_PGC | | | -| MEDIA_TYPE_LIVE | | | - -## - -| 类型 | 说明 | 示例 | -|--------------------------|-----|-----| -| PGC_SUB_TYPE_NONE | | | -| PGC_SUB_TYPE_BANGUMI | | | -| PGC_SUB_TYPE_MOVIE | | | -| PGC_SUB_TYPE_DOCUMENTARY | | | -| PGC_SUB_TYPE_DOMESTIC | | | -| PGC_SUB_TYPE_TV | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------|-----|-----| -| DRAW_TAG_TYPE_NONE | | | -| DRAW_TAG_TYPE_COMMON | | | -| DRAW_TAG_TYPE_GOODS | | | -| DRAW_TAG_TYPE_USER | | | -| DRAW_TAG_TYPE_TOPIC | | | -| DRAW_TAG_TYPE_LBS | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------------------|-----|-----| -| MAJOR_COMMON_STYLE_TYPE_NONE | | | -| MAJOR_COMMON_STYLE_TYPE_SQUARE | | | -| MAJOR_COMMON_STYLE_TYPE_VERTICAL | | | - -## - -| 类型 | 说明 | 示例 | -|---------------------|-----|-----| -| RESERVE_TYPE_NONE | | | -| RESERVE_TYPE_RECALL | | | - -## - -| 类型 | 说明 | 示例 | -|--------------------------|-----|-----| -| LIVE_STATE_TYPE_NONE | | | -| LIVE_STATE_TYPE_LIVE | | | -| LIVE_STATE_TYPE_ROTATION | | | - -## - -| 类型 | 说明 | 示例 | -|----------------------------------|-----|-----| -| SUBSCRIPTION_NEW_STYLE_TYPE_NONE | | | -| SUBSCRIPTION_NEW_STYLE_TYPE_DRAW | | | -| SUBSCRIPTION_NEW_STYLE_TYPE_LIVE | | | - -## 右上角三点菜单 - -| 类型 | 说明 | 示例 | -|------------------------------|---------|-----| -| THREE_POINT_DELETE | 删除 | | -| THREE_POINT_REPORT | 举报 | | -| THREE_POINT_FOLLOWING | 关注/取消关注 | | -| THREE_POINT_TOP | 置顶/取消置顶 | | -| THREE_POINT_UNFAV | | | -| THREE_POINT_UNSUBS | | | -| THREE_POINT_TOPIC_REPORT | | | -| THREE_POINT_TOPIC_IRRELEVANT | | | -| THREE_POINT_RCMD_RESOURCE | | | -| THREE_POINT_RCMD_FEEDBACK | | | - -## - -| 类型 | 说明 | 示例 | -|--------------------|-----|-----| -| FOLD_TYPE_NONE | | | -| FOLD_TYPE_PUBLISH | | | -| FOLD_TYPE_FREQUENT | | | -| FOLD_TYPE_UNITE | | | -| FOLD_TYPE_LIMIT | | | - -## - -| 类型 | 说明 | 示例 | -|------------------------------|-----|-----| -| DYN_STATUS_TYPE_NONE | | | -| DYN_STATUS_TYPE_NORMAL | | | -| DYN_STATUS_TYPE_AUDITING | | | -| DYN_STATUS_TYPE_SELF_VISIBLE | | | -| DYN_STATUS_TYPE_DELETED | | | - -## - -| 类型 | 说明 | 示例 | -|---------------|-----|-----| -| SCENE_DETAIL | | | -| SCENE_HOT | | | -| SCENE_GENERAL | | | -| SCENE_SPACE | | | -| SCENE_TOPIC | | | diff --git a/docs/dynamic/get_dynamic_detail.md b/docs/dynamic/get_dynamic_detail.md deleted file mode 100644 index 2457122..0000000 --- a/docs/dynamic/get_dynamic_detail.md +++ /dev/null @@ -1,538 +0,0 @@ -# 特定动态卡片信息 - -## 获取特定动态卡片信息 - -> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail - -*请求方法: GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ---------- | ------ | -------- | -| dynamic_id | id | 动态id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | number | 返回值 | 0: 成功<br />4128001: 请求数据发生错误,请刷新或稍后重试 | -| data | object | 信息本体 | 失败时为 `null` | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------- | ------------ | -| card | object | 动态卡片内容 | 当动态不存在/删除时不返回此项 | - -`data`中的`card`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| activity_infos | obj | 该条动态参与的活动 |当此条动态没有参与任何活动时不显示此项 | -| card | str | 动态详细信息 | 会跟随此动态类型不同发生一定的变化,评论数、点赞数等相关信息参考`desc`字段, 详细可见 [动态详细信息字段](card_info.md) | -| desc | obj | 动态相关信息 | 会跟随此动态类型不同发生一定的变化,详细信息(例如动态描述等)参考`card`字段 | -| display | obj | 动态部分的可操作项 | 会随着动态类型发生变化,主要用于显示动态 | -| extend_json | str | 动态扩展项 | 会随着动态类型发生变化 | - -**示例:** - -获取`哔哩哔哩弹幕网`的动态id为`507420325550127049`动态 - -```shell -curl -G 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail' \ ---data-urlencode 'dynamic_id=507420325550127049' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "card": { - "desc": { - "uid": 8047632, - "type": 8, - "rid": 204774719, - "acl": 0, - "view": 0, - "repost": 0, - "comment": 0, - "like": 0, - "is_liked": 0, - "dynamic_id": 507420325550127040, - "timestamp": 1616981401, - "pre_dy_id": 0, - "orig_dy_id": 0, - "orig_type": 0, - "user_profile": { - "info": { - "uid": 8047632, - "uname": "哔哩哔哩弹幕网", - "face": "https://i0.hdslb.com/bfs/face/0c84b9f4ad546d3f20324809d45fc439a2a8ddab.jpg" - }, - "card": { - "official_verify": { - "type": -1 - } - }, - "vip": { - "vipType": 2, - "vipDueDate": 1924963200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "十年大会员", - "label_theme": "ten_annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 7, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "rank": "10000", - "sign": "哔哩哔哩 干杯 ( ゜- ゜)つロ", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": "" - } - }, - "spec_type": 0, - "uid_type": 1, - "stype": 0, - "r_type": 1, - "inner_id": 0, - "status": 1, - "dynamic_id_str": "507420325550127049", - "pre_dy_id_str": "0", - "orig_dy_id_str": "0", - "rid_str": "204774719", - "origin": null, - "bvid": "BV1Dh411S7sS", - "previous": null - }, - "card": "{\"aid\":204774719,\"cid\":316514988,\"ctime\":1616981401,\"desc\":\"2021年3月29日9:30(北京时间),B站在中国香港港交所成功挂牌二次上市。欢迎来到bilibili这座乐园,和超过2亿中国年轻人一起表达自我、拥抱世界。\",\"dimension\":{\"height\":1080,\"rotate\":0,\"width\":1920},\"duration\":290,\"dynamic\":\"\",\"first_frame\":\"\",\"jump_url\":\"bilibili://video/204774719/?page=1\\u0026player_width=1920\\u0026player_height=1080\\u0026player_rotate=0\",\"owner\":{\"face\":\"https://i0.hdslb.com/bfs/face/0c84b9f4ad546d3f20324809d45fc439a2a8ddab.jpg\",\"mid\":8047632,\"name\":\"哔哩哔哩弹幕网\"},\"pic\":\"http://i0.hdslb.com/bfs/archive/bcbcac6560268ef9cbe59fbf759ac28adf5e0432.jpg\",\"pubdate\":1616981400,\"short_link_v2\":\"\",\"stat\":{\"aid\":204774719,\"coin\":9016,\"danmaku\":742,\"dislike\":0,\"favorite\":5463,\"like\":32802,\"reply\":1603,\"share\":2517,\"view\":278278},\"state\":0,\"tid\":207,\"title\":\"欢迎来到2亿年轻人的乐园——bilibili 回香港上市啦!\",\"tname\":\"财经商业\",\"videos\":1}", - "extend_json": "{\"from\":{\"from\":\"\",\"emoji_type\":1},\"ctrl\":null,\"lott\":null}", - "display": { - "origin": null, - "usr_action_txt": "投稿了视频", - "relation": null, - "live_info": null, - "emoji_info": null, - "highlight": null - } - } - } -} -``` - -</details> - -## 最近更新UP主列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/portal - -*请求方式:GET* - -*认证方式:Cookie(SESSDATA) 和 Access_Token* - -**json回复:** - -*根对象* - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | ---- | ---- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | 默认为0 | -| ttl | int | 1 | 默认为1 | - -`data`对象 - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------- | --- | -| live_users | null | 不明 | | -| my_info | obj | 个人关注的一些信息 | | -| up_list | array | 最近更新的up主列表 | | - -`my_info`对象 - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ----------- | ---- | -| dyns | int | 个人动态 | | -| face | str | 头像 | 图像地址 | -| face_nft | int | 不明 | | -| follower | int | 粉丝数量 | | -| following | int | 我的关注 | | -| level_info | obj | 本人等级内容 | | -| mid | int | 账户mid | | -| name | str | 账户名称 | | -| offcial | obj | 认证信息 | | -| space_bg | str | 账户个人中心的背景横幅 | 图像地址 | -| vip | obj | vip信息 | | - -`my_info`中的`level_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | --- | ---- | ---------- | -| current_level | num | 当前等级 | 0-6级 | -| current_min | num | 0 | | -| current_exp | num | 0 | | -| next_exp | num | 0 | | - -`my_info`中的`Official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | --- | ---- | ------------------------------------- | -| role | num | 认证类型 | 见[用户认证类型一览](../user/official_role.md) | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 是否认证 | -1:无<br />0:认证 | - -`my_info`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | --- | --------- | -------------------------------------------- | -| type | num | 会员类型 | 0:无<br />1:月大会员<br />2:年度及以上大会员 | -| status | num | 会员状态 | 0:无<br />1:有 | -| due_date | num | 会员过期时间 | Unix时间戳(毫秒) | -| vip_pay_type | num | 支付类型 | 0:未支付(常见于官方账号)<br />1:已支付(以正常渠道获取的大会员均为此值) | -| theme_type | num | 0 | 作用尚不明确 | -| label | obj | 会员标签 | | -| avatar_subscript | num | 是否显示会员图标 | 0:不显示<br />1:显示 | -| nickname_color | str | 会员昵称颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 | -| role | num | 大角色类型 | 1:月度大会员<br/>3:年度大会员<br/>7:十年大会员<br/>15:百年大会员 | -| avatar_subscript_url | str | 大会员角标地址 | | -| tv_vip_status | num | 电视大会员状态 | 0:未开通 | -| tv_vip_pay_type | num | 电视大会员支付类型 | | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------------- | -| path | str | 空 | 作用尚不明确 | -| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | -| label_theme | str | 会员标签 | vip:大会员<br />annual_vip:年度大会员<br />ten_annual_vip:十年大会员<br />hundred_annual_vip:百年大会员<br/>fools_day_hundred_annual_vip:最强绿鲤鱼 | -| text_color | str | 会员标签 | | -| bg_style | num | 1 | | -| bg_color | str | 会员标签背景颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 | -| border_color | str | 会员标签边框颜色 | 未使用 | -| use_img_label | bool | `true` | | -| img_label_uri_hans | str | `空串` | | -| img_label_uri_hant | str | `空串` | | -| img_label_uri_hans_static | str | 大会员牌子图片 | 简体版 | -| img_label_uri_hant_static | str | 大会员牌子图片 | 繁体版 | - -`data`中的`up_list`数组对象 - -| 字段 | 属性 | 内容 | 备注 | -| ----------------- | ---- | --------- | --- | -| face | str | UP主头像 | | -| has_update | bool | 最近更新是否更新? | | -| is_reserve_recall | bool | 不明 | | -| mid | int | UP主mid | | -| uname | str | up主昵称 | | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "live_users": null, - "my_info": { - "dyns": 67, - "face": "http://i0.hdslb.com/bfs/face/44253f4e588d72d4c10dde495752142b588455af.jpg", - "face_nft": 0, - "follower": 15, - "following": 77, - "level_info": { - "current_exp": 23846, - "current_level": 5, - "current_min": 10800, - "level_up": -62135596800, - "next_exp": 28800 - }, - "mid": 108534711, - "name": "CiaoMyTime", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "space_bg": "http://i1.hdslb.com/bfs/space/aea2dd7b8894ce31d578d4fad6a7188c7b49cb2f.jpg", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1670256000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/3788b674c69072f1ee252b79a31ecc8c43af3039.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/jwXBWRVwa5.png", - "label_theme": "vip", - "path": "", - "text": "大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "", - "role": 1, - "status": 1, - "theme_type": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - }, - "up_list": [ - { - "face": "https://i2.hdslb.com/bfs/face/09a47992c9cb08f81effede594ddf014f83047fe.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 15135791, - "uname": "东北大学张引" - }, - { - "face": "https://i1.hdslb.com/bfs/face/a83b296101bb36a6f1dacb8fdfa74a57a2c29445.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 1856528671, - "uname": "陆鳐LuLu" - }, - { - "face": "https://i0.hdslb.com/bfs/face/60ec600cc9d84c74c8220ab41ce49bacfdc0895c.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 39180492, - "uname": "蒸気火鸡" - }, - { - "face": "https://i0.hdslb.com/bfs/face/986a9f29848d17b39a99e41557d56dcd1091a3a9.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 2142762, - "uname": "老戴在此" - }, - { - "face": "https://i1.hdslb.com/bfs/face/475f3c05ea494a26f5dd91b277f48b136ae63021.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 431313625, - "uname": "小蓝和他的朋友日常号" - }, - { - "face": "https://i1.hdslb.com/bfs/face/bafb36d5726f8062e578474095abb0e906fec163.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 233114659, - "uname": "碧蓝航线" - }, - { - "face": "https://i0.hdslb.com/bfs/face/39d23f3c5dd2c96fc35db5c2a98f4a8ff73a2d46.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 27534330, - "uname": "崩坏3第一偶像爱酱" - }, - { - "face": "http://i2.hdslb.com/bfs/face/f119348814f30c6bbbcc60bd63c12b8215d19d2f.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 524704055, - "uname": "大庆赶海" - }, - { - "face": "https://i0.hdslb.com/bfs/face/c4340d477356ba108098ba9a566e7ce4a54e0936.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 194326389, - "uname": "兮子cc" - }, - { - "face": "https://i2.hdslb.com/bfs/face/0455b74f73d6a83eef2d6dfbdb4ae2beda42a3ce.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 476833439, - "uname": "盾之勇者成名录" - }, - { - "face": "https://i0.hdslb.com/bfs/face/7c6cdd77937d4bbd2171241fe530e18c0c5bc58e.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 492840942, - "uname": "云视听小电视-TV" - }, - { - "face": "https://i0.hdslb.com/bfs/face/b14881845b777d925876f24cb46b1dc1ad5a0e27.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 1636034895, - "uname": "绝区零" - }, - { - "face": "http://i1.hdslb.com/bfs/face/3b933fe3c47976dd29f30e3a4f7f2bdfd99e8b08.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 603028270, - "uname": "乃木坂46官方" - }, - { - "face": "https://i2.hdslb.com/bfs/face/76ec72b2a530f2f24209c98b5690ef7b536040cf.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 5992670, - "uname": "云之幻" - }, - { - "face": "https://i1.hdslb.com/bfs/face/9ca9ea42fa75d9a651b354a95e8e39f48d8c30d2.jpg", - "has_update": true, - "is_reserve_recall": false, - "mid": 299359111, - "uname": "月圆之夜" - }, - { - "face": "https://i1.hdslb.com/bfs/face/c8c0adce728125167fe44371d451b3dc19a84506.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 79983517, - "uname": "一唐老狮一" - }, - { - "face": "https://i0.hdslb.com/bfs/face/68b4b212d9738c40d8a6a77beb65a6dd4415f81b.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 1861940979, - "uname": "保卫萝卜" - }, - { - "face": "https://i2.hdslb.com/bfs/face/85bab2a17646ccf442d28549e7216fd65c6adeb7.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 2162, - "uname": "GPBeta" - }, - { - "face": "https://i1.hdslb.com/bfs/face/7a41310afc08381ad0451bee8ea07f15fcc411bd.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 508963009, - "uname": "HiiroVTuber" - }, - { - "face": "https://i1.hdslb.com/bfs/face/b085d34fd9d2cd44641ab648cc96e7a3068eb811.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 396848107, - "uname": "不愧是姐姐大人" - }, - { - "face": "https://i0.hdslb.com/bfs/face/3f1496f48a5eb840a974fef0fd7db7a3f225fbe7.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 80304, - "uname": "亚食人" - }, - { - "face": "https://i2.hdslb.com/bfs/face/a7716fec14658ef7365b538fdce0d86eb6123ed4.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 401742377, - "uname": "原神" - }, - { - "face": "https://i0.hdslb.com/bfs/face/81d5201d6095e3802f14094a6906d1a114bc74c7.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 11131476, - "uname": "绫人太太啊" - }, - { - "face": "https://i0.hdslb.com/bfs/face/7d72e58d0ad1b401e4c59960c4b1795efbc57c3a.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 409524162, - "uname": "一线码农聊技术" - }, - { - "face": "https://i0.hdslb.com/bfs/face/5634900a3167310fcd0c6b1102ffc308c68aedd1.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 260054391, - "uname": "CHeems的日常" - }, - { - "face": "https://i2.hdslb.com/bfs/face/81a4c852925b873f42c4971c836a67ea9dd2ef41.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 361469957, - "uname": "软件工艺师" - }, - { - "face": "https://i2.hdslb.com/bfs/face/99e9eb37657f67f547b546b72592d70ab8ce1a4b.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 41059757, - "uname": "刻刻帝TokisakiKuru" - }, - { - "face": "https://i1.hdslb.com/bfs/face/affbd5780e44ec1340f60c5283e81cbee2d9a21a.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 156785512, - "uname": "Swety_Core" - }, - { - "face": "http://i0.hdslb.com/bfs/face/f576c8bd9eb4ec7f7776880581bea2d6c53d1b65.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 298683153, - "uname": "猫和老鼠官方手游" - }, - { - "face": "https://i1.hdslb.com/bfs/face/5161d6bd003c24065c0d0ab2ae2ce7f37f0f607b.jpg", - "has_update": false, - "is_reserve_recall": false, - "mid": 159440647, - "uname": "Uki----" - } - ] - } -} -``` - -</details> diff --git a/docs/dynamic/nav.md b/docs/dynamic/nav.md deleted file mode 100644 index 85a2c24..0000000 --- a/docs/dynamic/nav.md +++ /dev/null @@ -1,1167 +0,0 @@ -# 获取导航栏动态 - -## 获取导航栏动态列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------------- | ---- | ---------- | ------ | ----------------------- | -| update_baseline | num | 更新基线 | 非必要 | 获取新动态时使用 | -| offset | num | 分页偏移量 | 非必要 | 翻页时使用 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------- | -| code | num | 返回值 | 0: 成功 <br />-101: 未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | ---------------------------- | -------------------------------------------------- | -| has_more | bool | 是否有更多数据 | | -| items | array | 数据数组 | | -| offset | str | 偏移量 | 等于`items`中最后一条记录的id<br/>获取下一页时使用 | -| update_baseline | str | 更新基线 | 等于`items`中第一条记录的id_str | -| update_num | num | 本次获取获取到了多少条新动态 | 在更新基线以上的动态条数 | - -`data`对象中`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---------------------------- | -| author | obj | UP主 | 参考 [MODULE_TYPE_AUTHOR](../opus/features.md#module-type-author) | -| cover | str | 封面URL | | -| id_str | str | 动态id | | -| pub_time | str | 发布时间 | 文字表述的相对时间 | -| rid | num | 关联id | 视频即aid | -| title | str | 标题 | | -| type | num | 动态类型 | 8: 视频 | -| visible | bool | 是否可见 | true:可见<br/>false:不可见 | - -**示例:** - -获取导航栏动态列表 - -```shell -curl "https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/nav" \ - -b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "has_more": true, - "items": [ - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/2b9ee4a9c99f1006f3c800c1317f7850ad6f3d0d.jpg", - "jump_url": "//space.bilibili.com/485703766/dynamic", - "mid": 485703766, - "name": "英伟达GeForce", - "official": { - "desc": "", - "role": 3, - "title": "英伟达GeForce官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 2000563200000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 7, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 1 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/d38b239af580eb199b4bbe55d2388cb603f6e917.jpg", - "id_str": "954636836111646759", - "jump_url": "//www.bilibili.com/video/BV181421k7bu/", - "pub_time": "1小时前", - "rid": 1556082150, - "title": "《异环》首曝丨即将支持 NVIDIA DLSS & 光线追踪技术", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/a220f26856924287c9dc4fa59c67ff38a2fcd20c.jpg", - "id_str": "954616624230433048", - "jump_url": "//www.bilibili.com/video/BV1RW421R7pE/", - "pub_time": "2小时前", - "rid": 1856122369, - "title": "【夏色祭×可波】《カタオモイ》请感受这份传达给你的心意【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/1b7e4eaf6696038bb96ff38c6d13a6b3778d6a7c.jpg", - "id_str": "954616624230432996", - "jump_url": "//www.bilibili.com/video/BV15Z421u7MX/", - "pub_time": "2小时前", - "rid": 1156047704, - "title": "Ready for my show!中日16位实力舞见高燃开场《唱》【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/5f22e930d0683b5e8d7a81f75b48fdb0c3a0f2e7.jpg", - "id_str": "954616624229384275", - "jump_url": "//www.bilibili.com/video/BV1hz421q7xP/", - "pub_time": "2小时前", - "rid": 1356132445, - "title": "阿梓×尔东和小明倾情演出《暁の車》带你重温高达经典旋律【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/04b46154e833ea1349c3302f9b9c188a45b016e9.jpg", - "id_str": "954616624228335667", - "jump_url": "//www.bilibili.com/video/BV1LS421R7sr/", - "pub_time": "2小时前", - "rid": 1506089543, - "title": "【Vox Akuma】声之恶魔低音爵士,深情演绎世界名曲【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i0.hdslb.com/bfs/archive/819d73ca191235e89a03c62889073d526b552fc2.jpg", - "id_str": "954616624033300612", - "jump_url": "//www.bilibili.com/video/BV1qM4m127wD/", - "pub_time": "2小时前", - "rid": 1306194854, - "title": "【RAB】全 部 逮 捕!萝 莉 控 的 末 日【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/01dd21a65db17705479ee4ee550a79856847264e.jpg", - "id_str": "954616624020717623", - "jump_url": "//www.bilibili.com/video/BV1rZ421K7yT/", - "pub_time": "2小时前", - "rid": 1156076206, - "title": "【可波×夏色祭】对你一见钟情啦!《5201314》开启绝赞告白【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/d79b28afc3273d5edb211d03ddc70c45999d57f7.jpg", - "fold": { - "ids": [ - "954616624019669009" - ], - "statement": "展开1条相关动态", - "type": 3, - "users": [] - }, - "id_str": "954616624019669032", - "jump_url": "//www.bilibili.com/video/BV1oE421c7XV/", - "pub_time": "2小时前", - "rid": 1656233700, - "title": "【洛天依】来自2024的《霜雪千年》还记否这一曲喜悲霜雪【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/93b809e050e639c9d8e8e379da96a4c2216ae755.jpg", - "jump_url": "//space.bilibili.com/36081646/dynamic", - "mid": 36081646, - "name": "洛天依", - "official": { - "desc": "", - "role": 2, - "title": "2023年度原创音乐、洛天依官方账号", - "type": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1764777600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/d79b28afc3273d5edb211d03ddc70c45999d57f7.jpg", - "id_str": "954616624019669009", - "jump_url": "//www.bilibili.com/video/BV1oE421c7XV/", - "pub_time": "2小时前", - "rid": 1656233700, - "title": "【洛天依】来自2024的《霜雪千年》还记否这一曲喜悲霜雪【BML2024单品】", - "type": 8, - "visible": false - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/cbbbb6e35c7680261a8a1fb3f582e04de14cbb50.jpg", - "id_str": "954616624002891844", - "jump_url": "//www.bilibili.com/video/BV1Fb421H7YQ/", - "pub_time": "2小时前", - "rid": 1806140865, - "title": "【ChiliChill】《我的悲伤是水做的》,描绘雨天的淡蓝色心情【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/b1f8744db9bad8a4a89bd9fa3fab0d128b347edb.jpg", - "id_str": "954616623998697505", - "jump_url": "//www.bilibili.com/video/BV12m421g759/", - "pub_time": "2小时前", - "rid": 1606234911, - "title": "成为挣脱《Cage》的小鸟,露米Lumi深情吟唱人类希望之歌【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/52e82dc68f3cbbb598d27437c33e996718e07924.jpg", - "id_str": "954616623995552002", - "jump_url": "//www.bilibili.com/video/BV181421k74U/", - "pub_time": "2小时前", - "rid": 1556081716, - "title": "型月组曲优雅串烧《若能看到明月》🌙🌙🌙【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i0.hdslb.com/bfs/archive/8558fe6746c43182b25f6a590f47b9673d47ba67.jpg", - "id_str": "954616623994503209", - "jump_url": "//www.bilibili.com/video/BV1jW421d7ce/", - "pub_time": "2小时前", - "rid": 1856192192, - "title": "Finana Ryugu超甜演绎童年回忆《プレパレード》最清纯的恋爱预演~【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i2.hdslb.com/bfs/archive/1ebd8cbd38eb9db9451df9978b20bee445d8fea0.jpg", - "id_str": "954616623993454708", - "jump_url": "//www.bilibili.com/video/BV1cw4m1Y7Zs/", - "pub_time": "2小时前", - "rid": 1106145687, - "title": "元气补给站《MORE!JUMP!MORE!》在BML舞台起跳!【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/bc1de2b7e27a5385e3e913fc552b86b744b49fb8.jpg", - "id_str": "954616623990308904", - "jump_url": "//www.bilibili.com/video/BV1QH4y1w7hC/", - "pub_time": "2小时前", - "rid": 1056107813, - "title": "【星瞳】华丽演绎《迷宮バタフライ》🦋一曲重温童年之梦【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i0.hdslb.com/bfs/archive/63617f9210ab2e996f75e8e2fb46c5dc73aeed35.jpg", - "id_str": "954616623980871832", - "jump_url": "//www.bilibili.com/video/BV1L1421b7XJ/", - "pub_time": "2小时前", - "rid": 1556117158, - "title": "奏响《葬送的破阵曲》,按捺不住战斗的心了!【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i1.hdslb.com/bfs/face/7cabb9c9576b4be8d52004d8a3a5450e5e062070.jpg", - "jump_url": "//space.bilibili.com/403748305/dynamic", - "mid": 403748305, - "name": "BML制作指挥部", - "official": { - "desc": "", - "role": 3, - "title": "Bilibili Macro Link官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1750176000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i0.hdslb.com/bfs/archive/c3c470e309acef1d8c8f2ce79ed753f9bca50879.jpg", - "id_str": "954616623979823254", - "jump_url": "//www.bilibili.com/video/BV1uy411B7Ca/", - "pub_time": "2小时前", - "rid": 1956028036, - "title": "【猫MEME】转生成只能用MEME讲话的平凡上班族【BML2024单品】", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i0.hdslb.com/bfs/face/978ea07f22e54c2e62f01def8e815b59adacc5d0.jpg", - "jump_url": "//space.bilibili.com/407045223/dynamic", - "mid": 407045223, - "name": "二次元的中科院物理所", - "official": { - "desc": "", - "role": 6, - "title": "中国科学院物理研究所官方账号", - "type": 1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1745769600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 1626364800, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/056db2ac79801d853bebcd41c247788d8ccdb795.jpg", - "id_str": "954609313946533894", - "jump_url": "//www.bilibili.com/video/BV1Wz421q7n5/", - "pub_time": "3小时前", - "rid": 1356075945, - "title": "暑期不失约!第六季《科学公开课》震撼来袭!", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "jump_url": "//space.bilibili.com/686127/dynamic", - "mid": 686127, - "name": "籽岷", - "official": { - "desc": "", - "role": 1, - "title": "2023百大UP主、知名游戏UP主", - "type": 0 - }, - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 4845196800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/c16005a5b39164b3536cbd45618a5edd597a1c51.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/Pzrd8zmpQD.png", - "label_theme": "hundred_annual_vip", - "path": "", - "text": "百年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 15, - "status": 1, - "theme_type": 0, - "tv_due_date": 1692288000, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 1 - } - }, - "cover": "http://i1.hdslb.com/bfs/archive/170237c4589a086afd7d62823765de1cc7306555.jpg", - "id_str": "954478850029387784", - "jump_url": "//www.bilibili.com/video/BV1Jz421q7JH/", - "pub_time": "11小时前", - "rid": 1356097140, - "title": "我的世界 冷门原版生物娘化 材质包", - "type": 8, - "visible": true - }, - { - "author": { - "face": "https://i0.hdslb.com/bfs/face/22e6b4f3c9199b6f4397f0d8df916872d677557b.jpg", - "jump_url": "//space.bilibili.com/625267185/dynamic", - "mid": 625267185, - "name": "零度解说", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 0, - "vip_pay_type": 0 - } - }, - "cover": "http://i0.hdslb.com/bfs/archive/6f0397b546ba4da15fcd9a2e06cbcc1f68e5545c.jpg", - "id_str": "954376956212674594", - "jump_url": "//www.bilibili.com/video/BV141421b7sf/", - "pub_time": "昨天 20:30", - "rid": 1556122058, - "title": "快速提升上网速度!免费又好用,适用 Windows 10 /11,非常简单!!(2024) | 零度解说", - "type": 8, - "visible": true - } - ], - "offset": "954376956212674594", - "update_baseline": "954659517801431040", - "update_num": 0 - } -} -``` - -</details> diff --git a/docs/dynamic/publish.md b/docs/dynamic/publish.md deleted file mode 100644 index a86dbab..0000000 --- a/docs/dynamic/publish.md +++ /dev/null @@ -1,555 +0,0 @@ -# 发布动态 - -## 为图片动态上传图片 - -> https://api.bilibili.com/x/dynamic/feed/draw/upload_bfs - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -注意: 非日常类型像素宽高必须大于 420 - -**正文参数 (multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | --------------------- | ------ | ---- | -| file_up | file | 需要上传的图片文件 | 必要 | 格式仅支持 `jpg` `png` `gif` | -| category | string | 图片类型 | 不必要 | daily: 日常 (动态) (默认)<br />draw: 绘画 (画友)<br />cos: 摄影 (COSPLAY) | -| biz | string | | 不必要 | `new_dyn` | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | number | 返回值 | 0: 成功<br />4100001: 参数错误<br />-101: 账号未登录 | -| message | string | 错误信息 | 默认为 `0` | -| data | object | 信息本体 | 成功时为有效信息 | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | -------------- | ---- | -| image_url | string | 已上传图片 URL | | -| image_width | number | 已上传图片宽度 | 像素 | -| image_height | number | 已上传图片高度 | 像素 | -| img_size | number | 已上传图片大小 | k | - -**示例:** - -上传图片 `test.png` 类型为 `日常` - -```shell -curl 'https://api.bilibili.com/x/dynamic/feed/draw/upload_bfs' \ --F 'file_up=@test.png' \ --F 'category=daily' \ --F 'csrf=xxxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "image_url": "http://i0.hdslb.com/bfs/new_dyn/8ad5640045a114b62580614cb512bbc32095498218.png", - "image_width": 73, - "image_height": 71, - "img_size": 6.261 - } -} -``` - -</details> - -## 创建投票 - -> https://api.vc.bilibili.com/vote_svr/v1/vote_svr/create_vote - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -注意: `options` 最少两个, 下标 `n` 从 `0` 开始 - -**正文参数 (multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------------------- | ---- | ---- | ------ | ---- | -| info[title] | string | 投票标题 | 必要 | | -| info[desc] | string | 投票描述 | 非必要 | 可为空 | -| info[type] | number | 投票类型 | 必要 | 0: 文字投票<br />1: 图片投票 | -| info[choice_cnt] | number | 最多选几项 | 必要 | | -| info[duration] | number | 投票持续秒数 | 必要 | 常用:<br/>三天: 259200<br/>七天: 604800<br/>三十天: 2592000 | -| info[options]\[ n ][desc] | string | 第 n 项选项文字内容 | 必要 | | -| info[options]\[ n ][img_url] | strin | 第 n 项选项投票图片 | 非必要 || -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 非必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------- | -| code | number | 返回值 | 0:成功 <br />5100001: 参数错误 | -| msg | string | 错误信息 | 成功为空 | -| message | string | 错误信息 | 跟上面那个一模一样 | -| data | object | 信息本体 | 仅在正确时既`code=0`时为有效信息 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | -------------- | ---- | -| vote_id | number | 投票 id | | -| \_gt\_ | number | 0 | | - -**示例:** - -创建一个标题为 `是否自愿开学` 持续七天的纯文本投票 - -```shell -curl -X POST 'https://api.vc.bilibili.com/vote_svr/v1/vote_svr/create_vote' \ ---data-urlencode 'info[title]=是否自愿开学' \ ---data-urlencode 'info[desc]=问卷调查:自愿开学' \ ---data-urlencode 'info[type]=0' \ ---data-urlencode 'info[choice_cnt]=1' \ ---data-urlencode 'info[duration]=604800' \ ---data-urlencode 'info[options][0][desc]=自愿' \ ---data-urlencode 'info[options][1][desc]=不自愿' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "vote_id": 4947171, - "_gt_": 0 - } -} -``` - -</details> - -## 发表纯文本动态 - -> https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -**正文参数 (multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| dynamic_id | number | 0 | 必要 | | -| type | number | 4 | 必要 | | -| rid | number | 0 | 必要 | | -| content | string | 动态内容 | 必要 | | -| up_choose_comment | number | 0 | 非必要 | | -| up_close_comment | number | 0 | 非必要 | | -| extension | json | 位置信息 | 非必要 | | -| at_uids | string | 动态中 at 到的用户的 uid | 非必要 | 使用逗号`,`分隔 | -| ctrl | array | 特殊格式控制 (如 at 别人时的蓝字体和链接) | 非必要 | | -| csrf_token | string | CSRF Token (即 Cookie 中 bili_jct) | 非必要 | | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 非必要 | | - -`extension` 参数值: - -```jsonc -{ - "emoji_type": 1, - "lbs_cfg": { - "title": "**市", - "poi": "156330200", - "show_title": "**市", - "type": 1, - "address": "**市", - "location": { - "lng": //显示的经度数值, - "lat": //显示的纬度数值 - }, - "distance": 0 - }, - "flag_cfg": {}, - "from_cfg": { - "location": { - "lat": //用户实际纬度数值, - "lng": //用户实际经度数值 - } - } -} -``` - -`ctrl` 数组中的对象: - -| 参数名 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| location | number | 从全文第几个字开始变蓝 | | -| type | number | 1 | 可能 1 代表链接到用户 mid | -| length | number | 这一段变蓝多少字 | | -| data | string | 链接目标 | 被 at 人的 mid | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | number | 返回值 | 0: 成功 | -| message | string | 错误信息 | 成功为空 | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| result | number | 0 | | -| errmsg | string | 像是服务器日志一样的东西 | | -| dynamic_id | number | 动态 id | | -| create_result | number | 1 | | -| dynamic_id_str | string | 动态 id | 字符串格式 | -| \_gt_ | number | 0 | | - -**示例:** - -<details> -<summary>纯文本:</summary> - -```bash -curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create' \ - --data-urlencode 'dynamic_id=0' \ - --data-urlencode 'type=4' \ - --data-urlencode 'rid=0' \ - --data-urlencode 'content=Hello Bug~' \ - --data-urlencode 'up_choose_comment=0' \ - --data-urlencode 'up_close_comment=0' \ - --data-urlencode 'extension={"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' \ - --data-urlencode 'at_uids=' \ - --data-urlencode 'ctrl=[]' \ - --data-urlencode 'csrf_token=de2731532b4ab96bc8536da948932668' \ - --data-urlencode 'csrf=de2731532b4ab96bc8536da948932668' \ - -b 'SESSDATA=******' -``` - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "result": 0, - "errmsg": "; Create dynamic:588320531406678918, res:0, result:1; Push create kafka:0; Push create databus:0; Register comment result:0; Add outbox result:1", - "dynamic_id": 588320531406678918, - "create_result": 1, - "dynamic_id_str": "588320531406678918", - "_gt_": 0 - } -} -``` - -</details> - -<details> -<summary>at 两个人:</summary> - -动态正文 -``` -[热词系列_神仙UP]@暮光小猿wzt @社会易姐QwQ -``` - -at_uids -``` -15858903,293793435 -``` - -ctrl -```json -[ - { "location": 11, "type": 1, "length": 9, "data": "15858903" }, - { "location": 20, "type": 1, "length": 9, "data": "293793435" } -] -``` - -命令 -```bash -curl 'https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/create' \ - --data-urlencode 'dynamic_id': '0' \ - --data-urlencode 'type': '4' \ - --data-urlencode 'rid': '0' \ - --data-urlencode 'content': '[热词系列_神仙UP]@暮光小猿wzt @社会易姐QwQ ' \ - --data-urlencode 'up_choose_comment': '0' \ - --data-urlencode 'up_close_comment': '0' \ - --data-urlencode 'extension': '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' \ - --data-urlencode 'at_uids': '15858903,293793435' \ - --data-urlencode 'ctrl': '[{"location":11,"type":1,"length":9,"data":"15858903"},{"location":20,"type":1,"length":9,"data":"293793435"}]' \ - --data-urlencode 'csrf_token': 'de2731532b4ab96bc8536da948932668' \ - --data-urlencode 'csrf': 'de2731532b4ab96bc8536da948932668' \ - -b 'SESSDATA=******' -``` - -</details> - -## 发表复杂动态 - -> https://api.bilibili.com/x/dynamic/feed/create/dyn - -*请求方法:POST* - -认证方式:Cookie (SESSDATA) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| csrf | string | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | - -**正文参数 (application/json):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| dyn_req | object | 请求本体 | 必要 | | - -`dyn_req` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| attach_card | object | 特殊卡片 | 非必要 | 如直播预约等 | -| content | object | 动态内容 | 非必要 | | -| meta | object | 元信息 | 非必要 | 大概是来源信息 | -| scene | number | 动态类型? | 必要 | 纯文本: 1 (实际同 2)<br/>带图: 2<br />4: 转发 | -| pics | object[] | 携带图片 | 非必要 | 最多九个 | -| topic | object | 话题 | 非必要 | | -| option | object | 互动设置 | 非必要 | 没有此项时默认开启评论区 | -| upload_id | string | 客户端生成的 | 非必要 | 内容为`发送人mid`+`当前秒级时间戳`+`四位随机整数`,中间用`_`隔开 | - -`dyn_req.meta` 对象: - -大概是来源信息, 示例见下 - -```json -{ - "app_meta": { - "from": "create.dynamic.web", - "mobi_app": "web" - } -} -``` - -`dyn_req.content` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ----- | -------------------- | ------ | ---- | -| contents | object[] | 动态组件对象有序数组 | 必要 | | - -`dyn_req.content.contents[]` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| raw_text | string | 文本 | 必要 | | -| type | number | 组件类型 id | 不必要 | 参见 [富文本节点类型](../opus/rich_text_nodes.md) | -| biz_id | string | 动态组件的内容id转字符串 | 不必要 | 参见 [富文本节点类型](../opus/rich_text_nodes.md) | - -`dyn_req.topic` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------- | ------ | -------------------------- | -| from_source | string | 来源id? | 不必要 | 网页版直接选为 `dyn.web.list` | -| from_topic_id | number | 0 | 不必要 | | -| id | number | 话题id | 必要 | | -| name | string | 话题名 | 不必要 | | - -`dyn_req.pics[]` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ----- | ---------------- | ------ | ------------------------------------------------------------ | -| img_height | number | 图高 | 非必要 | 这个东西会直接原封不动传到前端,比如你都写 0 在网页上就看不见了, 但是还会加载 | -| img_width | number | 图宽 | 非必要 | 同上 | -| img_size | float | 图片文件大小(KB) | 非必要 | | -| img_src | string | 图片 URL | 必要 | | - -`dyn_req.option` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------------- | ---- | ------------ | ------ | --------------- | -| up_choose_comment | number | 精选评论flag | 非必要 | 1: 开启 | -| close_comment | number | 关闭评论flag | 非必要 | 同上, 上二选一 | - -`dyn_req.topic` 对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------------ | ------ | -------- | -| from_source | string | `dyn.web.list` | 非必要 | 作用不明 | -| from_topic_id | number | 0 | 非必要 | 作用不明 | -| id | number | 话题id | 必要 | | -| name | string | 话题名 | 非必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | number | 返回值 | 0: 成功<br />-101: 账号未登录<br />4126021: 你没有绑定手机,无法发布动态 | -| message | string | 错误信息 | 成功为空 | -| data | object | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| result | number | 0 | | -| message | string | 错误信息 | | -| dyn_id | number | 动态 id | | -| dyn_id_str | string | 动态 id | 字符串格式 | -| dyn_type | number | 动态类型 | 1: 转发<br />2: 图文 | -| share_window | object | 分享提示 | 当 Cookie 不存在 `buvid3` 时存在 | - -`data.share_window` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| main_title | string | `分享后会获得更多曝光,快去分享吧` | | - -**示例:** - -<details> -<summary>Cookie 带 `buvid3`:</summary> - -动态正文 -``` -Test礼堂丁真,鉴定为一眼丁真 -``` - -带两张一样的图: - -http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png - -然后关闭评论区 - -命令 - -```bash -curl -X POST 'https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf=xxxxx' \ --b 'buvid3=114514;SESSDATA=xxxxx;' \ ---header 'Content-Type: application/json' \ ---data-raw '{ - "dyn_req": { - "content": { - "contents": [ - { - "raw_text": "Test", - "type": 1, - "biz_id": "" - }, - { - "raw_text": "礼堂丁真,鉴定为一眼丁真", - "type": 2, - "biz_id": "1463028352" - } - ] - }, - "pics": [ - { - "img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png", - "img_width": 1368, - "img_height": 1500, - "img_size": 662.6005859375 - }, - { - "img_src": "http://i0.hdslb.com/bfs/new_dyn/322acd0fa92cfa59c0ad70e95ab95476470310172.png", - "img_width": 1368, - "img_height": 1500, - "img_size": 662.6005859375 - } - ], - "option": { - "close_comment": 1 - }, - "scene": 2 - } -}' -``` - -响应: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "dyn_id": 755402172521250838, - "dyn_id_str": "755402172521250838", - "dyn_type": 2, - "dyn_rid": 221621773 - } -} -``` - -</details> - -## 立即发布定时动态 - -> https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/publish_now - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ---- | -| draft_id | file | 定时动态(草稿)id | 必要 | | -| csrf | string | CSRF Token(即 Cookie 中 bili_jct) | 必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------ | -| code | number | 返回值 | 0: 成功 | -| data | object | 信息本体 | 正常为空对象 | -| message | string | 错误消息 | 正常为 `0` | -| ttl | number | 1 | | - -<details> -<summary>查看示例</summary> - - -```bash -curl -X POST 'https://api.vc.bilibili.com/dynamic_draft/v1/dynamic_draft/publish_now' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'draft_id=755409289278914611' \ ---data-urlencode 'csrf=xxx' --b 'SESSDATA=xxxx;' -``` - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> diff --git a/docs/dynamic/space.md b/docs/dynamic/space.md deleted file mode 100644 index a83f3a0..0000000 --- a/docs/dynamic/space.md +++ /dev/null @@ -1,4473 +0,0 @@ -# 用户空间动态 - -## 获取用户空间动态 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space -> -> https://api.bilibili.com/x/polymer/web-dynamic/desktop/v1/feed/space - -*请求方法: GET* - -鉴权方式: -* 未登录: 请求标头 `User-Agent` 字段, `Cookie` 需含 `buvid3`; WBI 签名, `dm_img` 系列风控 -* 已登录: 请求标头 `Cookie` 含有效 `SESSDATA` - -注: 该接口现在有一些奇奇怪怪的校验, 存在一定运气成分, 参见 [#686](https://github.com/SocialSisterYi/bilibili-API-collect/issues/686), 所以建议您还是登录吧~ - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----------------|--------|--------|-----| - | -| offset | string | 分页偏移量 | 不必要 | | -| host_mid | string | 被查询用户 UID (mid) |必要| | -| timezone_offset | number | 时区偏移| 不必要| 默认 `-480` | -| platform | string | 平台 | 不必要 | 如 `web` | -| features | string | 功能 | 不必要 | 留空为空, 默认为 `itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,onlyfansQaCard`, 参见 [功能模块](../opus/features.md#features) | -| web_location | string | `333.1387` | 不必要 | | -| dm_img_switch | number | `0` | 不必要 | 仅登录时存在 | -| dm_img_list | object[] | `dm_img` 系列风控 | 不必要 | 仅未登录时存在 | -| dm_img_str | string | `dm_img` 系列风控 | 不必要 | 仅未登录时存在 | -| dm_cover_img_str | string | `dm_img` 系列风控 | 不必要 | 仅未登录时存在 | -| dm_img_inter | object | `dm_img` 系列风控 | 不必要 | 仅未登录时存在 | -| x-bili-device-req-json | object | `{"platform":"web","device":"pc"}` | 不必要 | | -| x-bili-web-req-json | object | `{"spm_id":"333.1387"}` | 不必要 | | -| w_rid | string | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | number | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**JSON 回复:** - -可参考 [获取动态列表](./all.md#获取动态列表) - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/space?host_mid=2095498218&features=itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,onlyfansQaCard' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>点击查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "has_more": true, - "items": [ - { - "basic": { - "comment_id_str": "349795473", - "comment_type": 11, - "jump_url": "//www.bilibili.com/opus/1063487284684259332", - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "349795473" - }, - "id_str": "1063487284684259332", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "27分钟前", - "pub_ts": 1746450829, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "opus": { - "fold_action": [ - "展开", - "收起" - ], - "jump_url": "//www.bilibili.com/opus/1063487284684259332", - "pics": [ - { - "height": 512, - "live_url": null, - "size": 9.783203125, - "url": "http://i0.hdslb.com/bfs/new_dyn/8bc3298efe55f2fc3949678538ed5fa52095498218.png", - "width": 512 - } - ], - "summary": { - "rich_text_nodes": [ - { - "orig_text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a augue eget sapien ultricies tristique. Integer rutrum convallis elit et vestibulum. Proin porta magna id congue lobortis. Vestibulum et arcu vestibulum, dignissim est ultrices, laoreet lectus. Nam sed sem vehicula, iaculis lorem ac, tempor arcu. Aliquam nec porta sapien. Nam convallis iaculis urna, et varius dolor. Sed non pellentesque enim. Praesent molestie efficitur rutrum. Nunc sit amet tempus nisl, at sodales augue. Nunc eu risus quis eros euismod rhoncus quis at purus. Aliquam vulputate magna non enim dapibus vestibulum. Sed pellentesque leo eget imperdiet viverra. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\nUt porta non ex quis porta. Proin maximus, diam eget commodo tempus, justo libero ultricies ante, feugiat elementum sem ante sit amet magna. Donec auctor arcu sed ligula imperdiet, eget iaculis nunc mollis.", - "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a augue eget sapien ultricies tristique. Integer rutrum convallis elit et vestibulum. Proin porta magna id congue lobortis. Vestibulum et arcu vestibulum, dignissim est ultrices, laoreet lectus. Nam sed sem vehicula, iaculis lorem ac, tempor arcu. Aliquam nec porta sapien. Nam convallis iaculis urna, et varius dolor. Sed non pellentesque enim. Praesent molestie efficitur rutrum. Nunc sit amet tempus nisl, at sodales augue. Nunc eu risus quis eros euismod rhoncus quis at purus. Aliquam vulputate magna non enim dapibus vestibulum. Sed pellentesque leo eget imperdiet viverra. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\nUt porta non ex quis porta. Proin maximus, diam eget commodo tempus, justo libero ultricies ante, feugiat elementum sem ante sit amet magna. Donec auctor arcu sed ligula imperdiet, eget iaculis nunc mollis.", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean a augue eget sapien ultricies tristique. Integer rutrum convallis elit et vestibulum. Proin porta magna id congue lobortis. Vestibulum et arcu vestibulum, dignissim est ultrices, laoreet lectus. Nam sed sem vehicula, iaculis lorem ac, tempor arcu. Aliquam nec porta sapien. Nam convallis iaculis urna, et varius dolor. Sed non pellentesque enim. Praesent molestie efficitur rutrum. Nunc sit amet tempus nisl, at sodales augue. Nunc eu risus quis eros euismod rhoncus quis at purus. Aliquam vulputate magna non enim dapibus vestibulum. Sed pellentesque leo eget imperdiet viverra. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae;\n\nUt porta non ex quis porta. Proin maximus, diam eget commodo tempus, justo libero ultricies ante, feugiat elementum sem ante sit amet magna. Donec auctor arcu sed ligula imperdiet, eget iaculis nunc mollis." - }, - "title": "Lorem ipsum dolor si" - }, - "type": "MAJOR_TYPE_OPUS" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "RPG_Teng_Lin", - "rid": "357413690", - "text": "RPG_Teng_Lin", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "取消置顶", - "params": { - "dynamic_id": "1063487284684259332", - "status": true - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1063487284684259332", - "dyn_type": 2, - "rid_str": "349795473" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1, - "forbidden": false, - "status": false - } - }, - "module_tag": { - "text": "置顶" - } - }, - "type": "DYNAMIC_TYPE_DRAW", - "visible": true - }, - { - "basic": { - "comment_id_str": "114443295918557", - "comment_type": 1, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "114443295918557" - }, - "id_str": "1062695803784527872", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2天前", - "pub_ts": 1746266548, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114443295918557", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1HUVnz7EX1", - "cover": "http://i1.hdslb.com/bfs/archive/515f60c051c83f98922f78de95a072feebc8f041.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "05:14", - "jump_url": "//www.bilibili.com/video/BV1HUVnz7EX1/", - "stat": { - "danmaku": "1", - "play": "26" - }, - "title": "来自阿洛娜的权威", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "、", - "text": "、", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "旋转的M2", - "rid": "3493264944531941", - "text": "旋转的M2", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1062695803784527872", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "视频删除后将无法恢复,请谨慎操作", - "title": "删除动态会同时删除视频稿件" - }, - "params": { - "dyn_id_str": "1062695803784527872", - "dyn_type": 8, - "rid_str": "114443295918557" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 1, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 4, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "114402862959003", - "comment_type": 1, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "114402862959003" - }, - "id_str": "1060045976462426117", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "04月26日", - "pub_ts": 1745649587, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114402862959003", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1ovLXzPEFq", - "cover": "http://i0.hdslb.com/bfs/archive/b361f14b56080cb17ed5ff24d0b629945c0c150d.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "02:42", - "jump_url": "//www.bilibili.com/video/BV1ovLXzPEFq/", - "stat": { - "danmaku": "0", - "play": "199" - }, - "title": "终于把星野酱带回家了૮₍˃̶ꇴ˂̶₎ა", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "蔚蓝绪山", - "rid": "3493074818828658", - "text": "蔚蓝绪山", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "、", - "text": "、", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "蚕茧自缠萦", - "rid": "291098307", - "text": "蚕茧自缠萦", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1060045976462426117", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "视频删除后将无法恢复,请谨慎操作", - "title": "删除动态会同时删除视频稿件" - }, - "params": { - "dyn_id_str": "1060045976462426117", - "dyn_type": 8, - "rid_str": "114402862959003" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 8, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 9, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "114398483975404", - "comment_type": 1, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "114398483975404" - }, - "id_str": "1059758291001802840", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "04月25日", - "pub_ts": 1745582605, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114398483975404", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1KXLEz9EV8", - "cover": "http://i2.hdslb.com/bfs/archive/915817adaf0c1618ecf28d06d03eb8be8f6c89ff.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "00:14", - "jump_url": "//www.bilibili.com/video/BV1KXLEz9EV8/", - "stat": { - "danmaku": "0", - "play": "205" - }, - "title": "玩了一年多codm,这个什么玩意……", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "、", - "text": "、", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "坤坤丨宝宝", - "rid": "510272506", - "text": "坤坤丨宝宝", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1059758291001802840", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "视频删除后将无法恢复,请谨慎操作", - "title": "删除动态会同时删除视频稿件" - }, - "params": { - "dyn_id_str": "1059758291001802840", - "dyn_type": 8, - "rid_str": "114398483975404" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 1, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 6, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "114392746165578", - "comment_type": 1, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "114392746165578" - }, - "id_str": "1059382215079624725", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "04月24日", - "pub_ts": 1745495043, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114392746165578", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1oZLgz7EeX", - "cover": "http://i1.hdslb.com/bfs/archive/f62117a5e67f2775c892123d1ebe9e23d3523ca8.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "12:25", - "jump_url": "//www.bilibili.com/video/BV1oZLgz7EeX/", - "stat": { - "danmaku": "0", - "play": "335" - }, - "title": "什么才是叫作史上最绝望的死法,……(这爆率正常吗)", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "菌哥电影", - "rid": "628092353", - "text": "菌哥电影", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": "、", - "text": "、", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "是轻甄不是饭团酱", - "rid": "646061108", - "text": "是轻甄不是饭团酱", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1059382215079624725", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "视频删除后将无法恢复,请谨慎操作", - "title": "删除动态会同时删除视频稿件" - }, - "params": { - "dyn_id_str": "1059382215079624725", - "dyn_type": 8, - "rid_str": "114392746165578" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 8, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 18, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "114291361449486", - "comment_type": 1, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "114291361449486" - }, - "id_str": "1052737677322878980", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "04月06日", - "pub_ts": 1743947991, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114291361449486", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV15tR6YEEGN", - "cover": "http://i1.hdslb.com/bfs/archive/f53a964d2438e44db579a2ff373b49e57ea9c752.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "10:26", - "jump_url": "//www.bilibili.com/video/BV15tR6YEEGN/", - "stat": { - "danmaku": "0", - "play": "152" - }, - "title": "有这一款游戏,爆率逆天没有别的(封神)", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1052737677322878980", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "视频删除后将无法恢复,请谨慎操作", - "title": "删除动态会同时删除视频稿件" - }, - "params": { - "dyn_id_str": "1052737677322878980", - "dyn_type": 8, - "rid_str": "114291361449486" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 4, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 3, - "forbidden": false, - "status": true - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - { - "basic": { - "comment_id_str": "1050478468672782345", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1050478468672782345" - }, - "id_str": "1050478468672782345", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月31日", - "pub_ts": 1743421978, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "我昨晚也有Bug,打航天基地的爆破第二局后我的,趴下滑铲不知道咋回事就点不了跳跃键也点不了然后就只能点开火键和操作键,投掷物能丢以外其他啥也干不了,只能跟人机样送一整局就输了", - "text": "我昨晚也有Bug,打航天基地的爆破第二局后我的,趴下滑铲不知道咋回事就点不了跳跃键也点不了然后就只能点开火键和操作键,投掷物能丢以外其他啥也干不了,只能跟人机样送一整局就输了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/493b36cbadea2356f09933b39e49c5a2f8f625b8.png", - "size": 2, - "text": "[坠落·空_自闭]", - "type": 3 - }, - "orig_text": "[坠落·空_自闭]", - "text": "[坠落·空_自闭]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/86c614f2d21263387fa7ef168450ccd69cce9a0b.png", - "size": 2, - "text": "[坠落·空_哭泣]", - "type": 3 - }, - "orig_text": "[坠落·空_哭泣]", - "text": "[坠落·空_哭泣]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "我昨晚也有Bug,打航天基地的爆破第二局后我的,趴下滑铲不知道咋回事就点不了跳跃键也点不了然后就只能点开火键和操作键,投掷物能丢以外其他啥也干不了,只能跟人机样送一整局就输了[坠落·空_自闭][坠落·空_哭泣]" - }, - "major": null, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1050478468672782345", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1050478468672782345", - "dyn_type": 1, - "rid_str": "1050478468672782345" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "1049725573770772488", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/ad1944a6564f065fae1b5d7ee963d08c900fe8d3.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "289949153" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/vip/e2ffa1d1d491fe0464338ed3921327ef5e4b42c5.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": {}, - "id": 28, - "image_enhance": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "item_id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28&isdiy=0&part=card&from=post&f_source=garb&vmid=289949153&native.theme=1&navhide=1", - "name": "2233娘" - }, - "face": "https://i2.hdslb.com/bfs/face/ad1944a6564f065fae1b5d7ee963d08c900fe8d3.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/289949153/dynamic", - "label": "", - "mid": 289949153, - "name": "谁是fufu", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_time": "", - "pub_ts": 1743246681, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1743350400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114245391947434", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1vmZAYDEcT", - "cover": "http://i0.hdslb.com/bfs/archive/d3ccb1bd474d55cc4415e073d21f1c8a3d12c22d.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "02:43", - "jump_url": "//www.bilibili.com/video/BV1vmZAYDEcT/", - "stat": { - "danmaku": "49", - "play": "6.5万" - }, - "title": "上号成为人机了!是BUG还是分身?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": { - "id": 1061343, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1061343&topic_name=%E4%BD%BF%E5%91%BD%E5%8F%AC%E5%94%A4%E6%89%8B%E6%B8%B8%E8%AE%B0%E5%BD%95", - "name": "使命召唤手游记录" - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "1049490226780569608", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1049490226780569608" - }, - "id_str": "1049490226780569608", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月29日", - "pub_ts": 1743191885, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "回复 ", - "text": "回复 ", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "@狂热的地幔", - "rid": "1333987156", - "text": "@狂热的地幔", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " :我试过玩上一个月删了,然后现在我又想玩不知道为什么玩几天又想删", - "text": " :我试过玩上一个月删了,然后现在我又想玩不知道为什么玩几天又想删", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/c3043ba94babf824dea03ce500d0e73763bf4f40.png", - "size": 1, - "text": "[笑哭]", - "type": 1 - }, - "orig_text": "[笑哭]", - "text": "[笑哭]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "回复 @狂热的地幔 :我试过玩上一个月删了,然后现在我又想玩不知道为什么玩几天又想删[笑哭]" - }, - "major": null, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1049490226780569608", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1049490226780569608", - "dyn_type": 1, - "rid_str": "1049490226780569608" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "1049336535656169477", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/929fb162c6eb9f81b55b67b3016364a3d00fb437.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "497979931" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/vip/40b8bef91ed10dd8c2b9302d85db76c5f1f3c292.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/vip/99f54078df2412394140aa5df4422bc0a1ca3d3e.png", - "fan": {}, - "id": 5, - "image_enhance": "https://i0.hdslb.com/bfs/vip/99f54078df2412394140aa5df4422bc0a1ca3d3e.png", - "item_id": 5, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=5&isdiy=0&part=card&from=post&f_source=garb&vmid=497979931&native.theme=1&navhide=1", - "name": "33娘" - }, - "face": "https://i1.hdslb.com/bfs/face/929fb162c6eb9f81b55b67b3016364a3d00fb437.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/497979931/dynamic", - "label": "", - "mid": 497979931, - "name": "冰林L", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_time": "", - "pub_ts": 1743156101, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1745856000000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114239469520401", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1E7oXYhEhp", - "cover": "http://i2.hdslb.com/bfs/archive/db15a6d18cdf6cef3cb41b9d9f11847b5c950bc4.jpg", - "desc": "我知道MC不是我生活的全部,但我希望他能陪我更久一点,未来我可能会去尝试做一些MC动画,或者其他的游戏。", - "disable_preview": 0, - "duration_text": "02:39", - "jump_url": "//www.bilibili.com/video/BV1E7oXYhEhp/", - "stat": { - "danmaku": "548", - "play": "31.2万" - }, - "title": "做MC视频10年了,为什么MC越来越无聊了…", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "1046005002557980674", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1046376087871815681" - }, - "id_str": "1046005002557980674", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月19日", - "pub_ts": 1742380418, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "jump_url": "//search.bilibili.com/all?keyword=bilibili%E4%B8%AA%E6%80%A7%E8%A3%85%E6%89%AE", - "orig_text": "#bilibili个性装扮#", - "text": "#bilibili个性装扮#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": " 我正在使用“坠落·空”头像挂件,你也来试试~", - "text": " 我正在使用“坠落·空”头像挂件,你也来试试~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "#bilibili个性装扮# 我正在使用“坠落·空”头像挂件,你也来试试~" - }, - "major": { - "common": { - "badge": { - "bg_color": "#FB7299", - "color": "#ffffff", - "text": "装扮" - }, - "biz_id": 0, - "biz_type": 231, - "cover": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "desc": "挂件", - "id": "1046376087871815681", - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?f_source=dynamic&from=share&isdiy=0&item_id=68595&native.theme=1&navhide=1&part=pendant&q=953008717620250319183338&vmid=2095498218", - "label": "", - "sketch_id": "1046376087871815680", - "style": 1, - "title": "坠落·空" - }, - "type": "MAJOR_TYPE_COMMON" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1046005002557980674", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1046005002557980674", - "dyn_type": 2048, - "rid_str": "1046376087871815681" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_COMMON_SQUARE", - "visible": true - }, - { - "basic": { - "comment_id_str": "1044401021238902802", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1044401021238902802" - }, - "id_str": "1044401021238902802", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月15日", - "pub_ts": 1742006962, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "我参与了投票", - "text": "我参与了投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​视频类型", - "rid": "14746295", - "text": "​视频类型", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - }, - { - "orig_text": "我投给了我想看抽象的2D动画", - "text": "我投给了我想看抽象的2D动画", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "我参与了投票​视频类型我投给了我想看抽象的2D动画" - }, - "major": null, - "topic": null - }, - "module_interaction": { - "items": [ - { - "desc": { - "rich_text_nodes": [ - { - "orig_text": "长安不见-雪", - "rid": "3546712641636719", - "text": "长安不见-雪", - "type": "RICH_TEXT_NODE_TYPE_AT" - }, - { - "orig_text": " 赞了", - "text": " 赞了", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "" - }, - "type": 0 - } - ] - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1044401021238902802", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1044401021238902802", - "dyn_type": 1, - "rid_str": "1044401021238902802" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "jump_url": "//www.bilibili.com/opus/1044394265267929093", - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "1044394265267929093", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/4e08982dd07abbdf86f35a68483424b743f07730.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/5bb7bef5107e448892ab54539298d50eb678de05.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1142084989" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/archive/7e0eed18747150fa233ba6994489b9096f1d9fe8.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/archive/7e0eed18747150fa233ba6994489b9096f1d9fe8.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "XXXX", - "num_desc": "047769", - "number": 47769 - }, - "id": 66945, - "image_enhance": "https://i0.hdslb.com/bfs/archive/7e0eed18747150fa233ba6994489b9096f1d9fe8.png", - "item_id": 66945, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=101116&from=post&f_source=garb&-Abrowser=live&hybrid_set_header=2&navhide=1&anchor_task=1", - "name": "初音未来三连快乐勋章" - }, - "face": "https://i1.hdslb.com/bfs/face/4e08982dd07abbdf86f35a68483424b743f07730.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/1142084989/dynamic", - "label": "", - "mid": 1142084989, - "name": "不抽象的真菌零_Jack", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/face/5bb7bef5107e448892ab54539298d50eb678de05.png", - "image_enhance": "https://i1.hdslb.com/bfs/face/5bb7bef5107e448892ab54539298d50eb678de05.png", - "image_enhance_frame": "", - "n_pid": 294, - "name": "茶啊二中", - "pid": 294 - }, - "pub_action": "", - "pub_time": "", - "pub_ts": 1742005389, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1751558400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/3788b674c69072f1ee252b79a31ecc8c43af3039.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/jwXBWRVwa5.png", - "label_theme": "vip", - "path": "", - "text": "大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": { - "type": "ADDITIONAL_TYPE_VOTE", - "vote": { - "button": { - "jump_style": { - "text": "参与" - }, - "type": 1 - }, - "choice_cnt": 1, - "default_share": 1, - "desc": "153人参与", - "end_time": 1742091752, - "join_num": 153, - "status": 4, - "title": "视频类型", - "type": null, - "uid": 1142084989, - "vote_id": 14746295 - } - }, - "desc": null, - "major": { - "opus": { - "fold_action": [ - "展开", - "收起" - ], - "jump_url": "//www.bilibili.com/opus/1044394265267929093", - "pics": [], - "summary": { - "rich_text_nodes": [ - { - "orig_text": "投票", - "text": "投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​视频类型", - "rid": "14746295", - "text": "​视频类型", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - } - ], - "text": "投票​视频类型" - }, - "title": null - }, - "type": "MAJOR_TYPE_OPUS" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_WORD", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "1044400750626603011", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1044400750626603011" - }, - "id_str": "1044400750626603011", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月15日", - "pub_ts": 1742006899, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "我参与了投票", - "text": "我参与了投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​你们的头像是", - "rid": "14514807", - "text": "​你们的头像是", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - }, - { - "orig_text": "我投给了女性", - "text": "我投给了女性", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "我参与了投票​你们的头像是我投给了女性" - }, - "major": null, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1044400750626603011", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1044400750626603011", - "dyn_type": 1, - "rid_str": "1044400750626603011" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 0, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "jump_url": "//www.bilibili.com/opus/1034151558512640008", - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "1034151558512640008", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/3c35c94e5c9fc5aad09052078339ec9faf1aad87.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1403650486" - }, - "face": "https://i1.hdslb.com/bfs/face/3c35c94e5c9fc5aad09052078339ec9faf1aad87.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/1403650486/dynamic", - "label": "", - "mid": 1403650486, - "name": "小邓Channel", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_time": "", - "pub_ts": 1739620573, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1711382400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": { - "type": "ADDITIONAL_TYPE_VOTE", - "vote": { - "button": { - "jump_style": { - "text": "参与" - }, - "type": 1 - }, - "choice_cnt": 1, - "default_share": 1, - "desc": "1135人参与", - "end_time": 1742039701, - "join_num": 1135, - "status": 4, - "title": "你们的头像是", - "type": null, - "uid": 1403650486, - "vote_id": 14514807 - } - }, - "desc": null, - "major": { - "opus": { - "fold_action": [ - "展开", - "收起" - ], - "jump_url": "//www.bilibili.com/opus/1034151558512640008", - "pics": [], - "summary": { - "rich_text_nodes": [ - { - "orig_text": "我发起了一个投票", - "text": "我发起了一个投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​你们的头像是", - "rid": "14514807", - "text": "​你们的头像是", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - } - ], - "text": "我发起了一个投票​你们的头像是" - }, - "title": null - }, - "type": "MAJOR_TYPE_OPUS" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_WORD", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - }, - { - "basic": { - "comment_id_str": "1044400681921806345", - "comment_type": 17, - "like_icon": { - "action_url": "https://i0.hdslb.com/bfs/garb/item/cb34de5fbca6b8507adf7364ae785822b74df1f9.bin", - "end_url": "", - "id": 68554, - "start_url": "" - }, - "rid_str": "1044400681921806345" - }, - "id_str": "1044400681921806345", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2095498218" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "fan": { - "color": "#a465e5", - "color_format": { - "colors": [ - "#a465e5FF", - "#a465e5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "坠落·空", - "num_desc": "002272", - "number": 2272 - }, - "id": 68557, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5f6f72f12f56a8217913f29ef991171c897ab443.png", - "item_id": 68557, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=68557&isdiy=0&part=card&from=post&f_source=garb&vmid=2095498218&native.theme=1&navhide=1", - "name": "坠落·空粉丝" - }, - "face": "https://i0.hdslb.com/bfs/face/3f77a9eeb6aa503bd5e0353865d6d737e4ff69c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2095498218/dynamic", - "label": "", - "mid": 2095498218, - "name": "次元壁小宋", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/640b9ee5a12d77bb7431cfc9c815dd25c05f9915.png", - "image_enhance_frame": "", - "n_pid": 68553, - "name": "坠落·空", - "pid": 68553 - }, - "pub_action": "", - "pub_location_text": "", - "pub_time": "03月15日", - "pub_ts": 1742006883, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1683129600000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "我参与了投票", - "text": "我参与了投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​你们露过声吗?", - "rid": "14689974", - "text": "​你们露过声吗?", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - }, - { - "orig_text": "我投给了没露过", - "text": "我投给了没露过", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "我参与了投票​你们露过声吗?我投给了没露过" - }, - "major": null, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "置顶", - "params": { - "dynamic_id": "1044400681921806345", - "status": false - }, - "type": "THREE_POINT_TOP" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1044400681921806345", - "dyn_type": 1, - "rid_str": "1044400681921806345" - }, - "type": "THREE_POINT_DELETE" - } - ] - }, - "module_stat": { - "comment": { - "count": 0, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 0, - "forbidden": false, - "status": false - } - } - }, - "orig": { - "basic": { - "comment_id_str": "", - "comment_type": 0, - "jump_url": "//www.bilibili.com/opus/1041900177728733184", - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "" - }, - "id_str": "1041900177728733184", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/70af6734f5e92c4345c592b099200b9519fdac23.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "3546855879215762" - }, - "face": "https://i2.hdslb.com/bfs/face/70af6734f5e92c4345c592b099200b9519fdac23.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/3546855879215762/dynamic", - "label": "", - "mid": 3546855879215762, - "name": "爱玩休闲区的樱梦雪", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "", - "pub_time": "", - "pub_ts": 1741424689, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": { - "type": "ADDITIONAL_TYPE_VOTE", - "vote": { - "button": { - "jump_style": { - "text": "参与" - }, - "type": 1 - }, - "choice_cnt": 1, - "default_share": 1, - "desc": "818人参与", - "end_time": 1743239041, - "join_num": 818, - "status": 4, - "title": "你们露过声吗?", - "type": null, - "uid": 3546855879215762, - "vote_id": 14689974 - } - }, - "desc": null, - "major": { - "opus": { - "fold_action": [ - "展开", - "收起" - ], - "jump_url": "//www.bilibili.com/opus/1041900177728733184", - "pics": [], - "summary": { - "rich_text_nodes": [ - { - "orig_text": "我发起了一个投票", - "text": "我发起了一个投票", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "orig_text": "​你们露过声吗?", - "rid": "14689974", - "text": "​你们露过声吗?", - "type": "RICH_TEXT_NODE_TYPE_VOTE" - } - ], - "text": "我发起了一个投票​你们露过声吗?" - }, - "title": null - }, - "type": "MAJOR_TYPE_OPUS" - }, - "topic": null - } - }, - "type": "DYNAMIC_TYPE_WORD", - "visible": true - }, - "type": "DYNAMIC_TYPE_FORWARD", - "visible": true - } - ], - "offset": "1044400681921806345", - "update_baseline": "", - "update_num": 0 - } -} -``` - -</details> - -## 设置置顶动态 - -参见 [设置置顶动态](action.md#设置置顶动态) - -## 取消置顶动态 - -参见 [取消置顶动态](action.md#取消置顶动态) diff --git a/docs/dynamic/topic.md b/docs/dynamic/topic.md deleted file mode 100644 index d553635..0000000 --- a/docs/dynamic/topic.md +++ /dev/null @@ -1,5736 +0,0 @@ -# 话题 - -## 获取话题下动态列表 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/topic -> https://app.bilibili.com/x/topic/web/details/cards - -*请求方法: GET* - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| topic_id | number | 话题 ID | 必要 | | -| sort_by | number | 排序方式 | 不必要 | 见回复 `data.topic_card_list.topic_sort_by_conf` 对象 | -| offset | string | 偏移量 | 不必要 | 上一次请求回复的 `data.topic_card_list.offset` | -| page_size | number | 每页数量 | 不必要 | 默认为 `20` | -| source | string | 来源 | 不必要 | 如 `Web` (接口 1) `H5` (接口 2) | -| features | string | 功能模块 | 不必要 | 仅接口 1, 如 `itemOpusStyle,listOnlyfans,opusBigCover,onlyfansVote,decorationCard`, 参见 [功能模块](../opus/features.md) | -| web_location | string | `333.1036` | 不必要 | 仅接口 2 | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| related_topics | object | 相关话题? | 空对象 | -| topic_card_list | object | 话题卡片列表 | | - -`data.topic_card_list` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| has_more | boolean | 是否有更多 | | -| items | object[] | 动态列表 | 套了个娃 | -| offset | string | 偏移量 | | -| topic_sort_by_conf | object | 排序方式配置 | | - -`data.topic_card_list.items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dynamic_card_item | object | 动态 | 基本同 [获取全部动态列表](all.md#获取全部动态列表) 的 `data.items[]` 对象 | -| topic_type | string | 话题类型? | 目前所见似乎只有 `"DYNAMIC"` | - -`data.topic_card_list.topic_sort_by_conf` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| all_sort_by | object[] | 全部排序方式 | | -| default_sort_by | number | 默认排序方式 | | -| show_sort_by | number | 展示的排序方式 | | - -`data.topic_card_list.topic_sort_by_conf.all_sort_by[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| sort_by | number | 排序方式 | | -| sort_name | string | 排序名称 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/polymer/web-dynamic/v1/feed/topic?topic_id=34958&sort_by=0&offset=&page_size=20&source=Web&features=itemOpusStyle%2ClistOnlyfans%2CopusBigCover%2ConlyfansVote%2CdecorationCard' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "related_topics": {}, - "topic_card_list": { - "has_more": true, - "items": [ - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "114687152757937", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "114687152757937" - }, - "id_str": "1078676238928707587", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/38f6660463a00c412c5cd1917f91bbd8119ee7bc.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1310515966" - }, - "face": "https://i1.hdslb.com/bfs/face/38f6660463a00c412c5cd1917f91bbd8119ee7bc.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/1310515966/dynamic", - "label": "", - "mid": 1310515966, - "name": "声优音画", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "06月15日", - "pub_ts": 1749987283, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114687152757937", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1hCMtzKEyP", - "cover": "http://i2.hdslb.com/bfs/archive/5994a570d9a12a89bcb50258455ff1302efdb97b.jpg", - "desc": "“把妹王”火麟飞携金句杀疯全场,少年意气燃爆童年DNA!\n出镜配音演员:鞠月斌@配音演员鞠月斌", - "disable_preview": 0, - "duration_text": "00:43", - "jump_url": "//www.bilibili.com/video/BV1hCMtzKEyP/", - "stat": { - "danmaku": "69", - "play": "39.3万" - }, - "title": "声优音画|《超兽武装》经典热血回归!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 328, - "forbidden": false - }, - "forward": { - "count": 6, - "forbidden": false - }, - "like": { - "count": 40598, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "473683637", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "473683637" - }, - "id_str": "712669283716431894", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "387122516" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "XXXX", - "num_desc": "008059", - "number": 8059 - }, - "id": 69432, - "image_enhance": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "item_id": 69432, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=102704&from=post&f_source=garb&-Abrowser=live&hybrid_set_header=2&navhide=1&anchor_task=1", - "name": "名侦探柯南30周年" - }, - "face": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/387122516/dynamic", - "label": "", - "mid": 387122516, - "name": "橙子面包酱_", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年10月03日", - "pub_ts": 1664769648, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1755273600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "来啦~", - "text": "来啦~", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "来啦~" - }, - "major": { - "archive": { - "aid": "473683637", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1BT411K7Gv", - "cover": "http://i1.hdslb.com/bfs/archive/d9ac37b09af57553b5d313eef60040a133c730d8.jpg", - "desc": "如果再给我一次机会,我一定会早点拍视频,呜呜呜呜拍到凌晨真的太困了dT-Tb\n这首歌很多人点,我也很喜欢!!!(感觉自己没唱好•᷄ࡇ•᷅)", - "disable_preview": 0, - "duration_text": "04:30", - "jump_url": "//www.bilibili.com/video/BV1BT411K7Gv/", - "stat": { - "danmaku": "463", - "play": "53.9万" - }, - "title": "趁17岁唱一首本兮的《未成年》!!!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 1365, - "forbidden": false - }, - "forward": { - "count": 241, - "forbidden": false - }, - "like": { - "count": 28628, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "113231091795405", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "113231091795405" - }, - "id_str": "983253769442557958", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/e84fa744dd3cefd073c446fc7737ff3b2482e3a7.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "2170934" - }, - "face": "https://i2.hdslb.com/bfs/face/e84fa744dd3cefd073c446fc7737ff3b2482e3a7.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2170934/dynamic", - "label": "", - "mid": 2170934, - "name": "明月庄主", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2024年10月01日", - "pub_ts": 1727770008, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1925308800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", - "label_theme": "ten_annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "这个MC存档10岁了!明月庄主单机生存开档十周年。存档发布", - "text": "这个MC存档10岁了!明月庄主单机生存开档十周年。存档发布", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "这个MC存档10岁了!明月庄主单机生存开档十周年。存档发布" - }, - "major": { - "archive": { - "aid": "113231091795405", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1RyxYeGEqC", - "cover": "http://i0.hdslb.com/bfs/archive/d91bd52665bbc354a57bb6470a56504373092adf.jpg", - "desc": "这个MC存档10岁了!明月庄主单机生存开档十周年。存档发布\n\n百度网盘:明月庄主的原版单机生存.优化过1.21.1.7z\n链接:https://pan.baidu.com/s/1eKocLGQyo7sVyysEK1t4lA?pwd=moon \n提取码:moon \n我用夸克网盘分享了「明月庄主的原版单机生存.优化过1.21.1.7z」\n链接:https://pan.quark.cn/s/f47bc9c695b7", - "disable_preview": 0, - "duration_text": "09:21", - "jump_url": "//www.bilibili.com/video/BV1RyxYeGEqC/", - "stat": { - "danmaku": "455", - "play": "9.6万" - }, - "title": "这个MC存档10岁了!明月庄主单机生存开档十周年。存档发布", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 883, - "forbidden": false - }, - "forward": { - "count": 33, - "forbidden": false - }, - "like": { - "count": 8656, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "812023623", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "812023623" - }, - "id_str": "666777038344945689", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "http://i0.hdslb.com/bfs/face/010e6ac40fef4d6560d5d716128b499ea5edf729.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "36776949" - }, - "face": "http://i0.hdslb.com/bfs/face/010e6ac40fef4d6560d5d716128b499ea5edf729.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/36776949/dynamic", - "label": "", - "mid": 36776949, - "name": "柚子爱好者", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年06月01日", - "pub_ts": 1654084527, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1617552000000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "812023623", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1N34y177uz", - "cover": "http://i1.hdslb.com/bfs/archive/b0ac9129e78b7cc4cc95d685c38b076dc0cdcf8e.jpg", - "desc": "最美好的六一礼物", - "disable_preview": 0, - "duration_text": "02:08", - "jump_url": "//www.bilibili.com/video/BV1N34y177uz/", - "stat": { - "danmaku": "240", - "play": "11.3万" - }, - "title": "最美好的六一礼物", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 359, - "forbidden": false - }, - "forward": { - "count": 26, - "forbidden": false - }, - "like": { - "count": 9186, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "687206432", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "687206432" - }, - "id_str": "696709872294559798", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "387122516" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "XXXX", - "num_desc": "008059", - "number": 8059 - }, - "id": 69432, - "image_enhance": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "item_id": 69432, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=102704&from=post&f_source=garb&-Abrowser=live&hybrid_set_header=2&navhide=1&anchor_task=1", - "name": "名侦探柯南30周年" - }, - "face": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/387122516/dynamic", - "label": "", - "mid": 387122516, - "name": "橙子面包酱_", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年08月21日", - "pub_ts": 1661053808, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1755273600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "♥(。→v←。)♥本兮本兮本兮", - "text": "♥(。→v←。)♥本兮本兮本兮", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "♥(。→v←。)♥本兮本兮本兮" - }, - "major": { - "archive": { - "aid": "687206432", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1FU4y1k75W", - "cover": "http://i0.hdslb.com/bfs/archive/1890a9b9362d57fe8da5aaf7c52c90b5317e821a.jpg", - "desc": "好多人点这首歌,但是我真的驾驭不了wwww˃ʍ˂\n唱错了几句(ᇂ_ᇂ|||)", - "disable_preview": 0, - "duration_text": "02:55", - "jump_url": "//www.bilibili.com/video/BV1FU4y1k75W/", - "stat": { - "danmaku": "125", - "play": "11万" - }, - "title": "【爷青回系列】《你在看孤独的风景》cover本兮", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 477, - "forbidden": false - }, - "forward": { - "count": 34, - "forbidden": false - }, - "like": { - "count": 5837, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "452289087", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "452289087" - }, - "id_str": "875680820193394744", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/9780c885127ddf5ae48b1f98c43e63b97c89ac14.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "7062857" - }, - "face": "https://i2.hdslb.com/bfs/face/9780c885127ddf5ae48b1f98c43e63b97c89ac14.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/7062857/dynamic", - "label": "", - "mid": 7062857, - "name": "星际靓仔", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年12月16日", - "pub_ts": 1702723729, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1747670400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "452289087", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1vj411p784", - "cover": "http://i1.hdslb.com/bfs/archive/3e50d9370c40bd5ea31ecf84419e02c913e895fa.jpg", - "desc": "非常感谢@君龙-金君龙 老师的音频授权!这首男版的《只凝视着你》燃爆了!好声音值得被更多人听到!\n歌手简介:金君龙,曾用名君龙,出生于吉林省延边,中国朝鲜族歌手、音乐制作人、阿里郎组合主唱。(以上内容来自百度百科)", - "disable_preview": 0, - "duration_text": "04:28", - "jump_url": "//www.bilibili.com/video/BV1vj411p784/", - "stat": { - "danmaku": "529", - "play": "20.3万" - }, - "title": "恐怖如斯!男歌手竟原调翻唱灌篮高手片尾曲《只凝视着你》!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 508, - "forbidden": false - }, - "forward": { - "count": 23, - "forbidden": false - }, - "like": { - "count": 6151, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "684664595", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "684664595" - }, - "id_str": "668133732620697639", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "387122516" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "XXXX", - "num_desc": "008059", - "number": 8059 - }, - "id": 69432, - "image_enhance": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "item_id": 69432, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=102704&from=post&f_source=garb&-Abrowser=live&hybrid_set_header=2&navhide=1&anchor_task=1", - "name": "名侦探柯南30周年" - }, - "face": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/387122516/dynamic", - "label": "", - "mid": 387122516, - "name": "橙子面包酱_", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年06月05日", - "pub_ts": 1654400407, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1755273600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "684664595", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV15U4y117XE", - "cover": "http://i1.hdslb.com/bfs/archive/abb1dbb1b3b194be1f44ee049a065387bef5560b.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "02:05", - "jump_url": "//www.bilibili.com/video/BV15U4y117XE/", - "stat": { - "danmaku": "56", - "play": "9.6万" - }, - "title": "当然很《爱你》啦!!!今天是王心凌女孩~", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 290, - "forbidden": false - }, - "forward": { - "count": 17, - "forbidden": false - }, - "like": { - "count": 5214, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "703146337", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "703146337" - }, - "id_str": "838814083642818565", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/1d89b423a12ba86987c5c4d4098b285bea645b1c.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "44044545" - }, - "face": "https://i0.hdslb.com/bfs/face/1d89b423a12ba86987c5c4d4098b285bea645b1c.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/44044545/dynamic", - "label": "", - "mid": 44044545, - "name": "双马尾钳子", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年09月08日", - "pub_ts": 1694140023, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1775750400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "雾草我做了四天(咳咳)(吐血)", - "text": "雾草我做了四天(咳咳)(吐血)", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "雾草我做了四天(咳咳)(吐血)" - }, - "major": { - "archive": { - "aid": "703146337", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1gm4y1K7rE", - "cover": "http://i1.hdslb.com/bfs/archive/04aadffdc48e010905a0ca2be4167dc4d5300022.jpg", - "desc": "BGM:BV1hT411L7fk\n剧情梗概:\n威廉和鲍勃本来是一对神界情侣,鲍勃为了保护威廉被乌鸦打落凡间转世为人,威廉为了追寻鲍勃,化身入树中,历经千辛万苦终于也转世为人。然而此时的两人已不认得对方,仅靠缘分结为情侣,却处处互相折磨,在痛苦中越陷越深,最后两人双双放手成全对方,各自踏上了新的人生之路。\n\n内含大量游戏贴图替换,剧情为恶搞,请勿当真!(不会真有人当真吧)", - "disable_preview": 0, - "duration_text": "04:25", - "jump_url": "//www.bilibili.com/video/BV1gm4y1K7rE/", - "stat": { - "danmaku": "193", - "play": "6.8万" - }, - "title": "【锈湖】用仙剑奇侠传三的方式打开锈湖", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 200, - "forbidden": false - }, - "forward": { - "count": 21, - "forbidden": false - }, - "like": { - "count": 5565, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "511956063", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "511956063" - }, - "id_str": "664837929337618438", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/04345e01722540db8dce258f8a0051e1a6dba029.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "19954576" - }, - "face": "https://i1.hdslb.com/bfs/face/04345e01722540db8dce258f8a0051e1a6dba029.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/19954576/dynamic", - "label": "", - "mid": 19954576, - "name": "克里斯不关门_", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年05月27日", - "pub_ts": 1653633043, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "王心凌男孩因为一条十年前表演《爱你》的视频 人生第一次被采访了 而且还是央视网…来听听看我的小作文发挥的咋样吧哈哈~还没看过原视频的欢迎来我的主页看看哟~ P.S. 感谢大家之前的热情回应,当年节目的完整版会在这周晚点发,记得关注我才不会错过更新哦 感恩! <3", - "text": "王心凌男孩因为一条十年前表演《爱你》的视频 人生第一次被采访了 而且还是央视网…来听听看我的小作文发挥的咋样吧哈哈~还没看过原视频的欢迎来我的主页看看哟~ P.S. 感谢大家之前的热情回应,当年节目的完整版会在这周晚点发,记得关注我才不会错过更新哦 感恩! <3", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "王心凌男孩因为一条十年前表演《爱你》的视频 人生第一次被采访了 而且还是央视网…来听听看我的小作文发挥的咋样吧哈哈~还没看过原视频的欢迎来我的主页看看哟~ P.S. 感谢大家之前的热情回应,当年节目的完整版会在这周晚点发,记得关注我才不会错过更新哦 感恩! <3" - }, - "major": { - "archive": { - "aid": "511956063", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1zg411o7Sn", - "cover": "http://i0.hdslb.com/bfs/archive/f9969e889d36042a4addfbe6cffc2b1ccf57efc2.jpg", - "desc": "王心凌男孩因为一条十年前表演《爱你》的视频 人生第一次被采访了 而且还是央视网…来听听看我的小作文发挥的咋样吧哈哈~还没看过原视频的欢迎来我的主页看看哟~ P.S. 感谢大家之前的热情回应,当年节目的完整版会在这周晚点发,记得关注我才不会错过更新哦 感恩! <3", - "disable_preview": 0, - "duration_text": "03:16", - "jump_url": "//www.bilibili.com/video/BV1zg411o7Sn/", - "stat": { - "danmaku": "59", - "play": "5.7万" - }, - "title": "王心凌男孩你好 我是央视网记者 可以问你几个问题吗?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 136, - "forbidden": false - }, - "forward": { - "count": 9, - "forbidden": false - }, - "like": { - "count": 3696, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "526638349", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "526638349" - }, - "id_str": "778087296460128312", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "http://i0.hdslb.com/bfs/face/dbe9074fda0c174a851d0d79e1bd27ddaa18c9e5.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "419805517" - }, - "face": "http://i0.hdslb.com/bfs/face/dbe9074fda0c174a851d0d79e1bd27ddaa18c9e5.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/419805517/dynamic", - "label": "", - "mid": 419805517, - "name": "精分小阿夺", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年03月28日", - "pub_ts": 1680000966, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "526638349", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1xM411g7uZ", - "cover": "http://i2.hdslb.com/bfs/archive/ea2e6054e898241debf1fe991b5e36ab562a11df.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "00:47", - "jump_url": "//www.bilibili.com/video/BV1xM411g7uZ/", - "stat": { - "danmaku": "55", - "play": "4.7万" - }, - "title": "有哪些动漫曾带给你“爷青回”的瞬间?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 45, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 3410, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "726866951", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "726866951" - }, - "id_str": "663496718409531463", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/675aa52717ee9e5aad48e8bd8dd2e1f259b3200c.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "77060623" - }, - "face": "https://i1.hdslb.com/bfs/face/675aa52717ee9e5aad48e8bd8dd2e1f259b3200c.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/77060623/dynamic", - "label": "", - "mid": 77060623, - "name": "pH一sH_肨虎花", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年05月23日", - "pub_ts": 1653320768, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1799596800000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "午夜偷袭!", - "text": "午夜偷袭!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "午夜偷袭!" - }, - "major": { - "archive": { - "aid": "726866951", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1iS4y1z7oC", - "cover": "http://i0.hdslb.com/bfs/archive/8b6fe643251147bc3a1791d028c56aa1c2ac6984.jpg", - "desc": "听到甜心教主的《爱你》真的忍不住了,忍着伤痛画了这一笔,希望能够得到你的三连!", - "disable_preview": 0, - "duration_text": "03:52", - "jump_url": "//www.bilibili.com/video/BV1iS4y1z7oC/", - "stat": { - "danmaku": "310", - "play": "3.3万" - }, - "title": "这一笔,爷青回!王心凌《梦的光点》", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 211, - "forbidden": false - }, - "forward": { - "count": 3, - "forbidden": false - }, - "like": { - "count": 2485, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "114820430961589", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "114820430961589" - }, - "id_str": "1087411287614291971", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/20843b2d7edf0d096bd09ff767065ebcec6fb3ad.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "3546766148372797" - }, - "face": "https://i1.hdslb.com/bfs/face/20843b2d7edf0d096bd09ff767065ebcec6fb3ad.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/3546766148372797/dynamic", - "label": "", - "mid": 3546766148372797, - "name": "柿杂乱", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "07月09日", - "pub_ts": 1752021070, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "114820430961589", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1XMGszTE8s", - "cover": "http://i0.hdslb.com/bfs/archive/ae8caade776af7e197d8b172f18004916d1f2eb8.jpg", - "desc": "这个视频抠图剪辑找素材花了好几天时间,期间运气太非酋抽卡一直不出彩,被迫开了个新号,感谢你对这个系列的支持。", - "disable_preview": 0, - "duration_text": "00:33", - "jump_url": "//www.bilibili.com/video/BV1XMGszTE8s/", - "stat": { - "danmaku": "39", - "play": "1.7万" - }, - "title": "【SCP×BA】SCP蔚蓝档案合作组织。希望这个也能火。", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 223, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 2092, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "946166332", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "946166332" - }, - "id_str": "738695406850932758", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "2518014" - }, - "face": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2518014/dynamic", - "label": "", - "mid": 2518014, - "name": "熊木柚子", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/4316a3910bb0bd6f2f1c267a3e9187f0b9fe5bd0.png", - "n_pid": 32257, - "name": "EveOneCat2", - "pid": 32257 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年12月12日", - "pub_ts": 1670829327, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1786550400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "彩虹岛里得到的第一件稀有武器就是“黑发狐妖可爱魔杖”", - "text": "彩虹岛里得到的第一件稀有武器就是“黑发狐妖可爱魔杖”", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "彩虹岛里得到的第一件稀有武器就是“黑发狐妖可爱魔杖”" - }, - "major": { - "archive": { - "aid": "946166332", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1iW4y1M7y2", - "cover": "http://i2.hdslb.com/bfs/archive/f49ae764cbee2f4bcda09334f1a2c64488597b76.jpg", - "desc": "彩虹岛游戏音乐翻奏\n作曲:ESti\n演奏乐器:长笛", - "disable_preview": 0, - "duration_text": "02:20", - "jump_url": "//www.bilibili.com/video/BV1iW4y1M7y2/", - "stat": { - "danmaku": "50", - "play": "4.5万" - }, - "title": "【彩虹岛】山岳地带bgm——《shanghai runner》", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 302, - "forbidden": false - }, - "forward": { - "count": 10, - "forbidden": false - }, - "like": { - "count": 2893, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "274780128", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "274780128" - }, - "id_str": "830237944487870470", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/0e66175c1933add3de8c7ff2612912b0ed0eabcb.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1832864498" - }, - "face": "https://i2.hdslb.com/bfs/face/0e66175c1933add3de8c7ff2612912b0ed0eabcb.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/1832864498/dynamic", - "label": "", - "mid": 1832864498, - "name": "桃之夭夭之桃", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年08月16日", - "pub_ts": 1692143235, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "274780128", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1tF411y73f", - "cover": "http://i2.hdslb.com/bfs/archive/ca224c68033c77cd028aa8c748cc544e0c3db746.jpg", - "desc": "最近真的很忙,忙着生病,忙着工作,忙着搬家,所以抓紧时间更新一下。", - "disable_preview": 0, - "duration_text": "02:20", - "jump_url": "//www.bilibili.com/video/BV1tF411y73f/", - "stat": { - "danmaku": "108", - "play": "3.4万" - }, - "title": "你不开心就来看我视频咯!Just forget me please!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 152, - "forbidden": false - }, - "forward": { - "count": 2, - "forbidden": false - }, - "like": { - "count": 1221, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "404110312", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "404110312" - }, - "id_str": "823361087690768450", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/007e6c54bc86b40950b2d213973cd732f47163ce.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 4, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "16836724" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/ceb7d1827f13103f0d499f62b1ffa8af5f05c143.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/ceb7d1827f13103f0d499f62b1ffa8af5f05c143.png", - "fan": { - "color": "#942b32", - "color_format": { - "colors": [ - "#942b32FF", - "#942b32FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "刺客信条15周年", - "num_desc": "000001", - "number": 1 - }, - "id": 38456, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/ceb7d1827f13103f0d499f62b1ffa8af5f05c143.png", - "item_id": 38456, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=38456&isdiy=0&part=card&from=post&f_source=garb&vmid=16836724&native.theme=1&navhide=1", - "name": "刺客信条15周年粉丝专属" - }, - "face": "https://i1.hdslb.com/bfs/face/007e6c54bc86b40950b2d213973cd732f47163ce.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/16836724/dynamic", - "label": "", - "mid": 16836724, - "name": "UBISOFT育碧", - "official_verify": { - "desc": "", - "type": 1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年07月28日", - "pub_ts": 1690542092, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1755792000000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "每个人都是如王子一般的主角,这段名为人生的冒险,就是一场终将胜利的横版闯关。\n《波斯王子》系列历经34年沉浮,如今", - "text": "每个人都是如王子一般的主角,这段名为人生的冒险,就是一场终将胜利的横版闯关。\n《波斯王子》系列历经34年沉浮,如今", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "jump_url": "//search.bilibili.com/all?keyword=%E6%B3%A2%E6%96%AF%E7%8E%8B%E5%AD%90%EF%BC%9A%E5%A4%B1%E8%90%BD%E7%9A%84%E7%8E%8B%E5%86%A0", - "orig_text": "#波斯王子:失落的王冠#", - "text": "#波斯王子:失落的王冠#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - { - "orig_text": "回归系列原点,以横版闯关游戏的姿态归来!想知道《波斯王子》系列是如何走到今天的吗?点击视频进入这场人生的“横版闯关”吧", - "text": "回归系列原点,以横版闯关游戏的姿态归来!想知道《波斯王子》系列是如何走到今天的吗?点击视频进入这场人生的“横版闯关”吧", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - }, - { - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/431432c43da3ee5aab5b0e4f8931953e649e9975.png", - "size": 1, - "text": "[打call]", - "type": 1 - }, - "orig_text": "[打call]", - "text": "[打call]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - } - ], - "text": "每个人都是如王子一般的主角,这段名为人生的冒险,就是一场终将胜利的横版闯关。\n《波斯王子》系列历经34年沉浮,如今#波斯王子:失落的王冠#回归系列原点,以横版闯关游戏的姿态归来!想知道《波斯王子》系列是如何走到今天的吗?点击视频进入这场人生的“横版闯关”吧[打call]" - }, - "major": { - "archive": { - "aid": "404110312", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV17V41157hA", - "cover": "http://i2.hdslb.com/bfs/archive/9c275f2eb0f3c6b051e5c1abbda1db8201dc7b0f.jpg", - "desc": "时之神力,逆转乾坤;波斯舞台,王子归来!《波斯王子:失落的王冠》的传奇冒险将于2024年1月18日开启!", - "disable_preview": 0, - "duration_text": "05:13", - "jump_url": "//www.bilibili.com/video/BV17V41157hA/", - "stat": { - "danmaku": "25", - "play": "4.6万" - }, - "title": "波斯最强体操运动员是谁?", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 92, - "forbidden": false - }, - "forward": { - "count": 5, - "forbidden": false - }, - "like": { - "count": 1350, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "606448624", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "606448624" - }, - "id_str": "741290237143023616", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "2518014" - }, - "face": "https://i0.hdslb.com/bfs/face/2e591a702d42f753fdfb847825274ef745675e51.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/2518014/dynamic", - "label": "", - "mid": 2518014, - "name": "熊木柚子", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/4316a3910bb0bd6f2f1c267a3e9187f0b9fe5bd0.png", - "n_pid": 32257, - "name": "EveOneCat2", - "pid": 32257 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年12月19日", - "pub_ts": 1671433483, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1786550400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "606448624", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1J84y147af", - "cover": "http://i2.hdslb.com/bfs/archive/81ea384080b7598ed4a4ac7bc3cd68341932b042.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "02:19", - "jump_url": "//www.bilibili.com/video/BV1J84y147af/", - "stat": { - "danmaku": "17", - "play": "1.4万" - }, - "title": "【彩虹岛】Merry Christmas 尖叫雪地BGM——《snowfield雪地回音》", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 214, - "forbidden": false - }, - "forward": { - "count": 5, - "forbidden": false - }, - "like": { - "count": 994, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "772580225", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "772580225" - }, - "id_str": "700423623235600425", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "387122516" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "fan": { - "color": "#BFC8D2", - "color_format": { - "colors": [ - "#B8C7D0FF", - "#A2A7B0FF" - ], - "end_point": "100,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "XXXX", - "num_desc": "008059", - "number": 8059 - }, - "id": 69432, - "image_enhance": "https://i0.hdslb.com/bfs/garb/open/86e89e72b134283bf72e66c8e7c6e49b2d26d9e3.png", - "item_id": 69432, - "jump_url": "https://www.bilibili.com/h5/mall/digital-card/home?act_id=102704&from=post&f_source=garb&-Abrowser=live&hybrid_set_header=2&navhide=1&anchor_task=1", - "name": "名侦探柯南30周年" - }, - "face": "https://i2.hdslb.com/bfs/face/eba2897173640343e5f9294f365ee0eb2082f525.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/387122516/dynamic", - "label": "", - "mid": 387122516, - "name": "橙子面包酱_", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年08月31日", - "pub_ts": 1661918483, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1755273600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "上学去了˃ʍ˂", - "text": "上学去了˃ʍ˂", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "上学去了˃ʍ˂" - }, - "major": { - "archive": { - "aid": "772580225", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1o14y1W7AZ", - "cover": "http://i2.hdslb.com/bfs/archive/fdf552056a23e3118c15b68f4acf3e62ae9a043d.jpg", - "desc": "开头有点夹子,对不起>人<!!!", - "disable_preview": 0, - "duration_text": "02:43", - "jump_url": "//www.bilibili.com/video/BV1o14y1W7AZ/", - "stat": { - "danmaku": "30", - "play": "1.7万" - }, - "title": "【爷青回系列】《某个心跳》cover本兮", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 159, - "forbidden": false - }, - "forward": { - "count": 6, - "forbidden": false - }, - "like": { - "count": 1222, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "360051457", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "360051457" - }, - "id_str": "809870209103953945", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/991b66faf44236cdacacda526b9ab33f1445b10e.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/face/991b66faf44236cdacacda526b9ab33f1445b10e.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i1.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "73276978" - }, - "face": "https://i1.hdslb.com/bfs/face/991b66faf44236cdacacda526b9ab33f1445b10e.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/73276978/dynamic", - "label": "", - "mid": 73276978, - "name": "醉樱履冰", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i1.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png", - "image_enhance": "https://i1.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp", - "image_enhance_frame": "https://i1.hdslb.com/bfs/garb/item/4316a3910bb0bd6f2f1c267a3e9187f0b9fe5bd0.png", - "n_pid": 32257, - "name": "EveOneCat2", - "pid": 32257 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年06月22日", - "pub_ts": 1687401002, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1767542400000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "status": 1, - "theme_type": 0, - "type": 2 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "360051457", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1ZX4y1W7zd", - "cover": "http://i2.hdslb.com/bfs/archive/627de932421b996ef8782c35ad17c816a1a9e7b8.jpg", - "desc": "回放:BV1tN411r7oU\n【逍遥散人】直播间:https://live.bilibili.com/1017\n【逍遥散人】主页:https://space.bilibili.com/168598", - "disable_preview": 0, - "duration_text": "20:16", - "jump_url": "//www.bilibili.com/video/BV1ZX4y1W7zd/", - "stat": { - "danmaku": "165", - "play": "5.6万" - }, - "title": "【逍遥散人】散人看11年前自己的实况《幽灵诡计》", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 80, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1339, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "897064867", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "897064867" - }, - "id_str": "666670390017261601", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/c93eb41c2b7c1a1741f4ef6126bc78a5332014df.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.8000000000000002, - "axis_y": 0.8000000000000002, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "rgb(255,255,255)", - "border": "2px solid rgba(255,255,255,1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 3, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "48421904" - }, - "decoration_card": { - "big_card_url": "https://i0.hdslb.com/bfs/vip/e2ffa1d1d491fe0464338ed3921327ef5e4b42c5.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": {}, - "id": 28, - "image_enhance": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "item_id": 28, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28&isdiy=0&part=card&from=post&f_source=garb&vmid=48421904&native.theme=1&navhide=1", - "name": "2233娘" - }, - "face": "https://i2.hdslb.com/bfs/face/c93eb41c2b7c1a1741f4ef6126bc78a5332014df.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/48421904/dynamic", - "label": "", - "mid": 48421904, - "name": "贾逸可", - "official_verify": { - "desc": "", - "type": 0 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2022年06月01日", - "pub_ts": 1654059696, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1746288000000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 1 - } - }, - "module_dynamic": { - "additional": null, - "desc": { - "rich_text_nodes": [ - { - "orig_text": "一转眼十年啦,当时我还没有入驻B站,十年前你听过这首《红白机》(游戏机之歌)吗?\n我是既能模仿华语乐坛歌手翻唱,也能原创的贾逸可。祝大家儿童节快乐!\n", - "text": "一转眼十年啦,当时我还没有入驻B站,十年前你听过这首《红白机》(游戏机之歌)吗?\n我是既能模仿华语乐坛歌手翻唱,也能原创的贾逸可。祝大家儿童节快乐!\n", - "type": "RICH_TEXT_NODE_TYPE_TEXT" - } - ], - "text": "一转眼十年啦,当时我还没有入驻B站,十年前你听过这首《红白机》(游戏机之歌)吗?\n我是既能模仿华语乐坛歌手翻唱,也能原创的贾逸可。祝大家儿童节快乐!\n" - }, - "major": { - "archive": { - "aid": "897064867", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1aA4y1d7fQ", - "cover": "http://i1.hdslb.com/bfs/archive/5a20992eb2a886998afdd82a08b975c0e7ea2dbf.jpg", - "desc": "一转眼十年啦,当时我还没有入驻B站,十年前你听过这首《红白机》(游戏机之歌)吗?\n我是既能模仿华语乐坛歌手翻唱,也能原创的贾逸可。祝大家儿童节快乐!\n用这首歌送给我们的童年~一起爷青回,华语乐坛系列:\n【常玉(周董点赞原创)】BV1st4y1s7Kk\n【爱你】BV1gF41157J8\n【热爱105°C的你】BV1qw411Z7Zy\n【孤勇者】BV1AM4y1P7De\n【有何不可】BV1WL411T7vD\n【达拉崩吧】BV1rY411j73X\n【本操纲目】BV1PY411A7sJ\n【萨日朗】BV16L4y1", - "disable_preview": 0, - "duration_text": "03:32", - "jump_url": "//www.bilibili.com/video/BV1aA4y1d7fQ/", - "stat": { - "danmaku": "129", - "play": "2万" - }, - "title": "⚡️爷青回!原创游戏机之歌《红白机》⚡️", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 109, - "forbidden": false - }, - "forward": { - "count": 11, - "forbidden": false - }, - "like": { - "count": 1867, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - }, - { - "dynamic_card_item": { - "basic": { - "comment_id_str": "792152742", - "comment_type": 1, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "792152742" - }, - "id_str": "874962963680722993", - "modules": { - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/3bb211c6aa7a9adc08d22d30b3c818c5040797c1.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "1621845192" - }, - "face": "https://i0.hdslb.com/bfs/face/3bb211c6aa7a9adc08d22d30b3c818c5040797c1.jpg", - "face_nft": false, - "following": null, - "jump_url": "//space.bilibili.com/1621845192/dynamic", - "label": "", - "mid": 1621845192, - "name": "太阳嘟嘟小姐姐", - "official_verify": { - "desc": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_action": "投稿了视频", - "pub_location_text": "", - "pub_time": "2023年12月14日", - "pub_ts": 1702556590, - "type": "AUTHOR_TYPE_NORMAL", - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "status": 0, - "theme_type": 0, - "type": 0 - } - }, - "module_dynamic": { - "additional": null, - "desc": null, - "major": { - "archive": { - "aid": "792152742", - "badge": { - "bg_color": "#FB7299", - "color": "#FFFFFF", - "icon_url": null, - "text": "投稿视频" - }, - "bvid": "BV1ZC4y1X7zu", - "cover": "http://i2.hdslb.com/bfs/archive/edbfc6fa5a168714789678bbea3aab74d8af7e9c.jpg", - "desc": "-", - "disable_preview": 0, - "duration_text": "00:13", - "jump_url": "//www.bilibili.com/video/BV1ZC4y1X7zu/", - "stat": { - "danmaku": "5", - "play": "1.5万" - }, - "title": "仿青儿仿得我要心脏骤停了!大家都说太像了,把我高兴得做梦都要笑醒!呜呜呜太喜欢了!", - "type": 1 - }, - "type": "MAJOR_TYPE_ARCHIVE" - }, - "topic": null - }, - "module_more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - }, - { - "label": "与话题无关", - "type": "THREE_POINT_TOPIC_IRRELEVANT" - } - ] - }, - "module_stat": { - "comment": { - "count": 41, - "forbidden": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 1223, - "forbidden": false, - "status": false - } - } - }, - "type": "DYNAMIC_TYPE_AV", - "visible": true - }, - "topic_type": "DYNAMIC" - } - ], - "offset": "heat_2922347_20_20", - "topic_sort_by_conf": { - "all_sort_by": [ - { - "sort_by": 2, - "sort_name": "热门" - }, - { - "sort_by": 3, - "sort_name": "最新" - } - ], - "default_sort_by": 2, - "show_sort_by": 2 - } - } - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-25T01:56:48.912698186Z --> - -## ~~获取包含置顶及热门的动态列表~~ - -> ~~https://api.vc.bilibili.com/topic_svr/v1/topic_svr/fetch_dynamics~~ - -该接口已失效, 参见 [#852](https://github.com/SocialSisterYi/bilibili-API-collect/issues/852), 历史文档见 [此处](https://github.com/SocialSisterYi/bilibili-API-collect/blob/e99f64c9b5c2bbd156e95ca254620378a22697f7/docs/dynamic/tag_dynamics.md#%E8%8E%B7%E5%8F%96%E5%8C%85%E5%90%AB%E7%BD%AE%E9%A1%B6%E5%8F%8A%E7%83%AD%E9%97%A8%E7%9A%84%E5%8A%A8%E6%80%81%E5%88%97%E8%A1%A8) - -## ~~获取历史动态列表~~ - -> ~~https://api.vc.bilibili.com/topic_svr/v1/topic_svr/topic_history~~ - -该接口已失效, 参见 [#852](https://github.com/SocialSisterYi/bilibili-API-collect/issues/852), 历史文档见 [此处](https://github.com/SocialSisterYi/bilibili-API-collect/blob/e99f64c9b5c2bbd156e95ca254620378a22697f7/docs/dynamic/tag_dynamics.md#%E8%8E%B7%E5%8F%96%E5%8E%86%E5%8F%B2%E5%8A%A8%E6%80%81%E5%88%97%E8%A1%A80) - -## 搜索发布话题 - -> https://app.bilibili.com/x/topic/pub/search -> https://api.bilibili.com/x/topic/pub/search - -*请求方法: GET* - -注: 该接口可能存在传入页面大小与返回数量不匹配的问题, 可能与访问权限有关 - -<!--{ - "from": { - "url": "https://t.bilibili.com/" - "selector": ".bili-topic-search__input__inner" - } -}--> - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| keywords | str | 关键词 | 不必要 | | -| content | str | 空 | 不必要 | | -| upload_id | str | 上传 id? | 不必要 | 页面刷新第一次请求时为空, 后均非空<br />似乎为固定值, 格式: `${your_mid}_${login_or_last_refresh_or_cookie_ts}_${dig4}`, 如 `616368979_1722652786_2534` | -| page_size | int | 页大小 | 不必要 | 默认为 20 | -| page_num | int | 1 | 不必要 | 不用于翻页 | -| offset | int | 偏移 | 不必要 | 可从响应 `data.page_info.offset` 中获取 | -| web_location | str | 333.1365 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| new_topic | obj | 新建话题? | | -| has_create_jurisdiction | bool | false | 是否有创建权限? | -| topic_items | array | 话题列表 | | -| request_id | str | 请求 id | | -| page_info | obj | 页信息 | | - -`data` 中的 `new_topic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| name | str | 请求参数中的 `keywords` | | - -`data` 中的 `topic_items` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 话题 id | | -| name | str | 话题名 | | -| view | num | 浏览数 | | -| discuss | num | 讨论数 | | -| stat_desc | str | 状态描述 | | -| description | str | 话题描述 | | -| show_interact_data | bool | false | 是否显示互动数据? | - -`data` 中的 `page_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| offset | num | 下次请求可用的偏移 | 请求参数中的 `offset` + `page_size` | -| has_more | bool | 是否有更多数据 | 当没有更多时可能不存在该字段 | - -**示例:** - -注: 该示例就是解释开头所注的问题的一个示例 - -```shell -curl -G 'https://app.bilibili.com/x/topic/pub/search' \ ---url-query 'keywords=2233' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "new_topic": { - "name": "2233" - }, - "has_create_jurisdiction": false, - "topic_items": [ - { - "id": 1101122, - "name": "2233异世集", - "view": 2502, - "discuss": 11, - "stat_desc": "2502浏览·11讨论", - "description": "分享数字周边", - "show_interact_data": false - }, - { - "id": 1050671, - "name": "2233生日倒计时", - "view": 21149, - "discuss": 130, - "stat_desc": "2.1万浏览·130讨论", - "description": "2233生日倒计时", - "show_interact_data": false - }, - { - "id": 1057129, - "name": "2233手办可可爱爱", - "view": 836, - "discuss": 14, - "stat_desc": "836浏览·14讨论", - "description": "喜欢2233,", - "show_interact_data": false - } - ], - "request_id": "1$0$1723796266$7f515d4e26b7bd5007fb8ca4b066bf0b", - "page_info": { - "offset": 4, - "has_more": true - } - } -} -``` - -</details> - -## 推荐搜索话题? - -> https://app.bilibili.com/x/topic/pub/rcmd/search -> https://api.bilibili.com/x/topic/pub/rcmd/search - -*请求方法: GET* - -注: 该接口好像啥也不返回, 但是网页端会请求该接口 - -<!--{ - "from": { - "url": "https://t.bilibili.com/" - }, - "gh": [1083] -}--> - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| keywords | str | 空 | 不必要 | | -| upload_id | str | 上传 id? | 不必要 | 同上 | -| web_location | str | 333.1365 | 不必要 | 有时请求不带该参数 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | str | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | -- | --- | -| topic_items | unknown[] | 空? | 可能与 [推荐话题](#推荐话题) 相同? | -| request_id | str | 请求 id | 当传入 `keywords` 时不为空| - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/topic/pub/rcmd/search' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "topic_items": [], - "request_id": "" - } -} -``` - -</details> - -## 推荐话题 - -> https://app.bilibili.com/x/topic/web/dynamic/rcmd - -*请求方法: GET* - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ------ | ---------- | ------ | ---- | -| source | string | 来源 | 不必要 | 如 `Web` | -| page_size | number | 获取数量 | 不必要 | 默认为 `9`, 留空为 `6`, 最大为 `26`, 最小为 `1` | -| web_location | string | `333.1365` | 不必要 | | - - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 成功时为 `0` | -| ttl | num | `1` | | -| data | str | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| topic_items | object[] | 话题列表 | 套了个娃 | - -`data.topic_items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| discuss | number | 讨论数 | | -| dynamics | number | 动态数 | | -| id | number | 话题 id | | -| jump_url | string | 跳转 URL | | -| name | string | 话题名 | | -| show_interact_data | boolean | 是否显示互动数据? | | -| view | number | 浏览数 | | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/topic/web/dynamic/rcmd?page_size=9' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "topic_items": [ - { - "discuss": 147, - "dynamics": 20, - "id": 1305890, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305890", - "name": "燕云河西凉州篇预测", - "show_interact_data": false, - "view": 261060 - }, - { - "discuss": 554, - "dynamics": 24, - "id": 1305885, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305885", - "name": "真人版驯龙高手新预告", - "show_interact_data": false, - "view": 472265 - }, - { - "discuss": 24358, - "dynamics": 57, - "id": 1305877, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305877", - "name": "国米4-3巴萨", - "show_interact_data": false, - "view": 4851673 - }, - { - "discuss": 201, - "dynamics": 24, - "id": 1305933, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305933", - "name": "公积金住房贷款利率下调0.25%", - "show_interact_data": false, - "view": 111704 - }, - { - "discuss": 20201, - "dynamics": 70, - "id": 1305920, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305920", - "name": "印度巴基斯坦交火", - "show_interact_data": false, - "view": 12102634 - }, - { - "discuss": 2497, - "dynamics": 37, - "id": 1305940, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305940", - "name": "降准降息释放什么信号", - "show_interact_data": false, - "view": 475373 - }, - { - "discuss": 11970, - "dynamics": 51, - "id": 1305886, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305886", - "name": "淮水竹亭值得一看吗", - "show_interact_data": false, - "view": 3171863 - }, - { - "discuss": 860, - "dynamics": 38, - "id": 1305904, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305904", - "name": "GTA6全新预告", - "show_interact_data": false, - "view": 202393 - }, - { - "discuss": 576, - "dynamics": 23, - "id": 1305830, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1305830", - "name": "默茨正式当选德国新任总理", - "show_interact_data": false, - "view": 280448 - } - ] - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-05-08T06:56:53.249280549Z --> - -## 检查话题是否存在 - -> https://api.bilibili.com/x/topic/pub/is_existed - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -<!-- #1357 --> - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| topic | string | 话题名 | 必要 | 大小写敏感 | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| already_existed | boolean | 是否已经存在 | | -| synonym_topic | object | 类似话题 | | - -`data.synonym_topic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| topic_items | object[] | 话题列表 | | - -`data.synonym_topic.topic_items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| description | string | 话题描述 | | -| discuss | number | 讨论数 | | -| dynamics | number | 动态数 | | -| id | number | 话题 id | | -| jump_url | string | 跳转 URL | | -| name | string | 话题名 | | -| show_interact_data | boolean | 显示互动数据? | | -| view | number | 浏览数 | | - -**示例:** - -```shell --curl -G 'https://api.bilibili.com/x/topic/pub/is_existed' \ ---url-query 'topic=BW2025' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "already_existed": true, - "synonym_topic": { - "topic_items": [ - { - "description": "Ave Mujica、大石昌良、宫野真守、虹咲学园 学园偶像同好会、偶像大师闪耀色彩、Machico、茅原实里、RAISE A SUILEN、TOGENASHI TOGEARI、yama等参演嘉宾信息已解禁🎶7月11日至13日,在国家会展中心(上海)虹馆EH与大家见面~", - "discuss": 44910, - "dynamics": 5183, - "id": 1297553, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1297553", - "name": "BML2025", - "show_interact_data": false, - "view": 35386975 - }, - { - "description": "心火燎原,2025季中冠军赛即将到来。", - "discuss": 48373, - "dynamics": 523, - "id": 1313369, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1313369", - "name": "2025MSI", - "show_interact_data": false, - "view": 15264132 - }, - { - "description": "简中版《命运-冠位指定》将于2025年8月8日-8月10日在杭州举办FES2025九周年纪念展。", - "discuss": 1421, - "dynamics": 121, - "id": 1315085, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1315085", - "name": "FGOFES2025", - "show_interact_data": false, - "view": 927806 - } - ] - } - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-26T02:37:34.536597611Z --> - -## 获取指定话题详细信息 - -> https://app.bilibili.com/x/topic/web/details/top - -*请求方法: GET* - -<!-- #1360 --> - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---- | ------ | ---- | -| topic_id | number | 话题 id | 必要 | | -| source | string | 来源 | 不必要 | 如 `Web` `H5` | -| web_location | string | `333.1036` | 不必要 | 当 `source` 为 `H5` 时 | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| click_area_card | object | 点击区域卡片? | | -| functional_card | object | 功能卡片 | | -| top_details | object | 话题详情 | | - -`data.click_area_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`data.functional_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| traffic_card | object | 引流卡片 | | - -`data.functional_card.traffic_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| benefit_point | string | 奖励点 | | -| card_desc | string | 卡片描述 | | -| icon_url | string | 图标 URL | | -| jump_title | string | 跳转标题 | | -| jump_url | string | 跳转 URL | | -| name | string | 名称 | | - -`data.top_details` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| close_pub_layer_entry | boolean | 是否关闭发布层入口? | | -| has_create_jurisdiction | boolean | 是否有创建权限? | | -| operation_content | object | 操作内容? | | -| topic_creator | object | 话题创建者 | | -| topic_item | object | 话题详情 | | -| word_color | number | 话题字体颜色? | | - -`data.top_details.operation_content` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`data.top_details.topic_creator` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| face | string | 头像 URL | | -| name | string | 昵称 | | -| uid | number | mid (UID) | | - -`data.top_details.topic_item` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| back_color | string | 背景色 | | -| ctime | number | 创建时间 | | -| description | string | 话题描述 | | -| discuss | number | 讨论数 | | -| dynamics | number | 动态数 | | -| fav | number | 收藏数 | | -| id | number | 话题 id | | -| jump_url | string | 跳转 URL | | -| like | number | 点赞数 | | -| name | string | 话题名 | | -| share | number | 分享数 | | -| share_pic | string | 分享图片 URL | 似乎就是话题的图标 | -| share_url | string | 分享的 URL | | -| show_interact_data | boolean | 显示互动数据? | | -| view | number | 浏览数 | | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/topic/web/details/top' \ ---url-query 'topic_id=1314000' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "click_area_card": {}, - "functional_card": { - "traffic_card": { - "benefit_point": "投稿4K视频瓜分千万流量&奖金", - "card_desc": "2025-10-01 00:00截止", - "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20211019/4c5b6134e2def772efe20dabcca1f6e1/vGqnSBjy8N.png", - "jump_title": "立即参与", - "jump_url": "https://www.bilibili.com/blackboard/era/4Kchaoqingpc.html", - "name": "眼见帧实·B站超高清视频计划" - } - }, - "top_details": { - "close_pub_layer_entry": false, - "has_create_jurisdiction": false, - "operation_content": {}, - "topic_creator": { - "face": "https://i0.hdslb.com/bfs/face/9da46bf581938ff29c2143f186b3f66409c11bf6.jpg", - "name": "赛博星人科技汪", - "uid": 394205865 - }, - "topic_item": { - "back_color": "#6188FF", - "ctime": 1750734201, - "description": "来B站,分享你的超高清视频!2025.6.30-9.30期间,参与“眼见帧实·B站超高清视频计划”活动,投稿超清视频,可以分享超清开箱、超清vlog、超清科普、超清美食、超清风光大片等内容!丰厚奖金&礼物等你来拿~", - "discuss": 435100, - "dynamics": 7902, - "fav": 15, - "id": 1314000, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1314000", - "like": 19, - "name": "B站超高清视频计划", - "share": 7, - "share_pic": "http://i0.hdslb.com/bfs/vc/7701fba940e721ceb756cc73694ebb8f510fe0cc.png", - "share_url": "https://m.bilibili.com/topic-detail?topic_id=1314000", - "show_interact_data": true, - "view": 90735677 - }, - "word_color": 0 - } - }, - "message": "0", - "ttl": 1 -} -``` -</details> - -<!-- Generated by json-apidoc-gen @ 2025-07-26T03:17:14.502472328Z --> diff --git a/docs/electric/Bcoin.md b/docs/electric/Bcoin.md deleted file mode 100644 index 970d1bc..0000000 --- a/docs/electric/Bcoin.md +++ /dev/null @@ -1,323 +0,0 @@ -# B币方式充电 - -<img src="../../assets/img/battery-100.png" width="100" height="100"/> - -**注**:以前充电是电池的概念,1B币折合10电池,一般地充电10电池可获得1经验 - -**目前(2020/12/02后)则是贝壳的概念,1B币折合1贝壳、1经验(如果存在小数点,则经验值向下取整,即2.5B币获得2经验)** - -## 新版本B币充电 - -> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| bp_num | num | 贝壳数量 | 必要 | 必须在2-9999之间 | -| is_bp_remains_prior | bool | 是否优先扣除B币余额 | 必要 | [true,false],B币充电请选择true | -| up_mid | num | 充电对象用户mid | 必要 | | -| otype | str | 充电来源 | 必要 | up:空间充电<br />archive:视频充电 | -| oid | num | 充电来源代码 | 必要 | 空间充电:充电对象用户mid<br />视频充电:稿件avid | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功(并不代表充电成功) <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-500:服务器错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ------------------------------------------------ | -| mid | num | 本用户mid | | -| up_mid | num | 目标用户mid | | -| order_no | str | 留言token | 用于添加充电留言 | -| bp_num | str | 充电贝壳数 | | -| exp | num | 获得经验数 | | -| status | num | 返回结果 | 4:成功<br />-2:低于20电池下限<br />-4:B币不足 | -| msg | str | 错误信息 | 默认为空 | - -**示例:** - -以空间的方式向用户`mid=293793435`充了2贝壳,得到2经验,留言token为`BPRG5CEC3VUPOOANA540` - -此时`data`.`status`=`4` - -~~自己给自己冲QAQ~~ - -```shell -curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ---data-urlencode 'bp_num=2' \ ---data-urlencode 'is_bp_remains_prior=true' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "up_mid": 293793435, - "order_no": "BPRG5CEC3VUPOOANA540", - "bp_num": 2, - "exp": "2", - "status": 4, - "msg": "" - } -} -``` - -</details> - -当所充电贝壳数小于2时,充电不会成功 - -此时`data`.`status`=`-2` - -```shell -curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ---data-urlencode 'bp_num=1' \ ---data-urlencode 'is_bp_remains_prior=true' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 0, - "up_mid": 0, - "order_no": "", - "bp_num": "0", - "exp": 0, - "status": -2, - "msg": "elec raw order create failed: 88201" - } -} -``` - -</details> - -当所充贝壳数折合的B币数不足时,充电也不会成功 - -此时`data`.`status`=`-4` - -```shell -curl 'https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/quick' \ ---data-urlencode 'bp_num=99' \ ---data-urlencode 'is_bp_remains_prior=true' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 0, - "up_mid": 0, - "order_no": "", - "bp_num": "0", - "exp": 0, - "status": -4, - "msg": "bp.to.battery http failed, invalid args, errNo=800409904: B 币余额不足" - } -} -``` - -</details> - - -## 老版本B币充电 - -老版本目前已过期,调用接口成功后(code返回0),data.status会返回0,且B币不会消耗,贝壳也不会增加。以下是历史信息: - -<details> -<summary>查看折叠内容</summary> - -> https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| elec_num | num | 充电电池数量 | 必要 | 必须在2-9999之间 | -| up_mid | num | 充电对象用户mid | 必要 | | -| otype | str | 充电来源 | 必要 | up:空间充电<br />archive:视频充电 | -| oid | num | 充电来源代码 | 必要 | 空间充电:充电对象用户mid<br />视频充电:稿件avid | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功(并不代表充电成功) <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ------------------------------------------------ | -| mid | num | 本用户mid | | -| up_mid | num | 目标用户mid | | -| order_no | str | 留言token | 用于添加充电留言 | -| elec_num | num | 充电电池数 | | -| exp | num | 获得经验数 | | -| status | num | 返回结果 | 4:成功<br />-2:低于20电池下限<br />-4:B币不足 | -| msg | str | 错误信息 | 默认为空 | - -**示例:** - -以空间的方式向用户`mid=293793435`充了20电池,得到2经验,留言token为`BPRG5CEC3VUPOOANA540` - -此时`data`.`status`=`4` - -~~再次自己冲自己QAQ~~ - -```shell -curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ---data-urlencode 'elec_num=20' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "up_mid": 293793435, - "order_no": "BPRG5CEC3VUPOOANA540", - "elec_num": 20, - "exp": 2, - "status": 4, - "msg": "" - } -} -``` - -</details> - -当所充电池数小于2时,充电不会成功 - -此时`data`.`status`=`-2` - -```shell -curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ---data-urlencode 'elec_num=1' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 0, - "up_mid": 0, - "order_no": "", - "elec_num": 0, - "exp": 0, - "status": -2, - "msg": "elec raw order create failed: 88201" - } -} -``` - -</details> - -当所充电池数折合的B币数不足时,充电也不会成功 - -此时`data`.`status`=`-4` - -```shell -curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick' \ ---data-urlencode 'elec_num=999' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=293793435' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 0, - "up_mid": 0, - "order_no": "", - "elec_num": 0, - "exp": 0, - "status": -4, - "msg": "bp.to.battery http failed, invalid args, errNo=800409904: B 币余额不足" - } -} -``` - -</details> -</details> diff --git a/docs/electric/WeChat&Alipay.md b/docs/electric/WeChat&Alipay.md deleted file mode 100644 index 2d2e193..0000000 --- a/docs/electric/WeChat&Alipay.md +++ /dev/null @@ -1,198 +0,0 @@ -# 微信&支付宝方式充电 - -<img src="../../assets/img/battery-100.png" width="100" height="100"/> - -操作流程: - -1. 申请充电二维码及扫码秘钥,秘钥临时保存备用 -2. 使用`qr_code_url`中的值生成二维码 -3. 用支付宝或微信扫描 -4. 以扫码秘钥作为参数轮询检查扫码支付结果 - -## 申请充电二维码及扫码秘钥 - -> https://api.bilibili.com/x/ugcpay/web/v2/trade/elec/pay/qr_code/create - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -秘钥有效时间为10分钟 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| bp_num | num | 充电B币数量 | 必要 | 必须在2-9999之间 | -| is_bp_remains_prior | bool | 是否优先扣除B币 | 必要 | true:是<br />false:否<br />在B币不足时剩余的部分利用支付平台支付 | -| up_mid | num | 充电对象用户mid | 必要 | | -| otype | str | 充电来源 | 必要 | up:空间充电<br />archive:视频充电 | -| oid | num | 充电来源代码 | 必要 | 空间充电:充电对象用户mid<br />视频充电:稿件avid | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-500:服务器错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------------ | -------- | -| qr_code_url | str | 支付二维码生成内容 | 存在转义 | -| qr_token | str | 扫码秘钥 | | -| exp | num | 获得经验数 | | - -**示例:** - -申请空间的方式向用户23215368充电10电池且不使用B币的支付二维码 - -```shell -curl 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/create' \ ---data-urlencode 'elec_num=10' \ ---data-urlencode 'up_mid=23215368' \ ---data-urlencode 'is_bp_remains_prior=false' \ ---data-urlencode 'otype=up' \ ---data-urlencode 'oid=23215368' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "qr_code_url": "https://api.bilibili.com/x/ugcpay/trade/elec/pay/qr_code/gateway?mid=293793435&token=c1cb1d95d2194ba58df6bb0f24ae1aaa", - "qr_token": "c1cb1d95d2194ba58df6bb0f24ae1aaa", - "exp": 1 - } -} -``` - -</details> - -## 检查扫码支付结果 - -> https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ---- | -| qr_token | str | 扫码秘钥 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ------------------------------------------------------------ | -| qr_token | str | 扫码秘钥 | | -| order_no | str | 留言token | 未成功则无此项<br />用于添加充电留言 | -| mid | num | 当前用户mid | | -| status | num | 状态值 | 若秘钥错误则无此项<br />1:已支付<br />2:未扫描<br />3:未确认 | - -**示例:** - -当申请到的支付二维码未被扫描时,`data`.`status`的值为`2` - -```shell -curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ---data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "qr_token": "c7cbdc47fc424cd18f2146db653597b8", - "mid": 293793435, - "status": 2 - } -} -``` - -</details> - -当申请到的支付二维码已扫描但未确认时,`data`.`status`的值为`3` - -```shell -curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ---data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "qr_token": "c7cbdc47fc424cd18f2146db653597b8", - "mid": 293793435, - "status": 3 - } -} -``` - -</details> - -成功支付后,`data`.`status`的值为`1`,且`data`.`order_no`存在留言token - -```shell -curl -G 'https://api.bilibili.com/x/ugcpay/trade/elec/pay/order/status' \ ---data-urlencode 'qr_token=c7cbdc47fc424cd18f2146db653597b8' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "qr_token": "bd649c836c524550bfe22a369334fc05", - "order_no": "BPTD36U3KP82I31RSSLG", - "mid": 293793435, - "status": 1 - } -} -``` - -</details> diff --git a/docs/electric/charge_list.md b/docs/electric/charge_list.md deleted file mode 100644 index 6bd2cdd..0000000 --- a/docs/electric/charge_list.md +++ /dev/null @@ -1,542 +0,0 @@ -# 充电列表 - -## 获取空间充电公示列表 - -> <https://api.bilibili.com/x/ugcpay-rank/elec/month/up> - -*请求方式:GET* - -本接口需要在请求标头中提供有效的浏览器 UA,如 `Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36` - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| up_mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />88214:up主未开通充电 | -| message | str | 错误信息 | | -| ttl | num | 0 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ---------------- | --------------- | -| count | num | 本月充电人数 | | -| list | array | 本月充电用户列表 | | -| total_count | num | 总计充电次数 | | -| total | num | 总计充电次数 | 同`total_count` | -| special_day | num | 0 | 作用尚不明确 | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------- | -| 0 | obj | 充电用户1 | | -| n | obj | 充电用户(n+1) | 按照充电排名排列 | -| …… | obj | …… | …… | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------- | ---------------- | -| uname | str | 充电用户昵称 | | -| avatar | str | 充电用户头像url | | -| mid | num | 充电对象mid | | -| pay_mid | num | 充电用户mid | | -| rank | num | 充电用户排名 | 取决于充电的多少 | -| trend_type | num | 0 | 作用尚不明确 | -| vip_info | obj | 充电用户会员信息 | | -| message | str | 充电留言 | 无为空 | -| msg_hidden | num | 0 | 作用尚不明确 | - -`list`数组中的对象中的`vip_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------- | ----- | -| vipDueMsec | num | 大会员过期时间 | 恒为0 | -| vipStatus | num | 大会员状态 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:有 | -| vipType | num | 大会员类型 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:月大会员<br />2:年度及以上大会员 | - -**示例:** - -查询用户`mid=53456`的充电公示列表 - -```shell -curl -G 'https://api.bilibili.com/x/ugcpay-rank/elec/month/up' \ - -A 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36' \ - --data-urlencode 'up_mid=53456' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "", - "ttl": 0, - "data": { - "count": 8521, - "list": [ - { - "uname": "云梦澡堂", - "avatar": "https://i1.hdslb.com/bfs/face/6589df5fdac0f80593f6a86e4d88dc08e25df3d2.jpg", - "mid": 53456, - "pay_mid": 1555775947, - "rank": 1, - "trend_type": 0, - "vip_info": { "vipDueMsec": 0, "vipStatus": 0, "vipType": 0 }, - "message": "", - "message_hidden": 0 - }, - { - "uname": "在下小天子", - "avatar": "https://i1.hdslb.com/bfs/face/a3bfbe6186889bb50dcd87c1156d07a70227a25b.jpg", - "mid": 53456, - "pay_mid": 508630801, - "rank": 2, - "trend_type": 0, - "vip_info": { "vipDueMsec": 0, "vipStatus": 0, "vipType": 0 }, - "message": "", - "message_hidden": 0 - } - ], - "total_count": 41919, - "total": 41919, - "special_day": 0 - } -} -``` - -</details> - -## 获取视频充电鸣谢名单 - -> <https://api.bilibili.com/x/web-interface/elec/show> - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------------ | ------------------ | -| mid | num | 目标用户mid | 必要 | | -| aid | num | 目标稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 目标稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-404:无视频<br />62001:不需要展示充电信息 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | ---------------- | ------------ | -| show_info | obj | 展示选项 | | -| av_count | num | 目标视频充电人数 | | -| count | num | 本月充电人数 | | -| total_count | num | 总计充电人数 | | -| special_day | num | 0 | 作用尚不明确 | -| display_num | num | 0 | 作用尚不明确 | -| cnt_priv_type | num | 0 | 作用尚不明确 | -| list | array | 本月充电用户列表 | | - -`data`中的`show_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------------------ | ---------------- | -| show | bool | 是否展示视频充电鸣谢名单 | | -| state | num | 充电功能开启状态 | -1:未开通充电功能<br />1:已开通自定义充电<br />2:已开通包月、自定义充电<br />3:已开通包月高档、自定义充电 | -| title | str | 充电按钮显示文字 | 空字符串或 `充电` 或 `充电中` | -| jump_url | str | 跳转url | | -| icon | str | 充电图标 | | -| high_level | obj | 充电专属视频信息 | | -| with_qa_id | num | 充电问答id | | - -`show_info`中的`high_level`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------------------------ | ---------------- | -| privilege_type | num | 解锁视频所需最低定价档位的代码 | 见[充电档位代码与定价](../electric/monthly.md#充电档位代码privilege_type与定价) | -| title | str | 提示标题 | `该视频为「{充电档位名称}」专属视频` | -| sub_title | str | 提示子标题 | `开通「{充电档位定价}元档包月充电」即可观看` | -| show_button | bool | 是否显示按钮 | | -| button_text | str | 按钮文本 | `去开通` | -| jump_url | obj | 跳转url信息 | 详细信息有待补充 | -| intro | str | 充电介绍语 | | -| open | bool | (?) | | -| new | bool | (?) | | -| question_text | str | (?) | | -| qa_detail_link | str | (?) | | - -`high_level`中的`jump_url`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ----------------------- | ---- | -| up_link | str | UP主包月充电购买页面url | | -| paywall_link | str | 视频试看后的提示页面url | | -| previewbar_link | str | 视频预览页面url | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------- | -| 0 | obj | 充电用户1 | | -| n | obj | 充电用户(n+1) | 按照充电排名排列 | -| …… | obj | …… | …… | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ---------------- | -| mid | num | 充电对象mid | | -| pay_mid | num | 充电用户mid | | -| rank | num | 充电用户排名 | 取决于充电的多少 | -| uname | str | 充电用户昵称 | | -| avatar | str | 充电用户头像url | | -| message | str | 充电留言 | 无为空 | -| msg_deleted | num | 0 | 作用尚不明确 | -| vip_info | obj | 充电用户会员信息 | | -| trend_type | num | 0 | 作用尚不明确 | - -`data`中的`list`数组中的`vip_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------- | ----- | -| vipType | num | 大会员类型 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:月大会员<br />2:年度及以上大会员 | -| vipDueMsec | num | 大会员过期时间 | 恒为0 | -| vipStatus | num | 大会员状态 | 包月充电时恒为0<br />自定义充电:<br />0:无<br />1:有 | - -**示例:** - -获取视频`av967773538`/` BV1up4y1y77i `,用户`mid=53456`的视频充电鸣谢名单 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/elec/show' \ - --data-urlencode 'mid=53456' \ - --data-urlencode 'aid=967773538' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/elec/show' \ - --data-urlencode 'mid=53456' \ - --data-urlencode 'bvid=BV1up4y1y77i' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "show_info": { - "show": true, - "state": 2, - "title": "充电", - "jump_url": "https://www.bilibili.com/h5/upower/index?mid=53456&navhide=1&prePage=video&oid=967773538", - "icon": "https://i0.hdslb.com/bfs/garb/item/33e2e72d9a0c855f036b4cb55448f44af67a0635.png", - "high_level": { - "privilege_type": 0, - "title": "", - "sub_title": "", - "show_button": false, - "button_text": "", - "jump_url": { "up_link": "", "paywall_link": "", "previewbar_link": "" }, - "intro": "", - "open": false, - "new": false - } - }, - "av_count": 0, - "count": 0, - "total_count": 41919, - "special_day": 0, - "display_num": 0, - "cnt_priv_type": 0, - "list": [ - { - "mid": 53456, - "pay_mid": 1555775947, - "rank": 1, - "uname": "云梦澡堂", - "avatar": "https://i1.hdslb.com/bfs/face/6589df5fdac0f80593f6a86e4d88dc08e25df3d2.jpg", - "message": "", - "msg_deleted": 0, - "vip_info": { "vipType": 0, "vipDueMsec": 0, "vipStatus": 0 }, - "trend_type": 0 - }, - { - "mid": 53456, - "pay_mid": 508630801, - "rank": 2, - "uname": "在下小天子", - "avatar": "https://i1.hdslb.com/bfs/face/a3bfbe6186889bb50dcd87c1156d07a70227a25b.jpg", - "message": "", - "msg_deleted": 0, - "vip_info": { "vipType": 0, "vipDueMsec": 0, "vipStatus": 0 }, - "trend_type": 0 - } - ] - } -} -``` - -</details> - -## 查询我收到的充电列表 - -> <https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | -------- | ------ | ------------------- | -| currentPage | num | 页数 | 必要 | | -| pageSize | num | 分页大小 | 必要 | 取值范围\[1,50\] | -| customerId | num | (?) | 必要 | 目前为固定值:10026 | -| beginTime | str | 开始日期 | 非必要 | yyyy-MM-dd | -| endTime | str | 结束日期 | 非必要 | yyyy-MM-dd | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />800501007:user not login<br />800501008:内部错误<br />800501011:请求参数有误 | -| errno | num | | | -| msg | str | | | -| showMsg | str | | | -| data | obj | 信息本体 | | -| success | bool | | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ------------ | ---- | -| page | obj | 分页信息 | | -| result | array | 充电信息本体 | | -| config | array | (?) | | - -`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ---- | -| currentPage | num | 当前页数 | | -| pageSize | num | 当前分页大小 | | -| totalCount | num | 记录总数 | | -| totalPage | num | 总页数 | | - -`result`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ---------------- | ------------------- | -| mid | num | 充电人mid | | -| name | str | 充电人昵称 | | -| avatar | str | 充电人头像 | | -| originalThirdCoin | num | 原始B币数 | | -| brokerage | num | 实际收到的贝壳数 | | -| remark | str | 充电渠道 | Web/安卓/iOS | -| ctime | str | 充电时间 | yyyy-MM-dd HH:mm:ss | - -`config`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ---- | ---------- | -| mid | null | | 总是为null | -| name | null | | 总是为null | -| avatar | null | | 总是为null | -| originalThirdCoin | null | | 总是为null | -| brokerage | null | | 总是为null | -| remark | null | | 总是为null | -| ctime | null | | 总是为null | - -**示例:** - -```shell -curl -G 'https://pay.bilibili.com/bk/brokerage/listForCustomerRechargeRecord' \ - --data-urlencode 'currentPage=1' \ - --data-urlencode 'pageSize=2' \ - --data-urlencode 'customerId=10026' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "errno": 0, - "msg": "SUCCESS", - "showMsg": "交易成功", - "data": { - "page": { - "currentPage": 1, - "pageSize": 2, - "totalCount": 311, - "totalPage": 156 - }, - "result": [ - { - "mid": 2233, - "name": "2233", - "avatar": "http://i2.hdslb.com/bfs/face/f42b7f47c80648d2ee1231f2435b527c60302289.jpg", - "originalThirdCoin": 2, - "brokerage": 1.34, - "remark": "Web", - "ctime": "2022-04-12 17:34:47" - }, - { - "mid": 2233, - "name": "2233", - "avatar": "http://i0.hdslb.com/bfs/face/member/noface.jpg", - "originalThirdCoin": 2, - "brokerage": 0.68, - "remark": "iOS", - "ctime": "2022-04-10 03:41:10" - } - ], - "config": [ - { - "mid": null, - "name": null, - "avatar": null, - "originalThirdCoin": null, - "brokerage": null, - "remark": null, - "ctime": null - } - ] - }, - "success": true -} -``` - -</details> - -## 查询历史充电数据 - -> <https://member.bilibili.com/x/h5/elec/rank/recent> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ---------------- | -| pn | num | 页数 | 非必要 | | -| ps | num | 分页大小 | 非必要 | 取值范围\[1,20\] | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ------------ | ---- | -| list | array | 充电信息本体 | | -| pager | obj | 分页信息 | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ------------------- | -| aid | num | 0 | | -| bvid | str | 空 | | -| elec_num | num | 充电电池数 | | -| title | str | 空 | | -| uname | str | 空 | | -| avatar | str | 空 | | -| ctime | str | 充电时间 | yyyy-MM-dd HH:mm:ss | - -`pager`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------ | ---- | -| current | num | 当前页数 | | -| size | num | 当前分页大小 | | -| total | num | 记录总数 | | - -**示例:** - -```shell -curl -G 'https://member.bilibili.com/x/h5/elec/rank/recent' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "aid": 0, - "bvid": "", - "elec_num": 50, - "title": "", - "uname": "", - "avatar": "", - "ctime": "2020-04-02 03:12:22" - }, - { - "aid": 0, - "bvid": "", - "elec_num": 20, - "title": "", - "uname": "", - "avatar": "", - "ctime": "2020-04-02 03:12:00" - } - ], - "pager": { - "current": 1, - "size": 20, - "total": 38 - } - } -} -``` - -</details> diff --git a/docs/electric/charge_msg.md b/docs/electric/charge_msg.md deleted file mode 100644 index 534fe9f..0000000 --- a/docs/electric/charge_msg.md +++ /dev/null @@ -1,298 +0,0 @@ -# 充电留言 - -## 发送充电留言 - -> https://api.bilibili.com/x/ugcpay/trade/elec/message - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ---- | -| order_id | str | 留言token | 必要 | | -| message | str | 留言内容 | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 <br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />88203:不能重复留言 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -为留言token为`BPRG5CEC3VUPOOANA540`的充电操作,添加了内容为`支持一下大佬`的留言 - -```shell -curl 'https://api.bilibili.com/x/ugcpay/trade/elec/message' \ - --data-urlencode 'order_id=BPRG5CEC3VUPOOANA540' \ - --data-urlencode 'message=支持一下大佬' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 查询我收到的充电留言 - -> https://member.bilibili.com/x/web/elec/remark/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ------ | ---------------- | -| begin | str | 起始日期 | 非必要 | 默认2016-01-01 | -| end | str | 结束日期 | 非必要 | 默认2050-01-01 | -| pn | str | 页数 | 非必要 | | -| ps | str | 分页大小 | 非必要 | 取值范围\[1,12\] | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| msg | str | 错误信息 | 成功时为`0` | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | -------- | ---- | -| list | array | 信息本体 | | -| pager | obj | 分页信息 | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------------- | ---- | -| aid | num | | | -| bvid | str | | | -| id | num | 留言记录id | | -| mid | num | 0 | | -| reply_mid | num | 0 | | -| elec_num | num | 0 | | -| state | num | UP是否已经回复这条留言 | 0:未回复<br />1:已回复 | -| msg | str | 留言信息 | | -| aname | str | 空 | | -| uname | str | 空 | | -| avator | str | 空 | | -| reply_name | str | 空 | | -| reply_avator | str | 空 | | -| reply_msg | str | 空 | | -| ctime | num | 留言时间 | 毫秒级时间戳 | -| reply_time | num | 0 | | - -`pager`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------ | ---- | -| current | num | 当前页数 | | -| size | num | 当前分页大小 | | -| total | num | 记录总数 | | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/elec/remark/list?begin=2016-01-01&end=2050-01-01&pn=1&ps=10' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "aid": 0, - "bvid": "", - "id": 6715018, - "mid": 0, - "reply_mid": 0, - "elec_num": 0, - "state": 0, - "msg": "加油", - "aname": "", - "uname": "", - "avator": "", - "reply_name": "", - "reply_avator": "", - "reply_msg": "", - "ctime": 1650665119000, - "reply_time": 0 - } - ], - "pager": { - "current": 1, - "size": 10, - "total": 448 - } - } -} -``` - -</details> - -## 查询充电留言详情 - -> https://member.bilibili.com/x/web/elec/remark/detail - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| id | num | 留言id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 成功时为 `0` | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------------- | ---- | -| aid | num | | | -| bvid | str | | | -| id | num | 留言id | | -| mid | num | 留言者mid(充电用户) | | -| reply_mid | num | UP主mid | | -| elec_num | num | 0 | | -| state | num | UP是否已经回复这条留言 | 0:未回复<br />1:已回复 | -| msg | str | 留言内容 | | -| aname | str | 空 | | -| uname | str | 留言者用户名 | | -| avator | str | 留言者头像 | | -| reply_name | str | UP主用户名 | | -| reply_avator | str | UP主头像 | | -| reply_msg | str | 回复内容 | | -| ctime | num | 留言时间 | 毫秒级时间戳 | -| reply_time | num | 回复时间 | 毫秒级时间戳 | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/elec/remark/detail?id=6507563' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 0, - "bvid": "", - "id": 6507563, - "mid": 19978396, - "reply_mid": 2062760, - "elec_num": 0, - "state": 1, - "msg": "感谢搬运", - "aname": "", - "uname": "HANSOOOOOL", - "avator": "http://i1.hdslb.com/bfs/face/5c22af0261b8b3f9a54b6e0038e35430e9ed9cfd.jpg", - "reply_name": "一把近战都不给六花", - "reply_avator": "http://i2.hdslb.com/bfs/face/1804b716084908d4992bdd35827d0c2d7222fe97.jpg", - "reply_msg": "( ̄3 ̄)", - "ctime": 1646726966000, - "reply_time": 1646811946000 - } -} -``` - -</details> - -## 回复充电留言 - -> https://member.bilibili.com/x/web/elec/remark/reply - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| csrf | str | csrf | 必要 | | -| id | num | 留言id | 必要 | | -| msg | str | 回复信息 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf 校验失败<br />-400:请求错误<br />20004:充电服务异常 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | num | 数据本体 | 1:成功<br />2:失败 | - -**示例:** - -```shell -curl 'https://member.bilibili.com/x/web/elec/remark/reply' \ - -b 'SESSDATA=xxx' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'id=6258929' \ - --data-urlencode 'msg=( ̄3 ̄)' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": 1 -} -``` - -</details> diff --git a/docs/electric/monthly.md b/docs/electric/monthly.md deleted file mode 100644 index 21dc3ef..0000000 --- a/docs/electric/monthly.md +++ /dev/null @@ -1,746 +0,0 @@ -# 包月充电 - -<img src="../../assets/img/battery-100.png" width="100" height="100"/> - -## 常量说明 - -### 充电档位代码(`privilege_type`)与定价 - -| 代码 | 定价(单位:元人民币) | -| :--: | :--------------------: | -| 10 | 6 | -| 20 | 30 | -| 30 | 50 | -| 40 | 88 | -| 50 | 128 | -| 60 | 288 | -| 70 | 588 | -| 80 | 998 | -| 100 | 18 | -| 110 | 238 | -| 130 | 68 | - -## 获取包月充电列表 - -> <https://api.live.bilibili.com/xlive/revenue/v1/guard/getChargeRecord> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ------------------------ | -| page | num | 页码 | 必要 | | -| type | num | 充电状态 | 必要 | 1:使用中<br />2:已过期 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误<br />25100004:参数错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------- | ---------------- | -| list | 有内容时:array<br />无内容时:null | 包月充电UP主列表 | 最多10个 | -| page | num | 当前页数 | | -| page_size | num | 当前分页大小 | 一般为10 | -| total_page | num | 总页数 | | -| total_num | num | 用户总数 | | -| is_more | num | 是否有更多用户 | 0:否<br />1:是 | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | | -| …… | obj | …… | …… | - -数组`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ----- | ------------------------ | ---------- | -| up_uid | num | 充电UP主mid | | -| user_name | str | 充电UP主昵称 | | -| user_face | str | 充电UP主头像url | | -| item | array | 充电详情 | | -| start | num | 开始充电时间 | 秒级时间戳 | -| high_level_state | num | 是否可对UP主进行高档充电 | | -| elec_reply_state | num | 是否可对UP主进行专属问答 | 0:否<br />1:是<br />2:状态未知 | - -数组`list`中的对象中的`item`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | -------- | -| 0 | obj | 充电档位1 | | -| n | obj | 充电档位(n+1) | | -| …… | obj | …… | …… | - -数组`item`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | --------------------------------------------- | ---------------- | ---------------- | -| privilege_type | num | 充电档位代码 | 详见[充电档位代码与定价](#充电档位代码privilege_type与定价) | -| icon | str | 充电图标 | | -| name | str | 充电档位名称 | | -| expire_time | num | 该档位过期时间 | 秒级时间戳 | -| renew | 开启自动续费时:obj<br />关闭自动续费时:null | 充电自动续费详情 | | -| start_time | num | 该档位生效时间 | 秒级时间戳 | -| renew_list | 开启自动续费时:array<br />关闭自动续费时:null | 充电自动续费列表 | | - -`renew`对象、`renew_list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ------------ | ------------------------------------------------- | -| uid | num | 自己的mid | | -| ruid | num | UP主的mid | | -| goods_id | num | 充电类型 | 172:一个月<br />173:连续包月<br />174:连续包年 | -| status | num | 充电状态 | 1 | -| next_execute_time | num | 下次续费时间 | 秒级时间戳 | -| signed_time | num | 签约时间 | 秒级时间戳 | -| signed_price | num | 下次续费金额 | 单位为千分之一元人民币 | -| pay_channel | num | 签约平台 | 2:微信支付<br />4:支付宝 | -| period | num | 下次充电天数 | | -| mobile_app | str | 充电渠道 | 可为`android`等 | - -**示例:** - -获取自己正在使用的包月充电的列表 - -```shell -curl 'https://api.live.bilibili.com/xlive/revenue/v1/guard/getChargeRecord' \ - --data-urlencode 'page=1' \ - --data-urlencode 'type=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "up_uid": 2233, - "user_name": "2233", - "user_face": "https://i0.hdslb.com/bfs/face/noface.jpg", - "item": [ - { - "privilege_type": 10, - "icon": "https://s1.hdslb.com/bfs/templar/york-static/lightning_icon@2x.png", - "name": "为TA充电", - "expire_time": 1703519999, - "renew": { - "uid": 425503913, - "ruid": 2233, - "goods_id": 174, - "status": 1, - "next_execute_time": 1703174400, - "signed_time": 1671618921, - "signed_price": 36000, - "pay_channel": 2, - "period": 366, - "mobile_app": "android" - }, - "start_time": 1671618921, - "renew_list": [ - { - "uid": 425503913, - "ruid": 2233, - "goods_id": 174, - "status": 1, - "next_execute_time": 1703174400, - "signed_time": 1671618921, - "signed_price": 36000, - "pay_channel": 2, - "period": 366, - "mobile_app": "android" - } - ] - } - ], - "start": 1669183804, - "high_level_state": 1, - "elec_reply_state": 1 - }, - { - "up_uid": 293793435, - "user_name": "社会易姐QwQ", - "user_face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "item": [ - { - "privilege_type": 10, - "icon": "https://s1.hdslb.com/bfs/templar/york-static/lightning_icon@2x.png", - "name": "为TA充电", - "expire_time": 1681401599, - "renew": { - "uid": 425503913, - "ruid": 293793435, - "goods_id": 173, - "status": 1, - "next_execute_time": 1680364800, - "signed_time": 1677760921, - "signed_price": 5000, - "pay_channel": 4, - "period": 31, - "mobile_app": "android" - }, - "start_time": 1677760921, - "renew_list": [ - { - "uid": 425503913, - "ruid": 293793435, - "goods_id": 173, - "status": 1, - "next_execute_time": 1680364800, - "signed_time": 1677760921, - "signed_price": 5000, - "pay_channel": 4, - "period": 31, - "mobile_app": "android" - } - ] - } - ], - "start": 1676033795, - "high_level_state": 1, - "elec_reply_state": 1 - } - ], - "page": 1, - "page_size": 10, - "total_page": 3, - "total_num": 22, - "is_more": 1 - } -} -``` - -</details> - -表示自己从2022-11-23 14:10:04开始给“2233”包月充电,并且在2022-12-21 18:35:21在微信开通了连续包年充电,在2023-12-22 00:00:00的时候会自动续费36元,并继续充电366天; - -自己从2023-02-10 20:56:35开始给“社会易姐QwQ”包月充电,并且在2023-03-02 20:42:01在支付宝开通了连续包月充电,在2023-04-02 00:00:00的时候会自动续费5元,并继续充电31天。 - -## UP主包月充电详情 - -> <https://api.bilibili.com/x/upower/item/detail> - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| up_mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | -------------------------- | ------------------------------ | -| upower_rank | obj | 充电详情 | | -| item | obj | 充电欢迎语信息 | | -| user_card | obj | UP主信息 | | -| upower_level | num | UP主开通的充电等级 | 1:非高档充电<br />2:高档充电 | -| elec_reply_state | num | 是否可对UP主进行专属问答 | | -| voucher_state | obj | 包月充电券信息 | **详细信息有待补充** | -| upower_right_count | obj | 不同充电档位下的充电权益数 | | -| only_contain_medal | bool | 享有的权益仅为粉丝勋章 | | -| privilege_type | num | 当前给该UP主包月充电的档位 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),若从未给该UP主包月充电过则为0 | - -`data`中的`upower_rank`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------- | ------------ | -| total | num | 充电用户总数 | | -| total_desc | str | 充电总数文字说明 | 示例:“1+” | -| list | array | 充电用户列表 | 最多展示30个 | - -`upower_rank`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | -------------------------- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | 按照最初充电时间排序(?) | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | --------------- | ---- | -| rank | num | 充电用户索引 | | -| mid | num | 充电用户mid | | -| nickname | str | 充电用户昵称 | | -| avatar | str | 充电用户头像url | | - -`data`中的`item`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ---------------- | ---- | -| intro_video_aid | str | 充电介绍视频AV号 | | -| welcomes | str | 充电介绍语 | | - -`data`中的`user_card`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ---- | -| avatar | str | UP主头像url | | -| nickname | str | UP主昵称 | | - -`data`中的`upower_right_count`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------------------- | ---- | -| {充电档位代码} | num | 该档位下的充电权益数 | | - -**示例:** - -获取`mid=1265680561`的包月充电详情 - -```shell -curl 'https://api.bilibili.com/x/upower/item/detail' \ - --data-urlencode 'up_mid=1265680561' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "upower_rank": { - "total": 5082, - "total_desc": "5000+", - "list": [ - { - "rank": 1, - "mid": 1476475459, - "nickname": "一只屑椒", - "avatar": "https://i1.hdslb.com/bfs/face/dc721da215f4651e0472d566b146ee8fdf198dbe.jpg" - }, - { - "rank": 2, - "mid": 275365317, - "nickname": "-陪我去看海吧i", - "avatar": "https://i0.hdslb.com/bfs/face/dd7547b13020e7f47549ad7908fd3fc58efadefc.jpg" - }, - { - "rank": 3, - "mid": 401909111, - "nickname": "Vege5able", - "avatar": "https://i2.hdslb.com/bfs/face/46b1fdc94c7851ec0c47817adeec13e3225da559.jpg" - } - ] - }, - "item": { - "intro_video_aid": "", - "welcomes": "哈喽b站的小伙伴们,我的充电计划升级啦! 感兴趣就多多支持我吧~(゜-゜)つロ" - }, - "user_card": { - "avatar": "https://i1.hdslb.com/bfs/face/5ddddba98f0265265662a8f7d5383e528a98412b.jpg", - "nickname": "永雏塔菲" - }, - "upower_level": 1, - "elec_reply_state": 1, - "voucher_state": { - "voucher_order_id": "95843e812210c455d1ea6e4714bf105a00", - "user_voucher_state": 2, - "vip_action": 0, - "voucher_name": "包月充电券(6元档)", - "validate_price": 0, - "validate_level": 0, - "activity": "", - "common_time": 0, - "high_level_time": 0, - "specify_up": 0, - "specify_level": 0 - }, - "upower_right_count": { - "10": 3 - }, - "only_contain_medal": false, - "privilege_type": 0 - } -} -``` - -</details> - -## 与UP主的包月充电关系 - -> <https://api.bilibili.com/x/upower/charge/follow/info> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| up_mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ------------------------------ | ------------------------------------------- | -| days | num | 已保持多少天包月充电状态 | | -| up_card | obj | UP主信息 | | -| user_card | obj | 自己的信息 | | -| remain_days | num | 剩余天数 | 未处于包月充电状态为-1 | -| remain_less_1day | num | 剩余的天数是否小于1天 | 0:否<br />1:是<br />未处于包月充电状态为0 | -| upower_rank | obj | 充电详情 | | -| upower_icon | str | 充电图标url | 仅在处于包月充电状态时有内容 | -| upower_right_count | obj | 当前自己享有该UP主的充电权益数 | | -| only_contain_medal | bool | 享有的权益仅为粉丝勋章 | | -| privilege_type | num | 当前给该UP主包月充电的档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),若未处于包月充电状态为0 | -| challenge_info | obj | 充电挑战信息 | **详细信息有待补充** | - -`data`中的`up_card`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------ | ---- | -| mid | num | UP主mid | | -| nickname | str | UP主昵称 | | -| official_title | str | UP主认证信息 | | -| avatar | str | UP主头像url | | - -`data`中的`user_card`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------- | ---- | -| avatar | str | 用户头像url | | -| nickname | str | 用户昵称 | | - -`data`中的`upower_rank`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------- | ----------- | -| total | num | 充电用户总数 | | -| total_desc | str | 充电总数文字说明 | 示例:“1+” | -| list | array | 充电用户列表 | 最多展示6个 | - -`upower_rank`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | 按照充电时间排序 | -| …… | obj | …… | …… | - -数组`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | --------------- | ---- | -| rank | num | 充电用户索引 | | -| mid | num | 充电用户mid | | -| nickname | str | 充电用户昵称 | | -| avatar | str | 充电用户头像url | | - -**示例:** - -获取与`mid=293793435`的包月充电关系 - -```shell -curl 'https://api.bilibili.com/x/upower/charge/follow/info' \ - --data-urlencode 'up_mid=293793435' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "days": 17, - "up_card": { - "mid": 293793435, - "nickname": "社会易姐QwQ", - "official_title": "", - "avatar": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "user_card": { - "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg", - "nickname": "晨叶梦春" - }, - "remain_days": 15, - "remain_less_1day": 0, - "upower_rank": { - "total": 1, - "total_desc": "1+", - "list": [ - { - "rank": 1, - "mid": 425503913, - "nickname": "晨叶梦春", - "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg" - } - ] - }, - "upower_icon": "https://i0.hdslb.com/bfs/garb/item/33e2e72d9a0c855f036b4cb55448f44af67a0635.png", - "upower_right_count": 2, - "only_contain_medal": false, - "privilege_type": 10, - "challenge_info": { - "challenge_id": "", - "description": "", - "challenge_type": 0, - "remaining_days": 0, - "end_time": "", - "progress": 0, - "targets": [], - "state": 0, - "end_time_unix": 0, - "pub_dyn": 0, - "dyn_content": "" - } - } -} -``` - -</details> - -表示自己已保持17天对“社会易姐QwQ”的包月充电,剩余15天过期。 - -## 包月充电用户排名 - -> <https://api.bilibili.com/x/upower/up/member/rank/v2> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------- | ---- | ------------ | ------ | --------- | -| up_mid | num | 目标用户mid | 必要 | | -| ps | num | 每页项数 | 必要 | 最大为101 | -| pn | num | 页码 | 必要 | | -| privilege_type | num | 充电档位代码 | 非必要 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价),默认为可以显示排名的档位中**最高定价**的档位 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | ------------------------------ | -------- | -| up_info | obj | UP主信息 | | -| rank_info | array | 当前档位的充电用户排名 | | -| user_info | obj | 自己在该档位下与UP主的充电关系 | | -| member_total | num | 当前档位的充电用户总数 | | -| privilege_type | num | 当前充电档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价) | -| is_charge | bool | 自己是否给该UP主包月充电过 | 无论档位 | -| tabs | array | 可显示排名的充电档位代码列表 | | -| level_info | array | 可显示排名的充电档位信息 | | - -`data`中的`up_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | -------------------- | ---------------------------------------- | -| mid | num | UP主mid | | -| nickname | str | UP主昵称 | | -| avatar | str | UP主头像url | | -| type | num | UP主认证类型 | -1:无<br />0:UP主认证<br />1:机构认证 | -| title | str | UP主认证文字 | | -| upower_state | num | UP主充电功能开启状态 | 0:未开通充电功能<br />1:已开通自定义充电<br />2:已开通包月、自定义充电<br />3:已开通包月高档、自定义充电 | - -`data`中的`rank_info`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | 按照充电排名排列 | -| …… | obj | …… | …… | - -`rank_info`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ----- | -| mid | num | 充电用户mid | | -| nickname | str | 充电用户昵称 | | -| avatar | str | 充电用户头像url | | -| rank | num | 充电用户排名 | | -| day | num | 包月充电天数 | | -| expire_at | num | 包月充电过期时间 | 恒为0 | -| remain_days | num | 剩余天数 | 恒为0 | - -`data`中的`user_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ------------------------------- | -| mid | num | 用户mid | | -| nickname | str | 用户昵称 | | -| avatar | str | 用户头像url | | -| rank | num | 包月充电排名 | 不在该充电档位用户列表里为-1 | -| day | num | 包月充电天数 | | -| expire_at | num | 包月充电过期时间 | 秒级时间戳,若从未给UP主在该档位下包月充电过为0 | -| remain_days | num | 剩余天数 | 若该档位充电状态已失效为0 | - -`data`中的`tabs`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------- | -| 0 | num | 档位代码1 | | -| n | num | 档位代码(n+1) | | -| …… | num | …… | …… | - -`data`中的`level_info`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 档位1 | | -| n | obj | 档位(n+1) | | -| …… | obj | …… | …… | - -`level_info`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------------------- | ---------------------- | -| privilege_type | num | 当前充电档位代码 | 见[充电档位代码与定价](#充电档位代码privilege_type与定价) | -| name | str | 档位名称 | | -| price | num | 档位价格 | 单位为百分之一元人民币 | -| member_total | num | 当前档位的用户总数 | | - -**示例:** - -获取给`mid=686127`包月充电的用户排名 - -```shell -curl 'https://api.bilibili.com/x/upower/up/member/rank/v2' \ - --data-urlencode 'up_mid=686127' \ - --data-urlencode 'ps=3' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "up_info": { - "mid": 686127, - "nickname": "籽岷", - "avatar": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "type": 0, - "title": "2024百大UP主、知名游戏UP主", - "upower_state": 3 - }, - "rank_info": [ - { - "mid": 187012867, - "nickname": "是我灬不配", - "avatar": "https://i1.hdslb.com/bfs/face/ad4d2ce0705fd766a0ade315f5a6a5984ce479f4.jpg", - "rank": 1, - "day": 682, - "expire_at": 0, - "remain_days": 0 - }, - { - "mid": 20135495, - "nickname": "和平时一样鸽", - "avatar": "https://i2.hdslb.com/bfs/face/0eef725964105f39b1f000a59f232d9094017544.jpg", - "rank": 2, - "day": 620, - "expire_at": 0, - "remain_days": 0 - }, - { - "mid": 490065730, - "nickname": "乔治Y-GYhaha", - "avatar": "https://i1.hdslb.com/bfs/face/e1753e1e43d7a7df5333c5a2f4d3ec1d0334ebe6.jpg", - "rank": 3, - "day": 527, - "expire_at": 0, - "remain_days": 0 - } - ], - "user_info": { - "mid": 425503913, - "nickname": "晨叶梦春", - "avatar": "https://i2.hdslb.com/bfs/face/540ed71e2fb2ddd8967c21b392026c34fc15673e.jpg", - "rank": -1, - "day": 0, - "expire_at": 0, - "remain_days": 0 - }, - "member_total": 46881, - "privilege_type": 50, - "is_charge": false, - "tabs": [50, 10], - "level_info": [ - { - "privilege_type": 50, - "name": "审稿", - "price": 12800, - "member_total": 1082 - }, - { - "privilege_type": 10, - "name": "石粒", - "price": 600, - "member_total": 46158 - } - ] - } -} -``` - -</details> diff --git a/docs/emoji/action.md b/docs/emoji/action.md deleted file mode 100644 index d5bc0bd..0000000 --- a/docs/emoji/action.md +++ /dev/null @@ -1,105 +0,0 @@ -# 表情操作 - -## 添加表情包 - -> https://api.bilibili.com/x/emote/package/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -只能添加有会员权限或已购买的表情包 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | -------------------------------- | -| package_id | num | 表情包id | 必要 | | -| business | str | 使用场景 | 必要 | reply:评论区<br />dynamic:动态 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -添加id为`25`的表情包,使用场景为评论区 - -```shell -curl 'https://api.bilibili.com/x/emote/package/add' \ ---data-urlencode 'package_id=25' \ ---data-urlencode 'business=reply' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 移除表情包 - -> https://api.bilibili.com/x/emote/package/remove - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | -------------------------------- | -| package_id | num | 表情包id | 必要 | | -| business | str | 使用场景 | 必要 | reply:评论区<br />dynamic:动态 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -移除id为`25`的表情包,使用场景为评论区 - -```shell -curl 'https://api.bilibili.com/x/emote/package/remove' \ ---data-urlencode 'package_id=25' \ ---data-urlencode 'business=reply' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/emoji/list.md b/docs/emoji/list.md deleted file mode 100644 index 1435982..0000000 --- a/docs/emoji/list.md +++ /dev/null @@ -1,639 +0,0 @@ -# 表情列表 - -## 获取我的表情列表 - -> https://api.bilibili.com/x/emote/user/panel/web - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -使用登录(Cookie)进行会员专属及已购买表情包的分发,否则全为免费表情包 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | -------------------------------- | -| business | str | 使用场景 | 必要 | reply:评论区<br />dynamic:动态 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | ---- | -| packages | array | 表情包 | | - -`data`中的`packages`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | -------------- | -| 0 | obj | 表情包1 | **详情见附表** | -| n | obj | 表情包(n+1) | **详情见附表** | -| …… | obj | …… | …… | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/emote/user/panel/web' \ ---data-urlencode 'business=reply' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "packages": [ - { - "id": 1, - "text": "小黄脸", - "url": "http://i0.hdslb.com/bfs/emote/81edf17314cea3b48674312b4364df44d5c01f17.png", - "mtime": 1591604235, - "type": 1, - "attr": 66, - "meta": { - "size": 1, - "item_id": 958 - }, - "emote": [ - { - "id": 2126, - "package_id": 1, - "text": "[视频卫星]", - "url": "http://i0.hdslb.com/bfs/emote/dce6fc7d6dfeafff01241924db60f8251cca5307.png", - "mtime": 1590986882, - "type": 1, - "attr": 0, - "meta": { - "size": 1 - }, - "flags": {} - }, - { - "id": 1901, - "package_id": 1, - "text": "[加油武汉]", - "url": "http://i0.hdslb.com/bfs/emote/eb966aaa5b690d3f9308a9f936f5b5a72a7f956b.png", - "mtime": 1580024058, - "type": 1, - "attr": 0, - "meta": { - "size": 1 - }, - "flags": {} - }, - { - "id": 1906, - "package_id": 1, - "text": "[口罩]", - "url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png", - "mtime": 1581309529, - "type": 1, - "attr": 0, - "meta": { - "size": 1 - }, - "flags": {} - }, - { - "id": 1, - "package_id": 1, - "text": "[微笑]", - "url": "http://i0.hdslb.com/bfs/emote/685612eadc33f6bc233776c6241813385844f182.png", - "mtime": 1582182040, - "type": 1, - "attr": 0, - "meta": { - "size": 1 - }, - "flags": {} - }, - { - "id": 1958, - "package_id": 1, - "text": "[笑]", - "url": "http://i0.hdslb.com/bfs/emote/81edf17314cea3b48674312b4364df44d5c01f17.png", - "mtime": 1582184940, - "type": 1, - "attr": 0, - "meta": { - "size": 1 - }, - "flags": {} - }, - ………… - }, - { - "id": 53, - "text": "热词系列一", - "url": "http://i0.hdslb.com/bfs/emote/bacd6e17997348873ef89e5f1bcbbda877a1606a.png", - "mtime": 1592205524, - "type": 1, - "attr": 2, - "meta": { - "size": 2, - "item_id": 1039 - }, - "emote": [ - { - "id": 1937, - "package_id": 53, - "text": "[热词系列_知识增加]", - "url": "http://i0.hdslb.com/bfs/emote/142409b595982b8210b2958f3d340f3b47942645.png", - "mtime": 1585202919, - "type": 1, - "attr": 2, - "meta": { - "size": 2, - "alias": "知识增加" - }, - "flags": {} - }, - { - "id": 2147, - "package_id": 53, - "text": "[热词系列_希望没事]", - "url": "http://i0.hdslb.com/bfs/emote/6c0d2e6c486d1ba5afd6204a96e102652464a01d.png", - "mtime": 1591689594, - "type": 1, - "attr": 2, - "meta": { - "size": 2, - "alias": "希望没事" - }, - "flags": {} - }, - { - "id": 2083, - "package_id": 53, - "text": "[热词系列_泪目]", - "url": "http://i0.hdslb.com/bfs/emote/bba3703ab90b7d16fe9dbcb85ed949db687f8331.png", - "mtime": 1588910215, - "type": 1, - "attr": 2, - "meta": { - "size": 2, - "alias": "泪目" - }, - "flags": {} - }, - { - "id": 2082, - "package_id": 53, - "text": "[热词系列_保护]", - "url": "http://i0.hdslb.com/bfs/emote/55f8f6445ca7c3170cdfc5b16036abf639ce9b57.png", - "mtime": 1588910215, - "type": 1, - "attr": 2, - "meta": { - "size": 2, - "alias": "保护" - }, - "flags": {} - }, - ………… - }, - ………… - ] - } -} -``` - -</details> - -## 获取指定的表情包明细 - -> https://api.bilibili.com/x/emote/package - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | -------------------------------- | -| business | str | 使用场景 | 必要 | reply:评论区<br />dynamic:动态 | -| ids | nums | 表情包id | 必要 | id之间以`,`隔开 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj<br />无效时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | ---- | -| packages | array | 表情包 | | - -`data`中的`packages`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | -------------- | -| 0 | obj | 表情包1 | **详情见附表** | -| n | obj | 表情包(n+1) | **详情见附表** | -| …… | obj | …… | …… | - -**示例:** - -获取表情包id为`93`的表情包明细 - -```shell -curl -G 'https://api.bilibili.com/x/emote/package' \ ---data-urlencode 'ids=93' \ ---data-urlencode 'business=reply' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "packages": [ - { - "id": 93, - "text": "泠鸢yousa", - "url": "http://i0.hdslb.com/bfs/emote/5fa6082e098402d16d58c68e441ae76e40befd2c.png", - "mtime": 1592213522, - "type": 3, - "attr": 28, - "meta": { - "size": 2, - "item_id": 1907, - "item_url": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1&stahide=0&id=1911" - }, - "emote": [ - { - "id": 2086, - "package_id": 93, - "text": "[泠鸢yousa_awsl]", - "url": "http://i0.hdslb.com/bfs/emote/7663b729161bd4556c2ec318c07791000743eb56.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "awsl" - }, - "flags": {} - }, - { - "id": 2087, - "package_id": 93, - "text": "[泠鸢yousa_打call]", - "url": "http://i0.hdslb.com/bfs/emote/718e9495846db4172eb87d2f7f02015a34d35ea2.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "打call" - }, - "flags": {} - }, - { - "id": 2088, - "package_id": 93, - "text": "[泠鸢yousa_沉默]", - "url": "http://i0.hdslb.com/bfs/emote/5e967cf1669743ed92e9a8ff3e5de6d90ca63d3d.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "沉默" - }, - "flags": {} - }, - { - "id": 2089, - "package_id": 93, - "text": "[泠鸢yousa_大哭]", - "url": "http://i0.hdslb.com/bfs/emote/3f757b147b9b1e201470eae7dac9cc0360172569.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "大哭" - }, - "flags": {} - }, - { - "id": 2090, - "package_id": 93, - "text": "[泠鸢yousa_干杯]", - "url": "http://i0.hdslb.com/bfs/emote/5cf5e14101be845233a222ab1bbdc21c63af04c3.png", - "mtime": 1590401422, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "干杯" - }, - "flags": {} - }, - { - "id": 2091, - "package_id": 93, - "text": "[泠鸢yousa_好人卡]", - "url": "http://i0.hdslb.com/bfs/emote/e3907b3bb20b18e7ecb11cd86829c9a4ce5b1b2f.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "好人卡" - }, - "flags": {} - }, - { - "id": 2092, - "package_id": 93, - "text": "[泠鸢yousa_加大力度]", - "url": "http://i0.hdslb.com/bfs/emote/a0393a2d4b522f07a319dfd2e91754a3cdff2c48.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "加大力度" - }, - "flags": {} - }, - { - "id": 2093, - "package_id": 93, - "text": "[泠鸢yousa_滑稽]", - "url": "http://i0.hdslb.com/bfs/emote/a8057c0e0579b93c16010a270e261fd0a64034af.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "滑稽" - }, - "flags": {} - }, - { - "id": 2094, - "package_id": 93, - "text": "[泠鸢yousa_请吃桃]", - "url": "http://i0.hdslb.com/bfs/emote/e92276d9d8c28f85f7dbcc0fbbb6ecb3345ce33e.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "请吃桃" - }, - "flags": {} - }, - { - "id": 2095, - "package_id": 93, - "text": "[泠鸢yousa_惊讶]", - "url": "http://i0.hdslb.com/bfs/emote/9fdc2c5b4b970aded56fe2f326bd4d00e849339d.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "惊讶" - }, - "flags": {} - }, - { - "id": 2096, - "package_id": 93, - "text": "[泠鸢yousa_生气]", - "url": "http://i0.hdslb.com/bfs/emote/9e6ba9ff34101e04d3e321cad486f845f892050e.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "生气" - }, - "flags": {} - }, - { - "id": 2097, - "package_id": 93, - "text": "[泠鸢yousa_贴贴]", - "url": "http://i0.hdslb.com/bfs/emote/dbc177d314231add509501ffc6bc7655fca2c10f.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "贴贴" - }, - "flags": {} - }, - { - "id": 2098, - "package_id": 93, - "text": "[泠鸢yousa_头晕]", - "url": "http://i0.hdslb.com/bfs/emote/49830c1c8a1652f7ee9cb854ac7dbf8e378cdcd6.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "头晕" - }, - "flags": {} - }, - { - "id": 2099, - "package_id": 93, - "text": "[泠鸢yousa_问号]", - "url": "http://i0.hdslb.com/bfs/emote/ab7a543233eff83138c3221c86a762ab36bab7bc.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "问号" - }, - "flags": {} - }, - { - "id": 2100, - "package_id": 93, - "text": "[泠鸢yousa_真棒]", - "url": "http://i0.hdslb.com/bfs/emote/02ea49543a3ac52feee185c156ab08fb2bfdd89e.png", - "mtime": 1589776042, - "type": 3, - "attr": 0, - "meta": { - "size": 2, - "alias": "真棒" - }, - "flags": {} - } - ], - "flags": { - "added": true - } - } - ] - } -} -``` - -</details> - -## 获取所有表情包列表 - -> https://api.bilibili.com/x/emote/setting/panel - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | -------------------------------- | -| business | str | 使用场景 | 必要 | reply:评论区<br />dynamic:动态 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ----- | ---------------- | ---- | -| user_panel_packages | array | 用户拥有的表情包 | | -| all_packages | array | 所有表情包 | | -| mall | obj | 商城页面 | | - -`data`对象中的`user_panel_packages`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------------- | -------------- | -| 0 | obj | 用户拥有的表情包1 | **详情见附表** | -| n | obj | 用户拥有的表情包(n+1) | **详情见附表** | -| …… | obj | …… | …… | - -`data`对象中的`all_packages`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | -------------- | -| 0 | obj | 所有表情包1 | **详情见附表** | -| n | obj | 所有表情包(n+1) | **详情见附表** | -| …… | obj | …… | …… | - -`data`对象中的`mall`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ----------- | ---- | -| title | str | 商城名称 | | -| url | str | 商城页面url | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/emote/setting/panel' \ ---data-urlencode 'business=reply' \ --b 'SESSDATA=xxx' -``` - -**限于篇幅,代码块示例略** - -## 附表-表情包对象 - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ----------------- | -------------------------------------------------------- | -| id | num | 表情包id | | -| text | str | 表情包名称 | | -| url | str | 表情包标志图片url | | -| mtime | num | 创建时间 | 时间戳 | -| type | num | 表情包类型 | 1:普通<br />2:会员专属<br />3:购买所得<br />4:颜文字 | -| attr | num | ??? | **作用尚不明确** | -| meta | obj | 属性信息 | | -| emote | array | 表情列表 | | -| flags | obj | 是否添加标志 | | - -`表情包对象`中的`flags`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | ------------------------------------------------------------ | -| added | bool | 是否已添加 | true:已添加<br />false:未添加<br />需要登录(SESSDATA)<br />否则恒为false | - -`表情包对象`中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | --------------- | ---------------- | -| size | num | 表情尺寸信息 | 1:小<br />2:大 | -| item_id | num | 购买物品id | | -| item_url | num | 购买物品页面url | 无则无此项 | - -`表情包对象`中的`emote`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 表情1 | | -| n | obj | 表情(n+1) | | -| …… | obj | …… | …… | - -`emote`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ----------- | -------------------------------------------------------- | -| id | num | 表情id | | -| package_id | num | 表情包id | | -| text | str | 表情转义符 | 颜文字时为该字串 | -| url | str | 表情图片url | 颜文字时为该字串 | -| mtime | num | 创建时间 | 时间戳 | -| type | num | 表情类型 | 1:普通<br />2:会员专属<br />3:购买所得<br />4:颜文字 | -| attr | num | ??? | **作用尚不明确** | -| meta | obj | 属性信息 | | -| flags | obj | 禁用标志 | 无则为空 | - -`emote`数组中的对象中的`flags`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------- | ------------------------------------------------------ | -| no_access | bool | 是否为禁用 | true:禁用<br />需要登录(SESSDATA)<br />否则恒为true | - -`emote`数组中的对象中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---------------- | -| size | num | 表情尺寸信息 | 1:小<br />2:大 | -| alias | str | 简写名 | 无则无此项 | diff --git a/docs/fav/action.md b/docs/fav/action.md deleted file mode 100644 index 1672164..0000000 --- a/docs/fav/action.md +++ /dev/null @@ -1,472 +0,0 @@ -# 收藏夹操作 - -## 管理收藏夹 - -### 新建收藏夹 - -> https://api.bilibili.com/x/v3/fav/folder/add - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | -------------- | ------------------------------------ | -| title | str | 收藏夹标题 | 必要 | | -| intro | str | 收藏夹简介 | 非必要 | 默认为空 | -| privacy | num | 是否公开 | 非必要 | 默认为公开<br />0:公开<br />1:私密 | -| cover | str | 封面图url | 非必要 | 封面会被审核 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功<br />-102:账号被封停 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -略.... - -详见[获取收藏夹元数据](info.md#获取收藏夹元数据)中的`data`对象 - -**示例:** - -创建一个叫`test`,简介是`2333`,封面`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,的公开收藏夹: - -```shell -curl 'https://api.bilibili.com/x/v3/fav/folder/add' \ ---data-urlencode 'title=test' \ ---data-urlencode 'intro=2333' \ ---data-urlencode 'privacy=0' \ ---data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1182306172, - "fid": 11823061, - "mid": 470310172, - "attr": 6, - "title": "test", - "cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", - "upper": { - "mid": 0, - "name": "", - "face": "", - "followed": false, - "vip_type": 0, - "vip_statue": 0 - }, - "cover_type": 0, - "cnt_info": { - "collect": 0, - "play": 0, - "thumb_up": 0, - "share": 0 - }, - "type": 0, - "intro": "2333", - "ctime": 0, - "mtime": 0, - "state": 0, - "fav_state": 0, - "like_state": 0, - "media_count": 0 - } -} -``` - -</details> - -### 修改收藏夹 - -> https://api.bilibili.com/x/v3/fav/folder/edit - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | -------------- | ------------------------------------------ | -| media_id | num | 目标收藏夹mdid | 必要 | | -| title | str | 修改收藏夹标题 | 必要 | | -| intro | str | 修改收藏夹简介 | 非必要 | | -| privacy | num | 是否公开 | 非必要 | 默认为公开<br /><br />0:公开<br />1:私密 | -| cover | str | 封面图url | 非必要 | 封面会被审核 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功<br />-102:账号被封停 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -略.... - -详见[获取收藏夹元数据](info.md#获取收藏夹元数据)中的`data`对象 - -**示例:** - -修改id为`1182306172`的名字为`test`,简介为`2333`,封面为`https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png`,公开收藏夹: - -```shell -curl 'https://api.bilibili.com/x/v3/fav/folder/edit' \ ---data-urlencode 'media_id=1182306172' \ ---data-urlencode 'title=test' \ ---data-urlencode 'intro=2333' \ ---data-urlencode 'privacy=0' \ ---data-urlencode 'cover=https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1182306172, - "fid": 11823061, - "mid": 470310172, - "attr": 6, - "title": "test", - "cover": "https://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", - "upper": { - "mid": 0, - "name": "", - "face": "", - "followed": false, - "vip_type": 0, - "vip_statue": 0 - }, - "cover_type": 0, - "cnt_info": { - "collect": 0, - "play": 0, - "thumb_up": 0, - "share": 0 - }, - "type": 0, - "intro": "2333", - "ctime": 0, - "mtime": 0, - "state": 0, - "fav_state": 0, - "like_state": 0, - "media_count": 0 - } -} -``` - -</details> - -### 删除收藏夹 - -> https://api.bilibili.com/x/v3/fav/folder/del - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ------------------------ | -------------- | ------------------- | -| media_ids | nums | 目标收藏夹mdid列表 | 必要 | 每个成员间用`,`分隔 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 成功为0 | -| ttl | num | 1 | | -| data | num | 信息本体 | 成功为0 | - -**示例:** - -删除id为`1182306172`的收藏夹: - -```shell -curl 'https://api.bilibili.com/x/v3/fav/folder/del' \ ---data-urlencode 'media_ids=1182306172' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":0 -} -``` - -</details> - -## 管理收藏内容 - -### 批量复制内容 - -> https://api.bilibili.com/x/v3/fav/resource/copy - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| src_media_id | num | 源收藏夹id | 必要 | | -| tar_media_id | num | 目标收藏夹id | 必要 | | -| mid | num | 当前用户mid | 必要 | | -| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2:视频稿件<br />12:音频<br />21:视频合集<br />内容id:<br />视频稿件:视频稿件avid<br />音频:音频auid<br />视频合集:视频合集id | -| platform | str | 平台标识 | 非必要 | 可为web | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />11010:您访问的内容不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 成功为0 | - -**示例:** - -将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`复制到id为`1178751999`的收藏夹中 - -```shell -curl 'https://api.bilibili.com/x/v3/fav/resource/copy' \ ---data-urlencode 'src_media_id=1288061499' \ ---data-urlencode 'tar_media_id=1178751999' \ ---data-urlencode 'mid=233333' \ ---data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \ ---data-urlencode 'platform=web' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":0 -} -``` - -</details> - -### 批量移动内容 - -> https://api.bilibili.com/x/v3/fav/resource/move - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| src_media_id | num | 源收藏夹id | 必要 | | -| tar_media_id | num | 目标收藏夹id | 必要 | | -| mid | num | 当前用户mid | 必要 | | -| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2:视频稿件<br />12:音频<br />21:视频合集<br />内容id:<br />视频稿件:视频稿件avid<br />音频:音频auid<br />视频合集:视频合集id | -| platform | str | 平台标识 | 非必要 | 可为web | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />11010:您访问的内容不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 成功为0 | - -**示例:** - -将id为`1288061499`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`移动到id为`1178751999`的收藏夹中 - -```shell -curl 'https://api.bilibili.com/x/v3/fav/resource/move' \ ---data-urlencode 'src_media_id=1288061499' \ ---data-urlencode 'tar_media_id=1178751999' \ ---data-urlencode 'mid=233333' \ ---data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \ ---data-urlencode 'platform=web' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":0 -} -``` - -</details> - -### 批量删除内容 - -> https://api.bilibili.com/x/v3/fav/resource/batch-del - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | -------------- | ------------------------ | ------------------------------------------------------------ | ------- | -| resources | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2:视频稿件<br />12:音频<br />21:视频合集<br />内容id:<br />视频稿件:视频稿件avid<br />音频:音频auid<br />视频合集:视频合集id | | -| media_id | num | 目标收藏夹id | 必要 | | -| platform | str | 平台标识 | 非必要 | 可为web | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />11010:您访问的内容不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 成功为0 | - -**示例:** - -将id为`1178751999`的收藏夹中视频稿件`av21822819` `av21918689` `av22288065`取消收藏 - -```shell -curl 'https://api.bilibili.com/x/v3/fav/resource/batch-del' \ ---data-urlencode 'resources=21822819:2,21918689:2,22288065:2' \ ---data-urlencode 'media_id=1178751999' \ ---data-urlencode 'platform=web' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":0 -} -``` - -</details> - -### 清空所有失效内容 - -> https://api.bilibili.com/x/v3/fav/resource/clean - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | -------------- | ---- | -| media_id | num | 目标收藏夹id | 必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 成功为0 | - -**示例:** - -清理id为`1161340172`的收藏夹 - -```shell -curl 'https://api.bilibili.com/x/v3/fav/resource/clean' \ ---data-urlencode 'media_id=1161340172' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":0 -} -``` - -</details> diff --git a/docs/fav/info.md b/docs/fav/info.md deleted file mode 100644 index fe02478..0000000 --- a/docs/fav/info.md +++ /dev/null @@ -1,571 +0,0 @@ -# 收藏夹基本信息 - -<img src="../../assets/img/collect.svg" width="100" height="100" /> - -## 获取收藏夹元数据 - -> https://api.bilibili.com/x/v3/fav/folder/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) 或 APP - -**注:查询权限收藏夹时需要相应用户登录** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------------- | ------ | ---- | -| media_id | num | 目标收藏夹id(完整id) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-403:访问权限不足<br />11010: 内容不存在 | -| message | str | 错误信息 | 默认为0 | -| data | 有效时:obj<br />无效或:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------------- | -------------------------------------------------- | -| id | num | 收藏夹mlid(完整id) | 收藏夹原始id+创建者mid尾号2位 | -| fid | num | 收藏夹原始id | | -| mid | num | 创建者mid | | -| attr | num | 属性位(?) | | -| title | str | 收藏夹标题 | | -| cover | str | 收藏夹封面图片url | | -| upper | obj | 创建者信息 | | -| cover_type | num | 封面图类别(?) | | -| cnt_info | obj | 收藏夹状态数 | | -| type | num | 类型(?) | 一般是11 | -| intro | str | 备注 | | -| ctime | num | 创建时间 | 时间戳 | -| mtime | num | 收藏时间 | 时间戳 | -| state | num | 状态(?) | 一般为0 | -| fav_state | num | 收藏夹收藏状态 | 已收藏收藏夹:1<br />未收藏收藏夹:0<br />需要登录 | -| like_state | num | 点赞状态 | 已点赞:1<br />未点赞:0<br />需要登录 | -| media_count | num | 收藏夹内容数量 | | - -`data`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------- | ----------------------------------------------- | -| mid | num | 创建者mid | | -| name | str | 创建者昵称 | | -| face | str | 创建者头像url | | -| followed | bool | 是否已关注创建者 | | -| vip_type | num | 会员类别 | 0:无<br />1:月大会员<br />2:年度及以上大会员 | -| vip_statue | num | 会员开通状态 | 0:无<br />1:有 | - -`data`中的`cnt_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------ | ---- | -| collect | num | 收藏数 | | -| play | num | 播放数 | | -| thumb_up | num | 点赞数 | | -| share | num | 分享数 | | - -**示例:** - -查询收藏夹`id=1052622027`的元数据 - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/folder/info' \ ---data-urlencode 'media_id=1052622027' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "id": 1052622027, - "fid": 10526220, - "mid": 686127, - "attr": 54, - "title": "猛 男 生 存", - "cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg", - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "followed": true, - "vip_type": 2, - "vip_statue": 1 - }, - "cover_type": 2, - "cnt_info": { - "collect": 3393, - "play": 184822, - "thumb_up": 3918, - "share": 44 - }, - "type": 11, - "intro": "猛 男 生 存", - "ctime": 1598884758, - "mtime": 1598884758, - "state": 0, - "fav_state": 0, - "like_state": 0, - "media_count": 28 - } -} -``` - -</details> - -## 获取指定用户创建的所有收藏夹信息 - -> https://api.bilibili.com/x/v3/fav/folder/created/list-all - -*请求方式:GET* - -认证方式:Cookie (SESSDATA) 或 APP - -若欲查看相应用户的私密收藏夹需要登录 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| up_mid | num | 目标用户mid | 必要 | | -| type | num | 目标内容属性 | 非必要 | 默认为全部<br />0:全部<br />2:视频稿件 | -| rid | num | 目标内容id | 非必要 | 视频稿件:视频稿件avid | -| web_location | str | 333.1387 | 非必要| | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null<br />公开时:obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | --------------------------------------- | -------------- | ---- | -| count | num | 创建的收藏夹数 | | -| list | 无收藏夹时:null<br />有收藏夹时:array | 收藏夹列表 | | -| season | null | (?) | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | --------------------- | -| 0 | obj | 收藏夹1 | | -| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 | -| …… | obj | …… | | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------------------ | ------------------------------------------ | -| id | num | 收藏夹mlid(完整id) | 收藏夹原始id+创建者mid尾号2位 | -| fid | num | 收藏夹原始id | | -| mid | num | 创建者mid | | -| attr | num | 收藏夹属性 | 二进制位属性<br />详细说明见下表 | -| title | str | 收藏夹标题 | | -| fav_state | num | 目标id是否存在于该收藏夹 | 存在于该收藏夹:1<br />不存在于该收藏夹:0 | -| media_count | num | 收藏夹内容数量 | | - -`attr`属性位二进制值表: - -| 位 | 内容 | 备注 | -| --------------- | ---------------- | -------------------------------- | -| 0 | 私有收藏夹 | 0:公开<br />1:私有 | -| 1 | 是否为默认收藏夹 | 0:默认收藏夹<br />1:其他收藏夹 | -| 其他有待补充... | | | - -**示例:** - -查询用户`mid=7792521`的收藏夹列表 - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/folder/created/list-all' \ ---data-urlencode 'up_mid=7792521' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 5, - "list": [{ - "id": 44233921, - "fid": 442339, - "mid": 7792521, - "attr": 0, - "title": "默认收藏夹", - "fav_state": 0, - "media_count": 85 - }, { - "id": 936347621, - "fid": 9363476, - "mid": 7792521, - "attr": 22, - "title": "放假君的鬼畜私房歌", - "fav_state": 0, - "media_count": 2 - }, { - "id": 845218621, - "fid": 8452186, - "mid": 7792521, - "attr": 22, - "title": "♪一言不合就开唱♪", - "fav_state": 0, - "media_count": 4 - }, { - "id": 844998121, - "fid": 8449981, - "mid": 7792521, - "attr": 22, - "title": "个人作品精选", - "fav_state": 0, - "media_count": 25 - }, { - "id": 381779121, - "fid": 3817791, - "mid": 7792521, - "attr": 22, - "title": "鬼畜小课堂", - "fav_state": 0, - "media_count": 25 - }] - } -} -``` - -</details> - -## 查询用户收藏的视频收藏夹 - -> https://api.bilibili.com/x/v3/fav/folder/collected/list - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| ps | num | 每页项数 | 必要 | 定义域 1 - 大于70 | -| pn | num | 页码 | 必要 | | -| up_mid | num | 目标用户mid | 必要 | | -| platform | str | 平台类型 | 非必要 | 填写web 返回值才会包含用户收藏的视频合集 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />40022:签名过长 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null<br />公开时:obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | --------------------------------------- | -------------- | ---- | -| count | num | 创建的收藏夹数 | | -| list | 无收藏夹时:null<br />有收藏夹时:array | 收藏夹列表 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | --------------------- | -| 0 | obj | 收藏夹1 | | -| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 | -| …… | obj | …… | | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------------ | ----------------------------------------- | -| id | num | 收藏夹ml | | -| fid | num | 原始收藏夹mlid | 去除两位mid尾号 | -| mid | num | 创建用户mid | | -| attr | num | 收藏夹属性 | [同上 attr](#获取指定用户创建的所有收藏夹信息) | -| title | str | 收藏夹标题 | | -| cover | str | 收藏夹封面图片url | | -| upper | obj | 收藏夹创建用户信息 | | -| cover_type | num | 2 | 作用尚不明确 | -| intro | str | 空 | 作用尚不明确 | -| ctime | num | 创建时间 | 时间戳 | -| mtime | num | 审核时间 | 时间戳 | -| state | num | 0, 1 | 0: 正常;1:收藏夹已失效 | -| fav_state | num | 0 | 作用尚不明确 | -| media_count | num | 收藏夹总计视频数 | | - -`data`中的`list`数组中的对象中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ------------ | -| mid | num | 创建人mid | | -| name | str | 创建人昵称 | | -| face | str | 空 | 作用尚不明确 | - -**示例:** - -查询用户`mid=293793435`的收藏夹收藏列表 - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/folder/collected/list' \ ---data-urlencode 'up_mid=293793435' \ ---data-urlencode 'ps=20' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 2, - "list": [{ - "id": 496307088, - "fid": 4963070, - "mid": 412466388, - "attr": 22, - "title": "入站必刷", - "cover": "http://i0.hdslb.com/bfs/archive/baae2b4050363c0ab45465b7cf696b8304fdaca8.jpg", - "upper": { - "mid": 412466388, - "name": "热门菌", - "face": "" - }, - "cover_type": 2, - "intro": "", - "ctime": 1563394571, - "mtime": 1563394571, - "state": 0, - "fav_state": 0, - "media_count": 55 - }, { - "id": 381779121, - "fid": 3817791, - "mid": 7792521, - "attr": 22, - "title": "鬼畜小课堂", - "cover": "http://i2.hdslb.com/bfs/archive/09a668cfdb38fb3a85f905c10f48a2947e36a695.jpg", - "upper": { - "mid": 7792521, - "name": "还有一天就放假了", - "face": "" - }, - "cover_type": 2, - "intro": "", - "ctime": 1553700224, - "mtime": 1557291666, - "state": 0, - "fav_state": 0, - "media_count": 25 - }] - } -} -``` - -</details> - -## 批量获取指定收藏id的内容 - -> https://api.bilibili.com/x/v3/fav/resource/infos - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------------- | ------ | ------------------------------------------------------------ | -| resources | strs | 目标内容id列表 | 必要 | 格式:{内容id}:{内容类型}<br />每个成员间用`,`分隔<br />类型:<br />2:视频稿件<br />12:音频<br />内容id:<br />视频稿件:视频稿件avid<br />音频:音频auid | -| platform | str | 平台标识 | 非必要 | 可为web(影响内容列表类型) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | ------------ | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| data | 有效时:array<br />无效或:null | 内容信息列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 内容信息1 | | -| n | obj | 内容信息(n+1) | | -| ... | obj | ... | | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------- | ------------------------------------------------------------ | -| id | num | 内容id | 视频稿件:视频稿件avid<br />音频:音频auid | -| type | num | 内容类型 | 2:视频稿件<br />12:音频 | -| title | str | 标题 | | -| cover | str | 封面url | | -| intro | str | 简介 | | -| page | num | 视频分P数 | | -| duration | num | 音频/视频时长 | | -| upper | obj | UP主信息 | | -| attr | num | 属性 | 0:正常<br />1:失效 | -| cnt_info | obj | 状态数 | | -| link | str | 跳转uri | | -| ctime | num | 投稿时间 | 时间戳 | -| pubtime | num | 发布时间 | 时间戳 | -| fav_time | num | 收藏时间 | 时间戳 | -| bv_id | str | 视频稿件bvid | | -| bvid | str | 视频稿件bvid | | -| season | null | (?) | | - -`data`数组中的对象中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| mid | num | UP主mid | | -| name | str | UP主昵称 | | -| face | str | UP主头像url | | - -`data`数组中的对象中的`cnt_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ---- | -| collect | num | 收藏数 | | -| play | num | 播放数 | | -| danmaku | num | 弹幕数 | | - -**示例:** - -批量查询内容 - -1-视频稿件-`av583785685` - -2-音频-`au15664` - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/resource/infos' \ ---data-urlencode 'resources=583785685:2,15664:12' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 583785685, - "type": 2, - "title": "已失效视频", - "cover": "http://i0.hdslb.com/bfs/archive/be27fd62c99036dce67efface486fb0a88ffed06.jpg", - "intro": "审核君辛苦了~\r\n使用curl命令访问B站api,实现二维码登录 查询登录信息 视频投币 发送评论的操作\r\n本视频作为api收集项目的一个硬核DEMO\r\n由于当时录音的问题,大部分是后期配的,后面声音有点小\r\n想了解更多的去github页面,也可以qq\r\n\r\nbgm:\r\n雲流れ\r\nAutumn rain(未修改版)\r\n四月,初雨微凉", - "page": 1, - "duration": 604, - "upper": { - "mid": 293793435, - "name": "社会易姐QwQ", - "face": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "attr": 1, - "cnt_info": { - "collect": 1470, - "play": 28374, - "danmaku": 64 - }, - "link": "bilibili://video/583785685", - "ctime": 1594049831, - "pubtime": 1594049831, - "fav_time": 0, - "bv_id": "BV1kz4y1X7XP", - "bvid": "BV1kz4y1X7XP", - "season": null - }, - { - "id": 523, - "type": 21, - "title": "2021哔哩哔哩拜年纪", - "cover": "https://i0.hdslb.com/bfs/archive/8ccc50f7cbc671762e0536491bd2b8aeebc0837d.jpg", - "intro": "感谢各位制作者们的辛勤付出!节目精彩,愿大家看的开心!", - "page": 0, - "duration": 0, - "upper": { - "mid": 1868902080, - "name": "哔哩哔哩拜年纪", - "face": "http://i0.hdslb.com/bfs/face/7f6cb94fc071aca9fbb4b1ca9cc6415e86847576.jpg" - }, - "attr": 0, - "cnt_info": { - "collect": 0, - "play": 71527018, - "danmaku": 480547 - }, - "link": "bilibili://video/373561162", - "ctime": 0, - "pubtime": 0, - "fav_time": 0, - "bv_id": "", - "bvid": "", - "season": null - }, - { - "id": 15664, - "type": 12, - "title": "威风堂堂", - "cover": "http://i0.hdslb.com/bfs/music/c417d30b394a8a5d4e8a150ad75837dbae3b79d4.jpg", - "intro": "翻唱。在电脑里放了半个月终于!!!大家寒假快乐!!❁本家sm19233263;❁压制: 寒雨;❁mix: 三星堆;❁vocal: 茶理理。超喜欢michan的那段英文念白所以加了进来w 谢谢三月月和嘟比比你们后期辛苦了!", - "page": 1, - "duration": 200, - "upper": { - "mid": 684169, - "name": "茶理理理子", - "face": "" - }, - "attr": 0, - "cnt_info": { - "collect": 48872, - "play": 1508426, - "danmaku": 0 - }, - "link": "bilibili://music/detail/15664?name=%E5%A8%81%E9%A3%8E%E5%A0%82%E5%A0%82&uperName=%E8%8C%B6%E7%90%86%E7%90%86%E7%90%86%E5%AD%90&cover_url=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Fmusic%2Fc417d30b394a8a5d4e8a150ad75837dbae3b79d4.jpg&upperId=684169&author=%E8%8C%B6%E7%90%86%E7%90%86", - "ctime": 1502347604, - "pubtime": 1502347604, - "fav_time": 0, - "bv_id": "BV1bx411c7qt", - "bvid": "BV1bx411c7qt", - "season": null - } - ] -} -``` - -</details> diff --git a/docs/fav/list.md b/docs/fav/list.md deleted file mode 100644 index 34cbae9..0000000 --- a/docs/fav/list.md +++ /dev/null @@ -1,560 +0,0 @@ -# 收藏夹内容 - -## 获取收藏夹内容明细列表 - -> https://api.bilibili.com/x/v3/fav/resource/list - -*请求方式:GET* - -认证方式:Cookie或APP - -**注:查询权限收藏夹时需要相应用户登录** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| media_id | num | 目标收藏夹mlid(完整id) | 必要 | | -| tid | num | 分区tid | 非必要 | 默认为全部分区<br />0:全部分区<br />[详见说明](../video/video_zone.md) | -| keyword | str | 搜索关键字 | 非必要 | | -| order | str | 排序方式 | 非必要 | 按收藏时间:mtime<br />按播放量: view<br />按投稿时间:pubtime | -| type | num | 查询范围 | 非必要 | 0:当前收藏夹(对应media_id)<br /> 1:全部收藏夹 | -| ps | num | 每页数量 | 必要 | 定义域:1-20 | -| pn | num | 页码 | 非必要 | 默认为1 | -| platform | str | 平台标识 | 非必要 | 可为web(影响内容列表类型) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| data | 有效时:obj<br />无效或:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ------------ | ---- | -| info | obj | 收藏夹元数据 | | -| medias | array | 收藏夹内容 | | -| has_more | bool | 收藏夹是否有下一页 | | -| ttl | num | 接口返回时间 | 时间戳 | - -`data`中的`info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------------- | -------------------------------------------------- | -| id | num | 收藏夹mlid(完整id) | 收藏夹原始id+创建者mid尾号2位 | -| fid | num | 收藏夹原始id | | -| mid | num | 创建者mid | | -| attr | num | 属性 | 0:正常<br />1:失效 | -| title | str | 收藏夹标题 | | -| cover | str | 收藏夹封面图片url | | -| upper | obj | 创建者信息 | | -| cover_type | num | 封面图类别(?) | | -| cnt_info | obj | 收藏夹状态数 | | -| type | num | 类型(?) | 一般是11 | -| intro | str | 备注 | | -| ctime | num | 创建时间 | 时间戳 | -| mtime | num | 收藏时间 | 时间戳 | -| state | num | 状态(?) | 一般为0 | -| fav_state | num | 收藏夹收藏状态 | 已收藏收藏夹:1<br />未收藏收藏夹:0<br />需要登录 | -| like_state | num | 点赞状态 | 已点赞:1<br />未点赞:0<br />需要登录 | -| media_count | num | 收藏夹内容数量 | | - - -`info`中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------- | ----------------------------------------------- | -| mid | num | 创建者mid | | -| name | str | 创建者昵称 | | -| face | str | 创建者头像url | | -| followed | bool | 是否已关注创建者 | | -| vip_type | num | 会员类别 | 0:无<br />1:月大会员<br />2:年度及以上大会员 | -| vip_statue | num | 会员开通状态 | 0:无<br />1:有 | - -`info`中的`cnt_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------ | ---- | -| collect | num | 收藏数 | | -| play | num | 播放数 | | -| thumb_up | num | 点赞数 | | -| share | num | 分享数 | | - -`data`中的`medias`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 收藏内容1 | | -| n | obj | 收藏内容(n+1) | | -| ... | obj | ... | | - -`medias`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------- | ------------------------------------------------------------ | -| id | num | 内容id | 视频稿件:视频稿件avid<br />音频:音频auid<br />视频合集:视频合集id | -| type | num | 内容类型 | 2:视频稿件<br />12:音频<br />21:视频合集 | -| title | str | 标题 | | -| cover | str | 封面url | | -| intro | str | 简介 | | -| page | num | 视频分P数 | | -| duration | num | 音频/视频时长 | | -| upper | obj | UP主信息 | | -| attr | num | 失效 | 0: 正常;9: up自己删除;1: 其他原因删除 | -| cnt_info | obj | 状态数 | | -| link | str | 跳转uri | | -| ctime | num | 投稿时间 | 时间戳 | -| pubtime | num | 发布时间 | 时间戳 | -| fav_time | num | 收藏时间 | 时间戳 | -| bv_id | str | 视频稿件bvid | | -| bvid | str | 视频稿件bvid | | -| season | null | (?) | | - -`medias`数组中的对象中的`upper`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| mid | num | UP主mid | | -| name | str | UP主昵称 | | -| face | str | UP主头像url | | - -`medias`数组中的对象中的`cnt_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ---- | -| collect | num | 收藏数 | | -| play | num | 播放数 | | -| danmaku | num | 弹幕数 | | - -**示例:** - -查询收藏夹`id=1052622027`,每页5个视频,第`1`页的内容明细 - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/resource/list' \ ---data-urlencode 'media_id=1052622027' \ ---data-urlencode 'platform=web' \ ---data-urlencode 'pn=1' \ ---data-urlencode 'ps=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "info": { - "id": 1052622027, - "fid": 10526220, - "mid": 686127, - "attr": 54, - "title": "猛 男 生 存", - "cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg", - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "followed": true, - "vip_type": 2, - "vip_statue": 1 - }, - "cover_type": 2, - "cnt_info": { - "collect": 3393, - "play": 184768, - "thumb_up": 3916, - "share": 44 - }, - "type": 11, - "intro": "猛 男 生 存", - "ctime": 1598884758, - "mtime": 1598884758, - "state": 0, - "fav_state": 0, - "like_state": 0, - "media_count": 28 - }, - "medias": [ - { - "id": 371494037, - "type": 2, - "title": "猛 男 生 存", - "cover": "http://i2.hdslb.com/bfs/archive/bb51ee8a5fc5e03996138155f0f682d30ee16484.jpg", - "intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集:BV1CZ4y1T7gC\n第二集:BV1oA411a72k\n第三集:BV1fK4y1e7Yj\n第四集:BV1Ya4y1E7Y6\n第五集:BV17V411z75A\n第六集:BV1oi4y137sw\n第七集:BV1Wt4y1D7Uu\n第八集:BV1Bp4y1q7y9\n第九集:BV1Lv411v7G2\n第十集:BV1Xi4y137ER\n第十一集:BV1nC4y1879J\n第十二集:BV1K54y1", - "page": 1, - "duration": 546, - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "attr": 0, - "cnt_info": { - "collect": 11256, - "play": 1638040, - "danmaku": 7697 - }, - "link": "bilibili://video/371494037", - "ctime": 1595690513, - "pubtime": 1595690513, - "fav_time": 1598884777, - "bv_id": "BV1CZ4y1T7gC", - "bvid": "BV1CZ4y1T7gC", - "season": null - }, - { - "id": 328991940, - "type": 2, - "title": "猛 男 生 存 2", - "cover": "http://i1.hdslb.com/bfs/archive/aa801612ea0229a08d000a525b715af24cba0964.jpg", - "intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集:BV1CZ4y1T7gC\n第二集:BV1oA411a72k\n第三集:BV1fK4y1e7Yj\n第四集:BV1Ya4y1E7Y6\n第五集:BV17V411z75A\n第六集:BV1oi4y137sw\n第七集:BV1Wt4y1D7Uu\n第八集:BV1Bp4y1q7y9\n第九集:BV1Lv411v7G2\n第十集:BV1Xi4y137ER\n第十一集:BV1nC4y1879J\n第十二集:BV1K54y1", - "page": 1, - "duration": 644, - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "attr": 0, - "cnt_info": { - "collect": 8695, - "play": 1334651, - "danmaku": 6064 - }, - "link": "bilibili://video/328991940", - "ctime": 1595770876, - "pubtime": 1595770876, - "fav_time": 1598884783, - "bv_id": "BV1oA411a72k", - "bvid": "BV1oA411a72k", - "season": null - }, - { - "id": 884042215, - "type": 2, - "title": "猛 男 生 存 3", - "cover": "http://i1.hdslb.com/bfs/archive/f99059637c110dcd1cdae765a946801fbcefe4ab.jpg", - "intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集:BV1CZ4y1T7gC\n第二集:BV1oA411a72k\n第三集:BV1fK4y1e7Yj\n第四集:BV1Ya4y1E7Y6\n第五集:BV17V411z75A\n第六集:BV1oi4y137sw\n第七集:BV1Wt4y1D7Uu\n第八集:BV1Bp4y1q7y9\n第九集:BV1Lv411v7G2\n第十集:BV1Xi4y137ER\n第十一集:BV1nC4y1879J\n第十二集:BV1K54y1", - "page": 1, - "duration": 703, - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "attr": 0, - "cnt_info": { - "collect": 9449, - "play": 1429408, - "danmaku": 8243 - }, - "link": "bilibili://video/884042215", - "ctime": 1595847079, - "pubtime": 1595847079, - "fav_time": 1598884788, - "bv_id": "BV1fK4y1e7Yj", - "bvid": "BV1fK4y1e7Yj", - "season": null - }, - { - "id": 669013980, - "type": 2, - "title": "猛 男 生 存 4", - "cover": "http://i1.hdslb.com/bfs/archive/def0f7009cb9a8b581ee03be9565918ff0c1913d.jpg", - "intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集:BV1CZ4y1T7gC\n第二集:BV1oA411a72k\n第三集:BV1fK4y1e7Yj\n第四集:BV1Ya4y1E7Y6\n第五集:BV17V411z75A\n第六集:BV1oi4y137sw\n第七集:BV1Wt4y1D7Uu\n第八集:BV1Bp4y1q7y9\n第九集:BV1Lv411v7G2\n第十集:BV1Xi4y137ER\n第十一集:BV1nC4y1879J\n第十二集:BV1K54y1", - "page": 1, - "duration": 895, - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "attr": 0, - "cnt_info": { - "collect": 9950, - "play": 1309544, - "danmaku": 13551 - }, - "link": "bilibili://video/669013980", - "ctime": 1595943988, - "pubtime": 1595943988, - "fav_time": 1598884792, - "bv_id": "BV1Ya4y1E7Y6", - "bvid": "BV1Ya4y1E7Y6", - "season": null - }, - { - "id": 414034824, - "type": 2, - "title": "猛 男 生 存 5", - "cover": "http://i2.hdslb.com/bfs/archive/b4844ac89dde221d13bb8ddff80a8c4658bf7dc5.jpg", - "intro": "如果大家喜欢我的视频,别忘了点个赞,一键三连,或者关注我的频道哦~\n也可以把我的视频分享给你们的朋友们~\n\n第一集:BV1CZ4y1T7gC\n第二集:BV1oA411a72k\n第三集:BV1fK4y1e7Yj\n第四集:BV1Ya4y1E7Y6\n第五集:BV17V411z75A\n第六集:BV1oi4y137sw\n第七集:BV1Wt4y1D7Uu\n第八集:BV1Bp4y1q7y9\n第九集:BV1Lv411v7G2\n第十集:BV1Xi4y137ER\n第十一集:BV1nC4y1879J\n第十二集:BV1K54y1", - "page": 1, - "duration": 814, - "upper": { - "mid": 686127, - "name": "籽岷", - "face": "http://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp" - }, - "attr": 0, - "cnt_info": { - "collect": 9446, - "play": 1235998, - "danmaku": 9021 - }, - "link": "bilibili://video/414034824", - "ctime": 1596023668, - "pubtime": 1596023668, - "fav_time": 1598884798, - "bv_id": "BV17V411z75A", - "bvid": "BV17V411z75A", - "season": null - } - ], - "has_more": true, - "ttl": 1703349018 - } -} -``` - -</details> - -## 获取收藏夹全部内容id - -> https://api.bilibili.com/x/v3/fav/resource/ids - -*请求方式:GET* - -认证方式:Cookie或APP - -**注:查询权限收藏夹时需要相应用户登录** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | --------------------------- | -| media_id | num | 目标收藏夹mlid(完整id) | 必要 | | -| platform | str | 平台标识 | 非必要 | 可为web(影响内容列表类型) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | ---------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-400:请求错误<br />-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| data | 有效时:array<br />无效或:null | 内容id列表 | | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ------------------------------------------------------------ | -| id | num | 内容id | 视频稿件:视频稿件avid<br />音频:音频auid<br />视频合集:视频合集id | -| type | num | 内容类型 | 2:视频稿件<br />12:音频<br />21:视频合集 | -| bv_id | str | 视频稿件bvid | | -| bvid | str | 视频稿件bvid | | - -**示例:** - -查询收藏夹`id=1052622027`的全部内容id - -```shell -curl -G 'https://api.bilibili.com/x/v3/fav/resource/ids' \ ---data-urlencode 'media_id=1052622027' \ ---data-urlencode 'platform=web' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 371494037, - "type": 2, - "bv_id": "BV1CZ4y1T7gC", - "bvid": "BV1CZ4y1T7gC" - }, - { - "id": 328991940, - "type": 2, - "bv_id": "BV1oA411a72k", - "bvid": "BV1oA411a72k" - }, - { - "id": 884042215, - "type": 2, - "bv_id": "BV1fK4y1e7Yj", - "bvid": "BV1fK4y1e7Yj" - }, - { - "id": 669013980, - "type": 2, - "bv_id": "BV1Ya4y1E7Y6", - "bvid": "BV1Ya4y1E7Y6" - }, - { - "id": 414034824, - "type": 2, - "bv_id": "BV17V411z75A", - "bvid": "BV17V411z75A" - }, - { - "id": 541550765, - "type": 2, - "bv_id": "BV1oi4y137sw", - "bvid": "BV1oi4y137sw" - }, - { - "id": 626619000, - "type": 2, - "bv_id": "BV1Wt4y1D7Uu", - "bvid": "BV1Wt4y1D7Uu" - }, - { - "id": 969124957, - "type": 2, - "bv_id": "BV1Bp4y1q7y9", - "bvid": "BV1Bp4y1q7y9" - }, - { - "id": 244079274, - "type": 2, - "bv_id": "BV1Lv411v7G2", - "bvid": "BV1Lv411v7G2" - }, - { - "id": 541500006, - "type": 2, - "bv_id": "BV1Xi4y137ER", - "bvid": "BV1Xi4y137ER" - }, - { - "id": 796655080, - "type": 2, - "bv_id": "BV1nC4y1879J", - "bvid": "BV1nC4y1879J" - }, - { - "id": 839243447, - "type": 2, - "bv_id": "BV1K54y1U77v", - "bvid": "BV1K54y1U77v" - }, - { - "id": 329235451, - "type": 2, - "bv_id": "BV13A411e7ad", - "bvid": "BV13A411e7ad" - }, - { - "id": 884202228, - "type": 2, - "bv_id": "BV1UK4y1v7K6", - "bvid": "BV1UK4y1v7K6" - }, - { - "id": 926710567, - "type": 2, - "bv_id": "BV1BT4y157HK", - "bvid": "BV1BT4y157HK" - }, - { - "id": 754200948, - "type": 2, - "bv_id": "BV1qk4y117Uk", - "bvid": "BV1qk4y117Uk" - }, - { - "id": 371795957, - "type": 2, - "bv_id": "BV1iZ4y1K7LG", - "bvid": "BV1iZ4y1K7LG" - }, - { - "id": 969268280, - "type": 2, - "bv_id": "BV1hp4y1v7mU", - "bvid": "BV1hp4y1v7mU" - }, - { - "id": 414281629, - "type": 2, - "bv_id": "BV1xV411U7mm", - "bvid": "BV1xV411U7mm" - }, - { - "id": 839319009, - "type": 2, - "bv_id": "BV1t54y1U7hg", - "bvid": "BV1t54y1U7hg" - }, - { - "id": 329271769, - "type": 2, - "bv_id": "BV12A411J7JZ", - "bvid": "BV12A411J7JZ" - }, - { - "id": 969365400, - "type": 2, - "bv_id": "BV1wp4y1i7U8", - "bvid": "BV1wp4y1i7U8" - }, - { - "id": 796831427, - "type": 2, - "bv_id": "BV1yC4y1t7Gb", - "bvid": "BV1yC4y1t7Gb" - }, - { - "id": 711972863, - "type": 2, - "bv_id": "BV1YD4y1m7FP", - "bvid": "BV1YD4y1m7FP" - }, - { - "id": 754414390, - "type": 2, - "bv_id": "BV1Yk4y127YR", - "bvid": "BV1Yk4y127YR" - }, - { - "id": 839478683, - "type": 2, - "bv_id": "BV1i54y127uw", - "bvid": "BV1i54y127uw" - }, - { - "id": 499448381, - "type": 2, - "bv_id": "BV19K411N7KE", - "bvid": "BV19K411N7KE" - }, - { - "id": 926919797, - "type": 2, - "bv_id": "BV1QT4y1L7Bb", - "bvid": "BV1QT4y1L7Bb" - } - ] -} -``` - -</details> diff --git a/docs/garb/color.md b/docs/garb/color.md deleted file mode 100644 index c27c16b..0000000 --- a/docs/garb/color.md +++ /dev/null @@ -1,311 +0,0 @@ -# 主题色 - -## 获取主题色基本信息1 - -> https://club.bilibili.com/api/query.skin.list.do - -*请求方式:GET* - -鉴权方式:appkey - -认证方式:仅可APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| build | num | 版本 | APP方式必要 | 可为`6082000` | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | ------------ | ---------------------------------------------------- | -| ts | num | 当前时间戳 | | -| code | num | 返回值 | 0:成功<br />-3:API校验密匙错误<br />-400:请求错误 | -| data | array | 主题颜色列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 主题颜色1 | | -| n | obj | 主题颜色(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------------------- | -| id | num | 颜色id | | -| name | str | 颜色名称 | | -| is_free | bool | 是否免费 | false:收费<br />true:免费 | -| price | num | 价格 | 单位为硬币 | -| is_bought | bool | 是否已购买 | false:未购买<br />true:已购买 | -| status | num | 状态 | 1:自动续费<br />4:已退订 | -| buy_time | num | 购买时间 | 毫秒时间戳 | -| due_time | num | 到期时间 | 毫秒时间戳 | -| color_name | str | 颜色类型名称 | | -| is_overdue | bool | 是否已到期 | false:未到期<br />true:已到期 | - -**示例:** - -```shell -curl -G 'https://club.bilibili.com/api/query.skin.list.do' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'build=6082000' \ ---data-urlencode 'sign=2d37f2cd6f86337a6a07cb3cf311be86' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "ts": 1599225638239, - "code": 0, - "data": [ - { - "id": 2, - "name": "少女粉", - "is_free": true, - "price": 0, - "is_bought": false, - "color_name": "pink", - "is_overdue": false - }, - { - "id": 1, - "name": "夜间模式", - "is_free": true, - "price": 0, - "is_bought": false, - "color_name": "black", - "is_overdue": false - }, - { - "id": 3, - "name": "姨妈红", - "is_free": false, - "price": 5, - "is_bought": false, - "color_name": "red", - "is_overdue": false - }, - { - "id": 4, - "name": "咸蛋黄", - "is_free": false, - "price": 5, - "is_bought": false, - "color_name": "yellow", - "is_overdue": false - }, - { - "id": 5, - "name": "早苗绿", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 4, - "buy_time": 1599219782000, - "due_time": 1601811782000, - "color_name": "green", - "is_overdue": false - }, - { - "id": 6, - "name": "胖次蓝", - "is_free": false, - "price": 5, - "is_bought": false, - "color_name": "blue", - "is_overdue": false - }, - { - "id": 7, - "name": "基佬紫", - "is_free": false, - "price": 5, - "is_bought": false, - "color_name": "purple", - "is_overdue": false - } - ] -} -``` - -</details> - -## 获取主题色基本信息2 - -> https://api.bilibili.com/x/garb/skin/color/list - -*请求方式:GET* - -认证方式:仅可Cookie - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------- | ------ | ------------- | -| mobi_app | str | 平台标识 | 非必要 | 可为`android` | -| build | num | 版本 | 非必要 | 可为`6082000` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | ------------ | ---------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-3:API校验密匙错误<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| data | array | 主题颜色列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 主题颜色1 | | -| n | obj | 主题颜色(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------------------- | -| id | num | 颜色id | | -| name | str | 颜色名称 | | -| is_free | bool | 是否免费 | false:收费<br />true:免费 | -| price | num | 价格 | 单位为硬币 | -| is_bought | bool | 是否已购买 | false:未购买<br />true:已购买 | -| status | num | 状态 | 1:自动续费<br />4:已退订 | -| buy_time | num | 购买时间 | 毫秒时间戳 | -| due_time | num | 到期时间 | 毫秒时间戳 | -| color_name | str | 颜色类型名称 | | -| is_overdue | bool | 是否已到期 | false:未到期<br />true:已到期 | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/garb/skin/color/list' \ ---data-urlencode 'mobi_app=android' \ ---data-urlencode 'build=6082000' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 8, - "name": "简洁白", - "is_free": true, - "price": 0, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "white", - "is_overdue": false - }, - { - "id": 2, - "name": "少女粉", - "is_free": true, - "price": 0, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "pink", - "is_overdue": false - }, - { - "id": 1, - "name": "夜间模式", - "is_free": true, - "price": 0, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "black", - "is_overdue": false - }, - { - "id": 3, - "name": "姨妈红", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "red", - "is_overdue": false - }, - { - "id": 4, - "name": "咸蛋黄", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "yellow", - "is_overdue": false - }, - { - "id": 5, - "name": "早苗绿", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 4, - "buy_time": 1599219782000, - "due_time": 1601811782000, - "color_name": "green", - "is_overdue": false - }, - { - "id": 6, - "name": "胖次蓝", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "blue", - "is_overdue": false - }, - { - "id": 7, - "name": "基佬紫", - "is_free": false, - "price": 5, - "is_bought": false, - "status": 0, - "buy_time": 0, - "due_time": 0, - "color_name": "purple", - "is_overdue": false - } - ] -} -``` - -</details> \ No newline at end of file diff --git a/docs/garb/lottery.md b/docs/garb/lottery.md deleted file mode 100644 index d4dab77..0000000 --- a/docs/garb/lottery.md +++ /dev/null @@ -1,3201 +0,0 @@ -# 装扮/收藏集 - -由 [#1080](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1080) 提供 - -## 装扮/收藏集搜索API - -> https://api.bilibili.com/x/garb/v2/mall/home/search - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----- |--- |------- |----- |--- | -| key_word | str | 关键词 | 不必要 | | -| ps | int | 每页返回数据的最大值 | 不必要 | | -| pn | int | 当前页数 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|-- |-- |-- |-- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 返回数据 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-|---|--|--| -| list | array | 返回数据 | 若无则为 null | -| ps | int | 每页返回数据的最大值 | 默认为20 | -| pn | int | 当前页数 | 默认为1 | -| total | int | 查询到数据的总个数 | | - -`data` 中的 `list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-|---|--|--| -| item_id | int | 装扮对应的id | 收藏集均为0,需要在properties获取 | -| name | str | 装扮/收藏集名称 | | -| group_id | int | ?分类的id | | -| group_name | str | ?分类的名称 | | -| part_id | int | 类型id | 装扮为6 收藏集为0 | -| state | str | 当前状态 | 默认为“active” | -| properties | obj | 见下方 | | -| current_activity | obj | 见下方 | | -| next_activity | int | ?下次活动的时间 | | -| current_sources | int | ?活动开始时间 | | -| finish_sources | int | ?活动结束时间 | | -| sale_left_time | int | ?销售剩余时间 | | -| sale_time_end | int | ?销售结束时间 | | -| sale_surplus | int | 未知 | | -| sale_count_desc | str | 销售量显示文本 | | -| total_count_desc | str | 总量显示文本 | | -| tag | str | 当前状态标签 | | -| jump_link | str | 跳转链接 | | -| sales_mode | int | ?销售状态 | | - -`list` 数组中的对象中的 `properties` 对象: - -共有字段: - -| 字段 | 类型 | 内容 | 备注| -|-|---|--|--| -| image_cover | str | 图片封面 | | -| sale_bp_forever_raw | str | 价格 | 以0.01B币为单位| -| type | str | 类型 | 收藏集为dlc_act, 装扮为ip| - -装扮特有: - -| 字段 | 类型 | 内容 | 备注| -| - | - | ---- | ----- | -| desc | str | 介绍文本 | 仅装扮| -| fan_desc | str | 装扮名称 | 仅装扮| -| fan_item_ids | str | 未知 | 仅装扮| -| fan_mid | str | 该up的uid | 仅装扮| -| fan_no_color | str | 十六进制颜色 | 仅装扮| -| fan_recommend_desc | str | 装备说明 | 仅装扮| -| fan_recommend_jump_type | str | 跳转类型 | 仅装扮| -| fan_recommend_jump_value | str | 跳转值 | 仅装扮| -| fan_share_image | str | 分享时的背景图 | 仅装扮| -| gray_rule | str | 未知 | 仅装扮| -| gray_rule_type | str | 未知 | 仅装扮| -| image_cover_color | str | ?图片封面纯色背景 | 仅装扮| -| is_hide | str | 是否隐藏 | 仅装扮| -| item_id_card | str | 装扮背景卡片id | 仅装扮| -| item_id_emoji | str | 装扮表情包id | 仅装扮| -| item_id_thumbup | str | 装扮点赞动画id | 仅装扮| -| open_platform_vip_discount | str | 是否有大会员减免 | 仅装扮| -| owner_uid | str | UID | 默认为虚拟主播衍生品小货架, 仅装扮| -| rank_investor_show | str | 未知 | 仅装扮| -| realname_auth | str | ?是否需要实名认证 | 仅装扮| -| sale_bp_pm_raw | str | 该装扮基础套餐价格 | 以0.01B币为单位, 仅装扮| -| sale_buy_num_limit | str | 购买限额 | 仅装扮| -| sale_quantity | str | 该装扮粉丝专属套餐限额 | 仅装扮| -| sale_quantity_limit | str | 该装扮粉丝专属套餐是否限额 | 仅装扮| -| sale_region_ip_limit | str | 该装扮限制购买地区 | 仅装扮| -| sale_reserve_switch | str | 未知 | 仅装扮| -| sale_time_begin | str | 开始售卖时的时间戳 | 仅装扮| -| sale_type | str | 售卖类型 | 默认为pay, 仅装扮| -| suit_card_type | str | 仅装扮 | | - -收藏集特有: - -| 字段 | 类型 | 内容 | 备注 | -| - | ---- | - | --------- | -| book_amount | str | 购买总数 | 仅收藏集 | -| dlc_act_id | str | 收藏集活动id | 仅收藏集 | -| dlc_act_status | str | 收藏集活动状态 | 仅收藏集 | -| dlc_is_free | str | 收藏集抽奖是否免费 | 仅收藏集 | -| dlc_lottery_id | str | 收藏集抽奖id | 仅收藏集 | -| dlc_lottery_sale_quantity | str | 购买总数 | 仅收藏集 | -| dlc_lottery_type | str | ?抽奖类型 | 仅收藏集 | -| dlc_sale_end_time | str | 收藏集抽奖结束时间 | 仅收藏集 | -| dlc_sale_mode | str | 未知 | 仅收藏集 | -| dlc_sale_start_time | str | 收藏集抽奖开始时间 | 仅收藏集 | -| dlc_surplus_stock | str | 未知 | 仅收藏集 | - -`list` 数组中的对象中的 `current_activity` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | --- | --- | - | -| type | str | 当前永久价格活动类型 | 装扮一般是open_platform_vip_discount, 收藏集一般是first_draw_discount | -| time_limit | bool | 是否存在时间限制 | | -| time_left | int | 剩余时间 | | -| tag | str | 显示标签 | | -| price_bp_forever | int | 永久价格 | 以0.01B币为单位 | -| price_bp_month | int | 一个月的价格 | 以0.01B币为单位 | -| type_month | str | 当前一个月的价格活动类型 | 仅装扮 | -| tag_month | str | 显示标签 | 仅装扮 | -| time_limit_month | bool | 是否存在时间限制 | 仅装扮 | -| time_left_month | int | 剩余时间 | 仅装扮 | - -**示例:** - -搜索关键词为 `2233`: - -```shell -curl -G 'https://api.bilibili.com/x/garb/v2/mall/home/search' \ ---data-urlencode 'key_word=2233' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "item_id": 0, - "name": "2024拜年纪-2233拜年画册", - "group_id": 70, - "group_name": "2024拜年纪-2233拜年画册", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "1395313", - "dlc_act_id": "279", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "256", - "dlc_lottery_sale_quantity": "313028", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1707458400", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/f96a8cf6866ccef8f54de4773acf0cb07b915ac6.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 490, - "price_bp_forever": 490, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "31万+", - "total_count_desc": "已售31万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=279\u0026hybrid_set_header=2\u0026lottery_id=256", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2024 BML\u0026BW 2233收藏集-2233福利卡池", - "group_id": 70, - "group_name": "2024 BML\u0026BW 2233收藏集-2233福利卡池", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "4376", - "dlc_act_id": "102962", - "dlc_act_status": "2", - "dlc_is_free": "1", - "dlc_lottery_id": "102966", - "dlc_lottery_sale_quantity": "2677", - "dlc_lottery_type": "2", - "dlc_sale_end_time": "1729828800", - "dlc_sale_mode": "2", - "dlc_sale_start_time": "1721876400", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/4a374316b1e9a07cffeccbdeff585c472dcdcc26.png", - "sale_bp_forever_raw": "0", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "2千+", - "total_count_desc": "已发放2千+份", - "tag": "限时DLC", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102962\u0026hybrid_set_header=2\u0026lottery_id=102966", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2233·幻境序曲-长夜", - "group_id": 70, - "group_name": "2233·幻境序曲-长夜", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "228065", - "dlc_act_id": "102161", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "103087", - "dlc_lottery_sale_quantity": "71200", - "dlc_lottery_type": "2", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1722139200", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/f7e4f434ba6b93434b9e60df3c57a07552af4ca1.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 490, - "price_bp_forever": 490, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "7万+", - "total_count_desc": "已售7万+份", - "tag": "DLC池", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102161\u0026hybrid_set_header=2\u0026lottery_id=103087", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2233·群星闪耀时-双子座", - "group_id": 70, - "group_name": "2233·群星闪耀时-双子座", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "1164544", - "dlc_act_id": "113", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "16", - "dlc_lottery_sale_quantity": "572712", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1686196800", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/ed35d12a3dce7764d6cb5b02cb4a459373472522.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 90, - "price_bp_forever": 90, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "57万+", - "total_count_desc": "已售57万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=113\u0026hybrid_set_header=2\u0026lottery_id=16", - "sales_mode": 0 - }, - { - "item_id": 39389, - "name": "2233人生百戏-花木兰", - "group_id": 70, - "group_name": "2233人生百戏-花木兰", - "part_id": 6, - "state": "active", - "properties": { - "desc": "为从军设妙计女扮男装,涉千山越万水亲赴戎机。2233人生百戏·花木兰装扮上线啦!本套装包括动态卡片、点赞动效和表情包,永久购买还能成为认证粉丝,领取粉丝专属装扮!", - "fan_desc": "人生百戏-花木兰", - "fan_id": "人生百戏-花木兰", - "fan_item_ids": "39335,39384,39353,39354", - "fan_mid": "35365327", - "fan_no_color": "#eb3d3e", - "fan_recommend_desc": "为从军设妙计女扮男装,涉千山越万水亲赴戎机。", - "fan_recommend_jump_type": "url", - "fan_recommend_jump_value": "https://space.bilibili.com/35365327?spm_id_from=333.337.0.0", - "fan_share_image": "https://i0.hdslb.com/bfs/garb/item/5ddd3f72ef2a938e9125851f488068012b841ad4.jpg", - "gray_rule": "true", - "gray_rule_type": "all", - "image_cover": "https://i0.hdslb.com/bfs/garb/item/e21ec12047bcd93e6afb8e52a68eb9835cd54a23.jpg", - "image_cover_color": "#d8b796", - "is_hide": "false", - "item_id_card": "39334", - "item_id_emoji": "39352", - "item_id_thumbup": "39336", - "open_platform_vip_discount": "true", - "owner_uid": "647193094", - "rank_investor_show": "false", - "realname_auth": "false", - "sale_bp_forever_raw": "5000", - "sale_bp_pm_raw": "800", - "sale_buy_num_limit": "100", - "sale_quantity": "20000", - "sale_quantity_limit": "true", - "sale_region_ip_limit": "全球", - "sale_reserve_switch": "false", - "sale_time_begin": "1666868400", - "sale_type": "pay", - "suit_card_type": "big_img", - "type": "ip" - }, - "current_activity": null, - "next_activity": { - "type": "open_platform_vip_discount", - "time_limit": true, - "time_left": 417469277, - "tag": "大会员平台折扣", - "price_bp_month": 640, - "price_bp_forever": 4000, - "type_month": "open_platform_vip_discount", - "tag_month": "大会员平台折扣", - "time_limit_month": true, - "time_left_month": 417469277 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -61550323, - "sale_time_end": -1728418723, - "sale_surplus": 8650, - "sale_count_desc": "1万+", - "total_count_desc": "已售1万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1\u0026id=39389", - "sales_mode": 0 - }, - { - "item_id": 4259, - "name": "2233白色情人节", - "group_id": 70, - "group_name": "2233白色情人节", - "part_id": 6, - "state": "active", - "properties": { - "desc": "shot你的心——无论是谁都拥有爱的权利,快换上白色情人节专属装扮来遇见心里的那个ta吧!本套装包括头像挂件、动态卡片、点赞动效和表情包,永久购买还能成为认证粉丝,领取粉丝专属装扮!", - "fan_desc": "白色情人节", - "fan_id": "2233白色情人节", - "fan_item_ids": "4257,4230,4256,4255,4253,4254", - "fan_mid": "174501086", - "fan_no_color": "#f85574", - "fan_recommend_desc": "平淡日常中迎来浪漫的节日,象征爱情的丘比特们悄悄来到少女们身边,用爱之箭觉醒了懵懂悸动的心。新鲜的玫瑰,闪耀光泽的草莓,白色情人节这天为你准备不一样的惊喜。", - "fan_recommend_jump_type": "url", - "fan_recommend_jump_value": "https://b23.tv/54WVWS", - "fan_share_image": "https://i0.hdslb.com/bfs/garb/item/30e3f1b234dd33a2a5446dd7d05b31835ac74d4b.jpg", - "gray_rule": "true", - "gray_rule_type": "all", - "image_cover": "https://i0.hdslb.com/bfs/garb/item/a8d60a7d4f1f5a5de667b307736f701cb39c0741.jpg", - "image_cover_color": "#a3a8ec", - "image_cover_long": "https://i0.hdslb.com/bfs/garb/item/5ac3bb024d42ff0f26de07ce974351d62587c6ea.jpg", - "image_desc": "https://i0.hdslb.com/bfs/garb/item/cfe753a010d124a95fb311c372a5be69d82c8e13.jpg", - "is_hide": "false", - "item_id_card": "4231", - "item_id_emoji": "4252", - "item_id_pendant": "4229", - "item_id_thumbup": "4232", - "open_platform_vip_discount": "true", - "owner_uid": "647193094", - "rank_investor_show": "true", - "realname_auth": "false", - "sale_bp_forever_raw": "5900", - "sale_bp_pm_raw": "800", - "sale_buy_num_limit": "100", - "sale_quantity": "52000", - "sale_quantity_limit": "true", - "sale_region_ip_limit": "全球", - "sale_reserve_switch": "false", - "sale_time_begin": "1615694400", - "sale_type": "pay", - "suit_card_type": "big_img", - "type": "ip" - }, - "current_activity": null, - "next_activity": { - "type": "open_platform_vip_discount", - "time_limit": true, - "time_left": 417469277, - "tag": "大会员平台折扣", - "price_bp_month": 640, - "price_bp_forever": 4720, - "type_month": "open_platform_vip_discount", - "tag_month": "大会员平台折扣", - "time_limit_month": true, - "time_left_month": 417469277 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -112724323, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "5万+", - "total_count_desc": "已售5万+份", - "tag": "粉丝套装已售罄", - "jump_link": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1\u0026id=4259", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2233·少女日记-蔚蓝幻想曲", - "group_id": 70, - "group_name": "2233·少女日记-蔚蓝幻想曲", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "100310", - "dlc_act_id": "103244", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "103885", - "dlc_lottery_sale_quantity": "16563", - "dlc_lottery_type": "2", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1727236800", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/a04b3e9ef354493a0890a9197412f1c77e01ba0f.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 490, - "price_bp_forever": 490, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "1万+", - "total_count_desc": "已售1万+份", - "tag": "DLC池", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=103244\u0026hybrid_set_header=2\u0026lottery_id=103885", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2233·少女日记-十四岁生日", - "group_id": 70, - "group_name": "2233·少女日记-十四岁生日", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "100310", - "dlc_act_id": "103244", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "103247", - "dlc_lottery_sale_quantity": "83747", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1723780800", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/9c338eb4841cad917665140cc08c7d14b5c7e0bf.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 490, - "price_bp_forever": 490, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "8万+", - "total_count_desc": "已售8万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=103244\u0026hybrid_set_header=2\u0026lottery_id=103247", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2024 BML\u0026BW 2233收藏集-BML\u0026BW2024", - "group_id": 70, - "group_name": "2024 BML\u0026BW 2233收藏集-BML\u0026BW2024", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "4376", - "dlc_act_id": "102962", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "102963", - "dlc_lottery_sale_quantity": "1699", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "2114406245", - "dlc_sale_mode": "1", - "dlc_sale_start_time": "1721876400", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/6c2d68faf143c33b484b110e2221ab15a0a1f85c.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": { - "type": "first_draw_discount", - "time_limit": false, - "time_left": -1728418723, - "tag": "大会员首抽", - "price_bp_month": 490, - "price_bp_forever": 490, - "type_month": "", - "tag_month": "", - "time_limit_month": false, - "time_left_month": 0 - }, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1728418723, - "sale_time_end": -1728418723, - "sale_surplus": 0, - "sale_count_desc": "1千+", - "total_count_desc": "已售1千+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live\u0026act_id=102962\u0026hybrid_set_header=2\u0026lottery_id=102963", - "sales_mode": 0 - } - ], - "pn": 1, - "ps": 20, - "total": 187 - } -} -``` - -</details> - -## 收藏集信息API - -> https://api.bilibili.com/x/vas/dlc_act/lottery_home_detail - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | ---- | ---- | ---- | -| act_id | int | 收藏集活动id | 必要 | | -| lottery_id | int | 收藏集抽奖id|不必要| 但缺了不返回数据 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 返回数据 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-|-|-|-| -| lottery_id | int | 收藏集抽奖id | | -| name | str | 收藏集抽奖名称 | | -| item_list | array | 可抽出的物品列表 | | -| collect_list | obj | 见下方 | | -| button_bubble | null | 未知 | | -| guide_info | null | 未知 | | -| is_booked | int | 未知 | | -| total_book_cnt | int | 未知 | | -| is_fission | int | 未知 | | -| physical_exchange | int | 未知 | | - -`data` 中的 `item_list` 数组中的对象: - -|字段 | 类型 | 内容 | 备注| -|-|-|-|-| -|item_type | int | 物品类型 | 目前只拿到个1, 其他值未知| -|card_info | obj | 见下方 | | - -`item_list` 数组中的对象中的 `card_info` 对象: - -|字段 | 类型 | 内容 | 备注 | -|-|-|-|-| -|card_type_id | int | 该卡片id | | -|card_name | str | 该卡片名称 | | -|card_img | str | 该卡片图片 | 无水印| -|card_type | int | int | 未知| -|video_list | array | 该卡片动态视频 | 无水印| -|is_physical_orientation | int | 该卡片旋转方向 | | -|card_scarcity | int | 该卡片稀有度 | | -|is_mute | int | 该卡片是否静音 | | -|width | int | 该卡片像素宽度 | | -|height | int | 该卡片像素高度 | | -|card_ext_text | str | ?该卡片文件名字符串 | | -|card_img_download | str | 该卡片图片 | 有水印| -|video_list_download | array | 该卡片动态视频 | 有水印| -|subtitles_url | 未知 | | | -|play | null | 未知 | | -|tag | null | 未知 | | -|card_sub_type | int | 未知 | | -|is_new_tag | int | 未知 | | -|is_up_tag | int | 未知 | | -|is_limited_card | int | 未知 | | -|stock_info | null | 未知 | | - -`data` 中的 `collect_list` 对象: - -| 字段 | 类型 | 内容 | 备注| -|-|-|-|-| -| collect_infos | array | 见下方 | | -| collect_chain | null | 未知 | | - -`collect_list` 中的 `collect_infos` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-|-|-|-| -| collect_id | int | 收集品id | | -| start_time | int | 开始时间 | | -| end_time | int | 结束时间 | | -| redeem_text | str | 兑换条件 | | -| redeem_item_type | int | 兑换物类型 | | -| redeem_item_id | str | 兑换物id | | -| redeem_item_name | str | 兑换物名称 | | -| redeem_item_image | str | 兑换物预览图片 | | -| owned_item_amount | int | 拥有的数量 | | -| require_item_amount | int | 需要的数量 | | -| has_redeemed_cnt | int | 兑换次数 | | -| effective_forever | int | 是否永久有效 | | -| redeem_item_image_download | str | 未知 | | -| card_item | obj | 见下方 | 有时为 null | -| jump_url | str | ?跳转链接 | | -| redeem_cond_type | str | 当前兑换状态 | | -| remain_stock | int | 当前库存 | | -| total_stock | int | 总库存 | | -| lottery_id | int | 抽奖id | | -| reward_tag | str | 奖励显示标签 | | -| redeem_detail_image | str | 兑换详情图片 | | -| redeem_detail_videos | null | 未知 | | -| sort | int | 排序 | | -| redeem_items_optional | null | 未知 | | -| unlock_condition | obj | 见下方 | | - -`collect_infos` 数组中的对象中的 `card_item` 对象: - -| 字段 | 类型 | 内容 | 备注| -|-|-|-|-| -| card_type_info | null | | | -| card_asset_info | null | | | -| play | null | | | -| tag | null | | | - -`collect_infos` 数组中的对象中的 `unlock_condition` 对象: - -|字段 | 类型 | 内容 | 备注| -|-|-|-|-| -|unlocked | bool | 是否解锁 | | -|lock_type | int | 解锁类型 | | -|expire_at | int | 过期与 | | -|unlocked_at | int | 解锁于 | | -|unlock_threshold | int | ?解锁起点 | | -|current_threshold | int | ?当前起点 | | - -**示例:** - -```shell -curl -G --url 'https://api.bilibili.com/x/vas/dlc_act/lottery_home_detail' \ ---url-query 'act_id=111' \ ---url-query 'lottery_id=15' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "lottery_id": 15, - "name": "夏日萌菜", - "item_list": [ - { - "item_type": 1, - "card_info": { - "card_type_id": 700903, - "card_name": "水中嬉戏·隐藏", - "card_img": "https://i0.hdslb.com/bfs/baselabs/d41acfc3bfcc9032a9759fbd9e64147a6d9a24b0.png", - "card_type": 2, - "video_list": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/2b/y2/_000008vnv2ddoooah248hqoyz2gy22b-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=d22ca6102adb9ffe257f702047be6ef2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=753ff946c9e4b3813eb72c744ed3a399ba9a225fe4767a7a03835890fcbe4b8a&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "is_physical_orientation": 0, - "card_scarcity": 40, - "is_mute": 0, - "width": 1242, - "height": 1862, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/d38c42b6f1151298888da5902bca5a41e14f67e1.png", - "video_list_download": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/ib/30/_00003d7cuie74gr9z2322d7js5b30ib-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=hw&upsig=24512302cfa3b1f762f3ad08a0a2f5fe&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=5dc3cdfca31fca94c29a2ec945589ff319e97c3291dec2685184ec4083616cc2&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700902, - "card_name": "轻纱花语·隐藏", - "card_img": "https://i0.hdslb.com/bfs/baselabs/e4721d06a5c435be216b5011f0604c9e07d5e4af.png", - "card_type": 2, - "video_list": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/jb/4u/_00001f04wekkvpmr92osvwpej1e4ujb-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=ad574839c71e5327783acf248b552b3d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=49276ec1afce1a8f571e257fb6d2ab7488f623aa50c2c3b7252258be72315c5e&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "is_physical_orientation": 0, - "card_scarcity": 30, - "is_mute": 0, - "width": 1242, - "height": 1862, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/0e49e7c8108a98944a96bfa594cf7f74c72398cf.png", - "video_list_download": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/nb/58/_000007ovzgblf574s1ywvm7inwx58nb-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=ec9de21147240e94494d736f277dfb64&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=2370473349a25fae0ea023f65f1e09c70b45d086831eef5f4727b8443acdf9f5&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700904, - "card_name": "甜心女仆", - "card_img": "https://i0.hdslb.com/bfs/baselabs/e1f9c56a8f49910d07852f2bd648fee910f36ff6.png", - "card_type": 2, - "video_list": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/gb/j6/_000015vmteklku8oj1ypmp1yjijj6gb-1-152111110023.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=cos&upsig=c7412fe7b155deecbfea939f7c3d1b21&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=8989673c367aa0ffbe747cdc66129a6d1698f1c2b60ace24861ad62127cdd6da&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "is_physical_orientation": 0, - "card_scarcity": 20, - "is_mute": 0, - "width": 1242, - "height": 1862, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/e6c69329d843603166fac8d41682c3489fd137d4.png", - "video_list_download": [ - "https://upos-hz-mirrorakam.akamaized.net/panguxcodeboss/digital_watermark/zb/eq/_000018oi0e68wv4id2vkrk9ovpteqzb-teaser.mp4?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfq9rVEuxTEnE8L5F6VnEsSTx0vkX8fqJeYTj_lta53NCM=&uipk=5&nbs=1&deadline=1723459855&gen=playurlv2&os=akam&oi=1823807565&trid=400d9529a562468c8312c1f4c4beb2e3B&mid=0&platform=html5&og=hw&upsig=f972e8cd996d058deb4e0ffb1d57671e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&hdnts=exp=1723459855~hmac=99054c626717b4ba61c01bbb0fe59f67feac394b89e19e4bbf95290d3a425f94&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=B_0_0" - ], - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700901, - "card_name": "约会憧憬", - "card_img": "https://i0.hdslb.com/bfs/baselabs/924ef9a71bf39010935b4a43845bec13c8a2022c.png", - "card_type": 1, - "video_list": null, - "is_physical_orientation": 0, - "card_scarcity": 10, - "is_mute": 0, - "width": 1242, - "height": 1863, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/40a9ff949ca7a50dbce146ad28fbb567c2583261.png", - "video_list_download": null, - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700900, - "card_name": "夏日小憩", - "card_img": "https://i0.hdslb.com/bfs/baselabs/0eddbfc70200f16bef06acc88ef132eb25ede52d.png", - "card_type": 1, - "video_list": null, - "is_physical_orientation": 0, - "card_scarcity": 10, - "is_mute": 0, - "width": 1242, - "height": 1863, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/61e26e17705e06ecdfdb9ff97befb19c702cf81e.png", - "video_list_download": null, - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700899, - "card_name": "微风校园", - "card_img": "https://i0.hdslb.com/bfs/baselabs/bbeaf7993566684e328e74d8ef7c47e6242869a2.png", - "card_type": 1, - "video_list": null, - "is_physical_orientation": 0, - "card_scarcity": 10, - "is_mute": 0, - "width": 1242, - "height": 1863, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/8ac61045334699d621363ccac87153a7128ef0c3.png", - "video_list_download": null, - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700898, - "card_name": "萌宠幻想", - "card_img": "https://i0.hdslb.com/bfs/baselabs/f93f200ec862b4520b30e8f03219fbaca91a2089.png", - "card_type": 1, - "video_list": null, - "is_physical_orientation": 0, - "card_scarcity": 10, - "is_mute": 0, - "width": 1242, - "height": 1863, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/93e59f3080f6b8070b0d0621496e4ed6cb20cf8f.png", - "video_list_download": null, - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - }, - { - "item_type": 1, - "card_info": { - "card_type_id": 700897, - "card_name": "空中环游", - "card_img": "https://i0.hdslb.com/bfs/baselabs/fc0c020091c0a9fb1778c420bc4f9773a72ea7ba.png", - "card_type": 1, - "video_list": null, - "is_physical_orientation": 0, - "card_scarcity": 10, - "is_mute": 0, - "width": 1242, - "height": 1863, - "card_ext_text": "", - "card_img_download": "https://i0.hdslb.com/bfs/garb/c1c6c9ca84b584bf5f2b0e1ec7d239eb935e4d44.png", - "video_list_download": null, - "subtitles_url": "", - "play": null, - "tag": null, - "card_sub_type": 0, - "is_new_tag": 0, - "is_up_tag": 0, - "is_limited_card": 0, - "stock_info": null - } - } - ], - "collect_list": { - "collect_infos": [ - { - "collect_id": 0, - "start_time": 1685372400, - "end_time": 2114406245, - "redeem_text": "1抽必得勋章,可应用为评论背景&动态卡片", - "redeem_item_type": 1001, - "redeem_item_id": "", - "redeem_item_name": "夏日萌菜勋章", - "redeem_item_image": "http://i0.hdslb.com/bfs/archive/b3d915c6ad88609fb658393585f018459a7e620d.png", - "owned_item_amount": 0, - "require_item_amount": 1, - "has_redeemed_cnt": 0, - "effective_forever": 1, - "redeem_item_image_download": "", - "card_item": null, - "jump_url": "", - "redeem_cond_type": "", - "remain_stock": 0, - "total_stock": -1, - "lottery_id": 0, - "reward_tag": "", - "redeem_detail_image": "", - "redeem_detail_videos": null, - "sort": 0, - "redeem_items_optional": null, - "unlock_condition": { - "unlocked": true, - "lock_type": 0, - "expire_at": 0, - "unlocked_at": 0, - "unlock_threshold": 0, - "current_threshold": 0 - } - }, - { - "collect_id": 172, - "start_time": 1691640000, - "end_time": 2114406245, - "redeem_text": "抽出任意5张不同卡牌,即可领取,单UID仅可领取一次", - "redeem_item_type": 5, - "redeem_item_id": "56658", - "redeem_item_name": "夏日萌菜个性主题", - "redeem_item_image": "https://i0.hdslb.com/bfs/garb/48f755d6d08d96bfebcadee0be4bc34ce42421de.jpg", - "owned_item_amount": 0, - "require_item_amount": 5, - "has_redeemed_cnt": 0, - "effective_forever": 1, - "redeem_item_image_download": "", - "card_item": { - "card_type_info": null, - "play": null, - "tag": null, - "card_asset_info": null - }, - "jump_url": "", - "redeem_cond_type": "scarcity", - "remain_stock": -1, - "total_stock": -1, - "lottery_id": 0, - "reward_tag": "任务奖励限定", - "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/48f755d6d08d96bfebcadee0be4bc34ce42421de.jpg", - "redeem_detail_videos": null, - "sort": 0, - "redeem_items_optional": null, - "unlock_condition": { - "unlocked": true, - "lock_type": 0, - "expire_at": 0, - "unlocked_at": 0, - "unlock_threshold": 0, - "current_threshold": 0 - } - }, - { - "collect_id": 51, - "start_time": 1685372400, - "end_time": 2114406245, - "redeem_text": "抽出任意1张隐藏卡牌,即可领取,单UID仅可领取一次", - "redeem_item_type": 3, - "redeem_item_id": "53199", - "redeem_item_name": "夏日萌菜头像框", - "redeem_item_image": "https://i0.hdslb.com/bfs/garb/item/9fcb99ccfd057c5eac165832d71fb63f07f26097.png", - "owned_item_amount": 0, - "require_item_amount": 1, - "has_redeemed_cnt": 0, - "effective_forever": 1, - "redeem_item_image_download": "", - "card_item": { - "card_type_info": null, - "play": null, - "tag": null, - "card_asset_info": null - }, - "jump_url": "", - "redeem_cond_type": "scarcity", - "remain_stock": -1, - "total_stock": -1, - "lottery_id": 0, - "reward_tag": "任务奖励限定", - "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/item/9fcb99ccfd057c5eac165832d71fb63f07f26097.png", - "redeem_detail_videos": null, - "sort": 0, - "redeem_items_optional": null, - "unlock_condition": { - "unlocked": true, - "lock_type": 0, - "expire_at": 0, - "unlocked_at": 0, - "unlock_threshold": 0, - "current_threshold": 0 - } - }, - { - "collect_id": 50, - "start_time": 1685372400, - "end_time": 2114406245, - "redeem_text": "抽出任意3张不同卡牌,即可领取,单UID仅可领取一次", - "redeem_item_type": 2, - "redeem_item_id": "53178", - "redeem_item_name": "夏日萌菜表情包", - "redeem_item_image": "https://i0.hdslb.com/bfs/garb/462ae9b5735fef4bb9ed87a6d6467a4768b06006.png", - "owned_item_amount": 0, - "require_item_amount": 3, - "has_redeemed_cnt": 0, - "effective_forever": 1, - "redeem_item_image_download": "", - "card_item": { - "card_type_info": null, - "play": null, - "tag": null, - "card_asset_info": null - }, - "jump_url": "", - "redeem_cond_type": "scarcity", - "remain_stock": -1, - "total_stock": -1, - "lottery_id": 0, - "reward_tag": "任务奖励限定", - "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/462ae9b5735fef4bb9ed87a6d6467a4768b06006.png", - "redeem_detail_videos": null, - "sort": 0, - "redeem_items_optional": null, - "unlock_condition": { - "unlocked": true, - "lock_type": 0, - "expire_at": 0, - "unlocked_at": 0, - "unlock_threshold": 0, - "current_threshold": 0 - } - }, - { - "collect_id": 366, - "start_time": 1694768400, - "end_time": 1696953600, - "redeem_text": "抽齐全部8张卡牌领取,直接获得全图鉴进度条标记,10月28日前人工发放头像", - "redeem_item_type": 5, - "redeem_item_id": "59374", - "redeem_item_name": "水中嬉戏·隐藏出框头像", - "redeem_item_image": "https://i0.hdslb.com/bfs/garb/ff981dbdca5c6b539e22596674265ef1cb110c9c.png", - "owned_item_amount": 0, - "require_item_amount": 8, - "has_redeemed_cnt": 0, - "effective_forever": 0, - "redeem_item_image_download": "", - "card_item": { - "card_type_info": null, - "play": null, - "tag": null, - "card_asset_info": null - }, - "jump_url": "", - "redeem_cond_type": "scarcity", - "remain_stock": -1, - "total_stock": -1, - "lottery_id": 0, - "reward_tag": "任务奖励限定", - "redeem_detail_image": "https://i0.hdslb.com/bfs/garb/ff981dbdca5c6b539e22596674265ef1cb110c9c.png", - "redeem_detail_videos": null, - "sort": 0, - "redeem_items_optional": null, - "unlock_condition": { - "unlocked": true, - "lock_type": 0, - "expire_at": 0, - "unlocked_at": 0, - "unlock_threshold": 0, - "current_threshold": 0 - } - } - ], - "collect_chain": null - }, - "button_bubble": null, - "guide_info": null, - "is_booked": 0, - "total_book_cnt": 0, - "is_fission": 0, - "physical_exchange": 0 - } -} -``` - -</details> - -## 主题装扮信息API - -> https://api.bilibili.com/x/garb/v2/mall/suit/detail - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------|-----|------|----| ---- | -| buvid | str | 设备唯一标识 | 不必要 | | -| csrf | str | 用户csrf | 不必要 | | -| from | str | 来源页面 | 不必要 | | -| from_id | int | 来源页面id | 不必要 | | -| item_id | int | 装扮id | 必要 | | -| part | str | ?分类 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------| -| code | num | 返回值 | `0`:成功<br />`-400`:错误 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|--------|------------| -| item_id | num | 装扮id | | -| name | str | 装扮名称 | | -| group_id | num | 分组id | | -| group_name | str | 分组名称 | | -| part_id | num | 分类id | | -| state | str | 状态 | | -| properties | obj | 装扮具体属性 | | -| current_activity | str | 当前活动 | | -| next_activity | obj | 下一个活动 | | -| current_sources | str | | **作用尚不明确** | -| finish_sources | str | | **作用尚不明确** | -| sale_left_time | num | | **作用尚不明确** | -| sale_time_end | num | | **作用尚不明确** | -| sale_surplus | num | 商品剩余数量 | | -| sale_count_desc | str | 促销销量说明 | | -| total_count_desc | str | 总销量说明 | | -| tag | str | 标签 | | -| jump_link | str | 跳转链接 | | -| sales_mode | num | 促销模式 | | -| suit_items | obj | 装扮具体内容 | | -| fan_user | obj | 装扮来源用户 | | -| unlock_items | obj | 未解锁装扮 | | -| activity_entrance | obj | 活动入口 | | - -`properties` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|----------------|-----------------------------| -| desc | str | 说明 | | -| fan_desc | str | 用户说明 | | -| fan_id | str | 装扮id | 获取到的数据,有时候是数字文本,有时候是普通文本 | -| fan_item_ids | str | 装扮id列表 | | -| fan_mid | str | 用户mid | | -| fan_no_color | str | | **为一串颜色16进制字符串,但作用尚不明确** | -| fan_recommend_desc | str | 用户推荐说明 | | -| fan_recommend_jump_type | str | 跳转类型 | | -| fan_recommend_jump_value | str | 跳转的值 | 一般为该装扮所有者的个人空间链接 | -| fan_share_image | str | | | -| gray_rule | str | | **布尔型转换的字符串,作用尚不明确** | -| gray_rule_type | str | | **作用尚不明确** | -| image_cover | str | 图片封面链接 | | -| image_cover_color | str | 图片封面颜色 | | -| is_hide | str | 是否隐藏 | **布尔型转换的字符串,作用尚不明确** | -| item_id_card | str | 动态卡片id | | -| item_id_emoji | str | 表情包id | | -| item_id_thumbup | str | 动态点赞特效id | | -| open_platform_vip_discount | str | 是否开启平台VIP折扣 | | -| owner_uid | str | 装扮所有者的用户uid | | -| rank_investor_show | str | ?显示投资者排名 | **布尔型转换的字符串,作用尚不明确** | -| realname_auth | str | | **布尔型转换的字符串,作用尚不明确** | -| sale_bp_forever_raw | str | | | -| sale_bp_pm_raw | str | | | -| sale_buy_num_limit | str | 促销限制数量 | | -| sale_quantity | str | 促销质量 | 整数型转换的字符串,"10000"可能表示的是这张图的原画 | -| sale_quantity_limit | str | ?是否限制某些质量装扮的销售 | **布尔型转换的字符串,作用尚不明确** | -| sale_region_ip_limit | str | 促销限制地区 | | -| sale_reserve_switch | str | | **布尔型转换的字符串,作用尚不明确** | -| sale_time_begin | str | 促销开始时间的时间戳 | | -| sale_type | str | 促销类型 | | -| suit_card_type | str | 装扮卡片类型 | | -| type | str | 类型 | **作用尚不明确** | - -`suit_items` 对象(可能不全,会继续补充): - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|--------|------------| -| card | array | 动态卡片 | | -| emoji_package | array | 表情包 | | -| card_bg | array | 专属评论装扮 | | -| thumbup | array | 动态点赞特效 | | -| loading | array | 专属加载动画 | | -| play_icon | array | 专属进度条 | | -| skin | array | 专属个性主题 | | -| space_bg | array | 专属空间海报 | | - -`suit_items` 中每个数组的对象: - -**即上文中所列出的 `suit_items` 中的那些数组对象,对于这些数组,<br />它们其中的字段基本都是相同的,不同的地方会在后面继续说明。** - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|---------|----------------------| -| item_id | num | 装扮id | | -| name | str | 装扮名称 | | -| state | str | 状态 | | -| tab_id | num | 分栏id | | -| suit_item_id | num | 所属装扮的id | | -| properties | obj | 装扮具体属性 | **不同点主要集中在这个地方,下文将继续说明** | -| current_activity | str | 当前活动 | | -| next_activity | obj | 下一个活动 | | -| current_sources | str | | **作用尚不明确** | -| finish_sources | str | | **作用尚不明确** | -| sale_left_time | str | | **作用尚不明确** | -| sale_time_end | str | | **作用尚不明确** | -| sale_surplus | str | 商品剩余数量 | | -| items | str | 装扮的具体内容 | | - -关于上述提到的 `properties` 对象中的共有字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|----------------------| -| gray_rule | str | | **布尔型转换的字符串,作用尚不明确** | -| gray_rule_type | str | | **作用尚不明确** | -| realname_auth | str | | **布尔型转换的字符串,作用尚不明确** | -| sale_type | str | 促销类型 | | -| image | str | 图片 | | -| image_preview_small | str | 预览图 | | - -`emoji_package` 数组中的对象中 `properties` 对象中的额外字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|-------|----------------------| -| addable | str | | **布尔型转换的字符串,作用尚不明确** | -| biz | str | | **作用尚不明确** | -| is_symbol | str | | **布尔型转换的字符串,作用尚不明确** | -| permanent | str | 是否永久 | | -| preview | str | | **布尔型转换的字符串,作用尚不明确** | -| recently_used | str | | **布尔型转换的字符串,作用尚不明确** | -| recommend | str | 是否推荐 | | -| ref_mid | str | | | -| removable | str | 是否可移除 | | -| setting_pannel_not_show | str | | **布尔型转换的字符串,作用尚不明确** | -| size | str | 尺寸 | | -| sortable | str | 排序类型 | | - -`loading` 数组中的对象中 `properties` 对象中的额外字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------------|----------------------| -| loading_frame_url | str | 进度条动画的其中一帧 | | -| loading_url | str | 进度条动画 | | - -`play_icon` 数组中的对象中 `properties` 对象中的额外字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|-------------|----------------------| -| drag_left_png | str | 进度条向左拖动时的图片 | | -| drag_right_png | str | 进度条向右拖动时的图片 | | -| middle_png | str | 进度条暂停时的图片 | | -| squared_image | str | 效果图 | | -| static_icon_image | str | 静态图标 | | - -`skin` 数组中的对象中 `properties` 对象中的额外字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|---------------------|----------------------| -| head_bg | str | 首页顶部图片 | | -| head_myself_mp4_play | str | 个人空间顶部视频动画的播放类型 | | -| head_myself_squared_bg | str | 个人空间顶部图片 | | -| head_tab_bg | str | 首页顶部标签栏背景图 | | -| image_cover | str | 封面图 | | -| package_md5 | str | 装扮图包的md5值 | | -| package_url | str | 装扮图包的压缩包链接 | | -| skin_mode | str | 皮肤模式 | | -| tail_bg | str | 首页底部图片 | | -| tail_color | str | 首页底部颜色 | | -| tail_color_selected | str | 首页底部被选中时的颜色 | | -| tail_icon_ani | str | 首页底部是否播放动画 | | -| tail_icon_ani_mode | str | 首页底部动画的播放类型 | | -| tail_icon_channel | str | 首页底部“动态”按钮图片 | | -| tail_icon_dynamic | str | 首页底部“发布动态”按钮图片 | | -| tail_icon_main | str | 首页底部“首页”按钮图片 | | -| tail_icon_mode | str | 首页底部图标模式 | | -| tail_icon_myself | str | 首页底部“我的”按钮图片 | | -| tail_icon_pub_btn_bg | str | 首页底部“发布动态”按钮图片 | | -| tail_icon_selected_channel | str | 首页底部“动态”按钮被选中时的图片 | | -| tail_icon_selected_dynamic | str | 首页底部“发布动态”按钮被选中时的图片 | | -| tail_icon_selected_main | str | 首页底部“首页”按钮被选中时的图片 | | -| tail_icon_selected_myself | str | 首页底部“我的”按钮被选中时的图片 | | -| tail_icon_selected_pub_btn_bg | str | 首页底部“发布动态”按钮被选中时的图片 | | -| tail_icon_selected_shop | str | 首页底部“会员购”按钮被选中时的图片 | | -| tail_icon_shop | str | 首页底部“会员购”按钮图片 | | - -`space_bg` 数组中的对象中 `properties` 对象中的额外字段: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|-------------|----------------------| -| image1_landscape | str | 第一张空间海报 | | -| image1_portrait | str | 第一张空间海报(纵向) | | - -**如果是第二张图,则是`image2_xxx`,以此类推。** - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/garb/v2/mall/suit/detail' \ - --data-urlencode 'buvid=xxx(非必须)' \ - --data-urlencode 'csrf=xxx(非必须)' \ - --data-urlencode 'item_id=42193' \ - --data-urlencode 'part=suit(非必须)' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "item_id":42193, - "name":"装扮小姐姐·梦幻冬季", - "group_id":69, - "group_name":"装扮小姐姐·梦幻冬季", - "part_id":6, - "state":"active", - "properties":{ - "desc":"扮扮糖集合啦!装扮小姐姐邀你共度梦幻冬季~", - "fan_desc":"装扮小姐姐·梦幻冬季", - "fan_id":"装扮小姐姐·梦幻冬季", - "fan_item_ids":"42190,42124,42192,42191,42188,42189", - "fan_mid":"647193094", - "fan_no_color":"#3e52eb", - "fan_recommend_desc":"扮扮糖集合啦!装扮小姐姐邀你共度梦幻冬季~", - "fan_recommend_jump_type":"url", - "fan_recommend_jump_value":"https://space.bilibili.com/647193094?spm_id_from=333.337.0.0", - "fan_share_image":"https://i0.hdslb.com/bfs/garb/item/f9ad456fb74fc58896743eb393664e3c7622de0c.jpg", - "gray_rule":"true", - "gray_rule_type":"all", - "image_cover":"https://i0.hdslb.com/bfs/garb/item/14072c2cb4f82c053d85dc92911da37583a17668.jpg", - "image_cover_color":"#dcf0f9", - "is_hide":"false", - "item_id_card":"42123", - "item_id_emoji":"42157", - "item_id_thumbup":"42125", - "open_platform_vip_discount":"true", - "owner_uid":"647193094", - "rank_investor_show":"false", - "realname_auth":"false", - "sale_bp_forever_raw":"5500", - "sale_bp_pm_raw":"800", - "sale_buy_num_limit":"100", - "sale_quantity":"10000", - "sale_quantity_limit":"true", - "sale_region_ip_limit":"全球", - "sale_reserve_switch":"false", - "sale_time_begin":"1670410800", - "sale_type":"pay", - "suit_card_type":"big_img", - "type":"ip" - }, - "current_activity":null, - "next_activity":{ - "type":"open_platform_vip_discount", - "time_limit":true, - "time_left":410175990, - "tag":"大会员平台折扣", - "price_bp_month":640, - "price_bp_forever":4400, - "type_month":"open_platform_vip_discount", - "tag_month":"大会员平台折扣", - "time_limit_month":true, - "time_left_month":410175990 - }, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-65301210, - "sale_time_end":-1735712010, - "sale_surplus":0, - "sale_count_desc":"1万+", - "total_count_desc":"", - "tag":"粉丝套装已售罄", - "jump_link":"", - "sales_mode":0, - "suit_items":{ - "card":[ - { - "item_id":42124, - "name":"装扮小姐姐梦幻冬季粉丝", - "state":"active", - "tab_id":35, - "suit_item_id":42193, - "properties":{ - "gray_rule":"true", - "gray_rule_type":"all", - "hot":"false", - "image":"https://i0.hdslb.com/bfs/garb/item/3bebd46d5ac6eaa1d6c3f65854b184932fb6230b.png", - "image_preview_small":"https://i0.hdslb.com/bfs/garb/item/611fc0d3401623977f580f592747d721de330fc6.png", - "realname_auth":"false", - "sale_type":"other" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - }, - { - "item_id":42123, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":35, - "suit_item_id":42193, - "properties":{ - "gray_rule":"true", - "gray_rule_type":"all", - "hot":"false", - "image":"https://i0.hdslb.com/bfs/garb/item/757320776561f6bf881b3c50bd59fc937cea3387.png", - "realname_auth":"false", - "sale_type":"other" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "card_bg":[ - { - "item_id":42189, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":44, - "suit_item_id":42193, - "properties":{ - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/38cbcb481923f6a3d7e724a3837324a8ab0f602e.png", - "image_preview_small":"https://i0.hdslb.com/bfs/garb/item/c9621eedabdc728d728158aafab2e271f152561e.png", - "realname_auth":"false", - "sale_type":"suit" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "emoji_package":[ - { - "item_id":42157, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":8, - "suit_item_id":42193, - "properties":{ - "addable":"true", - "biz":"dynamic,reply,watch_full", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/0dd53dc27d401cad0a3bfc07d91dba3af3a5d6d0.png", - "is_symbol":"false", - "item_ids":"42158,42159,42160,42161,42162,42163,42164,42165,42166,42167,42168,42169,42170,42171,42172,42173,42174,42175,42176,42177,42178,42179,42180,42181,42182,42183,42184,42185,42186,42187", - "permanent":"false", - "preview":"false", - "realname_auth":"false", - "recently_used":"false", - "recommend":"false", - "ref_mid":"0", - "removable":"true", - "sale_type":"pay", - "setting_pannel_not_show":"false", - "size":"L", - "sortable":"true" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":[ - { - "item_id":42158, - "name":"[装扮小姐姐梦幻冬季_揉脸]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/e47ad8b1c16ebaa780e0574f360c67f4c45e6325.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42159, - "name":"[装扮小姐姐梦幻冬季_啾咪]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/098619d6f2859966157dc0da4d3a24ae7a690781.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42160, - "name":"[装扮小姐姐梦幻冬季_下雪了]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/08a64a396b710f8670096c5f380f2839f973d218.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42161, - "name":"[装扮小姐姐梦幻冬季_圣诞老人]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/e86122e145000e00362d635c6ebe8ac4260de7f6.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42162, - "name":"[装扮小姐姐梦幻冬季_多喝热水]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/59fb78d3801682c94b126abc0fc1f1b7603dee06.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42163, - "name":"[装扮小姐姐梦幻冬季_扔]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/d762bb454bb2f4fc3827167749b3d61597657b3b.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42164, - "name":"[装扮小姐姐梦幻冬季_生气]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/47fc00a0f13ebd61237c4617a1e5485d0647e7f5.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42165, - "name":"[装扮小姐姐梦幻冬季_贴贴]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/3a7580978ee11f033860af2435bcef6fa282ee64.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42166, - "name":"[装扮小姐姐梦幻冬季_没米了]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/55b3660d73951fb394c6f0594c9fdbeca4f39bea.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42167, - "name":"[装扮小姐姐梦幻冬季_冲鸭]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/cb7c2fbc6ab19d3462d44cabf10b87458650bf28.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42168, - "name":"[装扮小姐姐梦幻冬季_累了]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/884f721618392a0efe6686c2c61fddf04c6f2d73.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42169, - "name":"[装扮小姐姐梦幻冬季_斯密马赛]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/1bbe9b564ee17701a22e848287a5f7983fdfcb34.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42170, - "name":"[装扮小姐姐梦幻冬季_告辞]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/264c9ab6a2503013e79eecdb86118f057762bae5.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42171, - "name":"[装扮小姐姐梦幻冬季_吃我一拳]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/2f7b233826fa0d0729619bbf3dc2220b4c534b3f.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42172, - "name":"[装扮小姐姐梦幻冬季_乌拉]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/23dca67aed7565a4f3e21d8d9d5337125b34d399.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42173, - "name":"[装扮小姐姐梦幻冬季_委屈]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/cec0b3ade7249740cee45f98100275fa7cf7320a.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42174, - "name":"[装扮小姐姐梦幻冬季_溜冰]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/3704984c68c867820103795c4b5313fea0c097e9.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42175, - "name":"[装扮小姐姐梦幻冬季_好耶]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/621d4683d492901c814c64ca3c7bb880ae818779.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42176, - "name":"[装扮小姐姐梦幻冬季_硬撑罢了]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/b4d10356d0ac483b29c875518e0c539809468ba9.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42177, - "name":"[装扮小姐姐梦幻冬季_摸鱼]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/da7205f6a8e7213cca2a06e71c819850cae28977.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42178, - "name":"[装扮小姐姐梦幻冬季_注意保暖]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/170df6f81c3f42defbc07192d19de02525b14348.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42179, - "name":"[装扮小姐姐梦幻冬季_抽我]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/45541e4471e57e59b4aa6b7bcc43e800e3cbde85.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42180, - "name":"[装扮小姐姐梦幻冬季_疑问]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/0d07fd66d3888ea55aa98fa8d520a6e759596e2b.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42181, - "name":"[装扮小姐姐梦幻冬季_抱抱]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/44481b886560e9e1300781ad8a1a4d1dfbbfd6fe.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42182, - "name":"[装扮小姐姐梦幻冬季_烤红薯]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/828555bbfa4dd8cadb9fdfa5868d3101c637945b.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42183, - "name":"[装扮小姐姐梦幻冬季_Power!]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/e4744b70edd5a271dcb6f1b1c62fa32dfa92c9fb.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42184, - "name":"[装扮小姐姐梦幻冬季_堆雪人]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/9407cb861173253f1a1206e3bda7497aebfd98ec.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42185, - "name":"[装扮小姐姐梦幻冬季_好的]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/d73bccf93a20c6eedeb81d975eba99ebc048a88e.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42186, - "name":"[装扮小姐姐梦幻冬季_滑雪]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/36af70fea3fc1636de990597c1a929fecba412db.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - }, - { - "item_id":42187, - "name":"[装扮小姐姐梦幻冬季_吃火锅]", - "state":"active", - "tab_id":7, - "suit_item_id":0, - "properties":{ - "associate":"false", - "gray_rule":"true", - "gray_rule_type":"all", - "image":"https://i0.hdslb.com/bfs/garb/item/bc234259d7971bd6255f9c464597285582e7ff82.png", - "is_symbol":"false", - "ref_mid":"0", - "sale_type":"pay" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0 - } - ] - } - ], - "loading":[ - { - "item_id":42191, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":54, - "suit_item_id":42193, - "properties":{ - "gray_rule":"true", - "gray_rule_type":"all", - "image_preview_small":"https://i0.hdslb.com/bfs/garb/item/32377c9cb1167e1e251c467f6a56ca2b59f130b0.png", - "loading_frame_url":"https://i0.hdslb.com/bfs/garb/item/f2121039298817318e9a10ef25cd802ef7a546f0.png", - "loading_url":"https://i0.hdslb.com/bfs/garb/item/e5ba77a4c2d21809e5f2e407e7bf03a7df635a2c.webp", - "realname_auth":"false", - "ver":"1670384406" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "play_icon":[ - { - "item_id":42192, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":56, - "suit_item_id":42193, - "properties":{ - "drag_left_png":"https://i0.hdslb.com/bfs/garb/item/933cdf41a554ce65b2bac7cc2af578c065a01ff8.png", - "drag_right_png":"https://i0.hdslb.com/bfs/garb/item/1632ab1d853694d61fe170710b447f6bd9c9152b.png", - "gray_rule":"true", - "gray_rule_type":"all", - "middle_png":"https://i0.hdslb.com/bfs/garb/item/4e1eaa52e65da8e14bce321e7abab9e9a3a28b30.png", - "realname_auth":"false", - "squared_image":"https://i0.hdslb.com/bfs/garb/item/ca4d76d7e8384b18354709ac7e3a422a900f7e07.png", - "static_icon_image":"https://i0.hdslb.com/bfs/garb/item/a98ffc9a8871ded890959c22916f38aba61521fc.png", - "ver":"1670384416" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "skin":[ - { - "item_id":42190, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":45, - "suit_item_id":42193, - "properties":{ - "color":"#ffffff", - "color_mode":"dark", - "color_second_page":"#5d85c0", - "gray_rule":"true", - "gray_rule_type":"all", - "head_bg":"https://i0.hdslb.com/bfs/garb/item/6c74dac067a429029befc787572b5b7bc83f50a1.jpg", - "head_myself_mp4_play":"once", - "head_myself_squared_bg":"https://i0.hdslb.com/bfs/garb/item/8cff6c83023c9523669e89fc28e1cd7600f196ff.jpg", - "head_tab_bg":"https://i0.hdslb.com/bfs/garb/item/1fe3d1b486ab50d6ffdf30b29bc063818ecde544.jpg", - "image_cover":"https://i0.hdslb.com/bfs/garb/item/14072c2cb4f82c053d85dc92911da37583a17668.jpg", - "image_preview":"https://i0.hdslb.com/bfs/garb/item/14072c2cb4f82c053d85dc92911da37583a17668.jpg", - "package_md5":"4ed60db32789eb79c3e96dc8d6a23ebb", - "package_url":"https://i0.hdslb.com/bfs/garb/zip/b3c95365b791bc58fd56bba7c14b43377d7af82d.zip", - "realname_auth":"false", - "skin_mode":"normal", - "tail_bg":"https://i0.hdslb.com/bfs/garb/item/fda401903a377d79afd576f9ba921c83091e6943.png", - "tail_color":"#f6f1fd", - "tail_color_selected":"#5af1ff", - "tail_icon_ani":"true", - "tail_icon_ani_mode":"once", - "tail_icon_channel":"https://i0.hdslb.com/bfs/garb/item/504a27e5227f30741e35b5817079974335f13d29.png", - "tail_icon_dynamic":"https://i0.hdslb.com/bfs/garb/item/4e0ef0c9540277694087f0aca8aca86b87dc9331.png", - "tail_icon_main":"https://i0.hdslb.com/bfs/garb/item/2a1a97c098bf0d2374a141d8da7fad1e0d1cee24.png", - "tail_icon_mode":"img", - "tail_icon_myself":"https://i0.hdslb.com/bfs/garb/item/20050ddbc0265828e42f068b74b8f5d947f8b7b8.png", - "tail_icon_pub_btn_bg":"https://i0.hdslb.com/bfs/garb/item/4e0ef0c9540277694087f0aca8aca86b87dc9331.png", - "tail_icon_selected_channel":"https://i0.hdslb.com/bfs/garb/item/d14d87016fa2e995917f40148239bc1fa5961ec5.png", - "tail_icon_selected_dynamic":"https://i0.hdslb.com/bfs/garb/item/1b0fb973534600990ad48058eff901643fe7e9fc.png", - "tail_icon_selected_main":"https://i0.hdslb.com/bfs/garb/item/ce1272d036f196ea90e08a433d0003246822aabf.png", - "tail_icon_selected_myself":"https://i0.hdslb.com/bfs/garb/item/a7bbb67de4f22c105529e57b2a1b27737fb6d9df.png", - "tail_icon_selected_pub_btn_bg":"https://i0.hdslb.com/bfs/garb/item/1b0fb973534600990ad48058eff901643fe7e9fc.png", - "tail_icon_selected_shop":"https://i0.hdslb.com/bfs/garb/item/e1622e9643b6ec2186e9f88ee6251334a842e3d0.png", - "tail_icon_shop":"https://i0.hdslb.com/bfs/garb/item/a2eaa41ae4aba160b8b8a9cdc7bc98fd47f2720d.png", - "ver":"1670384396" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "space_bg":[ - { - "item_id":42188, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":37, - "suit_item_id":42193, - "properties":{ - "fan_no_color":"#3e52eb", - "fan_no_image":"https://i0.hdslb.com/bfs/garb/item/d4888365d80401c72fc34bcc1697c36eb2477a97.png", - "gray_rule":"true", - "gray_rule_type":"all", - "image1_landscape":"https://i0.hdslb.com/bfs/garb/item/971519888f96d2e3cd88e55cb2360ac087f1dde7.png", - "image1_portrait":"https://i0.hdslb.com/bfs/garb/item/78fb9e4a63a17854c7df1e3b1f5f9f48df723e2c.jpg", - "image2_landscape":"https://i0.hdslb.com/bfs/garb/item/90a99f2615ba34596b05cd2a268490cf0072f1e7.png", - "image2_portrait":"https://i0.hdslb.com/bfs/garb/item/11d1a96097ebe357c47277f6c0397a0323c316a5.jpg", - "image3_landscape":"https://i0.hdslb.com/bfs/garb/item/3d2e029d2f6d8c3a425377af5be47a4c8bf2d102.jpg", - "image3_portrait":"https://i0.hdslb.com/bfs/garb/item/3d1495d80211c07ab6773f7aa1d6cb198940907d.jpg", - "realname_auth":"false" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ], - "thumbup":[ - { - "item_id":42125, - "name":"装扮小姐姐梦幻冬季", - "state":"active", - "tab_id":36, - "suit_item_id":42193, - "properties":{ - "gray_rule":"true", - "gray_rule_type":"all", - "image_ani":"https://i0.hdslb.com/bfs/garb/item/6a2ae0534879d765087c284c745b3e88340a7371.bin", - "image_ani_cut":"https://i0.hdslb.com/bfs/garb/item/6a2ae0534879d765087c284c745b3e88340a7371.bin", - "image_preview":"https://i0.hdslb.com/bfs/garb/item/0cbe14efc8d5397bb6edbd4adae5dcf0ce307c15.png", - "realname_auth":"false" - }, - "current_activity":null, - "next_activity":null, - "current_sources":null, - "finish_sources":null, - "sale_left_time":-1735712010, - "sale_time_end":-1735712010, - "sale_surplus":0, - "items":null - } - ] - }, - "fan_user":{ - "mid":647193094, - "nickname":"装扮小姐姐", - "avatar":"https://i1.hdslb.com/bfs/baselabs/523830e526a81001e4c3dcec9f317623a4f1dd2e.png" - }, - "unlock_items":null, - "activity_entrance":{ - "id":0, - "item_id":0, - "title":"", - "image_cover":"", - "jump_link":"" - } - } -} -``` - -</details> - -## 主题装扮列表API - -> https://api.bilibili.com/x/garb/v2/mall/partition/item/list - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|---------|-----|---------------------------------------------------------------------------| -| csrf | str | 用户csrf | 非必要 | | -| group_id | num | 分组id | 非必要 | 建议加上,不填的时候为0,一般配合`part_id`使用。<br />`0`: 装扮<br />`22`: 头像挂件<br />`5`: 动态卡片 | -| location | str | | 非必要 | **尚不明确** | -| part_id | num | 分类id | 必要 | 一般配合`group_id`使用。<br />`6`: 装扮<br />`1`: 头像挂件<br />`2`: 动态卡片<br /> | -| pn | num | 页码 | 非必要 | 不填为1 | -| ps | num | 每页的数据数量 | 非必要 | 不填为20,默认值和最大值也都为20 | -| sort_type | num | 排序方式 | 非必要 | `0`: 默认排序<br />`1`: 按销量排序<br />`2`: 按最新上架时间排序 | -| user_info | str | 用户信息 | 非必要 | 为json对象,其中包含`buvid`和`buvid3`两个字段。 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------------| -| code | num | 返回值 | `0`:成功<br />`-400`:错误 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-------|------|--------------| -| page | obj | 分页信息 | 包含装扮总数、页码和每页的数据数量 | -| list | array | 装扮列表 | | -| offset_info | str | 补偿信息 | **作用尚不明确** | -| group | str | 分组 | **作用尚不明确** | - -`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|-----|---------------| -| item_id | num | 装扮id | 如果为0,则该装扮为收藏集 | -| name | str | 装扮名称 | | -| group_id | num | 分组id | | -| group_name | str | 分组名称 | | -| part_id | num | 分类id | | -| state | str | 状态 | | -| properties | obj | 装扮具体属性 | | -| current_activity | str | 当前活动 | | -| next_activity | obj | 下一个活动 | | -| current_sources | str | | **作用尚不明确** | -| finish_sources | str | | **作用尚不明确** | -| sale_left_time | num | | **作用尚不明确** | -| sale_time_end | num | | **作用尚不明确** | -| sale_surplus | num | 商品剩余数量 | | -| sale_count_desc | str | 促销销量说明 | | -| total_count_desc | str | 总销量说明 | | -| tag | str | 标签 | | -| jump_link | str | 跳转链接 | | -| sales_mode | num | 促销模式 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/garb/v2/mall/partition/item/list' \ - --data-urlencode 'group_id=0' \ - --data-urlencode 'part_id=6' \ - --data-urlencode 'pn=1' \ - --data-urlencode 'ps=20' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "page": { - "total": 0, - "pn": 1, - "ps": 10 - }, - "list": [ - { - "item_id": 0, - "name": "MyGO!!!!!收藏集", - "group_id": 47, - "group_name": "MyGO!!!!!收藏集", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "59811", - "dlc_act_id": "102857", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "102858", - "dlc_lottery_sale_quantity": "1418368", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/c34fdba0b2a2aa31ff22bda77e217ca9c7e37344.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "100万+", - "total_count_desc": "已售100万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=102857&hybrid_set_header=2&lottery_id=102858", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "饿殍:明末千里行", - "group_id": 49, - "group_name": "饿殍:明末千里行", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "21825", - "dlc_act_id": "102794", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "102886", - "dlc_lottery_sale_quantity": "520677", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/838639725c0c37f6ccc5e85b2a1ed6ff895baca2.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "52万+", - "total_count_desc": "已售52万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=102794&hybrid_set_header=2&lottery_id=102886", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2024拜年纪", - "group_id": 70, - "group_name": "2024拜年纪", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "30103", - "dlc_act_id": "279", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "256", - "dlc_lottery_sale_quantity": "332544", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/f96a8cf6866ccef8f54de4773acf0cb07b915ac6.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "33万+", - "total_count_desc": "已售33万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=279&hybrid_set_header=2&lottery_id=256", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2233·十五周年站庆", - "group_id": 70, - "group_name": "2233·十五周年站庆", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "38339", - "dlc_act_id": "293", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "302", - "dlc_lottery_sale_quantity": "63336", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/633174e11f3587166e31b37cc87feb184808408d.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "6万+", - "total_count_desc": "已售6万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=293&hybrid_set_header=2&lottery_id=302", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "奈姬niki收藏集", - "group_id": 47, - "group_name": "奈姬niki收藏集", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "24158", - "dlc_act_id": "104783", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "104784", - "dlc_lottery_sale_quantity": "120787", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/6a2395d9be428ac09766deafbd8ead49503216ea.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "12万+", - "total_count_desc": "已售12万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=104783&hybrid_set_header=2&lottery_id=104784", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "黎歌Neeko收藏集-幻夏恋歌", - "group_id": 47, - "group_name": "黎歌Neeko收藏集-幻夏恋歌", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "22125", - "dlc_act_id": "100858", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "102305", - "dlc_lottery_sale_quantity": "528139", - "dlc_lottery_type": "2", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/ff57aba427ce4dd3608660233ba1d3ec518ff6aa.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "52万+", - "total_count_desc": "已售52万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=100858&hybrid_set_header=2&lottery_id=102305", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "2024明日方舟音律联觉", - "group_id": 49, - "group_name": "2024明日方舟音律联觉", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "59594", - "dlc_act_id": "102942", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "102943", - "dlc_lottery_sale_quantity": "1126215", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/c59397dff6e6618058b7d943aa9614b0d74a9c17.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "100万+", - "total_count_desc": "已售100万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=102942&hybrid_set_header=2&lottery_id=102943", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "BLG·2023LPL出征收藏集", - "group_id": 49, - "group_name": "BLG·2023LPL出征收藏集", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "18878", - "dlc_act_id": "228", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "157", - "dlc_lottery_sale_quantity": "14537", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "http://i0.hdslb.com/bfs/archive/dc0af06ae0e5018cc24ecab1be76742ff1ad9fc2.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "1万+", - "total_count_desc": "已售1万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=228&hybrid_set_header=2&lottery_id=157", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "幻星乐园", - "group_id": 107, - "group_name": "幻星乐园", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "22563", - "dlc_act_id": "103874", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "103875", - "dlc_lottery_sale_quantity": "319104", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/0f8eb52dfb0d3c7f89fb4d33749e4bf62544112e.jpg", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "31万+", - "total_count_desc": "已售31万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=103874&hybrid_set_header=2&lottery_id=103875", - "sales_mode": 0 - }, - { - "item_id": 0, - "name": "玉之けだま_毛玉收藏集", - "group_id": 46, - "group_name": "玉之けだま_毛玉收藏集", - "part_id": 0, - "state": "active", - "properties": { - "book_amount": "30723", - "dlc_act_id": "104459", - "dlc_act_status": "2", - "dlc_is_free": "0", - "dlc_lottery_id": "104460", - "dlc_lottery_sale_quantity": "267724", - "dlc_lottery_type": "1", - "dlc_sale_end_time": "0", - "dlc_sale_mode": "0", - "dlc_sale_start_time": "0", - "dlc_surplus_stock": "0", - "image_cover": "https://i0.hdslb.com/bfs/garb/565bf9465865efdd28b07c40f8352e43091ff4da.png", - "sale_bp_forever_raw": "990", - "type": "dlc_act" - }, - "current_activity": null, - "next_activity": null, - "current_sources": null, - "finish_sources": null, - "sale_left_time": -1735808611, - "sale_time_end": -1735808611, - "sale_surplus": 0, - "sale_count_desc": "26万+", - "total_count_desc": "已售26万+份", - "tag": "", - "jump_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=104459&hybrid_set_header=2&lottery_id=104460", - "sales_mode": 0 - } - ], - "offset_info": "pool::10", - "group": "garb_feed_recommend_rule_ab_key:1" - } -} -``` - -</details> - -## 收藏集列表API - -> https://api.bilibili.com/x/vas/dlc_act/act/list - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-------|------|--------|-----|---------------------------| -| csrf | str | 用户csrf | 非必要 | | -| scene | num | | 非必要 | **作用尚不明确,默认为1,不填则获取到空数据** | -| site | site | 位置 | 非必要 | 不填为20,但建议填上,会影响到后面的json数据 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|------|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | `0`:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | -| is_more | bool | 是否还有足够的收藏集 | 如果为true,则说明如果继续增加url参数中site的值,都还能从当前的位置往后列出20份收藏集;<br />如果为false,则说明如果继续增加url参数中site的值,将无法继续从当前位置列出20份收藏集(最多也是20份),<br />这表示页面已经拉到底了,可用于判断是否已经获取完了所有收藏集的数据。 | -| site | num | 位置 | **它的值为url参数中site的值的基础上再加20**,比如url参数中的site值为0,则此site的值为20,<br />表示这页的收藏集列表是从序号为0的收藏集开始列出,直到列出往后的20份。 | - -`data` 对象中的 `list` 数组对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|---------|---------------| -| act_id | num | 收藏集id | | -| act_name | num | 收藏集名称 | | -| act_pic | num | 收藏集封面图片 | | -| sale_price | num | 收藏集价格 | 以0.01B币为单位 | -| act_desc | num | 收藏集说明 | | -| tag | num | 标签 | | -| lottery_id | num | 抽奖id | | -| lottery_type | num | 抽奖类型 | | -| act_link | num | 收藏集链接 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/vas/dlc_act/act/list' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'scene=1' \ - --data-urlencode 'site=0' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "act_id": 105432, - "act_name": "挚友的旅途·羽毛收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/b6a7314b6ad321b638c3d2270903c02c0d2d7b20.png", - "sale_price": 9900, - "act_desc": "已售份数6千+", - "tag": "新奖励", - "lottery_id": 105433, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105432&hybrid_set_header=2&lottery_id=105433" - }, - { - "act_id": 102054, - "act_name": "兰音的衣柜奇缘-兰音·拾光幻梦", - "act_pic": "https://i0.hdslb.com/bfs/garb/b7e5465ff80a3260cdc1c1255853730bfc6bd818.jpg", - "sale_price": 9900, - "act_desc": "已售份数3万+", - "tag": "新卡池", - "lottery_id": 105434, - "lottery_type": 2, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=102054&hybrid_set_header=2&lottery_id=105434" - }, - { - "act_id": 102550, - "act_name": "洛天依·收藏集-戏游九州", - "act_pic": "https://i0.hdslb.com/bfs/garb/74706a52bc08764828f9251439055b18646e98b3.png", - "sale_price": 9900, - "act_desc": "已售份数6万+", - "tag": "新奖励", - "lottery_id": 105269, - "lottery_type": 2, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=102550&hybrid_set_header=2&lottery_id=105269" - }, - { - "act_id": 105006, - "act_name": "村村宇宙·小猫女仆降临", - "act_pic": "https://i0.hdslb.com/bfs/garb/cfccce3c1520b828f02d7b4e009cc7d965133025.jpg", - "sale_price": 9900, - "act_desc": "已售份数1万+", - "tag": "新奖励", - "lottery_id": 105167, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105006&hybrid_set_header=2&lottery_id=105167" - }, - { - "act_id": 105435, - "act_name": "东方收藏集·浮生若梦", - "act_pic": "https://i0.hdslb.com/bfs/garb/27156281f59f774198f38b9a4a64d9a74efb9290.png", - "sale_price": 9900, - "act_desc": "已售份数6万+", - "tag": "新奖励", - "lottery_id": 105438, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105435&hybrid_set_header=2&lottery_id=105438" - }, - { - "act_id": 105407, - "act_name": "紫罗兰永恒花园收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/9e54ae06dfd32625071153adc702eb7554b45af8.jpg", - "sale_price": 9900, - "act_desc": "已售份数1万+", - "tag": "新奖励", - "lottery_id": 105408, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105407&hybrid_set_header=2&lottery_id=105408" - }, - { - "act_id": 105461, - "act_name": "Team Spirit 冠军收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/0a68dac1e2d37767c26930ad4d3121e2b7c56c44.jpg", - "sale_price": 9900, - "act_desc": "已售份数9千+", - "tag": "新奖励", - "lottery_id": 105462, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105461&hybrid_set_header=2&lottery_id=105462" - }, - { - "act_id": 105326, - "act_name": "小神奈殿下收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/ed3b6e516ef05cf595cf9d24203e16205eea55e5.png", - "sale_price": 9900, - "act_desc": "已售份数1万+", - "tag": "新奖励", - "lottery_id": 105327, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105326&hybrid_set_header=2&lottery_id=105327" - }, - { - "act_id": 105444, - "act_name": "yumekiii收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/afc2dd57c962244d8021b92752038714b7b3341e.png", - "sale_price": 9900, - "act_desc": "已售份数3千+", - "tag": "新奖励", - "lottery_id": 105445, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105444&hybrid_set_header=2&lottery_id=105445" - }, - { - "act_id": 101545, - "act_name": "Sheya收藏集-月食梦-镜海之梦", - "act_pic": "https://i0.hdslb.com/bfs/garb/262e59d60698d6797488f081826e172e6689c339.jpg", - "sale_price": 9900, - "act_desc": "已售份数3千+", - "tag": "新卡池", - "lottery_id": 105451, - "lottery_type": 2, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=101545&hybrid_set_header=2&lottery_id=105451" - }, - { - "act_id": 105388, - "act_name": "LOOPY可爱计划", - "act_pic": "https://i0.hdslb.com/bfs/garb/f24711f2f35cb9db7919bb888af3fe23f5c588ad.jpg", - "sale_price": 9900, - "act_desc": "", - "tag": "限时卡池", - "lottery_id": 105411, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105388&hybrid_set_header=2&lottery_id=105411" - }, - { - "act_id": 105413, - "act_name": "范式起源", - "act_pic": "https://i0.hdslb.com/bfs/garb/784d6073f5cc3110117449da018845443b9c484d.png", - "sale_price": 9900, - "act_desc": "已售份数1万+", - "tag": "", - "lottery_id": 105414, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105413&hybrid_set_header=2&lottery_id=105414" - }, - { - "act_id": 105409, - "act_name": "VirtuaReal碧波澜影", - "act_pic": "https://i0.hdslb.com/bfs/garb/63f57f0014e47d1302005a5c6ab0164e925c69ef.png", - "sale_price": 9900, - "act_desc": "已售份数3万+", - "tag": "", - "lottery_id": 105410, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105409&hybrid_set_header=2&lottery_id=105410" - }, - { - "act_id": 101388, - "act_name": "寺田堤拉 TERADA TERA-白橙绘锦", - "act_pic": "https://i0.hdslb.com/bfs/garb/8ec594c0a11706846f5394eaac78fd97065000b1.png", - "sale_price": 9900, - "act_desc": "已售份数5千+", - "tag": "", - "lottery_id": 104985, - "lottery_type": 2, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=101388&hybrid_set_header=2&lottery_id=104985" - }, - { - "act_id": 104978, - "act_name": "少女乐队的呐喊", - "act_pic": "https://i0.hdslb.com/bfs/garb/cdf0c00bd070ee77951e695355b3394be53b8288.jpg", - "sale_price": 9900, - "act_desc": "已售份数39万+", - "tag": "", - "lottery_id": 105056, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=104978&hybrid_set_header=2&lottery_id=105056" - }, - { - "act_id": 104174, - "act_name": "顾晓Khaos收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/52152a236bcd4e2829012eb8cc32d1e2f24490c9.png", - "sale_price": 9900, - "act_desc": "已售份数8千+", - "tag": "", - "lottery_id": 104181, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=104174&hybrid_set_header=2&lottery_id=104181" - }, - { - "act_id": 105151, - "act_name": "晴云-醒时晴空", - "act_pic": "https://i0.hdslb.com/bfs/garb/1320dd55c13a11dfc7c714a75b56159d73c2feae.jpg", - "sale_price": 9900, - "act_desc": "已售份数3千+", - "tag": "", - "lottery_id": 105168, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=105151&hybrid_set_header=2&lottery_id=105168" - }, - { - "act_id": 103966, - "act_name": "礼拜六Liu收藏集", - "act_pic": "https://i0.hdslb.com/bfs/garb/9c5b03a79074b1354ee4277d77c108441ac8ff35.jpg", - "sale_price": 9900, - "act_desc": "已售份数1万+", - "tag": "", - "lottery_id": 103967, - "lottery_type": 1, - "act_link": "https://www.bilibili.com/h5/mall/digital-card/home?-Abrowser=live&act_id=103966&hybrid_set_header=2&lottery_id=103967" - } - ], - "is_more": true, - "site": 20 - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/garb/skin.md b/docs/garb/skin.md deleted file mode 100644 index c91d5d5..0000000 --- a/docs/garb/skin.md +++ /dev/null @@ -1,267 +0,0 @@ -# APP主题 - -## 获取主题及加载动画 - -> https://app.bilibili.com/x/resource/show/skin - -*请求方式:GET* - -鉴权方式:appkey - -认证方式:仅可APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| build | num | 版本 | APP方式必要 | 可为`6082000` | -| ts | num | 当前时间戳 | APP方式必要 | 可为`0` | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-3:API校验密匙错误<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ------------ | ------------ | -| user_equip | obj | 个性主题信息 | 有效时有此项 | -| skin_colors | array | 主题颜色列表 | | -| load_equip | obj | 加载动画信息 | 有效时有此项 | - -`data`中的`user_equip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | --------------- | ------ | -| id | num | 装扮id | | -| name | str | 装扮名称 | | -| preview | str | 装扮封面url | | -| ver | num | 装扮版本 | 时间戳 | -| package_url | str | 装扮包url | | -| package_md5 | str | 装扮包md5校验值 | | -| data | obj | 装扮配置 | | - -`user_equip`中的`data`对象: - -| 字段 | 类型 | 内容 | 必要性 | 备注 | -| ------------------- | ---- | ----------------- | -------- | --------------------------- | -| color_mode | str | 颜色模式 | 必要 | light:亮色<br />dark:暗色 | -| color | str | 前景色? | 必要 | 颜色<br />1. 使用十六进制颜色值<br />2. 颜色值的大小写不限,下同<br />3. 例:#ffffff | -| color_second_page | str | 背景色? | 必要 | 颜色 | -| tail_color | str | 底边栏颜色 | 必要 | 颜色 | -| tail_color_selected | str | 底边栏颜色(选择时) | 必要 | 颜色 | -| tail_icon_ani | bool | 有无底边栏动画 | 必要 | false:无<br />true:有 | -| tail_icon_ani_mode | str | 底边栏动画循环播放 | 必要 | once:播放一次 | -| head_myself_mp4_play| str | 我的页面头图(视频)循环 | 必要 | once:播放一次<br />loop:循环播放 | -| tail_icon_mode | str | 底栏改图标或改颜色 | 必要 | img:图标<br />color:颜色 | -| side_bg_color | str | 侧边栏颜色 | 非必要 | 颜色<br />5.x 版本客户端的侧边栏 | -| side_line_color | str | 侧边栏线条颜色? | 非必要 | 颜色<br />5.x 版本客户端的侧边栏 | -| tail_icon_color | str | 底栏图标颜色 | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 | -| tail_icon_color_dark| str | 底栏图标颜色(夜间模式) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 | -| tail_icon_color_selected| str | 底栏图标颜色(选择时) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 | -| tail_icon_color_selected_dark| str | 底栏图标颜色(选择时)(夜间模式) | 可能必要 | 颜色<br />若 tail_icon_mode = "color",则必要 | - -`skin_colors`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 主题颜色1 | | -| n | obj | 主题颜色(n+1) | | -| …… | obj | …… | …… | - -`skin_colors`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------------------- | -| id | num | 颜色id | | -| name | str | 颜色名称 | | -| is_free | bool | 是否免费 | false:收费<br />true:免费 | -| price | num | 价格 | 单位为硬币 | -| is_bought | bool | 是否已购买 | false:未购买<br />true:已购买 | -| status | num | 状态 | 1:自动续费<br />4:已退订 | -| buy_time | num | 购买时间 | 毫秒时间戳 | -| due_time | num | 到期时间 | 毫秒时间戳 | -| color_name | str | 颜色类型名称 | | -| is_overdue | bool | 是否已到期 | false:未到期<br />true:已到期 | - -`data`中的`load_equip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | --------------- | ------ | -| id | num | 装扮id | | -| name | str | 装扮名称 | | -| ver | num | 装扮版本 | 时间戳 | -| loading_url | str | 加载动画图标url | | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/resource/show/skin' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'build=6082000' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=ea212fea5b00a6278ea6d9938b4c500e' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "user_equip": { - "id": 2529, - "name": "初音未来-日版", - "preview": "http://i0.hdslb.com/bfs/garb/item/2fa16380b31b3cee6c889d645f2699de8e9d9faf.jpg", - "ver": 1598600025, - "package_url": "http://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip", - "package_md5": "7b6d20d998ad543c6a275948a6a1a5fe", - "data": { - "color_mode": "light", - "color": "#212121", - "color_second_page": "#fff2d2", - "side_bg_color": "#ffe7ae", - "tail_color": "#996c00", - "tail_color_selected": "#0d6872", - "tail_icon_ani": true, - "tail_icon_ani_mode": "once" - } - }, - "skin_colors": [ - { - "id": 2, - "name": "少女粉", - "is_free": true, - "color_name": "pink" - }, - { - "id": 1, - "name": "夜间模式", - "is_free": true, - "color_name": "black" - }, - { - "id": 3, - "name": "姨妈红", - "price": 5, - "color_name": "red" - }, - { - "id": 4, - "name": "咸蛋黄", - "price": 5, - "color_name": "yellow" - }, - { - "id": 5, - "name": "早苗绿", - "price": 5, - "status": 4, - "buy_time": 1599219782000, - "due_time": 1601811782000, - "color_name": "green" - }, - { - "id": 6, - "name": "胖次蓝", - "price": 5, - "color_name": "blue" - }, - { - "id": 7, - "name": "基佬紫", - "price": 5, - "color_name": "purple" - } - ], - "load_equip": { - "id": 2531, - "name": "初音未来13周年", - "ver": 1598602035, - "loading_url": "http://i0.hdslb.com/bfs/garb/item/9b12e8b5cc16a4c2e71e91c43796f09d5e132847.webp" - } - } -} -``` - -</details> - -## 主题包结构 - -主题包为app端付费主题(套装)的整合包,以zip格式通过url分发 - -包内的图片文件为app对应的资源替换,替换时可随意修改后缀 jpg 或 png - -必要性:head_bg 及 head_tab_bg 为必要,其他非必要 - -| 文件名 | 说明 | -| --------------------------------- | -------------------------- | -| head_bg.jpg | 首页顶部栏背景 | -| head_tab_bg.jpg | 顶部栏背景 | -| head_myself_bg.jpg | 【我的】页面头图(小) | -| head_myself_squared_bg.jpg | 【我的】页面头图(大) | -| head_myself_mp4_bg.mp4 | 【我的】页面头图(视频)<br />格式参考:后缀必须 mp4、分辨率 1242 x 1074、60 FPS、去掉音轨(音频) | -| side_bg.jpg | 侧边栏背景 | -| side_bg_bottom.jpg | 侧边栏底部背景 | -| tail_bg.png | 底部栏背景 | -| tail_icon_main.png | 【首页】按钮 | -| tail_icon_channel.png | 【频道】按钮 | -| tail_icon_dynamic.png | 【动态】按钮 | -| tail_icon_shop.png | 【会员购】按钮 | -| tail_icon_myself.png | 【我的】按钮 | -| tail_icon_pub_btn_bg.png | 【发布】按钮 | -| tail_icon_selected_main.png | 【首页】按钮(选中状态) | -| tail_icon_selected_channel.png | 【频道】按钮(选中状态) | -| tail_icon_selected_dynamic.png | 【动态】按钮(选中状态) | -| tail_icon_selected_shop.png | 【会员购】按钮(选中状态) | -| tail_icon_selected_myself.png | 【我的】按钮(选中状态) | -| tail_icon_selected_pub_btn_bg.png | 【发布】按钮(选中状态) | - - -以`id=2529(初音未来-日版)`的资源为例 - -```shell -wget https://i0.hdslb.com/bfs/garb/zip/9c393edea0c7b7b59685a20cd655363ef573a325.zip -unzip -l 9c393edea0c7b7b59685a20cd655363ef573a325.zip -``` - -返回为 - -``` -Archive: 9c393edea0c7b7b59685a20cd655363ef573a325.zip - Length Date Time Name ---------- ---------- ----- ---- - 22995 1980-00-00 00:00 tail_icon_selected_myself.png - 18444 1980-00-00 00:00 head_bg.jpg - 3061 1980-00-00 00:00 head_tab_bg.jpg - 188898 1980-00-00 00:00 side_bg.jpg - 2842 1980-00-00 00:00 side_bg_bottom.jpg - 203134 1980-00-00 00:00 tail_bg.png - 27539 1980-00-00 00:00 tail_icon_main.png - 25632 1980-00-00 00:00 tail_icon_selected_main.png - 27415 1980-00-00 00:00 tail_icon_selected_channel.png - 191706 1980-00-00 00:00 head_myself_squared_bg.jpg - 27919 1980-00-00 00:00 tail_icon_channel.png - 27262 1980-00-00 00:00 tail_icon_selected_dynamic.png - 147738 1980-00-00 00:00 head_myself_bg.jpg - 28182 1980-00-00 00:00 tail_icon_dynamic.png - 25878 1980-00-00 00:00 tail_icon_shop.png - 26487 1980-00-00 00:00 tail_icon_selected_shop.png - 21831 1980-00-00 00:00 tail_icon_myself.png ---------- ------- - 1016963 17 files -``` - diff --git a/docs/historytoview/history.md b/docs/historytoview/history.md deleted file mode 100644 index bf49a71..0000000 --- a/docs/historytoview/history.md +++ /dev/null @@ -1,845 +0,0 @@ -# 历史记录 - -## 获取历史记录列表_web端 - -> https://api.bilibili.com/x/web-interface/history/cursor - -*请求方式:GET* - -认证方式:Cookie (SESSDATA) - -注:`max`、`business`、`view_at`参数用于历史记录列表的 IFS (无限滚动),其用法类似链表的 next 指针 - -本接口也可以返回已失效稿件的信息 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| max | num | 历史记录截止目标 id | 非必要 | 默认为 0<br />稿件:稿件 avid<br />剧集(番剧 / 影视):剧集 ssid<br />直播:直播间 id<br />文集:文集 rlid<br />文章:文章 cvid | -| business | str | 历史记录截止目标业务类型 | 非必要 | 默认为空<br />archive:稿件<br />pgc:剧集(番剧 / 影视)<br />live:直播<br />article-list:文集<br />article:文章 | -| view_at | num | 历史记录截止时间 | 非必要 | 时间戳<br />默认为 0<br />0 为当前时间 | -| type | str | 历史记录分类筛选 | 非必要 | all:全部类型(默认)<br />archive:稿件<br />live:直播<br />article:文章 | -| ps | num | 每页项数 | 非必要 | 默认为 20,最大 30 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | ------------ | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 历史记录列表 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---------------- | ---- | -| cursor | obj | 历史记录页面信息 | | -| tab | array | 历史记录筛选类型 | | -| list | array | 分段历史记录列表 | | - -`data`中的`cursor`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------------- | -------------- | -| max | num | 最后一项目标 id | **见请求参数** | -| view_at | num | 最后一项时间节点 | 时间戳 | -| business | str | 最后一项业务类型 | **见请求参数** | -| ps | num | 每页项数 | | - -`data`中的`tab`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | ---- | -| 0 | obj | 历史记录筛选类型 1 | | -| 1 | obj | 历史记录筛选类型 2 | | -| 2 | obj | 历史记录筛选类型 3 | | - -`tab`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| type | str | 类型 | | -| name | str | 类型名 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---------------- | -| 0 | obj | 历史记录 1 | | -| n | obj | 历史记录 (n+1) | 按照查看顺序排列 | -| …… | obj | | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ------------------------------- | ------------------------ | ---------------------------------------- | -| title | str | 条目标题 | | -| long_title | str | 条目副标题 | | -| cover | str | 条目封面图 url | 用于专栏以外的条目 | -| covers | 有效时:array<br />无效时:null | 条目封面图组 | 仅用于专栏 | -| uri | str | 重定向 url | 仅用于剧集和直播 | -| history | obj | 条目详细信息 | | -| videos | num | 视频分 P 数目 | 仅用于稿件视频 | -| author_name | str | UP 主昵称 | | -| author_face | str | UP 主头像 url | | -| author_mid | num | UP 主 mid | | -| view_at | num | 查看时间 | 时间戳 | -| progress | num | 视频观看进度 | 单位为秒<br />用于稿件视频或剧集 | -| badge | str | 角标文案 | 稿件视频 / 剧集 / 笔记 | -| show_title | str | 分 P 标题 | 用于稿件视频或剧集 | -| duration | num | 视频总时长 | 用于稿件视频或剧集 | -| current | str | (?) | | -| total | num | 总计分集数 | 仅用于剧集 | -| new_desc | str | 最新一话 / 最新一 P 标识 | 用于稿件视频或剧集 | -| is_finish | num | 是否已完结 | 仅用于剧集<br />0:未完结<br />1:已完结 | -| is_fav | num | 是否收藏 | 0:未收藏<br />1:已收藏 | -| kid | num | 条目目标 id | **详细内容见参数** | -| tag_name | str | 子分区名 | 用于稿件视频和直播 | -| live_status | num | 直播状态 | 仅用于直播<br />0:未开播<br />1:已开播 | - -`list`数组中的对象中的`covers`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | str | 封面图片 1 | | -| n | str | 封面图片 (n+1) | | -| …… | str | …… | | - -`list`数组中的对象中的`history`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | --------------------- | ------------------------------------------------------------ | -| oid | num | 目标id | 稿件视频&剧集(当`business=archive`或`business=pgc`时):稿件avid<br />直播(当`business=live`时):直播间id<br />文章(当`business=article`时):文章cvid<br />文集(当`business=article-list`时):文集rlid | -| epid | num | 剧集epid | 仅用于剧集 | -| bvid | str | 稿件bvid | 仅用于稿件视频 | -| page | num | 观看到的视频分P数 | 仅用于稿件视频 | -| cid | num | 观看到的对象id | 稿件视频&剧集(当`business=archive`或`business=pgc`时):视频cid<br />文集(当`business=article-list`时):文章cvid | -| part | str | 观看到的视频分 P 标题 | 仅用于稿件视频 | -| business | str | 业务类型 | **见请求参数** | -| dt | num | 记录查看的平台代码 | 1 3 5 7:手机端<br />2:web端<br />4 6:pad端<br />9: 智能音箱/游戏机33:TV端<br />0:其他 | - -**示例:** - -获取当前时间截止的5条历史记录 - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/history/cursor' \ ---data-urlencode 'ps=5' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "cursor": { - "max": 26193, - "view_at": 1592985807, - "business": "pgc", - "ps": 5 - }, - "tab": [ - { - "type": "archive", - "name": "视频" - }, - { - "type": "live", - "name": "直播" - }, - { - "type": "article", - "name": "专栏" - } - ], - "list": [ - { - "title": "韩国漫画如何出海掘金?一年出口额2.8亿元", - "long_title": "", - "cover": "", - "covers": [ - "https://i0.hdslb.com/bfs/article/b170c6fd7429ae205d6cb935e1d431710d82609d.jpg" - ], - "uri": "", - "history": { - "oid": 6470274, - "epid": 0, - "bvid": "", - "page": 0, - "cid": 0, - "part": "", - "business": "article", - "dt": 2 - }, - "videos": 0, - "author_name": "三文娱", - "author_face": "http://i1.hdslb.com/bfs/face/98566839756a8e3de6e183109984b032de6ff2d9.jpg", - "author_mid": 34772409, - "view_at": 1593000539, - "progress": 0, - "badge": "专栏", - "show_title": "", - "duration": 0, - "current": "", - "total": 0, - "new_desc": "", - "is_finish": 0, - "is_fav": 0, - "kid": 6470274, - "tag_name": "", - "live_status": 0 - }, - { - "title": "从国际空间站俯瞰地球,静谧蓝星守护者", - "long_title": "", - "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/f07d8a0c7c5655f81cf1586903a121f2680cf3bc.jpg", - "covers": null, - "uri": "https://live.bilibili.com/14047", - "history": { - "oid": 14047, - "epid": 0, - "bvid": "", - "page": 0, - "cid": 0, - "part": "", - "business": "live", - "dt": 2 - }, - "videos": 0, - "author_name": "Zelo-Balance", - "author_face": "http://i1.hdslb.com/bfs/face/7303b3032d1e13ca7c788cd9c30d4430f8ffd1ea.jpg", - "author_mid": 19193, - "view_at": 1592999822, - "progress": 0, - "badge": "直播中", - "show_title": "", - "duration": 0, - "current": "", - "total": 0, - "new_desc": "", - "is_finish": 0, - "is_fav": 0, - "kid": 14047, - "tag_name": "户外", - "live_status": 1 - }, - { - "title": "许巍 《蓝莲花》吉他Cover,这回你们不用截图抓我了吧", - "long_title": "", - "cover": "http://i2.hdslb.com/bfs/archive/0225b1f1a790393097ceebb51e89796be806d6bc.jpg", - "covers": null, - "uri": "", - "history": { - "oid": 883617049, - "epid": 0, - "bvid": "BV1sK4y147ob", - "page": 1, - "cid": 205017957, - "part": "许巍 《蓝莲花》 Cover_1", - "business": "archive", - "dt": 2 - }, - "videos": 1, - "author_name": "硬核拆解", - "author_face": "http://i1.hdslb.com/bfs/face/4e131c9609299303cdde882792fc62b9f99cdcde.jpg", - "author_mid": 427494870, - "view_at": 1592999572, - "progress": 13, - "badge": "", - "show_title": "", - "duration": 91, - "current": "", - "total": 0, - "new_desc": "", - "is_finish": 0, - "is_fav": 0, - "kid": 883617049, - "tag_name": "演奏", - "live_status": 0 - }, - { - "title": "从清楚与混沌之分看Vtuber形象塑造", - "long_title": "", - "cover": "", - "covers": [ - "https://i0.hdslb.com/bfs/article/5ddb94dd1890c639622717c7083fb2917b4aa475.jpg" - ], - "uri": "", - "history": { - "oid": 268656, - "epid": 0, - "bvid": "", - "page": 0, - "cid": 6233590, - "part": "", - "business": "article-list", - "dt": 2 - }, - "videos": 0, - "author_name": "普天一光", - "author_face": "http://i2.hdslb.com/bfs/face/3702810bdac3d5103d684e61dc5bc8492a74f904.jpg", - "author_mid": 6614889, - "view_at": 1592998686, - "progress": 0, - "badge": "专栏", - "show_title": "", - "duration": 0, - "current": "", - "total": 0, - "new_desc": "", - "is_finish": 0, - "is_fav": 0, - "kid": 268656, - "tag_name": "", - "live_status": 0 - }, - { - "title": "百妖谱", - "long_title": "庆忌(下)", - "cover": "http://i0.hdslb.com/bfs/archive/695a4566d05620a24c51d6eb935fa4767d673b45.jpg", - "covers": null, - "uri": "https://www.bilibili.com/bangumi/play/ss26193", - "history": { - "oid": 370908663, - "epid": 326789, - "bvid": "", - "page": 0, - "cid": 199204975, - "part": "", - "business": "pgc", - "dt": 3 - }, - "videos": 0, - "author_name": "", - "author_face": "", - "author_mid": 0, - "view_at": 1592985807, - "progress": 533, - "badge": "国创", - "show_title": "第8话 庆忌(下)", - "duration": 1402, - "current": "", - "total": 12, - "new_desc": "更新至第10话", - "is_finish": 0, - "is_fav": 0, - "kid": 26193, - "tag_name": "", - "live_status": 0 - } - ] - } -} -``` - -</details> - -## 获取视频观看历史记录_web端旧版 - -> https://api.bilibili.com/x/v2/history - -*请求方式:GET* - -认证方式:Cookie (SESSDATA) - -本接口也可以返回已失效稿件的信息 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ------- | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | ------------ | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 历史记录列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ------------------------------------------ | -| 0 | obj | 历史观看1 | | -| n | obj | 历史观看(n+1) | 按照观看顺序排列<br />项数为总计观看视频数 | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------------- | ------- | ------------------------------ | ------------------------------------------------------------ | -| aid | num | 稿件avid | | -| videos | num | 视频分P总数 | 默认为1 | -| tid | num | 分区tid | | -| tname | str | 子分区名称 | | -| copyright | num | 是否转载 | 1:原创<br />2:转载<br />3:未填写 | -| pic | str | 视频封面图片url | | -| title | str | 稿件标题 | | -| pubdate | num | 稿件发布时间 | 时间戳 | -| ctime | num | 用户提交稿件的时间 | 时间戳 | -| desc | str | 视频简介 | | -| state | num | 视频状态 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`state`备注 | -| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除<br />~~略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`attribute`备注~~ | -| duration | num | 视频总计持续时长(所有分P) | 单位为秒 | -| rights | obj | 视频属性标志 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`rights`对象 | -| owner | obj | 视频UP主信息 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`owner`对象 | -| stat | obj | 视频状态数 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`stat`对象 | -| dynamic | str | 视频同步发布的的动态的文字内容 | 无为空 | -| cid | num | 视频1P cid | | -| dimension | obj | 视频1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`dimension`对象 | -| bangumi | obj | 番剧/影视信息 | 非番剧/影视无此项 | -| cheese | obj | 课程信息 | 非课程无此项 | -| favorite | bool | 是否已收藏 | true:已收藏<br />false:未收藏 | -| type | num | 视频属性 | 3:普通视频<br />4:剧集<br />10:课程 | -| sub_type | num | 附视频属性 | 0:普通视频<br />1:番剧<br />2:电影<br />3:纪录片<br />4:国创<br />5:电视剧<br />7:综艺 | -| device | num | 观看平台代码 | 1 3 5 7:手机端<br />2:web端<br />4 6:pad端<br />33:TV端<br />0:其他 | -| page | obj | 最后观看的分P信息 | | -| count | num | 分P数 | 非投稿视频无此项 | -| progress | num | 观看进度 | 单位为秒 | -| view_at | num | 观看时间 | 时间戳 | -| kid | num | 稿件avid | | -| business | str | 视频类型标识 | archive:用户投稿视频<br />pgc:番剧/影视<br />cheese:课程 | -| redirect_link | str | 重定向url | | -| bvid | str | 稿件bvid | | - -`data`数组中的对象`bangumi`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | --------------- | ------------ | -| cover | str | 番剧封面图片url | | -| ep_id | num | 番剧epid | | -| episode_status | num | ??? | | -| follow | num | 0 | 作用尚不明确 | -| long_title | str | 单集标题 | | -| season | obj | 剧集信息 | | -| title | str | 集数 | | - -`bangumi`中的`season`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------ | ---------------------- | -| is_finish | num | 是否完结 | 0:连载中<br />1:完结 | -| newest_ep_id | num | 最细一话epid | | -| newest_ep_index | str | 最细一话集数 | | -| season_id | num | 番剧ssid | | -| season_status | num | ??? | | -| season_type | num | ??? | | -| title | str | 番剧标题 | | -| total_count | num | 总集数 | | - -`data`数组中的对象`cheese`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | --------------- | ---- | -| cover | str | 课程封面图片url | | -| long_title | str | 完整标题 | | -| number | str | 本集数 | | -| season_id | num | 课程ssid | | -| update_info | str | 总集数 | | - -**示例:** - -查询当前视频历史记录列表 - -```shell -curl -G 'https://api.bilibili.com/x/v2/history' \ ---data-urlencode 'ps=5' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "aid": 96523832, - "videos": 1, - "tid": 33, - "tname": "连载动画", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/dfc29be381565ee041a0ec9cfc7a32f8a63f76cd.jpg", - "title": "【1月】异度侵入 ID:INVADED 12【独家正版】", - "pubdate": 1584289800, - "ctime": 1584289800, - "desc": "#12", - "state": 0, - "attribute": 338688, - "duration": 1481, - "redirect_url": "https://www.bilibili.com/bangumi/play/ep307457", - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 1, - "hd5": 1, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 928123, - "name": "哔哩哔哩番剧", - "face": "http://i1.hdslb.com/bfs/face/7a8412cbacb9fd18f40ddbbf0ad183e45afc1365.jpg" - }, - "stat": { - "aid": 96523832, - "view": 4772927, - "danmaku": 108890, - "reply": 48584, - "favorite": 46, - "coin": 61768, - "share": 290, - "now_rank": 0, - "his_rank": 0, - "like": 1241, - "dislike": 0 - }, - "dynamic": "", - "cid": 164789275, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "favorite": false, - "type": 4, - "sub_type": 1, - "device": 3, - "page": { - "cid": 164789275, - "page": 1, - "from": "vupload", - "part": "ID_INVADED_112.encoded", - "duration": 1481, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - } - }, - "bangumi": { - "ep_id": 307457, - "title": "12", - "long_title": "CHANNELED", - "episode_status": 13, - "follow": 0, - "cover": "http://i0.hdslb.com/bfs/archive/dfc29be381565ee041a0ec9cfc7a32f8a63f76cd.jpg", - "season": { - "season_id": 29310, - "title": "异度侵入 ID:INVADED", - "season_status": 13, - "is_finish": 1, - "total_count": 13, - "newest_ep_id": 307774, - "newest_ep_index": "13", - "season_type": 1 - } - }, - "progress": 277, - "view_at": 1588831600, - "kid": 29310, - "business": "pgc", - "redirect_link": "https://www.bilibili.com/bangumi/play/ep307457", - "bvid": "BV1K7411f7uu" - }, - { - "aid": 497899395, - "videos": 1, - "tid": 189, - "tname": "电脑装机", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/fd4e0893b234ee729cf15198065eced98367ebfe.jpg", - "title": "600元的2007款iMac,如今过时了吗?", - "pubdate": 1587727345, - "ctime": 1587708111, - "desc": "苹果东西是真的保值,酷睿2现在都还能卖的这么贵。第一次使用4K画质进行拍摄,应该比以前清楚一些。如有问题请在评论区指出,谢谢!", - "state": 0, - "attribute": 16768, - "duration": 389, - "mission_id": 13106, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 3391089, - "name": "数字云糕Official", - "face": "http://i2.hdslb.com/bfs/face/238dfbca5dda5de2d5ba95ee4e99804714e2b5e2.jpg" - }, - "stat": { - "aid": 497899395, - "view": 23325, - "danmaku": 92, - "reply": 115, - "favorite": 195, - "coin": 132, - "share": 23, - "now_rank": 0, - "his_rank": 0, - "like": 555, - "dislike": 0 - }, - "dynamic": "#IMAC##APPLE##MAC# 苹果东西是真的保值,酷睿2现在都还能卖的这么贵。第一次使用4K画质进行拍摄,应该比以前清楚一些。", - "cid": 182570131, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "favorite": false, - "type": 3, - "sub_type": 0, - "device": 3, - "page": { - "cid": 182570131, - "page": 1, - "from": "vupload", - "part": "iMac", - "duration": 389, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - } - }, - "count": 1, - "progress": -1, - "view_at": 1588828357, - "kid": 497899395, - "business": "archive", - "redirect_link": "https://www.bilibili.com/video/av497899395", - "bvid": "BV1NK41157EF" - } - ] -} -``` - -</details> - -## 删除历史记录 - -> https://api.bilibili.com/x/v2/history/delete - -*请求方式:POST* - -认证方式:Cookie (SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------------------------------------------------- | ------ | ------------------------------------------------------------ | -| kid | str | 删除的目标记录,格式为`{业务类型}_{目标id}`详见备注 | 必要 | 视频:archive\_{稿件avid}<br />直播:live_{直播间id}<br />专栏:article\_{专栏cvid}<br />剧集:pgc\_{剧集ssid}<br />文集:article-list\_{文集rlid} | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -删除视频`av540580868`的观看历史记录 - -```shell -curl 'https://api.bilibili.com/x/v2/history/delete' \ ---data-urlencode 'kid=archive_540580868' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 清空历史记录 - -> https://api.bilibili.com/x/v2/history/clear - -*请求方式:POST* - -认证方式:Cookie (SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -清空历史记录 - -```shell -curl 'https://api.bilibili.com/x/v2/history/clear' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 停用历史记录 - -> https://api.bilibili.com/x/v2/history/shadow/set - -*请求方式:POST* - -认证方式:Cookie (SESSDATA) - -该操作不会影响原有历史记录 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | -------------------------------------------- | -| switch | bool | 停用开关 | 非必要 | true:停用<br />false:正常<br />默认为false | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -停用历史记录功能 - -```shell -curl 'https://api.bilibili.com/x/v2/history/shadow/set' \ ---data-urlencode 'switch=true' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 查询历史记录停用状态 - -> https://api.bilibili.com/x/v2/history/shadow - -*请求方式:GET* - -认证方式:Cookie (SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | bool | 停用状态 | true:停用<br />false:正常 | - -**示例:** - -当前状态为未停用视频历史记录 - -```shell -curl 'https://api.bilibili.com/x/v2/history/shadow' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": false -} -``` - -</details> diff --git a/docs/historytoview/toview.md b/docs/historytoview/toview.md deleted file mode 100644 index e44248a..0000000 --- a/docs/historytoview/toview.md +++ /dev/null @@ -1,462 +0,0 @@ -# 稍后再看 - -<img src="../../assets/img/toview.png" width="25" height="20"/> - -## 视频添加稍后再看 - -> https://api.bilibili.com/x/v2/history/toview/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -最多添加100个视频 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误<br />90001:列表已满<br />90003:稿件已经被删除 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -添加视频`av41687433`/`BV1ht41147kj`到稍后再看列表 - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview/add' \ ---data-urlencode 'aid=41687433' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview/add' \ ---data-urlencode 'bvid=BV1ht41147kj' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 添加频道中所有视频到稍后再看 - -> https://space.bilibili.com/ajax/channel/addAllToView - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`及`DedeUserID__ckMd5`存在且不为0,referer为 `.bilibili.com`域名下 - -带有转义 - -超过容量后会截取容量之内的添加 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| cid | num | 目标频道id | 必要 | | -| mid | num | 目标频道所属的用户mid | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------------------------- | -| status | bool | 是否成功 | false:失败<br />true:成功 | -| data | str | 错误信息 | | - -**示例:** - -添加用户`mid=282994`下的频道`4693`中所有视频到稍后再看 - -```shell -curl 'https://space.bilibili.com/ajax/channel/addAllToView' \ ---data-urlencode 'cid=4693' \ ---data-urlencode 'mid=282994' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' --e 'https://www.bilibili.com' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "status": true, - "data": "操作成功" -} -``` - -</details> - -## 获取稍后再看视频列表 - -> https://api.bilibili.com/x/v2/history/toview - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | data | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| count | num | 稍后再看视频数 | | -| list | array | 稍后再看视频列表 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------------------------------------- | -| 0 | obj | 稍后再看1 | | -| n | obj | 稍后再看(n+1) | 按照添加顺序排列<br />项数为总计稍后再看视频数 | -| …… | obj | …… | …… | -| 99 | obj | 最后一项 | | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------------- | ------- | ------------------------------ | ------------------------------------------------------------ | -| aid | num | 稿件avid | | -| videos | num | 稿件分P总数 | 默认为1 | -| tid | num | 分区tid | | -| tname | str | 子分区名称 | | -| copyright | num | 是否转载 | 1:原创<br />2:转载<br />3:未填写 | -| pic | str | 稿件封面图片url | | -| title | str | 稿件标题 | | -| pubdate | num | 稿件发布时间 | 时间戳 | -| ctime | num | 用户提交稿件的时间 | 时间戳 | -| desc | str | 视频简介 | | -| state | num | 视频状态 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`state`备注 | -| ~~attribute~~(仅做历史性保留) | ~~num~~ | ~~稿件属性位配置~~ | 本字段已被删除~~略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`attribute`备注~~ | -| duration | num | 稿件总时长(所有分P) | 单位为秒 | -| rights | obj | 稿件属性标志 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`rights`对象 | -| owner | obj | 稿件UP主信息 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`owner`对象 | -| stat | obj | 稿件状态数 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`stat`对象 | -| dynamic | str | 视频同步发布的的动态的文字内容 | 无为空 | -| dimension | obj | 稿件1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息(web端))中的`dimension`对象 | -| count | num | 稿件分P数 | 非投稿视频无此项 | -| cid | num | 视频cid | | -| progress | num | 观看进度时间 | 单位为秒 | -| add_at | num | 添加时间 | 时间戳 | -| bvid | str | 稿件bvid | | - -**示例:** - -获取稍后再看视频列表 - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 25, - "list": [ - { - "aid": 200333024, - "videos": 1, - "tid": 95, - "tname": "手机平板", - "copyright": 1, - "pic": "http://i1.hdslb.com/bfs/archive/a5e3072e670daec4c01a182aae91c1f85a48001e.jpg", - "title": "【山新】疫情下,配音演员怎么开工录音?", - "pubdate": 1586959137, - "ctime": 1586959137, - "desc": "疫情这段时间,配音演员们是怎么录音的呢=W=", - "state": 0, - "attribute": 16768, - "duration": 218, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 14082, - "name": "山新", - "face": "http://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg" - }, - "stat": { - "aid": 200333024, - "view": 361123, - "danmaku": 1792, - "reply": 1376, - "favorite": 7571, - "coin": 12129, - "share": 895, - "now_rank": 0, - "his_rank": 0, - "like": 54705, - "dislike": 0 - }, - "dynamic": "疫情这段时间,配音演员们是怎么录音的呢=W=", - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "page": { - "cid": 178808041, - "page": 1, - "from": "vupload", - "part": "无标题", - "duration": 218, - "vid": "", - "weblink": "", - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - } - }, - "count": 1, - "cid": 178808041, - "progress": 32, - "add_at": 1587041785, - "bvid": "BV1Yz411B7n3" - }, - { - "aid": 710350011, - "videos": 1, - "tid": 124, - "tname": "趣味科普人文", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/c5b7e7c07a4abf27029c5afb3ab65fee4475b9a9.jpg", - "title": "不花一分钱建立自己的网站!给硬盘里的小姐姐换个新家!", - "pubdate": 1586919626, - "ctime": 1586898238, - "desc": "制作视频不易,你的点赞是对我最大的支持!\nUP主的个人网站:https://amdradeonrin.github.io/MIKU/\n视频提到的文件在网站有下载\nGitHub上的网站源码:https://github.com/AMDRadeonRin/MIKU", - "state": 0, - "attribute": 16768, - "duration": 169, - "mission_id": 13106, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 179757857, - "name": "GTX690战术核显卡导弹", - "face": "http://i2.hdslb.com/bfs/face/2504de8c1eeef22d91bbc45803f6b29afcbb0adf.jpg" - }, - "stat": { - "aid": 710350011, - "view": 3293, - "danmaku": 37, - "reply": 117, - "favorite": 355, - "coin": 76, - "share": 11, - "now_rank": 0, - "his_rank": 0, - "like": 325, - "dislike": 0 - }, - "dynamic": "#网页制作##HTML##网页#给你们科普一下怎么弄网站吧,你们也可以考虑整一个XD", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "count": 1, - "cid": 0, - "progress": 0, - "add_at": 1587012410, - "bvid": "BV1LQ4y1T7Xh" - }, - ………… - ] - } -} -``` - -</details> - -## 删除稍后再看视频 - -> https://api.bilibili.com/x/v2/history/toview/del - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| viewed | bool | 是否删除所有已观看的视频 | 非必要 | true:删除已观看视频<br />false:不删除已观看视频<br />默认为false | -| aid | num | 删除的目标记录的avid | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -删除视频`av540580868`的稍后再看记录 - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview/del' \ ---data-urlencode 'aid=540580868' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -删除所有已观看的视频 - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview/del' \ ---data-urlencode 'viewed=true' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> - -## 清空稍后再看视频列表 - -> https://api.bilibili.com/x/v2/history/toview/clear - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| csrf | num | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录<br />-111:csrf校验失败 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -清空稍后再看视频列表 - -```shell -curl 'https://api.bilibili.com/x/v2/history/toview/clear' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -</details> diff --git a/docs/live/danmaku.md b/docs/live/danmaku.md deleted file mode 100644 index 3171c47..0000000 --- a/docs/live/danmaku.md +++ /dev/null @@ -1,1828 +0,0 @@ -# 直播间弹幕 - -## 获取当前用户对应直播间可发弹幕配置 - -> https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -未登录也可以获取,但颜色只有白色可用,模式只有滚动。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---- | --- | --- | ---- | --- | -| room_id | num | 直播间id | 必要 | | -| web_location | str | (?) | 非必要 | 作用尚不明确 | -| w_rid | str | wbi签名 | 非必要 | 不强制需要 | -| wts | num | 秒时间戳 | 非必要 | 不强制需要 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />-400: 参数错误 | -| data | obj | 信息本体 | | -| message | str | 错误信息 | | -| msg | str | 信息 | 成功时存在,为`""`(空字符串) | -| ttl | num | `1` | 成功时不存在 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| group | arr | 弹幕颜色组 | | -| mode | arr | 弹幕显示模式 | | - -`data.group` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| name | str | 显示名称 | | -| sort | num | 用于排序 | | -| color | arr | 该组颜色列表 | | - -`data.group[i].color` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| name | str | 颜色名 | | -| color | str | 十进制颜色值 | 发送弹幕用 | -| color\_hex | str | 十六进制颜色值 | 发送弹幕用 | -| status | num | 可用状态 | 0: 不可用<br />1: 可用 | -| weight | num | (?) | 作用尚不明确 | -| color\_id | num | 颜色id? | | -| origin | num | (?) | | - -`data.mode` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| name | str | 模式名称 | | -| mode | num | 模式值 | 发送弹幕用 | -| type | str | 模式类型 | | -| status | num | 可用状态 | 0: 不可用<br />1: 可用 | - -**示例:** - -获取未登录用户在直播间 `1` 的弹幕配置可用情况 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/GetDMConfigByGroup?room_id=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "group": [ - { - "name": "普", - "sort": 0, - "color": [ - { - "name": "白色", - "color": "16777215", - "color_hex": "ffffff", - "status": 1, - "weight": -9999, - "color_id": -9999, - "origin": 0 - } - ] - }, - { - "name": "航", - "sort": 100, - "color": [ - { - "name": "紫色", - "color": "14893055", - "color_hex": "e33fff", - "status": 0, - "weight": 0, - "color_id": 6, - "origin": 1 - } - ] - }, - { - "name": "粉", - "sort": 200, - "color": [ - { - "name": "松石绿", - "color": "5566168", - "color_hex": "54eed8", - "status": 0, - "weight": 99, - "color_id": 66, - "origin": 2 - }, - { - "name": "雨后蓝", - "color": "5816798", - "color_hex": "58c1de", - "status": 0, - "weight": 98, - "color_id": 67, - "origin": 2 - }, - { - "name": "星空蓝", - "color": "4546550", - "color_hex": "455ff6", - "status": 0, - "weight": 97, - "color_id": 68, - "origin": 2 - }, - { - "name": "紫罗兰", - "color": "9920249", - "color_hex": "975ef9", - "status": 0, - "weight": 96, - "color_id": 69, - "origin": 2 - }, - { - "name": "梦境红", - "color": "12802438", - "color_hex": "c35986", - "status": 0, - "weight": 95, - "color_id": 70, - "origin": 2 - }, - { - "name": "热力橙", - "color": "16747553", - "color_hex": "ff8c21", - "status": 0, - "weight": 94, - "color_id": 71, - "origin": 2 - }, - { - "name": "香槟金", - "color": "16774434", - "color_hex": "fff522", - "status": 0, - "weight": 93, - "color_id": 72, - "origin": 2 - } - ] - }, - { - "name": "爷", - "sort": 300, - "color": [ - { - "name": "红色", - "color": "16738408", - "color_hex": "ff6868", - "status": 0, - "weight": 0, - "color_id": 8, - "origin": 3 - }, - { - "name": "蓝色", - "color": "6737151", - "color_hex": "66ccff", - "status": 0, - "weight": 0, - "color_id": 7, - "origin": 3 - } - ] - }, - { - "name": "活", - "sort": 400, - "color": [ - { - "name": "盛典金", - "color": "16766720", - "color_hex": "ffd700", - "status": 0, - "weight": 100, - "color_id": 44, - "origin": 4 - }, - { - "name": "升腾蓝", - "color": "4286945", - "color_hex": "4169e1", - "status": 0, - "weight": 100, - "color_id": 43, - "origin": 4 - }, - { - "name": "青色", - "color": "65532", - "color_hex": "fffc", - "status": 0, - "weight": 0, - "color_id": 5, - "origin": 4 - }, - { - "name": "绿色", - "color": "8322816", - "color_hex": "7eff00", - "status": 0, - "weight": 0, - "color_id": 4, - "origin": 4 - }, - { - "name": "黄色弹幕", - "color": "16772431", - "color_hex": "ffed4f", - "status": 0, - "weight": 0, - "color_id": 3, - "origin": 4 - }, - { - "name": "橙色", - "color": "16750592", - "color_hex": "ff9800", - "status": 0, - "weight": 0, - "color_id": 2, - "origin": 4 - }, - { - "name": "粉色", - "color": "16741274", - "color_hex": "ff739a", - "status": 0, - "weight": 0, - "color_id": 1, - "origin": 4 - } - ] - } - ], - "mode": [ - { - "name": "滚动", - "mode": 1, - "type": "scroll", - "status": 1 - }, - { - "name": "底部", - "mode": 4, - "type": "bottom", - "status": 0 - }, - { - "name": "顶部", - "mode": 5, - "type": "top", - "status": 0 - } - ] - }, - "message": "", - "msg": "" -} -``` - -</details> - - -## 获取直播间最近历史弹幕 - -> https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory - -<!--{ - "from": { - "url": "https://www.bilibili.com/read/cv8186413/" - } -}--> - -*请求方式: GET* - -注: 该接口部分返回信息不明, 仅供参考, 来源 [cv8186413](https://www.bilibili.com/read/cv8186413/) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | --- | - | - | -| roomid | num | 直播间短ID | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | -| message | str | 错误信息 | 默认为空 | -| msg | str | 空 | 仅请求成功时存在 | -| ttl | num | 1 | 仅请求失败时存在 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| admin | array | 管理员最新的10条弹幕消息 | 格式与`room`相同 | -| room | array | 普通用户的10条弹幕信息 | 格式与`admin`相同 | - -`data`中的任意数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| text | str | 弹幕内容 | | -| dm_type | num | 弹幕类型 | | -| uid | num | 弹幕发送者的UID | | -| nickname | str | 弹幕发送者的昵称 | | -| uname_color | str | 弹幕发送者的昵称颜色? | | -| timeline | str | 弹幕发送时间 | 格式为`yyyy-MM-dd HH:mm:ss` | -| isadmin | num | 是否为管理员 | | -| vip | num | 是否为VIP? || -| svip | num | 是否为SVIP? || -| medal | array | 粉丝勋章信息? | 格式不明 | -| title | array | 标题? | 格式不明 | -| user_level | array | 用户等级信息? | 格式不明 | -| rank | num | 排名? | [用户空间详细信息](../user/info.md#获取用户详细信息) | -| teamid | num | | | -| rnd | str | 随机数种子? | | -| user_title | str | 用户头衔? |格式不明| -| guard_level | | 大航海等级? | | -| bubble | | | | -| bubble_color | | | | -| lpl | | | | -| yeah_space_url | | | | -| jump_to_url | | | | -| check_info | obj | 弹幕审核信息? | | -| voice_dm_info | obj | 语音弹幕信息? | | -| emoticon | obj | 房间独有表情信息 | | -| emots | obj | 默认表情信息 | 结构为`表情名-信息`组成的键值对<br />如果信息不含默认表情,则返回 null | -| id_str | str | 弹幕ID? | | -| wealth_level | num | 财富等级? | | -| bubble_id_v2 | num | | | -| reply | obj | 回复的弹幕 | | -| group_medal | null | | | -| user | obj | 该用户信息 || - -`data`对象中的`emoticon`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------------------ | ---------------------------- | -| id | num | 0 | | -| emoticon_unique | str | 表情的独特标识 | 格式为`room_房间号_表情id` | -| text | text | 表情的触发词 | | -| perm | num | 发送权限? | 1:所有人都可发送 | -| url | str | 表情的图像链接 | | -| in_player_area | num | 是否显示在直播画面区域? | | -| bulge_display | num | 是否高亮显示? | | -| is_dynamic | num | 是否为动态表情 | 0:静态图像<br />1:动态图像 | -| height | num | 表情的高度 | | -| width | num | 表情的宽度 | | - -`data`对象中的`emots`对象中的任意一个值对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------- | ------------------------- | -| count | num | 重复发送数量 | | -| descript | str | 表情描述 | | -| emoji | str | 表情描述 | | -| emotion_id | num | 表情 id | | -| emotion_unique | str | 表情的独特标识符 | 格式可能为`emoji_表情 id` | -| height | num | 表情的宽度 | | -| url | str | 表情的图像链接 | | -| width | num | 表情的高度 | | - -`data`对象中的`user`对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | --- | --- | -| uid | num | 用户 mid || -| base | obj | 用户基本信息 || -| medal | null | || -| wealth | null | || -| title | obj | 用户标题? || -| guard | null | || -| uhead_frame | null | || -| guard_leader | obj | | | - -`data`对象中的`user`对象中的`base`对象: - -| 字段 | 类型 | 内容 | 备注 | -| - | - | --- | --- | -| name | str | 用户名 || -| face | str | 用户头像 url || -| name_color | num | 用户名颜色? || -| is_mystery | bool | 是否为神秘用户? || -| risk_ctrl_info | null | | | -| origin_info | obj | 原始信息? | | -| official_info | obj | 认证信息 | | -| name_color_str | str | | | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory' \ ---url-query 'roomid=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "admin": [], - "room": [ - { - "text": "‫", - "dm_type": 0, - "uid": 20276964, - "nickname": "咸菜拉面", - "uname_color": "", - "timeline": "2024-08-15 05:05:06", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [ - 27, - "小孩梓", - "阿梓从小就很可爱", - 80397, - 398668, - "", - 0, - 6809855, - 398668, - 6850801, - 3, - 1, - 7706705 - ], - "title": [ - "title-86-1", - "title-86-1" - ], - "user_level": [ - 59, - 0, - 16752445, - 931 - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723669505", - "user_title": "title-86-1", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723669506, - "ct": "18434F3D" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "74368f428dfaec806cd205e62866bd1c45", - "wealth_level": 37, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 20276964, - "base": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "小孩梓", - "level": 27, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 13139, - "typ": 0, - "is_light": 1, - "ruid": 7706705, - "guard_level": 3, - "score": 50112778, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": { - "old_title_css_id": "title-86-1", - "title_css_id": "title-86-1" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "‫", - "dm_type": 0, - "uid": 20276964, - "nickname": "咸菜拉面", - "uname_color": "", - "timeline": "2024-08-16 05:05:06", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [ - 27, - "小孩梓", - "阿梓从小就很可爱", - 80397, - 398668, - "", - 0, - 6809855, - 398668, - 6850801, - 3, - 1, - 7706705 - ], - "title": [ - "title-86-1", - "title-86-1" - ], - "user_level": [ - 59, - 0, - 16752445, - 931 - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723755905", - "user_title": "title-86-1", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723755906, - "ct": "F65D229F" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "7f3bb90826ad642012a31368f266be6d2", - "wealth_level": 37, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 20276964, - "base": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "小孩梓", - "level": 27, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 13139, - "typ": 0, - "is_light": 1, - "ruid": 7706705, - "guard_level": 3, - "score": 50112778, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": { - "old_title_css_id": "title-86-1", - "title_css_id": "title-86-1" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "好帅", - "dm_type": 0, - "uid": 3546708493469870, - "nickname": "aodun1", - "uname_color": "", - "timeline": "2024-08-16 22:33:28", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [], - "title": [ - "", - "" - ], - "user_level": [ - 0, - 0, - 9868950, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723811729", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723818808, - "ct": "1B75FB" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "088336a59eb277942ee353dd6666bf6347", - "wealth_level": 0, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 3546708493469870, - "base": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "好帅", - "dm_type": 0, - "uid": 3546708493469870, - "nickname": "aodun1", - "uname_color": "", - "timeline": "2024-08-16 22:35:16", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [], - "title": [ - "", - "" - ], - "user_level": [ - 0, - 0, - 9868950, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723811729", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723818916, - "ct": "D6ABF2E7" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "6f421255746f5d8e4731fdadac66bf6356", - "wealth_level": 0, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 3546708493469870, - "base": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "好帅", - "dm_type": 0, - "uid": 3546708493469870, - "nickname": "aodun1", - "uname_color": "", - "timeline": "2024-08-16 22:36:51", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [], - "title": [ - "", - "" - ], - "user_level": [ - 0, - 0, - 9868950, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723811729", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723819011, - "ct": "1B6978C1" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "270f5a2ac69c5904617873cc4666bf640", - "wealth_level": 0, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 3546708493469870, - "base": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "好帅", - "dm_type": 0, - "uid": 3546708493469870, - "nickname": "aodun1", - "uname_color": "", - "timeline": "2024-08-16 22:39:01", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [], - "title": [ - "", - "" - ], - "user_level": [ - 0, - 0, - 9868950, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723811729", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723819141, - "ct": "143613AF" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "002ebbdc402b3d625052865f7b66bf6469", - "wealth_level": 0, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 3546708493469870, - "base": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "aodun1", - "face": "https://i2.hdslb.com/bfs/face/6fb05f895d854e68419d45eef2c2e272b04ad25f.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "赚麻了 哈哈", - "dm_type": 0, - "uid": 243082910, - "nickname": "可人的樱花", - "uname_color": "", - "timeline": "2024-08-17 01:00:49", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [], - "title": [ - "", - "" - ], - "user_level": [ - 0, - 0, - 9868950, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723379161", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723827649, - "ct": "3917D4D7" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "03f3261e144366383c49c6b5d166bf8563", - "wealth_level": 7, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 243082910, - "base": { - "name": "可人的樱花", - "face": "http://i2.hdslb.com/bfs/face/5faa9bef952f831236b740932c559476658f88e5.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "可人的樱花", - "face": "http://i2.hdslb.com/bfs/face/5faa9bef952f831236b740932c559476658f88e5.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "‫", - "dm_type": 0, - "uid": 20276964, - "nickname": "咸菜拉面", - "uname_color": "", - "timeline": "2024-08-17 05:05:07", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [ - 27, - "小孩梓", - "阿梓从小就很可爱", - 80397, - 398668, - "", - 0, - 6809855, - 398668, - 6850801, - 3, - 1, - 7706705 - ], - "title": [ - "title-86-1", - "title-86-1" - ], - "user_level": [ - 59, - 0, - 16752445, - 931 - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723842307", - "user_title": "title-86-1", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723842307, - "ct": "8B947ABC" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "1a928b968afaa7825ea506ffe566bfbf16", - "wealth_level": 37, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 20276964, - "base": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "小孩梓", - "level": 27, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 13139, - "typ": 0, - "is_light": 1, - "ruid": 7706705, - "guard_level": 3, - "score": 50112778, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": { - "old_title_css_id": "title-86-1", - "title_css_id": "title-86-1" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "下播啦~ 感谢大家的陪伴~ 下次见哦~", - "dm_type": 0, - "uid": 3546614675278489, - "nickname": "机器人管家_鱼", - "uname_color": "", - "timeline": "2024-08-18 00:07:36", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [ - 21, - "赴神明", - "Mr_钟明", - 27751673, - 1725515, - "", - 0, - 12632256, - 12632256, - 12632256, - 0, - 0, - 3493291261692485 - ], - "title": [ - "", - "" - ], - "user_level": [ - 11, - 0, - 6406234, - ">50000" - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723910862", - "user_title": "", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723910856, - "ct": "9BD05026" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "2ee6101973eeb69931eb86ac7e66c0ca17", - "wealth_level": 23, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 3546614675278489, - "base": { - "name": "机器人管家_鱼", - "face": "https://i1.hdslb.com/bfs/face/de737cd746a96742c07ced6c213aa25cf0429d90.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "机器人管家_鱼", - "face": "https://i1.hdslb.com/bfs/face/de737cd746a96742c07ced6c213aa25cf0429d90.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "赴神明", - "level": 21, - "color_start": 12632256, - "color_end": 12632256, - "color_border": 12632256, - "color": 1725515, - "id": 1231122, - "typ": 0, - "is_light": 0, - "ruid": 3493291261692485, - "guard_level": 0, - "score": 50001573, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#919298CC", - "v2_medal_color_end": "#919298CC", - "v2_medal_color_border": "#919298CC", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C6C7299", - "user_receive_count": 0 - }, - "wealth": null, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - }, - { - "text": "‫", - "dm_type": 0, - "uid": 20276964, - "nickname": "咸菜拉面", - "uname_color": "", - "timeline": "2024-08-18 05:05:05", - "isadmin": 0, - "vip": 0, - "svip": 0, - "medal": [ - 27, - "小孩梓", - "阿梓从小就很可爱", - 80397, - 398668, - "", - 0, - 6809855, - 398668, - 6850801, - 3, - 1, - 7706705 - ], - "title": [ - "title-86-1", - "title-86-1" - ], - "user_level": [ - 59, - 0, - 16752445, - 931 - ], - "rank": 10000, - "teamid": 0, - "rnd": "1723928706", - "user_title": "title-86-1", - "guard_level": 0, - "bubble": 0, - "bubble_color": "", - "lpl": 0, - "yeah_space_url": "", - "jump_to_url": "", - "check_info": { - "ts": 1723928705, - "ct": "8A379FF4" - }, - "voice_dm_info": { - "voice_url": "", - "file_format": "", - "text": "", - "file_duration": 0, - "file_id": "" - }, - "emoticon": { - "id": 0, - "emoticon_unique": "", - "text": "", - "perm": 0, - "url": "", - "in_player_area": 0, - "bulge_display": 0, - "is_dynamic": 0, - "height": 0, - "width": 0 - }, - "emots": null, - "id_str": "41e8b55dea381d494cfe60ba3466c11064", - "wealth_level": 37, - "bubble_id_v2": 0, - "reply": { - "show_reply": true, - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false - }, - "group_medal": null, - "user": { - "uid": 20276964, - "base": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "咸菜拉面", - "face": "https://i0.hdslb.com/bfs/face/182b73f6b6274fcee7491219f511b1748c4bc712.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "小孩梓", - "level": 27, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 13139, - "typ": 0, - "is_light": 1, - "ruid": 7706705, - "guard_level": 3, - "score": 50112778, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": { - "old_title_css_id": "title-86-1", - "title_css_id": "title-86-1" - }, - "guard": null, - "uhead_frame": null, - "guard_leader": { - "is_guard_leader": false - } - } - } - ] - }, - "message": "", - "msg": "" -} -``` - -</details> - -## 设置弹幕样式 - -> https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---- | --- | --- | ---- | --- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| csrf\_token | str | 同csrf | 非必要 | | -| room\_id | num | 直播间id | 必要 | | -| color | str | 颜色值 | 必要(可选) | color和mode任选一个 | -| mode | num | 弹幕模式 | 必要(可选) | color和mode任选一个 | - -注1: 抓取到的color格式是`"0x"+六位十六进制小写颜色值`,实际不需要`0x`,且不区分大小写。 - -注2: 若color和mode同时存在将只处理color,mode将被忽略。(见[#1236(comment)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1236#issuecomment-2849019923)) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />-101: 账号未登录<br />-500: 未达到使用条件<br />10064002: 参数错误<br />10065107: 颜色不存在 | -| message | str | 错误信息 | | -| ttl | num | `1` | | -| data | obj | 信息本体 | 部分情况不存在,10064002时为`null` | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| status | num | 同code | | -| msg | str | 提示信息 | 成功时有内容 | -| roomid | num | 直播间id | | - -**示例:** - -更改直播间 `1017` 的弹幕颜色为白色 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/dM/AjaxSetConfig' \ - --data-urlencode 'room_id=1017' \ - --data-urlencode 'color=0xffffff' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "status":0, - "msg":"设置成功~", - "roomid":1017 - } -} -``` - -</details> - -## 发送直播弹幕 - -> https://api.live.bilibili.com/msg/send - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | --- | ----- | --- | -| w_rid | str | wbi签名 | 非必要 | 不强制需要 | -| wts | num | Unix 秒时间戳 | 非必要 | 不强制需要 | - -**正文参数 (`application/x-www-form-urlencoded`或`multipart/form-data`):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---- | --- | --- | ---- | --- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| roomid | num | 直播间id | 必要 | | -| msg | str | 弹幕内容 | 必要 | | -| rnd | num | 当前 Unix 秒时间戳 | 必要 | | -| fontsize | num | 字体大小 | 必要 | 默认为`25` | -| color | num | 十进制颜色值 | 必要 | 实际无效果 | -| mode | num | 展示模式 | 非必要 | 默认为`1` | -| bubble | num | (?) | 非必要 | 值为`0` | -| room\_type | num | (?) | 非必要 | `0` | -| jumpfrom | num | (?) | 非必要 | `0` | -| reply\_mid | num | 要“@”的用户mid | 非必要 | 默认为`0` | -| reply\_attr | num | (?) | 非必要 | `0` | -| reply\_uname | str | 要“@”的用户名称 | 非必要 | 默认为`""`,提供reply\_mid时不需要提供 | -| replay\_dmid | str | 要回复的弹幕id | 非必要 | 默认为`""` | -| statistics | str | (?) | 非必要 | `{"appId":100,"platform":5}` | -| csrf_token | str | 同csrf | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | `-101`:账号未登录<br />`-111`:csrf 校验失败<br />`-400`:请求错误,带有必须参数的信息<br />`1003212`:超出限制长度<br />`10031`:发送频率过快 | -| message | str | 错误信息 | | -| msg | str | 同`message` | | -| data | obj | 信息本体 | | -| ttl | num | `1` | 在小于0的code中存在 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| mode_info | obj | 弹幕信息 | | -| dm_v2 | null | v2弹幕 | | - -`data.mode_info` 对象: - -基本上与[直播间信息流#弹幕 (DANMU_MSG)](message_stream.md#弹幕-danmu_msg)的`info[0][15]`对象相同。 - -**示例:** - -给直播间 `1899237171` 发送内容为 `QwQ` 的弹幕 - -```shell -curl 'https://api.live.bilibili.com/msg/send' \ - --data-urlencode 'roomid=1899237171' \ - --data-urlencode 'msg=QwQ' \ - --data-urlencode 'rnd=1744956003' \ - --data-urlencode 'fontsize=25' - --data-urlencode 'color=16777215' - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "data":{ - "mode_info":{ - "mode":0, - "show_player_type":0, - "extra":"{\"send_from_me\":true,\"master_player_hidden\":false,\"mode\":0,\"color\":16777215,\"dm_type\":0,\"font_size\":25,\"player_mode\":1,\"show_player_type\":0,\"content\":\"QwQ\",\"user_hash\":\"2402762465\",\"emoticon_unique\":\"\",\"bulge_display\":0,\"recommend_score\":7,\"main_state_dm_color\":\"\",\"objective_state_dm_color\":\"\",\"direction\":0,\"pk_direction\":0,\"quartet_direction\":0,\"anniversary_crowd\":0,\"yeah_space_type\":\"\",\"yeah_space_url\":\"\",\"jump_to_url\":\"\",\"space_type\":\"\",\"space_url\":\"\",\"animation\":{},\"emots\":null,\"is_audited\":false,\"id_str\":\"4e3ed8ede9409b234b5e1d64c06801ea3119\",\"icon\":null,\"show_reply\":true,\"reply_mid\":0,\"reply_uname\":\"\",\"reply_uname_color\":\"\",\"reply_is_mystery\":false,\"reply_type_enum\":0,\"hit_combo\":0,\"esports_jump_url\":\"\"}", - "user":{ - "uid":438160221, - "base":{ - "name":"weatfe", - "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg", - "name_color":0, - "is_mystery":false, - "risk_ctrl_info":null, - "origin_info":{ - "name":"weatfe", - "face":"https://i0.hdslb.com/bfs/face/member/noface.jpg" - }, - "official_info":{ - "role":0, - "title":"", - "desc":"", - "type":-1 - }, - "name_color_str":"" - }, - "medal":null, - "wealth":null, - "title":{ - "old_title_css_id":"", - "title_css_id":"" - }, - "guard":null, - "uhead_frame":null, - "guard_leader":{ - "is_guard_leader":false - } - } - }, - "dm_v2":null - }, - "message":"", - "msg":"" -} -``` - -</details> diff --git a/docs/live/emoticons.md b/docs/live/emoticons.md deleted file mode 100644 index 75ee998..0000000 --- a/docs/live/emoticons.md +++ /dev/null @@ -1,927 +0,0 @@ -# 直播间表情 - -## 获取直播间的表情包 - -> https://api.live.bilibili.com/xlive/web-ucenter/v2/emoticon/GetEmoticons - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ------ | ---------- | ------ | ---- | -| platform | string | 平台 | 必要 | 已知: `pc``android` `ios` | -| room_id | number | 直播间长号 | 必要 | 只支持 `room_id` 不支持 `short_id` | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ---- | -| code | number | 返回值 | 0: 成功 | -| message | string | 错误消息 | 默认为 0 | -| ttl | number | 1 | | -| data | object | 信息本体 | 见下 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | -------- | ---------- | ---- | -| data | object[] | 表情包数据 | 套了个娃 | -| fans_brand | number | 品牌标识? | | -| purchase_url | null? | 购买链接? | | - -`data.data[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------------- | -------- | --------- | ---- | -| current_cover | string | 封面 URL | | -| emoticons | object[] | 表情列表 | | -| pkg_descript | string | 文字描述 | | -| pkg_id | number | 包 ID | | -| pkg_name | string | 包名称 | | -| pkg_perm | number | 使用权限? | | -| pkg_type | number | 包类型 | | -| recently_used_emoticons | unknown[] | 最近使用的表情 | | -| top_show | object | 顶部展示信息? | | -| top_show_recent | object | 最近使用的顶部展示信息? | | -| unlock_identity | number | 解锁所需身份标识? | | -| unlock_need_gift | number | 解锁所需礼物? | | - -`data.data[].emoticons[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ------ | ---- | ---- | -| bulge_display | number | 突出展示? | | -| descript | string | 描述 | | -| emoji | string | 触发关键词? | | -| emoticon_id | number | 表情 ID | | -| emoticon_unique | string | 表情唯一标识 | | -| emoticon_value_type | number | 表情值类型? | | -| height | number | 表情图片高度 | | -| identity | number | 身份限制标识? | | -| in_player_area | number | 播放器区域内展示? | | -| is_dynamic | number | 是否为动态表情? | | -| perm | number | 使用权限? | | -| unlock_need_gift | number | 解锁需求礼物? | | -| unlock_need_level | number | 解锁需求等级? | | -| unlock_show_color | string | 解锁展示颜色? | | -| unlock_show_image | string | 解锁展示图片? | | -| unlock_show_text | string | 解锁展示文字? | | -| url | string | 表情图片 URL | | -| width | number | 表情图片宽度 | | - -`data.data[].top_show` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------ | ---- | ---- | -| top_left | object | | 左上 | -| top_right | object | | 右上 | - -`data.data[].top_show.top_left` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ----- | ---- | -| image | string | 图片? | | -| text | string | 文字 | | - -`data.data[].top_show.top_right` 对象: - -同 `data.data[].top_show.top_left` 对象 - -`data.data[].top_show_recent` 对象: - -同 `data.data[].top_show` 对象 - -`data.data[].top_show_recent.top_left` 对象: - -同 `data.data[].top_show.top_left` 对象 - -`data.data[].top_show_recent.top_right` 对象: - -同 `data.data[].top_show.top_left` 对象 - -**示例:** - -获取直播间 `14047` 的表情包, 平台为 `android` - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/v2/emoticon/GetEmoticons' \ ---url-query 'room_id=14047' \ ---url-query 'platform=android' \ --b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data": { - "data": [ - { - "current_cover": "http://i0.hdslb.com/bfs/live/39b7667c2601e4da8019472f5e3df1f2278278b6.png", - "emoticons": [ - { - "bulge_display": 0, - "descript": "", - "emoji": "啊", - "emoticon_id": 331, - "emoticon_unique": "official_331", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/cbf2746062242e77bdcb9eb08edbf9b151fe0c2e.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "冲鸭", - "emoticon_id": 332, - "emoticon_unique": "official_332", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/dea7fbbc1c3d3c80f4c7b27263e13460f21874e4.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "upup", - "emoticon_id": 348, - "emoticon_unique": "official_348", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/38d84a4cd2f40069202ee13bbdca5b23d29710fb.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "星星向龙", - "emoticon_id": 343, - "emoticon_unique": "official_343", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/a69423be39b0f2a87dc74f2e44ead70de0eb0d4f.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "欧皇驾到", - "emoticon_id": 335, - "emoticon_unique": "official_335", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/650399e68d0d93df4b3f9e95e7437e83be7fbb1a.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "这个好耶", - "emoticon_id": 345, - "emoticon_unique": "official_345", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/2ce08b31618d3ad0d34877bf949ef0089a0438b7.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "泰裤辣", - "emoticon_id": 339, - "emoticon_unique": "official_339", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/82c38fc930ae764b4c6215f544bf8e1dba73b51c.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "闪避技能", - "emoticon_id": 337, - "emoticon_unique": "official_337", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/fa3febe6c62f3bcd042953141930d96fb8451e60.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "稳住能赢", - "emoticon_id": 342, - "emoticon_unique": "official_342", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/b3495aaa935b045bfc2e1d52738ea7b124e0d552.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "中奖喷雾", - "emoticon_id": 346, - "emoticon_unique": "official_346", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/c3cfa182d16564301d39e4c7e4c186dfb9fabf96.png", - "width": 200 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "赞", - "emoticon_id": 147, - "emoticon_unique": "official_147", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/bbd9045570d0c022a984c637e406cb0e1f208aa9.png", - "width": 150 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "妙啊", - "emoticon_id": 109, - "emoticon_unique": "official_109", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/7b7a2567ad1520f962ee226df777eaf3ca368fbc.png", - "width": 138 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "有点东西", - "emoticon_id": 113, - "emoticon_unique": "official_113", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/39e518474a3673c35245bf6ef8ebfff2c003fdc3.png", - "width": 186 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "很有精神", - "emoticon_id": 150, - "emoticon_unique": "official_150", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/e91cbe30b2db1e624bd964ad1f949661501f42f8.png", - "width": 201 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "泪目", - "emoticon_id": 103, - "emoticon_unique": "official_103", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/aa93b9af7ba03b50df23b64e9afd0d271955cd71.png", - "width": 144 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "赢麻了", - "emoticon_id": 128, - "emoticon_unique": "official_128", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/1d4c71243548a1241f422e90cd8ba2b75c282f6b.png", - "width": 156 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "钝角", - "emoticon_id": 133, - "emoticon_unique": "official_133", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/38cf68c25d9ff5d364468a062fc79571db942ff3.png", - "width": 153 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "干杯", - "emoticon_id": 149, - "emoticon_unique": "official_149", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/8fedede4028a72e71dae31270eedff5f706f7d18.png", - "width": 162 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "2333", - "emoticon_id": 124, - "emoticon_unique": "official_124", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/a98e35996545509188fe4d24bd1a56518ea5af48.png", - "width": 183 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "打call", - "emoticon_id": 146, - "emoticon_unique": "official_146", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/fa1eb4dce3ad198bb8650499830560886ce1116c.png", - "width": 195 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "多谢款待", - "emoticon_id": 148, - "emoticon_unique": "official_148", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/4609dad97c0dfa61f8da0b52ab6fff98e0cf1e58.png", - "width": 207 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "awsl", - "emoticon_id": 102, - "emoticon_unique": "official_102", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/328e93ce9304090f4035e3aa7ef031d015bbc915.png", - "width": 162 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "鸡汤来咯", - "emoticon_id": 137, - "emoticon_unique": "official_137", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/b371151503978177b237afb85185b0f5431d0106.png", - "width": 198 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "雀食", - "emoticon_id": 118, - "emoticon_unique": "official_118", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/7251dc7df587388a3933743bf38394d12a922cd7.png", - "width": 159 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "禁止套娃", - "emoticon_id": 108, - "emoticon_unique": "official_108", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/6a644577437d0bd8a314990dd8ccbec0f3b30c92.png", - "width": 204 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "暗中观察", - "emoticon_id": 104, - "emoticon_unique": "official_104", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/18af5576a4582535a3c828c3ae46a7855d9c6070.png", - "width": 156 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "保熟吗", - "emoticon_id": 105, - "emoticon_unique": "official_105", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/0e28444c8e2faef3169e98e1a41c487144d877d4.png", - "width": 162 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "比心", - "emoticon_id": 106, - "emoticon_unique": "official_106", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/1ba5126b10e5efe3e4e29509d033a37f128beab2.png", - "width": 132 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "咸鱼翻身", - "emoticon_id": 110, - "emoticon_unique": "official_110", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/7db4188c050f55ec59a1629fbc5a53661e4ba780.png", - "width": 180 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "mua", - "emoticon_id": 111, - "emoticon_unique": "official_111", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/08f1aebaa4d9c170aa79cbafe521ef0891bdf2b5.png", - "width": 165 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "来了来了", - "emoticon_id": 115, - "emoticon_unique": "official_115", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/61e790813c51eab55ebe0699df1e9834c90b68ba.png", - "width": 168 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "贴贴", - "emoticon_id": 116, - "emoticon_unique": "official_116", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/88b49dac03bfd5d4cb49672956f78beb2ebd0d0b.png", - "width": 162 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "牛牛牛", - "emoticon_id": 117, - "emoticon_unique": "official_117", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/343f7f7e87fa8a07df63f9cba6b776196d9066f0.png", - "width": 168 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "颠个勺", - "emoticon_id": 119, - "emoticon_unique": "official_119", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/625989e78079e3dc38d75cb9ac392fe8c1aa4a75.png", - "width": 195 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "好家伙", - "emoticon_id": 122, - "emoticon_unique": "official_122", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/c2650bf9bbc79b682a4b67b24df067fdd3e5e9ca.png", - "width": 165 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "下次一定", - "emoticon_id": 125, - "emoticon_unique": "official_125", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/cc2652cef69b22117f1911391567bd2957f27e08.png", - "width": 177 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "不上Ban", - "emoticon_id": 126, - "emoticon_unique": "official_126", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/eff44c1fc03311573e8817ca8010aca72404f65c.png", - "width": 231 - }, - { - "bulge_display": 0, - "descript": "", - "emoji": "上热榜", - "emoticon_id": 134, - "emoticon_unique": "official_134", - "emoticon_value_type": 0, - "height": 60, - "identity": 99, - "in_player_area": 1, - "is_dynamic": 1, - "perm": 1, - "unlock_need_gift": 0, - "unlock_need_level": 0, - "unlock_show_color": "", - "unlock_show_image": "", - "unlock_show_text": "", - "url": "http://i0.hdslb.com/bfs/live/83d5b9cdaaa820c2756c013031d34dac1fd4156b.png", - "width": 168 - } - ], - "pkg_descript": "官方表情(系统)", - "pkg_id": 1, - "pkg_name": "通用表情", - "pkg_perm": 1, - "pkg_type": 1, - "recently_used_emoticons": [], - "top_show": { - "top_left": { - "image": "", - "text": "通用表情" - }, - "top_right": { - "image": "", - "text": "" - } - }, - "top_show_recent": { - "top_left": { - "image": "", - "text": "" - }, - "top_right": { - "image": "", - "text": "" - } - }, - "unlock_identity": 0, - "unlock_need_gift": 0 - } - ], - "fans_brand": 1, - "purchase_url": null - }, - "message": "0", - "ttl": 1 -} -``` -</details> diff --git a/docs/live/follow_up_live.md b/docs/live/follow_up_live.md deleted file mode 100644 index 8c7d0a1..0000000 --- a/docs/live/follow_up_live.md +++ /dev/null @@ -1,317 +0,0 @@ -# 关注UP直播情况 - -## 用户关注的所有UP的直播情况 - -> https://api.live.bilibili.com/xlive/web-ucenter/user/following - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------|-----|------|-----|-------| -| page | num | 页码 | 非必要 | 默认为`1` | -| page_size | num | 每页的数据数量 | 非必要 | 有效值`1`-`10`, 默认为`10` | -| ignoreRecord | num | | | **尚不明确**<br />一般为`1` | -| hit_ab | bool | | | **尚不明确**<br />建议用`true`, 不填为`false` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------| -| code | num | 返回值 | `0`:成功<br />`-101`:错误 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------| -| title | str | 标题 | | -| pageSize | num | 每页的数据数量 | | -| totalPage | num | 分页数量 | | -| list | obj | UP直播情况列表 | | -| count | num | 曾直播过的UP数量 | | -| never_lived_count | num | 未直播过的UP数量 | | -| live_count | num | 正在直播的UP数量 | | -| never_lived_faces | list | | **尚不明确** | - -`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|-----|-----------| -| roomid | num | 房间号 | | -| uid | num | 主播uid | | -| uname | str | 主播名 | | -| title | str | 直播标题 | | -| face | str | 主播头像 | | -| live_status | num | 是否正在直播 | `0`: 未直播<br />`1`: 正在直播 | -| record_num | num | | **尚不明确**<br />一般为0 | -| recent_record_id | str | | **尚不明确**<br />一般为空 | -| is_attention | num | | **尚不明确**<br />一般为1 | -| clipnum | num | | **尚不明确**<br />一般为0 | -| fans_num | num | | **尚不明确**<br />一般为0 | -| area_name | str | | **尚不明确**<br />一般为空 | -| area_value | str | | **尚不明确**<br />一般为空 | -| tags | str | | **尚不明确**<br />一般为空 | -| recent_record_id_v2 | str | | **尚不明确**<br />一般为空 | -| record_num_v2 | num | | **尚不明确**<br />一般为0 | -| record_live_time | num | 主播上一次直播结束的时间戳 | 正在直播时, 值为`0` | -| area_name_v2 | str | 频道的名称 | | -| room_news | str | 房间公告 | | -| switch | bool | | **尚不明确** | -| watch_icon | str | | **尚不明确** | -| text_small | str | | **尚不明确**<br />当主播正在直播时, 为在线人数(可能) | -| room_cover | str | 房间封面图片的URL | | -| parent_area_id | num | 父分区id | | -| area_id | num | 分区id | | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/user/following' \ - -b 'SESSDATA=xxx' \ - --data-urlencode 'page=1' \ - --data-urlencode 'page_size=2' \ - --data-urlencode 'ignoreRecord=1' \ - --data-urlencode 'hit_ab=true' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "title": "哔哩哔哩直播 - 我的关注", - "pageSize": 2, - "totalPage": 26, - "list": [ - { - "roomid": 544853, - "uid": 686127, - "uname": "籽岷", - "title": "尝试双机位", - "face": "https://i0.hdslb.com/bfs/face/7efb679569b2faeff38fa08f6f992fa1ada5e948.webp", - "live_status": 0, - "record_num": 0, - "recent_record_id": "", - "is_attention": 1, - "clipnum": 0, - "fans_num": 0, - "area_name": "", - "area_value": "", - "tags": "", - "recent_record_id_v2": "", - "record_num_v2": 0, - "record_live_time": 1720011626, - "area_name_v2": "新游推荐", - "room_news": "", - "switch": true, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "text_small": "10.9万", - "room_cover": "http://i0.hdslb.com/bfs/live/new_room_cover/6c89c41d7695a080d31ae21c128f7759a7f419e5.jpg", - "parent_area_id": 6, - "area_id": 889 - }, - { - "roomid": 21686237, - "uid": 456664753, - "uname": "央视新闻", - "title": "央视新闻的直播间", - "face": "https://i1.hdslb.com/bfs/face/38a8db1c187b64a1412fafffbf350f8a3f436371.jpg", - "live_status": 0, - "record_num": 0, - "recent_record_id": "", - "is_attention": 1, - "clipnum": 0, - "fans_num": 0, - "area_name": "", - "area_value": "", - "tags": "", - "recent_record_id_v2": "", - "record_num_v2": 0, - "record_live_time": 1720001717, - "area_name_v2": "社科法律心理", - "room_news": "", - "switch": false, - "watch_icon": "https://i0.hdslb.com/bfs/live/0b265af1af0a77abc47aa3b8f1a5c0769d8bd23b.png", - "text_small": "0", - "room_cover": "http://i0.hdslb.com/bfs/live/d650d0e6e49397ea71d630be0a0e686679df16d8.jpg", - "parent_area_id": 11, - "area_id": 376 - } - ], - "count": 52, - "never_lived_count": 30, - "live_count": 0, - "never_lived_faces": [] - } -} - -``` - -</details> - -## 用户关注的所有UP且正在直播的列表(PC端) - -> https://api.live.bilibili.com/xlive/web-ucenter/v1/xfetter/GetWebList - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----|------|----------------------------------|-----|------------------| -| hit_ab | bool | 会影响到json回复中部分字段的值,具体的影响效果会在下表列出。 | 非必要 | 默认为true,不填为false | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------| -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| msg | str | 错误信息 | 默认为空 | -| message | str | 错误信息 | 默认为空 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|------|--------------|--------------------------------------------------------------------| -| rooms | list | 正在直播的房间列表 | 受到url参数hit_ab的影响:<br />true时能够获取到全部正在开播的直播间列表,<br />false时只会获取到前10个。 | -| list | list | 正在直播的房间列表 | 疑似与rooms字段的内容相同,并且同样受到url参数hit_ab的影响,受影响的效果同rooms字段。 | -| count | num | 关注列表中正在直播的人数 | 受到url参数hit_ab的影响:hit_ab为true时为0 | -| not_living_num | num | 关注列表中未开播的人数 | 受到url参数hit_ab的影响:hit_ab为false时为0 | - -`rooms`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|------|--------------|---------------------------------------------------------------| -| title | num | 直播间标题 | | -| room_id | num | 直播间真实id | | -| uid | num | 目标用户mid | | -| online | num | 观看人数 | 受url参数hit_ab的影响,hit_ab为true时为0 | -| live_time | num | 已经直播的时长(单位为秒) | 受url参数hit_ab的影响,hit_ab为true时为0 | -| live_status | num | 开播状态 | 0:未开播<br />1:直播中<br />2:轮播中 | -| short_id | num | 直播间短id | 受url参数hit_ab的影响,hit_ab为true时为0 | -| area | num | 分区id | 受url参数hit_ab的影响,hit_ab为true时为0 | -| area_name | str | 分区名称 | | -| area_v2_id | num | 二级分区id | | -| area_v2_name | str | 二级分区名 | | -| area_v2_parent_name | str | 二级父分区名 | | -| area_v2_parent_id | num | 二级父分区id | | -| uname | str | 用户名 | | -| face | str | 用户头像图片链接 | | -| tag_name | str | 标签名 | | -| tags | str | 标签列表 | | -| cover_from_user | str | 直播间封面图片链接 | 受url参数hit_ab的影响,hit_ab为true时为0 | -| keyframe | str | 关键帧图片链接 | 用于网页端悬浮展示。受url参数hit_ab的影响,hit_ab为true时为0 | -| lock_till | str | 未知 | 时间日期格式为:yyyy-MM-dd hh-mm-ss。<br />受url参数hit_ab的影响,hit_ab为true时为空字符串 | -| hidden_till | str | 未知 | 时间日期格式为:yyyy-MM-dd hh-mm-ss。<br />受url参数hit_ab的影响,hit_ab为true时为空字符串 | -| broadcast_type | num | 广播类型 | | -| is_encrypt | bool | 直播间是否加密 | | -| link | str | 直播间链接 | 受url参数hit_ab的影响,hit_ab为true时为空字符串 | -| nickname | str | 用户昵称 | 受url参数hit_ab的影响,hit_ab为true时为空字符串 | -| roomname | str | 直播间名称 | 受url参数hit_ab的影响,hit_ab为true时为空字符串 | -| roomid | num | 直播间真实id | 受url参数hit_ab的影响,hit_ab为true时为0 | -| liveTime | num | 开播时间 | 受url参数hit_ab的影响,hit_ab为true时为0 | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/v1/xfetter/GetWebList' \ ---header 'Cookie: SESSDATA=xxx' \ ---data-urlencode 'hit_ab=false' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "rooms": [ - { - "title": "虚拟区优质跨年直播展演", - "room_id": 21496316, - "uid": 441666939, - "online": 2308, - "live_time": 17313, - "live_status": 1, - "short_id": 36, - "area": 6, - "area_name": "生活娱乐", - "area_v2_id": 744, - "area_v2_name": "虚拟Singer", - "area_v2_parent_name": "虚拟主播", - "area_v2_parent_id": 9, - "uname": "虚拟区官方频道", - "face": "https://i0.hdslb.com/bfs/face/a26b52bc7837ce6867802575d300ed70d5e6f2d5.jpg", - "tag_name": "", - "tags": "", - "cover_from_user": "https://i0.hdslb.com/bfs/live/new_room_cover/5d7a4526062cf1dc4e88e016638a856c1ac7db03.jpg", - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe12311645000021496316pkuk08.jpg", - "lock_till": "0000-00-00 00:00:00", - "hidden_till": "0000-00-00 00:00:00", - "broadcast_type": 0, - "is_encrypt": false, - "link": "https://live.bilibili.com/21496316?broadcast_type=0", - "nickname": "虚拟区官方频道", - "roomname": "虚拟区优质跨年直播展演", - "roomid": 21496316, - "liveTime": 1735617438 - } - ], - "list": [ - { - "title": "虚拟区优质跨年直播展演", - "room_id": 21496316, - "uid": 441666939, - "online": 2308, - "live_time": 17313, - "live_status": 1, - "short_id": 36, - "area": 6, - "area_name": "生活娱乐", - "area_v2_id": 744, - "area_v2_name": "虚拟Singer", - "area_v2_parent_name": "虚拟主播", - "area_v2_parent_id": 9, - "uname": "虚拟区官方频道", - "face": "https://i0.hdslb.com/bfs/face/a26b52bc7837ce6867802575d300ed70d5e6f2d5.jpg", - "tag_name": "", - "tags": "", - "cover_from_user": "https://i0.hdslb.com/bfs/live/new_room_cover/5d7a4526062cf1dc4e88e016638a856c1ac7db03.jpg", - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe12311645000021496316pkuk08.jpg", - "lock_till": "0000-00-00 00:00:00", - "hidden_till": "0000-00-00 00:00:00", - "broadcast_type": 0, - "is_encrypt": false, - "link": "https://live.bilibili.com/21496316?broadcast_type=0", - "nickname": "虚拟区官方频道", - "roomname": "虚拟区优质跨年直播展演", - "roomid": 21496316, - "liveTime": 1735617438 - } - ], - "count": 1, - "not_living_num": 0 - } -} -``` - -</details> \ No newline at end of file diff --git a/docs/live/gift.md b/docs/live/gift.md deleted file mode 100644 index daa99a1..0000000 --- a/docs/live/gift.md +++ /dev/null @@ -1,191 +0,0 @@ -## 获取直播间内礼物 - -> https://api.live.bilibili.com/xlive/web-room/v1/giftPanel/roomGiftList - -*请求方式:GET* - -认证方式:无 (无需添加Cookie) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------- | ---- | ---------- | ------ | -------------------------------- | -| platform | str | web | 必要 | | -| room_id | num | 主播房间号 | 必要 | | -| area_parent_id | num | 直播分区 | 非必要 | 不填写可能会获取不到部分活动礼物 | -| area_id | num | 直播子分区 | 非必要 | 不填写可能会获取不到部分活动礼物 | - -**json回复:** - - - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data.gift_config.base_config.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ------------------- | --------------------------- | -| id | num | 礼物id | | -| name | str | 礼物名字 | | -| price | num | 该值/1000的单位为元 | | -| type | num | | | -| coin_type | str | 一般为gold,即电池 | | -| effect | num | 特效类型? | 观察到可能出现的值为0,2,3 | -| stay_time | num | 礼物展示的时间? | 均为3 | -| animation_frame_num | num | 礼物动画帧数 | | -| desc | str | 礼物描述 | | -| img_basic | str | 礼物图片 | | -| gif | str | 礼物gif动画 | | - -**示例:** - -查询`room_id=23375552`的直播间礼物信息 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/giftPanel/roomGiftList?platform=pc&room_id=23174842' -``` - -## 获取盲盒概率 - -> https://api.live.bilibili.com/xlive/general-interface/v1/blindFirstWin/getInfo - -*请求方式:GET* - -认证方式:无 (无需添加Cookie) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---- | ---------------- | ---- | -| gift_id | num | | 盲盒对应的礼物id | | - -**json回复:** - - - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | -------- | ---- | -| note_text | str | 描述 | | -| blind_price | num | 盲盒价格 | | -| blind_gift_name | str | 盲盒名字 | | -| gifts | array | 盲盒价格 | | - -`gifts数组`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------- | ---- | -| gift_id | num | 爆出的礼物id | | -| price | num | 爆出的礼物价格 | | -| gift_name | str | 礼物名字 | | -| gift_img | str | 礼物图片 | | -| chance | str | 概率 | | - -**示例:** - -查询`心动盲盒`的概率 - -```shell -curl 'https://api.live.bilibili.com/xlive/general-interface/v1/blindFirstWin/getInfo?gift_id=32251' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "note_text": "每日1次机会,首次投喂盲盒时享首抽福利!", - "blind_price": 15000, - "gifts": [ - { - "gift_id": 32125, - "price": 2000, - "gift_name": "电影票", - "gift_img": "https://s1.hdslb.com/bfs/live/20864a10beaea541c7dce264d5bbc56676d63e4f.png", - "is_win_gift": 0, - "chance": "6%" - }, - { - "gift_id": 32126, - "price": 9000, - "gift_name": "棉花糖", - "gift_img": "https://s1.hdslb.com/bfs/live/b555682af41551c28f8ad19dc5c4ed87943c84f4.png", - "is_win_gift": 0, - "chance": "44.5%" - }, - { - "gift_id": 32128, - "price": 16000, - "gift_name": "爱心抱枕", - "gift_img": "https://s1.hdslb.com/bfs/live/824714c830966d7bec381e35ef808b1f478e21ee.png", - "is_win_gift": 1, - "chance": "45.56%" - }, - { - "gift_id": 32281, - "price": 40000, - "gift_name": "绮彩权杖", - "gift_img": "https://s1.hdslb.com/bfs/live/5cecbf274a4205ef76ed3f11c6540f0c6743363c.png", - "is_win_gift": 1, - "chance": "3.7%" - }, - { - "gift_id": 32282, - "price": 100000, - "gift_name": "时空之站", - "gift_img": "https://s1.hdslb.com/bfs/live/9ee53aedda3c891fdf23d35c14b3bdc4e0504a97.png", - "is_win_gift": 1, - "chance": "0.12%" - }, - { - "gift_id": 34894, - "price": 200000, - "gift_name": "蛇形护符", - "gift_img": "https://s1.hdslb.com/bfs/live/2127dd998083a8981ef4e31a4e6787ce5a4d0f9f.png", - "is_win_gift": 1, - "chance": "0.08%" - }, - { - "gift_id": 32132, - "price": 2233000, - "gift_name": "浪漫城堡", - "gift_img": "https://s1.hdslb.com/bfs/live/216fac597b3c5619d56ed332bcf5f880ea657e8e.png", - "is_win_gift": 1, - "chance": "0.04%" - } - ], - "friday_yq_id": 106472, - "is_first": true, - "ab_res": 1, - "uid": 451537183, - "conf_id": 51, - "pre_imgs": [ - { - "gift_id": 32132, - "preview_url": "http://i0.hdslb.com/bfs/live/e40708d0c8ef9505027ac33ad2a17a23e8e01139.mp4" - } - ], - "blind_gift_name": "心动盲盒" - } -} -``` -</details> \ No newline at end of file diff --git a/docs/live/guard.md b/docs/live/guard.md deleted file mode 100644 index 2938907..0000000 --- a/docs/live/guard.md +++ /dev/null @@ -1,592 +0,0 @@ -## 查询大航海成员 -> https://api.live.bilibili.com/xlive/app-room/v2/guardTab/topListNew - -*请求方式: GET* - -认证方式:无(无需Cookie) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | --------------------------------------- | -| roomid | num | 直播间号 | 必要 | | -| page | num | 页数 | 必要 | | -| ruid | num | 主播id | 必要 | | -| page_size | num | 页大小 | 非必要 | 默认20,最大30,若超过则作为10处理 | -| typ | num | 排序方式 | 非必要 | typ=3,4,5分别为按周/月/总航海亲密度排序 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------------- | --------------------------------------- | -| info | obj | 主播mid | | -| top3 | array | 整个列表的top3 | -| list | array | 大航海成员 | page=1时,list[0]得到的会是榜单的第四名 | - -`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | ----- | -| ruid | num | 主播UID | | -| rank | num | 榜单排名 | | -| accompany | num | 陪伴天数 | | -| uinfo | obj | 用户信息 | | -| score | num | 亲密度 | 恒为0 | - -`list`对象的`uinfo`: -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | -------------------------------------------------------- | -| uid | num | 用户UID | | -| base | obj | 用户基本信息 | | -| medal | obj | 粉丝牌 | 与[此处](/bilibili-API-collect/docs/user/medals)基本一致 | - -`list`对象的`uinfo`的`base`: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ------ | -------- | ---- | -| name | string | 用户名 | | -| face | string | 用戶头像 | | - - -**示例:** - -查询`23174842`直播间的大航海成员 - - -```shell -curl ' https://api.live.bilibili.com/xlive/app-room/v2/guardTab/topListNew?ruid=504140200&roomid=23174842&page=1' -``` - - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "info": { - "num": 23, - "page": 10, - "now": 1, - "achievement_level": 1, - "anchor_guard_achieve_level": 0, - "achievement_icon_src": "", - "buy_guard_icon_src": "https://i0.hdslb.com/bfs/live/4a481b491767f9d91165a4631252de4503d63a17.png", - "rule_doc_src": "", - "ex_background_src": "https://i0.hdslb.com/bfs/live/d0e938839a9dee733e8a7f9f6a3a132108ae22bc.png", - "color_start": "", - "color_end": "", - "tab_color": [ - "#4DDDDBD5", - "#26CFCBC0" - ], - "title_color": [ - "#FFC9CCD0", - "#FF9499A0" - ] - }, - "list": [ - { - "ruid": 504140200, - "rank": 4, - "accompany": 36, - "uinfo": { - "uid": 432911315, - "base": { - "name": "幻想乡的年华", - "face": "https://i2.hdslb.com/bfs/face/5ddde7a8466aa2d60d082ccfc08a0267445b193b.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "幻想乡的年华", - "face": "https://i2.hdslb.com/bfs/face/5ddde7a8466aa2d60d082ccfc08a0267445b193b.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "软饭兔", - "level": 25, - "color_start": 398668, - "color_end": 6850801, - "color_border": 16771156, - "color": 398668, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 2, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": null, - "guard": { - "level": 2, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "score": 0 - }, - { - "ruid": 504140200, - "rank": 5, - "accompany": 513, - "uinfo": { - "uid": 7816639, - "base": { - "name": "在这样的时光", - "face": "https://i1.hdslb.com/bfs/face/3b0091dda76e095351907e9c708b9571716aa3e1.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "在这样的时光", - "face": "https://i1.hdslb.com/bfs/face/3b0091dda76e095351907e9c708b9571716aa3e1.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "软饭兔", - "level": 30, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 6809855, - "color": 2951253, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 3, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "wealth": null, - "title": null, - "guard": { - "level": 3, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "score": 0 - } - ], - "top3": [ - { - "ruid": 504140200, - "rank": 1, - "accompany": 306, - "uinfo": { - "uid": 85743027, - "base": { - "name": "-小fa---", - "face": "https://i0.hdslb.com/bfs/face/82b2d0fef27b7b69be0d121b3ef0491504bbaae8.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "-小fa---", - "face": "https://i0.hdslb.com/bfs/face/82b2d0fef27b7b69be0d121b3ef0491504bbaae8.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "软饭兔", - "level": 30, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 16771156, - "color": 2951253, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 2, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "wealth": null, - "title": null, - "guard": { - "level": 2, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "score": 0 - }, - { - "ruid": 504140200, - "rank": 2, - "accompany": 1005, - "uinfo": { - "uid": 28601039, - "base": { - "name": "捏软软的上帝", - "face": "https://i2.hdslb.com/bfs/face/1f2a9b20294452d5c6ce9f40c66b186ef57b92e5.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "捏软软的上帝", - "face": "https://i2.hdslb.com/bfs/face/1f2a9b20294452d5c6ce9f40c66b186ef57b92e5.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "软饭兔", - "level": 29, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 16771156, - "color": 2951253, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 2, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "wealth": null, - "title": null, - "guard": { - "level": 2, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "score": 0 - }, - { - "ruid": 504140200, - "rank": 3, - "accompany": 95, - "uinfo": { - "uid": 3546834244995088, - "base": { - "name": "老实逸流-恩师软软riu", - "face": "https://i1.hdslb.com/bfs/face/0b1f95d926acfb06c8d7d9c66d2e1fabf3e1a3c4.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": { - "name": "老实逸流-恩师软软riu", - "face": "https://i1.hdslb.com/bfs/face/0b1f95d926acfb06c8d7d9c66d2e1fabf3e1a3c4.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "软饭兔", - "level": 28, - "color_start": 398668, - "color_end": 6850801, - "color_border": 16771156, - "color": 398668, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 2, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": null, - "title": null, - "guard": { - "level": 2, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "score": 0 - } - ], - "my_follow_info": { - "accompany_days": 0, - "auto_renew": 0, - "renew_remind": { - "content": "", - "type": 0, - "hint": "" - }, - "rank": 0, - "ruid": 0, - "uinfo": null, - "expired_time": "" - }, - "guard_warn": { - "is_warn": 0, - "warn": "", - "expired": 0, - "will_expired": 0, - "address": "" - }, - "exist_benefit": false, - "remind_benefit": "立即上船", - "ab": { - "guard_accompany_list": 1 - }, - "remind_msg": "头号粉丝大航海,上船后可上榜", - "typ": 0, - "extop": null, - "guard_leader": null, - "main_text": "", - "sub_text": "", - "btn_type": 1, - "prompt_text": "头号粉丝大航海,等你来上船" - } -} -``` - -</details> - - -## 查询粉丝团成员 - - -> https://api.live.bilibili.com/xlive/general-interface/v1/rank/getFansMembersRank - -*请求方式: GET* - -认证方式:无(无需Cookie) - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------------- | ------------------- | ----------------------------------------------------------------------------------------------- | -| page | num | 页数 | 必要 | | -| ruid | num | 主播id | 必要 | | -| page_size | num | 每页返回的数量 | 必要 | 最大30,若超过则作为10处理 | -| rank_type | num | 排序方式 | 非必要 | 1:按照粉丝牌还亮着的粉丝团成员的亲密度排序<br> 2:按照**所有**没上过舰的粉丝团成员的亲密度排序 | -| ts | num | 13位时间戳 | 当rank_type=2时必要 | 该值>=1000即可 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | -------------- | ---- | -| item | array | 内容 | | -| num | num | 粉丝团成员数量 | -| medal_status | num | | - -`list`对象 - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ---------------------------------------------------------------- | ---- | -| user_rank | num | 排名 | -| uid | num | 用户UID | -| name | str | 用户名 | -| face | str | 用户头像 | -| score | num | 亲密度 | -| medal_name | str | 粉丝牌名字 | -| level | num | 粉丝牌等级 | -| target_id | num | 主播UID | -| guard_level | num | 大航海类型,1,2,3分别为总督,提督,舰长 | -| medal_color_start | num | 粉丝牌渐变起始色 | -| medal_color_end | num | 粉丝牌渐变结束色 | -| medal_color_border | num | 粉丝牌边框颜色 | -| guard_icon | str | 大航海图标URL | -| uinfo_medal | obj | 粉丝牌,与[此处](/bilibili-API-collect/docs/user/medals)基本一致 | - - -**示例:** - -查询用户`504140200`的粉丝团成员 - -```shell -curl 'https://api.live.bilibili.com/xlive/general-interface/v1/rank/getFansMembersRank?ruid=504140200&page_size=10&page=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "item": [ - { - "user_rank": 1, - "uid": 85743027, - "name": "小软兔のfa", - "face": "https://i0.hdslb.com/bfs/face/bdbcabf8d927844ae4f8f9c65862077e29afb989.jpg", - "score": 50990540, - "medal_name": "软饭兔", - "level": 30, - "target_id": 504140200, - "special": "", - "guard_level": 3, - "medal_color_start": 2951253, - "medal_color_end": 10329087, - "medal_color_border": 6809855, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "uinfo_medal": { - "name": "软饭兔", - "level": 30, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 6809855, - "color": 0, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 3, - "score": 50990540, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "tag": null, - "is_pokeable": false - }, - { - "user_rank": 2, - "uid": 7816639, - "name": "在这样的时光", - "face": "https://i1.hdslb.com/bfs/face/3b0091dda76e095351907e9c708b9571716aa3e1.jpg", - "score": 50704568, - "medal_name": "软饭兔", - "level": 30, - "target_id": 504140200, - "special": "", - "guard_level": 3, - "medal_color_start": 2951253, - "medal_color_end": 10329087, - "medal_color_border": 6809855, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "uinfo_medal": { - "name": "软饭兔", - "level": 30, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 6809855, - "color": 0, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 504140200, - "guard_level": 3, - "score": 50704568, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "tag": null, - "is_pokeable": false - } - ], - "num": 89, - "medal_status": 1 - } -} -``` - -</details> diff --git a/docs/live/info.md b/docs/live/info.md deleted file mode 100644 index 0ad09b8..0000000 --- a/docs/live/info.md +++ /dev/null @@ -1,1269 +0,0 @@ -# 直播间基本信息 - -## 获取直播间信息 - -> https://api.live.bilibili.com/room/v1/Room/get_info - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------|-----|------|-----|-------| -| room_id | num | 直播间号 | 必要 | 可以为短号 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------| -| code | num | 返回值 | 0:成功<br />1:不存在 | -| message | str | 错误信息 | | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------------|-----------|--------|-----------------------------| -| uid | num | 主播mid | | -| room_id | num | 直播间长号 | | -| short_id | num | 直播间短号 | 为0是无短号 | -| attention | num | 关注数量 | | -| online | num | 观看人数 | | -| is_portrait | bool | 是否竖屏 | | -| description | str | 描述 | | -| live_status | num | 直播状态 | 0:未开播<br />1:直播中<br />2:轮播中 | -| area_id | num | 分区id | | -| parent_area_id | num | 父分区id | | -| parent_area_name | str | 父分区名称 | | -| old_area_id | num | 旧版分区id | | -| background | str | 背景图片链接 | | -| title | str | 标题 | | -| user_cover | str | 封面 | | -| keyframe | str | 关键帧 | 用于网页端悬浮展示 | -| is_strict_room | bool | 未知 | 未知 | -| live_time | str | 直播开始时间 | YYYY-MM-DD HH:mm:ss | -| tags | str | 标签 | ','分隔 | -| is_anchor | num | 未知 | 未知 | -| room_silent_type | str | 禁言状态 | | -| room_silent_level | num | 禁言等级 | | -| room_silent_second | num | 禁言时间 | 单位是秒 | -| area_name | str | 分区名称 | | -| pardants | str | 未知 | 未知 | -| area_pardants | str | 未知 | 未知 | -| hot_words | list(str) | 热词 | | -| hot_words_status | num | 热词状态 | | -| verify | str | 未知 | 未知 | -| new_pendants | obj | 头像框\大v | | -| up_session | str | 未知 | | -| pk_status | num | pk状态 | | -| pk_id | num | pk id | | -| battle_id | num | 未知 | | -| allow_change_area_time | num | | | -| allow_upload_cover_time | num | | | -| studio_info | obj | | | - -`new_pendants`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|-----|-------------------| -| frame | obj | 头像框 | | -| mobile_frame | obj | 同上 | 手机版, 结构一致, 可能null | -| badge | obj | 大v | | -| mobile_badge | obj | 同上 | 手机版, 结构一致, 可能null | - -`frame`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|------|--------|-----| -| name | str | 名称 | | -| value | str | 值 | | -| position | num | 位置 | | -| desc | str | 描述 | | -| area | num | 分区 | | -| area_old | num | 旧分区 | | -| bg_color | str | 背景色 | | -| bg_pic | str | 背景图 | | -| use_old_area | bool | 是否旧分区号 | | - -`badge`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|-----|-------------------------------------------| -| name | str | 类型 | v_person: 个人认证(黄) <br /> v_company: 企业认证(蓝) | -| position | num | 位置 | | -| value | str | 值 | | -| desc | str | 描述 | | - -`studio_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-------|-----|-----| -| status | num | | | -| master_list | array | | | - -**示例:** - -查询直播间`room_id=1`信息 - -```shell -curl -G 'https://api.live.bilibili.com/room/v1/Room/get_info' \ ---data-urlencode 'room_id=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "data": { - "uid": 9617619, - "room_id": 5440, - "short_id": 1, - "attention": 11919499, - "online": 0, - "is_portrait": false, - "description": "欢迎加入bilibili《快乐运动研究社》,和B站UP主们一起探讨有关运动的经历感受,解决身体和情绪的“疑难杂症”,寻找适合自己的运动,一起跟练!本期我们一起探讨:运动健身能缓解社交恐惧吗?", - "live_status": 2, - "area_id": 145, - "parent_area_id": 1, - "parent_area_name": "娱乐", - "old_area_id": 6, - "background": "", - "title": "快乐运动研究社", - "user_cover": "https://i0.hdslb.com/bfs/live/new_room_cover/96943b8d106a777a34cf796421bb4254163b30e1.jpg", - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe08121926000000005440np0q7a.jpg", - "is_strict_room": false, - "live_time": "0000-00-00 00:00:00", - "tags": "", - "is_anchor": 0, - "room_silent_type": "", - "room_silent_level": 1, - "room_silent_second": 0, - "area_name": "视频聊天", - "pendants": "", - "area_pendants": "", - "hot_words": [ - "2333333", - "喂,妖妖零吗", - "红红火火恍恍惚惚", - "FFFFFFFFFF", - "Yooooooo", - "啪啪啪啪啪", - "666666666", - "老司机带带我", - "你为什么这么熟练啊", - "gg", - "prprpr", - "向大佬低头", - "请大家注意弹幕礼仪哦!", - "还有这种操作!", - "囍", - "打call", - "你气不气?", - "队友呢?" - ], - "hot_words_status": 0, - "verify": "", - "new_pendants": { - "frame": { - "name": "", - "value": "", - "position": 0, - "desc": "", - "area": 0, - "area_old": 0, - "bg_color": "", - "bg_pic": "", - "use_old_area": false - }, - "badge": { - "name": "v_company", - "position": 3, - "value": "", - "desc": "哔哩哔哩直播官方账号" - }, - "mobile_frame": { - "name": "", - "value": "", - "position": 0, - "desc": "", - "area": 0, - "area_old": 0, - "bg_color": "", - "bg_pic": "", - "use_old_area": false - }, - "mobile_badge": null - }, - "up_session": "", - "pk_status": 0, - "pk_id": 0, - "battle_id": 0, - "allow_change_area_time": 0, - "allow_upload_cover_time": 0, - "studio_info": { - "status": 0, - "master_list": [] - } - } -} -``` - -</details> - -## 获取用户对应的直播间状态 - -> https://api.live.bilibili.com/room/v1/Room/getRoomInfoOld - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----|-----|---------|-----|-----| -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|---------------------| -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------|-----|-----------|------------------| -| roomStatus | num | 直播间状态 | 0:无房间<br />1:有房间 | -| roundStatus | num | 轮播状态 | 0:未轮播<br />1:轮播 | -| live_status | num | 直播状态 | 0:未开播<br />1:直播中 | -| url | str | 直播间网页url | | -| title | str | 直播间标题 | | -| cover | str | 直播间封面url | | -| online | num | 直播间人气 | 值为上次直播时刷新 | -| roomid | num | 直播间id(短号) | | -| broadcast_type | num | 0 | | -| online_hidden | num | 0 | | - -**示例:** - -查询用户`mid=322892`的直播间信息 - -```shell -curl -G 'https://api.live.bilibili.com/room/v1/Room/getRoomInfoOld' \ ---data-urlencode 'mid=322892' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "roomStatus": 1, - "roundStatus": 0, - "live_status": 1, - "url": "https://live.bilibili.com/5441", - "title": "好久没当黑铁主播了", - "cover": "http://i0.hdslb.com/bfs/live/room_cover/833f7ff506bac17c06010e8834922993657505b2.jpg", - "online": 268602, - "roomid": 5441, - "broadcast_type": 0, - "online_hidden": 0 - } -} -``` - -</details> - -## 获取房间页初始化信息 - -> https://api.live.bilibili.com/room/v1/Room/room_init - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----|-----|------------|-----|-----| -| id | num | 目标直播间号(短号) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------| -| code | num | 返回值 | 0:成功<br />60004:直播间不存在 | -| msg | str | 错误信息 | 默认为ok | -| message | str | 错误信息 | 默认为ok | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|------|--------------|------------------------------------| -| room_id | num | 直播间真实id | | -| short_id | num | 直播间id(短号) | | -| uid | num | 主播用户mid | | -| need_p2p | num | 是否p2p | | -| is_hidden | bool | 是否隐藏 | | -| is_locked | bool | 是否锁定 | | -| is_portrait | bool | 是否竖屏 | | -| live_status | num | 直播状态 | 0:未开播<br />1:直播中<br />2:轮播中 | -| hidden_till | num | 隐藏时间戳 | | -| lock_till | num | 锁定时间戳 | | -| encrypted | bool | 是否加密 | | -| pwd_verified | bool | 加密房间是否通过密码验证 | `encrypted`=true时才有意义 | -| live_time | num | 开播时间 | 未开播时为`-62170012800` | -| room_shield | num | 未知 | | -| is_sp | num | 是否为特殊直播间 | 0:普通直播间<br />1:付费直播间 | -| special_type | num | 特殊直播间标志 | 0:普通直播间<br />1:付费直播间<br />2:拜年祭直播间 | - -**示例:** - -查询直播间`id=76`的直播间信息 - -```shell -curl -G 'https://api.live.bilibili.com/room/v1/Room/room_init' \ ---data-urlencode 'id=76' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "data": { - "room_id": 14073662, - "short_id": 76, - "uid": 50333369, - "need_p2p": 0, - "is_hidden": false, - "is_locked": false, - "is_portrait": false, - "live_status": 1, - "hidden_till": 0, - "lock_till": 0, - "encrypted": false, - "pwd_verified": false, - "live_time": 1602151186, - "room_shield": 1, - "is_sp": 0, - "special_type": 0 - } -} -``` - -</details> - -## 获取主播信息 - -> https://api.live.bilibili.com/live_user/v1/Master/info - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----|-----|---------|-----|-----| -| uid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------| -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| msg | str | 错误信息 | 默认为空 | -| message | str | 错误信息 | 默认为空 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------|-----|-----------|------------| -| info | obj | 主播信息 | | -| exp | obj | 经验等级 | | -| follower_num | num | 主播粉丝数 | | -| room_id | num | 直播间id(短号) | | -| medal_name | str | 粉丝勋章名 | | -| glory_count | num | 主播荣誉数 | | -| pendant | str | 直播间头像框url | | -| link_group_num | num | 0 | **作用尚不明确** | -| room_news | obj | 主播公告 | | - -`info`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|---------|-------------------------| -| uid | num | 主播mid | | -| uname | str | 主播用户名 | | -| face | str | 主播头像url | | -| official_verify | obj | 认证信息 | | -| gender | num | 主播性别 | -1:保密<br />0:女<br />1:男 | - -`info`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|------------------------------| -| type | num | 主播认证类型 | -1:无<br />0:个人认证<br />1:机构认证 | -| desc | str | 主播认证信息 | | - -`exp`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|------|-----| -| master_level | obj | 主播等级 | | - -`exp`中的`master_level`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-------|--------|-----| -| level | num | 当前等级 | | -| color | num | 等级框颜色 | | -| current | array | 当前等级信息 | | -| next | array | 下一等级信息 | | - -`master_level`中的`current`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|------|-----| -| 0 | num | 升级积分 | | -| 1 | num | 总积分 | | - -`master_level`中的`next`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|------|-----| -| 0 | num | 升级积分 | | -| 1 | num | 总积分 | | - -`room_news`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-----|------|-----| -| content | str | 公告内容 | | -| ctime | str | 公告时间 | | -| ctime_text | str | 公告日期 | | - -**示例:** - -查询直播间`mid=2`的主播信息 - -```shell -curl -G 'https://api.live.bilibili.com/live_user/v1/Master/info' \ ---data-urlencode 'uid=2' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "info": { - "uid": 2, - "uname": "碧诗", - "face": "https://i0.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "official_verify": { - "type": 0, - "desc": "bilibili个人认证:bilibili创始人(站长)" - }, - "gender": 1 - }, - "exp": { - "master_level": { - "level": 30, - "color": 10512625, - "current": [ - 2870000, - 11883810 - ], - "next": [ - 3730000, - 15613810 - ] - } - }, - "follower_num": 926624, - "room_id": 1024, - "medal_name": "逸国", - "glory_count": 0, - "pendant": "", - "link_group_num": 0, - "room_news": { - "content": "", - "ctime": "", - "ctime_text": "" - } - } -} -``` - -</details> - -## 获取直播间基本信息 - -> https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomBaseInfo - -*请求方式: GET* - -注: 亦可用于批量获取 - -<!--{ - "gh": [745] -}--> - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | --- | - | - | -| req_biz | str | `web_room_componet` | 必要 | | -| room_ids | num | 直播间短ID | 不必要 | 多个重复该参数即可 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| by_uids | obj | 空 | | -| by_room_ids | obj | 直播间信息 | | - -`data`中的`by_room_ids`对象: - -以直播间长ID为键, 直播间信息为值的, 按键名降序排序 - -`by_room_ids`中的值对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| room_id | num | 直播间长ID | | -| uid | num | 主播用户mid | | -| area_id | num | 直播间分区ID | | -| live_status | num | 直播状态 | 0: 未开播<br />1: 直播中<br />2: 轮播中 | -| live_url | str | 直播间网页url | | -| parent_area_id | num | 直播间父分区ID | | -| title | str | 直播间标题 | | -| parent_area_name | str | 直播间父分区名称 | | -| area_name | str | 直播间分区名称 | | -| live_time | str | 开播时间 | `yyyy-MM-dd HH:mm:ss` | -| description | str | 直播间简介 | | -| tags | str | 直播间标签 | 以 `,` 分隔 | -| attention | num | 关注数 | | -| online | num | 在线人数 | | -| short_id | num | 直播间短ID | 为0是无短号 | -| uname | str | 主播用户名 | | -| cover | str | 直播间封面url | | -| background | str | 直播间背景url | | -| join_slide | num | 1 | | -| live_id | num | 0 | | -| live_id_str | str | "0" | | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomBaseInfo' \ ---url-query 'req_biz=web_room_componet' \ ---url-query 'room_ids=1' \ ---url-query 'room_ids=3 -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "by_uids": {}, - "by_room_ids": { - "23058": { - "room_id": 23058, - "uid": 11153765, - "area_id": 190, - "live_status": 0, - "live_url": "https://live.bilibili.com/23058", - "parent_area_id": 5, - "title": "哔哩哔哩音悦台", - "parent_area_name": "电台", - "area_name": "唱见电台", - "live_time": "0000-00-00 00:00:00", - "description": "<p>这里是哔哩哔哩官方音乐台喔!</p><p>一起来听音乐吧ε=ε=(ノ≧∇≦)ノ</p><p>没想到蒸汽配圣诞下装,意外的很暴露呢=3=</p>\n", - "tags": "", - "attention": 225431, - "online": 0, - "short_id": 3, - "uname": "3号直播间", - "cover": "", - "background": "https://i0.hdslb.com/bfs/live/2836bb7b84c792e2c6aadfd4d1cce13484775fa3.jpg", - "join_slide": 1, - "live_id": 0, - "live_id_str": "0" - }, - "5440": { - "room_id": 5440, - "uid": 9617619, - "area_id": 701, - "live_status": 2, - "live_url": "https://live.bilibili.com/5440", - "parent_area_id": 11, - "title": "华为nova Flip新生之夜", - "parent_area_name": "知识", - "area_name": "科技·科学", - "live_time": "0000-00-00 00:00:00", - "description": "<p>华为novaFlip新生之夜正在直播中!备案号:Z0910417240818001<br></p>", - "tags": "", - "attention": 17848313, - "online": 0, - "short_id": 1, - "uname": "哔哩哔哩直播", - "cover": "http://i0.hdslb.com/bfs/live/1a862058e4211a5e73a8a1bf0635953ea08a4091.jpg", - "background": "http://i0.hdslb.com/bfs/live/ec518ede15d4c2547c83cb59f14752450c0889b0.jpg", - "join_slide": 1, - "live_id": 0, - "live_id_str": "0" - } - } - } -} -``` - -</details> - -## 批量查询直播间状态 - -> https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids - -*请求方式:GET/POST* - -认证方式:无 (无需添加Cookie) - -**url参数 (GET方式):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-------|------------|-----|-----| -| uids[] | array | 要查询的主播 mid | 必要 | | - -**正文参数 (POST方式):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|------|------------|-----|-----| -| uids | nums | 要查询的主播 mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-------------------------| -| code | num | 返回值 | 0:成功<br />-111:csrf校验失败 | -| message | str | 错误信息 | 默认为success | -| msg | str | 错误信息 | 默认为success | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----|-----|-------|------------| -| uid | str | 直播间信息 | 实际字段为主播mid | - -`uid`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------------|-----|-----------|------------------------------| -| title | str | 直播间标题 | | -| room_id | num | 直播间房间号 | 直播间实际房间号 | -| uid | num | 主播mid | | -| online | num | 直播间在线人数 | | -| live_time | num | 开播时间戳,单位秒,未开播时为0 | | -| live_status | num | 直播间开播状态 | 0:未开播<br />1:正在直播<br />2:轮播中 | -| short_id | num | 直播间房间号 | 直播间短房间号,常见于签约主播 | -| area | num | 直播间分区id | | -| area_name | str | 直播间分区名 | | -| area_v2_id | num | 直播间新版分区id | | -| area_v2_name | str | 直播间新版分区名 | | -| area_v2_parent_id | num | 直播间父分区id | | -| area_v2_parent_name | str | 直播间父分区名 | | -| uname | str | 主播用户名 | | -| face | str | 主播头像url | | -| tag_name | str | 直播间标签 | | -| tags | str | 直播间自定标签 | | -| cover_from_user | str | 直播间封面url | | -| keyframe | str | 直播间关键帧url | | -| lock_till | str | 直播间封禁信息 | | -| hidden_till | str | 直播间隐藏信息 | | -| broadcast_type | num | 直播类型 | 0:普通直播<br />1:手机直播 | - -**示例:** - -查询用户`mid=672328094`的直播间信息 - -```shell -# GET方式 -curl -G 'https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids' ---data-urlencode 'uids[]=672328094' - -# POST方式 -curl 'https://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids' \ --H "Content-Type: application/json" \ --d "{\"uids\": [672328094]}" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "672328094": { - "title": "【B限】玩个毛线", - "room_id": 22637261, - "uid": 672328094, - "online": 4087370, - "live_time": 0, - "live_status": 2, - "short_id": 0, - "area": 6, - "area_name": "生活娱乐", - "area_v2_id": 371, - "area_v2_name": "虚拟主播", - "area_v2_parent_name": "虚拟主播", - "area_v2_parent_id": 9, - "uname": "嘉然今天吃什么", - "face": "http://i2.hdslb.com/bfs/face/d399d6f5cf7943a996ae96999ba3e6ae2a2988de.jpg", - "tag_name": "日常,学习,萌宠,厨艺,手机直播", - "tags": "", - "cover_from_user": "http://i0.hdslb.com/bfs/live/new_room_cover/f3ed7a782c13086e536ec8bc6e9593bb4918f905.jpg", - "keyframe": "http://i0.hdslb.com/bfs/live-key-frame/keyframe041722000000226372619dr3m8.jpg", - "lock_till": "0000-00-00 00:00:00", - "hidden_till": "0000-00-00 00:00:00", - "broadcast_type": 0 - } - } -} -``` - -</details> - - -## 清晰度代码 - -| 代码 | 说明 | -|-------|-----| -| 30000 | 杜比 | -| 20000 | 4K | -| 10000 | 原画 | -| 400 | 蓝光 | -| 250 | 超清 | -| 150 | 高清 | -| 80 | 流畅 | - -## 获取直播间信息 - -> https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo - -*请求方式:GET* - -认证方式:无 (无需添加Cookie) - -**url参数 (GET方式):** - -| 参数名 | 类型 | 内容 | 必填 | 备注 | -|----------|-----|-------|-----|------------------------------------------------| -| room_id | num | 直播间id | 必要 | | -| protocol | str | 直播协议 | 必要 | 0:http_stream<br/>1:http_hls<br/>可多选, 使用英文逗号分隔 | -| format | str | 格式 | 必要 | 0:flv<br/>1:ts<br/>2:fmp4<br/>可多选, 使用英文逗号分隔 | -| codec | str | 编码格式 | 必要 | 0:AVC<br/>1:HEVC<br/>可多选, 使用英文逗号分隔 | -| qn | num | 清晰度编码 | | 默认`150`<br/>[清晰度代码](#清晰度代码) | -| platform | str | `web` | | | -| ptype | num | `8` | | | -| dolby | num | `5` | | | -| panorama | num | `1` | | | -| only_audio | num | 是否为音频流 | 非必要 | 默认为视频流,`1` 为音频流 | - -**json回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------------| -| code | num | 响应码 | 0:成功<br/>1002002:参数错误 | -| message | str | 0 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段名 | 类型 | 内容 | 备注 | -|-------------------|-------|-----------|---------------------------| -| room_id | num | 直播间id | | -| short_id | num | 直播间短id | | -| uid | num | 主播uid | | -| is_hidden | bool | 直播间是否被隐藏 | | -| is_locked | bool | 直播间是否被锁定 | | -| is_portrait | bool | 是否竖屏 | | -| live_status | num | 直播状态 | 0:未开播<br/>1:直播中<br/>2:轮播中 | -| hidden_till | num | 隐藏结束时间 | | -| lock_till | num | 封禁结束时间 | 秒级时间戳 | -| encrypted | bool | 直播间为加密直播间 | | -| pwd_verified | bool | 是否通过密码验证 | 当`encrypted`为`true`时才有意义 | -| live_time | num | 本次开播时间 | 秒级时间戳 | -| room_shield | num | | | -| all_special_types | array | | | -| playurl_info | obj | 直播流信息 | | - -`playurl_info`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|-----|-----| -| conf_json | str | | | -| playurl | obj | | | - -`playurl`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-------|-------|-----| -| cid | num | 直播间id | | -| g_qn_desc | array | 清晰度列表 | | -| stream | array | 直播流信息 | | -| p2p_data | obj | | | -| dolby_qn | | | | - -`g_qn_desc`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|-------|-----------------| -| qn | num | 清晰度代码 | [清晰度代码](#清晰度代码) | -| desc | str | 清晰度描述 | | -| hdr_desc | str | | | -| attr_desc | | | | - -`stream`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|-------|------|-----| -| protocol_name | str | 协议名 | | -| format | array | 格式列表 | | - -`format`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------------|-------|------|-----| -| format_name | str | 格式名 | | -| codec | array | 编码列表 | | - -`codec`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------------|-------|-----------|-----------------| -| codec_name | str | 编码名 | | -| current_qn | num | 当前清晰度编码 | [清晰度代码](#清晰度代码) | -| accept_qn | array | 可用清晰度编码列表 | [清晰度代码](#清晰度代码) | -| base_url | str | 播放源路径 | | -| url_info | array | 域名信息列表 | | -| hdr_qn | null | | | -| dolby_type | num | | | -| attr_name | str | | | - -`url_info`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------------|-----|-------|-----| -| host | str | 域名 | | -| extra | str | URL参数 | | -| stream_ttl | num | | | - -`p2p_data`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|------|-----|-----| -| p2p | bool | | | -| p2p_type | num | | | -| m_p2p | bool | | | -| m_servers | null | | | - -**示例:** - -查询`room_id=3`的直播间信息 - -```shell -curl -L -X GET 'https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=3&protocol=0,1&format=0,1,2&codec=0,1&qn=10000' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "room_id": 23058, - "short_id": 3, - "uid": 11153765, - "is_hidden": false, - "is_locked": false, - "is_portrait": false, - "live_status": 1, - "hidden_till": 0, - "lock_till": 0, - "encrypted": false, - "pwd_verified": true, - "live_time": 1671425336, - "room_shield": 1, - "all_special_types": [], - "playurl_info": { - "conf_json": "{\"cdn_rate\":10000,\"report_interval_sec\":150}", - "playurl": { - "cid": 23058, - "g_qn_desc": [ - { - "qn": 30000, - "desc": "杜比", - "hdr_desc": "", - "attr_desc": null - }, - { - "qn": 20000, - "desc": "4K", - "hdr_desc": "", - "attr_desc": null - }, - { - "qn": 10000, - "desc": "原画", - "hdr_desc": "", - "attr_desc": null - }, - { - "qn": 400, - "desc": "蓝光", - "hdr_desc": "HDR", - "attr_desc": null - }, - { - "qn": 250, - "desc": "超清", - "hdr_desc": "HDR", - "attr_desc": null - }, - { - "qn": 150, - "desc": "高清", - "hdr_desc": "", - "attr_desc": null - }, - { - "qn": 80, - "desc": "流畅", - "hdr_desc": "", - "attr_desc": null - } - ], - "stream": [ - { - "protocol_name": "http_stream", - "format": [ - { - "format_name": "flv", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000, - 150 - ], - "base_url": "/live-bvc/462997/live_11153765_9369560.flv?", - "url_info": [ - { - "host": "https://cn-hbcd-cu-02-20.bilivideo.com", - "extra": "expires=1674103815&pt=web&deadline=1674103815&len=0&oi=1963941079&platform=web&qn=10000&trid=1000061f434c07ac4f4184820bfb141e75e8&uipk=100&uipv=100&nbs=1&uparams=cdn,deadline,len,oi,platform,qn,trid,uipk,uipv,nbs&cdn=cn-gotcha01&upsig=f494aa9e92e24943061fe5082494ec44&sk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1", - "stream_ttl": 3600 - } - ], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "" - } - ] - } - ] - }, - { - "protocol_name": "http_hls", - "format": [ - { - "format_name": "ts", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000, - 150 - ], - "base_url": "/live-bvc/462997/live_11153765_9369560.m3u8?", - "url_info": [ - { - "host": "https://cn-hbcd-cu-02-20.bilivideo.com", - "extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1003061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=4f9bcec18e3afdca04b31ffb285ec915&sk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1", - "stream_ttl": 3600 - } - ], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "" - } - ] - }, - { - "format_name": "fmp4", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000, - 150 - ], - "base_url": "/live-bvc/462997/live_11153765_9369560/index.m3u8?", - "url_info": [ - { - "host": "https://cn-hbcd-cu-02-20.bilivideo.com", - "extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1007061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha01&sign=cc57dce528316d8389f2f34e7bd15f5c&sk=a99391b8b4d5779b2e32e41dbc989d2d&flvsk=33541455720f64c7671bc1480acfb176&p2p_type=1&src=57345&sl=1&free_type=0&sid=cn-hbcd-cu-02-20&chash=1&sche=ban&bvchls=1&score=12&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=1", - "stream_ttl": 3600 - }, - { - "host": "https://c1--cn-gotcha208.bilivideo.com", - "extra": "expires=1674103815&len=0&oi=1963941079&pt=web&qn=10000&trid=1007061f434c07ac4f4184820bfb141e75e8&sigparams=cdn,expires,len,oi,pt,qn,trid&cdn=cn-gotcha208&sign=2ff96adf5056c8dbee546955260fc2df&sk=a99391b8b4d5779b2e32e41dbc989d2d&p2p_type=1&src=57345&sl=1&free_type=0&pp=rtmp&machinezone=jd&source=onetier&trace=0&site=92e80b6f3ebfd393e7d1c1e2e648d9c1&order=2", - "stream_ttl": 3600 - } - ], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "" - } - ] - } - ] - } - ], - "p2p_data": { - "p2p": true, - "p2p_type": 1, - "m_p2p": false, - "m_servers": null - }, - "dolby_qn": null - } - } - } -} -``` - -</details> - - - - - -## 获取直播间主播信息 - -> https://api.live.bilibili.com/live_user/v1/UserInfo/get_anchor_in_room - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------|-----|------|-----|-------| -| roomid | num | 直播间号 | 必要 | 可以为短号 | - - -**json回复:** - - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------| -| code | num | 返回值 | 0:成功 (直播间不存在也为0) | -| message | str | 错误信息 | | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - - - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------------|-----------|--------|-----------------------------| -| info | obj | 主播信息 | | -| level | obj | 直播等级 | | -| san | num | 主播san值 | 12满分 | - - -`info`对象: - - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|------|------------------|----------| -| uid | num | 主播mid | | -| uname | str | 主播用户名 | | -| face | str | 主播头像URL | | -| rank | str | 主播排名 | | -| platform_user_level | num | 平台用户等级 | | -| mobile_verify | num | 手机验证状态 | | -| identification | num | 身份认证状态 | | -| official_verify | obj | 认证信息 | | -| vip_type | num | VIP类型 | | -| gender | num | 主播性别 | -1:保密<br />0:女<br />1:男 | - - -`info`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|------|----------|-----| -| type | num | 主播认证类型 | -1:无<br />0:个人认证<br />1:机构认证 | -| desc | str | 主播认证信息 | | -| role | num | 未知 | | - -`level`对象: - - - -| 字段 | 类型 | 内容 | 备注 | -|--------------|------|------------------|----------| -| uid | num | 用户ID | | -| cost | num | 消费金额 | | -| rcost | num | 充值金额 | | -| user_score | str | 用户积分 | | -| vip | num | VIP状态 | | -| vip_time | str | VIP到期时间 | | -| svip | num | SVIP状态 | | -| svip_time | str | SVIP到期时间 | | -| update_time | str | 更新时间 | | -| master_level | obj | 主播等级 | | -| user_level | num | 用户等级 | | -| color | num | 颜色值 | | -| anchor_score | num | 主播积分 | | - - - -`level` 中的 `master_level`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|------|------------------|----------| -| level | num | 主播等级 | | -| color | num | 颜色值 | | -| current | list | 当前积分 | | -| next | list | 下一等级积分 | | -| anchor_score | num | 主播积分 | | -| upgrade_score | num | 升级积分 | | -| master_level_color | num | 主播等级颜色值 | | -| sort | str | 排名 | | - - -**示例:** - -查询`roomid=1`的直播间主播信息 - -```shell -curl -G 'https://api.live.bilibili.com/live_user/v1/UserInfo/get_anchor_in_room' \ ---data-urlencode 'roomid=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "info": { - "uid": 9617619, - "uname": "哔哩哔哩直播", - "face": "https://i0.hdslb.com/bfs/face/8f6a614a48a3813d90da7a11894ae56a59396fcd.jpg", - "rank": "10000", - "platform_user_level": 6, - "mobile_verify": 1, - "identification": 1, - "official_verify": { - "type": 1, - "desc": "哔哩哔哩直播官方账号", - "role": 3 - }, - "vip_type": 2, - "gender": -1 - }, - "level": { - "uid": 9617619, - "cost": 7782673656, - "rcost": 20199200291, - "user_score": "0", - "vip": 0, - "vip_time": "0000-00-00 00:00:00", - "svip": 0, - "svip_time": "0000-00-00 00:00:00", - "update_time": "2024-08-08 17:13:12", - "master_level": { - "level": 40, - "color": 16746162, - "current": [0, 147013810], - "next": [0, 147013810], - "anchor_score": 201992002, - "upgrade_score": 0, - "master_level_color": 16746162, - "sort": "\u003E10000" - }, - "user_level": 60, - "color": 16752445, - "anchor_score": 201992002 - }, - "san": 12 - } -} -``` - -</details> diff --git a/docs/live/live_area.md b/docs/live/live_area.md deleted file mode 100644 index 4f86ef9..0000000 --- a/docs/live/live_area.md +++ /dev/null @@ -1,210 +0,0 @@ -# 直播间分区 - -## 获取全部直播间分区列表 - -> https://api.live.bilibili.com/room/v1/Area/getList - -*请求方式:GET* - -直播分区共有两级,分别是父分区和子分区 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | ---------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | array | 父分区列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 父分区1 | | -| n | obj | 父分区(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| id | num | 父分区id | | -| name | name | 父分区名 | | -| list | list | 子分区列表 | | - -`data`数组中的对象中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 子分区1 | | -| n | obj | 子分区(n+1) | | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------------- | ---------------- | -| id | str | 子分区id | | -| parent_id | str | 父分区id | | -| old_area_id | str | 旧分区id | | -| name | str | 子分区名 | | -| act_id | str | 0 | **作用尚不明确** | -| pk_status | str | ??? | **作用尚不明确** | -| hot_status | num | 是否为热门分区 | 0:否<br />1:是 | -| lock_status | str | 0 | **作用尚不明确** | -| pic | str | 子分区标志图片url | | -| parent_name | str | 父分区名 | | -| area_type | num | | | - -**示例:** - -如想在`网游`父分区下的`英雄联盟`分区开播,则查到子分区id为`86` - -```shell -curl 'https://api.live.bilibili.com/room/v1/Area/getList' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": [ - { - "id": 2, - "name": "网游", - "list": [ - { - "id": "86", - "parent_id": "2", - "old_area_id": "4", - "name": "英雄联盟", - "act_id": "0", - "pk_status": "0", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/dcfb14f14ec83e503147a262e7607858b05d7ac0.png", - "parent_name": "网游", - "area_type": 0 - }, - { - "id": "252", - "parent_id": "2", - "old_area_id": "3", - "name": "逃离塔科夫", - "act_id": "0", - "pk_status": "0", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/762a7de3dd5fe8165d1d55b232484a017941592f.png", - "parent_name": "网游", - "area_type": 0 - }, - { - "id": "80", - "parent_id": "2", - "old_area_id": "1", - "name": "绝地求生", - "act_id": "0", - "pk_status": "0", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/43ca83fdcd10505eaeef1b76cf8ce642a53b94da.png", - "parent_name": "网游", - "area_type": 0 - }, - ………… - ] - }, - { - "id": 3, - "name": "手游", - "list": [ - { - "id": "35", - "parent_id": "3", - "old_area_id": "12", - "name": "王者荣耀", - "act_id": "0", - "pk_status": "0", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/0fefa924760b2dd492a12dddafe179bfa1216918.png", - "parent_name": "手游", - "area_type": 0 - }, - ………… - ] - }, - { - "id": 6, - "name": "单机", - "list": [ - { - "id": "236", - "parent_id": "6", - "old_area_id": "1", - "name": "主机游戏", - "act_id": "0", - "pk_status": "0", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/edb636ee59f902e3134a2790545045bddd70978e.png", - "parent_name": "单机", - "area_type": 0 - }, - ………… - ] - }, - { - "id": 1, - "name": "娱乐", - "list": [ - { - "id": "21", - "parent_id": "1", - "old_area_id": "10", - "name": "视频唱见", - "act_id": "0", - "pk_status": "1", - "hot_status": 1, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/72b93ddafdf63c9f0b626ad546847a3c03c92b6f.png", - "cate_id": "12", - "parent_name": "娱乐", - "area_type": 0 - }, - ………… - ] - }, - { - "id": 5, - "name": "电台", - "list": [ - { - "id": "190", - "parent_id": "5", - "old_area_id": "10", - "name": "唱见电台", - "act_id": "0", - "pk_status": "0", - "hot_status": 0, - "lock_status": "0", - "pic": "http://i0.hdslb.com/bfs/vc/d22d7fafbf9b24e2bc3ce1df5eb9f006e6035e5d.png", - "parent_name": "电台", - "area_type": 0 - }, - ………… - ] - } - ] -} -``` - -</details> diff --git a/docs/live/live_bill.md b/docs/live/live_bill.md deleted file mode 100644 index 16c07fd..0000000 --- a/docs/live/live_bill.md +++ /dev/null @@ -1,328 +0,0 @@ -# 直播流水 - -## 获取所有礼物列表 - -> https://api.live.bilibili.com/gift/v1/master/getGiftTypes - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | -------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为 success | -| message | str | 错误信息 | 默认为 success | -| data | array | 礼物列表 | | - -`data` 数组: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | ------------------------------------------------------------------------------ | -| gift_id | num | 礼物 id | | -| gift_name | str | 礼物名称 | | -| price | num | 瓜子数量 | 电池礼物为金瓜子数量,银瓜子礼物为银瓜子数量。 (金瓜子数量 / 100 = 电池数量) | - -*注:特殊礼物如舰长、提督、总督等没有 `price` 字段* - -<details> -<summary>查看响应示例:</summary> - -```jsonc - { - "code": 0, - "msg": "success", - "message": "success", - "data": [ - { - "gift_id": 10001, - "gift_name": "总督" - }, - { - "gift_id": 10002, - "gift_name": "提督" - }, - { - "gift_id": 10003, - "gift_name": "舰长" - }, - { - "gift_id": 12000, - "gift_name": "醒目留言" - }, - { - "gift_id": 1, - "price": 100, - "gift_name": "辣条" - }, - { - "gift_id": 3, - "price": 9900, - "gift_name": "B坷垃" - }, - { - "gift_id": 6, - "price": 1000, - "gift_name": "亿圆" - }, - { - "gift_id": 30426, - "price": 0, - "gift_name": "BLS能量石" - }, - { - "gift_id": 30706, - "price": 1000, - "gift_name": "生日快乐" - }, - { - "gift_id": 30707, - "price": 5200, - "gift_name": "生日蛋糕" - }, - { - "gift_id": 30708, - "price": 52000, - "gift_name": "生日王冠" - }, - { - "gift_id": 31049, - "price": 6600, - "gift_name": "干杯" - }, - { - "gift_id": 31116, - "price": 6600, - "gift_name": "干杯" - }, - { - "gift_id": 31251, - "price": 6600, - "gift_name": "干杯" - }, - { - "gift_id": 31531, - "price": 0, - "gift_name": "PK票" - }, - { - "gift_id": 31588, - "price": 19900, - "gift_name": "星河入梦" - }, - { - "gift_id": 31589, - "price": 131400, - "gift_name": "我星永恒" - }, - { - "gift_id": 32276, - "price": 0, - "gift_name": "粉丝团灯牌" - }, - // ... - ] - } -``` - -</details> - -## 获取流水 - -> https://api.live.bilibili.com/xlive/revenue/v1/giftStream/getReceivedGiftStreamNextList - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -请求参数: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ------------- | ----------------------- | ---------- | -------------------------------------- | -| limit | num | 一页有多少条目 | 必要 | | -| coin_type | num | 礼物类型 | 必要 | 0 为所有,1 为电池礼物,2 为银瓜子礼物 | -| begin_time | date / string | 流水的日期 | 必要 | 格式为 yyyy-MM-dd | -| uname | string | 筛选的用户名 | 非必要 | | -| last_id | num | 上一页页末的礼物列表 id | 翻页时必要 | 见下方 `list` 数组说明 | -| gift_id | num | 筛选的礼物 id | | | - -请求示例:`https://api.live.bilibili.com/xlive/revenue/v1/giftStream/getReceivedGiftStreamNextList?limit=20&coin_type=0&begin_time=2023-01-01` - -请求示例(翻页时):`https://api.live.bilibili.com/xlive/revenue/v1/giftStream/getReceivedGiftStreamNextList?last_id=13834493&limit=20&coin_type=0&begin_time=2023-01-01` - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | -------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为 success | -| message | str | 错误信息 | 默认为 success | -| data | object | 流水 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | -------------- | -------------- | -| has_more | num | 是否由下一页 | 1 为是,0 为否 | -| total_hamster | num | 总的金仓鼠收益 | | -| list | array | 礼物列表 | | - -`list` 数组: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---------- | ------------------------------------- | -------------------------- | -| uid | num | 送礼用户的 uid | | -| uname | str | 用户名 | | -| time | date / str | 送礼时间 | | -| gift_id | num | 礼物 id | | -| gift_name | str | 礼物名字 | | -| gift_img | str | 礼物图片链接 | | -| gift_num | num | 礼物数量 | | -| hamster | num | 金仓鼠数量 | | -| gold | num | 礼物价值(金瓜子) | | -| silver | num | 礼物价值(银瓜子) | | -| ios_hamster | num | 由 iOS 端送出的礼物所收到的金仓鼠 | | -| normal_hamster | num | 一般情况下收到的金仓鼠 | | -| ios_gold | num | 由 iOS 端送出的礼物所收到的金瓜子数量 | | -| normal_gold | num | 一般情况下收到的金瓜子数量 | | -| is_hybrid | bool | 是否混合 | 作用不明 | -| id | num | 此项 id | 用于翻页 | -| is_open_platfrom | num | 是否开放平台 | 作用不明 | -| open_platfrom_rate | num | 开放平台比率 (?) | 作用不明 | -| receive_title | str | | 作用不明 ,一般为 `"主播"` | -| room_id | num | 送礼房间id | 如果礼物为上舰,此项为 `0` | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "uid": 0000000000, - "uname": "XXXXXXX", - "time": "2023-01-01 00:00:00", - "gift_id": 31216, - "gift_name": "i了i了", - "gift_img": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png", - "gift_num": 1, - "hamster": 50, - "gold": 100, - "silver": 0, - "ios_hamster": 0, - "normal_hamster": 50, - "ios_gold": 0, - "normal_gold": 100, - "is_hybrid": false, - "id": 14269551, - "is_open_platfrom": 0, - "open_platfrom_rate": 0, - "receive_title": "主播", - "room_id": 000001 - }, - { - "uid": 0000000000, - "uname": "XXXXXXX", - "time": "2023-01-01 00:00:00", - "gift_id": 10003, - "gift_name": "舰长", - "gift_img": "https://i0.hdslb.com/bfs/live/f1be2a2d5b227ce72641de1ad64bcc7f9e4111c3.png", - "gift_num": 1, - "hamster": 69000, - "gold": 138000, - "silver": 0, - "ios_hamster": 0, - "normal_hamster": 69000, - "ios_gold": 0, - "normal_gold": 138000, - "is_hybrid": false, - "id": 14258453, - "is_open_platfrom": 0, - "open_platfrom_rate": 0, - "receive_title": "主播", - "room_id": 000000 - }, - { - "uid": 0000000000, - "uname": "XXXXXXX", - "time": "2023-01-01 00:00:00", - "gift_id": 31036, - "gift_name": "小花花", - "gift_img": "https://s1.hdslb.com/bfs/live/8b40d0470890e7d573995383af8a8ae074d485d9.png", - "gift_num": 1, - "hamster": 50, - "gold": 100, - "silver": 0, - "ios_hamster": 0, - "normal_hamster": 50, - "ios_gold": 0, - "normal_gold": 100, - "is_hybrid": false, - "id": 14243903, - "is_open_platfrom": 0, - "open_platfrom_rate": 0, - "receive_title": "主播", - "room_id": 000001 - }, - { - "uid": 0000000000, - "uname": "XXXXXXX", - "time": "2023-01-01 00:00:00", - "gift_id": 30047, - "gift_name": "友谊的小船", - "gift_img": "https://s1.hdslb.com/bfs/live/b33c94c51b669bd88f811ecf5f4e34a1db22a648.png", - "gift_num": 1, - "hamster": 2450, - "gold": 4900, - "silver": 0, - "ios_hamster": 0, - "normal_hamster": 2450, - "ios_gold": 0, - "normal_gold": 4900, - "is_hybrid": false, - "id": 14242683, - "is_open_platfrom": 0, - "open_platfrom_rate": 0, - "receive_title": "主播", - "room_id": 000001 - }, - { - "uid": 0000000000, - "uname": "XXXXXXX", - "time": "2023-01-01 00:00:00", - "gift_id": 31738, - "gift_name": "粉丝团灯牌", - "gift_img": "https://s1.hdslb.com/bfs/live/cbed3bb0a894369b49ceaf0b5337b4491b75ac42.png", - "gift_num": 1, - "hamster": 0, - "gold": 1000, - "silver": 1000, - "ios_hamster": 0, - "normal_hamster": 0, - "ios_gold": 0, - "normal_gold": 0, - "is_hybrid": false, - "id": 14237376, - "is_open_platfrom": 0, - "open_platfrom_rate": 0, - "receive_title": "主播", - "room_id": 000001 - } - ], - "has_more": 1, - "total_hamster": 122050 - } -} -``` - -</details> diff --git a/docs/live/live_data.md b/docs/live/live_data.md deleted file mode 100644 index 5cec881..0000000 --- a/docs/live/live_data.md +++ /dev/null @@ -1,183 +0,0 @@ -# 直播数据 - -## 获取直播场次的直播数据 - -> https://api.live.bilibili.com/xlive/app-blink/v1/live/StopLiveData - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -只能获取自己的直播数据。最好在直播结束时立即请求,否则直播时长可能不准确。 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | 若不提供将会获得无效数据 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功<br />-101:未登录 | -| message | str | 提示信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| LiveTime | num | 该直播场次的直播时长 | 单位:秒,直播结束后还会增长 | -| AddFans | num | 该直播场次的新增粉丝 | | -| HamsterRmb | num | 该直播场次的收益 | | -| NewFansClub | num | 该直播场次新获得粉丝勋章数量 | | -| DanmuNum | num | 该直播场次的弹幕条数 | | -| MaxOnline | num | 该直播场次的最大在线? | [需要验证] | -| WatchedCount | num | 该直播场次的看过人数 | | - -**示例:** - -获取自己的直播数据 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/live/StopLiveData?live_key=634808443264569139' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "LiveTime": 77603, - "AddFans": 0, - "HamsterRmb": 0, - "NewFansClub": 0, - "DanmuNum": 3, - "MaxOnline": 13, - "WatchedCount": 2 - } -} -``` - -</details> - -## 获取直播表现 - -> https://api.live.bilibili.com/xlive/app-blink/v1/date/Overview - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功<br />-101:未登录 | -| message | str | 提示信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| graph | arr | 图表数据 | 在界面显示为雷达图 | -| propose | null | (?) | | - -`data.graph` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 数据类别 | | -| … | obj | 数据类别 | | - -`data.graph` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| name | str | 显示的名称 | | -| index | str | 类别标识 | | -| me | num | 自己在这个类别的数值 | | -| max | num | 这个类别最外侧那条线的数值 | | -| aver | num | 同水平主播在这个类别的数值 | | - -**示例:** - -获取自己的直播表现 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/date/Overview' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "graph": [ - { - "name": "收益", - "index": "income", - "me": 0, - "max": 9.27, - "aver": 8.04 - }, - { - "name": "累计观看", - "index": "watchedCount", - "me": 5.13, - "max": 7.01, - "aver": 6.17 - }, - { - "name": "新增粉丝", - "index": "fans", - "me": 0, - "max": 2.58, - "aver": 0 - }, - { - "name": "用户平均观看时长", - "index": "watchTime", - "me": 9.31, - "max": 11.82, - "aver": 10.88 - }, - { - "name": "开播时长", - "index": "broadcast", - "me": 17.57, - "max": 17.42, - "aver": 16.6 - }, - { - "name": "弹幕数量", - "index": "barrage", - "me": 7.37, - "max": 8.02, - "aver": 6.91 - } - ], - "propose": null - } -} -``` - -</details> diff --git a/docs/live/live_replay.md b/docs/live/live_replay.md deleted file mode 100644 index e158cbc..0000000 --- a/docs/live/live_replay.md +++ /dev/null @@ -1,2147 +0,0 @@ -# 直播回放 - -<!-- 网页端: https://link.bilibili.com/#/my-room/live-record ;移动端: https://live.bilibili.com/p/html/live-app-playback/index.html#new --> - -注: 直播回放相关接口较新,随时可能出现变化。 - -## 获取直播回放列表 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetReplayList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -只能获取自己14天的回放,详细信息请查看[对应页面](https://link.bilibili.com/#/my-room/live-record) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认30项,最大30项 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功<br />-101:未登录 | -| message | str | 提示信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| replay_info | arr | 回放信息列表 | 无结果时为`null` | -| pagination | obj | 分页信息 | | -| archive_flag | bool | (?) | 作用尚不明确 | -| can\_edit | num | (?) | 作用尚不明确 | -| can_upload | bool | (?) | 作用尚不明确 | -| has_third_platform_live| bool | (?) | 作用尚不明确 | - -`data.replay_info` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| replay_id | num | 直播回放id | | -| live_info | obj | 直播信息 | | -| video_info | obj | 回放视频信息 | | -| alarm_info | obj | 警报信息 | | -| room_id | num | 直播间id | | -| live_key | str | 标记直播场次的key | | -| start_time | num | 直播开始秒时间戳 | 调用[开始直播](manage.md#开始直播)接口的时间 | -| end_time | num | 直播结束秒时间戳 | 调用[关闭直播](manage.md#关闭直播)接口的时间 | - -`data.replay_info[i].live_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| title | str | 直播标题 | 直播结束时的标题 | -| cover | str | 直播封面 | | -| live_time | num | 直播时间 | 同`data.replay_info[i].start_time` | -| live_type | num | 直播类型? | 作用尚不明确 | -| platform | str | 直播平台 | | - -`data.replay_info[i].video_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| replay_status | num | 回放状态 | 作用尚不明确 | -| estimated_time | str | 直播回放合成结束时间 | 未合成时为`"1970-01-01 08:00:00"` | -| duration | num | 直播时长 | 单位秒 | -| download_url | str | 下载链接片段 | 整场直播回放合成成功时存在<br />建议通过[请求整场直播回放下载链接](#请求整场直播回放下载链接)来获取下载链接 | -| alert_code | num | 快速检查警告代码 | 整场直播回放合成失败时不存在 | -| alert_message | str | 快速检查警告信息 | 整场直播回放合成失败时不存在 | - -`data.replay_info[i].alarm_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 回放合成警报代码 | | -| message | str | 回放合成错误信息 | | -| cur_time | num | 当前时间戳 | Unix秒时间戳 | -| is_ban_publish | bool | 是否禁止发布? | | - -`data.pagination` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| page | num | 请求的页码 | | -| page_size | num | 内容数量 | | -| total | num | 总计内容数量 | | - -**示例:** - -获取自己直播回放列表的第1页,每页2项 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetReplayList?page=1&page_size=2' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "replay_info": [ - { - "replay_id": 13517082, - "live_info": { - "title": "随缘摸鱼", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "live_time": 1756479520, - "live_type": 1, - "platform": "android_link" - }, - "video_info": { - "replay_status": -8, - "estimated_time": "1970-01-01 08:00:00", - "duration": 9350, - "alert_code": 2, - "alert_message": "录像时长远小于开播时长,请关注直播时网络状况" - }, - "alarm_info": { - "code": -8, - "message": "直播内容存在违规片段", - "cur_time": 1756496581, - "is_ban_publish": false - }, - "room_id": 1899237171, - "live_key": "637117671085969203", - "start_time": 1756479520, - "end_time": 1756488870 - }, - { - "replay_id": 13487274, - "live_info": { - "title": "随缘摸鱼", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "live_time": 1756385910, - "live_type": 1, - "platform": "android_link" - }, - "video_info": { - "replay_status": 2, - "estimated_time": "1970-01-01 08:00:00", - "duration": 14985, - "alert_code": 2, - "alert_message": "录像时长远小于开播时长,请关注直播时网络状况" - }, - "alarm_info": { - "code": 2, - "message": "录像生成失败,请稍后再试", - "cur_time": 1756496581, - "is_ban_publish": false - }, - "room_id": 1899237171, - "live_key": "636823272552664883", - "start_time": 1756385910, - "end_time": 1756400895 - } - ], - "pagination": { - "page": 1, - "page_size": 2, - "total": 16 - }, - "archive_flag": false, - "can_edit": 1, - "can_upload": false, - "has_third_platform_live": false - } -} -``` - -</details> - -## 获取某位主播的回放列表 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetOtherSliceList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -需要获得那位主播的授权才能获取数据。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_uid | num | 目标主播的uid | 必要 | | -| time_range | num | 回放列表的时间范围 | 非必要 | 默认获取近14天<br />1:近3天<br />2:近7天<br />3:近14天 | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认30项,最大30项 | -| web_location | str | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />0:成功<br />301:没有剪辑权限 | -| message | str | 提示信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 与[获取直播回放列表](#获取直播回放列表)接口的信息本体相同 | - -**示例:** - -获取某位主播的回放列表,他已授权你回放剪辑权限 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetOtherSliceList?live_uid=1&time_range=1&page=1&page_size=2' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "replay_info": [ - { - "replay_id": 14657830, - "live_info": { - "title": "随缘摸鱼", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "live_time": 1760352139, - "live_type": 1, - "platform": "android_link" - }, - "video_info": { - "replay_status": 2, - "estimated_time": "1970-01-01 08:00:00", - "duration": 858, - "alert_code": 2, - "alert_message": "录像时长远小于开播时长,请关注直播时网络状况" - }, - "alarm_info": { - "code": 2, - "message": "录像生成失败,请稍后再试", - "cur_time": 1760362012, - "is_ban_publish": false - }, - "room_id": 1899237171, - "live_key": "648437353747320627", - "start_time": 1760352139, - "end_time": 1760352997 - }, - { - "replay_id": 14646585, - "live_info": { - "title": "随缘摸鱼", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "live_time": 1760285326, - "live_type": 1, - "platform": "android_link" - }, - "video_info": { - "replay_status": 2, - "estimated_time": "1970-01-01 08:00:00", - "duration": 464, - "alert_code": 2, - "alert_message": "录像时长远小于开播时长,请关注直播时网络状况" - }, - "alarm_info": { - "code": 2, - "message": "录像生成失败,请稍后再试", - "cur_time": 1760362012, - "is_ban_publish": false - }, - "room_id": 1899237171, - "live_key": "648321565723987763", - "start_time": 1760285326, - "end_time": 1760285790 - } - ], - "pagination": { - "page": 1, - "page_size": 2, - "total": 4 - }, - "archive_flag": false, - "can_edit": 1, - "can_upload": false, - "has_third_platform_live": false - } -} -``` - -</details> - -## 获取已发布片段的信息 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetVideoSliceList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -只能获取主播自己的已发布片段。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认20项,最大20项 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功<br />-101:未登录 | -| message | str | 提示信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr | 切片信息 | | -| page | num | 请求的页码 | | -| page_size | num | 内容数量 | | -| total | num | 总计内容数量 | | - -`data.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| silce_id | num | 切片id | | -| av_title | str | 切片标题 | | -| av_cover | str | 切片封面 | | -| av_status | num | 切片状态 | 1:发布中<br />2:已投稿<br />3:投稿失败 | -| avid | num | 切片视频的avid | 状态为2时存在 | -| ctime | str | 切片创建时间 | | -| start_tm | str | 切片开始时间 | | -| end_tm | str | 切片结束时间 | | -| av_duration | num | 切片时长 | 状态为2且创作中心出现有效视频时长时存在 | -| failed_reason | str | 失败原因 | 状态为3时存在,2024-09-01前发布失败的切片可能不存在 | -| live_type | num | (?) | 作用尚不明确 | -| cnt_play | num | 播放数 | 视频有播放时存在;若该页出现任意状态不为2的项也会不存在 | -| cnt_danmaku | num | 弹幕数 | 视频有弹幕时存在;若该页出现任意状态不为2的项也会不存在 | - -**示例:** - -获取自己第1页的已发布片段信息,每页3项 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetVideoSliceList?page=1&page_size=3' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "slice_id": 882357, - "av_title": "2025051720 error", - "av_cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "av_status": 1, - "ctime": "2025-05-18 18:13:13", - "start_tm": "2025-05-17 21:07:04", - "end_tm": "2025-05-17 21:16:00", - "live_type": 1 - }, - { - "slice_id": 879189, - "av_title": "2025051721 zzz 0", - "av_cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "av_status": 3, - "ctime": "2025-05-18 00:32:52", - "start_tm": "2025-05-17 21:07:34", - "end_tm": "2025-05-17 23:02:03", - "failed_reason": "duration_false", - "live_type": 1 - }, - { - "slice_id": 876259, - "av_title": "202505171449", - "av_cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "av_status": 2, - "avid": 114521830065531, - "ctime": "2025-05-17 14:49:18", - "start_tm": "2025-05-17 14:19:36", - "end_tm": "2025-05-17 14:23:48", - "av_duration": 341, - "live_type": 1 - } - ], - "page": 1, - "page_size": 3, - "total": 347 - } -} -``` - -</details> - -## 获取你为某位主播剪辑的已发布片段 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetPublishedList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -需要获得那位主播的授权才能获取数据。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_uid | num | 目标主播的uid | 必要 | | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认20项,最大20项 | -| web_location | str | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />0:成功<br />301:没有剪辑权限 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| slice_info | arr 或 null | 切片信息 | 无内容时为`null` | -| pagination | obj | 分页信息 | | - -`data.slice_info` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| slice_id | num | 切片id | | -| uid | num | 发布者uid? | | -| live_uid | num | 主播uid | | -| live_key | str | 标记直播场次的key | | -| title | str | 切片标题 | | -| cover | str | 切片封面 | 若未在[给某位主播投稿直播回放片段](#给某位主播投稿直播回放片段)接口中传递封面将会无此字段,同时及大可能导致发布失败且没有失败提示 | -| high_light_id | num | 绑定的高光时刻 | 在[给某位主播投稿直播回放片段](#给某位主播投稿直播回放片段)接口中提供相关参数时存在 | -| start_time | str | 片段开始时间 | | -| end_time | str | 片段结束时间 | | -| status | num | 切片状态 | 参见[获取已发布片段的信息](#获取已发布片段的信息)接口 | -| fail_reason | str | 失败提示 | 状态为3且有提示信息时存在 | -| filename | str | 切片视频文件名 | 内部使用,可作为参数传递给创作中心,视频合成完成时存在 | -| avid | num | 切片视频的avid | 状态为2时存在 | -| ctime | str | 切片创建时间 | | -| av_duration | num | 切片时长 | 状态为2且创作中心出现有效视频时长时存在 | -| live_type | num | (?) | 作用尚不明确 | - -`data.pagination` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| page | num | 请求的页码 | | -| page_size | num | 内容数量 | | -| total | num | 总计内容数量 | `data.slice_info`有内容时存在 | - -**示例:** - -获取为某位主播剪辑的已发布片段,他已授权你回放剪辑权限 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetPublishedList?live_uid=1&page=1&page_size=20' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "slice_info": [ - { - "slice_id": 4302, - "uid": 438160221, - "live_uid": 438160221, - "live_key": "648506223547911987", - "title": "test202510201450", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "high_light_id": 12810575, - "start_time": "2025-10-13 23:11:00", - "end_time": "2025-10-13 23:14:00", - "status": 3, - "fail_reason": "合成失败,重新编辑投稿试试~", - "ctime": "2025-10-20 14:50:18", - "live_type": 1 - }, - { - "slice_id": 4300, - "uid": 438160221, - "live_uid": 438160221, - "live_key": "648437353747320627", - "title": "test202510201318", - "start_time": "2025-10-13 18:42:36", - "end_time": "2025-10-13 18:43:36", - "status": 3, - "filename": "n251020tx1rbha851nt85y2fj21bygm8", - "ctime": "2025-10-20 13:41:00", - "live_type": 1 - }, - { - "slice_id": 4299, - "uid": 438160221, - "live_uid": 438160221, - "live_key": "648437353747320627", - "title": "test202510201318", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "start_time": "2025-10-13 18:42:35", - "end_time": "2025-10-13 18:43:35", - "status": 2, - "filename": "n251020tx2u500g1krssxg3om5ou8bdw", - "avid": 115404865274992, - "ctime": "2025-10-20 13:36:44", - "av_duration": 63, - "live_type": 1 - } - ], - "pagination": { - "page": 1, - "page_size": 20, - "total": 4 - } - } -} -``` - -</details> - -## 获取回放剪辑草稿列表 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetDraftList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -只能获取主播自己的回放剪辑草稿。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认30项,最大30项 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />0:成功<br />301:没有剪辑权限 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| draft_info | arr | 草稿信息 | 无结果时为`null` | -| pagination | obj | 分页信息 | | - -`data.draft_info` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 回放剪辑id | | -| title | str | 回放剪辑标题 | | -| cover | str | 回放剪辑封面 | 有封面时存在;若不存在将使用 https://s1.hdslb.com/bfs/static/blive/blfe-link-center/static/img/default.187078d.png | -| live\_key | str | 标记直播场次的key | | -| ctime | str | 回放剪辑创建时间 | | -| live_start_time | str | 直播开始时间 | | -| live_end_time | str | 直播结束时间 | | -| live_type | num | (?) | 作用尚不明确 | - -`data.pagination` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| page | num | 请求的页码 | | -| page_size | num | 内容数量 | | -| total | num | 总计内容数量 | | - -**示例:** - -请求自己的回放剪辑草稿列表 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetDraftList?page=1&page_size=12' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "draft_info": [ - { - "id": 988275, - "title": "直播场次 2025-05-19 20:45:04", - "live_key": "609431465787395891", - "ctime": "2025-05-22 01:08:20", - "live_start_time": "2025-05-19 20:45:04", - "live_end_time": "2025-05-20 09:40:13", - "live_type": 1 - }, - { - "id": 987665, - "title": "直播场次 2025-05-19 20:45:04 切片", - "cover": "http://i0.hdslb.com/bfs/live/9bdf1df3d823734c59382120a9a7c10b177dbefd.png", - "live_key": "609431465787395891", - "ctime": "2025-05-21 20:28:48", - "live_start_time": "2025-05-19 20:45:04", - "live_end_time": "2025-05-20 09:40:13", - "live_type": 1 - } - ], - "pagination": { - "page": 1, - "page_size": 30, - "total": 2 - } - } -} -``` - -</details> - -## 获取你为某位主播剪辑的草稿 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetDraftList - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -需要获得那位主播的授权才能获取数据。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_uid | num | 目标主播的uid | 必要 | | -| page | num | 页码 | 非必要 | 默认第1页 | -| page_size | num | 每页内容数量 | 非必要 | 默认30项,最大30项 | -| web_location | str | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />0:成功<br />301:没有剪辑权限 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 与[获取回放剪辑草稿列表](#获取回放剪辑草稿列表)接口的信息本体相同 | - -**示例:** - -获取你为某位主播剪辑的草稿,他已授权你回放剪辑权限 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetDraftList?live_uid=1&page=1&page_size=20' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "draft_info": [ - { - "id": 1148889, - "title": "直播场次 2025-09-30 23:53:06", - "live_key": "645328214036844339", - "ctime": "2025-10-14 14:48:22", - "live_start_time": "2025-09-30 23:53:06", - "live_end_time": "2025-10-01 01:41:29", - "live_type": 1 - } - ], - "pagination": { - "page": 1, - "page_size": 30, - "total": 1 - } - } -} -``` - -</details> - -## 删除某个回放剪辑草稿 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/DeleteSliceDraft - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -主播删除自己的回放剪辑草稿时使用。 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| draft_id | num | 回放剪辑id | 必要 | | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:参数错误<br />-101:未登录<br />-111:csrf校验失败<br />0:成功<br />206:无可操作草稿 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | `0` | | -| message | str | `""` | | - -**示例:** - -删除回放剪辑id为`988275`的草稿 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/DeleteSliceDraft' \ - --data-urlencode 'draft_id=988275' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "code": 0, - "message": "" - } -} -``` - -</details> - -## 删除为某个主播剪辑的草稿 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/DeleteSliceDraft - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -删除你为某位主播创建的回放剪辑草稿。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| draft_id | num | 回放剪辑id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-101:未登录<br />-111:csrf校验失败<br />0:成功<br />206:无可操作草稿 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 与[](#删除某个回放剪辑草稿)的信息本体相同 | - -**示例:** - -删除回放剪辑id为`1148889`的草稿 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/DeleteSliceDraft?csrf=xxx' \ - -H 'Content-Type: application/json' \ - -b 'SESSDATA=xxx;bili_jct=xxx' \ - -d '{"draft_id":1148889}' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "code": 0, - "message": "" - } -} -``` - -</details> - -## 请求整场直播回放下载链接 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorVideoDownload - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -是否生成回放取决于回放状态,处于可生成回放状态且未生成整场直播回放时将进行生成。 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| record_id | num | 直播回放id | 必要(可选) | `record_id`和`live_key`必选其一 | -| live_key | str | 标记直播场次的key | 必要(可选) | `record_id`和`live_key`必选其一 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />-111:csrf校验失败<br />0:成功<br />100:非法参数<br />210:回放id或场次key无效<br />217:未找到直播录像 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| record | obj | 回放状态 | | -| download_url | str | 回放下载链接 | 完成时存在 | -| download_url_list | arr | 回放下载链接列表 | 完成时存在 | - -`data.record` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| uid | num | 用户mid | | -| record_id | num | 直播回放id | | -| status | num | 回放状态 | | -| estimated_time | num | 预计结束时间 | Unix秒时间戳 | -| current_time | num | 当前时间 | Unix秒时间戳 | -| merge_time | num | 开始合并时间 | Unix秒时间戳 | -| toast | str | 提示信息 | 失败时存在 | - -`data.download_url_list` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | --- | --- | --- | -| 0 | str | 回放下载链接 | | - -**示例:** - -请求回放id为`10597910`的下载链接 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorVideoDownload' \ - --data-urlencode 'record_id=10597910' \ - --data-urlencode 'live_key=607942821532667699' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "record": { - "uid": 438160221, - "record_id": 10597910, - "status": 30, - "estimated_time": 1747639543, - "current_time": 1747639106, - "merge_time": 1747638665 - }, - "download_url": "https://upos-sz-mirrorali.bilivideo.com/ugcever/n250519sa3hkpirw61hjskuit4d9fdsj.mp4?deadline=1747682306&gen=record2vod&os=upos&trid=da40b42594d5446da29cb0d2b2f25f45&uparams=deadline,gen,os,trid&upsig=c6ac5f218af40b2c120b3f5add2e4d6b&attname=直播回放_2025-05-13_20-49-04.mp4", - "download_url_list": [ - "https://upos-sz-mirrorali.bilivideo.com/ugcever/n250519sa3hkpirw61hjskuit4d9fdsj.mp4?deadline=1747682306&gen=record2vod&os=upos&trid=da40b42594d5446da29cb0d2b2f25f45&uparams=deadline,gen,os,trid&upsig=c6ac5f218af40b2c120b3f5add2e4d6b&attname=直播回放_2025-05-13_20-49-04.mp4" - ] - } -} -``` - -</details> - -## 获取回放的信息 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoUidRecordsSubsect - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| record_id | num | 直播回放id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:参数错误<br />-101:未登录<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 失败时不可用 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr | 回放信息列表 | | - -`data.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| uid | num | 用户mid | | -| record_id | num | 直播回放id | | -| title | str | 直播标题 | | -| cover | str | 直播封面 | | -| status | num | 回放状态 | | -| start\_time | num | 直播开始时间 | Unix秒时间戳 | -| end_time | num | 直播结束时间 | Unix秒时间戳 | - -**示例:** - -获取回放id为`10707664`的信息 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoUidRecordsSubsect?record_id=10707664' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "uid": 438160221, - "record_id": 10707664, - "title": "摆", - "cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png", - "status": 2, - "start_time": 1747508293, - "end_time": 1747508499 - } - ] - } -} -``` - -</details> - -## 轮询回放状态 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoUidRecord - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| records | str | 直播回放id列表 | 必要 | 用`,`分隔 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -101:未登录<br />-400:参数错误<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr | 查询结果 | 无效的id会被忽略 | - -`data.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| uid | num | 用户mid | | -| record_id | num | 直播回放id | | -| status | num | 回放状态 | | -| current_time | num | 当前时间戳 | Unix秒时间戳 | -| estimated_time | num | 预计结束时间戳 | 初次[请求回放下载链接](#请求整场直播回放下载链接)后存在 | -| merge_time | num | 合成开始时间戳 | 初次[请求回放下载链接](#请求整场直播回放下载链接)后存在 | - -**示例:** - -查询各种回放id - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoUidRecord' \ - --data-urlencode 'records=10727160,10597910,10687720,10230000,99999999' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "uid": 91089731, - "record_id": 10230000, - "status": 2, - "current_time": 1747641604 - }, - { - "uid": 438160221, - "record_id": 10597910, - "status": 30, - "estimated_time": 1747639543, - "current_time": 1747641604, - "merge_time": 1747638665 - }, - { - "uid": 438160221, - "record_id": 10687720, - "status": -30, - "estimated_time": 1747635525, - "current_time": 1747641604, - "merge_time": 1747635486, - "toast": "因直播过程中存在推流质量问题(网络波动或丢包),本场直播回放无法合成" - }, - { - "uid": 3493299121817771, - "record_id": 10727160, - "status": 2, - "current_time": 1747641604 - } - ] - } -} -``` - -</details> - -## 获取切片视频流 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStream - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -主播获取自己的切片视频流时使用。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].live_key` | -| start_time | num | 直播开始时间戳 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].start_time` | -| end_time | num | 直播结束时间戳 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].end_time` | -| web_location | str | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:参数缺失<br />-101:未登录<br />0:成功<br />100:非法参数<br />202:场次无效 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr 或 null | 直播回放视频列表 | 如果该场回放没有视频流将为`null` | -| ban_list | null 或 arr | 不可发布的回放时间 | 如果该场回放没有不可发布的时间将为`null` | - -`data.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| start_time | num | 片段开始时间戳 | Unix秒时间戳 | -| end_time | num | 片段结束时间戳 | Unix秒时间戳 | -| stream | str | 直播回放视频流 | | -| type | num | 类型? | 2:一般回放? | - -`data.ban_list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| start_time | num | 不可发布片段的开始时间戳 | Unix秒时间戳 | -| end_time | num | 不可发布片段的结束时间戳 | Unix秒时间戳 | - -**示例:** - -获取某个场次的视频流 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStream?live_key=637117671085969203&start_time=1756479520&end_time=1756488870' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "start_time": 1756479528, - "end_time": 1756488870, - "stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?none=为了防止信息泄露,不提供完整链接。目前该视频流可以获取违规片段的视频。", - "type": 2 - } - ], - "ban_list": [ - { - "start_time": 1756487070, - "end_time": 1756488870 - } - ] - } -} -``` - -</details> - -## 获取某位主播的切片视频流 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetUserSliceStream - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -需要获得那位主播的授权才能获取数据。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].live_key` | -| start_time | num | 直播开始时间戳 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].start_time` | -| end_time | num | 直播结束时间戳 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].end_time` | -| live_uid | num | 目标主播的uid | 必要 | | -| web_location | str | (?) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:参数缺失<br />-101:未登录<br />0:成功<br />100:非法参数<br />202:场次无效<br />301:没有剪辑权限 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr | 直播回放视频列表 | 与[获取切片视频流](#获取切片视频流)的`data.list`数组相同 | - -**示例:** - -获取某个场次的视频流,他已授权你回放剪辑权限 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetUserSliceStream?live_key=646125196758224691&start_time=1759507126&end_time=1759513440&live_uid=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "start_time": 1759507132, - "end_time": 1759508222, - "stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?none=获取视频流的参数。", - "type": 2 - } - ] - } -} -``` - -</details> - -## 获取直播会话数据 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetLiveSessionData - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -主播获取自己的直播会话数据时使用。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | | -| start_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 | -| end_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 | -| web_location | str | (?) | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -500:服务器错误<br />-101:未登录<br />0:成功<br />100:非法参数<br />202:场次无效 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| session_data | arr | 会话数据 | | -| max_danmaku | num | 弹幕最多的时间戳 | Unix秒时间戳,没有则为`0` | -| max_pcu | num | 进房最多的时间戳 | Unix秒时间戳,没有则为`0` | -| max_value | num | (?) | 效果未知 | -| high_light_data | arr | 高光时刻数据 | | -| ass_url | str | ASS字幕链接 | 用作弹幕显示 | -| high_light_stat | obj | 高亮状态信息 | | - -`data.session_data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| ts | num | 采样时间 | Unix秒时间戳 | -| value | num | 弹幕数量 | | - -`data.high_light_data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 高光id | | -| type | num | 高光类型 | 1:弹幕<br />2:进房 | -| start_time | num | 高光开始时间戳 | Unix秒时间戳 | -| end_time | num | 高光结束时间戳 | Unix秒时间戳 | -| title | str | 高光提示标题 | | -| cover | str | (?) | 目前为`""` | -| extra | str | (?) | 目前为`""` | - -`data.high_light_stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| original_hl | num | “高光时刻”数量 | 有“高光时刻”时存在 | -| manual_hl | num | “已保存”数量 | 有“已保存”时存在,调用[手动保存高亮片段](#手动保存高亮片段)进行保存 | - -注: 可能还存在一个“回溯录制”的字段。 - -**示例:** - -获取场次key为`607113721045847859`的会话数据 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetLiveSessionData?live_key=607113721045847859&start_tm=0000-01-01+00:00:00&end_tm=1970-01-01+00:00:00' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "session_data": [ - { - "ts": 1752927300, - "value": 0 - }, - { - "ts": 1752927360, - "value": 0 - }, - { - "ts": 1752927420, - "value": 0 - }, - // 省略掉大部分重复内容 - { - "ts": 1752946620, - "value": 0 - }, - { - "ts": 1752946680, - "value": 0 - }, - { - "ts": 1752946740, - "value": 0 - } - ], - "max_danmaku": 1752928860, - "max_pcu": 1752928200, - "max_value": 0, - "high_light_data": [ - { - "id": 9628113, - "type": 1, - "start_time": 1752928860, - "end_time": 1752929040, - "title": "弹幕高光 Top 1", - "cover": "", - "extra": "" - }, - { - "id": 9628114, - "type": 1, - "start_time": 1752938460, - "end_time": 1752938640, - "title": "弹幕高光 Top 2", - "cover": "", - "extra": "" - }, - { - "id": 9628115, - "type": 1, - "start_time": 1752938040, - "end_time": 1752938220, - "title": "弹幕高光 Top 3", - "cover": "", - "extra": "" - }, - { - "id": 9628112, - "type": 2, - "start_time": 1752928140, - "end_time": 1752928320, - "title": "进房高光时刻", - "cover": "", - "extra": "" - } - ], - "ass_url": "https://jssz-boss.hdslb.com/live2arc_anchor_video/dmass_1899237171_625727121464233779.ass?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250802%2Fjssz%2Fs3%2Faws4_request\u0026X-Amz-Date=20250802T072504Z\u0026X-Amz-Expires=7200\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=384b42382469059a1f4c6b04c7bd2290a0c74c01375df1681eedb3ba8aca5c3c", - "high_light_stat": { - "original_hl": 4, - "manual_hl": 6 - } - } -} -``` - -</details> - -## 获取某位主播的直播会话数据 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetUserLiveSessionData - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -需要获得那位主播的授权才能获取数据。 - -若已提供`live_key`和`live_uid`参数,则必须正确提供`start_tm`和`end_tm`参数,否则服务器可能无法成功响应,响应头中的`Bili-Status-Code`为`-500`。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | 需要提供目标主播的live_key | -| start_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 | -| end_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 | -| live_uid | num | 目标主播的uid | 必要 | | -| web_location | str | (?) | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -500:服务器错误<br />-101:未登录<br />0:成功<br />100:非法参数<br />202:场次无效<br />301:没有剪辑权限 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 与[获取直播会话数据](#获取直播会话数据)的信息本体相同 | - -**示例:** - -获取某位主播的某场次会话数据,他已授权你回放剪辑权限 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetUserLiveSessionData?live_key=645810156612095795&start_tm=2025-10-02+20:58:21&end_tm=2025-10-03+01:21:06&live_uid=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "session_data": [ - { - "ts": 1759507080, - "value": 0 - }, - { - "ts": 1759507140, - "value": 0 - },// 省略掉绝大部分数据 - { - "ts": 1759513440, - "value": 1 - } - ], - "max_danmaku": 1759513380, - "max_pcu": 1759507200, - "max_value": 0, - "high_light_data": [ - { - "id": 12472658, - "type": 1, - "start_time": 1759513320, - "end_time": 1759513440, - "title": "弹幕高光 Top 1", - "cover": "", - "extra": "" - }// 省略掉剩下两条 - ], - "high_light_stat": { - "original_hl": 3 - } - } -} -``` - -</details> - -## 获取用户高光列表 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserGetManualHighlightList (主播使用) - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserGetManualHighlightList (粉丝使用) - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | | -| manual_type | num | 查询类型 | 必要 | 1:回溯录制<br />2:已保存片段 | -| live_uid | num | 目标主播的uid | 必要(可选) | 通过粉丝使用接口时必要 | -| web_location | str | (?) | 非必要 | 作用尚不明确 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-101:未登录<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| high_light_stat | obj | 高亮状态信息 | | -| manual_highlight_list | arr | 高光列表 | 有内容时存在 | - -`data.manual_highlight_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 第一条高光信息 | 最少存在1条,目前没有高光内容将看不到这个数组 | -| … | obj | 某一条高光信息 | | -| i | obj | 最后一条高光信息 | | - -`data.manual_highlight_list` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| manual_id | num | 片段id | | -| highlight_title | str | 片段标题 | | -| start_ts | num | 开始时间戳 | Unix 秒时间戳 | -| end_ts | num | 结束时间戳 | Unix 秒时间戳 | -| uid | num | 保存者uid? | | -| ruid | num | 主播uid | | -| live_key | str | 标记直播场次的key | | - -`data.high_light_stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| original_hl | num | “高光时刻”数量 | 有“高光时刻”时存在 | -| manual_hl | num | “已保存”数量 | 有“已保存”时存在,调用[手动保存高亮片段](#手动保存高亮片段)进行保存 | - -注: 可能还存在一个“回溯录制”的字段。 - -**示例:** - -主播获取用户保存列表 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserGetManualHighlightList?live_key=625727121464233779&manual_type=2' \ - -b 'SESSDATA=xxx' -``` - -粉丝获取用户保存列表 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserGetManualHighlightList?live_key=645810156612095795&manual_type=2&live_uid=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -只有高光时刻的示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "high_light_stat": { - "original_hl": 4 - } - } -} -``` - -有保存片段的示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "manual_highlight_list": [ - { - "manual_id": 14434, - "highlight_title": "手动保存片段【6】", - "start_ts": 1752935402, - "end_ts": 1752935402, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - }, - { - "manual_id": 14428, - "highlight_title": "手动保存片段【5】", - "start_ts": 1752935402, - "end_ts": 1752935204, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - }, - { - "manual_id": 14426, - "highlight_title": "手动保存片段【4】", - "start_ts": 1752935402, - "end_ts": 1752935404, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - }, - { - "manual_id": 14425, - "highlight_title": "手动保存片段【3】", - "start_ts": 1752935402, - "end_ts": 1752935404, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - }, - { - "manual_id": 14424, - "highlight_title": "手动保存片段【2】", - "start_ts": 1752927342, - "end_ts": 1752935404, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - }, - { - "manual_id": 14423, - "highlight_title": "手动保存片段【1】", - "start_ts": 1752927336, - "end_ts": 1752946748, - "uid": 438160221, - "ruid": 438160221, - "live_key": "625727121464233779" - } - ], - "high_light_stat": { - "original_hl": 4, - "manual_hl": 6 - } - } -} -``` - -</details> - -## 获取某个时间的视频帧 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoKeyFrame (主播使用) - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetAnchorVideoKeyFrame (粉丝使用) - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**正文参数( application/json ):** - -根对象: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | | -| live_uid | num | 目标主播的uid | 必要(可选) | 通过粉丝使用接口时必要 | -| time_list | str | 秒时间戳列表,用`,`分隔 | 必要 | 时间间隔低于30秒将会导致只提供部分内容 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-111:csrf校验失败<br />-101:未登录<br />0:成功<br />10121188:权限不足 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| list | arr | 指定时间的视频帧列表 | 场次key无效时为`null` | - -`data.list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| ts | num | 时间戳 | 对应请求的`time_list`其中某一个 | -| url | str | 该时间的视频帧 | 该时间有视频且取帧成功时存在 | - -**示例:** - -主播获取某场直播的视频帧 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoKeyFrame?csrf=xxx' \ - -H 'Content-Type: application/json' \ - -b 'SESSDATA=xxx;bili_jct=xxx' \ - -d '{"live_key":"609431465787395891","time_list":"174758900,1747658930,1747658960"}' -``` - -粉丝获取某场直播的视频帧 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/GetAnchorVideoKeyFrame?csrf=xxx' \ - -H 'Content-Type: application/json' \ - -b 'SESSDATA=xxx;bili_jct=xxx' \ - -d '{"live_key":"645810156612095795","time_list":"1759410340,1759418126","live_uid":1}' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "ts": 174758900 - }, - { - "ts": 1747658930, - "url": "https://jssz-boss.hdslb.com/live2arc_anchor_video/live_438160221_32373699_20250519204900.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250520%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250520T180202Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=8d42a3d5fd1995e5e2bf98d453a986bec48529a9ae97d5d7eedee8a59b22418a" - }, - { - "ts": 1747658960, - "url": "https://jssz-boss.hdslb.com/live2arc_anchor_video/live_438160221_32373699_20250519205001.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250520%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250520T180202Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=f4a3803d4147492ced14eefbb6953e772b886e195d51dbfac800e77320adeba2" - } - ] - } -} -``` - -</details> - -## 手动保存高亮片段 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserManualSaveHighlight (主播使用) - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserManualSaveHighlight (粉丝使用) - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | | -| start_ts | num | 开始时间戳 | 必要 | Unix 秒时间戳 | -| end_ts | num | 结束时间戳 | 必要 | Unix 秒时间戳 | -| live_uid | num | 目标主播的uid | 必要(可选) | 通过粉丝使用接口时必要 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -注: 开始时间减结束时间的结果小于1可能导致[直播回放片段发布页面](#直播回放片段发布页面)无法处理这个片段。 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-111:csrf校验失败<br />-101:未登录<br />0:成功<br /> | -| message | str | 错误信息 | | -| ttl | num | `1` | | -| data | obj | 信息本体 | 成功时为空对象 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | `-1` | | -| message | str | 错误提示 | `主播没有对应场次` , `保存时间点未开播` | - -**示例:** - -主播手动保存一个片段 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserManualSaveHighlight' \ - --data-urlencode 'live_key=625727121464233779' \ - --data-urlencode 'start_ts=1752935402' \ - --data-urlencode 'end_ts=1752935404' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -粉丝手动保存一个片段 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserManualSaveHighlight' \ - --data-urlencode 'live_key=645810156612095795' \ - --data-urlencode 'start_ts=1759409907' \ - --data-urlencode 'end_ts=1759410087' \ - --data-urlencode 'live_uid=1' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## 投稿直播回放片段 - -> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorPublishVideoSlice - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -主播投稿自己的直播回放片段时使用。 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_key | str | 标记直播场次的key | 必要 | 必须为自己的live_key | -| start_ts | num | 开始时间戳 | 必要 | 开始和结束时间目前相差不能大于2小时 | -| end_ts | num | 结束时间戳 | 必要 | 开始和结束时间目前相差不能大于2小时 | -| av_title | str | 切片标题 | 必要 | 不能与现有标题重复 | -| av_cover | str | 切片封面URL | 必要 | 必须为`.hdslb.com`域名下的图片,否则合成结束时会出错 | -| av_highlight | num | 高光绑定 | 非必要 | | -| with_subtitle | num | 是否携带字幕 | 非必要 | 效果不明确 | -| with_danmaku | num | 是否带弹幕? | 非必要 | 传递`1`时可能导致处于“发布中”状态时不在[获取已发布片段的信息](#获取已发布片段的信息)中显示 | -| with_reserve | num | 投稿携带下场直播提醒 | 非必要 | 0:不携带,1:携带 | -| av_speed | str | 倍速投稿 | 非必要 | 格式为 `倍速值 + "x"` ,使用非1x倍速时可能导致处于“发布中”状态时不在[获取已发布片段的信息](#获取已发布片段的信息)中显示<br />允许值: `0.5x` , `0.75x` , `1.0x` , `1.25x` , `1.5x` , `2.0x` | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -111:csrf校验失败<br />-101:未登录<br />0:成功<br />4000:时长过长<br />4001:操作太快<br />4002:片段已投稿<br />4003:请选择精彩片段再投稿哦<br />4006:标题已使用<br />4008:不被允许的视频倍速<br />4009:该片段存在违规内容,不允许投稿 | -| message | str | 错误信息 | | -| ttl | num | `1` | | -| data | obj | 信息本体 | 成功时有效 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| video_slice_id | num | 切片id | | - -注: 若返回值出现4001不一定就是操作太快,不提供某些必要参数或某个参数不正确也会导致返回4001。 - -**示例:** - -为某个场次投稿切片 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorPublishVideoSlice' \ - --data-urlencode 'live_key=609431465787395891' \ - --data-urlencode 'start_ts=1747680306' \ - --data-urlencode 'end_ts=1747687506' \ - --data-urlencode 'av_title=2025051920' \ - --data-urlencode 'av_cover=https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png' \ - --data-urlencode 'av_highlight=0' \ - --data-urlencode 'with_subtitle=0' \ - --data-urlencode 'with_danmaku=0' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "video_slice_id": 898374 - } -} -``` - -</details> - -## 给某位主播投稿直播回放片段 - -> https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserPublishOtherVideoSlice - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -需要获得那位主播的授权。 - -**正文参数( application/x-www-form-urlencoded ):** - -与[投稿直播回放片段](#投稿直播回放片段)的正文参数相比,多了`live_uid`参数,少了`av_speed`参数,其它参数基本相同。 - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| live_uid | num | 目标主播的uid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -111:csrf校验失败<br />-101:未登录<br />0:成功<br />100:非法参数<br />4000:时长过长<br />5006:用户已经投稿过该片段 | -| message | str | 错误信息 | | -| ttl | num | `1` | | -| data | obj | 信息本体 | 成功时有效 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| video_slice_id | num | 切片id | 似乎与主播不共用一个切片id | - -**示例:** - -为某个场次投稿切片 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/videoService/UserPublishOtherVideoSlice' \ - --data-urlencode 'live_key=648437353747320627' \ - --data-urlencode 'start_ts=1760352154' \ - --data-urlencode 'end_ts=1760352214' \ - --data-urlencode 'av_title=202510201318' \ - --data-urlencode 'av_cover=https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png' \ - --data-urlencode 'av_highlight=0' \ - --data-urlencode 'with_subtitle=0' \ - --data-urlencode 'with_danmaku=0' \ - --data-urlencode 'with_reserve=1' \ - --data-urlencode 'live_uid=1' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "video_slice_id": 4300 - } -} -``` - -</details> - -## 下载整场直播回放的流程 - -此处的流程是从[直播回放](https://link.bilibili.com/#/my-room/live-record)的“下载回放”功能得出的。 - -1. 先[请求整场直播回放下载链接](#请求整场直播回放下载链接)接口,让它开始合成回放; - -2. (可选)请求[获取回放的信息](#获取回放的信息)接口,生成合成进度页面; - -3. [轮询回放合成状态](#轮询回放状态),当状态变为`30`转到流程4,变为`-30`转到流程5; - -4. 再次[请求整场直播回放下载链接](#请求整场直播回放下载链接),获取下载链接并下载。 - -5. 请求[获取直播回放列表](#获取直播回放列表),刷新页面并根据信息提示失败。 - -## 直播回放片段发布页面 - -通过此处的链接可以打开直播回放片段发布页面。 - -> https://live.bilibili.com/web-cut/quick-publish.html (网页端) - -> https://live.bilibili.com/web-cut/quick-publish-mobile.html (移动端) - -注:移动端强制限制只能投稿15分钟的片段,网页端则看[投稿直播回放片段](#投稿直播回放片段)接口允许多长的时间。 - -**url查询参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| start_time | num | 直播开始时间 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].start_time` | -| end_time | num | 直播结束时间 | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].end_time` | -| live_key | str | 标记直播场次的key | 必要 | 对应[获取直播回放列表](#获取直播回放列表)的`data.replay_info[i].live_key` | -| cover | str | 封面URL | 非必要 | 可以自定义封面(必须为B站图床,详见[投稿接口](#投稿直播回放片段)),或者在[获取直播回放列表](#获取直播回放列表)使用直播封面 | -| anchor_id | num | 目标主播的uid | 非必要 | 要剪辑某位主播的回放时必须提供 | -| anchor_name | num | 目标主播的名称 | 非必要 | 由[某位主播的直播回放剪辑界面](#某位主播的直播回放剪辑界面)传递 | - -**示例链接:** - -网页端: https://live.bilibili.com/web-cut/quick-publish.html?start_time=1747508293&end_time=1747508499&live_key=609041817764368179&cover=https%3A%2F%2Fi0.hdslb.com%2Fbfs%2Flive%2F59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png - -移动端: https://live.bilibili.com/web-cut/quick-publish-mobile.html?start_time=1747508293&end_time=1747508499&live_key=609041817764368179 - -粉丝剪辑: https://live.bilibili.com/web-cut/quick-publish.html?start_time=1760766799&end_time=1760774101&live_key=649597291269984051&cover=https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png&anchor_id=1&anchor_name=null - -## 直播回放剪辑页面 - -此链接用于打开直播回放轻剪辑页面,在点击[直播回放片段发布页面](#直播回放片段发布页面)的“高级剪辑”按钮或某一个[主播回放剪辑草稿](#获取回放剪辑草稿列表)、[粉丝回放剪辑草稿](#获取你为某位主播剪辑的草稿)后自动打开。 - -> https://live.bilibili.com/web-cut/index.html - -**url查询参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| start_time | num | 直播开始时间戳 | 必要 | 用于[获取切片视频流](#获取切片视频流) | -| end_time | num | 直播结束时间戳 | 必要 | 用于[获取切片视频流](#获取切片视频流) | -| live_key | str | 标记直播场次的key | 必要 | 用于[获取切片视频流](#获取切片视频流) | -| draft_id | num | 回放剪辑id | 必要 | | -| init | num | (?) | 非必要 | 作用尚不明确 | -| with_reserve | num | 投稿携带下场直播提醒? | 非必要 | 0:不携带,1:携带 | -| anchor_id | num | 目标主播的uid | 非必要 | | - -**示例链接:** https://live.bilibili.com/web-cut/index.html?start_time=1747658704&end_time=1747705213&live_key=609431465787395891&draft_id=988275 - -## 某位主播的直播回放剪辑界面 - -此链接用于打开某位主播的直播回放剪辑界面,需要获得那位主播的授权。 - -主播自己访问该界面也需要自己在剪辑权限页面内开启该功能。 - -> https://live.bilibili.com/web-cut/replay-cut.html - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| anchor_Id | num | 主播uid | 必要 | 参数名不区分大小写 | -| anchor_name | str | 主播名称 | 非必要 | 用于在UI中显示主播名称,目前可随意传递,若不提供将使用 `未知主播` 显示 | - -**示例链接:** https://live.bilibili.com/web-cut/replay-cut.html?anchor_Id=1&anchor_name=bishi diff --git a/docs/live/live_stream.md b/docs/live/live_stream.md deleted file mode 100644 index 57b9fac..0000000 --- a/docs/live/live_stream.md +++ /dev/null @@ -1,156 +0,0 @@ -# 直播间视频流 - -## 根据真实直播间号获取直播视频流 - -> https://api.live.bilibili.com/room/v1/Room/playUrl - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| cid | num | 目标真实直播间号 | 必要 | 直播间的`room_id`(非短号) | -| platform | str | 直播流格式 | 非必要 | h5:hls方式<br />web:http-flv方式<br />默认为http-flv方式 | -| quality | num | 画质 | 非必要 | `qn`与`quality`任选其一<br />2:流畅<br />3:高清<br />4:原画 | -| qn | str | 画质 | 非必要 | `qn`与`quality`任选其一<br />80:流畅<br />150:高清<br />250:超清<br />400:蓝光<br />10000:原画<br />20000:4K<br />25000:默认<br />30000:杜比 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功<br />-400:参数错误<br />19002003:房间信息不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | str | 1 | | -| data | obj | 信息本体 | | - - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------- | ------------------------ | -| current_quality | num | 当前画质代码`qn` | | -| accept_quality | array | 可选画质数参数 | | -| current_qn | num | 当前画质代码`quality` | | -| quality_description | array | 可选画质参数`quality` | | -| durl | array | 直播流url组 | | - -`accept_quality`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | str | `qn`画质代码1 | | -| n | str | `qn`画质代码(n+1) | | -| …… | str | …… | …… | - -`quality_description`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 画质代码1 | | -| n | obj | 画质代码(n+1) | | -| …… | obj | …… | …… | - -`quality_description`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------------- | ---- | -| qn | num | 画质代码 | | -| desc | str | 该代码对应的画质名称 | | - -`durl`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 主线服务器 | | -| n | obj | 备线n服务器 | | -| …… | obj | …… | …… | - -`durl`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------- | ------------------------ | -| url | str | 直播流url | flv或m3u8格式<br />**注:带有转义** | -| length | num | 0 | 作用尚不明确 | -| order | num | 服务器线路序号 | | -| stream_type | num | 0 | 作用尚不明确 | -| p2p_type | num | 0 | 作用尚不明确 | - -**示例:** - -查询直播间`cid=14073662`的直播间信息 - -```shell -curl -G 'https://api.live.bilibili.com/room/v1/Room/playUrl' \ ---data-urlencode 'cid=14073662' \ ---data-urlencode 'qn=10000' \ ---data-urlencode 'platform=web' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "current_quality": 3, - "accept_quality": [ - "4", - "3", - "2" - ], - "current_qn": 3, - "quality_description": [ - { - "qn": 4, - "desc": "原画" - }, - { - "qn": 3, - "desc": "高清" - }, - { - "qn": 2, - "desc": "流畅" - } - ], - "durl": [ - { - "url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/601131/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=20e4ac695fbdd1d11d5dac4f93caa783&ptype=0&src=9&sl=1&order=1", - "length": 0, - "order": 1, - "stream_type": 0, - "p2p_type": 0 - }, - { - "url": "https://d1--cn-gotcha01.bilivideo.com/live-bvc/757951/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha01&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=9deea67bb9e9c1f0fa3886a34aa09473&ptype=0&src=9&sl=1&order=2", - "length": 0, - "order": 2, - "stream_type": 0, - "p2p_type": 0 - }, - { - "url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/982058/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=8753b270960034660184d975d86c0161&ptype=0&src=9&sl=1&order=3", - "length": 0, - "order": 3, - "stream_type": 0, - "p2p_type": 0 - }, - { - "url": "https://d1--cn-gotcha04.bilivideo.com/live-bvc/139554/live_14073662_bs_3699814_1500.flv?cdn=cn-gotcha04&expires=1602496530&len=0&oi=1939228219&pt=&qn=150&trid=e6540d81a5d04c2ea459c46ebe77472a&sigparams=cdn,expires,len,oi,pt,qn,trid&sign=cf93474e923c9ba8288c45d954f81045&ptype=0&src=9&sl=1&order=4", - "length": 0, - "order": 4, - "stream_type": 0, - "p2p_type": 0 - } - ] - } -} -``` - -</details> diff --git a/docs/live/live_vote.md b/docs/live/live_vote.md deleted file mode 100644 index 8e2af3f..0000000 --- a/docs/live/live_vote.md +++ /dev/null @@ -1,470 +0,0 @@ -# 直播投票 - -## 查询投票信息 - -> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/votePanel - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-101:未登录<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 不是登录信息对应的直播间时将为 `null` | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| vote_info | obj | 当前活动的投票信息 | 若当前没有活动的投票将为空对象 | -| templates | arr | 投票模板 | | - -`data.vote_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| status | num | 投票状态 | 见[投票状态](#投票状态)枚举 | -| question | str | 投票问题 | | -| options | arr | 投票选项 | | -| duration | num | 投票持续时间 | 单位:毫秒 | -| result | num | 投票结果偏向哪一方状态 | | -| result_text | str | 投票结果偏向哪一方 | | -| etime_str | str | 投票结束时间 | | -| left_duration | num | 投票剩余时间 | 单位:毫秒,投票结束后不存在 | -| interaction_id | num | 投票互动id | | -| template_id | num | 投票模板id | 使用模板时存在 | - -`data.vote_info.options` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 投票选项1 | | -| 1 | obj | 投票选项2 | | - -`data.vote_info.options` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| idx | num | 选项id | | -| desc | str | 投票选项描述 | | -| percent | num | 投票选项占比显示 | | - -`data.templates` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 投票模板信息 | | -| … | obj | 投票模板信息 | | - -`data.templates` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| template_id | num | 模板id | | -| question | str | 投票问题 | | -| option_a | str | 投票选项A | | -| option_b | str | 投票选项B | | - -**示例:** - -查询投票信息 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/votePanel?room_id=1' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "vote_info": { - "status": 4, - "question": "醒醒", - "options": [ - { - "idx": 1, - "desc": "醒", - "percent": 0.5 - }, - { - "idx": 2, - "desc": "睡", - "percent": 0.5 - } - ], - "duration": 600000, - "result": 1, - "result_text": "平局", - "etime_str": "08-31 15:44", - "left_duration": 549660, - "interaction_id": 120122595433984 - }, - "templates": [ - { - "template_id": 54339003518976, - "question": "哪边赢", - "option_a": "左", - "option_b": "右" - }, - { - "template_id": 48570973661696, - "question": "只因你太美唱的好吗?", - "option_a": "你干嘛", - "option_b": "哎哟" - }, - // 省略了大部分内容 - { - "template_id": 46203444257280, - "question": "№!", - "option_a": "虾头", - "option_b": "抽象" - }, - { - "template_id": 96177095781888, - "question": "相信奇迹吗", - "option_a": "相信", - "option_b": "必须相信" - }, - { - "template_id": 103827382481920, - "question": "1", - "option_a": "1", - "option_b": "1" - } - ] - } -} -``` - -</details> - -## 查询投票历史 - -> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/voteHistory - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:请求错误<br />-101:未登录<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | 不是登录信息对应的直播间时将为空对象 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| history | arr | 投票历史列表 | | - -`data.history` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 | -| … | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 | -| 9 | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 | - -`data.history` 数组中对象: - -与 [查询投票信息](#查询投票信息) json回复的 `data.vote_info` 相同。 - -**示例:** - -```shell -curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/voteHistory?room_id=1' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "history": [ - { - "status": 5, - "question": "醒醒", - "options": [ - { - "idx": 1, - "desc": "醒", - "percent": 0.5 - }, - { - "idx": 2, - "desc": "睡", - "percent": 0.5 - } - ], - "duration": 600000, - "result": 1, - "result_text": "平局", - "etime_str": "08-31 15:44", - "interaction_id": 120122595433984 - }, - { - "status": 5, - "question": "会不会睡死?", - "options": [ - { - "idx": 1, - "desc": "包会的", - "percent": 0.5 - }, - { - "idx": 2, - "desc": "不会的", - "percent": 0.5 - } - ], - "duration": 60000, - "result": 1, - "result_text": "平局", - "etime_str": "08-31 14:57", - "interaction_id": 120117830648832 - }, - { - "status": 5, - "question": "会不会睡着?", - "options": [ - { - "idx": 1, - "desc": "包会的", - "percent": 0.5 - }, - { - "idx": 2, - "desc": "不会的", - "percent": 0.5 - } - ], - "duration": 180000, - "result": 1, - "result_text": "平局", - "etime_str": "08-31 14:53", - "interaction_id": 120117121798656 - }, - { - "status": 5, - "question": "能不能一把过", - "options": [ - { - "idx": 1, - "desc": "能", - "percent": 0.5 - }, - { - "idx": 2, - "desc": "不能", - "percent": 0.5 - } - ], - "duration": 60000, - "result": 1, - "result_text": "平局", - "etime_str": "08-31 14:41", - "interaction_id": 120115796409344, - "template_id": 3109187328000 - } - // 省略其余6项 - ] - } -} -``` - -</details> - -## 投票状态 - -此处列出已发现的投票状态,在投票信息和直播信息流 `DM_INTERACTION` 的类型 `101` 等地方使用。 - -当前状态信息来自混淆代码寻找而来。 - -| 值 | 含义 | 备注 | -| -- | ---- | ---- | -| 0 | | 键名 `NONE` | -| 1 | 等待审核 | 键名 `WAITING_AUDIT` | -| 2 | 审核失败 | 键名 `AUDIT_FAILED` | -| 4 | 投票进行中 | 键名 `DURING` | -| 5 | 投票结束 | 键名 `END` | -| 6 | | 键名 `STOP` | - -## 创建直播投票 - -> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/createVote - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -投票创建完成后,投票信息和审核结果将以直播信息流 `DM_INTERACTION` 的类型 `101` 下发。 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 | -| duration | num | 持续时间 | 必要 | 必须为整数,目前范围`0<d<10` | -| question | str | 投票问题 | 必要 | | -| option_a | str | 选项A | 必要 | | -| option_b | str | 选项B | 必要 | | -| template_id | num | 投票模板id | 非必要 | | -| live_key | str | 直播场次key | 非必要 | 需要更多信息 | -| sub_session_key | str | (?) | 非必要 | 需要更多信息 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| visit_id | str | (?) | 非必要 | 作用尚不明确 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -404:不是自己的直播间<br />-400:参数错误<br />-101:未登录<br />-111:csrf校验失败<br />0:成功 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| interaction_id | num | 投票互动id | | - -**示例:** - -创建一个投票 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/createVote' \ - --data-urlencode 'room_id=3' \ - --data-urlencode 'duration=1' \ - --data-urlencode 'question=abcdef' \ - --data-urlencode 'option_a=A' \ - --data-urlencode 'option_b=B' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "interaction_id":120008099262976 - } -} -``` - -</details> - -## 中断直播投票 - -> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/terminateVote - -*请求方法: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| interaction_id | num | 投票互动id | 必要 | 必须为该登录信息创建的投票 | -| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 | -| csrf_token | str | CSRF Token(位于cookie) | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| visit_id | str | (?) | 非必要 | 作用尚不明确 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | -400:参数错误<br />-101:未登录<br />-111:csrf校验失败<br />0:成功<br />1003402:修改投票状态失败 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | null | 无 | | - -**示例:** - -中断某个投票 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/terminateVote' \ - --data-urlencode 'interaction_id=120122595433984' \ - --data-urlencode 'room_id=1' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": null -} -``` - -</details> - -## 弹幕投票主播侧界面 - -> https://live.bilibili.com/p/html/live-app-guessing-game/anchor_vote.html - -直接访问此页面存在部分功能不可用的情况。 - -**URL查询参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| room_id | num | 直播间id | 必要 | 必须为自己的直播间 | diff --git a/docs/live/manage.md b/docs/live/manage.md deleted file mode 100644 index 88d54c1..0000000 --- a/docs/live/manage.md +++ /dev/null @@ -1,742 +0,0 @@ -# 直播间管理 - -## 开通直播间 - -> https://api.live.bilibili.com/xlive/app-blink/v1/preLive/CreateRoom - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | -------------------- | -| platform | str | 客户端? | 必要 | 默认值web | -| visit_id | str | 未知 | | 默认空 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| csrf_token | str | CSRF Token(位于 cookie) | | | - - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />1531193016:已经创建直播间~<br />-400:请求错误 | -| ttl | str | 错误信息 | 默认为1 | -| message | str | 错误信息 | 默认为0 | -| data | array | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------------- | ---------------------- | -| roomID | str | 直播间房间号 | 创建成功返回直播间号 | - -**示例:** - -开通直播间 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/preLive/CreateRoom' \ ---data-urlencode 'platform=web' \ ---data-urlencode 'visit_id=' \ ---data-urlencode 'csrf=xxx' \ ---data-urlencode 'csrf_token=xxx' \ --b 'SESSDATA=xxx;bili_jct=xx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "roomID": "1234" - } -} -``` - -```json -{ - "code": 1531193016, - "message": "已经创建直播间~", - "ttl": 1, - "data": { - "roomID": "" - } -} -``` - -</details> - - - -## 更新直播间信息 - -> https://api.live.bilibili.com/room/v1/Room/update - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | -------------------- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| csrf_token | str | CSRF Token(位于 cookie) | 非必要 | | -| platform | str | 平台标识 | 非必要 | | -| visit_id | str | (?) | 非必要 | 某种标识? | -| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | -| title | str | 直播间标题 | 非必要 | 上限40个字符 | -| area\_id | num | 直播分区id(子分区id) | 非必要 | 详见[直播分区](live_area.md) | -| add\_tag | str | 要添加的标签 | 非必要 | 开播设置界面上限10个字符 | -| del\_tag | str | 要删除的标签 | 非必要 | 若存在`add_tag`时不起作用 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-1:操作太频繁<br />1:错误<br />3:未登录或鉴权失败<br />405:不允许的请求方法<br />60009:分区已下线<br />65530:token错误(登录错误)<br /> | -| msg | str | 错误信息 | 默认为ok | -| message | str | 错误信息 | 默认为ok | -| data | obj | 信息本体 | 部分失败情况下是`[]`(空数组) | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ---- | ---- | -| sub_session_key | str | 信息变动标识 | | -| audit_info | obj | 标题审核信息 | | - -`data`中的`audit_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ---- | ---- | -| audit_title_reason | str | 标题审核提示 | | -| audit_title_status | num | 标题审核状态 | | -| audit_title | str | 被审核的标题 | 更新标题时存在 | -| update_title | str | `""` | 作用尚不明确 | - -**示例:** - -修改直播间`10352053`标题为`测试` - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/update' \ - --data-urlencode 'room_id=10352053' \ - --data-urlencode 'title=测试' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "msg":"ok", - "message":"ok", - "data":{ - "sub_session_key":"", - "audit_info":{ - "audit_title_reason":"先发后审", - "update_title":"", - "audit_title_status":2, - "audit_title":"测试" - } - } -} -``` - -</details> - -修改直播间`10352053`分区为`40` - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/update' \ - --data-urlencode 'room_id=10352053' \ - --data-urlencode 'area_id=40' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "data": { - "sub_session_key": "", - "audit_info": { - "audit_title_reason": "", - "update_title": "", - "audit_title_status": 0 - } - } -} -``` - -</details> - -给直播间`11996900`添加一个标签为`测试标签` - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/update' \ - --data-urlencode 'room_id=11996900' \ - --data-urlencode 'add_tag=测试标签' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "data": { - "sub_session_key": "", - "audit_info": { - "audit_title_reason": "", - "update_title": "", - "audit_title_status": 0 - } - } -} -``` - -</details> - -给直播间`11996900`删除内容为`测试标签`的标签 - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/update' \ - --data-urlencode 'room_id=11996900' \ - --data-urlencode 'del_tag=测试标签' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "ok", - "message": "ok", - "data": { - "sub_session_key": "", - "audit_info": { - "audit_title_reason": "", - "update_title": "", - "audit_title_status": 0 - } - } -} -``` - -</details> - -## 开始直播 - -> https://api.live.bilibili.com/room/v1/Room/startLive - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -开播时必须有分区选择,开播后返回推流地址 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| room_id | num | 直播间id | 必要 | 必须为自己的直播间 id | -| area_v2 | num | 直播分区id(子分区 id) | 必要 | 详见[直播分区](live_area.md) | -| platform | str | 直播平台 | 必要 | 可选值:`pc`、`pc_link` (直播姬 PC), `android_link` (直播姬 Android) | -| csrf | str | CSRF Token(位于 cookie) | 必要 | | -| csrf_token | str | CSRF Token(位于 cookie) | 非必要 | | -| version | str | 直播姬版本号 | 非必要 | 建议与 `build` 一同提供,详见下方说明。可从[直播姬版本号获取](#直播姬版本号获取)接口获得。 | -| build | num | 直播姬构建号 | 非必要 | 建议与 `version` 一同提供。 | -| appkey | str | APP密钥 | 条件性必要 | 特定情况下必要,详见下方说明。 | -| sign | str | APP API签名得到的 sign | 条件性必要 | 特定情况下必要,详见下方说明。 | - -**说明**: 截止至 2025 年 7 月 20 日,部分账户不提供 `version` `build` `appkey` `sign` 也可获取推流码,部分账户会返回 `60024` (需要人脸认证),此时请尝试提供 `version` `build`,目前似乎没有校验,提供了就可以。(比如 `version:1.0.0` `build:1234`) 如果仍然返回 `60024`,请尝试提供 `appkey` `sign` 参数。如果你的 `version` 和 `build` 为 `7.19.0.9432` 和 `9432`,必须提供 `appkey` `sign`。 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0: 成功<br />-400: 请求错误<br />1: 错误<br />60009: 分区不存在<br />60013: 所在地区受实名认证限制无法开播<br />60024: 目标分区需要人脸认证<br />60034: 系统维护仅支持直播姬开播<br />60037: web在线开播已下线<br />65530: token错误 (登录失效)<br />**(其他错误码有待补充)** | -| msg | str | 提示信息 | 默认为空 | -| message | str | 提示信息 | 默认为空 | -| data | obj | 信息本体 | 成功时返回 | - - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------------- | ---------------------- | -| change | num | 是否改变状态 | 0:未改变<br />1:改变 | -| status | str | 直播间状态 | `LIVE` | -| room_type | num | 0 | 作用尚不明确 | -| rtmp | obj | RTMP推流地址信息 | | -| protocols | array | 推流协议、地址、密钥等信息<br />其中地址、密钥与 `rtmp` 字段的内容是一致的 | 协议只见到过 `rtmp` | -| try_time | str | ??? | 作用尚不明确 | -| live_key | str | 标记直播场次的key | | -| sub_session_key | str | 信息变动标识 | | -| notice | obj | ??? | 作用尚不明确 | -| qr | str | `""` | 作用尚不明确 | -| need_face_auth | bool | 需要人脸识别? | 作用尚不明确 | -| service_source | str | ??? | 作用尚不明确 | -| rtmp\_backup | null | ??? | 作用尚不明确 | -| up_stream_extra | obj | 主播推流额外信息? | | - -`data`中的`rtmp`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------------------------- | ------------ | -| addr | str | RTMP推流(发送)地址 | **重要** | -| code | str | RTMP推流参数(密钥) | **重要** | -| new_link | str | 获取CDN推流ip地址重定向信息的url | 没啥用 | -| provider | str | 推流云服务节点厂商 | `txy`: 腾讯云 | - -`data`中的`protocols`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ------------ | -| 0 | obj | 与 `rtmp` 字段在地址和密钥上相同的推流协议信息 | | - -`data`中的`protocols`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------------------------- | ------------ | -| protocol | str | rtmp | 推流协议 | -| addr | str | RTMP推流(发送)地址 | 格式为 `rtmp://<推流节点>/live-bvc/` | -| code | str | RTMP推流参数(密钥) | 格式为 `?streamname=live_<B站UID>_<未知数字>&key=<密钥>&schedule=rtmp&pflag=<开播平台标志>` | -| new_link | str | 获取CDN推流ip地址重定向信息的url | | -| provider | str | 推流云服务节点厂商 | `txy`: 腾讯云 | - -`data`中的`notice`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---- | ------------ | -| type | num | 1 | 作用尚不明确 | -| status | num | 0 | 作用尚不明确 | -| title | str | 空 | 作用尚不明确 | -| msg | str | 空 | 作用尚不明确 | -| button_text | str | 空 | 作用尚不明确 | -| button_url | str | 空 | 作用尚不明确 | - -`data`中的`up_stream_extra`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| isp | str | 主播的互联网服务提供商 | | - -**示例:** - -以`27`作为分区id开播直播间`10352053` - -其中`"data"."rtmp"."addr"`为推流地址 - -`"data"."rtmp"."code"`为推流参数 - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/startLive' \ ---data-urlencode 'room_id=10352053' \ ---data-urlencode 'area_v2=27' \ ---data-urlencode 'platform=pc' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;bili_jct=xx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "data":{ - "change": 1, - "status": "LIVE", - "try_time": "0000-00-00 00:00:00", - "room_type": 0, - "live_key": "608336837537435443", - "sub_session_key": "608336837537435443sub_time:1747292297", - "rtmp":{ - "type": 1, - "addr": "rtmp://live-push.bilivideo.com/live-bvc/", - "code": "?streamname=live_348892132_32373699\u0026key=e03061d4a7529d8eaa322dc4d330ca1c\u0026schedule=rtmp\u0026pflag=11", - "new_link": "https://core.bilivideo.com/video/uplinkcore/selfbuild/schedule?up_rtmp=live-push.bilivideo.com%2Flive-bvc%2F%3Fstreamname%3Dlive_348892132_32373699%26key%3De73061d8a7539d8eaa233dc4d880ca1c%26schedule%3Drtmp%26pflag%3D11\u0026edge=edge", - "provider": "live" - }, - "protocols":[ - { - "protocol": "rtmp", - "addr": "rtmp://live-push.bilivideo.com/live-bvc/","code":"?streamname=live_348892132_32373699\u0026key=e73061d4a1002d8eaa322dc4d880ca1c\u0026schedule=rtmp\u0026pflag=11", - "new_link": "https://core.bilivideo.com/video/uplinkcore/selfbuild/schedule?up_rtmp=live-push.bilivideo.com%2Flive-bvc%2F%3Fstreamname%3Dlive_348892132_32373699%26key%3De10298d4a7539d8eaa322dc4d220ca1c%26schedule%3Drtmp%26pflag%3D11\u0026edge=edge", - "provider": "txy" - } - ], - "notice":{ - "type": 1, - "status": 0, - "title": "", - "msg": "", - "button_text": "", - "button_url": "" - }, - "qr": "", - "need_face_auth": false, - "service_source": "live-streaming", - "rtmp_backup": null, - "up_stream_extra":{ - "isp": "电信" - } - }, - "message": "", - "msg": "" -} -``` - -</details> - -## 关闭直播 - -> https://api.live.bilibili.com/room/v1/Room/stopLive - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | -------------------- | -| platform | str | 直播平台 | 必要 | 直播姬(pc):pc_link<br />直播姬(android):android_link | -| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />65530:token错误(登录错误)<br />-400:没有权限<br />60034: 系统维护仅支持直播姬关播<br />**(其他错误码有待补充)** | -| msg | str | 提示信息 | 默认为空 | -| message | str | 提示信息 | 默认为空 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ---------------------- | -| change | num | 是否改变状态 | 0:未改变<br />1:改变 | -| status | str | 直播间状态 | `PREPARING`、`ROUND` | - -**示例:** - -关闭直播间`10352053`的直播 - -```shell -curl 'https://api.live.bilibili.com/room/v1/Room/stopLive' \ - --data-urlencode 'platform=pc_link' \ - --data-urlencode 'room_id=10352053' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "msg": "", - "message": "", - "data": { - "change": 1, - "status": "PREPARING" - } -} -``` - -</details> - -## 预更新直播间信息 - -> https://api.live.bilibili.com/xlive/app-blink/v1/preLive/UpdatePreLiveInfo - -*请求方法: POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | --- | ---- | ----- | --- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| platform | str | 平台标识 | 必要 | 似乎可随意提供<br />网页端: web | -| mobi_app | str | 平台标识? | 必要 | 似乎可随意提供<br />网页端: web | -| build | num | 构建标识? | 必要 | 建议取`1`,似乎可随意提供 | -| cover | str | 直播封面链接 | 非必要 | 图片链接需要在`.hdslb.com`域名下 | -| title | str | 直播间标题 | 非必要 | 参见[更新直播间信息](#更新直播间信息)的title参数 | -| coverVertical | str | (?) | 非必要 | 作用尚不明确 | -| liveDirectionType | num | (?) | 非必要 | `1` | -| visit_id | str | (?) | 非必要 | `""` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功<br />1: 错误<br />100402: 图片地址不合法 | -| message | str | 错误信息 | 成功时为`"0"` | -| ttl | num | `1` | | -| data | obj | 内容本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| audit_info | obj | 审核信息 | | - -`data.audit_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| audit_title | str | 被审核的标题 | | -| audit_title_status | num | 标题审核状态 | | -| audit_title_reason | str | 标题审核提示 | | - -**示例:** - -更新直播间封面 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/preLive/UpdatePreLiveInfo' \ - --data-urlencode 'platform=web' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'build=1' \ - --data-urlencode 'cover=https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "audit_info":{ - "audit_title": "", - "audit_title_status": 0, - "audit_title_reason": "" - } - } -} -``` - -</details> - -使用此接口更新直播间标题 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/preLive/UpdatePreLiveInfo' \ - --data-urlencode 'platform=web' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'build=1' \ - --data-urlencode 'title=你好你好,我是花火~咱们来找点乐子吧?小灰毛,不要害羞嘛,要大胆的来,一起欢愉吧' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "audit_info":{ - "audit_title": "你好你好,我是花火~咱们来找点乐子吧?小灰毛,不要害羞嘛,要大胆的来,一起欢愉吧", - "audit_title_status": 2, - "audit_title_reason": "先发后审" - } - } -} -``` - -</details> - -## 更新直播间公告 - -> https://api.live.bilibili.com/xlive/app-blink/v1/index/updateRoomNews - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | --------------------- | -| room_id | num | 直播间id | 必要 | 必须为自己的直播间id | -| uid | num | 用户id | 必要 | | -| content | str | 公告内容 | 必要 | 最大60个字符,可以为空 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| csrf_token | str | CSRF Token(位于 cookie) | | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />65530:token错误(登录错误)<br />1:错误 | -| data | array | 空 | | -| message | str | 错误信息 | 默认为ok | -| ttl | num | 1 | 作用尚不明确 | - -**示例:** - -修改直播间`11996900`公告为`测试修改公告` - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/index/updateRoomNews' \ ---data-urlencode 'room_id=11996900' \ ---data-urlencode 'uid=306903238' \ ---data-urlencode 'content=测试修改公告' \ ---data-urlencode 'csrf_token=xxx' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;bili_jct=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -</details> - -## PC直播姬版本号获取 -> https://api.live.bilibili.com/xlive/app-blink/v1/liveVersionInfo/getHomePageLiveVersion - -*请求方式:GET* - -认证方式:无 - -鉴权方式:无 - -**请求参数 (Query):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | --------------------- | -| appkey | str | APP密钥 | 不必要 |使用PC投稿工具的appkey和appsec| -| sign | str | APP API签名得到的sign | 不必要 | | -| system_version | num | 暂不清楚 | 必要 | 可以直接写2 | -| ts | num | 10位时间戳 | 不必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------------ | -| code | num | 返回值 | 0:成功<br />-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | -| data | obj | 内容本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------------------ | ---------------------- | -| curr_version | str | 直播姬最新版本号 | | -| build | num | 直播姬构建号 | | -| instruction | str | 更新说明(简要) | | -| file_size | str | 文件大小(字节) | | -| file_md5 | str | 安装包文件MD5 | | -| content | str | HTML格式的更新内容 | | -| download_url | str | 安装包下载链接 | | -| hdiffpatch_switch | num | 增量更新开关? | | - -**示例:** - -获取直播姬最新版本信息 - -```shell -curl 'https://api.live.bilibili.com/xlive/app-blink/v1/liveVersionInfo/getHomePageLiveVersion?appkey=aae92bc66f3edfab&sign=49d289e3ad34c509cc66fbee1c0affec&system_version=2&ts=1752971145' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "curr_version": "7.19.0.9432", - "build": 9432, - "instruction": "\u3010\u65b0\u589e\u3011\u65b0\u589e\u7f8e\u989c\u8c03\u6574\u5165\u53e3\n\u3010\u4f18\u5316\u3011\u5df2\u77e5\u95ee\u9898\u4f18\u5316", - "file_size": "300867136", - "file_md5": "e1619a8e2603aa94b58a58121f94403f", - "content": "<p>\u3010\u65b0\u589e\u3011\u65b0\u589e\u7f8e\u989c\u8c03\u6574\u5165\u53e3<br>\u3010\u4f18\u5316\u3011\u5df2\u77e5\u95ee\u9898\u4f18\u5316</p><p></p><p><br></p>", - "download_url": "https://dl.hdslb.com/bili/bililive/win/Livehime-Win-beta-7.19.0.9432-x64.exe", - "hdiffpatch_switch": 1 - } -} -``` - -</details> - - diff --git a/docs/live/message_stream.md b/docs/live/message_stream.md deleted file mode 100644 index be7c355..0000000 --- a/docs/live/message_stream.md +++ /dev/null @@ -1,7543 +0,0 @@ -# 直播间信息流 - -## 获取信息流认证秘钥 - -> https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo - -*请求方法: GET* - -认证方式: Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie中的`buvid3`不为空 - -可以选择进行认证,若未认证视作未登录,将会受到限制,详见后续内容。 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ---- | -| id | num | 直播间真实id | 必要 | | -| type | num | (?) | 非必要 | 作用尚不明确 | -| web_location | str | (?) | 非必要 | 作用尚不明确 | -| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | - -注: 从2025年5月26日开始正式强制要求Wbi签名,2025年6月27日开始要求`buvid3`。见[#1295](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1295) - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0: 成功<br />1: 错误<br />65530: token 错误 (登录错误)<br />60009: 分区不存在<br />1002002: 房间号错误<br />**(其他错误码有待补充)** | -| message | str | 错误信息 | 默认为空 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ----- | -------------------- | ---- | -| group | str | live | | -| business_id | num | 0 | | -| refresh_row_factor | num | 0.125 | | -| refresh_rate | num | 100 | | -| max_delay | num | 5000 | | -| token | str | 认证秘钥 | | -| host_list | array | 信息流服务器节点列表 | | - -`data.host_list[n]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| host | str | 服务器域名 | | -| port | num | TCP 端口 | | -| wss_port | num | WSS 端口 | | -| ws_port | num | WS 端口 | | - -**示例:** - -获得直播间 `1017` 的信息流认证秘钥 - -```shell -curl 'https://api.live.bilibili.com/xlive/web-room/v1/index/getDanmuInfo?id=1017&type=0&web_location=444.8&w_rid=cf24f88ea0cbb61e7b29aed0c070187d&wts=1748266797' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data":{ - "group": "live", - "business_id": 0, - "refresh_row_factor": 0.125, - "refresh_rate": 100, - "max_delay": 5000, - "token": "gZ2Pp2T4rIc2HfD0e53FHhQAwKWjb6-QDD84AcxXi8sk3S89XcdvPWOgClZIMZ5mESr19-JKTOFxayX4IjeSQuckWqohE5Y0aHn-agpc2uU7aPXW3-Xmra3QEKljMZS5fM3q2vCf2XcAsjc8Xup7MVAc8SLWWXhQz0s7f1alCkaJBAIPA-i2nS39Ri4O", - "host_list":[ - { - "host": "zj-cn-live-comet.chat.bilibili.com", - "port": 2243, - "wss_port": 2245, - "ws_port": 2244 - }, - { - "host": "zj-cn-live-comet.chat.bilibili.com", - "port": 2243, - "wss_port": 2245, - "ws_port": 2244 - }, - { - "host": "bd-sz-live-comet-14.chat.bilibili.com", - "port": 2243, - "wss_port": 2245, - "ws_port": 2244 - }, - { - "host": "bd-bj-live-comet-09.chat.bilibili.com", - "port": 2243, - "wss_port": 2245, - "ws_port": 2244 - }, - { - "host": "broadcastlv.chat.bilibili.com", - "port": 2243, - "wss_port": 2245, - "ws_port": 2244 - } - ] - } -} -``` - -</details> - -## 数据包格式 - -数据包为 MQ (Message Queue, 消息队列) 使用 WebSocket 或 TCP 连接作为通道, 具体格式为 头部数据 + 正文数据 - -**注: 特别的**, WS 与 WSS 连接地址带有路径 `/sub`, 如 `wss://broadcastlv.chat.bilibili.com:443/sub`. - -**再注:** B 站更新了隐私政策, 连接建立后, 若该连接认证时传入信息来自未登录用户, 会提示 `为保护用户隐私,未注册登陆用户将无法查看他人昵称`, 随后部分数据包(如“弹幕”、“用户交互消息”)的用户 mid 都为 `0`, 用户名部分也使用 `*` 保护, 部分房间受到豁免, 参见 [#732](https://github.com/SocialSisterYi/bilibili-API-collect/issues/732) - -操作流程 (伪代码): - -```javascript -const s = new Socket(uri); -// 认证包 -s.send('verify_hello'); -s.receive('verfiy_reply'); -// 心跳包 -setInterval(() => { - s.send('heartbeat'); - s.receive('heartbeat_reply'); -}, 30000); -// 接收普通包 -while (!s.isclosed()) { - s.receive('normal_package'); -} -``` - -头部格式: - -| 偏移量 | 长度 | 类型 | 含义 | -| ------ | ---- | ------ | ------------------------------------ | -| 0 | 4 | uint32 | 封包总大小 (头部大小 + 正文大小) | -| 4 | 2 | uint16 | 头部大小 (一般为 0x0010, 即 16 字节) | -| 6 | 2 | uint16 | 协议版本:<br />0: 普通包 (正文不使用压缩)<br />1: 心跳及认证包 (正文不使用压缩)<br />2: 普通包 (正文使用 zlib 压缩)<br/>3: 普通包 (使用 brotli 压缩的多个带文件头的普通包) | -| 8 | 4 | uint32 | 操作码 (封包类型) | -| 12 | 4 | uint32 | sequence, 每次发包时向上递增 | - -操作码: - -| 代码 | 含义 | -| ---- | ------------------- | -| 2 | 心跳包 | -| 3 | 心跳包回复 (人气值) | -| 5 | 普通包 (命令) | -| 7 | 认证包 | -| 8 | 认证包回复 | - -*普通包可能包含多条命令, 每个命令有一个头部, 指示该条命令的长度等信息* - -## 数据包 - -### 认证包 - -*方向: 上行* - -注: 连接成功后 5 秒内发送, 否则强制断开连接 - -再注: 若`uid`字段填写的是用户mid,则通过`获取信息流认证密钥`接口使用的认证信息所属用户mid必须与`uid`字段相同,并正确传递认证密钥,否则强制断开连接。 - -**JSON正文:** - -根对象: - -| 字段 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------ | ------ | --------------------------- | -| uid | num | 用户mid | 非必要 | 0 即为游客登录 | -| roomid | num | 加入房间的id | 必要 | 直播间真实id | -| protover | num | 协议版本 | 非必要 | 3, 与数据包头部协议版本无关 | -| platform | str | 平台标识 | 非必要 | `web` | -| type | num | 2 | 非必要 | | -| key | str | 认证秘钥 | 非必要 | | - -**示例:** - -```text -00000000: 0000 00ff 0010 0001 0000 0007 0000 0001 ................ -00000001: 7b22 7569 6422 3a31 3630 3134 3836 3234 {"uid":160148624 -00000002: 2c22 726f 6f6d 6964 223a 3232 3630 3831 ,"roomid":226081 -00000003: 3132 2c22 7072 6f74 6f76 6572 223a 332c 12,"protover":3, -00000004: 2270 6c61 7466 6f72 6d22 3a22 7765 6222 "platform":"web" -00000005: 2c22 7479 7065 223a 322c 226b 6579 223a ,"type":2,"key": -00000006: 2230 7670 5448 5737 7757 556e 6c6f 5270 "0vpTHW7wWUnloRp -00000007: 5251 6b47 764e 626e 7776 7364 6d2d 7159 RQkGvNbnwvsdm-qY -00000008: 4777 4243 5875 2d59 5164 6e57 7653 5547 GwBCXu-YQdnWvSUG -00000009: 7373 4139 7962 4b68 7932 6a78 3952 6f63 ssA9ybKhy2jx9Roc -0000000a: 4150 4651 6d54 4f6b 5277 6b4b 687a 4479 APFQmTOkRwkKhzDy -0000000b: 4839 5054 756f 5468 6834 4630 7562 584c H9PTuoThh4F0ubXL -0000000c: 4964 6e69 3734 5539 304b 4242 6972 3248 Idni74U90KBBir2H -0000000d: 7451 3941 3777 674b 3438 4b7a 495f 5a5a tQ9A7wgK48KzI_ZZ -0000000e: 3838 7557 4e59 6652 4f48 6964 4e6a 3732 88uWNYfROHidNj72 -0000000f: 7061 796e 3479 3071 4268 513d 3d22 7d payn4y0qBhQ=="} -``` - -### 认证包回复 - -*方向: 下行* - -注: 在认证包发送成功后就会收到 JSON 正文, 若失败则返回 HTTP/0.9 的 403 - -**JSON正文:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ----------- | -| code | num | 返回值 | 0: 认证成功 | - -**示例:** - -```text -00000000: 0000 001a 0010 0001 0000 0008 0000 0001 ................ -00000001: 7b22 636f 6465 223a 307d {"code":0} -``` - -### 心跳包 - -*方向: 上行* - -注: 30 秒左右发送一次, 否则 60 秒后会被强制断开连接 - -**正文:** - -可以为空或任意字符 - -**示例:** - -```text -00000000: 0000 001f 0010 0001 0000 0002 0000 0001 ................ -00000001: 5b6f 626a 6563 7420 4f62 6a65 6374 5d [object Object] -``` - -### 心跳包回复 (人气值) - -*方向: 下行* - -注: 在心跳包发送成功后就会收到 - -**正文:** - -正文分为两个部分 - -- 第一部分: uint32 整数代表的房间当前的人气值 - -- 第二部分: 心跳包正文内容 - -**示例:** - -示例房间内人气值为 2466 (0x000009a2) - -```text -00000000: 0000 0014 0010 0001 0000 0003 0000 0000 ................ -00000001: 0000 09a2 5b6f 626a 6563 7420 4f62 6a65 ....[object Obje -00000002: 6374 5d ct] -``` - -### 普通包 - -*方向: 下行* - -**正文:** - -一般为普通 JSON 数据 - -大多数普通包都经过 zlib 或 brotli 压缩 - -**示例:** - -```text -00000000: 0000 0086 0010 0003 0000 0005 0000 0000 ................ -00000001: 8b38 8000 0000 7200 1000 0000 0000 0500 .8....r......... -00000002: 0000 007b 2263 6d64 223a 2257 4154 4348 ...{"cmd":"WATCH -00000003: 4544 5f43 4841 4e47 4522 2c22 6461 7461 ED_CHANGE","data -00000004: 223a 7b22 6e75 6d22 3a32 3230 3937 2c22 ":{"num":22097," -00000005: 7465 7874 5f73 6d61 6c6c 223a 2232 2e32 text_small":"2.2 -00000006: e4b8 8722 2c22 7465 7874 5f6c 6172 6765 ...","text_large -00000007: 223a 2232 2e32 e4b8 87e4 baba e79c 8be8 ":"2.2.......... -00000008: bf87 227d 7d03 .."}}. -``` - -<!-- 2 年前的索引, 留作纪念, 不会增加新的内容 - -- [弹幕](#弹幕) -- [进场或关注消息](#进场或关注消息) -- [送礼](#送礼) -- [礼物星球点亮](#礼物星球点亮) -- [礼物连击](#礼物连击) -- [通知消息](#通知消息) -- [主播准备中](#主播准备中) -- [直播开始](#直播开始) -- [主播信息更新](#主播信息更新) -- [直播间高能榜](#直播间高能榜) -- [直播间高能用户数量](#直播间高能用户数量) -- [用户到达直播间高能榜前三名的消息](#用户到达直播间高能榜前三名的消息) -- [直播间用户点赞](#直播间用户点赞) -- [直播间点赞数](#直播间点赞数) -- [直播间发红包弹幕](#直播间发红包弹幕) -- [直播间红包](#直播间红包) -- [直播间抢到红包的用户](#直播间抢到红包的用户) -- [直播间看过人数](#直播间看过人数) -- [用户进场特效](#用户进场特效) -- [直播间在所属分区的排名改变](#直播间在所属分区的排名改变) -- [直播间在所属分区排名提升的祝福](#直播间在所属分区排名提升的祝福) -- [直播间信息更改](#直播间信息更改) -- [醒目留言按钮](#醒目留言按钮) -- [顶部横幅](#顶部横幅) -- [下播的直播间](#下播的直播间) -- [未知消息](#未知消息) - ---> - -#### 弹幕 (DANMU_MSG) - -注: 当收到弹幕时接收到此条消息, 10 进制转 16 进制若位数不足则在左侧补 `0` - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ----------- | ---- | -| cmd | str | `DANMU_MSG` | | -| dm_v2 | str | 空串? | | -| info | array | 弹幕信息 | 感谢 [#1084](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1084) 补充 | -| msg_id | str | 弹幕id? | 极低概率存在 | -| p_is_ack | bool | | 极低概率存在 | -| p_msg_type | num | | 极低概率存在 | -| send_time | num | 发送时间戳 | Unix 毫秒时间戳,极低概率存在 | - -`info` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ----- | ------------------ | ---- | -| 0 | array | 弹幕信息 | 大部分信息可从 `info[0][15].extra` 获取 | -| 1 | str | 弹幕文本 | | -| 2 | array | 发送者信息 | 大部分信息可从 `info[0][15].user` 获取 | -| 3 | array | 发送者粉丝勋章信息 | 若无则为空 | -| 4 | array | 发送者UL等级信息 | | -| 5 | array | ? | | -| 6 | num | 0? | | -| 7 | num | 0? | | -| 8 | null | | | -| 9 | obj | 发送时间戳 | | -| 10 | num | 0? | | -| 11 | num | 0? | | -| 12 | null | | | -| 13 | null | | | -| 14 | num | 0? | | -| 15 | num | ? | | -| 16 | array | ? | | - -`info[0]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ------------------------ | ---- | -| 0 | num | | | -| 1 | num | 弹幕模式 | 弹幕的 mode 字段 | -| 2 | num | 弹幕字体大小 | 弹幕的 fontsize 字段 | -| 3 | num | 弹幕颜色 | 弹幕的 color 字段<br />十六进制颜色值的十进制数字 | -| 4 | num | 发送时的 UNIX 毫秒时间戳 | 弹幕的 rnd 字段 | -| 5 | num | | 一个负整数 | -| 6 | num | 0? | | -| 7 | str | 可能为颜色? | 一个 16 进制数 | -| 8 | num | 0? | | -| 9 | num | 0? | | -| 10 | num | 0? | | -| 11 | str | 空串? | | -| 12 | num | 0? | | -| 13 | str | 字符串表示的 JSON Object | 空? | -| 14 | str | 字符串表示的 JSON Object | 空? | -| 15 | obj | 弹幕补充信息 | | -| 16 | obj | 活动相关信息? | | -| 17 | num | 0? | | -| 18 | null | | | - -`info[0][15]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ------------ | ---- | -| extra | str | 弹幕信息 | 字符串表示的 JSON | -| mode | num | 弹幕模式? | | -| show_player_type | num | 0? | | -| user | obj | 用户相关信息 | | - -`info[0][15].extra` 表示的对象: - -见下方 JSONC - -```jsonc -{ - "send_from_me": false, // 是否由该接收消息的用户发送 - "mode": 0, // 弹幕模式 (info[0][1]) - "color": 9920249, // 弹幕颜色 (info[0][3]) - "dm_type": 0, - "font_size": 25, // 弹幕字体大小 (info[0][2]) - "player_mode": 1, - "show_player_type": 0, - "content": "白花300块[热]", // 弹幕文本 (info[1]) - "user_hash": "197700816", - "emoticon_unique": "", - "bulge_display": 0, - "recommend_score": 3, - "main_state_dm_color": "", - "objective_state_dm_color": "", - "direction": 0, // 弹幕方向? - "pk_direction": 0, - "quartet_direction": 0, - "anniversary_crowd": 0, - "yeah_space_type": "", - "yeah_space_url": "", - "jump_to_url": "", - "space_type": "", - "space_url": "", - "animation": {}, - "emots": { // 表情相关信息 (用于文本替换) - "[热]": { - "count": 1, - "descript": "[热]", - "emoji": "[热]", - "emoticon_id": 278, - "emoticon_unique": "emoji_278", - "height": 20, - "url": "http://i0.hdslb.com/bfs/live/6df760280b17a6cbac8c1874d357298f982ba4cf.png", - "width": 20 - } - }, - "is_audited": false, - "id_str": "364b06e3c561af3d5921f1253d66c1d575", - "icon": { - "prefix": { - "type": 1, - "resource": "ChronosWealth_4.png" - } - }, - "show_reply": true, // 显示回复? - "reply_mid": 0, - "reply_uname": "", - "reply_uname_color": "", - "reply_is_mystery": false, - "hit_combo": 0 -} -``` - -`info[0][15].user` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------- | ---- | -| base | obj | 基本信息 | | -| guard | null | | | -| guard_leader | obj | ? | | -| medal | obj | 粉丝排信息 | 参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) `data.list[n].uinfo_medal` | -| title | obj | ? | | -| uhead_frame | null | | | -| uid | num | 发送者 mid | | -| wealth | null | | | - -`info[0][15].user.base` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------- | ------- | -| face | str | 发送者头像 URL | | -| is_mystery | bool | 是否是神秘用户? | | -| name | str | 发送者用户名 | | -| name_color | num | 用户名颜色 | 10 进制 | -| name_color_str | num | 字符串表示的颜色 | | -| offical_info | obj | 认证信息 | 参见 [用户空间详细信息](../user/info.md#用户空间详细信息) `data.official` | -| origin_info | obj | 同 `face` `name` | | -| risk_ctrl_info | null | | | - -`info[0][15].user.title` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ----- | ---- | -| old_title_css_id | str | 空串? | | -| title_css_id | str | 空串? | | - -`info[0][16]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ----- | ---- | -| activity_identity | str | 空串? | | -| activity_source | num | 0? | | -| not_show | num | 0? | | - -`info[2]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ------------- | ---- | -| 0 | num | 发送者 mid | 同 `info[0][15].user.uid` | -| 1 | str | 发送者用户名 | 同 `info[0][15].user.base.name` | -| 2 | num | 0? | | -| 3 | num | 0? | | -| 4 | num | 0? | | -| 5 | num | 用户权限等级? | 参见 [用户空间详细信息](../user/info.md#用户空间详细信息) `data.rank` | -| 6 | num | ? | | - -`info[3]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---------------------------------------- | ---- | -| 0 | num | 同 `info[0][15].user.medal.level` | | -| 1 | str | 同 `info[0][15].user.medal.name` | | -| 2 | str | 粉丝牌创建主播名称 | | -| 3 | num | ? | | -| 4 | num | 同 `info[0][15].user.medal.color` | | -| 5 | str | 空串? | | -| 6 | num | 0? | | -| 7 | num | 同 `info[0][15].user.medal.color_border` | | -| 8 | num | 同 `info[0][15].user.medal.color_start` | | -| 9 | num | 同 `info[0][15].user.medal.color_end` | | -| 10 | num | 同 `info[0][15].user.medal.guard_level` | | -| 11 | num | 同 `info[0][15].user.medal.is_light` | | -| 12 | num | 同 `info[0][15].user.medal.ruid` | | - -`info[4]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---- | ---- | -| 0 | num | ? | | -| 1 | num | ? | | -| 2 | num | ? | | -| 3 | num | ? | | -| 4 | num | ? | | - -`info[5]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ----- | ---- | -| 0 | str | 空串? | | -| 1 | str | 空串? | | - -`info[9]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | --------------- | -| ct | str | ? | 16 进制 | -| ts | num | 发送时间 | UNIX 秒级时间戳 | - -`info[16]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---- | ---- | -| 0 | num | ? | | - -**示例:** - -<details> -<summary>查看消息示例(带注释):</summary> - -```jsonc -{ - "cmd": "DANMU_MSG", - "dm_v2": "", - "info": [ - [ - 0, - 1, - 25, //字体大小 - 9920249, //弹幕颜色代码(10进制)#975ef9 - 1723979200649, - -1312973962, - 0, - "0bc8acd0", - 0, - 0, - 0, - "", - 0, - "{}", - "{}", - { - "extra": "{\"send_from_me\":false,\"mode\":0,\"color\":9920249,\"dm_type\":0,\"font_size\":25,\"player_mode\":1,\"show_player_type\":0,\"content\":\"白花300块[热]\",\"user_hash\":\"197700816\",\"emoticon_unique\":\"\",\"bulge_display\":0,\"recommend_score\":3,\"main_state_dm_color\":\"\",\"objective_state_dm_color\":\"\",\"direction\":0,\"pk_direction\":0,\"quartet_direction\":0,\"anniversary_crowd\":0,\"yeah_space_type\":\"\",\"yeah_space_url\":\"\",\"jump_to_url\":\"\",\"space_type\":\"\",\"space_url\":\"\",\"animation\":{},\"emots\":{\"[热]\":{\"count\":1,\"descript\":\"[热]\",\"emoji\":\"[热]\",\"emoticon_id\":278,\"emoticon_unique\":\"emoji_278\",\"height\":20,\"url\":\"http://i0.hdslb.com/bfs/live/6df760280b17a6cbac8c1874d357298f982ba4cf.png\",\"width\":20}},\"is_audited\":false,\"id_str\":\"364b06e3c561af3d5921f1253d66c1d575\",\"icon\":{\"prefix\":{\"type\":1,\"resource\":\"ChronosWealth_4.png\"}},\"show_reply\":true,\"reply_mid\":0,\"reply_uname\":\"\",\"reply_uname_color\":\"\",\"reply_is_mystery\":false,\"hit_combo\":0}", - "mode": 0, - "show_player_type": 0, - "user": { - "base": { - "face": "https://i1.hdslb.com/bfs/face/5a9bb9cac3afbb58347c808ae76aaa41ca967d07.jpg", //弹幕发送用户头像 - "is_mystery": false, - "name": "tim1997", //弹幕发送用户名称 - "name_color": 0, - "name_color_str": "", - "official_info": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "origin_info": { - "face": "https://i1.hdslb.com/bfs/face/5a9bb9cac3afbb58347c808ae76aaa41ca967d07.jpg", - "name": "tim1997" - }, - "risk_ctrl_info": null - }, - "guard": null, - "guard_leader": { - "is_guard_leader": false - }, - "medal": { - "color": 2951253, //粉丝牌颜色(10进制)#2d0855 - "color_border": 16771156, //粉丝牌边框颜色(10进制)#ffe854 - "color_end": 10329087, //粉丝牌渐变颜色结束(10进制)#9d9bff - "color_start": 2951253, //粉丝牌渐变颜色开始(10进制)#2d0855 - "guard_icon": "https://i0.hdslb.com/bfs/live/1d16bf0fcc3b1b768d1179d60f1fdbabe6ab4489.png", //粉丝牌左边的图标 - "guard_level": 1, //类型 1.总督 2.提督 3,舰长 - "honor_icon": "", - "id": 1279130, - "is_light": 1, - "level": 29, //粉丝牌等级 - "name": "果咩吖", //粉丝牌名称 - "ruid": 3546569288714792, //粉丝牌创建者UID - "score": 50427312, - "typ": 0, - "user_receive_count": 0, - "v2_medal_color_border": "#D47AFFFF", //粉丝牌边框颜色(APP) - "v2_medal_color_end": "#9660E5CC", //粉丝牌渐变颜色结束(APP) - "v2_medal_color_level": "#6C00A099", //粉丝牌右边等级数字颜色(APP) - "v2_medal_color_start": "#9660E5CC", //粉丝牌渐变颜色开始(APP) - "v2_medal_color_text": "#FFFFFFFF" //粉丝牌右边圆形颜色(APP) - }, - "title": { - "old_title_css_id": "", - "title_css_id": "" - }, - "uhead_frame": null, - "uid": 6088969, //弹幕发送用户UID - "wealth": null - } - }, - { - "activity_identity": "", - "activity_source": 0, - "not_show": 0 - }, - 0 - ], - "白花300块[热]", //弹幕内容 - [ - 6088969, //同info[0][15].user.uid - "tim1997", //同info[0][15].user.base.name - 0, - 0, - 0, - 10000, - 1, - "" - ], - [ - 29, //同info[0][15].user.medal.level - "果咩吖", //同info[0][15].user.medal.name - "果宝Official", //粉丝牌创建主播名称 - 31180317, - 2951253, //同info[0][15].user.medal.color - "", - 0, - 16771156, //同info[0][15].user.medal.color_border - 2951253, //同info[0][15].user.medal.color_start - 10329087, //同info[0][15].user.medal.color_end - 1, //同info[0][15].user.medal.guard_level - 1, //同info[0][15].user.medal.is_light - 3546569288714792 //同info[0][15].user.medal.ruid - ], - [ - 39, - 0, - 10512625, - 42523, - 2 - ], - [ - "", - "" - ], - 0, - 0, - null, - { - "ct": "AFFF4206", - "ts": 1723979200 //时间戳(秒级) - }, - 0, - 0, - null, - null, - 0, - 1040, - [ - 49 - ], - null - ] -} -``` - -</details> - -#### 交互信息合并 (DM_INTERACTION) - -注: 连续多条相同弹幕时触发 - -**JSON正文:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | ---- | -| cmd | str | `DM_INTERACTION` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| id | num | 事件 ID | | -| status | num | 状态 | | -| type | num | 事件类型 | 101:投票<br />102:弹幕<br />103:关注<br />104:送礼<br />105:分享<br />106:点赞 | -| data | str | 事件数据 | 一个JSON字符串 | -| dmsource | num | | | - -`data.data` 字符串对象: - -内容格式取决于`data.type`的类型,下面将按照`data.data(类型)`进行区分标记。 - -温馨提示: 要记得先解析`data.data`内的JSON字符串,不要直接使用哦。 - -`data.data(101)` 对象: (投票) - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| question | str | 投票问题 | | -| options | obj | 投票详细选项 | | -| vote_id | num | 投票id | | -| cnt | num | 弹幕计数 | | -| duration | num | 持续时间 | 单位毫秒 | -| left_duration | num | 剩余时间 | 单位毫秒 | -| fade_duration | num | (?) | | -| waiting_duration | num | (?) | | -| result | num | 投票倾向状态 | | -| result_text | str | 投票倾向提示 | | -| component | str | 投票链接 | | -| natural_die_duration | num | (?) | | -| my_vote | num | (?) | | -| component_anchor | str | 投票控制链接 | | -| audit_reason | str | 审核结果 | | -| combo | obj | 投票状态展示 | | - -`data.data(101).options` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| idx | num | 选项索引 | | -| desc | str | 选项内容 | | -| cnt | num | 票数 | | -| percent | num | 显示占比 | | - -`data.data(101).combo` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 标识id | 同`data.data.options`数组中对象的`idx` | -| status | num | 状态 | 同`data.status` | -| content | str | 投票选项内容 | | -| cnt | str | 弹幕计数 | | -| guide | str | (?) | 空字符串 | -| left_duration | num | 剩余时间 | | -| fade_duration | num | (?) | | -| prefix_icon | str | 投票选项图标 | | - -`data.data(102)` 对象: (弹幕) - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ----- | -------------------- | ---- | -| combo | array | 连续发送弹幕事件信息 | | -| merge_interval | num | 合并弹幕时间间隔 | | -| card_appear_interval | num | 弹窗出现时间间隔 | | -| send_interval | num | 发送时间间隔 | | - -`data.data(102).combo[n]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------- | ------------- | -| id | num | 标识 ID | | -| status | num | 状态 | | -| content | str | 重复的弹幕内容 | | -| cnt | num | 重复数量 | | -| guide | str | 标题词 | "他们都在说:" | -| left_duration | num | 左移时长 | | -| fade_duration | num | 淡化时长 | | - -`data.data(103)` 对象: (关注) - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| fade\_duration | num | | | -| cnt | num | 关注计数 | | -| card_appear_interval | num | | | -| suffix\_text | str | 提示文本 | `人关注了主播` | -| reset\_cnt | num | | | -| display\_flag | num | | | - -`data.data(104)` 对象: (送礼) - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| fade\_duration | num | | | -| cnt | num | 投喂计数 | | -| card_appear_interval | num | | | -| suffix\_text | str | 提示文本 | `人在投喂` | -| reset\_cnt | num | | | -| display\_flag | num | | | -| gift\_id | num | 礼物 ID | | -| gift_alert_message | str | | | - -`data.data(105)` 对象: (分享) - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| fade\_duration | num | | | -| cnt | num | 分享计数 | | -| card_appear_interval | num | | | -| suffix\_text | str | 提示文本 | `人分享了直播间` | -| reset\_cnt | num | | | -| display\_flag | num | | | - -`data.data(106)` 对象: (点赞) - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| fade\_duration | num | | | -| cnt | num | 点赞计数 | | -| card_appear_interval | num | | | -| suffix\_text | str | 提示文本 | `人正在点赞` | -| reset\_cnt | num | | | -| display\_flag | num | | | - -**示例:** - -<details> -<summary>查看正文示例:</summary> - -type===101 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "data": "{\"question\":\"投票\",\"options\":[{\"idx\":1,\"desc\":\"赞成\",\"cnt\":0,\"percent\":0.5},{\"idx\":2,\"desc\":\"弃权\",\"cnt\":0,\"percent\":0.5}],\"vote_id\":98014370742272,\"cnt\":0,\"duration\":60000,\"left_duration\":60000,\"fade_duration\":1000,\"waiting_duration\":-1,\"result\":1,\"result_text\":\"平局\",\"component\":\"https://live.bilibili.com/p/html/live-app-guessing-game/vote.html?is_live_half_webview=1\\u0026hybrid_half_ui=1,3,100p,245,0,0,30,100,12,0;2,2,375,100p,0,0,30,100,12,0;3,3,100p,245,0,0,30,100,12,0;4,2,375,100p,0,0,30,100,12,0;5,3,100p,70p,0,0,30,100,12,0;6,3,100p,70p,0,0,30,100,12,0;7,3,100p,70p,0,0,30,100,12,0;8,3,100p,70p,0,0,30,100,12,0\",\"natural_die_duration\":30000,\"my_vote\":0,\"component_anchor\":\"https://live.bilibili.com/p/html/live-app-guessing-game/anchor_vote.html?pc_ui=390,428,0,3\\u0026is_live_half_webview=1\\u0026hybrid_half_ui=1,3,100p,448,0,0,30,0,12,0;2,2,375,100p,0,0,30,0,12,0;3,3,100p,448,0,0,30,0,12,0;4,2,375,100p,0,0,30,0,12,0;5,3,100p,448,0,0,30,0,12,0;6,2,320,100p,0,0,30,0,12,0;7,2,320,100p,0,0,30,0,12,0;8,2,320,100p,0,0,30,0,12,0#/\",\"audit_reason\":\"您提交的弹幕投票未审核通过,请修改\",\"combo\":[{\"id\":1,\"status\":2,\"content\":\"赞成\",\"cnt\":0,\"guide\":\"\",\"left_duration\":60000,\"fade_duration\":0,\"prefix_icon\":\"http://i0.hdslb.com/bfs/dm/7d7e3682c9116aa3503418abe3cde6b45ed2e91e.png\"},{\"id\":2,\"status\":2,\"content\":\"弃权\",\"cnt\":0,\"guide\":\"\",\"left_duration\":60000,\"fade_duration\":0,\"prefix_icon\":\"http://i0.hdslb.com/bfs/dm/f83c7280b2a90b4f58a68fd8c594ea7d5667e3cb.png\"}]}", - "dmscore": 36, - "id": 98014370742272, - "status": 2, - "type": 101 - } -} -``` - -type===102 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "id": 6785480089600, - "status": 4, - "type": 102, - "data": { - "combo": [ - { - "id": 6785480089600, - "status": 4, - "content": "晚安", - "cnt": 3, - "guide": "他们都在说:", - "left_duration": 20000, - "fade_duration": 60000 - } - ], - "merge_interval": 1000, - "card_appear_interval": 1000, - "send_interval": 1000 - } - } -} -``` - -type===103 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "data": "{\"fade_duration\":10000,\"cnt\":6,\"card_appear_interval\":0,\"suffix_text\":\"人关注了主播\",\"reset_cnt\":0,\"display_flag\":1}", - "dmscore": 36, - "id": 94362402889728, - "status": 4, - "type": 103 - } -} -``` - -type===104 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "data": "{\"fade_duration\":10000,\"cnt\":5,\"card_appear_interval\":0,\"suffix_text\":\"人在投喂\",\"reset_cnt\":0,\"display_flag\":1,\"gift_id\":33988,\"gift_alert_message\":\"投喂一个%s支持主播\"}", - "dmscore": 36, - "id": 85744481752576, - "status": 5, - "type": 104 - } -} -``` - -type===105 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "data": "{\"fade_duration\":10000,\"cnt\":1,\"card_appear_interval\":0,\"suffix_text\":\"人分享了直播间\",\"reset_cnt\":0,\"display_flag\":1}", - "dmscore": 36, - "id": 85743053669888, - "status": 4, - "type": 105 - } -} -``` - -type===106 - -```json -{ - "cmd": "DM_INTERACTION", - "data": { - "data": "{\"fade_duration\":10000,\"cnt\":11,\"card_appear_interval\":0,\"suffix_text\":\"人正在点赞\",\"reset_cnt\":1,\"display_flag\":1}", - "dmscore": 36, - "id": 66159395305984, - "status": 5, - "type": 106 - } -} -``` - -</details> - -#### 用户交互消息 (INTERACT_WORD) - -注: 有用户进入直播间、关注主播、分享直播间时触发 - -已被`INTERACT_WORD_V2`替换。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `INTERACT_WORD` | | -| data | obj | 用户交互信息 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| contribution | obj | 待调查 | | -| dmscore | num | 待调查 | | -| fans_medal | obj | 粉丝勋章 | | -| identities | num | 待调查 | | -| is_spread | num | 待调查 | | -| msg_type | num | 1为进场,2为关注,3为分享 | | -| roomid | num | 房间号 | | -| is_spread | num | 待调查 | | -| is_spread | num | 待调查 | | -| score | num | 待调查 | | -| spread_desc | str | 待调查 | | -| spread_info | str | 待调查 | | -| tail_icon | num | 待调查 | | -| timestamp | num | 时间戳 | | -| trigger_time | num | 触发时间 | | -| uid | num | 用户ID | | -| uname | str | 用户名称 | | -| uname_color | str | 用户名称颜色 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "INTERACT_WORD", - "data": { - "contribution": { - "grade": 0 - }, - "dmscore": 4, - "fans_medal": { - "anchor_roomid": 890976, - "guard_level": 0, - "icon_id": 0, - "is_lighted": 0, - "medal_color": 6067854, - "medal_color_border": 12632256, - "medal_color_end": 12632256, - "medal_color_start": 12632256, - "medal_level": 1, - "medal_name": "小豆皮", - "score": 134, - "special": "", - "target_id": 6574487 - }, - "identities": [ - 1 - ], - "is_spread": 0, - "msg_type": 1, - "roomid": 24143902, - "score": 1644563948936, - "spread_desc": "", - "spread_info": "", - "tail_icon": 0, - "timestamp": 1644563948, - "trigger_time": 1644563947876475000, - "uid": 335979315, - "uname": "TIM_Init", - "uname_color": "" - } -} -``` - -</details> - -#### 用户交互消息V2 (INTERACT_WORD_V2) - -注: 该cmd已将`INTERACT_WORD`替换 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `INTERACT_WORD_V2` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dmscore | num | | | -| pb | str | 使用 base64 编码 protobuf 后的数据 | 解析后数据基本与`INTERACT_WORD`的`data`相同 | - -用于解析protobuf数据的proto文件: [#1332(comment)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1332#issuecomment-3047237367) - -注: 先用 base64 解码 `data.pb` 内的字符串为字节数据pb,再使用proto文件解码pb数据。 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "INTERACT_WORD_V2", - "data": { - "dmscore": 3, - "pb": "CJTwwNEBEgpTdGFyU2VhMjQ2IgIDASgBMNWgITispaTDBkDUubHe/jJKLAiv8CkQEhoG55Sf5oCBIKS6ngYopLqeBjCkup4GOKS6ngZAAWDVoCFo9JQRYgB4gZ/v1tmc1qcYmgEAsgHPAQiU8MDRARJYCgpTdGFyU2VhMjQ2EkpodHRwczovL2kwLmhkc2xiLmNvbS9iZnMvZmFjZS8xMDliNzg3YzVmMTEzYzRhM2M3NDE1YmI5YmY2YjgyYmMzM2JjNGUyLmpwZxpnCgbnlJ/mgIEQEhikup4GIKS6ngYopLqeBjCkup4GOP/hAUgBUK/wKWD0lBF6CSNEQzZCNkI5OYIBCSNEQzZCNkI5OYoBCSNEQzZCNkI5OZIBCSNGRkZGRkZGRpoBCSM4MTAwMUY5OSICCAkyALoBAA==" - } -} -``` - -</details> - -#### 上舰通知 (GUARD_BUY) - -注: 当有用户购买 舰长 / 提督 / 总督 时 - -**JSON消息:** - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| cmd | str | `GUARD_BUY` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|--------------------------|-----| -| uid | num | 用户ID | | -| username | str | 用户名称 | | -| guard_level | num | 大航海等级 | 1: 总督<br />2: 提督<br />3:舰长 | -| num | num | 数量 | | -| price | num | 原金瓜子标价 | 即 CNY\*1000 | -| gift_id | num | 礼物id | | -| gift_name | str | 礼物名称 | | -| start_time | num | 待调查 | | -| end_time | num | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "GUARD_BUY", - "data": { - "uid": 14225357, - "username": "妙妙喵喵妙妙喵O_O", - "guard_level": 3, - "num": 1, - "price": 198000, - "gift_id": 10003, - "gift_name": "舰长", - "start_time": 1677069316, - "end_time": 1677069316 - } -} -``` - -</details> - -#### 用户庆祝消息 (USER_TOAST_MSG) - -注: 用户购买 舰长 / 提督 / 总督 后的庆祝消息, 内容包含用户陪伴天数 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | ---- | -| cmd | str | `USER_TOAST_MSG` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|--------------------------|-----| -| anchor_show | bool | 是否显示 | | -| color | str | 颜色 | | -| dmscore | num | 待调查 | | -| effect_id | num | 待调查 | | -| face_effect_id | num | 待调查 | | -| gift_id | num | 礼物id | | -| group_name | str | 待调查 | | -| group_op_type | num | 待调查 | | -| group_role_name | str | 待调查 | | -| guard_level | num | 大航海等级 | 1: 总督<br />2:<br />提督<br />3:舰长 | -| is_group | num | 待调查 | | -| is_show | num | 待调查 | | -| num | num | 上舰个数 | | -| op_type | num | 待调查 | | -| payflow_id | str | 待调查 | | -| price | num | 实际金瓜子标价 | 即 CNY\*1000 | -| role_name | str | 身份名称 | | -| room_effect_id | num | 待调查 | | -| room_group_effect_id | num | 待调查 | | -| start_time | num | 待调查 | | -| svga_block | num | 待调查 | | -| target_guard_count | str | 庆祝消息正文 | | -| toast_msg | num | 待调查 | | -| uid | num | 上舰人UID | | -| unit | str | 购买身份时间单位 | | -| user_show | bool | 待调查 | | -| username | str | 上舰人用户名 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "USER_TOAST_MSG", - "data": { - "anchor_show": true, - "color": "#00D1F1", - "dmscore": 90, - "effect_id": 397, - "end_time": 1702580687, - "face_effect_id": 44, - "gift_id": 10003, - "group_name": "", - "group_op_type": 0, - "group_role_name": "", - "guard_level": 3, - "is_group": 0, - "is_show": 0, - "num": 1, - "op_type": 1, - "payflow_id": "2312150304155852173446521", - "price": 138000, - "role_name": "舰长", - "room_effect_id": 590, - "room_group_effect_id": 1337, - "start_time": 1702580687, - "svga_block": 0, - "target_guard_count": 146, - "toast_msg": "<%无光之日%> 在主播Mia米娅-的直播间开通了舰长,今天是TA陪伴主播的第1天", - "uid": 79667344, - "unit": "月", - "user_show": true, - "username": "无光之日" - } -} -``` - -</details> - -#### 醒目留言 (SUPER_CHAT_MESSAGE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | --------------------- | ---- | -| cmd | str | `SUPER_CHAT_MESSAGE` | | -| data | obj | 信息本体 | | -| roomid | num | 直播间房间号 (非短号) | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|----------------| --------- | -| background_bottom_color | str | 待调查 | | -| background_color | str | 待调查 | | -| background_color_end | str | 待调查 | | -| background_color_start | str | 待调查 | | -| background_icon | str | 待调查 | | -| background_image | str | 待调查 | | -| background_price_color | str | 待调查 | | -| color_point | num | 待调查 | | -| dmscore | num | 待调查 | | -| end_time | num | 待调查 | | -| gift | obj | 礼物信息 | | -| id | num | 醒目留言 ID | | -| is_ranked | num | 待调查 | | -| is_send_audit | num | 待调查 | | -| medal_info | obj | SC发送用户佩戴的粉丝牌信息 | | -| message | str | sc内容 | | -| message_font_color | str | SC文本颜色 | | -| message_trans | str | 机翻sc内容 | | -| price | num | sc金额 | 为 CNY 价值 | -| rate | num | 待调查 | | -| start_time | num | 待调查 | | -| time | num | sc持续时间 | | -| token | num | 待调查 | | -| trans_mark | num | 待调查 | | -| ts | num | 待调查 | | -| uid | num | 发送用户uid | | -| user_info | obj | 发送用户信息 | | - -`data.gift` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|------|------| -| gift_id | num | 礼物id | | -| gift_name | str | 礼物名称 | 一般均为"醒目留言" | -| num | num | 数量 | | - -`data.medal_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|-------------|------| -| anchor_roomid | num | 房间号 | 包含短号 | -| anchor_uname | str | 主播昵称 | | -| guard_level | num | 大航海等级 | 1: 总督<br/>2: 提督<br />3: 舰长 | -| icon_id | num | 待调查 | | -| is_lighted | num | 待调查 | | -| medal_color | str | 待调查 | | -| medal_color_border | num | 待调查 | | -| medal_color_end | num | 待调查 | | -| medal_color_start | num | 待调查 | | -| medal_level | num | 粉丝牌等级 | | -| medal_name | str | 粉丝牌名称 | | -| special | str | 待调查 | | -| target_id | num | 粉丝牌对应的主播mid | | - -`data.user_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- |-----|-------|------| -| face | num | 用户头像 | | -| face_frame | num | 头像边框 | | -| guard_level | num | 大航海等级 | 1: 总督<br />2: 提督<br />3: 舰长 | -| is_main_vip | num | 待调查 | | -| is_svip | num | 待调查 | | -| is_vip | num | 待调查 | | -| level_color | str | 待调查 | | -| manager | num | 待调查 | | -| name_color | str | 待调查 | | -| title | str | 待调查 | | -| uname | str | 用户名称 | | -| user_level | num | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SUPER_CHAT_MESSAGE", - "data": { - "background_bottom_color": "#2A60B2", - "background_color": "#EDF5FF", - "background_color_end": "#405D85", - "background_color_start": "#3171D2", - "background_icon": "", - "background_image": "https://i0.hdslb.com/bfs/live/a712efa5c6ebc67bafbe8352d3e74b820a00c13e.png", - "background_price_color": "#7497CD", - "color_point": 0.7, - "dmscore": 120, - "end_time": 1677069095, - "gift": { - "gift_id": 12000, - "gift_name": "醒目留言", - "num": 1 - }, - "id": 6522809, - "is_ranked": 1, - "is_send_audit": 0, - "medal_info": { - "anchor_roomid": 732, - "anchor_uname": "Asaki大人", - "guard_level": 3, - "icon_id": 0, - "is_lighted": 1, - "medal_color": "#1a544b", - "medal_color_border": 6809855, - "medal_color_end": 5414290, - "medal_color_start": 1725515, - "medal_level": 21, - "medal_name": "ASAKI", - "special": "", - "target_id": 194484313 - }, - "message": "猪播完美预测自己第一个死,这就是鹅鸭杀高玩吗", - "message_font_color": "#A3F6FF", - "message_trans": "", - "price": 30, - "rate": 1000, - "start_time": 1677069035, - "time": 60, - "token": "7BED5681", - "trans_mark": 0, - "ts": 1677069035, - "uid": 294094150, - "user_info": { - "face": "https://i1.hdslb.com/bfs/face/7a11b48e0a3055e220fa8b4c7d938cd4bcac2577.jpg", - "face_frame": "https://i0.hdslb.com/bfs/live/80f732943cc3367029df65e267960d56736a82ee.png", - "guard_level": 3, - "is_main_vip": 1, - "is_svip": 0, - "is_vip": 0, - "level_color": "#969696", - "manager": 0, - "name_color": "#00D1F1", - "title": "0", - "uname": "界原虚", - "user_level": 6 - } - }, - "roomid": 6154037 -} -``` - -</details> - -#### 醒目留言日语 (SUPER_CHAT_MESSAGE_JPN) - -基本同 [醒目留言 (SUPER_CHAT_MESSAGE)](#醒目留言-super_chat_message), 但多了 `message_jpn` 字段 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SUPER_CHAT_MESSAGE_JPN", - "data": { - "id": "3790747", - "uid": "394060741", - "price": 30, - "rate": 1000, - "message": "棉花!!转盘中了武器后,上号30抽3武器,救命!!!", - "message_jpn": "", - "is_ranked": 1, - "background_image": "https://i0.hdslb.com/bfs/live/a712efa5c6ebc67bafbe8352d3e74b820a00c13e.png", - "background_color": "#EDF5FF", - "background_icon": "", - "background_price_color": "#7497CD", - "background_bottom_color": "#2A60B2", - "ts": 1650363318, - "token": "24655ABF", - "medal_info": { - "icon_id": 0, - "target_id": 1871001, - "special": "", - "anchor_uname": "棉花大哥哥", - "anchor_roomid": 103, - "medal_level": 24, - "medal_name": "棉花花", - "medal_color": "#1a544b" - }, - "user_info": { - "uname": "改了名真的能中吗", - "face": "http://i1.hdslb.com/bfs/face/e2391f132cd981fb70468a8ce9418513e959eb10.jpg", - "face_frame": "https://i0.hdslb.com/bfs/live/80f732943cc3367029df65e267960d56736a82ee.png", - "guard_level": 3, - "user_level": 11, - "level_color": "#61c05a", - "is_vip": 0, - "is_svip": 0, - "is_main_vip": 1, - "title": "0", - "manager": 0 - }, - "time": 60, - "start_time": 1650363318, - "end_time": 1650363378, - "gift": { - "num": 1, - "gift_id": 12000, - "gift_name": "醒目留言" - } - }, - "roomid": "34348" -} -``` - -</details> - -#### 醒目留言删除 (SUPER_CHAT_MESSAGE_DELETE) - -<!--{ - "gh": [360] -}--> - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `SUPER_CHAT_MESSAGE_DELETE` | | -| data | obj | 消息本体 | | -| roomid | num | 直播间号 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| ids | arr | 待删除的醒目留言 ID 列表 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SUPER_CHAT_MESSAGE_DELETE", - "data": { - "ids": [ - 3897503 - ] - }, - "roomid": 23708804 -} -``` - -</details> - -#### 送礼 (SEND_GIFT) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| cmd | str | `SEND_GIFT` | | -| data | obj | 消息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| action | str | 礼物操作,一般为"投喂" | | -| batch_combo_id | str | 待调查 | 有时为空字符串 | -| batch_combo_send | obj | 待调查 | 有时为null | -| beatId | str | 待调查 | | -| biz_source | str | 待调查 | | -| blind_gift | | 待调查 | | -| broadcast_id | num | 待调查 | | -| coin_type | str | 标识金银瓜子礼物对应是否付费? | | -| combo_resources_id | num | 待调查 | | -| combo_send | | 待调查 | | -| comber_stay_time | num | 待调查 | | -| combo_total_coin | num | 待调查 | | -| crit_prob | num | 待调查 | | -| demarcation | num | 待调查 | | -| discount_price | num | 待调查 | | -| dmscore | num | 待调查 | | -| draw | num | 待调查 | | -| effect | num | 待调查 | | -| effect_block | num | 待调查 | | -| face | str | 礼物投喂者的头像URL | | -| face_effect_id | num | 待调查 | | -| face_effect_type | num | 待调查 | | -| float_sc_resource_id | num | 待调查 | | -| giftId | num | 礼物ID | | -| giftName | str | 礼物名称 | | -| giftType | num | 待调查 | | -| gold | number | 待调查 | | -| guard_level | num | 待调查 | | -| is_first | bool | 待调查 | | -| is_join_receiver | bool | 待调查 | | -| is_naming | bool | 待调查 | | -| is_special_batch | num | 待调查 | | -| magnification | num | 待调查 | | -| medal_info | obj | 礼物投喂者粉丝奖牌信息 | | -| name_color | str | 待调查 | | -| num | num | 该次投喂的礼物数量 | | -| original_gift_name | str | 待调查 | | -| price | num | 价值 | | -| rcost | num | 待调查 | | -| receive_user_info | obj | 礼物接收者信息,一般是主播 | | -| remain | num | 待调查 | | -| rnd | num | 礼物发送时的时间戳,以及后面9位未知数字 | | -| send_master | | 待调查 | | -| silver | num | 待调查 | | -| super | num | 待调查 | | -| super_batch_gift_num | num | 待调查 | | -| super_gift_num | num | 待调查 | | -| svga_block | num | 待调查 | | -| switch | bool | 待调查 | | -| tag_image | str | 待调查 | | -| tid | num | 礼物发送时的时间戳,以及后面9位未知数字 | 似乎与rnd字段相同 | -| timestamp | num | 礼物发送时的时间戳 | | -| top_list | | 待调查 | | -| total_coin | num | 实际金银瓜子总价值 | 不是总等于 num*price | -| uid | num | 礼物投喂者的UID | | -| uname | str | 礼物投喂者的名称 | | - -`data.batch_combo_send` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| action | str | 礼物操作,一般为"投喂" | | -| batch_combo_id | str | 待调查 | | -| batch_combo_num | num | 待调查 | | -| blind_gift | | 待调查 | | -| gift_id | num | 待调查 | | -| gift_name | str | 投喂的礼物名称 | 待调查 | -| gift_num | num | 投喂礼物数量 | 待调查 | -| send_master | | 待调查 | | -| uid | num | 礼物投喂者的UID | | -| uname | str | 礼物投喂者的名称 | | - -`data.medal_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| anchor_roomid | num | 待调查 | | -| anchor_uname | str | 待调查 | | -| guard_level | num | 待调查 | | -| icon_id | num | 待调查 | | -| is_lighted | num | 待调查 | | -| medal_color | num | 礼物投喂者的粉丝奖牌颜色 | 十六进制颜色值转为了十进制表示 | -| medal_border_color | num | 礼物投喂者的粉丝奖牌边框颜色 | 十六进制颜色值的十进制表示 | -| medal_color_end | num | 待调查 | | -| medal_color_start | num | 待调查 | | -| medal_level | num | 礼物投喂者的粉丝奖牌等级 | | -| medal_name | str | 礼物投喂者的粉丝奖牌名称 | | -| special | str | 待调查 | | -| target_id | num | 待调查 | | - -`data.receive_user_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| uid | num | 礼物接收者的UID | 一般为主播的UID | -| uname | str | 礼物接收者的名称 | 一般为主播的名称 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SEND_GIFT", - "data": { - "action": "投喂", - "batch_combo_id": "batch:gift:combo_id:510149209:36047134:31036:1673622464.8445", - "batch_combo_send": { - "action": "投喂", - "batch_combo_id": "batch:gift:combo_id:510149209:36047134:31036:1673622464.8445", - "batch_combo_num": 1, - "blind_gift": null, - "gift_id": 31036, - "gift_name": "小花花", - "gift_num": 1, - "send_master": null, - "uid": 510149209, - "uname": "12138额83121" - }, - "beatId": "", - "biz_source": "live", - "blind_gift": null, - "broadcast_id": 0, - "coin_type": "gold", - "combo_resources_id": 1, - "combo_send": { - "action": "投喂", - "combo_id": "gift:combo_id:510149209:36047134:31036:1673622464.8434", - "combo_num": 1, - "gift_id": 31036, - "gift_name": "小花花", - "gift_num": 1, - "send_master": null, - "uid": 510149209, - "uname": "12138额83121" - }, - "combo_stay_time": 3, - "combo_total_coin": 100, - "crit_prob": 0, - "demarcation": 1, - "discount_price": 100, - "dmscore": 8, - "draw": 0, - "effect": 0, - "effect_block": 0, - "face": "https://i1.hdslb.com/bfs/face/fb79103e8b33547023e2010030b6889bba2b49bf.jpg", - "face_effect_id": 0, - "face_effect_type": 0, - "float_sc_resource_id": 0, - "giftId": 31036, - "giftName": "小花花", - "giftType": 0, - "gold": 0, - "guard_level": 0, - "is_first": true, - "is_join_receiver": false, - "is_naming": false, - "is_special_batch": 0, - "magnification": 1, - "medal_info": { - "anchor_roomid": 0, - "anchor_uname": "", - "guard_level": 0, - "icon_id": 0, - "is_lighted": 0, - "medal_color": 0, - "medal_color_border": 0, - "medal_color_end": 0, - "medal_color_start": 0, - "medal_level": 0, - "medal_name": "", - "special": "", - "target_id": 0 - }, - "name_color": "", - "num": 1, - "original_gift_name": "", - "price": 100, - "rcost": 164536872, - "receive_user_info": { - "uid": 36047134, - "uname": "小霖QL" - }, - "remain": 0, - "rnd": "1673622464121900003", - "send_master": null, - "silver": 0, - "super": 0, - "super_batch_gift_num": 1, - "super_gift_num": 1, - "svga_block": 0, - "switch": true, - "tag_image": "", - "tid": "1673622464121900003", - "timestamp": 1673622464, - "top_list": null, - "total_coin": 100, - "uid": 510149209, - "uname": "12138额83121" - } -} -``` - -</details> - -#### 礼物星球点亮 (GIFT_STAR_PROCESS) - -注: 主播的礼物星球其一点亮之后 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `GIFT_STAR_PROCESS` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| status | num | 待调查 | | -| tip | str | 点亮礼物星球的消息文本 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "GIFT_STAR_PROCESS", - "data": { - "status": 1, - "tip": "情书已点亮" - } -} -``` - -</details> - -#### 礼物星球进度更新 (WIDGET_GIFT_STAR_PROCESS) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `WIDGET_GIFT_STAR_PROCESS` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| start_date | num | 开始时间? | 一个年月日数字,格式 `Number(String(年) + String(月) + String(日))`,详见消息示例 | -| process_list | arr | 礼物进度列表 | | -| finished | bool | 是否完成? | | -| ddl_timestamp | num | 截止时间? | Unix 秒时间戳 | -| version | num | 更新时间 | Unix 毫秒时间戳 | -| reward_gift | num | | | -| reward_gift_img | str | | | -| reward_gift_name | str | | | -| level_info | null | (?) | | - -`data.process_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 礼物需求1 | | -| 1 | obj | 礼物需求2 | | -| 2 | obj | 礼物需求3 | | - -`data.process_list` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| gift_id | num | 礼物id | | -| gift_img | str | 礼物图片 | | -| gift_name | str | 礼物名称 | `礼物星球` | -| completed_num | num | 当前数量 | | -| target_num | num | 目标数量 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WIDGET_GIFT_STAR_PROCESS", - "data": { - "start_date": 20250728, - "process_list": [ - { - "gift_id": 33988, - "gift_img": "https://s1.hdslb.com/bfs/live/7164c955ec0ed7537491d189b821cc68f1bea20d.png", - "gift_name": "礼物星球", - "completed_num": 155, - "target_num": 1000 - }, - { - "gift_id": 31036, - "gift_img": "https://s1.hdslb.com/bfs/live/8b40d0470890e7d573995383af8a8ae074d485d9.png", - "gift_name": "礼物星球", - "completed_num": 123, - "target_num": 500 - }, - { - "gift_id": 34382, - "gift_img": "https://s1.hdslb.com/bfs/live/3a1cc7ca50da48670d9f7aa6c8d3cd874228f7b0.png", - "gift_name": "礼物星球", - "completed_num": 0, - "target_num": 1 - } - ], - "finished": false, - "ddl_timestamp": 1754236800, - "version": 1754030237877, - "reward_gift": 0, - "reward_gift_img": "", - "reward_gift_name": "", - "level_info": null - } -} -``` - -</details> - -#### 礼物连击 (COMBO_SEND) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `COMBO_SEND` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| action | str | 礼物操作,一般为"投喂" | | -| batch_combo_id | str | 待调查 | | -| batch_combo_num | num | 连击礼物数量 | | -| combo_id | str | 待调查 | | -| combo_num | str | 连击礼物数量 | | -| combo_total_coin | num | 待调查 | | -| dmscore | num | 待调查 | | -| gift_id | num | 待调查 | | -| gift_name | str | 连击礼物的名称 | | -| gift_num | num | 0 | | -| is_join_receiver | bool | 待调查 | | -| is_naming | bool | 待调查 | | -| is_show | num | 待调查 | | -| medal_info | obj | 礼物投喂者的粉丝勋章信息 | | -| name_color | str | 待调查 | | -| r_uname | str | 主播的名称 | | -| receive_user_info | obj | 主播的UID和名称 | | -| ruid | num | 主播的UID | | -| send_master | | 待调查 | | -| total_num | num | 连击礼物数量 | | -| uid | num | 礼物投喂者的UID | | -| uname | str | 礼物投喂者的名称 | | - -`data.receive_user_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | -------- | ------ | --------- | -| uid | number | 礼物接收者的UID | 一般为主播的UID | -| uname | string | 礼物接收者的名称 | 一般为主播的名称 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "COMBO_SEND", - "data": { - "action": "投喂", - "batch_combo_id": "batch:gift:combo_id:3493090830584635:29857468:31036:1673774515.6190", - "batch_combo_num": 2, - "combo_id": "gift:combo_id:3493090830584635:29857468:31036:1673774515.6180", - "combo_num": 2, - "combo_total_coin": 200, - "dmscore": 112, - "gift_id": 31036, - "gift_name": "小花花", - "gift_num": 0, - "is_join_receiver": false, - "is_naming": false, - "is_show": 1, - "medal_info": { - "anchor_roomid": 0, - "anchor_uname": "", - "guard_level": 0, - "icon_id": 0, - "is_lighted": 1, - "medal_color": 6067854, - "medal_color_border": 6067854, - "medal_color_end": 6067854, - "medal_color_start": 6067854, - "medal_level": 3, - "medal_name": "爱珞珞", - "special": "", - "target_id": 3493076559465366 - }, - "name_color": "", - "r_uname": "露萌不要雨草", - "receive_user_info": { - "uid": 29857468, - "uname": "露萌不要雨草" - }, - "ruid": 29857468, - "send_master": null, - "total_num": 2, - "uid": 3493090830584635, - "uname": "DOC-Neo" - } -} -``` - -</details> - -#### 特殊礼物 (SPECIAL_GIFT) - -<!--{ - "gh": [360] -}--> - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| cmd | str | `SPECIAL_GIFT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -以 数字 为键, JSON Object 为值的表 - -`data['?']` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| action | str | 操作? | | -| content | str | 内容 | | -| hadJoin | num | 是否加入? | | -| id | str | ? | 字符串表示的数字 | -| num | str | 数量 | | -| storm_gif | str | GIF 动画 URL | | -| time | str | 持续时间? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SPECIAL_GIFT", - "data": { - "39": { - "action": "start", - "content": "可爱即正义~~", - "hadJoin": 0, - "id": "3306976431489", - "num": 1, - "storm_gif": "http://static.hdslb.com/live-static/live-room/images/gift-section/mobilegift/2/jiezou.gif?2017011901", - "time": 90 - } - } -} -``` - -</details> - -<!-- -#### 欢迎加入房间 - -#### 欢迎房管加入房间 ---> - -#### 通知消息 (NOTICE_MSG) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `NOTICE_MSG` | | -| id | num | 待调查 | | -| name | str | 通知名 | | -| full | obj | 完整显示信息? | | -| half | obj | 半部显示信息? | | | -| side | obj | 边缘显示信息? | | -| roomid | num | 目标直播间短号 | | -| real_roomid | num | 目标直播间真实ID | | -| msg_common | str | 显示的消息内容 | | -| msg_self | str | 消息内容本身 | 剔除额外文本 | -| link_url | str | 通知消息跳转的URL | | -| msg_type | num | 待调查 | | -| shield_uid | num | 待调查 | | -| business_id | str | 待调查 | | -| scatter | obj | 待调查 | | -| marquee_id | str | 待调查 | | -| notice_type | num | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "NOTICE_MSG", - "id": 804, - "name": "人气榜第一名", - "full": { - "head_icon": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", - "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", - "head_icon_fa": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", - "tail_icon_fa": "https://i0.hdslb.com/bfs/live/38cb2a9f1209b16c0f15162b0b553e3b28d9f16f.png", - "head_icon_fan": 1, - "tail_icon_fan": 4, - "background": "#FFE6BD", - "color": "#9D5412", - "highlight": "#FF6933", - "time": 20 - }, - "half": { - "head_icon": "https://i0.hdslb.com/bfs/live/f74b09c7fb83123a0dd66c536b6d5b143d271b08.png", - "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", - "background": "#FFE6BD", - "color": "#9D5412", - "highlight": "#FF6933", - "time": 0 - }, - "side": { - "head_icon": "", - "background": "", - "color": "", - "highlight": "", - "border": "" - }, - "roomid": 23919301, - "real_roomid": 23919301, - "msg_common": "恭喜主播<%AG超玩会王者荣耀一诺%>荣获上小时人气榜第<%1%>名!点击传送查看精彩内容!", - "msg_self": "恭喜主播<%AG超玩会王者荣耀一诺%>荣获上小时人气榜第<%1%>名!", - "link_url": "https://live.bilibili.com/23919301?broadcast_type=0&is_room_feed=1&from=28003&extra_jump_from=28003", - "msg_type": 1, - "shield_uid": -1, - "business_id": "", - "scatter": { - "min": 0, - "max": 0 - }, - "marquee_id": "", - "notice_type": 0 -} -``` - -```json -{ - "cmd": "NOTICE_MSG", - "id": 814, - "name": "幻影飞船专用", - "full": { - "head_icon": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", - "tail_icon": "https://i0.hdslb.com/bfs/live/822da481fdaba986d738db5d8fd469ffa95a8fa1.webp", - "head_icon_fa": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", - "tail_icon_fa": "https://i0.hdslb.com/bfs/live/38cb2a9f1209b16c0f15162b0b553e3b28d9f16f.png", - "head_icon_fan": 1, - "tail_icon_fan": 4, - "background": "#F09153", - "color": "#FFFFFF", - "highlight": "#FFE600", - "time": 15 - }, - "half": { - "head_icon": "https://i0.hdslb.com/bfs/live/08978f1721200e11328d1f7d6231b21bcca20488.gif", - "tail_icon": "", - "background": "#F09153", - "color": "#FFFFFFFF", - "highlight": "#FFE600", - "time": 15 - }, - "side": { - "head_icon": "", - "background": "", - "color": "", - "highlight": "", - "border": "" - }, - "roomid": 25207004, - "real_roomid": 25207004, - "msg_common": "<%咖啡_ミシェル%>投喂<%夜月瓜瓜sukuyi%>1个幻影飞船,向着浩瀚星辰出发!", - "msg_self": "<%咖啡_ミシェル%>投喂<%夜月瓜瓜sukuyi%>1个幻影飞船,向着浩瀚星辰出发!", - "link_url": "https://live.bilibili.com/25207004?broadcast_type=0&is_room_feed=1&from=28003&extra_jump_from=28003&live_lottery_type=1", - "msg_type": 2, - "shield_uid": -1, - "business_id": "32356", - "scatter": { - "min": 0, - "max": 0 - }, - "marquee_id": "", - "notice_type": 0 -} -``` - -</details> - -#### 主播准备中 (PREPARING) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `PREPARING` | | -| round | num | 轮播状态:<br/>1正在轮播<br/>0未轮播 | 开启轮播时存在 | -| roomid | str | 直播间ID | 未知是真实ID还是短号 | 类型似乎从num改为str | -| msg\_id | str | 信息id? | | -| p\_is\_ack | bool | | 未知 | -| p\_msg\_type | num | `1` | 未知 | -| send\_time | num | 发送时间 | UNIX 毫秒时间戳 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -有启用轮播: - -```json -{ - "cmd": "PREPARING", - "msg_id": "26964930181741056:1000:1000", - "p_is_ack": true, - "p_msg_type": 1, - "roomid": "1899237171", - "round": 1, - "send_time": 1739985402716 -} -``` - -未启用轮播: - -```json -{ - "cmd": "PREPARING", - "msg_id": "27040425357932032:1000:1000", - "p_is_ack": true, - "p_msg_type": 1, - "roomid": "1017", - "send_time": 1740129398337 -} -``` - -</details> - -#### 直播开始 (LIVE) - -注:请求了开始直播接口、开始向服务器推流时下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `LIVE` | | -| live_key | str | 标记直播场次的key | 与开始直播接口获得的live_key相同 | -| voice_background | str | ? | | -| sub_session_key | str | ? | | -| live_platform | str | 开播平台? | 推测由开播接口决定 | -| live_model | num | ? | | -| live_time | num | 开播时间 | UNIX 秒级时间戳,只有请求了开始直播后立刻下发的那个数据包里存在 | -| roomid | num | 直播间号 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "LIVE", - "live_key": "234304209915761953", - "voice_background": "", - "sub_session_key": "234304209915761953sub_time:1651036923", - "live_platform": "pc", - "live_model": 0, - "live_time": 1651036923, - "roomid": 23614753 -} -``` - -</details> - -#### 主播信息更新 (ROOM_REAL_TIME_MESSAGE_UPDATE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `ROOM_REAL_TIME_MESSAGE_UPDATE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| roomid | num | 直播间ID | 未知是真实ID还是短号 | -| fans | num | 主播当前粉丝数 | | -| red_notice | num | 待调查 | | -| fans_club | num | 主播粉丝团人数 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_REAL_TIME_MESSAGE_UPDATE", - "data": { - "roomid": 8618057, - "fans": 136, - "red_notice": -1, - "fans_club": 8 - } -} -``` - -</details> - -#### 播放链接刷新 (PLAYURL_RELOAD) - -注: 该cmd通常不提供播放链接。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cmd | str | `PLAYURL_RELOAD` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| reload_option | obj | 刷新选项? | | -| playurl | obj | 播放链接信息 | | - -`data.reload_option` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| reload_stream_name | arr | 空数组? | | -| reload_format | arr | 空数组? | | -| scatter | num | | | - -`data.playurl` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cid | num | 直播间真实id | | -| g_qn_desc | arr | 画质描述 | | -| stream | arr | 直播流信息 | | -| p2p_data | obj | P2P信息 | | -| dolby_qn | null | dolby画质信息? | | - -`data.playurl.g_qn_desc` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| 0 | obj | 首个画质信息 | | -| … | obj | 多个画质信息 | | -| i | obj | 最后画质信息 | | - -`data.playurl.g_qn_desc` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| qn | num | 画质代码 | | -| desc | str | 画质描述 | | -| hdr_desc | str | | | -| attr_desc | null | | | -| hdr_type | num | | | -| media_base_desc | null 或 obj | 媒体描述 | - -`data.playurl.g_qn_desc[i].media_base_desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| detail_desc | obj | 详细? | | -| brief_desc | obj | 简洁? | | - -`data.playurl.g_qn_desc[i].media_base_desc.detail_desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | str | 画质描述 | | -| tag | arr | 画质标签 | 字符串数组,部分画质存在 | - -`data.playurl.g_qn_desc[i].media_base_desc.brief_desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | str | 画质描述 | | -| badge | str | 画质描述 | 部分画质存在 | - -`data.stream` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| protocol_name | str | 协议名称 | | -| format | arr | 封装格式列表 | | - -`data.stream[i].format` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| format_name | str | 视频封装格式名称 | | -| codec | arr | 编码列表 | | -| master_url | str | | | - -`data.stream[i].format[i].codec` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| codec_name | str | 视频编码名称 | | -| current_qn | num | 当前画质代码? | | -| accept_qn | arr | 允许的画质代码? | 数字数组 | -| base_url | str | | | -| url_info | arr | | | -| hdr_qn | null | | | -| dolby_type | num | | | -| attr_name | str | | | -| hdr_type | num | | | -| drm | bool | | | -| drm_key_systems | null | | | -| video_codecs | obj | 视频编码信息 | 不一定存在 | -| audio_codecs | obj | 音频编码信息 | 不一定存在 | - -`data.stream[i].format[i].codec[i].video_codecs` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| base | str | 编码格式 | | - -`data.stream[i].format[i].codec[i].audio_codecs` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| base | str | 编码格式 | | - -`data.playurl.p2p_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| p2p | bool | | | -| p2p_type | num | | | -| m_p2p | bool | | | -| m_servers | null | | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "PLAYURL_RELOAD", - "data": { - "reload_option": { - "reload_stream_name": [], - "reload_format": [], - "scatter": 3000 - }, - "playurl": { - "cid": 41682, - "g_qn_desc": [ - { - "qn": 30000, - "desc": "杜比", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": null - }, - { - "qn": 20000, - "desc": "4K", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": null - }, - { - "qn": 10000, - "desc": "原画", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": { - "detail_desc": { - "desc": "1080P 原画", - "tag": [ - "高帧率" - ] - }, - "brief_desc": { - "desc": "1080P", - "badge": "原画" - } - } - }, - { - "qn": 400, - "desc": "蓝光", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": null - }, - { - "qn": 250, - "desc": "超清", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": { - "detail_desc": { - "desc": "720P 超清" - }, - "brief_desc": { - "desc": "720P" - } - } - }, - { - "qn": 150, - "desc": "高清", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": null - }, - { - "qn": 80, - "desc": "流畅", - "hdr_desc": "", - "attr_desc": null, - "hdr_type": 0, - "media_base_desc": null - } - ], - "stream": [ - { - "protocol_name": "http_stream", - "format": [ - { - "format_name": "flv", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "avc1.64002a" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - }, - { - "codec_name": "hevc", - "current_qn": 250, - "accept_qn": [ - 250 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "hvc1.1.6.L120" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - } - ], - "master_url": "" - } - ] - }, - { - "protocol_name": "http_hls", - "format": [ - { - "format_name": "ts", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "avc1.64002a" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - }, - { - "codec_name": "hevc", - "current_qn": 250, - "accept_qn": [ - 250 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "hvc1.1.6.L120" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - } - ], - "master_url": "" - }, - { - "format_name": "fmp4", - "codec": [ - { - "codec_name": "avc", - "current_qn": 10000, - "accept_qn": [ - 10000 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "avc1.64002a" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - }, - { - "codec_name": "hevc", - "current_qn": 250, - "accept_qn": [ - 250 - ], - "base_url": "", - "url_info": [], - "hdr_qn": null, - "dolby_type": 0, - "attr_name": "", - "hdr_type": 0, - "drm": false, - "drm_key_systems": null, - "video_codecs": { - "base": "hvc1.1.6.L120" - }, - "audio_codecs": { - "base": "mp4a.40.2" - } - } - ], - "master_url": "" - } - ] - } - ], - "p2p_data": { - "p2p": false, - "p2p_type": 0, - "m_p2p": false, - "m_servers": null - }, - "dolby_qn": null - } - } -} -``` - -</details> - -#### 直播间高能榜 (ONLINE_RANK_V2) - -注: 直播间高能用户数据刷新 - -在线榜已被 `ONLINE_RANK_V3` 替换 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `ONLINE_RANK_V2` | | -| data | obj | 直播间高能用户数据 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| list | array | 在直播间高能用户中的用户信息 | | -| rank_type | str | 榜单类型 | | - -`data.list[n]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| uid | num | 用户 mid | | -| face | str | 用户头像 URL | | -| score | str | 该用户的贡献值 | | -| uname | str | 用户名称 | | -| rank | num | 该用户在高能榜中的排名 | | -| guard_level | num | 大航海等级? | | -| is_mystery | bool | | | -| uinfo | obj | 用户信息 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ONLINE_RANK_V2", - "data": { - "list": [ - { - "uid": 2082621455, - "face": "https://i2.hdslb.com/bfs/face/9de6050277fa13d830eb97e3453d89843de46a31.jpg", - "score": "20", - "uname": "8级萌新_小华", - "rank": 1, - "guard_level": 0 - }, - { - "uid": 50500335, - "face": "https://i0.hdslb.com/bfs/face/ca722209251478ef0ffb45c3adeafb9dab283c57.jpg", - "score": "20", - "uname": "属官一号", - "rank": 2, - "guard_level": 0 - }, - { - "uid": 29857468, - "face": "https://i1.hdslb.com/bfs/face/7b4ae2e7e950f2dfb2bd969859c813487ce3b64c.jpg", - "score": "12", - "uname": "露萌不要雨草", - "rank": 3, - "guard_level": 0 - } - ], - "rank_type": "gold-rank" - } -} -``` - -</details> - -#### 直播间高能榜V3 (ONLINE_RANK_V3) - -注: 直播间高能用户数据刷新 - -替换 `ONLINE_RANK_V2` - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cmd | str | `ONLINE_RANK_V3` | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| pb | str | 使用 base64 编码 protobuf 后的数据 | 解析后数据基本与`ONLINE_RANK_V2`的`data`相同 | - -用于解析protobuf数据的proto文件: [#1332(comment)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1332#issuecomment-3055621742) - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ONLINE_RANK_V3", - "data": { - "pb": "CgtvbmxpbmVfcmFuaxqqAwi8jscKEkpodHRwczovL2kyLmhkc2xiLmNvbS9iZnMvZmFjZS9iODM3MGMzMGM3ZDg5NDg4YjRjOWYyNWZmMTgyNjc4OTEyYTRiOTA3LmpwZxoCMTIiDOW4jOWwlOWonOWonCgBMAFCwAIIvI7HChKfAgoM5biM5bCU5aic5aicEkpodHRwczovL2kyLmhkc2xiLmNvbS9iZnMvZmFjZS9iODM3MGMzMGM3ZDg5NDg4YjRjOWYyNWZmMTgyNjc4OTEyYTRiOTA3LmpwZypaCgzluIzlsJTlqJzlqJwSSmh0dHBzOi8vaTIuaGRzbGIuY29tL2Jmcy9mYWNlL2I4MzcwYzMwYzdkODk0ODhiNGM5ZjI1ZmYxODI2Nzg5MTJhNGI5MDcuanBnMloKDOW4jOWwlOWonOWonBJKaHR0cHM6Ly9pMi5oZHNsYi5jb20vYmZzL2ZhY2UvYjgzNzBjMzBjN2Q4OTQ4OGI0YzlmMjVmZjE4MjY3ODkxMmE0YjkwNy5qcGc6CyD///////////8BMhcIARITMjAyNS0wNy0yOSAyMzo1OTo1ORrNAwjnyMIDEkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS9mZWNhYTQ3ZTQ2ODljOWVmYTg0MzBiNmViNzRmNTM2ZTMxN2ZmODYwLmpwZxoBOCIV5byl6IC26IC26IC26IC26IC26IC2KAIwAkLbAgjnyMIDEroCChXlvKXogLbogLbogLbogLbogLbogLYSSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlL2ZlY2FhNDdlNDY4OWM5ZWZhODQzMGI2ZWI3NGY1MzZlMzE3ZmY4NjAuanBnKmMKFeW8peiAtuiAtuiAtuiAtuiAtuiAthJKaHR0cHM6Ly9pMS5oZHNsYi5jb20vYmZzL2ZhY2UvZmVjYWE0N2U0Njg5YzllZmE4NDMwYjZlYjc0ZjUzNmUzMTdmZjg2MC5qcGcyYwoV5byl6IC26IC26IC26IC26IC26IC2EkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS9mZWNhYTQ3ZTQ2ODljOWVmYTg0MzBiNmViNzRmNTM2ZTMxN2ZmODYwLmpwZzoLIP///////////wEyFwgCEhMyMDI1LTA4LTAzIDIzOjU5OjU5GvUDCMTF4wQSS2h0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzcxMmMzNjExMzg1ZTJlMGRjYmU4MDc2YmRkM2ViNmYwZWNjNmZkYWYud2VicBoBNiIe5oKg5ZOJ55qE6buR5ZCs5aSn546L5aSq5Zuw6L69KAMwA0L5AgjExeMEEtgCCh7mgqDlk4nnmoTpu5HlkKzlpKfnjovlpKrlm7Dovr0SS2h0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzcxMmMzNjExMzg1ZTJlMGRjYmU4MDc2YmRkM2ViNmYwZWNjNmZkYWYud2VicCptCh7mgqDlk4nnmoTpu5HlkKzlpKfnjovlpKrlm7Dovr0SS2h0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzcxMmMzNjExMzg1ZTJlMGRjYmU4MDc2YmRkM2ViNmYwZWNjNmZkYWYud2VicDJtCh7mgqDlk4nnmoTpu5HlkKzlpKfnjovlpKrlm7Dovr0SS2h0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzcxMmMzNjExMzg1ZTJlMGRjYmU4MDc2YmRkM2ViNmYwZWNjNmZkYWYud2VicDoLIP///////////wEyFwgDEhMyMDI1LTA3LTI2IDIzOjU5OjU5GtkDCLzSxwkSSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzAyMGYxOWEwNTNjZDBkNGZjNGMyYmQzOTlmYWNjMTk3YWJiZWY5N2EuanBnGgE2IhjmuLjmiYvlpb3pl7LnmoTmtYXogIHluIgoBDADQuQCCLzSxwkSwwIKGOa4uOaJi+WlvemXsueahOa1heiAgeW4iBJKaHR0cHM6Ly9pMS5oZHNsYi5jb20vYmZzL2ZhY2UvMDIwZjE5YTA1M2NkMGQ0ZmM0YzJiZDM5OWZhY2MxOTdhYmJlZjk3YS5qcGcqZgoY5ri45omL5aW96Zey55qE5rWF6ICB5biIEkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS8wMjBmMTlhMDUzY2QwZDRmYzRjMmJkMzk5ZmFjYzE5N2FiYmVmOTdhLmpwZzJmChjmuLjmiYvlpb3pl7LnmoTmtYXogIHluIgSSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzAyMGYxOWEwNTNjZDBkNGZjNGMyYmQzOTlmYWNjMTk3YWJiZWY5N2EuanBnOgsg////////////ATIXCAMSEzIwMjUtMDgtMDQgMjM6NTk6NTkakAMIp9P+CRJKaHR0cHM6Ly9pMS5oZHNsYi5jb20vYmZzL2ZhY2UvZTJkYmM4ZTQ5NzA3NzFiNjlhNWEyYzYzMDI0YTg5NzhjMjc3YWNmMi5qcGcaATYiDOmaj+WFieaykOW9sSgFQqkCCKfT/gkSnwIKDOmaj+WFieaykOW9sRJKaHR0cHM6Ly9pMS5oZHNsYi5jb20vYmZzL2ZhY2UvZTJkYmM4ZTQ5NzA3NzFiNjlhNWEyYzYzMDI0YTg5NzhjMjc3YWNmMi5qcGcqWgoM6ZqP5YWJ5rKQ5b2xEkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS9lMmRiYzhlNDk3MDc3MWI2OWE1YTJjNjMwMjRhODk3OGMyNzdhY2YyLmpwZzJaCgzpmo/lhYnmspDlvbESSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlL2UyZGJjOGU0OTcwNzcxYjY5YTVhMmM2MzAyNGE4OTc4YzI3N2FjZjIuanBnOgsg////////////ATIAGrYDCPWvn4sBEkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS80ZTNkYTdmYWJiOWZlMTkyNzRhYmQ0ZTdlYWMyNmQ3MjI4OGQyNmEwLmpwZxoBNiIV5pKS5qyi5YS/55qE5rCU5rOh5YS/KAZCxQII9a+fiwESugIKFeaSkuasouWEv+eahOawlOazoeWEvxJKaHR0cHM6Ly9pMS5oZHNsYi5jb20vYmZzL2ZhY2UvNGUzZGE3ZmFiYjlmZTE5Mjc0YWJkNGU3ZWFjMjZkNzIyODhkMjZhMC5qcGcqYwoV5pKS5qyi5YS/55qE5rCU5rOh5YS/EkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS80ZTNkYTdmYWJiOWZlMTkyNzRhYmQ0ZTdlYWMyNmQ3MjI4OGQyNmEwLmpwZzJjChXmkpLmrKLlhL/nmoTmsJTms6HlhL8SSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzRlM2RhN2ZhYmI5ZmUxOTI3NGFiZDRlN2VhYzI2ZDcyMjg4ZDI2YTAuanBnOgsg////////////ATIAGusDCPTXwbEBEkpodHRwczovL2kxLmhkc2xiLmNvbS9iZnMvZmFjZS8yN2RiOGQ5MTY3ZDRhMmUyMDg0NjUzNDJkOGVmZjQzZWUzMGJiOGNlLmpwZxoBNiIc57OW5b+D6JuL6JuLLeWNg+WNg+azoue6r+WGoCgHMANC8QII9NfBsQESzwIKHOezluW/g+ibi+ibiy3ljYPljYPms6Lnuq/lhqASSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzI3ZGI4ZDkxNjdkNGEyZTIwODQ2NTM0MmQ4ZWZmNDNlZTMwYmI4Y2UuanBnKmoKHOezluW/g+ibi+ibiy3ljYPljYPms6Lnuq/lhqASSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzI3ZGI4ZDkxNjdkNGEyZTIwODQ2NTM0MmQ4ZWZmNDNlZTMwYmI4Y2UuanBnMmoKHOezluW/g+ibi+ibiy3ljYPljYPms6Lnuq/lhqASSmh0dHBzOi8vaTEuaGRzbGIuY29tL2Jmcy9mYWNlLzI3ZGI4ZDkxNjdkNGEyZTIwODQ2NTM0MmQ4ZWZmNDNlZTMwYmI4Y2UuanBnOgsg////////////ATIXCAMSEzIwMjUtMDctMjUgMjM6NTk6NTk=" - } -} -``` - -</details> - -#### 直播间高能用户数量 (ONLINE_RANK_COUNT) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `ONLINE_RANK_COUNT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| count | num | 直播间高能用户数量 | 存在上限 | -| count_text | str | 直播间高能用户数量文本 | | -| online_count | num | 直播间在线用户数量 | 存在上限 | -| online_count_text | str | 直播间在线用户数量文本 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ONLINE_RANK_COUNT", - "data": { - "count": 1084, - "count_text": "1084", - "online_count": 1084, - "online_count_text": "1084" - } -} -``` - -</details> - -#### 未登录通知 (LOG_IN_NOTICE) - -注:未使用认证信息进行登录将会下发此数据包,通常于认证包回复后下发,在后续时间里也有可能会下发;部分受到豁免的直播间不会下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `LOG_IN_NOTICE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| notice\_msg | str | 通知内容 | | -| image\_web | str | 在网页端使用的通知图片 | | -| image\_app | str | 在app端使用的图片 | (未确认) | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "LOG_IN_NOTICE", - "data": { - "notice_msg": "为保护用户隐私,未登录无法查看他人昵称", - "image_web": "http://i0.hdslb.com/bfs/dm/75e7c16b99208df259fe0a93354fd3440cbab412.png", - "image_app": "http://i0.hdslb.com/bfs/dm/b632f7dcd3acf47deffb5f9ccc9546ae97a3415b.png" - } -} -``` - -</details> - -#### 用户到达直播间高能榜前三名的消息 (ONLINE_RANK_TOP3) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `ONLINE_RANK_TOP3` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| dmscore | num | 待调查 | | -| list | array | 消息内容和高能榜排名 | | - -`data.list[n]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| msg | str | 消息内容 | | -| rank | num | 该用户的高能榜排名 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ONLINE_RANK_TOP3", - "data": { - "dmscore": 112, - "list": [ - { - "msg": "恭喜 <%你干嘛哈哈哎哟%> 成为高能用户", - "rank": 1 - } - ] - } -} -``` - -</details> - -#### 直播间在人气榜的排名改变 (POPULAR_RANK_CHANGED) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `POPULAR_RANK_CHANGED` | | -| data | obj | 直播间的人气榜排名信息 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| uid | num | 主播 mid | | -| rank | num | 人气榜排名 | | -| countdown | num | 人气榜下轮结算剩余时长 | | -| timestamp | num | 触发时的Unix时间戳 | | -| cache_key | str | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "POPULAR_RANK_CHANGED", - "data": { - "uid": 780791, - "rank": 36, - "countdown": 1927, - "timestamp": 1702578474, - "cache_key": "rank_change:91a4e81ba3034ae894d61e432aa13081" - } -} -``` - -</details> - -#### 直播间限时热门榜排名改变 (HOT_RANK_CHANGED) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `HOT_RANK_CHANGED` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| rank | num | 排名 | | -| trend | num | 趋势? | | -| countdown | num | 剩余时间? | | -| timestamp | num | 当前时间? | UNIX 秒级时间戳 | -| web_url | str | 排行榜 URL | | -| live_url | str | 排行榜 URL | | -| blink_url | str | 排行榜 URL | | -| live_link_url | str | 排行榜 URL | | -| pc_link_url | str | 排行榜 URL | | -| icon | str | 图标 URL | | -| area_name | str | 分区名称 | | -| rank_desc | str | 空? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "HOT_RANK_CHANGED", - "data": { - "rank": 31, - "trend": 1, - "countdown": 1440, - "timestamp": 1651037760, - "web_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&area_id=9&parent_area_id=9&second_area_id=0", - "live_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,12,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,12,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "blink_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "live_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=5&area_id=9&parent_area_id=9&second_area_id=0&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "pc_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&is_live_half_webview=1&area_id=9&parent_area_id=9&second_area_id=0&pc_ui=338,465,f4eefa,0", - "icon": "https://i0.hdslb.com/bfs/live/63217712edb588864b2c714225992e7f46b0b917.png", - "area_name": "虚拟", - "rank_desc": "" - } -} -``` - -</details> - -#### 当前直播间限时热门榜排名改变V2 (HOT_RANK_CHANGED_V2) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `HOT_RANK_CHANGED_V2` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| rank | num | 排名 | | -| trend | num | 趋势? | | -| countdown | num | 剩余时间? | | -| timestamp | num | 当前时间? | UNIX 秒级时间戳 | -| web_url | str | 排行榜 URL | | -| live_url | str | 排行榜 URL | | -| blink_url | str | 排行榜 URL | | -| live_link_url | str | 排行榜 URL | | -| pc_link_url | str | 排行榜 URL | | -| icon | str | 图标 URL | | -| area_name | str | 分区名称 | | -| rank_desc | str | 排行榜说明 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "HOT_RANK_CHANGED_V2", - "data": { - "rank": 31, - "trend": 0, - "countdown": 1440, - "timestamp": 1651037760, - "web_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&area_id=9&parent_area_id=9&second_area_id=371", - "live_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,12,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,12,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "blink_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "live_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=5&area_id=9&parent_area_id=9&second_area_id=371&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0", - "pc_link_url": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&is_live_half_webview=1&area_id=9&parent_area_id=9&second_area_id=371&pc_ui=338,465,f4eefa,0", - "icon": "https://i0.hdslb.com/bfs/live/cb2e160ac4f562b347bb5ae6e635688ebc69580f.png", - "area_name": "虚拟主播", - "rank_desc": "虚拟主播top50" - } -} -``` - -</details> - -#### 限时热门榜上榜信息 (HOT_RANK_SETTLEMENT) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `HOT_RANK_SETTLEMENT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| area_name | str | 分区名称 | | -| cache_key | str | ? | | -| dm_msg | str | 弹幕提示信息 | | -| dmscore | num | ? | | -| face | str | 主播头像 URL | | -| icon | str | 图标 URL | | -| rank | num | 排名 | | -| timestamp | num | 时间 | UNIX 秒级时间戳 | -| uname | str | 主播用户名 | | -| url | str | 排行榜 URL | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "HOT_RANK_SETTLEMENT", - "data": { - "area_name": "虚拟主播", - "cache_key": "2f8baf923a6b7df5a045df6c7181984c", - "dm_msg": "恭喜主播 <% 白黑卡扣 %> 荣登限时热门榜虚拟主播榜top9! 即将获得热门流量推荐哦!", - "dmscore": 144, - "face": "http://i0.hdslb.com/bfs/face/ddfcd696213e07884ce227c6ba6d23a007a08c02.jpg", - "icon": "https://i0.hdslb.com/bfs/live/63217712edb588864b2c714225992e7f46b0b917.png", - "rank": 9, - "timestamp": 1651041000, - "uname": "白黑卡扣", - "url": "https://live.bilibili.com/p/html/live-app-hotrank/result.html?is_live_half_webview=1&hybrid_half_ui=1,5,250,200,f4eefa,0,30,0,0,0;2,5,250,200,f4eefa,0,30,0,0,0;3,5,250,200,f4eefa,0,30,0,0,0;4,5,250,200,f4eefa,0,30,0,0,0;5,5,250,200,f4eefa,0,30,0,0,0;6,5,250,200,f4eefa,0,30,0,0,0;7,5,250,200,f4eefa,0,30,0,0,0;8,5,250,200,f4eefa,0,30,0,0,0&areaId=9&cache_key=2f8baf923a6b7df5a045df6c7181984c" - } -} -``` - -</details> - -#### 限时热门榜上榜信息V2 (HOT_RANK_SETTLEMENT_V2) - -**JSON消息:** - -基本同 [限时热门榜上榜信息](#限时热门榜上榜信息-hot_rank_settlement), 但没有 `data.dmscore` 字段 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "HOT_RANK_SETTLEMENT_V2", - "data": { - "rank": 9, - "uname": "白黑卡扣", - "face": "http://i0.hdslb.com/bfs/face/ddfcd696213e07884ce227c6ba6d23a007a08c02.jpg", - "timestamp": 1651040700, - "icon": "https://i0.hdslb.com/bfs/live/cb2e160ac4f562b347bb5ae6e635688ebc69580f.png", - "area_name": "虚拟主播", - "url": "https://live.bilibili.com/p/html/live-app-hotrank/result.html?is_live_half_webview=1&hybrid_half_ui=1,5,250,200,f4eefa,0,30,0,0,0;2,5,250,200,f4eefa,0,30,0,0,0;3,5,250,200,f4eefa,0,30,0,0,0;4,5,250,200,f4eefa,0,30,0,0,0;5,5,250,200,f4eefa,0,30,0,0,0;6,5,250,200,f4eefa,0,30,0,0,0;7,5,250,200,f4eefa,0,30,0,0,0;8,5,250,200,f4eefa,0,30,0,0,0&areaId=371&cache_key=693b7b029b66976a399cf4e3485d265a", - "cache_key": "693b7b029b66976a399cf4e3485d265a", - "dm_msg": "恭喜主播 <% 白黑卡扣 %> 荣登限时热门榜虚拟主播榜top9! 即将获得热门流量推荐哦!" - } -} -``` - -</details> - -#### 直播间用户点赞 (LIKE_INFO_V3_CLICK) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `LIKE_INFO_V3_CLICK` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| show_area | num | 待调查 | | -| msg_type | num | 待调查 | | -| like_icon | str | 点赞图标的URL | | -| uid | num | 点赞的用户的UID | | -| like_text | str | 点赞文本 | | -| uname | str | 点赞的用户的名称 | | -| uname_color | str | 点赞的用户的名称颜色 | | -| identities | array | 待调查 | | -| fans_medal | obj | 点赞的用户的粉丝勋章信息 | | -| contribution_info | obj | 待调查 | | -| dmscore | num | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "LIKE_INFO_V3_CLICK", - "data": { - "show_area": 0, - "msg_type": 6, - "like_icon": "https://i0.hdslb.com/bfs/live/23678e3d90402bea6a65251b3e728044c21b1f0f.png", - "uid": 32174213, - "like_text": "为主播点赞了", - "uname": "MeiDngS", - "uname_color": "", - "identities": [ - 1 - ], - "fans_medal": { - "target_id": 0, - "medal_level": 0, - "medal_name": "", - "medal_color": 0, - "medal_color_start": 12632256, - "medal_color_end": 12632256, - "medal_color_border": 12632256, - "is_lighted": 0, - "guard_level": 0, - "special": "", - "icon_id": 0, - "anchor_roomid": 0, - "score": 0 - }, - "contribution_info": { - "grade": 0 - }, - "dmscore": 20 - } -} -``` - -</details> - -#### 直播间点赞数更新 (LIKE_INFO_V3_UPDATE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `LIKE_INFO_V3_UPDATE` | | -| data | obj | 直播间点赞数 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| click_count | num | 直播间点赞数 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "LIKE_INFO_V3_UPDATE", - "data": { - "click_count": 3227 - } -} -``` - -</details> - -#### 直播间发红包弹幕 (POPULARITY_RED_POCKET_START) - -注: 开始抽取红包 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `POPULARITY_RED_POCKET_START` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| lot_id | num | 发送的红包的ID | | -| sender_uid | num | 发送者的UID | | -| sender_name | str | 发送者的名称 | | -| sender_face | str | 发送者的头像的URL | | -| join_requirement | num | 待调查 | | -| danmu | str | 用户参与红包时自动发送的弹幕内容 | | -| current_time | num | 服务器发送数据包的Unix时间戳 | | -| start_time | num | 可以开始抢红包的Unix时间戳 | | -| end_time | num | 抢红包的结束时间Unix时间戳 | | -| last_time | num | 红包的持续时间(秒) | start_time - end_time | -| remove_time | num | 待调查 | | -| replace_time | num | 待调查 | | -| lot_status | num | 待调查 | | -| h5_url | str | 红包页面的URL | | -| user_status | num | 用户参与状态,但是不知道是哪个用户 | 1已参与<br />2未参与 | -| awards | array | 红包内包含的礼物的信息 | | -| lot_config_id | num | 待调查 | | -| total_price | num | 内含抽取奖品金瓜子总价值 | 目前红包的 20% 会直接交给主播, 所以 20 电池 (2 CNY) 对应 2000 金瓜子的 80% 是 1600 金瓜子 | -| wait_num | num | 待调查 | | - -`data.awards[n]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| gift_id | num | 礼物ID | | -| gift_name | str | 礼物名称 | | -| gift_pic | str | 礼物图标URL | | -| num | num | 该礼物的数量 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "POPULARITY_RED_POCKET_START", - "data": { - "lot_id": 2062329, - "sender_uid": 181851309, - "sender_name": "毒瘤老肥仔", - "sender_face": "http://i0.hdslb.com/bfs/face/fed3871b01976ddd35fd3f772ffc2d4949f1391d.jpg", - "join_requirement": 1, - "danmu": "老板大气!点点红包抽礼物!", - "current_time": 1650425344, - "start_time": 1650425343, - "end_time": 1650425523, - "last_time": 180, - "remove_time": 1650425538, - "replace_time": 1650425533, - "lot_status": 1, - "h5_url": "https://live.bilibili.com/p/html/live-app-red-envelope/popularity.html?is_live_half_webview=1&hybrid_half_ui=1,5,100p,100p,000000,0,50,0,0,1;2,5,100p,100p,000000,0,50,0,0,1;3,5,100p,100p,000000,0,50,0,0,1;4,5,100p,100p,000000,0,50,0,0,1;5,5,100p,100p,000000,0,50,0,0,1;6,5,100p,100p,000000,0,50,0,0,1;7,5,100p,100p,000000,0,50,0,0,1;8,5,100p,100p,000000,0,50,0,0,1&hybrid_rotate_d=1&hybrid_biz=popularityRedPacket&lotteryId=2062329", - "user_status": 2, - "awards": [ - { - "gift_id": 31212, - "gift_name": "打call", - "gift_pic": "https://s1.hdslb.com/bfs/live/f75291a0e267425c41e1ce31b5ffd6bfedc6f0b6.png", - "num": 2 - }, - { - "gift_id": 31214, - "gift_name": "牛哇", - "gift_pic": "https://s1.hdslb.com/bfs/live/b8a38b4bd3be120becddfb92650786f00dffad48.png", - "num": 3 - }, - { - "gift_id": 31216, - "gift_name": "i了i了", - "gift_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png", - "num": 3 - } - ], - "lot_config_id": 3, - "total_price": 1600, - "wait_num": 0 - } -} -``` - -</details> - -#### 直播间红包 (POPULARITY_RED_POCKET_NEW) - -注: 与 [直播间发红包弹幕](#直播间发红包弹幕-popularity_red_pocket_start) 不同, 那个是发红包的弹幕信息, 这个则和 [送礼](#送礼-send_gift) 的信息相似, 但也有前者的一些字段 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------------------- | ---- | -| cmd | str | `POPULARITY_RED_POCKET_NEW` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ---- | -| lot_id | num | 红包 ID | | -| start_time | num | 开抢时间 | UNIX 秒级时间戳 | -| current_time | num | 当前时间 | UNIX 秒级时间戳 | -| wait_num | num | 0? | | -| uname | str | 发送者用户名 | | -| uid | num | 发送者的 mid | | -| action | str | 礼物操作 | | -| num | num | 礼物数量 | | -| gift_name | str | `红包` | | -| gift_id | num | 礼物 ID? | | -| price | num | 电池标价 | | -| name_color | str | 用户名颜色 | | -| medal_info | obj | 发送者粉丝牌 | | - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "POPULARITY_RED_POCKET_NEW", - "data": { - "lot_id": 2062329, - "start_time": 1650425343, - "current_time": 1650425343, - "wait_num": 0, - "uname": "毒瘤老肥仔", - "uid": 181851309, - "action": "送出", - "num": 1, - "gift_name": "红包", - "gift_id": 13000, - "price": 20, - "name_color": "#00D1F1", - "medal_info": { - "target_id": 11909915, - "special": "", - "icon_id": 0, - "anchor_uname": "", - "anchor_roomid": 0, - "medal_level": 22, - "medal_name": "伊克拉", - "medal_color": 1725515, - "medal_color_start": 1725515, - "medal_color_end": 5414290, - "medal_color_border": 6809855, - "is_lighted": 1, - "guard_level": 3 - } - } -} -``` - -</details> - -#### 直播间抢到红包的用户 (POPULARITY_RED_POCKET_WINNER_LIST) - -注: 红包中奖列表 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------------------------- | ---- | -| cmd | str | `POPULARITY_RED_POCKET_WINNER_LIST` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------- | ---- | -| lot_id | num | 红包 ID | | -| total_num | num | 礼物总数 | | -| winner_info | array | 中奖信息 | | -| awards | obj | 礼物信息 | | -| version | num | | | - -`data.winner_info` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ----- | ------------ | ---- | -| 0 | array | 中奖者 1 | | -| …… | array | …… | | -| n | array | 中奖者 (n+1) | | - -`data.winner_info[n]` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---------------------- | ---- | -| 0 | num | 该抢到红包的用户的 mid | | -| 1 | str | 该抢到红包的用户的名称 | | -| 2 | num | bag_id? | | -| 3 | num | 该用户抢到的礼物的 ID | | - -`data.awards` 对象: - -以 礼物 ID 为键, JSON Object 为值的表 - -`data.awards['?']` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ---- | -| award_type | num | 奖品类型? | | -| award_name | str | 礼物名称 | | -| award_pic | str | 礼物图标 URL | | -| award_big_pic | str | 礼物大图 URL | | -| award_price | num | 礼物价值 | | - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "POPULARITY_RED_POCKET_WINNER_LIST", - "data": { - "lot_id": 8445764, - "total_num": 8, - "winner_info": [ - [ - 38554435, - "我的0019", - 4581509, - 31212 - ], - [ - 516174930, - "云来海遛鸟大爷", - 4606389, - 31212 - ] - ], - "awards": { - "31212": { - "award_type": 1, - "award_name": "打call", - "award_pic": "https://s1.hdslb.com/bfs/live/461be640f60788c1d159ec8d6c5d5cf1ef3d1830.png", - "award_big_pic": "https://i0.hdslb.com/bfs/live/9e6521c57f24c7149c054d265818d4b82059f2ef.png", - "award_price": 500 - }, - "31214": { - "award_type": 1, - "award_name": "牛哇", - "award_pic": "https://s1.hdslb.com/bfs/live/91ac8e35dd93a7196325f1e2052356e71d135afb.png", - "award_big_pic": "https://i0.hdslb.com/bfs/live/3b74c117b4f265edcea261bc5608a58d3a7c300a.png", - "award_price": 100 - }, - "31216": { - "award_type": 1, - "award_name": "i了i了", - "award_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png", - "award_big_pic": "https://i0.hdslb.com/bfs/live/cfb9c3d9bdd2c25c95b7d859ebaa590ca9362adb.png", - "award_price": 100 - } - }, - "version": 1 - } -} -``` - -</details> - -#### 直播间看过人数 (WATCHED_CHANGE) - -注: 当前直播历史观众数量, 可替代人气 - -**正文:** - -数据包的正文, 前19字节的信息未知: - -```text -00000001: 8b38 8000 0000 7200 1000 0000 0000 0500 .8....r......... -00000002: 0000 00 ... -``` - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | ---- | -| cmd | str | `WATCHED_CHANGE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------- | ---- | -| num | num | 看过人数 | | -| text_small | str | 显示文字 (小) | | -| text_large | str | 显示文字 (大) | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WATCHED_CHANGE", - "data": { - "num": 17903, - "text_small": "1.7万", - "text_large": "1.7万人看过" - } -} -``` - -</details> - -#### 用户进场特效 (ENTRY_EFFECT) - -注: 有进场特效的用户进入直播间 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| cmd | str | `ENTRY_EFFECT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------------- | ----- | ---------------- | ---- | -| id | num | ? | | -| uid | num | 进场用户 mid | | -| target_id | num | 主播 mid? | | -| mock_effect | num | ? | | -| face | str | 进场用户头像 URL | | -| privilege_type | num | ? | | -| copy_writing | str | 进场欢迎文本 | | -| copy_color | str | 进场欢迎文本颜色 | 16 进制 | -| highlight_color | str | 高亮颜色? | 16 进制 | -| priority | num | 优先级? | | -| basemap_url | str | 进场特效背景 URL | APP 端 | -| show_avatar | num | 是否显示用户头像 | 1: 显示<br/>0: 不显示 | -| effective_time | num | ? | | -| web_basemap_url | str | 进场特效背景 URL | 网页端 | -| web_effective_time | num | 进场特效生存时间 | 网页端 | -| web_effect_close | num | ? | | -| web_close_time | num | ? | | -| business | num | ? | | -| copy_writing_v2 | str | 进场欢迎文本 | APP 端? | -| icon_list | array | 空? | | -| max_delay_time | num | 最大等待时间? | | -| trigger_time | num | 触发时间戳 | UNIX 纳秒时间戳 | -| identities | num | 标识符? | | -| effect_silent_time | num | ? | | -| effective_time_new | num | ? | | -| web_dynamic_url_webp | str | ? | | -| web_dynamic_url_apng | str | ? | | -| mobile_dynamic_url_webp | str | ? | | -| wealthy_info | obj | 荣耀等级信息 | | -| new_style | num | ? | | -| is_mystery | bool | ? | | -| uinfo | obj | 用户信息 | | -| full_cartoon_id | num | ? | | -| priority_level | num | ? | | -| wealth_style_info | obj | 荣耀等级样式信息 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ENTRY_EFFECT", - "data": { - "id": 380, - "uid": 31382283, - "target_id": 12892411, - "mock_effect": 0, - "face": "https://i0.hdslb.com/bfs/face/876e30e89faa5672858cc17bdb357362ec96bc29.jpg", - "privilege_type": 0, - "copy_writing": "<%WYCBat%> 来了", - "copy_color": "#F7F7F7", - "highlight_color": "#FFFFFF", - "priority": 1, - "basemap_url": "", - "show_avatar": 0, - "effective_time": 0, - "web_basemap_url": "https://i0.hdslb.com/bfs/live/mlive/19e7564ed9d466b02f341abfa979c6e38c2ffffb.png", - "web_effective_time": 4, - "web_effect_close": 1, - "web_close_time": 900, - "business": 6, - "copy_writing_v2": "<%WYCBat%> 来了", - "icon_list": [], - "max_delay_time": 7, - "trigger_time": 1748545763327647435, - "identities": 1, - "effect_silent_time": 0, - "effective_time_new": 0, - "web_dynamic_url_webp": "", - "web_dynamic_url_apng": "", - "mobile_dynamic_url_webp": "", - "wealthy_info": { - "uid": 0, - "level": 17, - "level_total_score": 0, - "cur_score": 0, - "upgrade_need_score": 0, - "status": 0, - "dm_icon_key": "" - }, - "new_style": 1, - "is_mystery": false, - "uinfo": { - "uid": 31382283, - "base": { - "name": "WYCBat", - "face": "https://i0.hdslb.com/bfs/face/876e30e89faa5672858cc17bdb357362ec96bc29.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": null, - "official_info": null, - "name_color_str": "" - }, - "medal": null, - "wealth": { - "level": 17, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 0, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "full_cartoon_id": 1802, - "priority_level": 0, - "wealth_style_info": { - "url": "https://i0.hdslb.com/bfs/live/b6f2bf3e27f22b3039594842f0005b05a0dc5dae.png" - } - } -} -``` - -</details> - -#### 必须接受的用户进场特效 (ENTRY_EFFECT_MUST_RECEIVE) - -注: 在部分主播进入自己的直播间时下发。 - -结构与 [用户进场特效 (ENTRY_EFFECT)](#用户进场特效-ENTRY_EFFECT) 完全相同。 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ENTRY_EFFECT_MUST_RECEIVE", - "data": { - "id": 135, - "uid": 438160221, - "target_id": 438160221, - "mock_effect": 0, - "face": "https://i0.hdslb.com/bfs/face/member/noface.jpg", - "privilege_type": 0, - "copy_writing": "<%weatfe%> 来了", - "copy_color": "#000000", - "highlight_color": "#FFF100", - "priority": 1, - "basemap_url": "https://i0.hdslb.com/bfs/live/mlive/da6933ea70f31c4df63f4b68b735891284888357.png", - "show_avatar": 1, - "effective_time": 1, - "web_basemap_url": "https://i0.hdslb.com/bfs/live/mlive/da6933ea70f31c4df63f4b68b735891284888357.png", - "web_effective_time": 2, - "web_effect_close": 0, - "web_close_time": 900, - "business": 3, - "copy_writing_v2": "<%weatfe%> 来了", - "icon_list": [], - "max_delay_time": 7, - "trigger_time": 1746031259272981482, - "identities": 1, - "effect_silent_time": 0, - "effective_time_new": 0, - "web_dynamic_url_webp": "", - "web_dynamic_url_apng": "", - "mobile_dynamic_url_webp": "", - "wealthy_info": null, - "new_style": 0, - "is_mystery": false, - "uinfo": { - "uid": 438160221, - "base": { - "name": "weatfe", - "face": "https://i0.hdslb.com/bfs/face/member/noface.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": null, - "origin_info": null, - "official_info": null, - "name_color_str": "" - }, - "medal": { - "name": "粉丝团", - "level": 11, - "color_start": 9272486, - "color_end": 9272486, - "color_border": 9272486, - "color": 9272486, - "id": 2956282, - "typ": 0, - "is_light": 1, - "ruid": 438160221, - "guard_level": 0, - "score": 16000, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#596FE099", - "v2_medal_color_end": "#596FE099", - "v2_medal_color_border": "#596FE099", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": { - "level": 5, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 0, - "expired_str": "" - }, - "uhead_frame": null, - "guard_leader": null - }, - "full_cartoon_id": 0, - "priority_level": 0, - "wealth_style_info": { - "url": "https://i0.hdslb.com/bfs/live/24f6ef867c3905064136f5c4e33a8d423d41ebdd.png" - } - } -} -``` - -</details> - -#### 全屏特效 (FULL_SCREEN_SPECIAL_EFFECT) - -**示例:** - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "cmd": "FULL_SCREEN_SPECIAL_EFFECT", - "data": { - "type": 2, - "ids": [ - 514 - ], - "queue": 2, - "platform_in": [ - 1, - 2 - ] - } -} -``` - -</details> - -#### 直播间在所属分区的排名改变 (AREA_RANK_CHANGED) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `AREA_RANK_CHANGED` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------ | ---- | -| conf_id | num | 配置 ID? | | -| rank_name | str | 排行榜名称 | | -| uid | num | 主播 mid | | -| rank | num | 直播间在分区的排名 | 没有上榜则为 0 | -| icon_url_blue | str | 蓝色排名图标 URL | | -| icon_url_pink | str | 粉色排名图标 URL | | -| icon_url_grey | str | 灰色排名图标 URL | | -| action_type | num | ? | | -| timestamp | num | 当前时间 | UNIX 秒级时间戳 | -| msg_id | str | ? | 一串 UUID | -| jump_url_link | str | 排行榜跳转链接 | | -| jump_url_pc | str | 排行榜跳转链接 | | -| jump_url_pink | str | 排行榜跳转链接 | | -| jump_url_web | str | 排行榜跳转链接 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "AREA_RANK_CHANGED", - "data": { - "conf_id": 23, - "rank_name": "手游航海", - "uid": 27717502, - "rank": 4, - "icon_url_blue": "https://i0.hdslb.com/bfs/live/18e2990a546d33368200f9058f3d9dbc4038eb5c.png", - "icon_url_pink": "https://i0.hdslb.com/bfs/live/a6c490c36e88c7b191a04883a5ec15aed187a8f7.png", - "icon_url_grey": "https://i0.hdslb.com/bfs/live/cb7444b1faf1d785df6265bfdc1fcfc993419b76.png", - "action_type": 1, - "timestamp": 1673625610, - "msg_id": "e93c7860-b901-41ca-aad8-fe538a5fac9c", - "jump_url_link": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=3&ruid=27717502&conf_id=23&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0#/area-rank", - "jump_url_pc": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=4&ruid=27717502&conf_id=23&pc_ui=338,465,f4eefa,0#/area-rank", - "jump_url_pink": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=1&ruid=27717502&conf_id=23&is_live_half_webview=1&hybrid_rotate_d=1&is_cling_player=1&hybrid_half_ui=1,3,100p,70p,f4eefa,0,30,100,0,0;2,2,375,100p,f4eefa,0,30,100,0,0;3,3,100p,70p,f4eefa,0,30,100,0,0;4,2,375,100p,f4eefa,0,30,100,0,0;5,3,100p,70p,f4eefa,0,30,100,0,0;6,3,100p,70p,f4eefa,0,30,100,0,0;7,3,100p,70p,f4eefa,0,30,100,0,0;8,3,100p,70p,f4eefa,0,30,100,0,0#/area-rank", - "jump_url_web": "https://live.bilibili.com/p/html/live-app-hotrank/index.html?clientType=2&ruid=27717502&conf_id=23#/area-rank" - } -} -``` - -</details> - -#### 广播通知弹幕信息 (COMMON_NOTICE_DANMAKU) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `COMMON_NOTICE_DANMAKU` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| biz_id | num | 待调查 | | -| content_segments | array | 文本分段 | | -| danmaku_style | obj | 文本样式信息 | 可能不存在 | -| danmaku_url | str | 待调查 | | -| dmscore | num | 待调查 | | -| terminals | array | 指定显示的终端 | 数字数组 | - -`data.content_segments[n]` 数组中的对象 - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| background_color | arr 或 null | 背景颜色? | 字符串数组,可能不存在 | -| background_color_dark | arr 或 null | 深色模式背景颜色? | 可能不存在 | -| font_bold | bool | text 字段是否加粗? | 可能不存在 | -| font_color | str | text 字段的十六进制颜色值 | | -| font_color_dark | str | text 字段的十六进制颜色值 | APP端设置为深色模式时使用,可能不存在 | -| highlight_font_color | str | text 字段高亮部分的十六进制颜色值? | 可能不存在 | -| highlight_font_color_dark | str | text 字段高亮部分的十六进制颜色值? | 深色模式时使用,可能不存在 | -| img_height | num | 图片高度 | 可能不存在 | -| img_url | str | 图片链接 | 可能不存在 | -| img_width | str | 图片宽度 | 可能不存在 | -| text | str | 文本 | | -| type | num | 文本组件类型 | 1:普通文本<br />2:图片<br />3:链接 | -| uri | str | 链接 | 文本组件类型为 `3` 时存在 | - -`data.danmaku_style` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| background_color | str | 文本背景颜色的十六进制颜色值 | | -| background_color_dark | str | 文本背景颜色的十六进制颜色值 | APP端设置为深色模式时使用 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "COMMON_NOTICE_DANMAKU", - "data": { - "content_segments": [ - { - "font_color": "#FB7299", - "text": "春日限时任务:任务即将结束,抓紧完成获取3元红包奖励吧!未完成任务进度将重置", - "type": 1 - } - ], - "dmscore": 144, - "terminals": [ - 1, - 2, - 3, - 4, - 5 - ] - } -} -``` - -```json -{ - "cmd": "COMMON_NOTICE_DANMAKU", - "data": { - "biz_id": 0, - "content_segments": [ - { - "font_color": "#CCCCCC", - "font_color_dark": "#CCCCCC", - "text": "恭喜主播 时雨ioo ", - "type": 1 - }, - { - "font_color": "#F494AF", - "font_color_dark": "#F494AF", - "text": "成为手游航海当前第5名", - "type": 1 - } - ], - "danmaku_style": { - "background_color": null, - "background_color_dark": null - }, - "danmaku_uri": "", - "dmscore": 144, - "terminals": [ - 1, - 2, - 3 - ] - } -} -``` - -```json -{ - "cmd": "COMMON_NOTICE_DANMAKU", - "data": { - "content_segments": [ - { - "background_color": null, - "background_color_dark": null, - "font_bold": false, - "font_color": "#F294AE", - "font_color_dark": "", - "highlight_font_color": "", - "highlight_font_color_dark": "", - "img_height": 0, - "img_url": "", - "img_width": 0, - "text": "疯狂星期五:疯狂任务今日24点结束,请关注任务完成情况~", - "type": 1 - }, - { - "background_color": [ - "#FA729A" - ], - "background_color_dark": null, - "font_bold": false, - "font_color": "#FFFFFF", - "font_color_dark": "", - "highlight_font_color": "", - "highlight_font_color_dark": "", - "img_height": 0, - "img_url": "", - "img_width": 0, - "text": "立即查看", - "type": 3, - "uri": "https://live.bilibili.com/p/html/bilili-page-gift-intro-container/index.html?is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,0,0,30,100,12;2,2,375,100p,0,0,30,100,0;3,3,100p,544,0,0,30,100,12;4,2,375,100p,0,0,30,100,0;5,3,100p,70p,0,0,30,100,0;6,3,100p,70p,0,0,30,100,0;7,3,100p,70p,0,0,30,100,0;8,3,100p,70p,0,0,30,100,0&gift_id=32251&roomId=6154037&anchorId=194484313&sendTargetUid=194484313&active_tab=1" - } - ], - "danmaku_style": { - "background_color": null, - "background_color_dark": null - }, - "dmscore": 1008, - "terminals": [ - 1, - 2, - 3, - 4, - 5 - ] - } -} -``` - -</details> - -#### 直播间信息更改 (ROOM_CHANGE) - -注: 例如直播间标题更改、直播间分区更改 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `ROOM_CHANGE` | | -| data | obj | | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| title | str | 直播间标题 | | -| area_id | num | 当前直播间所属二级分区的ID | | -| parent_area_id | num | 当前直播间所属一级分区的ID | | -| area_name | str | 当前直播间所属二级分区的名称 | | -| parent_area_name | str | 当前直播间所属一级分区名称 | | -| live_key | str | 标记直播场次的key | 未开播更新直播间信息时为`"0"` | -| sub_session_key | str | 待调查 | 未开播更新直播间信息时为`""`(空字符串) | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -已开播: - -```json -{ - "cmd": "ROOM_CHANGE", - "data": { - "title": "开始白给CS", - "area_id": 371, - "parent_area_id": 9, - "area_name": "虚拟主播", - "parent_area_name": "虚拟主播", - "live_key": "320830629635915849", - "sub_session_key": "320830629635915849sub_time:1673690546" - } -} -``` - -未开播: - -```json -{ - "cmd": "ROOM_CHANGE", - "data": { - "title": "随缘", - "area_id": 216, - "parent_area_id": 6, - "area_name": "我的世界", - "parent_area_name": "单机游戏", - "live_key": "0", - "sub_session_key": "" - } -} -``` - -</details> - -#### 直播间内容审核报告 (ROOM_CONTENT_AUDIT_REPORT) - -注:这个数据包需要更新直播间标题且使用主播的登录信息才会下发,更新直播间标题后一般不会立刻下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ROOM_CONTENT_AUDIT_REPORT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| audit_content_type | num | 审核内容类型? | | -| room\_id | num | 直播间ID | 未知是真实ID还是短号 | -| anchor\_uid | num | 主播的用户mid | | -| audit\_status | num | 审核状态? | | -| audit\_title | str | 被审核的直播间标题 | | -| audit\_reason | str | 审核结果 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_CONTENT_AUDIT_REPORT", - "data": { - "audit_content_type": 1, - "room_id": 1899237171, - "anchor_uid": 438160221, - "audit_status": 2, - "audit_title": "崩坏学园2", - "audit_reason": "一审通过" - } -} -``` - -</details> - -#### 醒目留言按钮 (SUPER_CHAT_ENTRANCE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `SUPER_CHAT_ENTRANCE` | | -| data | obj | 醒目留言按钮的信息 | | -| roomid | num | 直播间ID | 未知是短号还是真实ID | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | --- | ------ | --------- | -| status | num | 待调查 | | -| jump_url | str | 按下“醒目留言”按钮后弹出小窗的页面URL | | -| icon | str | “醒目留言”按钮图标的URL | | -| broadcast_type | num | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SUPER_CHAT_ENTRANCE", - "data": { - "status": 1, - "jump_url": "https://live.bilibili.com/p/html/live-app-superchat2/index.html?is_live_half_webview=1&hybrid_half_ui=1,3,100p,70p,ffffff,0,30,100;2,2,375,100p,ffffff,0,30,100;3,3,100p,70p,ffffff,0,30,100;4,2,375,100p,ffffff,0,30,100;5,3,100p,60p,ffffff,0,30,100;6,3,100p,60p,ffffff,0,30,100;7,3,100p,60p,ffffff,0,30,100", - "icon": "https://i0.hdslb.com/bfs/live/0a9ebd72c76e9cbede9547386dd453475d4af6fe.png", - "broadcast_type": 1 - }, - "roomid": "8618057" -} -``` - -</details> - -#### 顶部横幅 (WIDGET_BANNER) - -注: 网页端在直播间标题下面的横幅, 例如 限时任务 等 - -**JSON消息:** - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `WIDGET_BANNER` | | -| data | obj | 横幅信息 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| timestamp | num | 服务器发送数据包时的Unix时间戳 | | -| widget_list | obj | 横幅信息 | 待调查 | - -`data.widget_list` 对象: - -以 横幅 ID 为键, JSON Object 为值的表 - -`data.widget_list['?']` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| id | num | 横幅ID | | -| title | str | 待调查 | | -| cover | str | 待调查 | | -| web_cover | str | 待调查 | | -| tip_text | str | 待调查 | | -| tip_text_color | str | 待调查 | | -| tip_bottom_color | str | 待调查 | | -| jump_url | str | 点击横幅后出现小窗的页面的URL | | -| url | str | 待调查 | | -| stay_time | num | 待调查 | | -| site | num | 待调查 | | -| platform_in | array | 待调查 | | -| type | num | 待调查 | | -| band_id | num | 待调查 | | -| sub_key | str | 待调查 | | -| sub_data | str | 横幅数据 | | -| is_add | bool | 待调查 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WIDGET_BANNER", - "data": { - "timestamp": 1673684868, - "widget_list": { - "308": { - "id": 308, - "title": "一月限时任务", - "cover": "", - "web_cover": "", - "tip_text": "限时任务", - "tip_text_color": "", - "tip_bottom_color": "", - "jump_url": "https://live.bilibili.com/activity/live-activity-battle/index.html?app_name=time_limited_task_jan_2023&is_live_half_webview=1&hybrid_rotate_d=1&hybrid_half_ui=1,3,100p,70p,0,0,0,0,12,0;2,2,375,100p,0,0,0,0,12,0;3,3,100p,70p,0,0,0,0,12,0;4,2,375,100p,0,0,0,0,12,0;5,3,100p,70p,0,0,0,0,12,0;6,3,100p,70p,0,0,0,0,12,0;7,3,100p,70p,0,0,0,0,12,0;8,3,100p,70p,0,0,0,0,12,0&room_id=8618057&uid=29857468#/", - "url": "", - "stay_time": 5, - "site": 1, - "platform_in": [ - "live", - "blink", - "live_link", - "web", - "pc_link" - ], - "type": 1, - "band_id": 101558, - "sub_key": "", - "sub_data": "%7B%22task_status%22%3A0%2C%22current_val%22%3A10%2C%22target_val%22%3A1200%2C%22timeout%22%3A1673687024%2C%22reward_price%22%3A8%2C%22reward_type%22%3A1%7D", - "is_add": true - } - } - } -} -``` - -</details> - -#### 礼物心愿单进度 (WIDGET_WISH_LIST) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `WIDGET_WISH_LIST` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| wish | array | 礼物心愿单信息 | | -| wish_status | num | ? | | -| sid | num | ? | | -| wish_status_info | array | ? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WIDGET_WISH_LIST", - "data": { - "wish": [ - { - "type": 3, - "gift_id": 10003, - "gift_name": "舰长", - "gift_img": "https://i0.hdslb.com/bfs/live/f1be2a2d5b227ce72641de1ad64bcc7f9e4111c3.png", - "gift_price": 198000, - "target_num": 5, - "current_num": 0 - }, - { - "type": 2, - "gift_id": 3, - "gift_name": "B坷垃", - "gift_img": "https://s1.hdslb.com/bfs/live/cc8bfcbc24c8b65937f62ce0d16b31ab987dce47.png", - "gift_price": 9900, - "target_num": 5, - "current_num": 0 - }, - { - "type": 2, - "gift_id": 31039, - "gift_name": "牛哇牛哇", - "gift_img": "https://s1.hdslb.com/bfs/live/b8a38b4bd3be120becddfb92650786f00dffad48.png", - "gift_price": 100, - "target_num": 10, - "current_num": 0 - } - ], - "wish_status": 1, - "sid": 477, - "wish_status_info": [ - { - "wish_status_msg": "设定心 愿", - "wish_status_img": "https://i0.hdslb.com/bfs/live/38f82bac32794e79776f7371269453652bd58a87.png", - "wish_status": 0 - }, - { - "wish_status_msg": "达成", - "wish_status_img": "https://i0.hdslb.com/bfs/live/1dae635924437239fc69e561a1a9467508521249.png", - "wish_status": 2 - }, - { - "wish_status_msg": "收集失败", - "wish_status_img": "https://i0.hdslb.com/bfs/live/3bbd30fdd32d085cc90e9ccd98c65a886dca9a8f.png", - "wish_status": 3 - } - ], - "wish_name": "心愿" - } -} -``` - -</details> - -#### 礼物星球信息 (WIDGET_WISH_INFO) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `WIDGET_WISH_INFO` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| sid | num | (?) | | -| wish | arr | 礼物需求信息 | | -| jump_url | str | 用户端礼物星球界面 | | -| wish_status | num | 礼物星球状态 | | -| card_text | str | 卡片提示文本 | | -| modal_text | str | 需求标题 | | -| button_text | str | 按钮文本 | | -| show_time | num | 显示时间 | 单位秒 | -| ts | num | 发送时间戳 | Unix秒时间戳 | -| tid | num | (?) | | -| wish_status_info | arr | 状态对照信息 | | -| wish_name | str | 礼物星球名称 | | - -`data.wish` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| gift_id | num | 礼物id | | -| target_num | num | 需求数量 | | -| gift_img | str | 礼物图片URL | | -| gift_price | num | 礼物金瓜子标价 | CNY×1000 | -| gift_name | str | 礼物名称 | | -| wish_status | num | 该礼物达成状态 | | - -`data.wish_status_info` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| wish_status_msg | str | 状态提示信息 | | -| wish_status_img | str | 状态图片URL | | -| wish_status | str | 状态 | | -| wish_status_desc | str | 状态描述 | 不一定存在 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WIDGET_WISH_INFO", - "data": { - "sid": 658537, - "wish": [ - { - "gift_id": 31036, - "target_num": 1, - "gift_img": "https://s1.hdslb.com/bfs/live/8b40d0470890e7d573995383af8a8ae074d485d9.png", - "gift_price": 100, - "gift_name": "小花花", - "wish_status": 1 - }, - { - "gift_id": 30758, - "target_num": 1, - "gift_img": "https://s1.hdslb.com/bfs/live/3ddb10b055b9d1826829ec0fad93ab56484d4a90.png", - "gift_price": 100, - "gift_name": "这个好诶", - "wish_status": 1 - }, - { - "gift_id": 31039, - "target_num": 1, - "gift_img": "https://s1.hdslb.com/bfs/live/91ac8e35dd93a7196325f1e2052356e71d135afb.png", - "gift_price": 100, - "gift_name": "牛哇牛哇", - "wish_status": 1 - } - ], - "jump_url": "https://live.bilibili.com/p/html/bilili-page-gift-wishes-mix-planet/user.html?is_live_half_webview=1&hybrid_half_ui=1,3,100p,70p,0,0,30,100,15,0;2,2,375,100p,0,0,30,100,15,0;3,3,100p,70p,0,0,30,100,15,0;4,2,375,100p,0,0,30,100,15,0;5,3,100p,70p,0,0,30,100,15,0;6,3,100p,70p,0,0,30,100,15,0;7,3,100p,70p,0,0,30,100,15,0;8,3,100p,70p,0,0,30,100,15,0", - "wish_status": 1, - "card_text": "主播今日心愿还未完成", - "modal_text": "今日心愿礼物", - "button_text": "去助力", - "show_time": 5, - "ts": 1746257134, - "tid": 6585370000, - "wish_status_info": [ - { - "wish_status_msg": "礼物星球待点亮", - "wish_status_img": "https://i0.hdslb.com/bfs/live/e507f8b101289b2ce6741880a28304215a65f5bf.png", - "wish_status": -1 - }, - { - "wish_status_msg": "今日心愿暂未达成", - "wish_status_img": "https://i0.hdslb.com/bfs/live/e507f8b101289b2ce6741880a28304215a65f5bf.png", - "wish_status": 1 - }, - { - "wish_status_msg": "今日心愿已达成", - "wish_status_img": "https://i0.hdslb.com/bfs/live/e507f8b101289b2ce6741880a28304215a65f5bf.png", - "wish_status": 2, - "wish_status_desc": "已完成" - } - ], - "wish_name": "心愿礼物" - } -} -``` - -</details> - -#### 下播的直播间 (STOP_LIVE_ROOM_LIST) - -注: 估计是更新关注的主播直播状态的 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| cmd | str | `STOP_LIVE_ROOM_LIST` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | --------- | -| room_id_list | array | 下播的直播间ID | | - -`data.room_id_list` 数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---- | ---- | -| 0 | num | 第 1 个下播的直播间 ID | | -| 1 | num | 第 2 个下播的直播间 ID | | -| …… | num | …… | | -| n | num | 第 (n+1) 个下播的直播间 ID | | - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "STOP_LIVE_ROOM_LIST", - "data": { - "room_id_list": [ - 14507570, 23963084, 24370437, 24380902, 24889494, - 22735090, 24268758, 24668544, 38325, 24762357, - 3222966, 6684395, 24199566, 24864470, 10224194, - 14953052, 6198131, 898214, 10412034, 22506883, - 23932516, 6768714, 24392281, 1799500, 22392518, - 22976729, 21557043, 24896092, 11718936, 21612704, - 21778117, 24145539, 23178318, 23575414, 24842462, - 22245210, 24895499, 3133873, 1298898, 22175308, - 3600684, 2053035, 270652, 24877480, 3854611, - 21512488, 24393104, 24756457, 4630683, 6955412, - 23199465, 2880481, 23868339, 717791, 24068307, - 24875243, 22777819, 24896061, 24619665 - ] - } -} -``` - -</details> - -#### 系统信息 (SYS_MSG) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `SYS_MSG` | | -| msg | str | 提示信息 | | -| url | str | 跳转 URL | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "SYS_MSG", - "msg": "争夺开启,时间周五20点至周日20点,逾期不候哟!", - "url": "" -} -``` - -</details> - -#### 警告 (WARNING) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `WARNING` | | -| msg | str | 警告信息 | | -| roomid | num | 直播间 ID | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WARNING", - "msg": "图片内容不适宜,请立即调整", - "roomid": 22195814 -} -``` - -</details> - -#### 切断 (CUT_OFF) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `CUT_OFF` | | -| msg | str | 切断原因 | | -| roomid | num | 直播间 ID | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "CUT_OFF", - "msg": "违反直播言论规范,请立即调整", - "roomid": 23993070 -} -``` - -</details> - -#### 切断V2 (CUT_OFF_V2) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `CUT_OFF_V2` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cut_off_scene | num | | | -| timestamp | num | 操作时间戳 | UNIX 秒时间戳 | -| cut_off_version | num | 切断提示信息版本? | | -| cut_off_data | obj | 切断提示信息 | | - -`data.cut_off_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cut_off_title | str | 对话框窗口标题 | | -| cut\_off\_message\_list | array | 对话框正文列表 | | -| cut\_off\_tip\_list | array | 对话框提示信息列表 | | -| cut\_off\_button\_list | array | 对话框按钮列表 | | - -`data.cut_off_data.cut_off_message_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 首个正文信息 | | -| … | obj | 单个正文信息 | | -| i | obj | 最后正文信息 | | - -`data.cut_off_data.cut_off_message_list[i]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | num | 显示类别 | `1`:一个“`label`:`content`”格式的信息 | -| label | str | 标签 | | -| content | str | 内容 | | - -`data.cut_off_data.cut_off_tip_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 首个提示行信息 | | -| … | obj | 单个提示行信息 | | -| i | obj | 最后提示行信息 | | - -`data.cut_off_data.cut_off_tip_list[i]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| show\_platform | array | 要在哪个客户端显示的指代 | | -| message_list | array | 提示信息列表 | | - -`data.cut_off_data.cut_off_tip_list[i].message_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -|:---:| --- | --- | --- | -| 0 | obj | 首个提示组件信息 | | -| … | obj | 单个提示组件信息 | | -| i1 | obj | 最后提示组件信息 | | - -`data.cut_off_data.cut_off_tip_list[i].message_list[i1]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | num | 显示类型 | `1`:纯文本<br />`2`:链接 | -| content | str | 显示文本 | | -| link_url | str | 链接 | type为2时有内容 | - -`data.cut_off_data.cut_off_button_list` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 首个按钮信息 | | -| … | obj | 单个按钮信息 | | -| i | obj | 最后按钮信息 | | - -`data.cut_off_data.cut_off_button_list[i]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| show_platform | array | 要在那个客户端显示的指代 | `1`和`2`可能是手机直播姬<br />`3`和`4`可能是pc直播姬或网页直播姬 | -| button\_text | str | 按钮文本 | | -| button\_action | num | 按钮操作 | `1`:关闭窗口?<br />`2`:跳转到链接? | -| button_link_url | str | 跳转链接 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "CUT_OFF_V2", - "data": { - "cut_off_scene": 1, - "timestamp": 1731590280, - "cut_off_version": 1, - "cut_off_data": { - "cut_off_title": "违规提示", - "cut_off_message_list": [ - { - "type": 1, - "label": "处罚结果", - "content": "切断本场直播" - }, - { - "type": 1, - "label": "违规原因", - "content": "您本场直播存在挂机、录播等消极直播行为,因此直播被切断,请您及时整改" - }, - { - "type": 1, - "label": "处罚时间", - "content": "2024年11月14日21时17分" - } - ], - "cut_off_tip_list": [ - { - "show_platform": [ - 3, - 4 - ], - "message_list": [ - { - "type": 1, - "content": "请在", - "link_url": "" - }, - { - "type": 2, - "content": "【处罚中心】", - "link_url": "https://link.bilibili.com/p/center/index?my-room/violation-records#/my-room/violation-records" - }, - { - "type": 1, - "content": "查看你的违规记录", - "link_url": "" - } - ] - } - ], - "cut_off_button_list": [ - { - "show_platform": [ - 1, - 2 - ], - "button_text": "了解详情", - "button_action": 2, - "button_link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?-Abrowser=live&is_live_webview=1" - }, - { - "show_platform": [ - 3, - 4 - ], - "button_text": "我知道了", - "button_action": 1, - "button_link_url": "" - } - ] - } - } -} -``` - -</details> - -#### 直播对话框 (ANCHOR_ECOLOGY_LIVING_DIALOG) - -注:推测在自动检测到画面不怎么变化且没人聊天时警告下发,见[#1139(issue正文)](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1139#issue-2657488653)。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ANCHOR_ECOLOGY_LIVING_DIALOG` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| dialog\_scene | num | | | -| timestamp | num | 触发时间戳 | UNIX 秒时间戳 | -| valid_timestamp | num | | | -| dialog\_top\_vertical\_img | str | | | -| dialog\_top\_landscape_img | str | | | -| dialog\_title | str | 对话框标题 | | -| dialog_message_list | array | 对话框正文列表 | 参见`CUT_OFF_V2` | -| dialog_tip_list | array | 对话框提示信息列表 | 参见`CUT_OFF_V2` | -| dialog_button_list | array | 对话框按钮列表 | 参见`CUT_OFF_V2` | - -`data.dialog_message_list` 数组: - -同`CUT_OFF_V2`的`data.cut_off_data.cut_off_message_list`数组。 - -`data.dialog_tip_list` 数组: - -同`CUT_OFF_V2`的`data.cut_off_data.cut_off_tip_list`数组。 - -`data.dialog_button_list` 数组: - -同`CUT_OFF_V2`的`data.cut_off_data.cut_off_button_list`数组。 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ANCHOR_ECOLOGY_LIVING_DIALOG", - "data": { - "dialog_scene": 1, - "timestamp": 1731504845, - "valid_timestamp": 0, - "dialog_top_vertical_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", - "dialog_top_landscape_img": "https://i0.hdslb.com/bfs/live/ee359d3e89bb044914f72a557a4ac2d3b5ba4004.png", - "dialog_title": "直播间违规", - "dialog_message_list": [ - { - "type": 1, - "label": "处罚结果", - "content": "警告" - }, - { - "type": 1, - "label": "违规原因", - "content": "您本场直播存在挂机、录播等消极直播行为,请及时整改" - }, - { - "type": 1, - "label": "处罚时间", - "content": "2024年11月13日21时34分" - } - ], - "dialog_tip_list": [ - { - "show_platform": [ - 1, - 2 - ], - "message_list": [ - { - "type": 1, - "content": "请在", - "link_url": "" - }, - { - "type": 2, - "content": "【处罚中心】", - "link_url": "https://live.bilibili.com/p/html/live-anchor-galaxy/violation_records/mobile.html?is_live_half_webview=1u0026hybrid_rotate_d=1u0026is_cling_player=1u0026hybrid_half_ui=1,3,100p,70p,0,1,30,100;2,2,375,100p,0,1,30,100;3,3,100p,70p,0,1,30,100;4,2,375,100p,0,1,30,100;5,3,100p,70p,0,1,30,100;6,3,100p,70p,0,1,30,100;7,3,100p,70p,0,1,30,100;8,3,100p,70p,0,1,30,100#/" - }, - { - "type": 1, - "content": "查看你的违规记录", - "link_url": "" - } - ] - }, - { - "show_platform": [ - 3, - 4 - ], - "message_list": [ - { - "type": 1, - "content": "请在", - "link_url": "" - }, - { - "type": 2, - "content": "【处罚中心】", - "link_url": "https://link.bilibili.com/#/my-room/violation-records?jump_type=browser&app_common=open" - }, - { - "type": 1, - "content": "查看你的违规记录", - "link_url": "" - } - ] - } - ], - "dialog_button_list": [ - { - "show_platform": [ - 1, - 2, - 3, - 4 - ], - "button_text": "我知道了", - "button_action": 1, - "button_link_url": "" - } - ] - } -} -``` - -</details> - -#### 直播间背景图片修改 (CHANGE_ROOM_INFO) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `CHANGE_ROOM_INFO` | | -| background | str | 背景图 URL | | -| roomid | num | 直播间 ID | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "CHANGE_ROOM_INFO", - "background": "https://i0.hdslb.com/bfs/live/2388faed3728f3396052273ad4c3c9af21c411fc.jpg", - "roomid": 23993070 -} -``` - -</details> - -#### 直播间皮肤变更 (ROOM_SKIN_MSG) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ROOM_SKIN_MSG` | | -| skin_id | num | 皮肤 ID | | -| status | num | 状态? | | -| end_time | num | 皮肤结束时间? | UNIX 秒级时间戳 | -| current_time | num | 当前时间 | UNIX 秒级时间戳 | -| only_local | bool | 仅在本地显示? | | -| scatter | obj | ? | | -| skin_config | obj | 皮肤配置 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_SKIN_MSG", - "skin_id": 353, - "status": 1, - "end_time": 1652620669, - "current_time": 1652015870, - "only_local": false, - "scatter": { - "min": 1, - "max": 200 - }, - "skin_config": { - "android": { - "1": { - "zip": "https://i0.hdslb.com/bfs/live/fab943a5d7eeb871ecf06413283d17536e67ab91.zip", - "md5": "011EBB3E14192212FD50852245DC74FA" - } - }, - "ios": { - "1": { - "zip": "https://i0.hdslb.com/bfs/live/e7d8768dcb3975d82d794fe6b39756317916a7fe.zip", - "md5": "B1223577FE9C5C248EC1326CDACF8379" - } - }, - "ipad": { - "1": { - "zip": "https://i0.hdslb.com/bfs/live/0856e17be073d75b70098609ae26572ba1534605.zip", - "md5": "481AE75FFD0E0DE91EAFB5B6E0F8936B" - } - }, - "web": { - "1": { - "zip": "https://i0.hdslb.com/bfs/live/0b3770980e600f23629c8445fd211d4a12ec4b6f.zip", - "md5": "8F98F79F02DEFE8B69EE2F6DE7416DFF", - "platform": "web", - "version": "1", - "headInfoBgPic": "https://i0.hdslb.com/bfs/live/d293e69b70af34df0fef086a86552b1761a33a75.jpg", - "giftControlBgPic": "https://i0.hdslb.com/bfs/live/1a124c5547c784f41dc3d7f65f446c56c4cbb73e.jpg", - "rankListBgPic": "https://i0.hdslb.com/bfs/live/af8580a956d0eac6ea1d2cc97ea743d435a86874.jpg", - "mainText": "#FFffffff", - "normalText": "#FFffffff", - "highlightContent": "#FFffd119", - "border": "#FFaec2ff", - "buttonText": "#FF123ab2" - } - } - } -} -``` - -</details> - -#### 开启等级禁言 (ROOM_SILENT_ON) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| data | obj | 信息本体 | | -| cmd | str | `ROOM_SILENT_ON` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | str | 类型? | | -| level | num | 等级? | | -| second | num | 时间? | UNIX 秒级时间戳 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "data": { - "type": "member", - "level": 1, - "second": 1651000426 - }, - "cmd": "ROOM_SILENT_ON" -} -``` - -</details> - -#### 关闭等级禁言 (ROOM_SILENT_OFF) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| data | obj | 信息本体 | | -| cmd | str | `ROOM_SILENT_OFF` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | str | 空 | | -| level | num | 0 | | -| second | num | 0 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "data": { - "type": "", - "level": 0, - "second": 0 - }, - "cmd": "ROOM_SILENT_OFF" -} -``` - -</details> - -#### 指定观众禁言 (ROOM_BLOCK_MSG) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ROOM_BLOCK_MSG` | | -| data | obj | 详细信息 | | -| uid | num | 禁言用户 mid | | -| uname | str | 禁言用户名 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| dmscore | num | 弹幕分数? | | -| operator | num | 操作者? | | -| uid | num | 禁言用户 mid | | -| uname | str | 禁言用户名 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_BLOCK_MSG", - "data": { - "dmscore": 30, - "operator": 2, - "uid": 37903025, - "uname": "玉麟珑" - }, - "uid": "37903025", - "uname": "玉麟珑" -} -``` - -</details> - -#### 房管列表 (ROOM_ADMINS) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ROOM_ADMINS` | | -| uids | array | 房管 mid 列表 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_ADMINS", - "uids": [ 898424, 384203692, 1309513, 30816752, 23931549, 223134 ] -} -``` - -</details> - -#### 设立房管 (room_admin_entrance) - -注: 此处 cmd 内容为小写 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `room_admin_entrance` | | -| dmscore | num | 弹幕分数? | | -| level | num | 等级? | | -| msg | str | 提示信息 | | -| uid | num | 用户 mid | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "room_admin_entrance", - "dmscore": 45, - "level": 1, - "msg": "系统提示:你已被主播设为房管", - "uid": 223134 -} -``` - -</details> - -#### 撤销房管 (ROOM_ADMIN_REVOKE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ROOM_ADMIN_REVOKE` | | -| msg | str | 提示信息 | | -| uid | num | 用户 mid | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ROOM_ADMIN_REVOKE", - "msg": "撤销房管", - "uid": 6791627 -} -``` - -</details> - -#### 多个直播视角信息 (LIVE_MULTI_VIEW_NEW_INFO) - -部分活动直播间会下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `LIVE_MULTI_VIEW_NEW_INFO` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| title | str | 活动标题 | 活动结束后为`""` | -| room_id | num | 主直播间id | 活动结束后为`0` | -| copy_writing | str | 提示文本 | 活动结束后为`""` | -| bg_image | str | 背景图片 | 活动结束后为`""` | -| sub_slt_color | str | 切换按钮颜色? | 活动结束后为`""` | -| sub_bg_color | str | 切换按钮背景颜色? | 活动结束后为`""` | -| sub_text_color | str | 切换按钮文本颜色? | 活动结束后为`""` | -| view_type | num | | | -| room_list | arr | 房间列表 | 不包括“未直播”状态的直播间,活动结束后为`null` | -| relation_view | arr | 详细关系? | 不包括“未直播”状态的直播间,活动结束后为`null` | -| view_pattern | num | | | -| gather_room_list | arr | 空数组? | 活动结束后为`null` | - -`data.room_list` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| order_id | num | 顺序id | | -| room_id | num | 直播间id | 似乎是长号 | -| room_name | str | 主播名称 | | -| live_status | num | 直播状态 | 1:直播中<br />2:轮播中 | -| jump_url | str | 加入直播间的链接 | | - -`data.relation_view` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| order_id | num | 顺序id | | -| view_type | num | | | -| view_id | num | 直播间id | | -| view_name | str | 主播名称 | | -| title | str | 直播间标题 | | -| cover | str | 直播间封面 | | -| jump_url | str | 加入直播间的链接 | | -| switch | bool | | | -| num | num | 看过人数 | | -| watch_icon | str | 看过图标 | | -| live_status | num | 直播状态 | 同`data.room_list[i].live_status` | -| text_small | str | 看过人数文本 | | -| use_view_vt | bool | | | -| anchor_face | str | 主播头像 | | -| match_live_room | bool | | | -| match_info | null | | | -| duration | num | | | -| up_name | str | `""` | | -| pub_date | str | | | -| gather_id | num | | | -| sub_name | str | | | - -**示例:** - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "cmd": "LIVE_MULTI_VIEW_NEW_INFO", - "data": { - "title": "战地风云6公开测试", - "room_id": 5050, - "copy_writing": "更多视角", - "bg_image": "https://i0.hdslb.com/bfs/live/edaa9477a1d8325dd0c36c419b6fd5f9646b2419.png", - "sub_slt_color": "#FFFFFF", - "sub_bg_color": "#333333", - "sub_text_color": "#FFFFFF", - "view_type": 0, - "room_list": [ - { - "order_id": 2, - "room_id": 6154037, - "room_name": "Asaki大人", - "live_status": 2, - "jump_url": "https://live.bilibili.com/6154037?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 4, - "room_id": 1521765, - "room_name": "南云鸟羽", - "live_status": 1, - "jump_url": "https://live.bilibili.com/1521765?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 8, - "room_id": 24065, - "room_name": "闻香识", - "live_status": 1, - "jump_url": "https://live.bilibili.com/24065?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 14, - "room_id": 38528, - "room_name": "乔伊奥斯托雷", - "live_status": 1, - "jump_url": "https://live.bilibili.com/38528?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 15, - "room_id": 21263282, - "room_name": "Yommyko", - "live_status": 2, - "jump_url": "https://live.bilibili.com/21263282?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 16, - "room_id": 5513659, - "room_name": "狙佬-zuener", - "live_status": 1, - "jump_url": "https://live.bilibili.com/5513659?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 18, - "room_id": 146007, - "room_name": "Kisflow", - "live_status": 1, - "jump_url": "https://live.bilibili.com/146007?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 19, - "room_id": 1163043, - "room_name": "人形鹿头自走炮", - "live_status": 1, - "jump_url": "https://live.bilibili.com/1163043?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 20, - "room_id": 3343118, - "room_name": "版尤黑紫", - "live_status": 1, - "jump_url": "https://live.bilibili.com/3343118?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 21, - "room_id": 25212992, - "room_name": "贝施汀", - "live_status": 1, - "jump_url": "https://live.bilibili.com/25212992?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 22, - "room_id": 11313, - "room_name": "丧心病狂的魔笑", - "live_status": 1, - "jump_url": "https://live.bilibili.com/11313?broadcast_type=0&is_room_feed=1&live_from=28022" - }, - { - "order_id": 24, - "room_id": 902302, - "room_name": "LF叶绿", - "live_status": 1, - "jump_url": "https://live.bilibili.com/902302?broadcast_type=0&is_room_feed=1&live_from=28022" - } - ], - "relation_view": [ - { - "order_id": 2, - "view_type": 0, - "view_id": 6154037, - "view_name": "Asaki大人", - "title": "猪猪猪", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/87e0332a5c3c8cd73fa7616045111b90b0199087.jpg", - "jump_url": "https://live.bilibili.com/6154037?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 2305, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 2, - "text_small": "2305", - "use_view_vt": false, - "anchor_face": "https://i1.hdslb.com/bfs/face/84a861facfa041b46f7a30897e9ed3f2e05e0519.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 4, - "view_type": 0, - "view_id": 1521765, - "view_name": "南云鸟羽", - "title": "【战地6B测】下午四点开!聊天摸鱼", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/a8216e0b5469949fcbcc72458c7955b562838a89.jpg", - "jump_url": "https://live.bilibili.com/1521765?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 36987, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "3.6万", - "use_view_vt": false, - "anchor_face": "https://i1.hdslb.com/bfs/face/f4744b6346ddaccb4642a0f05f25d798fb5d8474.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 8, - "view_type": 0, - "view_id": 24065, - "view_name": "闻香识", - "title": "4点战地6!!", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/6e309306fcb7bdeeb5e72f8b4c2d1ed7ba7e1e29.jpg", - "jump_url": "https://live.bilibili.com/24065?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 32408, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "3.2万", - "use_view_vt": false, - "anchor_face": "https://i0.hdslb.com/bfs/face/df21869b067816e03c517bc774f6ebf5a86563de.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 14, - "view_type": 0, - "view_id": 38528, - "view_name": "乔伊奥斯托雷", - "title": "[战地六B测]捞薯条,吃薯条,谁是薯条?", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/a89ebcd8b4f3e841ddb7cb53fbdc6013a9956013.jpg", - "jump_url": "https://live.bilibili.com/38528?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 3660, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "3660", - "use_view_vt": false, - "anchor_face": "https://i1.hdslb.com/bfs/face/82ef4b09c26751649da2a48960d23fd87baa6db5.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 15, - "view_type": 0, - "view_id": 21263282, - "view_name": "Yommyko", - "title": "和广东双马尾搏斗!禁闭求生2", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/86ac43cf0c1db277b92a5e83324558ceab2bb108.jpg", - "jump_url": "https://live.bilibili.com/21263282?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 1583, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 2, - "text_small": "1583", - "use_view_vt": false, - "anchor_face": "https://i2.hdslb.com/bfs/face/9718e4c59c2cfcc9f8b747ad8ea5006fad78a76a.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 16, - "view_type": 0, - "view_id": 5513659, - "view_name": "狙佬-zuener", - "title": "战地6!开玩!七年之约已到!", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/b1779156686031460633d31362205456d1bb53df.jpg", - "jump_url": "https://live.bilibili.com/5513659?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 30035, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "3.0万", - "use_view_vt": false, - "anchor_face": "https://i0.hdslb.com/bfs/face/bdb4b214d3446aca7c11b408ae6f35c89f52a5cc.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 18, - "view_type": 0, - "view_id": 146007, - "view_name": "Kisflow", - "title": "战地6 BETA 战场老登职业哥", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/0007988a93c06215f0ffd96f7a4e3834d1396408.jpg", - "jump_url": "https://live.bilibili.com/146007?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 7839, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "7839", - "use_view_vt": false, - "anchor_face": "https://i1.hdslb.com/bfs/face/5761dbf3f03b1a31ad8a6aec01452c97e93c16c0.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 19, - "view_type": 0, - "view_id": 1163043, - "view_name": "人形鹿头自走炮", - "title": "神秘远光84男", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/cea622fe174d8c3fd26e58ea5a7e3b709fd8aee4.jpg", - "jump_url": "https://live.bilibili.com/1163043?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 20796, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "2.0万", - "use_view_vt": false, - "anchor_face": "https://i2.hdslb.com/bfs/face/259c1f3b485ad5e2182446246fccb87114701ed8.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 20, - "view_type": 0, - "view_id": 3343118, - "view_name": "版尤黑紫", - "title": "爽玩!战地6B测", - "cover": "https://i0.hdslb.com/bfs/live/user_cover/039be5f223d26d4108941f1f056ee5842e3e5720.jpg", - "jump_url": "https://live.bilibili.com/3343118?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 1704, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "1704", - "use_view_vt": false, - "anchor_face": "https://i2.hdslb.com/bfs/face/3cdcbc8945d18575279ac55c75f4da9f0a7dbc9e.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 21, - "view_type": 0, - "view_id": 25212992, - "view_name": "贝施汀", - "title": "战地6还没开服,先直播剪会儿视频聊聊天", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/fb0227b71dca8555588c9c6c0af329cf250123a9.jpg", - "jump_url": "https://live.bilibili.com/25212992?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 2207, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "2207", - "use_view_vt": false, - "anchor_face": "https://i0.hdslb.com/bfs/face/7242e856562166a27e8be4a184e4cddbaed8177f.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 22, - "view_type": 0, - "view_id": 11313, - "view_name": "丧心病狂的魔笑", - "title": "等待测试开启!但是先直播周边开箱!", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/48fb912da0f665427eb230ef3273defdb1a33fa4.jpg", - "jump_url": "https://live.bilibili.com/11313?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 2924, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "2924", - "use_view_vt": false, - "anchor_face": "https://i2.hdslb.com/bfs/face/e672848bc2718b79ca2f44eb447e84282c6f806d.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - }, - { - "order_id": 24, - "view_type": 0, - "view_id": 902302, - "view_name": "LF叶绿", - "title": "《田 野 打 架 6》", - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/3b18086f9e70f719917c5d4561c25defdd13cd82.jpg", - "jump_url": "https://live.bilibili.com/902302?broadcast_type=0&is_room_feed=1&live_from=28022", - "switch": true, - "num": 1897, - "watch_icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "live_status": 1, - "text_small": "1897", - "use_view_vt": false, - "anchor_face": "https://i2.hdslb.com/bfs/face/5e3570095f5af77d20188ea45d45da216a31e52d.jpg", - "match_live_room": false, - "match_info": null, - "duration": 0, - "up_name": "", - "pub_date": "", - "gather_id": 0, - "sub_name": "" - } - ], - "view_pattern": 1, - "gather_room_list": [] - } -} -``` - -</details> - -#### 天选时刻合法检查 (ANCHOR_LOT_CHECKSTATUS) - -**示例:** - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "cmd": "ANCHOR_LOT_CHECKSTATUS", - "data": { - "id": 2553641, - "reject_reason": "由于奖品格式不合格,请仔细检查后再提交哦", - "status": 5, - "uid": 1827176970 - } -} -``` - -</details> - -#### 天选时刻开始 (ANCHOR_LOT_START) - -**示例:** - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "cmd": "ANCHOR_LOT_START", - "data": { - "asset_icon": "https://i0.hdslb.com/bfs/live/627ee2d9e71c682810e7dc4400d5ae2713442c02.png", - "award_image": "", - "award_name": "艺术头像绘制", - "award_num": 1, - "cur_gift_num": 0, - "current_time": 1651037946, - "danmu": "卡宝下午好", - "gift_id": 3, - "gift_name": "B坷垃", - "gift_num": 1, - "gift_price": 9900, - "goaway_time": 180, - "goods_id": 15, - "id": 2553648, - "is_broadcast": 1, - "join_type": 1, - "lot_status": 0, - "max_time": 600, - "require_text": "当前主播粉丝勋章至少1级", - "require_type": 2, - "require_value": 1, - "room_id": 23614753, - "send_gift_ensure": 0, - "show_panel": 1, - "start_dont_popup": 0, - "status": 1, - "time": 599, - "url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html?is_live_half_webview=1&hybrid_biz=live-lottery-anchor&hybrid_half_ui=1,5,100p,100p,000000,0,30,0,0,1;2,5,100p,100p,000000,0,30,0,0,1;3,5,100p,100p,000000,0,30,0,0,1;4,5,100p,100p,000000,0,30,0,0,1;5,5,100p,100p,000000,0,30,0,0,1;6,5,100p,100p,000000,0,30,0,0,1;7,5,100p,100p,000000,0,30,0,0,1;8,5,100p,100p,000000,0,30,0,0,1", - "web_url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html" - } -} -``` - -</details> - -#### 天选时刻结束 (ANCHOR_LOT_END) - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ANCHOR_LOT_END", - "data": { - "id": 2553648 - } -} -``` - -</details> - -#### 天选时刻中奖者 (ANCHOR_LOT_AWARD) - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ANCHOR_LOT_AWARD", - "data": { - "award_dont_popup": 1, - "award_image": "", - "award_name": "艺术头像绘制", - "award_num": 1, - "award_users": [ - { - "uid": 8318700, - "uname": "桥下念喬", - "face": "http://i0.hdslb.com/bfs/face/dfde2ffc6286c2c5189592cc84fd70bcf977b143.jpg", - "level": 21, - "color": 5805790 - } - ], - "id": 2553648, - "lot_status": 2, - "url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html?is_live_half_webview=1&hybrid_biz=live-lottery-anchor&hybrid_half_ui=1,5,100p,100p,000000,0,30,0,0,1;2,5,100p,100p,000000,0,30,0,0,1;3,5,100p,100p,000000,0,30,0,0,1;4,5,100p,100p,000000,0,30,0,0,1;5,5,100p,100p,000000,0,30,0,0,1;6,5,100p,100p,000000,0,30,0,0,1;7,5,100p,100p,000000,0,30,0,0,1;8,5,100p,100p,000000,0,30,0,0,1", - "web_url": "https://live.bilibili.com/p/html/live-lottery/anchor-join.html" - } -} -``` - -</details> - -#### 天选时刻通知 (ANCHOR_LOT_NOTICE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ANCHOR_LOT_NOTICE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| notice\_type | num | 通知卡片类型? | | -| lottery\_card | obj | 通知卡片内容 | | - -`data.lottery_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| show\_time | num | 显示时间? | | -| button\_text | str | 按钮文本? | | -| icon | str | 图标 | | -| title | str | 标题? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "data": { - "notice_type": 1, - "lottery_card": { - "show_time": 30, - "button_text": "去发奖", - "icon": "https://i0.hdslb.com/bfs/live/95970204111233f181fc28622502aaf1a9359b9a.png", - "title": "发天选有助于人气累积" - } - }, - "cmd": "ANCHOR_LOT_NOTICE" -} -``` - -</details> - -#### 语音连麦开关 (VOICE_JOIN_SWITCH) - -在直播姬开关连麦功能时下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `VOICE_JOIN_SWITCH` | | -| data | obj | 信息本体 | | -| room_id | num | 直播间id | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| room_id | num | 直播间id | | -| room_status | num | 连麦开关状态 | | -| root_status | num | 连麦开关状态 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -开: - -```json -{ - "cmd": "VOICE_JOIN_SWITCH", - "data": { - "room_id": 1899237171, - "room_status": 1, - "root_status": 1 - }, - "room_id": 1899237171 -} -``` - -关: - -```json -{ - "cmd": "VOICE_JOIN_SWITCH", - "data": { - "room_id": 1899237171, - "room_status": 0, - "root_status": 0 - }, - "room_id": 1899237171 -} -``` - -</details> - -#### 邀请视频连线 (VIDEO_CONNECTION_JOIN_START) - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "VIDEO_CONNECTION_JOIN_START", - "data": { - "status": 1, - "invited_uid": 351686170, - "channel_id": "72057594038132685", - "invited_uname": "小妹睡不醒", - "invited_face": "http://i1.hdslb.com/bfs/face/828562203e620f711fb4c786f05996357857ed4d.jpg", - "start_at": 1651237440, - "current_time": 1651237440 - }, - "roomid": 12401854 -} -``` - -</details> - -#### 视频连线信息 (VIDEO_CONNECTION_MSG) - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "VIDEO_CONNECTION_MSG", - "data": { - "channel_id": "72057594038132685", - "current_time": 1651237440, - "dmscore": 4, - "toast": "主播发起了视频连线" - } -} -``` - -</details> - -#### 结束视频连线 (VIDEO_CONNECTION_JOIN_END) - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "VIDEO_CONNECTION_JOIN_END", - "data": { - "channel_id": "72057594038132685", - "start_at": 1651238384, - "toast": "主播 结束了与小妹睡不醒的连线.", - "current_time": 1651238384 - }, - "roomid": 22195814 -} -``` - -</details> - -#### 重连直播间? (REENTER_LIVE_ROOM) - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "REENTER_LIVE_ROOM", - "data": { - "room_id": 22195814, - "request_random_sec_range": 10, - "reason": 1 - }, - "roomid": 22195814 -} -``` - -</details> - -#### 连线礼物信息 (UNIVERSAL_EVENT_GIFT) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `UNIVERSAL_EVENT_GIFT` | | -| data | obj | 信息本体 | | -| msg_id | str | | | -| p_is_ack | bool | | | -| p_msg_type | num | | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| anchor_uid | num | 主播uid | | -| info | obj | 连线信息 | | -| room_id | num | 直播间id | | - -`data.info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| biz_session_id | str | 连线会话id? | | -| business_label | str | | | -| interact_channel_id | str | 频道id? | | -| interact_connect_type | num | | | -| interact_max_users | num | 最大连线数? | | -| interact_mode | obj | | | -| interact_template | obj | 展示模板 | | -| invoking_time | num | | | -| members | arr | 连线成员 | 参见 `UNIVERSAL_EVENT_GIFT_V2` 的 `data.members` ,缺少部分字段 | -| members_version | num | | | -| multi_conn_info | obj | 连线信息 | | -| room_owner | num | 发起者uid | | -| room_start_at | str | | | -| room_start_at_ts | num | | | -| room_status | num | | | -| session_start_at | str | | | -| session_start_at_ts | num | | | -| session_status | num | | | -| system_time_unix | num | 服务器时间戳 | Unix 秒时间戳 | -| trace_id | str | | | -| version | num | 数据版本 | Unix 毫秒时间戳 | - -`data.info.interact_mode` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| apply_timeout | num | 超时? | | -| interact_mode_type | num | | | -| invite_timeout | num | 邀请超时? | | -| join_types | arr | 加入类型? | 数字数组 | -| position_mode | num | | | - -`data.info.interact_template` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| is_variable_layout | bool | 布局是否可变? | | -| layout_data | obj | 布局信息 | | -| layout_id | str | 布局id | | -| layout_list | null | ? | | -| show_interact_ui | bool | 显示交互UI? | | -| template_id | str | 模板id? | | - -`data.info.interact_template.layout_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| best_area_show_pos | num | | | -| cells | arr | 具体布局信息 | | -| default_cell | obj | | | -| height | num | | | -| rtc_resolution | obj | | | -| width | num | | | - -`data.info.interact_template.layout_data.cells` 数组中对象: - -与 `data.info.interact_template.layout_data.default_cell` 对象相同 - -`data.info.interact_template.layout_data.default_cell` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| can_zoom | num | | | -| default_open | num | | | -| height | num | | | -| mobile_avatar_size | num | | | -| mobile_font_size | num | | | -| pc_web_avatar_size | num | | | -| pc_web_font_size | num | | | -| position | num | 定位? | | -| width | num | | | -| x | num | | | -| y | num | | | -| z_index | num | | | - -`data.info.interact_template.layout_data.rtc_resolution` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code_rate_init | num | | | -| code_rate_max | num | | | -| code_rate_min | num | | | -| horizontal_height | num | | | -| horizontal_width | num | | | -| vertical_height | num | | | -| vertical_width | num | | | - -`data.info.members` 数组中对象: - -参见 [`UNIVERSAL_EVENT_GIFT_V2`](#连线礼物信息v2-universal_event_gift_v2) 的 `data.members` 数组中对象,本cmd缺少部分字段。 - -`data.info.multi_conn_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| room_owner | num | 发起人uid | | -| scores | arr | 礼物信息 | | -| show_score | num | 是否显示? | | - -`data.info.multi_conn_info.scores` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| price | num | 礼物累计价值 | CNY × 100 | -| price_text | str | 礼物累计价值文本 | | -| uid | num | 对应主播uid | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "UNIVERSAL_EVENT_GIFT", - "data": { - "anchor_uid": 1950658, - "info": { - "biz_session_id": "17545643420522077733317", - "business_label": "universal_multi_conn", - "interact_channel_id": "4679025140177408", - "interact_connect_type": 0, - "interact_max_users": 9, - "interact_mode": { - "apply_timeout": 20, - "interact_mode_type": 0, - "invite_timeout": 30, - "join_types": [ - 1, - 2 - ], - "position_mode": 0 - }, - "interact_template": { - "is_variable_layout": true, - "layout_data": { - "best_area_show_pos": 0, - "cells": [ - { - "can_zoom": 2, - "default_open": 0, - "height": 48, - "mobile_avatar_size": 64, - "mobile_font_size": 0, - "pc_web_avatar_size": 112, - "pc_web_font_size": 0, - "position": 0, - "width": 30, - "x": 0, - "y": 0, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 1, - "width": 0, - "x": 30, - "y": 0, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 2, - "width": 0, - "x": 45, - "y": 0, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 3, - "width": 0, - "x": 30, - "y": 16, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 4, - "width": 0, - "x": 45, - "y": 16, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 5, - "width": 0, - "x": 30, - "y": 32, - "z_index": 0 - }, - { - "can_zoom": 1, - "default_open": 0, - "height": 0, - "mobile_avatar_size": 0, - "mobile_font_size": 0, - "pc_web_avatar_size": 0, - "pc_web_font_size": 0, - "position": 6, - "width": 0, - "x": 45, - "y": 32, - "z_index": 0 - } - ], - "default_cell": { - "can_zoom": 0, - "default_open": 1, - "height": 16, - "mobile_avatar_size": 40, - "mobile_font_size": 10, - "pc_web_avatar_size": 72, - "pc_web_font_size": 14, - "position": 0, - "width": 15, - "x": 0, - "y": 0, - "z_index": 0 - }, - "height": 48, - "rtc_resolution": { - "code_rate_init": 500, - "code_rate_max": 700, - "code_rate_min": 375, - "horizontal_height": 400, - "horizontal_width": 500, - "vertical_height": 576, - "vertical_width": 360 - }, - "width": 60 - }, - "layout_id": "left1_right6", - "layout_list": null, - "show_interact_ui": true, - "template_id": "multi_conn_grid" - }, - "invoking_time": 1, - "members": [ - { - "face": "https://i1.hdslb.com/bfs/face/2ddb513f600c203f21aefb9725ab0eb84f093943.jpg", - "gender": 0, - "join_time": 1754564992, - "link_id": "44479117", - "position": 0, - "room_id": 41682, - "uid": 1950658, - "uname": "早稻叽" - }, - { - "face": "https://i1.hdslb.com/bfs/face/5958bb6814f25d832775ca37043d38f893b4a478.jpg", - "gender": -1, - "join_time": 1754564347, - "link_id": "44478459", - "position": 1, - "room_id": 26376408, - "uid": 2077733317, - "uname": "烛不遥" - }, - { - "face": "https://i0.hdslb.com/bfs/face/7c862b4ad1a29cdd2b849bcea3c3812b67770d21.jpg", - "gender": 0, - "join_time": 1754564347, - "link_id": "44478460", - "position": 2, - "room_id": 1774970222, - "uid": 1035559935, - "uname": "新砂Athia" - }, - { - "face": "https://i0.hdslb.com/bfs/face/81c1f45b45958c19523bb7cbae7fc3fa99b4aae1.jpg", - "gender": -1, - "join_time": 1754564361, - "link_id": "44478500", - "position": 3, - "room_id": 31361500, - "uid": 3546581471070432, - "uname": "颂温暖_Swanna" - }, - { - "face": "https://i2.hdslb.com/bfs/face/eceb8fa58c41b7cd733bebafcd7c1f3e33b37b07.jpg", - "gender": 0, - "join_time": 1754564385, - "link_id": "44478528", - "position": 4, - "room_id": 1937830041, - "uid": 3546768203582225, - "uname": "暴躁小辣jo" - }, - { - "face": "https://i0.hdslb.com/bfs/face/12c1cd0df2ee6e6bb09b279b0553cdc9ae4af4f0.jpg", - "gender": -1, - "join_time": 1754564774, - "link_id": "44478875", - "position": 5, - "room_id": 23090250, - "uid": 475912512, - "uname": "抵抗Resistance" - } - ], - "members_version": 3974722551, - "multi_conn_info": { - "room_owner": 2077733317, - "scores": [ - { - "price": 82900, - "price_text": "829", - "uid": 1950658 - }, - { - "price": 21200, - "price_text": "212", - "uid": 2077733317 - }, - { - "price": 30400, - "price_text": "304", - "uid": 1035559935 - }, - { - "price": 675600, - "price_text": "6756", - "uid": 3546581471070432 - }, - { - "price": 96800, - "price_text": "968", - "uid": 3546768203582225 - }, - { - "price": 79200, - "price_text": "792", - "uid": 475912512 - } - ], - "show_score": 1 - }, - "room_owner": 2077733317, - "room_start_at": "", - "room_start_at_ts": 0, - "room_status": 1, - "session_start_at": "", - "session_start_at_ts": 0, - "session_status": 1, - "system_time_unix": 1754568295, - "trace_id": "", - "version": 1754568295428 - }, - "room_id": 41682 - }, - "msg_id": "34610565842749442:1000:1000", - "p_is_ack": true, - "p_msg_type": 1, - "send_time": 1754568295441 -} -``` - -</details> - -#### 连线礼物信息V2 (UNIVERSAL_EVENT_GIFT_V2) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `UNIVERSAL_EVENT_GIFT_V2` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| biz_session_id | str | 连线会话id? | | -| interact_channel_id | str | 频道id? | | -| interact_template | obj | 交互模板信息 | | -| members | arr | 连线成员 | | -| stream_control | null | | | -| version | num | 数据版本 | Unix 毫秒时间戳 | -| session_status | num | | | -| business_label | str | | | -| invoking_time | num | | | -| members_version | num | | | -| room_status | num | | | -| system_time_unix | num | 服务器时间戳 | Unix 秒时间戳 | -| room_owner | num | 发起人uid | | -| session_start_at | str | 会话开始时间 | | -| session_start_at_ts | num | 会话经过时间 | | -| room_start_at | str | 当前直播间加入会话时间 | | -| room_start_at_ts | num | 当前直播间自加入会话开始经过的时间 | | -| trace_id | str | 追踪id? | | -| biz_extra_data | obj | | | -| channel_users | arr | 当前连线频道内uid列表 | | - -`data.interact_template` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| template_id | str | 模板id? | | -| show_interact_ui | bool | 显示交互UI? | | -| layout_id | str | 样式id? | | - -`data.members` 数组中对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| uid | num | 连线主播uid | | -| uname | str | 连线主播名称 | | -| face | str | 连线主播头像 | | -| position | num | 位置? | | -| join_time | num | 加入时间 | Unix 秒时间戳 | -| link_id | str | | | -| gender | num | | | -| room_id | num | 连线主播直播间id | | -| fans_num | num | | | -| display_name | str | 显示名称 | | -| biz_extra_data | obj | | | -| join_time_ts | num | | | - -`data.members[i].biz_extra_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| multi_conn | obj | | | - -`data.members[i].biz_extra_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| price | num | 礼物累计价值 | CNY × 100 | -| price_text | str | 礼物累计价值文本 | | - -`data.biz_extra_data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| multi_conn | obj | | | - -`data.biz_extra_data.multi_conn` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| show_score | num | | | -| support_full_zoom | num | | | - -`data.channel_users` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | num | 主播uid | | -| … | num | 主播uid | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "UNIVERSAL_EVENT_GIFT_V2", - "data": { - "biz_session_id": "17545643420522077733317", - "interact_channel_id": "4679025140177408", - "interact_template": { - "template_id": "multi_conn_grid", - "show_interact_ui": true, - "layout_id": "left1_right6" - }, - "members": [ - { - "uid": 1950658, - "uname": "早稻叽", - "face": "https://i1.hdslb.com/bfs/face/2ddb513f600c203f21aefb9725ab0eb84f093943.jpg", - "position": 0, - "join_time": 1754564992, - "link_id": "44479117", - "gender": 0, - "room_id": 41682, - "fans_num": 0, - "display_name": "本房主播", - "biz_extra_data": { - "multi_conn": { - "price": 82900, - "price_text": "829" - } - }, - "join_time_ts": 0 - }, - { - "uid": 2077733317, - "uname": "烛不遥", - "face": "https://i1.hdslb.com/bfs/face/5958bb6814f25d832775ca37043d38f893b4a478.jpg", - "position": 1, - "join_time": 1754564347, - "link_id": "44478459", - "gender": -1, - "room_id": 26376408, - "fans_num": 0, - "display_name": "烛不遥", - "biz_extra_data": { - "multi_conn": { - "price": 21200, - "price_text": "212" - } - }, - "join_time_ts": 0 - }, - { - "uid": 1035559935, - "uname": "新砂Athia", - "face": "https://i0.hdslb.com/bfs/face/7c862b4ad1a29cdd2b849bcea3c3812b67770d21.jpg", - "position": 2, - "join_time": 1754564347, - "link_id": "44478460", - "gender": 0, - "room_id": 1774970222, - "fans_num": 0, - "display_name": "新砂Athia", - "biz_extra_data": { - "multi_conn": { - "price": 30400, - "price_text": "304" - } - }, - "join_time_ts": 0 - }, - { - "uid": 3546581471070432, - "uname": "颂温暖_Swanna", - "face": "https://i0.hdslb.com/bfs/face/81c1f45b45958c19523bb7cbae7fc3fa99b4aae1.jpg", - "position": 3, - "join_time": 1754564361, - "link_id": "44478500", - "gender": -1, - "room_id": 31361500, - "fans_num": 0, - "display_name": "颂温暖_Swanna", - "biz_extra_data": { - "multi_conn": { - "price": 675600, - "price_text": "6756" - } - }, - "join_time_ts": 0 - }, - { - "uid": 3546768203582225, - "uname": "暴躁小辣jo", - "face": "https://i2.hdslb.com/bfs/face/eceb8fa58c41b7cd733bebafcd7c1f3e33b37b07.jpg", - "position": 4, - "join_time": 1754564385, - "link_id": "44478528", - "gender": 0, - "room_id": 1937830041, - "fans_num": 0, - "display_name": "暴躁小辣jo", - "biz_extra_data": { - "multi_conn": { - "price": 96800, - "price_text": "968" - } - }, - "join_time_ts": 0 - }, - { - "uid": 475912512, - "uname": "抵抗Resistance", - "face": "https://i0.hdslb.com/bfs/face/12c1cd0df2ee6e6bb09b279b0553cdc9ae4af4f0.jpg", - "position": 5, - "join_time": 1754564774, - "link_id": "44478875", - "gender": -1, - "room_id": 23090250, - "fans_num": 0, - "display_name": "抵抗Resistance", - "biz_extra_data": { - "multi_conn": { - "price": 79200, - "price_text": "792" - } - }, - "join_time_ts": 0 - } - ], - "stream_control": null, - "version": 1754568295421, - "session_status": 1, - "business_label": "universal_multi_conn", - "invoking_time": 2, - "members_version": 1262102210, - "room_status": 1, - "system_time_unix": 1754568295, - "room_owner": 2077733317, - "session_start_at": "2025-08-07 18:59:06", - "session_start_at_ts": 3949, - "room_start_at": "2025-08-07 19:09:52", - "room_start_at_ts": 3303, - "trace_id": "55df19c042f09f5c625d7b8b60689496", - "biz_extra_data": { - "multi_conn": { - "show_score": 1, - "support_full_zoom": 2 - } - }, - "channel_users": [ - 1950658, - 2077733317, - 1035559935, - 3546581471070432, - 3546768203582225, - 475912512 - ] - } -} -``` - -</details> - -#### ??? (PLAY_TOGETHER) - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "PLAY_TOGETHER", - "data": { - "ruid": 29857468, - "roomid": 8618057, - "action": "switch_off", - "uid": 0, - "timestamp": 1673690546, - "message": "", - "message_type": 0, - "jump_url": "", - "web_url": "", - "apply_number": 0, - "refresh_tool": false, - "cur_fleet_num": 0, - "max_fleet_num": 0 - } -} -``` - -```json -{ - "cmd": "PLAY_TOGETHER", - "data": { - "ruid": 29857468, - "roomid": 8618057, - "action": "switch_off", - "uid": 0, - "timestamp": 1673690549, - "message": "系统提示:主播已切换分区", - "message_type": 3, - "jump_url": "", - "web_url": "", - "apply_number": 0, - "refresh_tool": true, - "cur_fleet_num": 0, - "max_fleet_num": 0 - } -} -``` - -</details> - -#### ??? (PLAYTOGETHER_ICON_CHANGE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `PLAYTOGETHER_ICON_CHANGE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| area_id | num | 直播分区id | | -| has_perm | num | | | -| show_count | num | | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "PLAYTOGETHER_ICON_CHANGE", - "data": { - "area_id": 40, - "has_perm": 0, - "show_count": 0 - } -} -``` - -</details> - -#### 直播小助手? (ANCHOR_BROADCAST) - -第一次达到了某种条件下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ANCHOR_BROADCAST` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| sender | str | 标题? | `直播小助手` | -| msg | str | 提示消息 | | -| platform | num | 平台标识? | `0` | -| button\_info | obj | 按钮信息? | | -| milestone\_type | str | 里程碑类型? | `session_livetime`,`first_share`,`session_share` | -| milestone\_value | num | 里程值? | | -| milestone\_index | num | 里程碑类型的索引? | `1`,`5`,`6`,`7` | - -`data.button_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| button\_name | str | | | -| blink_button_type | str | | | -| blink_button_target | str | | | -| blink_button_extra | str | | | -| blink_button_label | num | | | -| hime_button_type | str | | | -| hime_button_target | str | | | -| hime_button_extra | str | | | -| hime\_button\_h5\_type | str | | | -| hime_button_label | num | | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ANCHOR_BROADCAST", - "data": { - "sender": "直播小助手", - "msg": "恭喜你,开播时长达到180分钟!", - "platform": 0, - "button_info": { - "button_name": "", - "blink_button_type": "", - "blink_button_target": "", - "blink_button_extra": "", - "blink_button_label": 0, - "hime_button_type": "", - "hime_button_target": "", - "hime_button_extra": "", - "hime_button_h5_type": "", - "hime_button_label": 0 - }, - "milestone_type": "session_livetime", - "milestone_value": 10800, - "milestone_index": 6 - } -} -``` - -</details> - -#### 直播小助手? (ANCHOR_HELPER_DANMU) - -几乎与`ANCHOR_BROADCAST`一同下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `ANCHOR_HELPER_DANMU` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| sender | str | 标题? | `直播小助手` | -| msg | str | 提示消息 | | -| platform | num | 平台标识? | | -| button\_platform | num | | | -| button\_name | str | | | -| button\_target | str | | | -| button\_label | num | | | -| report\_type | str | 上报类型? | | -| report | str | | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "ANCHOR_HELPER_DANMU", - "data": { - "sender": "直播小助手", - "msg": "恭喜你,开播时长达到150分钟!", - "platform": 3, - "button_platform": 0, - "button_name": "", - "button_target": "", - "button_label": 0, - "report_type": "milestone", - "report": "session_livetime:5:9000" - } -} -``` - -</details> - -#### 直播进度条节点标签 (PLAY_TAG) - -注: 在特定直播间的特定情况下发。 - -例如: 在[直播间6](https://live.bilibili.com/6)内,有人打出了某种操作。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `PLAY_TAG` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| tag\_id | num | 标签 ID | | -| pic | str | 标签图标 | 通常显示于进度条之上 | -| timestamp | num | UNIX 秒时间戳 | | -| type | str | 操作类型 | `ADD`:添加 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "PLAY_TAG", - "data": { - "tag_id": 367751, - "pic": "https://i0.hdslb.com/bfs/live/0e04525fee9ea6ea6973e8bd1116d9f1f6501d37.png", - "timestamp": 1740319807, - "type": "ADD" - } -} -``` - -</details> - -#### 冲榜提示卡 (POPULAR_RANK_GUIDE_CARD) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `POPULAR_RANK_GUIDE_CARD` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| ruid | num | 主播uid | | -| title | str | 提示标题 | | -| sub_text | str | 提示副标题 | | -| icon_img | str | 提示卡图标 | 主播头像 | -| gift_id | num | 礼物id | | -| countdown | num | 显示时间 | | -| popup_title | str | 提示文本 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "POPULAR_RANK_GUIDE_CARD", - "data": { - "ruid": 194484313, - "title": "目前人气榜NO.1", - "sub_text": "帮我投喂人气票冲榜吧~", - "icon_img": "https://i1.hdslb.com/bfs/face/84a861facfa041b46f7a30897e9ed3f2e05e0519.jpg", - "gift_id": 33988, - "countdown": 10, - "popup_title": "投喂一个人气票帮助主播打榜~" - } -} -``` - -</details> - -#### ??? (RECALL_DANMU_MSG) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `RECALL_DANMU_MSG` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| recall_type | num | 类型? | `2` | -| target_id | num | | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "RECALL_DANMU_MSG", - "data": { - "recall_type": 2, - "target_id": 525503743 - } -} -``` - -</details> - -#### 直播剪辑 (OTHER_SLICE_LOADING_RESULT) - -注: 点击剪辑按钮后的几秒内下发,目前只有网页端有这个按钮,且部分直播间可用(2025-02-20记录)。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `OTHER_SLICE_LOADING_RESULT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| data | array | 剪辑片段数据 | | -| live_key | str | 标记直播场次的key | 未验证真实性 | - -`data.data` 数组: - -| 索引 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| 0 | obj | 单个片段数据 | | - -`data.data[i]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| start\_time | num | 片段开始时间时间戳 | UNIX 秒时间戳 | -| end\_time | num | 片段结束时间时间戳 | UNIX 秒时间戳 | -| stream | str | 从开始时间到结束时间内的直播视频片段 | 需要使用浏览器用户代理字符串,特别是m3u文件内的视频链接 | -| type | num | 类型? | | -| ban\_ec | bool | ? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "OTHER_SLICE_LOADING_RESULT", - "data": { - "data": [ - { - "start_time": 1740037738, - "end_time": 1740038916, - "stream": "https://jssz-boss.hdslb.com/live2arc_anchor_video/vod_579433011406177273.m3u?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250220%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250220T080858Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=52be315e8e7def8e11f86d3c6d4952362725c3c087a433780926bc0e8c88c2e1", - "type": 0, - "ban_ec": false - } - ], - "live_key": "579433011406177273" - } -} -``` - -</details> - -#### 有人购买主播推荐商品 (GOTO_BUY_FLOW) - -用户昵称会打星号(`*`)显示。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `GOTO_BUY_FLOW` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| text | str | 去购买提示 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "GOTO_BUY_FLOW", - "data": { - "text": "回**正在去买" - } -} -``` - -</details> - -#### 热抢提示 (HOT_BUY_NUM) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `HOT_BUY_NUM` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| num | num | 热抢数量 | | -| goods_id | str | 商品id | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "HOT_BUY_NUM", - "data": { - "num": 81, - "goods_id": "1817875296579985408" - } -} -``` - -</details> - -#### 荣耀等级通知 (WEALTH_NOTIFY) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `WEALTH_NOTIFY` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| flag | num | 标志? | | -| info | obj | 信息 | | - -`data.info`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| effect_key | num | (?) | | -| has_items_changed | num | (?) | | -| level | num | 达到的等级 | | -| send_time | num | 发送时间 | UNIX 毫秒时间戳 | -| status | num | 状态? | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "WEALTH_NOTIFY", - "data": { - "flag": 3, - "info": { - "effect_key": 1073, - "has_items_changed": 1, - "level": 5, - "send_time": 1743337942833, - "status": 1 - } - } -} -``` - -</details> - -#### ??? (USER_PANEL_RED_ALARM) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `USER_PANEL_RED_ALARM` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| module | str | (?) | | -| alarm_num | num | (?) | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "USER_PANEL_RED_ALARM", - "data": { - "module": "user_head_dot", - "alarm_num": 1 - } -} -``` - -</details> - -#### ??? (GIFT_BOARD_RED_DOT) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `GIFT_BOARD_RED_DOT` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| categoryL1 | str | (?) | 作用尚不明确 | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "GIFT_BOARD_RED_DOT", - "data": { - "categoryL1": "3" - } -} -``` - -</details> - -#### 粉丝勋章更新 (MESSAGEBOX_USER_MEDAL_CHANGE) - -升级或点亮时下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `MESSAGEBOX_USER_MEDAL_CHANGE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | num | 提示类型 | 1:升级<br />2:点亮 | -| uid | num | 用户mid | | -| up_uid | num | 主播mid | | -| medal_level | num | 粉丝勋章等级 | | -| medal_name | str | 粉丝勋章名称 | | -| medal_color_start | num | 十进制粉丝勋章起始颜色 | | -| medal_color_end | num | 十进制粉丝勋章结束颜色 | | -| medal_color_border | num | 十进制粉丝勋章边框颜色 | | -| is_lighted | num | 是否点亮? | 1:点亮? | -| is_lighted_v2 | bool | 是否点亮v2? | | -| guard_level | num | 大航海等级 | | -| unlock | num | (?) | | -| unlock_level | num | (?) | | -| multi_unlock_level | str | (?) | | -| upper_bound_content | str | 提示内容 | | -| uinfo_medal | obj | 粉丝勋章信息 | 参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) `data.list[n].uinfo_medal` 对象 | -| effect_id | num | (?) | | - -`data.uinfo_medal` 对象: - -参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) json回复的 `data.list[n].uinfo_medal` 对象。 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "MESSAGEBOX_USER_MEDAL_CHANGE", - "data": { - "type": 2, - "uid": 438160221, - "up_uid": 407045223, - "medal_level": 3, - "medal_name": "研究猿", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "is_lighted": 1, - "is_lighted_v2": true, - "guard_level": 0, - "unlock": 0, - "unlock_level": 0, - "multi_unlock_level": "", - "upper_bound_content": "", - "uinfo_medal": { - "name": "研究猿", - "level": 3, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 407045223, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "effect_id": 1861 - } -} -``` - -</details> - -#### 获得粉丝勋章 (MESSAGEBOX_USER_GAIN_MEDAL) - -获得时下发。 - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `MESSAGEBOX_USER_GAIN_MEDAL` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| type | num | 类型 | 0 | -| uid | num | 用户mid | | -| up_uid | num | 主播uid | | -| medal_id | num | 勋章id | | -| medal_name | str | 勋章名称 | | -| medal_level | num | 勋章等级 | | -| medal_color | num | 勋章颜色 | | -| medal_color_start | num | 十进制勋章起始颜色 | | -| medal_color_end | num | 十进制勋章结束颜色 | | -| medal_color_border | num | 十进制勋章边框颜色 | | -| msg_title | str | 消息标题 | | -| msg_content | str | 消息内容 | | -| normal_color | num | (?) | | -| highlight_color | num | (?) | | -| intimacy | num | 当前亲密度 | | -| next_intimacy | num | 升级所需亲密度 | | -| today_feed | num | 今日亲密度 | | -| day_limit | num | 今日亲密度上限 | | -| is_wear | num | (?) | | -| guard_level | num | 大航海等级 | | -| is_received | num | (?) | | -| is_lighted | num | 是否点亮? | 1:点亮? | -| is_lighted_v2 | bool | 是否点亮v2? | | -| toast | str | 提示 | | -| fan_name | str | 粉丝名称 | | -| uinfo_medal | obj | 粉丝勋章信息 | 参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) `data.list[n].uinfo_medal` 对象 | - -`data.uinfo_medal` 对象: - -参见 [指定用户的所有粉丝勋章信息](../user/medals.md#指定用户的所有粉丝勋章信息) json回复的 `data.list[n].uinfo_medal` 对象。 - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "MESSAGEBOX_USER_GAIN_MEDAL", - "data": { - "type": 0, - "uid": 438160221, - "up_uid": 11602644, - "medal_id": 19252517, - "medal_name": "广药", - "medal_level": 1, - "medal_color": 6067854, - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "msg_title": "恭喜你获得【WuGuangYao】的粉丝勋章~", - "msg_content": "获得100点亲密度\n你的粉丝勋章达到1级", - "normal_color": 7697781, - "highlight_color": 16478873, - "intimacy": 100, - "next_intimacy": 201, - "today_feed": 100, - "day_limit": 2000, - "is_wear": 0, - "guard_level": 0, - "is_received": 1, - "is_lighted": 1, - "is_lighted_v2": true, - "toast": "成功入团并关注主播,得1级大礼包", - "fan_name": "weatfe", - "uinfo_medal": { - "name": "广药", - "level": 1, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 6067854, - "id": 19252517, - "typ": 0, - "is_light": 1, - "ruid": 11602644, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - } -} -``` - -</details> - -#### 粉丝团戳一戳礼物通知 (FANS_CLUB_POKE_GIFT_NOTICE) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `FANS_CLUB_POKE_GIFT_NOTICE` | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| icon | str | 图标 | | -| uface | str | 头像 | | -| bg_img_url | str | 背景图片 | | -| text | str | 提示文本 | | -| highlight_text | str | 高亮文本? | | -| button_text | str | 按钮文本 | | -| display_duration | num | 显示时间? | | -| room_id | num | 房间号 | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "FANS_CLUB_POKE_GIFT_NOTICE", - "data": { - "icon": "https://i0.hdslb.com/bfs/live/37a2fe03f2af95928c67cbac889e10dab6f7d42a.png", - "uface": "https://i0.hdslb.com/bfs/face/member/noface.jpg", - "bg_img_url": "https://i0.hdslb.com/bfs/live/fbe99002b5914157d783f8e07f021e2fd6ba5c1b.png", - "text": "主播戳了戳你~投喂礼物获5倍亲密度加成", - "highlight_text": "5倍亲密度加成", - "button_text": "去投喂", - "display_duration": 8, - "room_id": 1899237171 - } -} -``` - -</details> - -#### ??? (master_qn_strategy_chg) - -**JSON消息:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| cmd | str | `master_qn_strategy_chg` | | -| data | str | 信息本体 | JSON文本 | - -`data` JSON解析后对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| mtime | num | (?) | Unix秒时间戳 | -| scatter | arr | (?) | | - -**示例:** - -<details> -<summary>查看消息示例:</summary> - -```json -{ - "cmd": "master_qn_strategy_chg", - "data": "{\"mtime\":1744380444,\"scatter\":[0,300]}" -} -``` - -</details> diff --git a/docs/live/recommend.md b/docs/live/recommend.md deleted file mode 100644 index edbf016..0000000 --- a/docs/live/recommend.md +++ /dev/null @@ -1,717 +0,0 @@ -# 直播推荐 - -## 主页获取直播推荐 - -> https://api.live.bilibili.com/xlive/web-interface/v1/webMain/getMoreRecList - -*请求方法: GET* - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ------ | ---------- | ------ | ---- | -| platform | string | 平台类型 | 必要 | 默认为 `web`, 实测可为任意非空串 | -| web_location | string | `333.1007` | 非必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ---- | -| code | number | 返回值 | 0: 成功 | -| message | string | 错误信息 | 默认为 `0` | -| ttl | number | 1 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ------ | ------------- | -------- | -| recommend_room_list | Array | 推荐房间列表 | 套了个娃 | -| top_room_id | number | 置顶直播间号? | | - -`data` 对象中 `recommend_room_list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------------- | -------------- | ---------------- | ---- | -| head_box | object \| null | 头像框 | 无则为 `null` | -| area_v2_id | number | 分区 ID | | -| area_v2_parent_id | number | 父分区 ID | | -| area_v2_name | string | 分区名称 | | -| area_v2_parent_name | string | 父分区名称 | | -| broadcast_type | number | 广播类型? | | -| cover | string | 封面 URL | | -| link | string | 直播间链接 | 仅 `pathname` 与 `query` 部分 | -| online | number | 观看人数 | | -| pendant_Info | object | ??? | 作用尚不明确 | -| roomid | number | 直播间 ID | | -| title | string | 直播间标题 | | -| uname | string | 主播用户名 | | -| face | string | 主播头像 URL | | -| verify | object | 认证信息 | 参见 [用户基本信息](../user/info.md) | -| uid | number | 主播用户 mid | | -| keyframe | string | 关键帧 URL | | -| is_auto_play | number | 是否自动播放? | | -| head_box_type | number | 头像框类型? | | -| flag | number | 标记? | 作用尚不明确 | -| session_id | string | 会话 ID? | 格式为: 本次请求相同的小写无分隔 UUID + 下划线 + 大写以连字符分隔的 UUID | -| show_callback | string | 展示回调 URL? | | -| click_callback | string | 点击回调 URL? | | -| special_id | number | 特殊 ID? | 作用尚不明确 | -| watched_show | object | 观看展示 | 见下 | -| is_nft | number | 是否为 NFT 头像? | | -| nft_dmark | string | ??? | 作用尚不明确 | -| is_ad | boolean | 是否为广告 | | -| ad_transparent_content | unknown | ??? | 作用尚不明确 | -| show_ad_icon | boolean | 显示广告图标 | | -| status | boolean | 状态? | 作用尚不明确 | -| followers | number | 0 | 作用尚不明确 | - -`recommend_room_list` 数组中的对象中的 `watched_show` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ------- | -------- | ---- | -| switch | boolean | ??? | 作用尚不明确 | -| num | number | 看过人数 | | -| text_small | string | 小文本 | xxx | -| text_large | string | 大文本 | xxx人看过 | -| icon | string | 图标 URL | 浅色线条眼睛图标 | -| icon_location | number | 0 | | -| icon_web | string | 图标 URL | 深色线条眼睛图标 (Web 端) | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-interface/v1/webMain/getMoreRecList' \ ---url-query 'platform=web' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "recommend_room_list": [ - { - "head_box": null, - "area_v2_id": 237, - "area_v2_parent_id": 6, - "area_v2_name": "怀旧游戏", - "area_v2_parent_name": "单机游戏", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/34aedc9409c0abaf622fdb9c6137896b8a9f95d0.jpg", - "link": "/923833?hotRank=0", - "online": 262700, - "pendant_Info": {}, - "roomid": 923833, - "title": "融合版斗蛐蛐s3.5赛季!", - "uname": "沉默寡言白河愁", - "face": "https://i0.hdslb.com/bfs/face/14169798ca31108e4441e790c14b24706def67a3.jpg", - "verify": { - "role": 1, - "desc": "bilibili 知名游戏UP主、直播高能主播", - "type": 0 - }, - "uid": 34646754, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000000923833okbn8y.jpg", - "is_auto_play": 1, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=923833&parent_id=6&area_id=237&page=0&position=1&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_9A44BEBD-CAEB-46AD-8FD7-B91BA8471EAA&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=923833&parent_id=6&area_id=237&page=0&position=1&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 30460, - "text_small": "3.0万", - "text_large": "3.0万人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "大乱斗乱斗之王", - "value": "https://i0.hdslb.com/bfs/live/fc28a2a4123154012e0ce3da1273de5f17e81b24.png", - "desc": "" - }, - "area_v2_id": 817, - "area_v2_parent_id": 5, - "area_v2_name": "男声电台", - "area_v2_parent_name": "电台", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/b15e3a1045321a7ffa7da08a47a276ca37557ef1.jpg", - "link": "/32190922?hotRank=0", - "online": 45487, - "pendant_Info": { - "2": { - "type": "mobile_index_badge", - "name": "福佑嘉年", - "position": 2, - "text": "省级亚军", - "bg_color": "#FB9E60", - "bg_pic": "http://i0.hdslb.com/bfs/live/13819a59895263cb25cc2ead3fecfaa3e864aac8.png", - "pendant_id": 1750, - "priority": 200, - "created_at": 1738512313 - } - }, - "roomid": 32190922, - "title": "我想我们会幸福美满", - "uname": "黑羊Klein", - "face": "https://i2.hdslb.com/bfs/face/307c62a8b30a6dcfc02e9670e5dc10d0ecec6921.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 1989648419, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071536000032190922ma6cnx.jpg", - "is_auto_play": 0, - "head_box_type": 1, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=32190922&parent_id=5&area_id=817&page=0&position=2&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_178A3B8F-86C1-4831-9DBB-9788C2445752&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=32190922&parent_id=5&area_id=817&page=0&position=2&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 491, - "text_small": "491", - "text_large": "491人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": null, - "area_v2_id": 654, - "area_v2_parent_id": 2, - "area_v2_name": "诛仙世界", - "area_v2_parent_name": "网游", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/fdad2cfb408510df56a01af66254f630ee4b86b8.jpg", - "link": "/25959685?hotRank=0", - "online": 2151, - "pendant_Info": {}, - "roomid": 25959685, - "title": "免费接所有职业,死灵渊!只要收益", - "uname": "哦-是大一啊", - "face": "https://i1.hdslb.com/bfs/face/f83290ab5667f9c1ed778fb9c7c9cf6bf7624d4e.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 361517464, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000025959685tx1grb.jpg", - "is_auto_play": 1, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=25959685&parent_id=2&area_id=654&page=0&position=3&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_FB0DABE2-6A09-4EB7-8D2B-A4F892243A96&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=25959685&parent_id=2&area_id=654&page=0&position=3&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 269, - "text_small": "269", - "text_large": "269人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "钻石传说", - "value": "https://i0.hdslb.com/bfs/live/2007dc239982e909a3c9971c27968e5c0a872917.png", - "desc": "" - }, - "area_v2_id": 192, - "area_v2_parent_id": 5, - "area_v2_name": "聊天电台", - "area_v2_parent_name": "电台", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/22f1fcac8d9764901005ae5867a8c6b589b93ac5.jpg", - "link": "/31169918?hotRank=0", - "online": 27764, - "pendant_Info": {}, - "roomid": 31169918, - "title": "东北最后的温柔", - "uname": "关关-苏苏冠", - "face": "https://i2.hdslb.com/bfs/face/14f5102417107a6535c11ec9ad99050f7d712a17.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 3537120278874479, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071532000031169918qep44l.jpg", - "is_auto_play": 0, - "head_box_type": 1, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=31169918&parent_id=5&area_id=192&page=0&position=4&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_3E272538-AA76-4953-BF21-5BB19ECFEE28&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=31169918&parent_id=5&area_id=192&page=0&position=4&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 297, - "text_small": "297", - "text_large": "297人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": null, - "area_v2_id": 82, - "area_v2_parent_id": 2, - "area_v2_name": "剑网3", - "area_v2_parent_name": "网游", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/user_cover/9551fbb571b35bac3702c47e955177f17cab5cd2.jpg", - "link": "/2849730?hotRank=0", - "online": 4008, - "pendant_Info": {}, - "roomid": 2849730, - "title": "午间陪伴花间刷币", - "uname": "o诡墨o", - "face": "https://i1.hdslb.com/bfs/face/43ab308f836eb352aa4d541b55aafab2fa4435aa.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 71574442, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000002849730qo0792.jpg", - "is_auto_play": 1, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=2849730&parent_id=2&area_id=82&page=0&position=5&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_4BAFD91A-DDED-4655-BE47-064A6152BF9B&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=2849730&parent_id=2&area_id=82&page=0&position=5&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 204, - "text_small": "204", - "text_large": "204人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "迷梦幻境头像框", - "value": "https://i0.hdslb.com/bfs/garb/open/d272c8cdb2ab737f5aa3c1cf5a27db274e0ce034.png", - "desc": "" - }, - "area_v2_id": 744, - "area_v2_parent_id": 9, - "area_v2_name": "虚拟Singer", - "area_v2_parent_name": "虚拟主播", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/6e68e5c4f3d720e6f14952174be848383b879dad.jpg", - "link": "/21603945?hotRank=0", - "online": 10606, - "pendant_Info": {}, - "roomid": 21603945, - "title": "听歌碎碎念!~", - "uname": "Minicatty", - "face": "https://i0.hdslb.com/bfs/face/812d9ea6f3420d5c58ff455408275563f03fb861.jpg", - "verify": { - "role": 7, - "desc": "bilibili 直播高能主播", - "type": 0 - }, - "uid": 423902976, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe02071535000021603945pekr70.jpg", - "is_auto_play": 0, - "head_box_type": 2, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21603945&parent_id=9&area_id=744&page=0&position=6&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_56778C3F-4B14-4C78-8DF8-53721196E8D8&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21603945&parent_id=9&area_id=744&page=0&position=6&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 235, - "text_small": "235", - "text_large": "235人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": null, - "area_v2_id": 80, - "area_v2_parent_id": 2, - "area_v2_name": "吃鸡行动", - "area_v2_parent_name": "网游", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/fa7292a8741a40a612a1c466da58b7f9cc08f363.jpg", - "link": "/22976905?hotRank=0", - "online": 8536, - "pendant_Info": {}, - "roomid": 22976905, - "title": "全是细节!", - "uname": "菠萝鸽", - "face": "https://i1.hdslb.com/bfs/face/f073d24cbb992b4589825896de3fb9bc559ba180.jpg", - "verify": { - "role": 1, - "desc": "bilibili 知名游戏UP主、直播高能主播", - "type": 0 - }, - "uid": 1849164526, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350000229769056wy0mu.jpg", - "is_auto_play": 1, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=22976905&parent_id=2&area_id=80&page=0&position=7&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_CE3B32EC-E84D-4545-A693-97882454E0ED&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=22976905&parent_id=2&area_id=80&page=0&position=7&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 919, - "text_small": "919", - "text_large": "919人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": null, - "area_v2_id": 646, - "area_v2_parent_id": 10, - "area_v2_name": "生活杂谈", - "area_v2_parent_name": "生活", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/833e4d5449bcb4e425eb6399e0ef71f06903d083.jpg", - "link": "/21291747?hotRank=0", - "online": 38125, - "pendant_Info": {}, - "roomid": 21291747, - "title": "哪吒抢了封神票房?", - "uname": "陈哥惜命天涯", - "face": "https://i1.hdslb.com/bfs/face/d2c7e9c9b918ec969b2e15a5f2194bae3acd966e.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 286563388, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe0207153000002129174742tpke.jpg", - "is_auto_play": 0, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=21291747&parent_id=10&area_id=646&page=0&position=8&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_63BEC7F6-172E-46FC-BBAD-8CD3547AE6C1&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=21291747&parent_id=10&area_id=646&page=0&position=8&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 3107, - "text_small": "3107", - "text_large": "3107人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "Lirin兔耳娘 收藏集", - "value": "https://i2.hdslb.com/bfs/garb/open/41e2a2e3693f49e0b721c443fd784aa533456c49.png", - "desc": "" - }, - "area_v2_id": 745, - "area_v2_parent_id": 9, - "area_v2_name": "虚拟Gamer", - "area_v2_parent_name": "虚拟主播", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/b444bc87fbe1b346184f061efaffff21b24371f1.jpg", - "link": "/23797026?hotRank=0", - "online": 13294, - "pendant_Info": {}, - "roomid": 23797026, - "title": "日v 萌新玩玩三角洲♡", - "uname": "樱咲奈央_Official", - "face": "https://i2.hdslb.com/bfs/face/163330968a4a5fc8f31e9da9e919bbc258ecf40c.jpg", - "verify": { - "role": 7, - "desc": "bilibili直播高能主播", - "type": 0 - }, - "uid": 1880188304, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715310000237970260gnmn1.jpg", - "is_auto_play": 0, - "head_box_type": 2, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=23797026&parent_id=9&area_id=745&page=0&position=9&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_691E1F11-4960-4707-92EF-0F0D996E434C&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=23797026&parent_id=9&area_id=745&page=0&position=9&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 999, - "text_small": "999", - "text_large": "999人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": null, - "area_v2_id": 624, - "area_v2_parent_id": 10, - "area_v2_name": "电子榨菜", - "area_v2_parent_name": "生活", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/user_cover/a8a7681eaf20e43e16444e502106a436eb0e454c.jpg", - "link": "/1831473323?hotRank=0", - "online": 6510, - "pendant_Info": {}, - "roomid": 1831473323, - "title": "粤语片-法证1", - "uname": "曦曦每天都开心呀", - "face": "https://i1.hdslb.com/bfs/face/aa2112252080ec2298ea51b129c842fea7ed58f5.jpg", - "verify": { - "role": 0, - "desc": "", - "type": -1 - }, - "uid": 1434707683, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350018314733230k1dhu.jpg", - "is_auto_play": 0, - "head_box_type": 0, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=1831473323&parent_id=10&area_id=624&page=0&position=10&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_947BC1A4-E0F4-4ECE-AE40-9D9817848F9A&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=1831473323&parent_id=10&area_id=624&page=0&position=10&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 1446, - "text_small": "1446", - "text_large": "1446人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "帕里", - "value": "https://i0.hdslb.com/bfs/garb/item/7c9cd30bfab66e9490d8a03fc48754cdb12b4901.png", - "desc": "" - }, - "area_v2_id": 745, - "area_v2_parent_id": 9, - "area_v2_name": "虚拟Gamer", - "area_v2_parent_name": "虚拟主播", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/bd898138564a7e892e05dd1ff9cf9c34bdd9cb5b.jpg", - "link": "/42512?hotRank=0", - "online": 11612, - "pendant_Info": {}, - "roomid": 42512, - "title": "【文明7】使臣,你去死一下,然后我发兵", - "uname": "优礼子Ghaast", - "face": "https://i0.hdslb.com/bfs/face/e3f05d5b7bf56c57f55026676da71cc487d93988.jpg", - "verify": { - "role": 7, - "desc": "bilibili直播高能主播", - "type": 0 - }, - "uid": 6141432, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715350000000425126wxphk.jpg", - "is_auto_play": 0, - "head_box_type": 2, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=42512&parent_id=9&area_id=745&page=0&position=11&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_0517EBF3-EE5C-4967-A77A-9DB3F89A58A8&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=42512&parent_id=9&area_id=745&page=0&position=11&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 1998, - "text_small": "1998", - "text_large": "1998人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - }, - { - "head_box": { - "name": "百人舰队主播头像", - "value": "https://i0.hdslb.com/bfs/vc/071eb10548fe9bc482ff69331983d94192ce9507.png", - "desc": "" - }, - "area_v2_id": 102, - "area_v2_parent_id": 2, - "area_v2_name": "最终幻想14", - "area_v2_parent_name": "网游", - "broadcast_type": 0, - "cover": "https://i0.hdslb.com/bfs/live/new_room_cover/9370e1bbda854c8ac3b9a2a9a6e960106f307580.jpg", - "link": "/1897222?hotRank=0", - "online": 80052, - "pendant_Info": { - "1": { - "type": "mobile_index_badge", - "name": "百人成就", - "position": 1, - "text": "", - "bg_color": "#FB9E60", - "bg_pic": "https://i0.hdslb.com/bfs/live/539ce26c45cd4019f55b64cfbcedc3c01820e539.png", - "pendant_id": 426, - "priority": 1, - "created_at": 1738857680 - } - }, - "roomid": 1897222, - "title": "鸟区pvp", - "uname": "猫姐姐nya", - "face": "https://i1.hdslb.com/bfs/face/acc5559db9494af780b05fbf05c158995c48d023.jpg", - "verify": { - "role": 1, - "desc": "bilibili 知名游戏UP主", - "type": 0 - }, - "uid": 41377819, - "keyframe": "https://i0.hdslb.com/bfs/live-key-frame/keyframe020715360000018972225sqtbh.jpg", - "is_auto_play": 1, - "head_box_type": 1, - "flag": 0, - "session_id": "4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E", - "group_id": 1000217, - "show_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E&group_id=1000217&biz=live&event_id=live_card_show&rule_key=&special_id=0&roomid=1897222&parent_id=2&area_id=102&page=0&position=12&platform=web", - "click_callback": "https://live-trace.bilibili.com/xlive/data-interface/v1/index/log?sessionID=4b58e9bf85ef0539525f1c7b1467a5b8_93F5FBE6-4F84-40C9-AEA1-149E9D5D366E&group_id=1000217&biz=live&event_id=live_card_click&rule_key=&special_id=0&roomid=1897222&parent_id=2&area_id=102&page=0&position=12&platform=web", - "special_id": 0, - "watched_show": { - "switch": true, - "num": 2930, - "text_small": "2930", - "text_large": "2930人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": 0, - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - }, - "is_nft": 0, - "nft_dmark": "", - "is_ad": false, - "ad_transparent_content": null, - "show_ad_icon": false, - "status": false, - "followers": 0 - } - ], - "top_room_id": 0 - } -} -``` - -</details> diff --git a/docs/live/redpocket.md b/docs/live/redpocket.md deleted file mode 100644 index aafb1ff..0000000 --- a/docs/live/redpocket.md +++ /dev/null @@ -1,126 +0,0 @@ -# 直播间人气红包 - -## 获取指定直播间的红包信息 - -> https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb - -*请求方式:GET* - -认证方式(可选):Cookie(SESSDATA) - -如果不携带Cookie信息,user_status将始终返回2(未参与)。 - -如果所查询的直播间无红包,popularity_red_pocket为null。 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---------------- | ------ | ---- | -| roomid | str | 直播间id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | ---------- | ------------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 0:成功 | -| ttl | num | TimeToLive | 正常为1 | -| data | object | 返回数据 | | - -`data`对象: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| popularity_red_pocket | array | 人气红包信息 | | -| …… | ...... | …… | …… | - -`popularity_red_pocket`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------- | ---- | -| lot_id | num | 红包id | | -| sender_uid | num | 红包发送者uid | | -| sender_name | str | 红包发送者昵称 | | -| sender_face | str | 红包发送者头像 | | -| join_requirement | num | 参与条件? | | -| danmu | str | 参与红包时自动发送的弹幕内容 | | -| awards | array | 红包内容 | | -| lot_status | num | 未知 | | -| h5_url | str | 红包界面 | | -| user_status | num | 用户是否已参与 | 1:已参与 2:未参与 | -| lot_config_id | num | 未知 | | -| total_price | num | 红包总计价格 | | - -**示例:** - -查询房间号为24146996的直播间红包信息: - -```shell -curl -G 'https://api.live.bilibili.com/xlive/lottery-interface/v1/lottery/getLotteryInfoWeb?roomid=24146996' -``` - -<details> -<summary>查看响应示例:</summary> - -```json - -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "pk": null, - "guard": null, - "gift": null, - "storm": null, - "silver": null, - "activity_box": { - "ACTIVITY_ID": 0, - "ACTIVITY_PIC": "" - }, - "danmu": null, - "anchor": null, - "red_pocket": null, - "popularity_red_pocket": [{ - "lot_id": 622474, - "sender_uid": 1651908873, - "sender_name": "九泽糖糖の小蘑菇", - "sender_face": "http://i0.hdslb.com/bfs/face/c932c5c8b1607fe2e1da22b9780af19662dac939.jpg", - "join_requirement": 1, - "danmu": "老板大气!点点红包抽礼物!", - "awards": [{ - "gift_id": 31212, - "num": 2, - "gift_name": "打call", - "gift_pic": "https://s1.hdslb.com/bfs/live/f75291a0e267425c41e1ce31b5ffd6bfedc6f0b6.png" - }, { - "gift_id": 31214, - "num": 3, - "gift_name": "牛哇", - "gift_pic": "https://s1.hdslb.com/bfs/live/23475a7a6170e0d94ba52720e23060dc7604b735.png" - }, { - "gift_id": 31216, - "num": 3, - "gift_name": "i了i了", - "gift_pic": "https://s1.hdslb.com/bfs/live/1157a445487b39c0b7368d91b22290c60fa665b2.png" - }], - "start_time": 1645358104, - "end_time": 1645358284, - "last_time": 180, - "remove_time": 1645358299, - "replace_time": 1645358294, - "current_time": 1645358231, - "lot_status": 1, - "h5_url": "https://live.bilibili.com/p/html/live-app-red-envelope/popularity.html?is_live_half_webview=1\u0026hybrid_half_ui=1,5,100p,100p,000000,0,50,0,0,1;2,5,100p,100p,000000,0,50,0,0,1;3,5,100p,100p,000000,0,50,0,0,1;4,5,100p,100p,000000,0,50,0,0,1;5,5,100p,100p,000000,0,50,0,0,1;6,5,100p,100p,000000,0,50,0,0,1;7,5,100p,100p,000000,0,50,0,0,1;8,5,100p,100p,000000,0,50,0,0,1\u0026hybrid_rotate_d=1\u0026hybrid_biz=popularityRedPacket\u0026lotteryId=622474", - "user_status": 1, - "lot_config_id": 3, - "total_price": 1600 - }], - "activity_box_info": null - } -} -``` - -</details> diff --git a/docs/live/report.md b/docs/live/report.md deleted file mode 100644 index 0dd3ec5..0000000 --- a/docs/live/report.md +++ /dev/null @@ -1,66 +0,0 @@ -# 直播心跳上报 - -## 直播心跳 (Web端) - -> https://live-trace.bilibili.com/xlive/rdata-interface/v1/heartbeat/webHeartBeat - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ----------- | ----------------- | -| hb | str | heartbeat 正文 | 不必要 | 使用 base64 编码 | -| pf | str | 平台名称 | 不必要 | 可为 `web` | - -`hb` 解码参数: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ---- | ---- | -| 0 | num | 上次返回的 next_interval 值 | 默认 60 | -| 1 | num | 真实直播间号 | | -| 2 | num | 1 | 作用尚不明确 | -| 3 | num | 0 | 作用尚不明确 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| next_interval | num | 下次心跳间隔 | | - -**示例:** - -上报直播间 26863308 的心跳 - -```shell -curl -G "https://live-trace.bilibili.com/xlive/rdata-interface/v1/heartbeat/webHeartBeat" \ ---data-urlencode "hb=$(echo "60|26863308|1|0" | base64 -)" \ ---data-urlencode "pf=web" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "next_interval": 60 - } -} -``` - -</details> diff --git a/docs/live/silent_user_manage.md b/docs/live/silent_user_manage.md deleted file mode 100644 index 59502de..0000000 --- a/docs/live/silent_user_manage.md +++ /dev/null @@ -1,219 +0,0 @@ -# 直播间禁言相关 API - -## 禁言观众 - -> https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/AddSilentUser - -*请求方式:post* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | --- | ---------- | --- | ------------------ | -| room_id | str | 直播间Id | 必要 | | -| tuid | str | 要禁言的uid | 必要 | | -| msg | str | 要禁言的弹幕内容 | 非必要 | | -| mobile_app | str | web | 必要 | 定值"web"即可 | -| hour | num | 禁言时长 | 必要 | -1为永久,0为本场直播 | -| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| visit_id | str | 不明 | 非必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | ---- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为 "0" | -| ttl | str | 1 | | -| data | obj | 信息本体 | 成功为空 | - -**示例:** - -```shell -curl -X POST 'https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/AddSilentUser' \ ---data-urlencode 'room_id=xxxxxx' \ ---data-urlencode 'tuid=xxx' \ ---data-urlencode 'msg=xxxx' \ ---data-urlencode 'mobile_app=web' \ ---data-urlencode 'csrf_token=xx' \ ---data-urlencode 'csrf=xx' \ ---data-urlencode 'visit_id=' \ --H 'Content-Type:application/x-www-form-urlencoded' \ --b 'SESSDATA=xxx; bili_jct=xx;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{"code":0,"message":"0","ttl":1,"data":{}} -``` - -</details> - -## 查询直播间禁言列表 - -> https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/GetSilentUserList - -*请求方式:post* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | --- | ---------- | --- | ------------------ | -| room_id | str | 直播间Id | 必要 | | -| ps | str | 列表页码 | 必要 | | -| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| visit_id | str | 不明 | 非必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | ---- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为 "0" | -| ttl | str | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ------ | ------- | -| data | array | 禁言列表 | 数组中为obj | -| total | int | 禁言观众数量 | | -| total_page | int | 页码总数量 | | - -`data`对象中`data`数组的元素对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | --- | ------ | --------- | -| tuid | num | 禁言者uid | | -| tname | str | 禁言者昵称 | | -| uid | num | 发起者uid | | -| name | str | 发起者昵称 | | -| ctime | str | 禁言时间 | | -| id | num | 禁言记录Id | 解除禁言时用到 | -| is_anchor | num | 不明 | | -| face | str | 禁言者头像 | | -| admin_level | num | 发起者权限 | 0:主播,1:房管 | - -**示例:** - -```shell -curl -X POST 'https://api.live.bilibili.com/xlive/web-ucenter/v1/banned/GetSilentUserList' \ ---data-urlencode 'room_id=xxxxxxx' \ ---data-urlencode 'ps=1' \ ---data-urlencode 'csrf_token=xxx' \ ---data-urlencode 'csrf=xxx' \ ---data-urlencode 'visit_id=' \ --H 'Content-Type:application/x-www-form-urlencoded' \ --b 'SESSDATA=xxxx; bili_jct=xxx;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "data":[ - { - "tuid":123456, - "tname":"xxxxx", - "uid":123456, - "name":"xxxx", - "ctime":"2023-12-15 16:32:46", - "id":13493921, - "is_anchor":0, - "face":"https://i1.hdslb.com/bfs/face/xxxxx.jpg", - "admin_level":1 - }, - { - "tuid":123456, - "tname":"xx", - "uid":123456, - "name":"xxxx", - "ctime":"2021-08-23 22:26:06", - "id":8018136, - "is_anchor":1, - "face":"https://i1.hdslb.com/bfs/face/xxxxxx.jpg", - "admin_level":0 - } - ], - "total":2, - "total_page":1 - } -} -``` - -</details> - -## 解除禁言 - -> https://api.live.bilibili.com/banned_service/v1/Silent/del_room_block_user - -*请求方式:post* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`bili_jct`的值正确并与`csrf`相同 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | --- | ---------- | --- | ---------------------- | -| roomid | str | 直播间Id | 必要 | 注意该接口名称没有“_” | -| id | str | 禁言记录Id | 必要 | GetSilentUserList 接口获取 | -| csrf_token | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| csrf | str | CSRF Token | 必要 | cookie中的bili_jct字段 | -| visit_id | str | 不明 | 非必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | --- | ---- | ---- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 成功为空 | -| ttl | str | 1 | | -| data | obj | 信息本体 | 成功为空 | - -**示例:** - -```shell -curl -X POST 'https://api.live.bilibili.com/banned_service/v1/Silent/del_room_block_user' \ ---data-urlencode 'roomid=xxxxxxxxx' \ ---data-urlencode 'id=xxxxx' \ ---data-urlencode 'csrf_token=xxx' \ ---data-urlencode 'csrf=xxx' \ ---data-urlencode 'visit_id=' \ --H 'Content-Type:application/x-www-form-urlencoded' \ --b 'SESSDATA=xxxxxx; bili_jct=xxx;' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{"code":0,"msg":"","message":"","data":[]} -``` - -</details> diff --git a/docs/live/user.md b/docs/live/user.md deleted file mode 100644 index 560998e..0000000 --- a/docs/live/user.md +++ /dev/null @@ -1,1248 +0,0 @@ -# 直播间用户实用 API - -## 获取自己持有的粉丝勋章信息 - -> ~~https://api.live.bilibili.com/fans_medal/v5/live_fans_medal/iApiMedal~~ (旧) -> https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ------------ | ------ | ------------------------------------------------- | -| page_size | num | 每页的数量 | 必要 | 最大为 10,超出 `1002002:参数异常` | -| page | num | 返回结果页数 | 必要 | 两个参数不填返回空,只 page 不填或错误则 500 异常 | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功<br />-1002002:参数异常<br />-500:服务器异常 | -| message | str | 错误信息 | 默认为 "0" | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------------- | ---- | -| count | num | 勋章数量 | | -| items | array | 粉丝勋章信息本体 | | -| page_info | obj | 页码信息 | | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ------ | -------------------- | -------------------------------------- | -| can_delete | bool | 可否删除 | | -| day_limit | num | 日经验上限(原力值) | eg: 1500 | -| guard_level | num | | | -| guard_medal_title | str | 加成状态 | | -| intimacy | num | 当前已得亲密度 | | -| is_lighted | num | 是否点亮 | 0:未点亮<br />1:点亮 | -| level | num | 勋章等级 | | -| medal_name | str | 勋章名 | | -| medal_color_border | num | 勋章边框颜色信息 | 颜色数值为 10 进制的 16 进制值(下同) | -| medal_color_start | num | 勋章起始颜色 | 从右往左渐变(20 级+勋章) | -| medal_color_end | num | 勋章结束颜色 | 从右往左渐变(20 级+勋章) | -| medal_id | num | 粉丝勋章 id | | -| next_intimacy | num | 升级所需经验 | | -| today_feed | num | 本日亲密度 | | -| roomid | num | 直播间房间号 | | -| status | num | | | -| target_id | number | up 主 mid | | -| target_name | str | up 主用户名 | | -| uname | str | up 主用户名 | | - -`page_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------- | ---- | -| total_page | num | 页码总长度 | | -| cur_page | num | 当前返回的页码 | | - -**示例:** - -```shell -curl https://api.live.bilibili.com/xlive/app-ucenter/v1/user/GetMyMedals?page=1&page_size=10 \ --b "SESSDATA=xxx" -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "items": [ - { - "can_deleted": true, - "day_limit": 1500, - "guard_level": 0, - "guard_medal_title": "未开启加成", - "intimacy": 9617, - "is_lighted": 0, - "level": 11, - "medal_name": "锦依卫", - "medal_color_border": 12632256, - "medal_color_end": 12632256, - "medal_color_start": 12632256, - "medal_id": 29245, - "next_intimacy": 10000, - "today_feed": 0, - "roomid": 1546736, - "status": 0, - "target_id": 36081646, - "target_name": "洛天依", - "uname": "洛天依" - } - ], - "page_info": { - "cur_page": 1, - "total_page": 1 - }, - "count": 1 - } -} -``` - -</details> - - -## 佩戴勋章 - -> https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear - -*请求方式:POST* - -**表单参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ----------------------- | ------ | ---- | -| medal_id | num | 勋章 id | 必要 | | -| csrf | num | cookie 中 bili_jct 字段 | 必要 | | -| csrf_token | num | 同上 | 必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------- | -| code | num | 返回值 | 0:成功 | -| ttl | num | 1 | | -| message | str | 错误信息 | 默认为佩戴成功 | -| data | obj | 信息本体 | 默认为无 | - -**示例:** - -佩戴勋章 id 为 1 的勋章 - -```JavaScript -var madelForm = new FormData(); -madelForm.append("medal_id", 1); -madelForm.append("csrf", bili_jct); -madelForm.append("csrf_token", bili_jct); -$.ajax({ - url: "https://api.live.bilibili.com/xlive/web-room/v1/fansMedal/wear", - type: "POST", - data: madelForm, - dataType: "JSON", - processData: false, - contentType: false, - cache: false, - xhrFields: { - withCredentials: true - }, - success: function (){ - - } -}) -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "佩戴成功", - "ttl": 1, - "data": {} -} -``` - -</details> - -## ~~直播签到(已下线)~~ - -> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign - -_请求方式:GET_ - -认证方式:Cookie(SESSDATA)或 APP - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------ | -| code | num | 返回值 | 0:成功<br />1:参数错误 | -| ttl | num | 1 | | -| message | str | 错误信息 | 默认为当日签到奖励内容 | -| data | obj | 信息本体 | 默认为空 | - -(目前已下线) - -<details> -<summary>查看响应示例(下线后):</summary> - -```json -{ - "code": 1, - "message": "签到活动已下线,无法使用。", - "ttl": 1, - "data": null -} -``` - -</details> - - -## 本月直播签到信息 - -> https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/WebGetSignInfo - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| ttl | num | 1 | | -| message | str | 错误信息 | 默认为0 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ---------------------------- | ------------------------ | -| text | str | 今日签到奖励信息 | 默认为空 | -| specialText | str | 连续签到奖励信息 | 默认为空 | -| status | num | 签到状态 | 0:未签到<br />1:已签到 | -| allDays | num | 当月天数 | | -| curMonth | num | 当前月 | | -| curYear | num | 当前年 | | -| curDay | num | 当前日 | | -| curData | str | 当前日期(格式化) | eg: 2023-2-19 | -| hadSignDays | num | 当月已签到天数 | 默认为0 | -| newTask | num | 作用未知 | 默认为0 | -| signDaysList | array | 当月已签到日列表 | 默认为空 | -| signBonusDaysList | array | 当月已签到且有特殊奖励日列表 | 默认为空 | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "text": "3000点用户经验,2根辣条", - "specialText": "再签到7天可以获得50根辣条", - "status": 1, - "allDays": 28, - "curMonth": 2, - "curYear": 2023, - "curDay": 19, - "curDate": "2023-2-19", - "hadSignDays": 13, - "newTask": 0, - "signDaysList": [ - 2, - 3, - 4, - 5, - 6, - 7, - 11, - 13, - 14, - 15, - 17, - 18, - 19 - ], - "signBonusDaysList": [ - 6 - ] - } -} -``` - -</details> - -## 上月直播签到信息 - -> https://api.live.bilibili.com/sign/getLastMonthSignDays - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| ttl | num | 1 | | -| message | str | 错误信息 | 默认为0 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ---------------------------- | -------- | -| days | num | 上月天数 | | -| month | num | 上月月份值 | | -| hadSignDays | num | 上月已签到天数 | 默认为0 | -| signDaysList | array | 上月已签到日列表 | 默认为空 | -| signBonusDaysList | array | 上月已签到且有特殊奖励日列表 | 默认为空 | - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "month": 1, - "days": 31, - "hadSignDays": 20, - "signDaysList": [ - 1, - 2, - 3, - 6, - 7, - 8, - 10, - 12, - 13, - 14, - 15, - 18, - 20, - 23, - 24, - 25, - 26, - 27, - 30, - 31 - ], - "signBonusDaysList": [ - 7, - 31 - ] - } -} -``` - -</details> - -## 查询直播间贡献榜 - -> https://api.live.bilibili.com//xlive/general-interface/v1/rank/getOnlineGoldRank - -*请求方式:GET* - -认证方式:无 - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | -------------- | ------ | ------ | -| roomId | num | 房间号 | 必要 | | -| page | num | 返回结果页数 | 必要 | | -| pageSize | num | 返回结果页大小 | 必要 | 最大50 | -| ruid | num | 主播uid | 必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | - - - - - -`data`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | ------------ | ---- | -| onlineNum | num | 在线观众数量 | | -| OnlineRankItem | array | 结果 | | | - -`OnlineRankItem`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ---- | -| userRank | num | 贡献值排名 | | -| uid | num | 用户id | | | -| name | str | 用户名字 | | | -| face | str | 用户头像 | | | -| score | num | 贡献值 | | | -| medalInfo | obj | 粉丝牌对象 | | | -| guard_level | num | 大航海类型 | | | -| wealth_level | num | 荣耀等级 | | | -| guard_level | num | 大航海类型 | | | -| uinfo | obj | 用户详细信息 | | | - -`uinfo`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---- | -| uid | num | 用户uid | | -| base | obj | 用户基本信息 | | | -| medal | obj | 用户粉丝牌 | | | -| face | str | 用户头像 | | | -| guard | obj | 大航海 | | | - -`guard`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ---- | -| level | num | 大航海类型 | | -| expired_str | str | 大航海到期时间 | | | - - -**示例:** - -查询`23174842`直播间的大航海成员 - - -```shell -curl 'https://api.live.bilibili.com//xlive/general-interface/v1/rank/getOnlineGoldRank?roomId=26854650&ruid=3493118494116797&page=3&pageSize=20' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "onlineNum": 45, - "OnlineRankItem": [ - { - "userRank": 1, - "uid": 36136895, - "name": "四月hallu", - "face": "https://i2.hdslb.com/bfs/face/5e5166ecc4c17d4dbc7a09dbb6bb749d9f537985.jpg", - "score": 3768, - "medalInfo": { - "guardLevel": 3, - "medalColorStart": 2951253, - "medalColorEnd": 10329087, - "medalColorBorder": 6809855, - "medalName": "钢板鹿", - "level": 29, - "targetId": 3493118494116797, - "isLight": 1 - }, - "guard_level": 3, - "wealth_level": 41, - "is_mystery": false, - "uinfo": { - "uid": 36136895, - "base": { - "name": "四月hallu", - "face": "https://i2.hdslb.com/bfs/face/5e5166ecc4c17d4dbc7a09dbb6bb749d9f537985.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "四月hallu", - "face": "https://i2.hdslb.com/bfs/face/5e5166ecc4c17d4dbc7a09dbb6bb749d9f537985.jpg" - }, - "origin_info": { - "name": "四月hallu", - "face": "https://i2.hdslb.com/bfs/face/5e5166ecc4c17d4dbc7a09dbb6bb749d9f537985.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "钢板鹿", - "level": 29, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 6809855, - "color": 2951253, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493118494116797, - "guard_level": 3, - "score": 50422604, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "wealth": { - "level": 41, - "dm_icon_key": "ChronosWealth_4.png" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-07-07 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 2, - "uid": 1182882611, - "name": "重生指令", - "face": "https://i2.hdslb.com/bfs/face/6762c39b424e6de5bf0292fd12a019201a501fb9.jpg", - "score": 1546, - "medalInfo": { - "guardLevel": 0, - "medalColorStart": 12632256, - "medalColorEnd": 12632256, - "medalColorBorder": 12632256, - "medalName": "雪狐咕", - "level": 24, - "targetId": 477792, - "isLight": 0 - }, - "guard_level": 3, - "wealth_level": 22, - "is_mystery": false, - "uinfo": { - "uid": 1182882611, - "base": { - "name": "重生指令", - "face": "https://i2.hdslb.com/bfs/face/6762c39b424e6de5bf0292fd12a019201a501fb9.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "重生指令", - "face": "https://i2.hdslb.com/bfs/face/6762c39b424e6de5bf0292fd12a019201a501fb9.jpg" - }, - "origin_info": { - "name": "重生指令", - "face": "https://i2.hdslb.com/bfs/face/6762c39b424e6de5bf0292fd12a019201a501fb9.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "雪狐咕", - "level": 24, - "color_start": 12632256, - "color_end": 12632256, - "color_border": 12632256, - "color": 1725515, - "id": 0, - "typ": 0, - "is_light": 0, - "ruid": 477792, - "guard_level": 0, - "score": 50010220, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#919298CC", - "v2_medal_color_end": "#919298CC", - "v2_medal_color_border": "#919298CC", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C6C7299", - "user_receive_count": 0 - }, - "wealth": { - "level": 22, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-06-29 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 3, - "uid": 35007043, - "name": "_单推哈鹿halluの狐狸", - "face": "https://i1.hdslb.com/bfs/face/6373a98189480661fc725494ab5ab68253522b8f.jpg", - "score": 1543, - "medalInfo": { - "guardLevel": 2, - "medalColorStart": 2951253, - "medalColorEnd": 10329087, - "medalColorBorder": 16771156, - "medalName": "钢板鹿", - "level": 29, - "targetId": 3493118494116797, - "isLight": 1 - }, - "guard_level": 2, - "wealth_level": 40, - "is_mystery": false, - "uinfo": { - "uid": 35007043, - "base": { - "name": "_单推哈鹿halluの狐狸", - "face": "https://i1.hdslb.com/bfs/face/6373a98189480661fc725494ab5ab68253522b8f.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "_单推哈鹿halluの狐狸", - "face": "https://i1.hdslb.com/bfs/face/6373a98189480661fc725494ab5ab68253522b8f.jpg" - }, - "origin_info": { - "name": "_单推哈鹿halluの狐狸", - "face": "https://i1.hdslb.com/bfs/face/6373a98189480661fc725494ab5ab68253522b8f.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "钢板鹿", - "level": 29, - "color_start": 2951253, - "color_end": 10329087, - "color_border": 16771156, - "color": 2951253, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493118494116797, - "guard_level": 2, - "score": 50360413, - "guard_icon": "https://i0.hdslb.com/bfs/live/98a201c14a64e860a758f089144dcf3f42e7038c.png", - "honor_icon": "", - "v2_medal_color_start": "#9660E5CC", - "v2_medal_color_end": "#9660E5CC", - "v2_medal_color_border": "#D47AFFFF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#6C00A099", - "user_receive_count": 0 - }, - "wealth": { - "level": 40, - "dm_icon_key": "ChronosWealth_4.png" - }, - "title": null, - "guard": { - "level": 2, - "expired_str": "2025-07-30 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 7, - "uid": 44152084, - "name": "_柚_子_hallu", - "face": "https://i1.hdslb.com/bfs/face/137498c2c6a3231e5b6047af12a64bbd19627dcb.jpg", - "score": 324, - "medalInfo": { - "guardLevel": 3, - "medalColorStart": 398668, - "medalColorEnd": 6850801, - "medalColorBorder": 6809855, - "medalName": "钢板鹿", - "level": 26, - "targetId": 3493118494116797, - "isLight": 1 - }, - "guard_level": 3, - "wealth_level": 32, - "is_mystery": false, - "uinfo": { - "uid": 44152084, - "base": { - "name": "_柚_子_hallu", - "face": "https://i1.hdslb.com/bfs/face/137498c2c6a3231e5b6047af12a64bbd19627dcb.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "_柚_子_hallu", - "face": "https://i1.hdslb.com/bfs/face/137498c2c6a3231e5b6047af12a64bbd19627dcb.jpg" - }, - "origin_info": { - "name": "_柚_子_hallu", - "face": "https://i1.hdslb.com/bfs/face/137498c2c6a3231e5b6047af12a64bbd19627dcb.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "钢板鹿", - "level": 26, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493118494116797, - "guard_level": 3, - "score": 50057285, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": { - "level": 32, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-06-27 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 8, - "uid": 8242366, - "name": "翟赧hallu", - "face": "https://i1.hdslb.com/bfs/face/9b312f4146ca2c8a1d2e5468e345ecfb60be3874.jpg", - "score": 276, - "medalInfo": { - "guardLevel": 3, - "medalColorStart": 398668, - "medalColorEnd": 6850801, - "medalColorBorder": 6809855, - "medalName": "钢板鹿", - "level": 28, - "targetId": 3493118494116797, - "isLight": 1 - }, - "guard_level": 3, - "wealth_level": 35, - "is_mystery": false, - "uinfo": { - "uid": 8242366, - "base": { - "name": "翟赧hallu", - "face": "https://i1.hdslb.com/bfs/face/9b312f4146ca2c8a1d2e5468e345ecfb60be3874.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "翟赧hallu", - "face": "https://i1.hdslb.com/bfs/face/9b312f4146ca2c8a1d2e5468e345ecfb60be3874.jpg" - }, - "origin_info": { - "name": "翟赧hallu", - "face": "https://i1.hdslb.com/bfs/face/9b312f4146ca2c8a1d2e5468e345ecfb60be3874.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "钢板鹿", - "level": 28, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493118494116797, - "guard_level": 3, - "score": 50208414, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": { - "level": 35, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-08-05 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 9, - "uid": 418232, - "name": "lug7", - "face": "http://i2.hdslb.com/bfs/face/5d2c92beb774a4bb30762538bb102d23670ae9c0.gif", - "score": 171, - "medalInfo": { - "guardLevel": 3, - "medalColorStart": 398668, - "medalColorEnd": 6850801, - "medalColorBorder": 6809855, - "medalName": "钢板鹿", - "level": 26, - "targetId": 3493118494116797, - "isLight": 1 - }, - "guard_level": 3, - "wealth_level": 28, - "is_mystery": false, - "uinfo": { - "uid": 418232, - "base": { - "name": "lug7", - "face": "http://i2.hdslb.com/bfs/face/5d2c92beb774a4bb30762538bb102d23670ae9c0.gif", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "lug7", - "face": "http://i2.hdslb.com/bfs/face/5d2c92beb774a4bb30762538bb102d23670ae9c0.gif" - }, - "origin_info": { - "name": "lug7", - "face": "http://i2.hdslb.com/bfs/face/5d2c92beb774a4bb30762538bb102d23670ae9c0.gif" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "钢板鹿", - "level": 26, - "color_start": 398668, - "color_end": 6850801, - "color_border": 6809855, - "color": 398668, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493118494116797, - "guard_level": 3, - "score": 50050050, - "guard_icon": "https://i0.hdslb.com/bfs/live/143f5ec3003b4080d1b5f817a9efdca46d631945.png", - "honor_icon": "", - "v2_medal_color_start": "#4775EFCC", - "v2_medal_color_end": "#4775EFCC", - "v2_medal_color_border": "#58A1F8FF", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": { - "level": 28, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-06-15 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 10, - "uid": 452228643, - "name": "很糊的小龔鬱hallu", - "face": "https://i0.hdslb.com/bfs/face/996fa85fe42d582dd013dcb435de3f3ff4d33f6c.jpg", - "score": 35, - "medalInfo": { - "guardLevel": 0, - "medalColorStart": 6126494, - "medalColorEnd": 6126494, - "medalColorBorder": 6126494, - "medalName": "牧斯", - "level": 6, - "targetId": 3493087074585126, - "isLight": 1 - }, - "guard_level": 3, - "wealth_level": 35, - "is_mystery": false, - "uinfo": { - "uid": 452228643, - "base": { - "name": "很糊的小龔鬱hallu", - "face": "https://i0.hdslb.com/bfs/face/996fa85fe42d582dd013dcb435de3f3ff4d33f6c.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "很糊的小龔鬱hallu", - "face": "https://i0.hdslb.com/bfs/face/996fa85fe42d582dd013dcb435de3f3ff4d33f6c.jpg" - }, - "origin_info": { - "name": "很糊的小龔鬱hallu", - "face": "https://i0.hdslb.com/bfs/face/996fa85fe42d582dd013dcb435de3f3ff4d33f6c.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": { - "name": "牧斯", - "level": 6, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 6126494, - "id": 0, - "typ": 0, - "is_light": 1, - "ruid": 3493087074585126, - "guard_level": 0, - "score": 3400, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - }, - "wealth": { - "level": 35, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-06-19 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - { - "userRank": 11, - "uid": 164871173, - "name": "奶浴-bllss", - "face": "https://i2.hdslb.com/bfs/face/f48dd7c1e432eb91e5fd286757c4e2600930f4c5.jpg", - "score": 26, - "medalInfo": null, - "guard_level": 3, - "wealth_level": 36, - "is_mystery": false, - "uinfo": { - "uid": 164871173, - "base": { - "name": "奶浴-bllss", - "face": "https://i2.hdslb.com/bfs/face/f48dd7c1e432eb91e5fd286757c4e2600930f4c5.jpg", - "name_color": 0, - "is_mystery": false, - "risk_ctrl_info": { - "name": "奶浴-bllss", - "face": "https://i2.hdslb.com/bfs/face/f48dd7c1e432eb91e5fd286757c4e2600930f4c5.jpg" - }, - "origin_info": { - "name": "奶浴-bllss", - "face": "https://i2.hdslb.com/bfs/face/f48dd7c1e432eb91e5fd286757c4e2600930f4c5.jpg" - }, - "official_info": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "name_color_str": "" - }, - "medal": null, - "wealth": { - "level": 36, - "dm_icon_key": "" - }, - "title": null, - "guard": { - "level": 3, - "expired_str": "2025-07-20 23:59:59" - }, - "uhead_frame": null, - "guard_leader": null - } - }, - ], - "ownInfo": { - "uid": 0, - "name": "", - "face": "", - "rank": -1, - "needScore": 0, - "score": 0, - "guard_level": 0, - "wealth_level": 0, - "is_mystery": false, - "uinfo": null - }, - "tips_text": "投喂、点赞、发弹幕、持续观看均可上榜", - "value_text": "贡献值", - "ab": { - "guard_accompany_list": 1 - }, - "onlineNumText": "45" - } -} -``` -</details> - -## 查询自己在某直播间观看时长 - -> https://api.live.bilibili.com/xlive/general-interface/v1/guard/GuardActive - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------- | ------ | ---- | -| platform | str | android | 必要 | | -| ruid | num | 主播uid | 必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - - - - - -`data`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ----------------------------- | -| ruid | num | 主播uid | | -| rusername | str | 主播用户名 | | -| rface | str | 主播头像 | | -| username | str | 自己的用户名 | | -| accomany | int | 大航海陪伴天数 | 似乎b站程序员把这个单词拼错了 | -| rusername | str | 主播用户名 | | -| watch_time | num | 观看时长 | 单位是秒 | -| up_medal | obj | 粉丝牌 | | -| guard_num_3 | num | 主播舰长数量 | -| guard_num_2 | num | 主播提督数量 | | -| guard_num_1 | num | 主播总督数量 | | -| is_live | num | 直播状态 | | - - - -## 查询用户在直播间的信息 - -> https://api.live.bilibili.com/xlive/app-ucenter/v2/card/user - -*请求方式:GET* - -认证方式:无 - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| uid | num | 目标用户uid | 必要 | | -| ruid | num | 主播uid | 必要 | | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | - - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------ | ------------------------------ | -| uid | num | 目标用户id | | -| uname | str | 目标用户名 | | -| desc | str | 目标用户认证信息 | | -| face | str | 目标用户头像 | | -| follow_num | num | 目标用户粉丝数 | | -| attention_num | num | 目标用户关注数 | -| main_vip | num | 目标用户大会员状态 | 0:无 2:大会员 | -| is_block | num | 是否被拉黑? | 始终为0? | -| is_admin | num | 是否房管 | | -| is_black | num | 是否被关小黑屋 | | -| wealth_info | obj | 荣耀等级 | | -| fans_medal | obj | 粉丝牌 | 如果目标用户隐藏粉丝牌则为null | - -`wealth_info`对象: -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | -------------------------- | ---- | -| level | num | 荣耀等级 | | -| level_total_score | num | 下一等级的荣耀值 | | -| cur_score | num | 当前荣耀值 | | -| upgrade_need_score | num | 升到下一等级还差多少荣耀值 | | - -**示例:** - -```shell -curl 'https://api.live.bilibili.com/xlive/app-ucenter/v2/card/user?ruid=504140200&uid=504140200' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "uid": 504140200, - "uname": "软软riu", - "face": "https://i1.hdslb.com/bfs/face/2d083d686b704eb7010e3d94595d47f5a89c8aef.jpg", - "verify_type": 0, - "desc": "bilibili UP主认证:bilibili 知名虚拟UP主、直播高能主播", - "uname_color": 2171169, - "room_id": 23174842, - "pendant": "https://i1.hdslb.com/bfs/garb/open/8806f97581082d68edcf2207368290b3fb3491bb.png", - "pendant_from": 2, - "follow_num": 214882, - "attention_num": 202, - "relation_status": 1, - "privilege_type": 3, - "fans_medal": null, - "title_sum": 10, - "wearing_title": "", - "main_vip": 0, - "is_block": 0, - "is_admin": 0, - "fans_medal_list_url": "https://live.bilibili.com/p/html/live-fansmedal-wall/index.html?tId=504140200#/medal", - "wearing": {}, - "is_black": 0, - "admin_level": 0, - "head_picture": "http://i0.hdslb.com/bfs/live/3f536f59e337a731c5367f623bca79b32197ddd5.png", - "head_text": "大航海舰长", - "head_url": "", - "head_business": 1, - "head_skin_icon": "http://i0.hdslb.com/bfs/live/d44e103f424f5ae01ef3d0133ef812f8241d15b0.png", - "privilege_center": {}, - "is_nft": 0, - "nft_dmark": "https://i0.hdslb.com/bfs/live/9f176ff49d28c50e9c53ec1c3297bd1ee539b3d6.gif", - "is_real_fans": false, - "wealth_info": { - "uid": 504140200, - "level": 35, - "level_total_score": 6000000, - "cur_score": 5012900, - "upgrade_need_score": 987100, - "status": 1, - "dm_icon_key": "" - }, - "guard": { - "accompany": 0, - "accompany_slake": 0 - }, - "chat_url_android": "activity://im/conversation/?conversation_type=1&reciveid=504140200", - "chat_url_ios": "bilibili://link/chat?session_id=s504140200", - "gift_star": null, - "is_mystery": false, - "text_control": null, - "uinfo_medal": null, - "guard_attire": {}, - "flash_buy": 0, - "flash_buy_url": "" - } -} -``` -</details> \ No newline at end of file diff --git a/docs/login/cookie_refresh.md b/docs/login/cookie_refresh.md deleted file mode 100644 index e1b22fa..0000000 --- a/docs/login/cookie_refresh.md +++ /dev/null @@ -1,574 +0,0 @@ -# Web端Cookie刷新 - -自从 2023 以来,社区反馈似乎 Web 端的 Cookie 会随着一些敏感接口的访问逐渐失效,而在 Web 页面上会判断 Cookie 是否需要刷新,如需刷新则会以动态加载 iframe 方式实现,同时登录(二维码 / 密码 / 短信验证码等)接口也会返回`refresh_token`字段,需要持久化保存,是一种官方的风控机制实现 - -感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供相关研究报告以及逆向工程结果 - -> cookie 不会主动刷新的,只要他没有调用下面的刷新接口就不会刷新。也就是说,你只要不再打开浏览器,或者直接把 localStorage 的 ac_time_value 字段删除了。那么 cookie 在真的失效前(登录过期、账号风控等强制下线)都是不变化的。 - -## 刷新步骤(伪代码) - -```python -cookie, refresh_token = 进行登录操作() # can be 二维码 / 密码 / 短信验证码 - -while True: - if 每日第一次访问接口: - if 检查是否需要刷新(cookie): - CorrespondPath = 生成CorrespondPath(当前毫秒时间戳) - refresh_csrf = 获取refresh_csrf(CorrespondPath, cookie) - refresh_token_old = refresh_token # 这一步必须保存旧的 refresh_token 备用 - cookie, refresh_token = 刷新Cookie(refresh_token, refresh_csrf, cookie) - 确认更新(refresh_token_old, cookie) # 这一步需要新的 Cookie 以及旧的 refresh_token - SSO站点跨域登录(cookie) - do_somethings(cookie) # 其他业务逻辑处理 -``` - -## 检查是否需要刷新 - -> https://passport.bilibili.com/x/passport-login/web/cookie/info - -*请求方式:GET* - -鉴权方式:Cookie - -**url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------- | ------ | ---- | -| csrf | str | CSRF Token(位于 Cookie) | 非必要 | 位于 Cookie 中的bili_jct字段 | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功<br />-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------------- | ----------------------------------------------------- | -| refresh | bool | 是否应该刷新 Cookie | `true`:需要刷新 Cookie<br />`false`:无需刷新 Cookie | -| timestamp | num | 当前毫秒时间戳 | 用于获取 refresh_csrf | - -**示例:** - -```bash -curl -G 'https://passport.bilibili.com/x/passport-login/web/cookie/info' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -<details> -<summary>查看响应示例:</summary> - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "refresh": false, - "timestamp": 1684466082562 - } -} -``` - -</details> - -## 生成CorrespondPath算法 - -该算法逆向于以下 wasm 以及 JavaScript bind 接口,抓取于官方 Web 首页中,感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供 - -https://s1.hdslb.com/bfs/static/jinkela/long/wasm/wasm_rsa_encrypt_bg.wasm - -https://s1.hdslb.com/bfs/static/jinkela/long/wasm/wasm_ras_umd.js - -### 算法细节 - -将`refresh_${timestamp}`作为消息体(参数`timestamp`为当前毫秒时间戳),用下方 PubKey 进行 [RSA-OAEP](https://datatracker.ietf.org/doc/html/rfc3447#section-7.1) 算法加密,之后密文通过小写 Base16 编码为字符串 - -JWK 格式: - -> { -> "kty": "RSA", -> "n": "y4HdjgJHBlbaBN04VERG4qNBIFHP6a3GozCl75AihQloSWCXC5HDNgyinEnhaQ_4-gaMud_GF50elYXLlCToR9se9Z8z433U3KjM-3Yx7ptKkmQNAMggQwAVKgq3zYAoidNEWuxpkY_mAitTSRLnsJW-NCTa0bqBFF6Wm1MxgfE", -> "e": "AQAB" -> } - -PEM 格式: - -> -----BEGIN PUBLIC KEY----- -> MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg -> Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 -> nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 -> JNrRuoEUXpabUzGB8QIDAQAB -> -----END PUBLIC KEY----- - -### 相关Demo - -该 Demo 提供 [JavaScript](#javascript) [Python](#python) [Kotlin](#kotlin) [Java](#java) [Go](#go) 以及 [Vercel 云函数](#vercel云函数),感谢 [#524](https://github.com/SocialSisterYi/bilibili-API-collect/issues/524) 提供 - -#### JavaScript - -```javascript -const publicKey = await crypto.subtle.importKey( - "jwk", - { - kty: "RSA", - n: "y4HdjgJHBlbaBN04VERG4qNBIFHP6a3GozCl75AihQloSWCXC5HDNgyinEnhaQ_4-gaMud_GF50elYXLlCToR9se9Z8z433U3KjM-3Yx7ptKkmQNAMggQwAVKgq3zYAoidNEWuxpkY_mAitTSRLnsJW-NCTa0bqBFF6Wm1MxgfE", - e: "AQAB", - }, - { name: "RSA-OAEP", hash: "SHA-256" }, - true, - ["encrypt"], -) - -async function getCorrespondPath(timestamp) { - const data = new TextEncoder().encode(`refresh_${timestamp}`); - const encrypted = new Uint8Array(await crypto.subtle.encrypt({ name: "RSA-OAEP" }, publicKey, data)) - return encrypted.reduce((str, c) => str + c.toString(16).padStart(2, "0"), "") -} - -const ts = Date.now() -console.log(await getCorrespondPath(ts)) -``` - -```text -b77f21ab5b7ce7879c410b2311dd6e7ea1a2cd1cd941073db067f4c3279fdabca3a06dfa744168ee14ad050b9f4889bd4edb8e76eb597fdd18c16804d82566b55c6dba8e225d838aa93d8e5b31cf7c56720db8244d92373f4944e0561f6ca5bf721a36ac079786060fc853605ccd1ddcb33f54617de6aedd44e3b9850d13b45f -``` - -#### Python - -需要`pycryptodome`依赖 - -```python -from Crypto.Cipher import PKCS1_OAEP -from Crypto.PublicKey import RSA -from Crypto.Hash import SHA256 -import binascii -import time - -key = RSA.importKey('''\ ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg -Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 -nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 -JNrRuoEUXpabUzGB8QIDAQAB ------END PUBLIC KEY-----''') - -def getCorrespondPath(ts): - cipher = PKCS1_OAEP.new(key, SHA256) - encrypted = cipher.encrypt(f'refresh_{ts}'.encode()) - return binascii.b2a_hex(encrypted).decode() - -ts = round(time.time() * 1000) -print(getCorrespondPath(ts)) -``` - -```text -47bbd615f333d6a2c597bbb46ad47a6e59752a305a2f545d3ba5d49ca055309347796f80d257613696d36170c57443a0e9dea2b47f83b0b4224d431e46124fadd9a24c8fa468147e8bf2d2501eaacae43310e19bf58fc4a728d80c90b9401afcfc1536ba9a2f6438ea53c0b2652f8b8d01c87355dd5a5da51de998b1a35d519a -``` - -### Kotlin - -```kotlin -import java.security.KeyFactory -import java.security.spec.MGF1ParameterSpec -import java.security.spec.X509EncodedKeySpec -import java.util.* -import javax.crypto.Cipher -import javax.crypto.spec.OAEPParameterSpec -import javax.crypto.spec.PSource - - -fun main() { - println(getCorrespondPath(System.currentTimeMillis())) -} - -fun getCorrespondPath(timestamp: Long): String { - val publicKeyPEM = """ - -----BEGIN PUBLIC KEY----- - MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg - Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 - nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 - JNrRuoEUXpabUzGB8QIDAQAB - -----END PUBLIC KEY----- - """.trimIndent() - - val publicKey = KeyFactory.getInstance("RSA").generatePublic( - X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyPEM - .replace("-----BEGIN PUBLIC KEY-----", "") - .replace("-----END PUBLIC KEY-----", "") - .replace("\n", "") - .trim())) - ) - - val cipher = Cipher.getInstance("RSA/ECB/OAEPPadding").apply { - init(Cipher.ENCRYPT_MODE, - publicKey, - OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT) - ) - } - - return cipher.doFinal("refresh_$timestamp".toByteArray()).joinToString("") { "%02x".format(it) } -} -``` - -```text -1428cbd14605ae42a0b42e22662cfe51d8e5034eeaffb36a46db46bd2f93216cbfd4d150cca2de44395add7c664b40acf44424ee8d634fc821b909423665a34d18bd7f4e77ea5388a2b612daf875e2fe8df62990e14b64a465898b0707bc1288586b68f9f4f2f20bea5cb1cada296beb8009e91bc8fb57a4b81b8923299b6eb7 -``` - -### Go - -```go -package main - -import ( - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/hex" - "encoding/pem" - "fmt" - "time" -) - -func main() { - result, err := getCorrespondPath(time.Now().UnixMilli()) - if err != nil { - panic(err) - } - fmt.Println(result) -} - -func getCorrespondPath(ts int64) (string, error) { - const publicKeyPEM = ` ------BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg -Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71 -nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40 -JNrRuoEUXpabUzGB8QIDAQAB ------END PUBLIC KEY----- -` - pubKeyBlock, _ := pem.Decode([]byte(publicKeyPEM)) - hash := sha256.New() - random := rand.Reader - msg := []byte(fmt.Sprintf("refresh_%d", ts)) - var pub *rsa.PublicKey - pubInterface, parseErr := x509.ParsePKIXPublicKey(pubKeyBlock.Bytes) - if parseErr != nil { - return "", parseErr - } - pub = pubInterface.(*rsa.PublicKey) - encryptedData, encryptErr := rsa.EncryptOAEP(hash, random, pub, msg, nil) - if encryptErr != nil { - return "", encryptErr - } - return hex.EncodeToString(encryptedData), nil -} -``` - -```text -97759947aa357ed5d88cf9bf1172737570b7bba2d6788d39006f082b2b25ddf53b581f1f0c61ed8573317485ef525d2789faa25a277b4602a4b9cbf837681093a03e96cb9773a11df4bb1e20f1587180b3e958194de922d7dd94d0a2f0b9b0ef74e426e8041f99b99e7c02407ef4ab38040e61be81e4fdfbdb73461e3a2ad810 -``` - -### Java - -```Java -import javax.crypto.Cipher; -import javax.crypto.spec.OAEPParameterSpec; -import javax.crypto.spec.PSource; -import java.math.BigInteger; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.MGF1ParameterSpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.Base64; - -public class CookieRefresh { - private static final String PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\n" + - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLgd2OAkcGVtoE3ThUREbio0Eg\n" + - "Uc/prcajMKXvkCKFCWhJYJcLkcM2DKKcSeFpD/j6Boy538YXnR6VhcuUJOhH2x71\n" + - "nzPjfdTcqMz7djHum0qSZA0AyCBDABUqCrfNgCiJ00Ra7GmRj+YCK1NJEuewlb40\n" + - "JNrRuoEUXpabUzGB8QIDAQAB\n" + - "-----END PUBLIC KEY-----"; - - public static void main(String[] args) { - try { - String correspondPath = getCorrespondPath(String.format("refresh_%d", System.currentTimeMillis()), PUBLIC_KEY); - System.out.println(correspondPath); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static String getCorrespondPath(String plaintext, String publicKeyStr) throws Exception { - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - publicKeyStr = publicKeyStr - .replace("-----BEGIN PUBLIC KEY-----", "") - .replace("-----END PUBLIC KEY-----", "") - .replace("\n", "") - .trim(); - byte[] publicBytes = Base64.getDecoder().decode(publicKeyStr); - X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicBytes); - PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); - - String algorithm = "RSA/ECB/OAEPPadding"; - Cipher cipher = Cipher.getInstance(algorithm); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - - // Encode the plaintext to bytes - byte[] plaintextBytes = plaintext.getBytes("UTF-8"); - - // Add OAEP padding to the plaintext bytes - OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT); - cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams); - // Encrypt the padded plaintext bytes - byte[] encryptedBytes = cipher.doFinal(plaintextBytes); - // Convert the encrypted bytes to a Base64-encoded string - return new BigInteger(1, encryptedBytes).toString(16); - } -} -``` - -```text -f87666152da692735123f4e49053e5a98c16854673b2e632f31a3ff0c029640772873661a9a8412db6be447a0bfa03a295d15548cbfd2bb35634e98ba5f25b1205519d6e6119b483f4c516c1e106d45b04ff98c73560949d379d3edaf3c0ecd10a1d46134fb9ca443122ab33c16d1dd48280496f949ed960a2fbcd65f10935e -``` - -#### vercel云函数 - -```bash -curl -G 'https://wasm-rsa.vercel.app/api/rsa' \ - --data-urlencode "t=$((`date '+%s'`*1000+`date '+%N'`/1000000))" -``` - -```json -{ - "timestamp": "1684468084078", - "hash": "a768efe5114ef8610f9ed9ebc28c00827375f4a3448ec4ab17958cacc4fde9898e5b7aa27f649426bba1acae4aa222aafaff7d528669b15249de0b2b60d86618557d8dc90684db4ec68e8d98e41d94f1c97d1d431c288e595ceb522d033822442a9e1ee150b32771a83fbf65c13329e9fda080fbe3bc85c49c1de7ab148d228f", - "code": 0 -} -``` - -## 获取refresh_csrf - -> https://www.bilibili.com/correspond/1/{correspondPath} - -*请求方式:GET* - -鉴权方式:Cookie - -**path 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------- | ---- | ---------------------------- | ------ | ------------------------------------------------------------ | -| correspondPath | str | 使用当前毫秒时间戳生成的签名 | 必要 | 由 [生成CorrespondPath算法](#生成CorrespondPath算法) 加密获得 | - -将参数`correspondPath`拼接在 https://www.bilibili.com/correspond/1/ 后进行请求,例如 - -> https://www.bilibili.com/correspond/1/0248397e5139a8b878894cae46f8d6742ef7c728e46403706452b5dda90fe248e58e73bd6c2da0dba515c53af107dc1ecda757ce843579bcf197fcd7800586126e9b896b646cc94c23183a5a067642e96f7b6e803880e1d3cceabc9f1dc52a121b5e3ba5619e008f6b6dcb65a09d7864084ac114f4ec9ccf6218776fe4f2fa95 - -请求该 url 会返回一个 html 页面,通常由 iframe 方式加载,它通过 SSR 方式返回一个实时刷新口令`refresh_csrf`存放于 html 标签中,并在 Client 端通过 js 请求 RestAPI 完成一些列的提交刷新、确认、SSO 站点登录等操作 - -若参数`correspondPath`错误或过期,则返回一个 404 Page - -以下为返回的参数: - -| 标签 id | 内容 | xpath | 备注 | -| ------- | ------------ | ------------------------- | --------------------------------- | -| 1-name | refresh_csrf | //div[id='1-name']/text() | 实时刷新口令<br />用于更新 Cookie | - -**示例:** - -```bash -correspondPath='0248397e5139a8b878894cae46f8d6742ef7c728e46403706452b5dda90fe248e58e73bd6c2da0dba515c53af107dc1ecda757ce843579bcf197fcd7800586126e9b896b646cc94c23183a5a067642e96f7b6e803880e1d3cceabc9f1dc52a121b5e3ba5619e008f6b6dcb65a09d7864084ac114f4ec9ccf6218776fe4f2fa95' - -curl -G "https://www.bilibili.com/correspond/1/$correspondPath" \ - -b 'SESSDATA=xxx' -``` - -```html -<!DOCTYPE html> -<html lang="zh-Hans"> - -<head> - <meta name="spm_prefix" content="333.1193"> - <link - href="//s1.hdslb.com/bfs/static/jinkela/token-iframe/css/token-iframe.1.a035e81c3bee5fa1a05633ad534ad1f44b05e54d.css" - rel="stylesheet"> -</head> -<title>Correspond - - - -
b0cc8411ded2f9db2cff2edb3123acac
-
- - - - - - -``` - -所以当前账号的实时刷新口令`refresh_csrf`为`b0cc8411ded2f9db2cff2edb3123acac` - -## 刷新Cookie - -> https://passport.bilibili.com/x/passport-login/web/cookie/refresh - -*请求方式:POST* - -鉴权方式:Cookie - -刷新成功后会设置以下 Cookie 项: - -`sid`、`DedeUserID`、`DedeUserID__ckMd5`、`SESSDATA`、`bili_jct` - -**正文参数 (application/x-www-form-urlencoded)或 url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | -------------- | ------ | ------------------------------------------------------------ | -| csrf | str | CSRF Token | 必要 | 位于 Cookie 中的`bili_jct`字段 | -| refresh_csrf | str | 实时刷新口令 | 必要 | 通过 [获取refresh_csrf](#获取refresh_csrf) 获得 | -| source | str | 访问来源? | 必要 | 一般为`main_web` | -| refresh_token | str | 持久化刷新口令 | 必要 | localStorage 中的`ac_time_value`字段,在登录成功后返回并保存 | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
86095:refresh_csrf 错误或 refresh_token 与 cookie 不匹配 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------ | ----------------------------------------------------------- | -| status | num | 0 | | -| message | str | 空 | | -| refresh_token | str | 新的持久化刷新口令 | 将存储于 localStorage 中的`ac_time_value`字段,以便下次使用 | - -**示例:** - -```bash -curl -i 'https://passport.bilibili.com/x/passport-login/web/cookie/refresh' \ - --data-urlencode 'csrf=f610640a37f51f6266f6b83cfc5eedbb' \ - --data-urlencode 'refresh_csrf=b0cc8411ded2f9db2cff2edb3123acac' \ - --data-urlencode 'source=main_web' \ - --data-urlencode 'refresh_token=45240a041836905fe953e3b98b83d751' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -http 响应(关键信息已做脱敏处理): - -```http -HTTP/2 200 -date: Fri, 19 May 2023 07:34:11 GMT -content-type: application/json; charset=utf-8 -content-length: 116 -bili-status-code: 0 -bili-trace-id: 17f4251365646726 -set-cookie: SESSDATA=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT; HttpOnly; Secure -set-cookie: bili_jct=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT -set-cookie: DedeUserID=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT -set-cookie: DedeUserID__ckMd5=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT -set-cookie: sid=***; Path=/; Domain=bilibili.com; Expires=Wed, 15 Nov 2023 07:34:10 GMT -x-bili-trace-id: 3f6f6174aaa087b517f4251365646726 -expires: Fri, 19 May 2023 07:34:10 GMT -cache-control: no-cache -x-cache-webcdn: BYPASS from blzone03 - -{"code":0,"message":"0","ttl":1,"data":{"status":0,"message":"","refresh_token":"ae1bd1149b56af9743ffe7bbbeff3e51"}} -``` - -JSON Payload: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "status": 0, - "message": "", - "refresh_token": "ae1bd1149b56af9743ffe7bbbeff3e51" - } -} -``` - -
- -## 确认更新 - -> https://passport.bilibili.com/x/passport-login/web/confirm/refresh - -*请求方式:POST* - -鉴权方式:Cookie - -该步操作将让旧的`refresh_token`对应的 Cookie 失效 - -**正文参数 (application/x-www-form-urlencoded)或 url 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------------------------- | ------ | ------------------------------------------------------------ | -| csrf | str | CSRF Token(位于 cookie) | 必要 | 从新的 cookie 中获取,位于 Cookie 中的`bili_jct`字段 | -| refresh_token | str | 旧的持久化刷新口令 | 必要 | 在刷新前 localStorage 中的`ac_time_value`获取,**并非刷新后返回的值** | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf 校验失败
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -```bash -curl 'https://passport.bilibili.com/x/passport-login/web/confirm/refresh' \ - --data-urlencode 'csrf=1e9658858e6da76be64bd92cdc0fa324' \ - --data-urlencode 'refresh_token=45240a041836905fe953e3b98b83d751' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/login/exit.md b/docs/login/exit.md deleted file mode 100644 index 8ba5e14..0000000 --- a/docs/login/exit.md +++ /dev/null @@ -1,68 +0,0 @@ -# 退出账号登录 - -## 退出登录(web端) - -> https://passport.bilibili.com/login/exit/v2 - -_请求方式:POST_ - -认证方式:Cookie - -验证登录成功后会使用`set-cookie`字段清空以下 cookie 项: - -`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -并在服务器注销该登录 Token (SESSDATA),该 Token 即失效 - -请求必须包含以下cookie项:`DedeUserID` `bili_jct` `SESSDATA` - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------------------------------- | ------ | --------------------------------- | -| biliCSRF | str | CSRF Token (位于 cookie 中的 `bili_jct`) | 必要 | | -| gourl | str | 成功后跳转到的页面 | 非必要 | 默认为`javascript:history.go(-1)` | - -**json 回复:** - -如果 cookie 已经失效则输出登录页 html - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------- | -------- | --------------------------------- | -| code | num | 返回值 | 0:成功
2202:csrf 请求非法 | -| status | bool | 返回值 | `true`:成功 | -| ts | num | 时间戳 | | -| message | str | 错误信息 | 成功时不存在 | -| data | 有效时:obj | 信息本体 | 失败时不存在 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------- | ---- | -| redirectUrl | str | 重定向 url | | - -**示例:** - -```shell -curl -L -X POST 'https://passport.bilibili.com/login/exit/v2' \ --H 'Cookie: DedeUserID=xxx; bili_jct=xxx; SESSDATA=xxx' \ --H 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'biliCSRF=xxxxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "status": true, - "ts": 1663034005, - "data": { - "redirectUrl": "https://passport.biligame.com/crossDomain?DedeUserID=&DedeUserID__ckMd5=&SESSDATA=&bili_jct=&gourl=javascript%3Ahistory.go%28-1%29" - } -} -``` -
\ No newline at end of file diff --git a/docs/login/login_action/QR.md b/docs/login/login_action/QR.md deleted file mode 100644 index ecee7fd..0000000 --- a/docs/login/login_action/QR.md +++ /dev/null @@ -1,652 +0,0 @@ -# 二维码登录 - - - -## 扫码登录流程(伪代码) - -```python -token, url = 申请二维码() -生成二维码(url) # 等待客户端扫码 -while True: - status, cookie = 扫码登录(token) - match status: - case 未扫描: - continue - case 二维码超时 | 二维码失效: - 提示('二维码失效或超时') # 需要用户重新操作 - break - case 已扫描未确认: - 提示('扫描成功') - case 登录成功: - 提示('扫描成功') - 存储cookie(cookie) - SSO登录页面跳转() - break -``` - -## web端扫码登录 - -### 申请二维码(web端) - -> https://passport.bilibili.com/x/passport-login/web/qrcode/generate - -*请求方式:GET* - -密钥超时为180秒 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------| -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-----|------------------|--------| -| url | str | 二维码内容 (登录页面 url) | | -| qrcode_key | str | 扫码登录秘钥 | 恒为32字符 | - -**示例:** - -`url`中的值生成二维码,等待手机客户端扫描,并将`qrcode_key`保存备用 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/web/qrcode/generate' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "https://passport.bilibili.com/h5-app/passport/login/scan?navhide=1\u0026qrcode_key=8587cf8106a0b863c46d6bab913537f6\u0026from=", - "qrcode_key": "8587cf8106a0b863c46d6bab913537f6" - } -} -``` - -
- -### 扫码登录(web端) - -> https://passport.bilibili.com/x/passport-login/web/qrcode/poll - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------------|-----|--------|-----|-----| -| qrcode_key | str | 扫码登录秘钥 | 必要 | | - - -密钥超时为180秒 - -验证登录成功后会进行设置以下cookie项: - -`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------| -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------|-----|----------------------------------------------------------------|------------------------| -| url | str | 游戏分站跨域登录 url | 未登录为空 | -| refresh_token | str | 刷新`refresh_token` | 未登录为空 | -| timestamp | num | 登录时间 | 未登录为`0`
时间戳 单位为毫秒 | -| code | num | 0:扫码登录成功
86038:二维码已失效
86090:二维码已扫码未确认
86101:未扫码 | | -| message | str | 扫码状态信息 | | - -**示例:** - -使用扫描秘钥`c3bd5286a2b40a822f5f60e9bf3f602e`登录 - -```shell -curl -G "https://passport.bilibili.com/x/passport-login/web/qrcode/poll"\ ---data-urlencode 'qrcode_key=c3bd5286a2b40a822f5f60e9bf3f602e' \ --c 'cookie.txt' -``` - -当密钥正确时但未扫描时`code`为`86101` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "", - "refresh_token": "", - "timestamp": 0, - "code": 86101, - "message": "未扫码" - } -} -``` - -
- -扫描成功但手机端未确认时`code`为`86090` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "", - "refresh_token": "", - "timestamp": 0, - "code": 86090, - "message": "二维码已扫码未确认" - } -} -``` - -
- -扫描成功手机端确认登录后,`code`为`0`,并向浏览器写入cookie - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "https://passport.biligame.com/crossDomain?DedeUserID=***\u0026DedeUserID__ckMd5=***\u0026Expires=***\u0026SESSDATA=***\u0026bili_jct=***\u0026gourl=https%3A%2F%2Fpassport.bilibili.com", - "refresh_token": "***", - "timestamp": 1662363009601, - "code": 0, - "message": "" - } -} -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个cookie - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Mon, 05 Sep 2022 07:30:09 GMT -Expires: Mon, 05 Sep 2022 07:30:08 GMT -Cache-control: no-cache -Content-encoding: br -Content-type: application/json; charset=utf-8 -bili-status-code: 0 -bili-trace-id: 0d23fe044a6315a5 -set-cookie: SESSDATA=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT; HttpOnly; Secure -set-cookie: bili_jct=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT -set-cookie: DedeUserID=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT -set-cookie: DedeUserID__ckMd5=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT -set-cookie: sid=***; Path=/; Domain=bilibili.com; Expires=Sat, 04 Mar 2023 07:30:09 GMT -x-bili-trace-id: 2fbd8abd97dbd4db0d23fe044a6315a5 -x-cache-webcdn: BYPASS from blzone02 -``` - -
- -二维码失效时`code`为`86038` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "", - "refresh_token": "", - "timestamp": 0, - "code": 86038, - "message": "二维码已失效" - } -} -``` - -
- -## web端扫码登录-旧版 - -以下为旧版扫码登录 API,部分可正常访问 - -### 申请二维码(web端-旧版) - -> https://passport.bilibili.com/qrcode/getLoginUrl - -*请求方式:GET* - -密钥超时为180秒 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------|------|------|--------| -| code | num | 返回值 | 0:成功 | -| status | bool | true | 作用尚不明确 | -| ts | num | 请求时间 | 时间戳 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|------------------|--------| -| url | str | 二维码内容 (登录页面 url) | | -| oauthKey | str | 扫码登录秘钥 | 恒为32字符 | - -**示例:** - -`url`中的值生成二维码,等待手机客户端扫描,并将`oauthKey`保存备用 - -```shell -curl 'https://passport.bilibili.com/qrcode/getLoginUrl' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "status": true, - "ts": 1583314311, - "data": { - "url": "https://passport.bilibili.com/qrcode/h5/login?oauthKey=c3bd5286a2b40a822f5f60e9bf3f602e", - "oauthKey": "c3bd5286a2b40a822f5f60e9bf3f602e" - } -} -``` - -
- -### 扫码登录(web端-旧版) - -**接口已失效,请求结果始终为 `{ code: 20000, message: '该版本已不支持当前功能,请升级新版本!' }`** - -> ~~https://passport.bilibili.com/qrcode/getLoginInfo~~ - -*请求方式:POST* - -
-内容已过时: - -密钥超时为180秒 - -验证登录成功后会进行设置以下cookie项: - -`DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|--------|-----|----------------------------| -| oauthKey | str | 扫码登录秘钥 | 必要 | | -| gourl | str | 跳转url | 非必要 | 默认为http://www.bilibili.com | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|----------------------|---------------------------|---------------------------------------------------------| -| code | num | 返回值 | 0:成功,
20000:该版本已不支持当前功能,请升级新版本! | -| message | str | | 正确无 | -| ts | num | 扫码时间 | 错误无 | -| status | bool | 扫码是否成功 | true:成功
false:未成功 | -| data | 正确时:obj
错误时:num | 正确时:游戏分站url
错误时:错误代码 | 未成功时:
-1:密钥错误
-2:密钥超时
-4:未扫描
-5:未确认 | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----|-----|--------------|-----| -| url | str | 游戏分站跨域登录 url | | - -**示例:** - -使用扫描秘钥`c3bd5286a2b40a822f5f60e9bf3f602e`登录 - -```shell -curl "https://passport.bilibili.com/qrcode/getLoginInfo"\ ---data-urlencode 'oauthKey=c3bd5286a2b40a822f5f60e9bf3f602e' \ --c 'cookie.txt' -``` - -当密钥正确时但未扫描时`status`为`false`,`data`为`-4` - -
-查看响应示例: - -```json -{ - "status":false, - "data":-4, - "message":"Can't scan~" -} -``` - -
- -扫描成功但手机端未确认时`status`为`false`,`data`为`-5` - -
-查看响应示例: - -```json -{ - "status":false, - "data":-5, - "message":"Can't confirm~" -} -``` - -
- -扫描成功手机端确认登录后,`status`为`true`,`data`为对象,并向浏览器写入cookie - -
-查看响应示例: - -```json -{ - "code": 0, - "status": true, - "ts": 1583315474, - "data": { - "url": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=***&SESSDATA=***&bili_jct=***&gourl=http%3A%2F%2Fwww.bilibili.com" - } -} -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个cookie - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Wed, 04 Mar 2020 10:36:37 GMT -Content-Type: application/json;charset=UTF-8 -Transfer-Encoding: chunked -Connection: keep-alive -Server: Apache-Coyote/1.1 -Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Thu, 04-Mar-2021 10:36:37 GMT; Path=/ -Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/ -Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/ -Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/; HttpOnly -Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Mon, 31-Aug-2020 10:19:57 GMT; Path=/ -Expires: Wed, 04 Mar 2020 10:36:36 GMT -Cache-Control: no-cache -X-Cache-Webcdn: BYPASS from ks-sxhz-dx-w-01 -``` - -
- -
- -## TV端扫码登录 - -### 申请二维码(TV端) - -> https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/auth_code -> -> https://passport.bilibili.com/x/passport-tv-login/qrcode/auth_code - -*请求方式:POST* - -鉴权方式:appkey - -密钥超时为180秒 - -本接口可申请用于TV端APP方式登录的`access_key` - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------- | ------------ | -------------------------- | -| appkey | str | APP 密钥 | APP 方式必要 | [可用](#appkey-可用列表) | -| local_id | num | TV 端 id | TV 端必要 | 可为`0` | -| ts | num | 当前时间戳 | APP 方式必要 | | -| sign | str | APP 签名 | APP 方式必要 | | -| mobi_app | str | 平台标识 | 非必要 | 会被拼接到返回的 url query | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|---------------------------------------| -| code | num | 返回值 | 0:成功
-3:API校验密匙错误
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------- | ------------ | -| url | str | 二维码内容 url | | -| auth_code | str | 扫码登录秘钥 | 恒为 32 字符 | - -**示例:** - -```shell -curl 'https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/auth_code' \ ---data-urlencode 'appkey=4409e2ce8ffd12b8' \ ---data-urlencode 'local_id=0' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=e134154ed6add881d28fbdf68653cd9c' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "https://passport.bilibili.com/x/passport-tv-login/h5/qrcode/auth?auth_code=0eeb635a64526709d70cb4c854a3b001", - "auth_code": "0eeb635a64526709d70cb4c854a3b001" - } -} -``` - -
- -### 扫码登录(TV端) - -> https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/poll -> -> https://passport.bilibili.com/x/passport-tv-login/qrcode/poll - -*请求方式:POST* - -鉴权方式:appkey - -密钥超时为180秒 - -验证登录成功后会返回可用于APP方式登录的`access_key`以及`refresh_token` - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-----------|-----|-------|---------|-----------------------| -| appkey | str | APP密钥 | APP方式必要 |[可用](#appkey-可用列表) | -| auth_code | str | 扫码秘钥 | 必要 | | -| local_id | num | TV端id | TV端必要 | 可为0 | -| ts | num | 当前时间戳 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----------------------|------|--------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-3:API校验密匙错误
-400:请求错误
-404:啥都木有
86038:二维码已失效
86039:二维码尚未确认
86090:二维码已扫码未确认 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj
无效时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------|-----|------------|---------------------| -| mid | num | 登录用户mid | | -| access_token | str | APP登录Token | | -| refresh_token | str | APP刷新Token | | -| expires_in | num | 有效时间 | 默认:15552000秒,等于180天 | - -**示例:** - -使用扫描秘钥`6214464b3025541abf6f654cf7569a01`进行验证登录 - -```shell -curl 'https://passport.snm0516.aisee.tv/x/passport-tv-login/qrcode/poll' \ ---data-urlencode 'appkey=4409e2ce8ffd12b8' \ ---data-urlencode 'auth_code=6214464b3025541abf6f654cf7569a01' \ ---data-urlencode 'local_id=0' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=87de3d0fee7c3f4facd244537238914e' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "is_new": false, - "mid": 10086, - "access_token": "********************************", - "refresh_token": "********************************", - "expires_in": 15552000, - "token_info": { - "mid": 10086, - "access_token": "********************************", - "refresh_token": "********************************", - "expires_in": 15552000 - }, - "cookie_info": { - "cookies": [ - { - "name": "SESSDATA", - "value": "********************************", - "http_only": 1, - "expires": 1679988973, - "secure": 0 - }, - { - "name": "bili_jct", - "value": "********************************", - "http_only": 0, - "expires": 1679988973, - "secure": 0 - }, - { - "name": "DedeUserID", - "value": "*******", - "http_only": 0, - "expires": 1679988973, - "secure": 0 - }, - { - "name": "DedeUserID__ckMd5", - "value": "****************", - "http_only": 0, - "expires": 1679988973, - "secure": 0 - }, - { - "name": "sid", - "value": "********", - "http_only": 0, - "expires": 1679988973, - "secure": 0 - } - ], - "domains": [ - ".bilibili.com", - ".biligame.com", - ".bigfun.cn", - ".bigfunapp.cn", - ".dreamcast.hk" - ] - }, - "sso": [ - "https://passport.bilibili.com/api/v2/sso", - "https://passport.biligame.com/api/v2/sso", - "https://passport.bigfunapp.cn/api/v2/sso" - ] - } -} -``` - -
- -### appkey 可用列表 - -**仅覆盖 [docs/misc/sign/APPKey](../../misc/sign/APPKey.md) 中包含的 appkey** - -| APPKEY | APPSEC | platform | APP类型 | neuronAppId | mobi_app2 | 备注 | -| :--------------: | :------------------------------: | :------------------: | :----------------: | :---------------------: | :------------------: | :----------------------------------------: | -| 783bbb7264451d82 | 2653583c8873dea268ab9386918b1d65 | `android` | 粉版 | `1` | `android` | 仅获取用户信息时使用(7.X及更新版本) | -| 8d23902c1688a798 | 710f0212e62bd499b8d3ac6e1db9302a | `android` | AndroidBiliThings | ? | ? | | -| bca7e84c2d947ac6 | 60698ba2f68e01ce44738920a0ffe768 | ? | login | - | ? | | -| 27eb53fc9058f8c3 | c2ed53a74eeefe3cf99fbd01d8c9c375 | `web`/`ios`? | - | - | - | 第三方授权使用 | -| 4409e2ce8ffd12b8 | 59b43e04ad6965f34319062b478f83dd | `android` | 云视听小电视(TV版) | `9`? | `android_tv_yst`? | | -| dfca71928277209b | b5475a8825547a4fc26c7d518eaaa02e | `android` | HD 版 | `5` | `android_hd` | | - -**注意:** - -通过某一组 APPKEY/APPSEC 获取到的 access_token,当接口需要 `sign` 签名时也只能使用该组 APPKEY/APPSEC,否则出现 `{ code: -663, message: '鉴权失败,请联系账号组', ttl: 1 }` 错误。 - -**例外:** - -`783bbb7264451d82`/`2653583c8873dea268ab9386918b1d65` 获取到的 access_token 可配合 `1d8b6e7d45233436`/`560c52ccd288fed045859ed18bffd973` 使用。 diff --git a/docs/login/login_action/SMS.md b/docs/login/login_action/SMS.md deleted file mode 100644 index bd8abe5..0000000 --- a/docs/login/login_action/SMS.md +++ /dev/null @@ -1,453 +0,0 @@ -# 短信登录 - -web端短信登录流程: - -1. [完成人机验证](readme.md) -2. 发送短信,使用国际地区代码`cid`+手机号码`tel`+登录密钥`token`+极验`challenge`+验证结果`validate`+验证结果`seccode` -3. 提交短信验证码以验证登录操作,使用国际地区代码`cid`+手机号码`tel`+短信验证码`code` - -## 获取国际冠字码_web端 - -> https://passport.bilibili.com/web/generic/country/list - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ------------- | ---- | -| common | array | 常用国家&地区 | | -| others | array | 其他国家&地区 | | - -`data`中的`common`和`others`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 国家&地区1 | | -| n | obj | 国家&地区(n+1) | | -| …… | obj | …… | …… | - -`common`和`others`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------- | ---- | -| id | num | 国际代码值 | | -| cname | str | 国家&地区名 | | -| country_id | str | 国家&地区区号 | | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/web/generic/country/list' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "common": [ - { - "id": 1, - "cname": "中国大陆", - "country_id": "86" - }, - { - "id": 5, - "cname": "中国香港特别行政区", - "country_id": "852" - }, - ………… - ], - "others": [ - { - "id": 22, - "cname": "阿富汗", - "country_id": "93" - }, - { - "id": 20, - "cname": "阿尔巴尼亚", - "country_id": "355" - }, - ………… - ] - } -} -``` - -
- - -## 发送短信验证码_app端 - -> https://passport.bilibili.com/x/passport-login/sms/send - -*请求方式:POST* - -同手机号短信发送 CD 时间为 60s - -短信验证码 timeout 为 5min - -验证内容由第一次返回进行处理,解析recaptcha_url的params传到极验进行验证后取到验证结果入参后再次调用即可 - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码-web端)获取 | -| tel | num | 手机号码 | 必要 | | -| login_session_id | str | 登录标识 | 必要 | uuid去掉'-'后得到 -| recaptcha_token | str | 登录 API token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| gee_challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| gee_validate | str | 极验 result | 必要 | 极验验证后得到 | -| gee_seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | -| channel | str | 通道? | 必要 | 一般固定值为"bili" | -| buvid | str | buvid | 必要 | 参考如下方法生成 | -| local_id | str | 同上 | 必要 | 同上 | -| statistics | str | ? | 必要 | 一般固定为{"appId":1,"platform":3,"version":"7.27.0","abtest":""},非key-value入参需要转URL编码 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功
-400:请求错误
1002:手机号格式错误
86203:短信发送次数已达上限
1003:验证码已经发送
1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
2400:登录秘钥错误
2406:验证极验服务出错 | -| message | str | 错误信息 | 成功为0 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ------------------------ | -| captcha_key | str | 短信登录 token | 在下方传参时需要,请备用 | - -**示例:** - -例如手机号为`13888888888`,国际id为`1 (中国大陆)`,登录秘钥为`aabbccdd`,极验challenge为`2333`,极验结果为`666666`,进行发送短信验证码操作 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/sms/send' \ ---data-urlencode 'tel=13888888888' \ ---data-urlencode 'cid=1' \ ---data-urlencode 'login_session_id=669900' \ ---data-urlencode 'recaptcha_token=aabbccdd' \ ---data-urlencode 'gee_challenge=2333' \ ---data-urlencode 'gee_validate=666666' \ ---data-urlencode 'gee_seccode=666666|jordan' \ ---data-urlencode 'channel=bili' \ ---data-urlencode 'buvid=999999' \ ---data-urlencode 'local_id=999999' \ ---data-urlencode 'statistics=%7B%22appId%22%3A1%2C%22platform%22%3A3%2C%22version%22%3A%227.27.0%22%2C%22abtest%22%3A%22%22%7D' -``` - -生成buvid方法 -``` javascript -static buvid() : string { - var mac = []; - for (let i = 0; i < 6; i++) { - var min = Math.min(0, 0xff) - var max = Math.max(0, 0xff) - var num = parseInt((Math.random() * (min - max + 1) + max).toString()).toString(16) - mac.push(num) - } - var md5 = this.md5(mac.join(':')); - var md5Arr = md5.split(''); - return "XY${md5Arr[2]}${md5Arr[12]}${md5Arr[22]}${md5}" -} -``` - -
-查看响应示例: - -```json -{"code":0, - "message":"0", - "ttl":1, - "data":{ - "captcha_key":"7542f109c3318d74847626495c68c321", - "recaptcha_url":"...." - } -} -``` - -
- -## 发送短信验证码_web端 - -> https://passport.bilibili.com/x/passport-login/web/sms/send - -*请求方式:POST* - -同手机号短信发送 CD 时间为 60s - -短信验证码 timeout 为 5min - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码-web端)获取 | -| tel | num | 手机号码 | 必要 | | -| source | str | 登录来源 | 必要 | `main_web`:独立登录页
`main_mini`:小窗登录 | -| token | str | 登录 API token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| validate | str | 极验 result | 必要 | 极验验证后得到 | -| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功
-400:请求错误
1002:手机号格式错误
86203:短信发送次数已达上限
1003:验证码已经发送
1025:该手机号在哔哩哔哩有过永久封禁记录,无法再次注册或绑定新账号
2400:登录秘钥错误
2406:验证极验服务出错 | -| message | str | 错误信息 | 成功为0 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ------------------------ | -| captcha_key | str | 短信登录 token | 在下方传参时需要,请备用 | - -**示例:** - -例如手机号为`13888888888`,国际id为`1 (中国大陆)`,登录秘钥为`aabbccdd`,极验challenge为`2333`,极验结果为`666666`,进行发送短信验证码操作 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/web/sms/send' \ ---data-urlencode 'tel=13888888888' \ ---data-urlencode 'cid=1' \ ---data-urlencode 'source=main_web' \ ---data-urlencode 'token=aabbccdd' \ ---data-urlencode 'challenge=2333' \ ---data-urlencode 'validate=666666' \ ---data-urlencode 'seccode=666666|jordan' -``` - -
-查看响应示例: - -```json -{"code":0, - "message":"0", - "ttl":1, - "data":{ - "captcha_key":"7542f109c3318d74847626495c68c321" - } -} -``` - -
- -## 使用短信验证码登录_app端 - -> https://passport.bilibili.com/x/passport-login/login/sms - -*请求方式:POST* - -验证登录成功后会返回实体内容: - - `mid` `expires_in` `access_token` `refresh_token` - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码-web端)获取 | -| tel | num | 手机号码 | 必要 | | -| login_session_id | str | 登录标识 | 必要 | 必须与上述login_session_id保持一致 -| code | num | 短信验证码 | 必要 | timeout 为 5min | -| captcha_key | str | 短信登录 token | 必要 | 从[上述API](#发送短信验证码-web端)请求成功后返回 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功
-400:请求错误
1006:请输入正确的短信验证码
1007:短信验证码已过期 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| mid | str | 用户uid | | -| expires_in | str | 过时时间 | | -| access_token | str | 登录 token | | -| refresh_token | str | 刷新 token | | -| cookie_info | Array | cookie集合 | | - -**示例:** - -使用手机号`13888888888`,短信验证码为`123456`,进行验证登录操作 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/login/sms' ---data-urlencode 'cid=1' \ ---data-urlencode 'tel=13888888888' \ ---data-urlencode 'code=123456' \ ---data-urlencode 'captcha_key=999999' \ ---data-urlencode 'login_session_id=669900' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "token_info": { - "mid": "...", - "expires_in": "114514", - "access_token": "", - "refresh_token": "" - //... - }, - "cookie_info":[ - //... - ], - "message": "0" - } -} -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个cookie(填入浏览器即可成功登录) - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Mon, 13 Jul 2020 09:57:33 GMT -Content-Type: application/json;charset=UTF-8 -Content-Length: 78 -Connection: keep-alive -Server: Apache-Coyote/1.1 -Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/; HttpOnly -Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Expires: Mon, 13 Jul 2020 09:57:32 GMT -Cache-Control: no-cache -X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01 - -``` - -
- - -## 使用短信验证码登录_web端 - -> https://passport.bilibili.com/x/passport-login/web/login/sms - -*请求方式:POST* - -验证登录成功后会进行设置以下cookie项: - - `DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| cid | num | 国际冠字码 | 必要 | 可以从[获取国际冠字码](#获取国际冠字码-web端)获取 | -| tel | num | 手机号码 | 必要 | | -| code | num | 短信验证码 | 必要 | timeout 为 5min | -| source | str | 登录来源 | 必要 | `main_web`:独立登录页
`main_mini`:小窗登录 | -| captcha_key | str | 短信登录 token | 必要 | 从[上述API](#发送短信验证码-web端)请求成功后返回 | -| go_url | str | 跳转url | 非必要 | 默认为 https://www.bilibili.com | -| keep | bool | 是否记住登录 | 非必要 | `true`:记住登录
`false`:不记住登录 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0:成功
-400:请求错误
1006:请输入正确的短信验证码
1007:短信验证码已过期 | -| message | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| is_new | bool | 是否为新注册用户 | false:非新注册用户
true:新注册用户 | -| status | num | 0 | 未知,可能0就是成功吧 | -| url | str | 跳转 url | 默认为 https://www.bilibili.com | - -**示例:** - -使用手机号`13888888888`,短信验证码为`123456`,进行验证登录操作 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/web/login/sms' ---data-urlencode 'cid=1' \ ---data-urlencode 'tel=13888888888' \ ---data-urlencode 'code=123456' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "is_new": false, - "status": 0, - "url": "https://space.bilibili.com" - } -} -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个cookie(填入浏览器即可成功登录) - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Mon, 13 Jul 2020 09:57:33 GMT -Content-Type: application/json;charset=UTF-8 -Content-Length: 78 -Connection: keep-alive -Server: Apache-Coyote/1.1 -Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/; HttpOnly -Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Set-Cookie: sid=***; Domain=.bilibili.com; Expires=Sat, 18-Jul-2020 09:57:57 GMT; Path=/ -Expires: Mon, 13 Jul 2020 09:57:32 GMT -Cache-Control: no-cache -X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01 - -``` - -
diff --git a/docs/login/login_action/password.md b/docs/login/login_action/password.md deleted file mode 100644 index ffc3d01..0000000 --- a/docs/login/login_action/password.md +++ /dev/null @@ -1,788 +0,0 @@ -# 密码登录 - -## 密码登录流程(伪代码) - -```python -账号 = '2333333' -密码字符串 = 'password' - -# 1.人机验证步骤 -token, gt, challenge = 获取验证码() -validate = 填写验证码(gt, challenge) # 这一步填写验证码 (访问极验API,得到validate) - -# 2.密码加密步骤 -pubkey, salt = 获取公钥和盐() -加密后的密码 = RSA公钥加密(pubkey, salt+密码字符串) # 盐需要加在密码字符串前 -base64编码后的密文 = base64编码(加密后的密码) - -# 3.开始登录 -cookie = 密码登录(账号, base64编码后的密文, token, challenge, validate) -存储cookie(cookie) -SSO登录页面跳转() -``` - -## web端密码登录 - -### 获取公钥&盐(web端) - -> https://passport.bilibili.com/x/passport-login/web/key - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------| -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|------------------------------------------| -| hash | str | 密码盐值 | 有效时间为 20s
恒为 16 字符
需要拼接在明文密码之前 | -| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/x/passport-login/web/key' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "hash": "9333681c87fd8d6e", - "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n" - } -} -``` - -
- -### 登录操作(web端) - -> https://passport.bilibili.com/x/passport-login/web/login - -*请求方式:POST* - -验证登录成功后会进行设置以下 cookie 项: - -`sid` `DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ---------------------- | ------ | ------------------------------------------------------------ | -| username | str | 用户登录账号 | 必要 | 手机号或邮箱地址 | -| password | str | 加密后的带盐密码 | 必要 | base64 格式 | -| keep | num | 0 | 必要 | | -| token | str | 登录 token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| validate | str | 极验 result | 必要 | 极验验证后得到 | -| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | -| go_url | str | 跳转 url | 非必要 | 默认为 https://www.bilibili.com | -| source | str | 登录来源 | 非必要 | `main_web`:独立登录页
`main_mini`:小窗登录 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----------------------|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-105:验证码错误
-400:请求错误
-629:账号或密码错误
-653:用户名或密码不能为空
-662:提交超时,请重新提交
-2001:缺少必要的的参数
-2100:需验证手机号或邮箱
2400:登录秘钥错误
2406:验证极验服务出错
86000:RSA解密失败 | -| message | str | 错误信息 | | -| data | 成功时:obj
失败时:null | 数据本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------------|-----|-------------------|------------------------| -| message | str | 扫码状态信息 | 若提示 `本次登录环境存在风险, 需使用手机号进行验证或绑定`, 参见 [手机号验证](#手机号验证) | -| refresh_token | str | 刷新`refresh_token` | | -| status | num | 0 | | -| timestamp | num | 登录时间 | 未登录为`0`
时间戳 单位为毫秒 | -| url | str | 游戏分站跨域登录 url | | - -**示例:** - -例如用户账号为`12345678900`,加密后的密码为`xxx`,登录秘钥为`aabbccdd`,极验challenge为`2333`,极验结果为`666666`,进行验证登录操作 - -```shell -curl 'https://passport.bilibili.com/x/passport-login/web/login' \ ---data-urlencode 'username=12345678900' \ ---data-urlencode 'password=xxx' \ ---data-urlencode 'keep=0' \ ---data-urlencode 'source=main_web' \ ---data-urlencode 'token=aabbccdd' \ ---data-urlencode 'challenge=2333' \ ---data-urlencode 'validate=666666' \ ---data-urlencode 'seccode=666666|jordan' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "status": 0, - "message": "", - "url": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=***&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com%2F", - "refresh_token": "***", - "timestamp": 1662452570273 - } -} - -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个 cookie - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Mon, 13 Jul 2020 06:56:00 GMT -Content-Type: application/json;charset=UTF-8 -Content-Length: 273 -Connection: keep-alive -Server: Apache-Coyote/1.1 -Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly -Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Content-Security-Policy-Report-Only: default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report -Expires: Mon, 13 Jul 2020 06:55:59 GMT -Cache-Control: no-cache -X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01 -``` - -
- -## web端密码登录-旧版 - -以下为密码扫码登录 API,尚可正常访问 - -### 获取公钥&盐(web端-旧版) - -> https://passport.bilibili.com/login?act=getkey - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|------------------------------------------| -| hash | str | 密码盐值 | 有效时间为 20s
恒为 16 字符
需要拼接在明文密码之前 | -| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/login?act=getkey' -``` - -
-查看响应示例: - -```json -{ - "hash":"07c6501690c1af85", - "key":"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n" -} -``` - -
- -### 登录操作(web端-旧版) - - -> https://passport.bilibili.com/web/login/v2 - -*请求方式:POST* - -验证登录成功后会进行设置以下cookie项: - -`sid` `DedeUserID` `DedeUserID__ckMd5` `SESSDATA` `bili_jct` - -**正文参数 (application/x-www-form-urlencoded):** - - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ---------------------- | ------ | ------------------------------------------------------------ | -| captchaType | num | 6 | 必要 | 必须为`6` | -| username | str | 用户登录账号 | 必要 | 手机号或邮箱地址 | -| password | str | 加密后的带盐密码 | 必要 | base64 格式 | -| keep | bool | 是否记住登录 | 必要 | `true`:记住登录
`false`:不记住登录 | -| key | str | 登录 token | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| challenge | str | 极验 challenge | 必要 | 在[申请 captcha 验证码](readme.md#申请captcha验证码)接口处获取 | -| validate | str | 极验 result | 必要 | 极验验证后得到 | -| seccode | str | 极验 result +`\|jordan` | 必要 | 极验验证后得到 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|-------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-400:请求错误
-629:账号或密码错误
-653:用户名或密码不能为空
-662:提交超时,请重新提交
-2001:缺少必要的的参数
-2100:需验证手机号或邮箱
2400:登录秘钥错误
2406:验证极验服务出错
86000:RSA解密失败 | -| ts | num | 当前时间戳 | 成功时无此项 | -| message | str | 错误信息 | 默认为0 | -| data | obj | 数据本体 | 成功时有此项 | - -`data`对象: - -**未登录时:** - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|--------------|-----| -| redirectUrl | str | 游戏分站跨域登录 url | | - -**已登录时:** - -| 字段 | 类型 | 内容 | 备注 | -|---------|------|--------------------------|-----| -| isLogin | bool | true | | -| goUrl | str | https://www.bilibili.com | | - -**需验证手机号或邮箱时** - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|--------------------------|------------| -| mid | num | 用户 mid | | -| tel | str | 绑定的手机号 | 星号隐藏部分信息 | -| email | str | 绑定的邮箱 | 星号隐藏部分信息 | -| sorce | num | 0 | **作用尚不明确** | -| keeptime | num | 1 | **作用尚不明确** | -| goUrl | str | https://www.bilibili.com | | - -**示例:** - -例如用户账号为`12345678900`,加密后的密码为`xxx`,登录秘钥为`aabbccdd`,极验challenge为`2333`,极验结果为`666666`,进行验证登录操作 - -```shell -curl 'https://passport.bilibili.com/web/login/v2' \ ---data-urlencode 'captchaType=6' \ ---data-urlencode 'username=12345678900' \ ---data-urlencode 'password=xxx' \ ---data-urlencode 'keep=true' \ ---data-urlencode 'token=aabbccdd' \ ---data-urlencode 'challenge=2333' \ ---data-urlencode 'validate=666666' \ ---data-urlencode 'seccode=666666|jordan' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "data": { - "redirectUrl": "https://passport.biligame.com/crossDomain?DedeUserID=***&DedeUserID__ckMd5=***&Expires=15551000&SESSDATA=***&bili_jct=***&gourl=https%3A%2F%2Fwww.bilibili.com" - } -} -``` - -
- -**响应头部抓包信息:** - -可明显看见设置了几个 cookie - -
-查看响应示例: - -```http -HTTP/1.1 200 OK -Date: Mon, 13 Jul 2020 06:56:00 GMT -Content-Type: application/json;charset=UTF-8 -Content-Length: 273 -Connection: keep-alive -Server: Apache-Coyote/1.1 -Set-Cookie: DedeUserID=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Set-Cookie: DedeUserID__ckMd5=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Set-Cookie: SESSDATA=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/; HttpOnly -Set-Cookie: bili_jct=***; Domain=.bilibili.com; Expires=Sat, 09-Jan-2021 06:39:43 GMT; Path=/ -Content-Security-Policy-Report-Only: default-src 'self' data: *.bilibili.com *.hdslb.com; style-src 'self' 'unsafe-inline' *.hdslb.com static.geetest.com; img-src 'self' data: blob: *.bilibili.com *.hdslb.com http://*.hdslb.com static.geetest.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.bilibili.com *.hdslb.com api.geetest.com static.geetest.com; object-src 'self' *.hdslb.com; media-src 'self' *.acgvideo.com http://*.acgvideo.com *.ksyungslb.com; connect-src 'self' data: wss://*.bilibili.com:* *.bilibili.com *.hdslb.com *.biliapi.net *.biliapi.com; frame-ancestors 'self' *.bilibili.com *.biligame.com; report-uri https://security.bilibili.com/csp_report -Expires: Mon, 13 Jul 2020 06:55:59 GMT -Cache-Control: no-cache -X-Cache-Webcdn: BYPASS from jd-sxhz-dx-w-01 -``` - -
- -## APP端密码登录 - -### 获取公钥&盐(APP端) - -> http://passport.bilibili.com/api/oauth2/getKey - -*请求方式:POST* - -鉴权方式:appkey - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-----|-------|---------|-----| -| appkey | str | APP密钥 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|------------------------------------------| -| hash | str | 密码盐值 | 有效时间为 20s
恒为 16 字符
需要拼接在明文密码之前 | -| key | str | rsa 公钥 | PEM 格式编码
加密密码时需要使用 | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/api/oauth2/getKey' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'sign=17004c193f688f0b5665c1068e733aff' -``` - -
-查看响应示例: - -```json -{ - "hash": "07c6501690c1af85", - "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n" -} -``` - -
- -### 登录操作(APP端) - -TODO - -## 登录密码的加密实例 - -以下实例使用 Python 语言,在任何平台(web、APP)使用密码登录都需要如下加密步骤 - -首先在需拉取 RSA PubKey 和 salt 备用 - -```python -import requests - -resp = requests.get('https://passport.bilibili.com/x/passport-login/web/key').json()['data'] -print('salt =', resp['hash']) -print('PubKey =', resp['key']) -``` - -`hash`字段为 salt,长度固定为 16 字符,timeout 时间只有 20s - -`key`字段为 RSA PubKey,为 PEM 格式,加密需要使用 - -``` -salt = 9773d106a67e27d6 -PubKey = -----BEGIN PUBLIC KEY----- -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n -6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx -/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+ -Xl69GV6klzgxW6d2xQIDAQAB ------END PUBLIC KEY----- -``` - -例如登录密码为`BiShi22332323`,现在对它进行加盐并使用获取的 PubKey 加密 - -```python -import rsa -password = 'BiShi22332323' - -pubKey = rsa.PublicKey.load_pkcs1_openssl_pem(resp['key']) # 读取 PEM 密钥 -encryptedPassword = rsa.encrypt((resp['hash']+password).encode(), pubKey) # 盐需要加在明文密码之前,一并加密 -print(encryptedPassword) -``` - -下面将输出一段 bytes 数据: - -``` -b'}\x9c\xd4\xcd\x88\x92\xa7\xde\x85\xdb\xabm\xd7\xd3\x08\x02@xo\x85\xa4\xe1\x11\xd0o\x80\x03.$\xc8l\xbe\xba;\xfe\xee\xa7(\xf8S\x95\x1e\x9106\xa4\x1d\xcf\x8e\xbe\x8d\x94A\x86s\xf9"\x12\x0c\x135\xbb\xbc\xe1\xde\x1b\x90\t)P\xeb\xa9\x8fXY]\x83\x18\x81f\n:\xdb\xe1\xbe\xe8\x1e\xba\x1c D8d}B\x17\xf9\x8a\xf0i\'1\xa5\xc4\x05&\xaa;n\xf8{\xa02\xffY\xcelU\xd5\xaf\x8aJK\xdc\xf1@\xbc\x93' -``` - -接下来需要把加密后的结果进行 base64 编码 - -```python -import base64 -b64Password = base64.b64encode(encryptedPassword).decode() -print('result =', b64Password) -``` - -以下为最终加密结果,可直接向 API 请求体传参以登录: - -因为 RSA 公钥加密的**无法解密性**,故无法本地验证,仅可请求 API 验证(略... - -``` -result = fZzUzYiSp96F26tt19MIAkB4b4Wk4RHQb4ADLiTIbL66O/7upyj4U5UekTA2pB3Pjr6NlEGGc/kiEgwTNbu84d4bkAkpUOupj1hZXYMYgWYKOtvhvugeuhwgRDhkfUIX+YrwaScxpcQFJqo7bvh7oDL/Wc5sVdWvikpL3PFAvJM= -``` - -以下为密码加密的Java实现: - -```java -package com.ho.test; - -import cn.hutool.core.codec.Base64; - -import javax.crypto.Cipher; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.X509EncodedKeySpec; - -public class Test3 { - public static void main(String[] args) throws Exception { - //用户密码 - String password = "abcdef"; - //获取到的证书内容 - String key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjb4V7EidX/ym28t2ybo0U6t0n\n6p4ej8VjqKHg100va6jkNbNTrLQqMCQCAYtXMXXp2Fwkk6WR+12N9zknLjf+C9sx\n/+l48mjUU8RqahiFD1XT/u2e0m2EN029OhCgkHx3Fc/KlFSIbak93EH/XlYis0w+\nXl69GV6klzgxW6d2xQIDAQAB\n-----END PUBLIC KEY-----\n"; - //获取到的盐值 - String hash = "bb73382121594c46"; - String[] split = key.strip().split("\n"); - String newKey = split[1] + split[2] + split[3] + split[4]; - //进行加密 - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(newKey)); - PublicKey publicKey = keyFactory.generatePublic(keySpec); - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.PUBLIC_KEY, publicKey); - byte[] bytes = cipher.doFinal((hash + password).getBytes()); - String encode = Base64.encode(bytes); - System.out.println(encode); - } -} - -``` - -## 手机号验证 - -### 简述 - -有时使用密码登录时, 无论使用网页端还是手机端接口, 由于 请求头缺失/请求频率高/请求IP 等原因, 会返回如下内容, 此时需要进行手机号验证或绑定 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "is_new": false, - "status": 2, - "message": "本次登录环境存在风险, 需使用手机号进行验证或绑定", - "url": "https://passport.bilibili.com/h5-app/passport/risk/verify?tmp_token=imtmptk&request_id=imreqid&source=risk", - "refresh_token": "", - "timestamp": 0, - "hint": "", - "in_reg_audit": 0 - } -} -``` - -### 获取 captcha - -> https://passport.bilibili.com/x/safecenter/captcha/pre - -*请求方法: POST* - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | ---- | ---- | ---- | -| source | str | risk | 不必要 | | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| recaptcha_type | str | 验证码类型 | 目前仅 `geetest` | -| recaptcha_token | str | 验证码 token | | -| gee_challenge | str | 极验 challenge | | -| gee_gt | str | 极验 gt | | - -**示例:** - -```shell -curl -X POST 'https://passport.bilibili.com/x/safecenter/captcha/pre' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "recaptcha_type": "geetest", - "recaptcha_token": "8a418aa9eebe411599d759fc318d55e1", - "gee_challenge": "4e5353e7ab9f9aef0c97fa5a5b1ad101", - "gee_gt": "ac597a4506fee079629df5d8b66dd4fe" - } -} -``` - -
- -### 发送验证码 - -> https://passport.bilibili.com/x/safecenter/common/sms/send - -*请求方法: POST* - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | - | ---- | ---- | ---- | -| tmp_code| str | url query 中的 tmp_code | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | -| sms_type | str | `loginTelCheck` | 必要 | | -| recaptcha_token | str | 验证码 token | 必要 | 参见 [获取 captcha](#获取-captcha) | -| gee_challenge | str | 极验 challenge | 必要 | 参见 [获取 captcha](#获取-captcha) | -| gee_validate | str | 极验 validate | 必要 | 验证后获得 | -| gee_seccode | str | 极验 seccode | 必要 | 验证后获得 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | -- | - | -| captcha_key | str | 验证码 key | | - -**示例:** - -假设 `tmp_code` 为 `imtmptk`, -`recaptcha_token` 为 `kfc`, -`gee_challenge` 为 `crazythursday`, -`gee_validate` 为 `vivo50`, -`gee_seccode` 为 `vivo50|jordan` - -```shell -curl -X POST 'https://passport.bilibili.com/x/safecenter/common/sms/send' \ ---data-urlencode 'tmp_code=imtmptk' \ ---data-urlencode 'sms_type=loginTelCheck' \ ---data-urlencode 'recaptcha_token=kfc' \ ---data-urlencode 'gee_challenge=crazythursday' \ ---data-urlencode 'gee_validate=vivo50' \ ---data-urlencode 'gee_seccode=vivo50|jordan' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "captcha_key": "42403fb08ed2cd97afff14edefbae482" - } -} -``` - -
- -### 验证手机验证码 - -> https://passport.bilibili.com/x/safecenter/login/tel/verify - -*请求方法: POST* - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | - | ---- | ---- | ---- | -| tmp_code | str | url query 中的 tmp_code | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | -| captcha_key | str | 验证码 key | 必要 | 参见 [发送验证码](#发送验证码) | -| type | str | `loginTelCheck` | 必要 | | -| code | num | 接收到的验证码 | 必要 | | -| request_id | str | url query 中的 request_id | 必要 | 参见 [简述](#简述) 中 JSON 示例中的 `url` | -| source | str | risk | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | str | 交换代码 | 用于后面 [交换 Cookie](#交换-cookie) | - -**示例:** - -假设 `tmp_code` 为 `imtmptk`, -`captcha_key` 为 `42403fb08ed2cd97afff14edefbae482`, -`code` 为 `114514`, -`request_id` 为 `imreqid` - -```shell -curl -X POST 'https://passport.bilibili.com/x/safecenter/login/tel/verify' \ ---data-urlencode 'tmp_code=imtmptk' \ ---data-urlencode 'captcha_key=42403fb08ed2cd97afff14edefbae482' \ ---data-urlencode 'type=loginTelCheck' \ ---data-urlencode 'code=114514' \ ---data-urlencode'request_id=imreqid' \ ---data-urlencode'source=risk' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "code": "6eadf783c55a387b143773282b217682" - } -} -``` - -
- -### 交换 Cookie - -> https://passport.bilibili.com/x/passport-login/web/exchange_cookie - -*请求方法: POST* - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | - | ---- | ---- | ---- | -| source | str | risk | 必要 | | -| code | str | 交换代码 | 必要 | 参见 [验证手机验证码](#验证手机验证码) | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | - | - | -| url | str | 游戏分站跨域登录 url | | -| refresh_token | str | 刷新 token | | - -**示例:** - -假设 `code` 为 `6eadf783c55a387b143773282b217682` - -```shell -curl -X POST 'https://passport.bilibili.com/x/passport-login/web/exchange_cookie' \ ---data-urlencode 'code=6eadf783c55a387b143773282b217682' \ ---data-urlencode'source=risk' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "url": "https://passport.biligame.com/x/passport-login/web/crossDomain?DedeUserID=645769214&DedeUserID__ckMd5=653409864bf9e200&Expires=1739265009&SESSDATA=11d97d2a,1739265009,928d7*82CjCKOhDRm5gROpSfgQ7B2axGVMWm5LuwNTkNDK2vjeGl7xvAsfsCINKmczXvO_Z45FsSVlJ1NHdlYlpSei1lYjdqUXRMaUpuRk9GbjVPS0psc3ZTcDFGRjhnNGhIbHRlZ0ZQRWQ1MUlUY2pnQ0lkTVRYNjlabmlUWGxHcVdkV3hrcElpa0ZEZEZRIIEC&bili_jct=3cdee5b84eb48d4f08bcfd57b58cf40b&gourl=https%3A%2F%2Fwww.bilibili.com%2F&first_domain=.bilibili.com", - "refresh_token": "43de156ad241864640f9d9721656a682" - } -} -``` - -
- -
-查看响应头部示例: - -```http -HTTP/2 200 OK -date: Thu, 15 Aug 2024 09:10:09 GMT -content-type: application/json; charset=utf-8 -access-control-allow-credentials: true -access-control-allow-methods: GET,POST,PUT,DELETE -access-control-allow-origin: https://passport.bilibili.com -bili-status-code: 0 -bili-trace-id: 175262647666bdc5 -set-cookie: SESSDATA=xxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT; HttpOnly; Secure -set-cookie: bili_jct=xxxxxxxxxxxxxxxxxxxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT -set-cookie: DedeUserID=114514191; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT -set-cookie: DedeUserID__ckMd5=0123456789abcdef; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT -set-cookie: sid=xxxxxxxx; Path=/; Domain=bilibili.com; Expires=Tue, 11 Feb 2025 09:10:09 GMT -vary: Origin -x-bili-trace-id: 60f0305e2abc511d175262647666bdc5 -access-control-allow-headers: Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,Access-Control-Allow-Credentials,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Cache-Webcdn,x-bilibili-key-real-ip,x-backend-bili-real-ip,x-risk-header -cross-origin-resource-policy: cross-origin -access-control-expose-headers: X-Bili-Gaia-Vvoucher,X-Bili-Trace-Id -expires: Thu, 15 Aug 2024 09:10:08 GMT -cache-control: no-cache -x-cache-webcdn: BYPASS from blzone01 -content-encoding: br -X-Firefox-Spdy: h2 -``` - -
diff --git a/docs/login/login_action/readme.md b/docs/login/login_action/readme.md deleted file mode 100644 index f891531..0000000 --- a/docs/login/login_action/readme.md +++ /dev/null @@ -1,164 +0,0 @@ -# 登录操作 - -人机验证方式登录包含**账号密码登录**与**手机短信验证码登录** - -**注:扫码登录**不需要进行**人机验证**,故**不使用**以下接口 - -## 扫码登录 - -- [扫码登录](QR.md) - -## 验证登录 - -人机验证流程: - -1. 请求验证码参数,得到登录密钥`key`与极验id`gt`和极验KEY`challenge` -2. 进行滑动or点击验证 -3. 返回验证结果`validate`与`seccode`,进行短信或密码登录 - -### 申请captcha验证码 - -> https://passport.bilibili.com/x/passport-login/captcha?source=main_web - -*请求方式:GET* - -注: 另外参见 [密码登录-手机号验证-获取 captcha](password.md#获取-captcha) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功 | -| message | str | 返回信息 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | -------- | -| geetest | obj | 极验captcha数据 | | -| tencent | obj | (?) | **作用尚不明确** | -| token | str | 登录 API token | 与 captcha 无关,与登录接口有关 | -| type | str | 验证方式 | 用于判断使用哪一种验证方式,目前所见只有极验
geetest:极验 | - -`geetest`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | -------- | -| gt | str | 极验id | 一般为固定值 | -| challenge | str | 极验KEY | 由B站后端产生用于人机验证 | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/x/passport-login/captcha?source=main_web' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "type": "geetest", - "token": "00fbe75cc2864ba0af969231f193a974", - "geetest": { - "challenge": "a57d9be17505d4a15ed84694c48fbf74", - "gt": "ac597a4506fee079629df5d8b66dd4fe" - }, - "tencent": { - "appid": "" - } - } -} -``` - -
- -### 申请captcha验证码 (旧版) - -> http://passport.bilibili.com/web/captcha/combine - -*请求方式:GET* - -该接口曾从文档移除过, 经过测试仍可正常使用 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ---- | -| plat | num | 平台类型 | 必要 | 默认为 6 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | -------- | -| result | obj | 套了个娃 | | -| type | num | 1 | **作用尚不明确** | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | -------- | -| success | num | 1 | **作用尚不明确** | -| gt | str | 极验id | 一般为固定值 | -| challenge | str | 极验KEY | 由B站后端产生用于人机验证 | -| key | str | 登录秘钥 | 与 captcha 无关, 与登录接口有关, 亦作 token | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/web/captcha/combine?plat=6' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "result": { - "success": 1, - "gt": "bd111e81eda1cbb9f54425aafc0908ac", - "challenge": "2903a8eb967a1d990444cb23ea42f417", - "key": "76fb59fbd83a4d9d816162c5156fc964" - }, - "type": 1 - } -} -``` - -
- -### 进行验证 - -本文档为 Bilibili 文档,验证码为 [geetest 极验](https://docs.geetest.com/sensebot/start/) 提供,故不提供相关 API - -附: [手动验证器](https://kuresaru.github.io/geetest-validator/) -[及其源码](https://github.com/kuresaru/geetest-validator) - -1. 打开手动验证器,在1、2分别填入上面API返回的`gt`和`challenge` -2. 点击按钮3,稍等加载验证码,点击按钮4进行验证 -3. 验证完成后,点击按钮5生成验证结果 -4. 使用最开始获得到的`key`、`challenge`和刚获得到的`validate`、`seccode`继续之后的登录操作 - -### 继续登录 - -- [短信登录](SMS.md) -- [密码登录](password.md) diff --git a/docs/login/login_info.md b/docs/login/login_info.md deleted file mode 100644 index c87c4b5..0000000 --- a/docs/login/login_info.md +++ /dev/null @@ -1,645 +0,0 @@ -# 登录基本信息 - -## 导航栏用户信息 - -> ~~https://api.bilibili.com/nav(带有转义)~~ (已失效) -> -> https://api.bilibili.com/x/web-interface/nav(原始数据) - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ---------------- | ------------------------------------------------- | -| isLogin | bool | 是否已登录 | false:未登录
true:已登录 | -| email_verified | num | 是否验证邮箱地址 | 0:未验证
1:已验证 | -| face | str | 用户头像 url | | -| level_info | obj | 等级信息 | | -| mid | num | 用户 mid | | -| mobile_verified | num | 是否验证手机号 | 0:未验证
1:已验证 | -| money | num | 拥有硬币数 | | -| moral | num | 当前节操值 | 上限为70 | -| official | obj | 认证信息 | | -| officialVerify | obj | 认证信息 2 | | -| pendant | obj | 头像框信息 | | -| scores | num | (?) | | -| uname | str | 用户昵称 | | -| vipDueDate | num | 会员到期时间 | 毫秒 时间戳 | -| vipStatus | num | 会员开通状态 | 0:无
1:有 | -| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度及以上大会员 | -| vip_pay_type | num | 会员开通状态 | 0:无
1:有 | -| vip_theme_type | num | (?) | | -| vip_label | obj | 会员标签 | | -| vip_avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | -| vip_nickname_color | str | 会员昵称颜色 | 颜色码 | -| wallet | obj | B币钱包信息 | | -| has_shop | bool | 是否拥有推广商品 | false:无
true:有 | -| shop_url | str | 商品推广页面 url | | -| allowance_count | num | (?) | | -| answer_status | num | (?) | | -| is_senior_member | num | 是否硬核会员 | 0:非硬核会员
1:硬核会员 | -| wbi_img | obj | Wbi 签名实时口令 | 该字段即使用户未登录也存在 | -| is_jury | bool | 是否风纪委员 | true:风纪委员
false:非风纪委员 | - -`data`中的`level_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------------ | ---- | -| current_level | num | 当前等级 | | -| current_min | num | 当前等级经验最低值 | | -| current_exp | num | 当前经验 | | -| next_exp | 小于6级时:num
6级时:str | 升级下一等级需达到的经验 |当用户等级为Lv6时,值为`--`,代表无穷大 | - -`data`中的`official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ------------------------------------------------- | -| role | num | 认证类型 | 见[用户认证类型一览](../user/official_role.md) | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 是否认证 | -1:无
0:认证 | - -`data`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------------- | -| type | num | 是否认证 | -1:无
0:认证 | -| desc | str | 认证信息 | 无为空 | - -`data`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ---- | -| pid | num | 挂件id | | -| name | str | 挂件名称 | | -| image | str | 挂件图片url | | -| expire | num | (?) | | - -`data`中的`vip_label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ------------------------------------------------------------ | -| path | str | (?) | | -| text | str | 会员名称 | | -| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员 | - -`data`中的`wallet`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------- | ---- | -| mid | num | 登录用户mid | | -| bcoin_balance | num | 拥有B币数 | | -| coupon_balance | num | 每月奖励B币数 | | -| coupon_due_time | num | (?) | | - -`data`中的`wbi_img`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------------------------- | ---------------------------------------- | -| img_url | str | Wbi 签名参数 `imgKey`的伪装 url | 详见文档 [Wbi 签名](../misc/sign/wbi.md) | -| sub_url | str | Wbi 签名参数 `subKey`的伪装 url | 详见文档 [Wbi 签名](../misc/sign/wbi.md) | - -**示例:** - -**登录状态:** - -```shell -curl 'https://api.bilibili.com/x/web-interface/nav' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "isLogin": true, - "email_verified": 1, - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "face_nft": 0, - "face_nft_type": 0, - "level_info": { - "current_level": 6, - "current_min": 28800, - "current_exp": 52689, - "next_exp": "--" - }, - "mid": 293793435, - "mobile_verified": 1, - "money": 172.4, - "moral": 70, - "official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "officialVerify": { - "type": -1, - "desc": "" - }, - "pendant": { - "pid": 2511, - "name": "初音未来13周年", - "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "expire": 0, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" - }, - "scores": 0, - "uname": "社会易姐QwQ", - "vipDueDate": 1707494400000, - "vipStatus": 1, - "vipType": 2, - "vip_pay_type": 0, - "vip_theme_type": 0, - "vip_label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" - }, - "vip_avatar_subscript": 1, - "vip_nickname_color": "#FB7299", - "vip": { - "type": 2, - "status": 1, - "due_date": 1707494400000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 1640793600 - }, - "wallet": { - "mid": 293793435, - "bcoin_balance": 5, - "coupon_balance": 5, - "coupon_due_time": 0 - }, - "has_shop": true, - "shop_url": "https://gf.bilibili.com?msource=main_station", - "allowance_count": 0, - "answer_status": 0, - "is_senior_member": 1, - "wbi_img": { - "img_url": "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", - "sub_url": "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" - }, - "is_jury": false - } -} -``` - -
- -**未登录状态:** - -```shell -curl 'https://api.bilibili.com/x/web-interface/nav' -``` - -
-查看响应示例: - -```json -{ - "code": -101, - "message": "账号未登录", - "ttl": 1, - "data": { - "isLogin": false, - "wbi_img": { - "img_url": "https://i0.hdslb.com/bfs/wbi/653657f524a547ac981ded72ea172057.png", - "sub_url": "https://i0.hdslb.com/bfs/wbi/6e4909c702f846728e64f6007736a338.png" - }, - } -} -``` - -
- -## ~~登录用户信息仅部分(已弃用)~~ - -
-查看折叠内容 - -> https://account.bilibili.com/home/userInfo - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -带有转义 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| status | bool | true | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ----------------- | ------------------------------- | -| level_info | obj | 等级信息 | | -| bCoins | num | 拥有B币数 | | -| coins | num | 拥有硬币数 | | -| face | str | 登录用户头像url | | -| nameplate_current | null | ??? | 作用尚不明确 | -| nameplate_current | str | 登录用户勋章url | | -| pendant_current | str | 登录用户头像框url | | -| uname | str | 登录用户昵称 | | -| userStatus | str | 登录用户状态 | | -| vipType | num | 大会员类型 | 0:无
1:月度
2:年度 | -| vipStatus | num | 会员开通状态 | 0:无
1:有 | -| official_verify | num | 是否认证 | -1:无
0:认证 | -| pointBalance | num | 0 | 作用尚不明确 | - -`data`中的`level_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------------ | ---- | -| current_level | num | 当前等级 | | -| current_min | num | 当前等级经验最低值 | | -| current_exp | num | 当前经验 | | -| next_exp | num | 升级下一等级需达到的经验 | | - -**示例:** - -```shell -curl 'https://account.bilibili.com/home/userInfo' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "status": true, - "data": { - "level_info": { - "current_level": 5, - "current_min": 10800, - "current_exp": 14270, - "next_exp": 28800 - }, - "bCoins": 10, - "coins": 2.5, - "face": "http:\/\/i2.hdslb.com\/bfs\/face\/480e2e98513aaeb65d2f2c76dbae750c4de722e9.jpg", - "nameplate_current": null, - "pendant_current": "http:\/\/i0.hdslb.com\/bfs\/face\/6550f53324c330f201a528e70ef305cb10ac2c01.png", - "uname": "\u793e\u4f1a\u6613\u59d0QwQ", - "userStatus": "\u6b63\u5f0f\u4f1a\u5458", - "vipType": 2, - "vipStatus": 1, - "official_verify": -1, - "pointBalance": 0 - } -} -``` - -
- -
- -## 登录用户信息(APP端) - -> https://app.bilibili.com/x/v2/account/myinfo - -*请求方式:GET* - -认证方式:仅可APP - -鉴权方式:appkey - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| ts | num | 当前时间戳 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-3:API校验密匙错误
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------- | ----------------------------- | -| mid | num | 用户mid | | -| name | str | 用户昵称 | | -| sign | str | 用户签名 | | -| coins | num | 拥有硬币数 | | -| birthday | str | 用户生日 | YYYY-MM-DD | -| face | str | 用户头像url | | -| sex | num | 用户性别 | 0:私密
1:男
2:女 | -| level | num | 用户等级 | 0-6 | -| rank | num | 1000 | **作用尚不明确** | -| silence | num | 用户是否被封禁 | 0:正常
1:封禁 | -| vip | obj | 会员信息 | | -| email_status | num | 是否验证邮箱地址 | 0:未验证
1:已验证 | -| tel_status | num | 是否验证手机号 | 0:未验证
1:已验证 | -| official | obj | 认证信息 | | -| identification | num | 1 | **作用尚不明确** | -| invite | obj | | | -| is_tourist | num | 0 | **作用尚不明确** | -| pin_prompting | num | 0 | **作用尚不明确** | - -`data`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ---------------- | ------------------------------- | -| type | num | 大会员类型 | 0:无
1:月度
2:年度 | -| status | num | 会员开通状态 | 0:无
1:有 | -| due_date | num | 大会员到期时间 | 毫秒 时间戳 | -| vip_pay_type | num | 会员开通状态 | 0:无
1:有 | -| theme_type | num | 会员开通状态 | 0:无
1:有 | -| label | obj | 大会员信息 | | -| avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | -| nickname_color | str | 会员昵称颜色 | 颜色码 | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ---------------- | -| path | str | 空 | **作用尚不明确** | -| text | str | 会员类型文字 | | -| label_theme | str | 会员类型 | | - -`data`中的`official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ------------------------------------------------- | -| role | num | 认证类型 | 0:无
1 2 7:个人认证
3 4 5 6:机构认证 | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 认证备注 | 无为空 | - -`data`中的`invite`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ---- | ---------------- | -| invite_remind | num | 1 | **作用尚不明确** | -| display | bool | true | **作用尚不明确** | - -**示例:** - -```shell -curl -G 'https://app.bilibili.com/x/v2/account/myinfo' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'appkey=4409e2ce8ffd12b8' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=b8fb8480049c525994be6507a97ae0b6' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "name": "社会易姐QwQ", - "sign": "高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨,粉丝群:1136462265", - "coins": 33.4, - "birthday": "2002-03-05", - "face": "http://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "sex": 1, - "level": 5, - "rank": 10000, - "silence": 0, - "vip": { - "type": 2, - "status": 1, - "due_date": 1612454400000, - "vip_pay_type": 1, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299" - }, - "email_status": 1, - "tel_status": 1, - "official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "identification": 1, - "invite": { - "invite_remind": 1, - "display": true - }, - "is_tourist": 0, - "pin_prompting": 0 - } -} -``` - -
- - -## 登录用户状态数(双端) - -> https://api.bilibili.com/x/web-interface/nav/stat - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ---------- | ---- | -| following | num | 关注数 | | -| follower | num | 粉丝数 | | -| dynamic_count | num | 发布动态数 | | - -**示例:** - -当前登录用户的状态数为粉丝596,关注754,发送的动态252 - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/nav/stat' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "following": 754, - "follower": 596, - "dynamic_count": 252 - } -} -``` - -
- -APP方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/nav/stat' \ ---data-urlencode 'access_key=d907f51122c59599d580ade2315af971' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "following": 754, - "follower": 596, - "dynamic_count": 252 - } -} -``` - -
- -## 获取硬币数 - -> https://account.bilibili.com/site/getCoin - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -鉴权方式:Cookie中` DedeUserID `存在且不为0 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| status | bool | true | 作用尚不明确 | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | -------------------------------------- | ---------- | ---- | -| money | 硬币为正数时:num
硬币为0时:null | 当前硬币数 | | - -**示例:** - -```shell -curl 'https://account.bilibili.com/site/getCoin' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "status": true, - "data": { - "money": 42.4 - } -} -``` - -
diff --git a/docs/login/login_notice.md b/docs/login/login_notice.md deleted file mode 100644 index 720c0a2..0000000 --- a/docs/login/login_notice.md +++ /dev/null @@ -1,269 +0,0 @@ -# 登录记录 - -## 查询登录记录 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | ------------------------------------------------------------ | -| mid | num | 用户mid | 必要 | 必须为自己的mid | -| buvid | str | 设备虚拟id | 非必要 | web端为操作登录接口时Cookie中的`buvid3`
若登录设备无`buvid`则留空 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-403:访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------- | -------------------------- | -| mid | num | 登录用户mid | | -| device_name | str | 登录设备 | 依靠操作登录接口时的UA决定 | -| login_type | str | 登录方式 | 根据登录接口决定 | -| login_time | str | 登录时间 | YYYY-MM-DD hh:mm:ss | -| location | str | 登录位置 | 依靠ip决定 | -| ip | str | 登录ip | 部分用`*`打码 | - -**示例:** - -查询用户`293793435`设备id为`fuck_chenrui`的登录记录 - -```shell -curl -G 'https://api.bilibili.com/x/safecenter/login_notice' \ - --data-urlencode 'mid=293793435' \ - --data-urlencode 'buvid=fuck_chenrui' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "device_name": "Chrome浏览器", - "login_type": "扫码登录", - "login_time": "2020-10-02 22:42:38", - "location": "中国陕西渭南", - "ip": "36.40.***.**" - } -} -``` - -
- -## 最近一周的登录情况 - -> - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | -------- | -| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | -| web_location | str | 网页位置? | 非必要 | 默认 333.33 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | ----- | -| count | num | 记录总数 | | -| list | arr | 登录记录列表 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 登录记录1 | | -| …… | obj | …… | | -| n | obj | 登录记录(n+1) | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------- | ---- | -| ip | str | 登录 IP | IPv4:末 2 位以 `*` 打码
IPv6:末 5 位以 `*` 打码 | -| time | num | 登录时间 | UNIX 秒级时间戳 | -| time_at | str | 登录时间 | 格式为 `yyyy-MM-dd HH:mm:ss` | -| status | bool | 是否登录成功? | | -| type | num | 登录方式? | | -| geo | str | 登录地理位置 | | - -**示例:** - -查询本用户最近一周的登录情况 - -```shell -curl -G "https://api.bilibili.com/x/member/web/login/log" \ - -b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 15, - "list": [ - { - "ip": "240e:*:*:*:*:*:*:*", - "time": 1746038055, - "time_at": "2025-05-01 02:34:15", - "status": true, - "type": 0, - "geo": "中国广西梧州电信" - }, - { - "ip": "108.181.*.*", - "time": 1722036741, - "time_at": "2024-07-27 07:32:21", - "status": true, - "type": 0, - "geo": "美国加利福尼亚州洛杉矶telus.com" - }, - { - "ip": "104.28.*.*", - "time": 1722040653, - "time_at": "2024-07-27 08:37:33", - "status": true, - "type": 0, - "geo": "巴西" - }, - { - "ip": "104.28.*.*", - "time": 1721950332, - "time_at": "2024-07-26 07:32:12", - "status": true, - "type": 0, - "geo": "新加坡cloudflare.com" - }, - { - "ip": "104.28.*.*", - "time": 1721964627, - "time_at": "2024-07-26 11:30:27", - "status": true, - "type": 0, - "geo": "美国弗吉尼亚州雷斯顿cloudflare.com" - }, - { - "ip": "143.92.*.*", - "time": 1721861861, - "time_at": "2024-07-25 06:57:41", - "status": true, - "type": 0, - "geo": "中国香港特别行政区" - }, - { - "ip": "143.92.*.*", - "time": 1721861855, - "time_at": "2024-07-25 06:57:35", - "status": true, - "type": 0, - "geo": "中国香港特别行政区" - }, - { - "ip": "104.28.*.*", - "time": 1721709514, - "time_at": "2024-07-23 12:38:34", - "status": true, - "type": 0, - "geo": "日本千叶县成田市cloudflare.com" - }, - { - "ip": "104.28.*.*", - "time": 1721709618, - "time_at": "2024-07-23 12:40:18", - "status": true, - "type": 0, - "geo": "日本千叶县成田市cloudflare.com" - }, - { - "ip": "143.92.*.*", - "time": 1721636125, - "time_at": "2024-07-22 16:15:25", - "status": true, - "type": 0, - "geo": "中国香港特别行政区" - }, - { - "ip": "143.92.*.*", - "time": 1721636111, - "time_at": "2024-07-22 16:15:11", - "status": true, - "type": 0, - "geo": "中国香港特别行政区" - }, - { - "ip": "104.28.*.*", - "time": 1721539870, - "time_at": "2024-07-21 13:31:10", - "status": true, - "type": 0, - "geo": "美国加利福尼亚州东洛杉矶cloudflare.com" - }, - { - "ip": "104.28.*.*", - "time": 1721539965, - "time_at": "2024-07-21 13:32:45", - "status": true, - "type": 0, - "geo": "美国加利福尼亚州东洛杉矶cloudflare.com" - }, - { - "ip": "42.2.*.*", - "time": 1721477962, - "time_at": "2024-07-20 20:19:22", - "status": true, - "type": 0, - "geo": "中国香港特别行政区pccw.com" - }, - { - "ip": "42.2.*.*", - "time": 1721477960, - "time_at": "2024-07-20 20:19:20", - "status": true, - "type": 0, - "geo": "中国香港特别行政区pccw.com" - } - ] - } -} -``` - -
diff --git a/docs/login/member_center.md b/docs/login/member_center.md deleted file mode 100644 index 7763e5b..0000000 --- a/docs/login/member_center.md +++ /dev/null @@ -1,862 +0,0 @@ -# 个人中心 - -## 获取我的信息 - -> https://api.bilibili.com/x/member/web/account - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------- | --------------------------------------- | -| mid | num | 我的mid | | -| uname | str | 我的昵称 | | -| userid | str | 我的用户名 | | -| sign | str | 我的签名 | | -| birthday | str | 我的生日 | YYYY-MM-DD | -| sex | str | 我的性别 | 男 女 保密 | -| nick_free | bool | 是否未设置昵称 | false:设置过昵称
true:未设置昵称 | -| rank | str | 我的会员等级 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/member/web/account' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "mid":293793435, - "uname":"社会易姐QwQ", - "userid":"bili_84675323391", - "sign":"高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨,粉丝群:1136462265", - "birthday":"2002-03-05", - "sex":"男", - "nick_free":false, - "rank":"正式会员" - } -} -``` - -
- -## 查询每日奖励状态 - -> https://api.bilibili.com/x/member/web/exp/reward - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------------- | ------------------------------------------------------------ | -| login | bool | 每日登录 | false:未完成
true:已完成
完成奖励5经验 | -| watch | bool | 每日观看 | false:未完成
true:已完成
完成奖励5经验 | -| coins | num | 每日投币所奖励的经验 | 上限为50
注:该值更新存在延迟
[另外一个专门API](#查询每日投币获得经验数) | -| share | bool | 每日分享 | false:未完成
true:已完成
完成奖励5经验 | -| email | bool | 绑定邮箱 | false:未完成
true:已完成
首次完成奖励20经验 | -| tel | bool | 绑定手机号 | false:未完成
true:已完成
首次完成奖励100经验 | -| safe_question | bool | 设置密保问题 | false:未完成
true:已完成
首次完成奖励30经验 | -| identify_card | bool | 实名认证 | false:未完成
true:已完成
首次完成奖励50经验 | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/member/web/exp/reward' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "login": true, - "watch": true, - "coins": 30, - "share": true, - "email": true, - "tel": true, - "safe_question": true, - "identify_card": true - } -} -``` - -
- -## 查询每日投币获得经验数 - -> ~~https://www.bilibili.com/plus/account/exp.php~~ (已失效) -> -> https://api.bilibili.com/x/web-interface/coin/today/exp - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -该接口实时更新,未发现延迟 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------------------- | ----------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| data | num | 每日投币所奖励的经验 | 上限为50 | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/web-interface/coin/today/exp' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": 20 -} -``` - -
- -## 查询大会员状态 - -> https://api.bilibili.com/x/vip/web/user/info - -*请求方式:GET* - -认证方式:仅可Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------- | ------------------------------------------------------------ | -| mid | num | 我的mid | | -| vip_type | num | 大会员类型 | 0:无
1:月度
2:年度 | -| vip_status | num | 大会员状态 | 1:正常
2:由于IP地址更换过于频繁,服务被冻结
3:你的大会员账号风险过高,大会员功能已被锁定 | -| vip_due_date | num | 大会员到期时间 | 时间戳 毫秒 | -| vip_pay_type | num | 是否已购买大会员 | 0:未购买
1:已购买 | -| theme_type | num | 0 | 作用尚不明确 | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/vip/web/user/info' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "vip_type": 2, - "vip_status": 1, - "vip_due_date": 1612454400000, - "vip_pay_type": 1, - "theme_type": 0 - } -} -``` - -
- -## 查询账号安全情况 - -> https://passport.bilibili.com/web/site/user/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -鉴权方式:如用Cookie方式认证时Cookie中`DedeUserID`存在且不为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ---------------- | ---- | -| account_info | obj | 账号绑定信息 | | -| account_safe | obj | 密码安全信息 | | -| account_sns | obj | 互联登录绑定信息 | | -| account_other | obj | | | - -`data`中的`account_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | -------------- | ------------------------------- | -| hide_tel | str | 绑定的手机号 | 星号隐藏部分信息 | -| hide_mail | str | 绑定的邮箱 | 星号隐藏部分信息 | -| bind_tel | bool | 是否绑定手机号 | false:未绑定
true:已绑定 | -| bind_mail | bool | 是否绑定邮箱 | false:未绑定
true:已绑定 | -| tel_verify | bool | 是否验证手机号 | false:未验证
true:已验证 | -| mail_verify | bool | 是否验证邮箱 | false:未验证
true:已验证 | -| unneeded_check | bool | 是否未设置密码 | false:已设置
true:未设置 | -| realname_certified | bool | 是否实名认证 | false:未认证
true:已认证 | - -`data`中的`account_safe`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------------- | ----------------------------- | -| Score | num | 账号安全等级 | 0-100
已弃用? | -| score_new | num | 新版账号安全等级 | 0-100 | -| pwd_level | num | 当前密码强度等级 | 1:弱
2:中
3:强 | -| security | bool | 当前密码是否安全 | false:不安全
true:安全 | - -`data`中的`account_sns`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ------------------------ | -| weibo_bind | num | 是否绑定微博 | 0:未绑定
1:已绑定 | -| qq_bind | num | 是否绑定qq | 0:未绑定
1:已绑定 | -| wechat_bind | num | 是否绑定微信 | 0:未绑定
1:已绑定 | - -`data`中的`account_other`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ----- | ------------ | -| skipVerify | bool | false | 作用尚不明确 | - -**示例:** - -```shell -curl 'https://passport.bilibili.com/web/site/user/info' \ --b 'SESSDATA=xxx;DedeUserID=1;' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "account_info": { - "hide_tel": "153*****056", - "hide_mail": "144****@qq.com", - "bind_tel": true, - "bind_mail": true, - "tel_verify": true, - "mail_verify": true, - "unneeded_check": false, - "realname_certified": true - }, - "account_safe": { - "Score": 90, - "score_new": 100, - "pwd_level": 3, - "security": true - }, - "account_sns": { - "weibo_bind": 1, - "qq_bind": 1, - "wechat_bind": 1 - }, - "account_other": { - "skipVerify": false - } - } -} -``` - -
- -## 查询账号实名认证状态 - -> https://api.bilibili.com/x/member/realname/status - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ------------------------ | -| status | num | 实名认证状态 | 0:未认证
1:已认证 | - -**示例:** - -当前状态为已认证 - -```shell -curl 'https://api.bilibili.com/x/member/realname/status' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "status": 1 - } -} -``` - -
- -## 查询实名认证详细信息 - -> https://api.bilibili.com/x/member/realname/apply/status - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ------------------------------------------------------------ | -| status | num | 认证状态 | 1:已认证
3:未认证 | -| remark | str | 驳回信息 | 默认为空 | -| realname | str | 实名姓名 | 星号隐藏完全信息 | -| card | str | 证件号码 | 星号隐藏部分信息 | -| card_type | num | 证件类型代码 | 0:身份证
2:港澳居民来往内地通行证
3:台湾居民来往大陆通行证
4:护照(中国签发)
5:外国人永久居留证
6:其他国家或地区身份证明 | - -```shell -curl 'https://api.bilibili.com/x/member/realname/apply/status' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "status": 1, - "remark": "", - "realname": "***", - "card": "6****************7", - "card_type": 0 - } -} -``` - -
- -## 查询硬币变化情况 - -> https://api.bilibili.com/x/member/web/coin/log - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -仅能查询最近一周的情况 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| list | array | 变化记录条目列表 | | -| count | num | 变化记录条目数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 变化记录条目1 | | -| n | obj | 变化记录条目(n+1) | | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---------------------- | -| time | str | 变化时间 | YYYY-MM-DD HH:MM:SS | -| delta | num | 变化量 | 正值为收入,负值为支出 | -| reason | str | 变化说明 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/member/web/coin/log' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "time": "2020-05-19 23:58:29", - "delta": -1, - "reason": "给视频 BV1j5411s7M8 打赏" - }, - { - "time": "2020-05-19 16:02:53", - "delta": -1, - "reason": "给视频 BV1Ht4y117A1 打赏" - }, - { - "time": "2020-05-19 15:38:42", - "delta": 0.1, - "reason": "给视频 BV1nb411C7aa 打赏" - }, - { - "time": "2020-05-19 02:19:20", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-18 22:34:04", - "delta": -1, - "reason": "给视频 BV1Bp4y1Q7uw 打赏" - }, - { - "time": "2020-05-18 22:33:59", - "delta": -1, - "reason": "给视频 BV1j5411s7M8 打赏" - }, - { - "time": "2020-05-18 02:45:53", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-17 03:02:38", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-16 01:57:02", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-15 11:10:35", - "delta": 0.2, - "reason": "给视频 BV1Yt41137T6 打赏" - }, - { - "time": "2020-05-15 00:34:27", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-14 02:11:37", - "delta": 1, - "reason": "登录奖励" - }, - { - "time": "2020-05-13 02:12:28", - "delta": 1, - "reason": "登录奖励" - } - ], - "count": 13 - } -} -``` - -
- -## 修改个人签名 - -> https://api.bilibili.com/x/member/web/sign/update - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或APP - -修改签名不会立即生效,会等待审核队列稍后生效 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | -------------------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| user_sign | str | 要设置的签名内容 | 非必要 | 删除签名留空或省去即可
最多支持70个字符 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
40015:签名包含敏感词
40021:签名不能包含表情图片
40022:签名过长 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -更新个人标签为`高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,资深猿厨,粉丝群:1136462265` - -```shell -curl 'https://api.bilibili.com/x/member/web/sign/update' \ ---data-urlencode 'user_sign=高中技术宅一枚,爱好MC&电子&8-bit音乐&数码&编程,粉丝群:1136462265' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -
- -## 最近一周的经验记录 - -> https://api.bilibili.com/x/member/web/exp/log - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | -------- | -| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | -| web_location | str | 网页位置? | 非必要 | 默认 333.33 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0: 成功
-101: 账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| list | array | 经验记录条目列表 | | -| count | num | 经验记录条目数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----- | ---- | -| 0 | obj | 记录1 | | -| …… | obj | …… | …… | -| n | obj | 记录(n+1) | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| delta | num | 经验值 | | -| time | str | 记录时间 | 格式为 yyyy-MM-dd HH:mm:ss | -| reason | str | 记录原因 | | - -**示例:** - -```shell -curl -G "https://api.bilibili.com/x/member/web/exp/log" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "delta": 5, - "time": "2024-07-27 15:08:23", - "reason": "分享视频奖励" - }, - { - "delta": 5, - "time": "2024-07-27 08:28:21", - "reason": "登录奖励" - }, - { - "delta": 5, - "time": "2024-07-27 08:28:21", - "reason": "观看视频奖励" - }, - { - "delta": 5, - "time": "2024-07-26 12:44:19", - "reason": "登录奖励" - }, - { - "delta": 5, - "time": "2024-07-26 12:44:19", - "reason": "观看视频奖励" - }, - { - "delta": 20, - "time": "2024-07-25 06:58:49", - "reason": "视频投币奖励" - }, - { - "delta": 5, - "time": "2024-07-25 06:58:30", - "reason": "观看视频奖励" - }, - { - "delta": 5, - "time": "2024-07-25 06:58:30", - "reason": "登录奖励" - }, - { - "delta": 5, - "time": "2024-07-23 18:47:48", - "reason": "观看视频奖励" - }, - { - "delta": 5, - "time": "2024-07-23 18:47:48", - "reason": "登录奖励" - } - ], - "count": 10 - } -} -``` - -
- -## 最近一周的节操记录 - -> https://api.bilibili.com/x/member/web/moral/log - -*请求方式: GET* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | -------- | -| jsonp | str | 回调函数名? | 非必要 | 默认 jsonp | -| web_location | str | 网页位置? | 非必要 | 默认 333.33 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| code | num | 返回值 | 0: 成功
-101: 账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| moral | num | 节操值 | | -| list | array | 记录条目列表 | | -| count | num | 记录条目数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----- | ---- | -| 0 | obj | 记录1 | | -| …… | obj | …… | …… | -| n | obj | 记录(n+1) | | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| time | string | 时间 | | -| delta | number | 变化 | | -| origin | string | 原因 | | -| reason | string | 说明 | | - -**示例:** - -```shell -curl -G "https://api.bilibili.com/x/member/web/moral/log" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "moral": 70, - "list": [], - "count": 0 - } -} -``` - -
diff --git a/docs/manga/Activity.md b/docs/manga/Activity.md deleted file mode 100644 index 6a3d812..0000000 --- a/docs/manga/Activity.md +++ /dev/null @@ -1,76 +0,0 @@ -# 漫画任务操作 - -## 分享漫画 - -> https://manga.bilibili.com/twirp/activity.v1.Activity/ShareComic - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---- | ------ | ------- | -| platform | str | 平台 | 必要 | android | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | --------- | -------- | ------------------------------------------------------- | -| code | num / str | 返回值 | 见对应表格 | -| msg | str | 错误信息 | | -| meta | obj | 错误信息 | invalid_argument 时存在,例如 `{"argument":"platform"}` | -| data | obj | | `code` 为 0,`msg` 为空时存在 | - -`code` - `msg` 对应表: - -| code | code 类型 | msg | 备注 | -| ---------------- | --------- | ------------------ | --------------------------- | -| 0 | num | 空 | 分享成功,`data` 存在 | -| 0 | num | 今日已分享 | | -| invalid_argument | str | xxxx must be valid | xxxx 字段为必须,`meta`存在 | -| unauthenticated | str | must login | 必须登录才能分享 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---- | -| point | num | 获取积分 | | - -**示例:** - -```bash -curl -X POST https://manga.bilibili.com/twirp/activity.v1.Activity/ShareComic \ --b "SESSDATA=xxxxx" \ ---data-urlencode 'platform=android' -``` - -
-分享成功: - -```json -{ - "code": 0, - "msg": "", - "data": { - "point": 5 - } -} -``` - -
- -
-今日已分享: - -```json -{ - "code": 0, - "msg": "今日已分享" -} -``` - -
diff --git a/docs/manga/ClockIn.md b/docs/manga/ClockIn.md deleted file mode 100644 index 36681ed..0000000 --- a/docs/manga/ClockIn.md +++ /dev/null @@ -1,217 +0,0 @@ -# 签到 - -> https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|----|-----|---------| -| platform | str | 平台 | 必要 | android | -| device | str | 平台 | 非必要 | h5 | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|------|-----|-------| -| type | num | | 非必要 | 补签时使用 | -| date | str | 补签日期 | 必要 | 补签时使用 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----------|------|--------------------------------------------| -| code | num / str | 返回值 | 0:成功
invalid_argument:今日已签到 | -| msg | str | 错误信息 | 成功:空
已签到:clockin clockin is duplicate | -| meta | obj | 错误信息 | 今日已签到时存在 | -| data | obj | | | - -**示例:** - -普通签到: - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn' \ --H 'Cookie: SESSDATA=xxx' \ --H 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'platform=android' -``` - -
-签到成功: - -```json -{ - "code": 0, - "msg": "", - "data": {} -} -``` - -
- -
-今日已签到: - -```json -{ - "code": "invalid_argument", - "msg": "clockin clockin is duplicate", - "meta": { - "argument": "clockin" - } -} -``` - -
- -补签: - -```bash -curl -L 'https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn?platform=android' \ --H 'Cookie: SESSDATA=xxx' \ --H 'content-type: application/json;charset=UTF-8' \ --d '{"type":0,"date":"2023-02-15"}' -``` - -
-补签成功: - -```json -{ - "code": 0, - "msg": "", - "data": {} -} -``` - -
- -# 查询签到状态 - -> https://manga.bilibili.com/twirp/activity.v1.Activity/GetClockInInfo - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|------|------| -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 空 | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|-------|------------------|------------------| -| day_count | num | 连续签到天数 | | -| status | num | 今日是否已签到 | 0:未签到
1:已签到 | -| credit_icon | str | | | -| sign_before_icon | str | | | -| sign_today_icon | str | | | -| breathe_icon | str | | | -| new_credit_x_icon | str | | | -| coupon_pic | str | | | -| points | array | 一次签到周期中每次签到可获得点数 | | -| point_infos | array | | | - -`point_infos`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|------|---------|----| -| point | num | 签到可获取积分 | | -| origin_point | num | | | -| is_activity | bool | | | -| title | str | 签到奖励描述 | | - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/activity.v1.Activity/GetClockInInfo' \ --H 'Cookie: SESSDATA=xxx' -``` - -
-成功: - -```json -{ - "code": 0, - "msg": "", - "data": { - "day_count": 58, - "status": 1, - "points": [ - 10, - 20, - 20, - 10, - 10, - 10, - 30 - ], - "credit_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/9da6QImiK_w192_h192.png", - "sign_before_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/BuA6z3lhN_w192_h192.png", - "sign_today_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/TWSLUHbbg_w192_h192.png", - "breathe_icon": "http://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/anime.breathe.svga", - "point_infos": [ - { - "point": 10, - "origin_point": 10, - "is_activity": false, - "title": "10积分" - }, - { - "point": 20, - "origin_point": 20, - "is_activity": false, - "title": "20积分" - }, - { - "point": 20, - "origin_point": 20, - "is_activity": false, - "title": "20积分" - }, - { - "point": 10, - "origin_point": 10, - "is_activity": false, - "title": "10积分" - }, - { - "point": 10, - "origin_point": 10, - "is_activity": false, - "title": "10积分" - }, - { - "point": 10, - "origin_point": 10, - "is_activity": false, - "title": "10积分" - }, - { - "point": 30, - "origin_point": 30, - "is_activity": false, - "title": "30积分+福利券" - } - ], - "new_credit_x_icon": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/QP5DsW2S_w192_h192.png", - "coupon_pic": "https://i0.hdslb.com/bfs/static/manga/artifact/sign-resource/v2/Yalqqoiz_w402_h162.png" - } -} -``` - -
\ No newline at end of file diff --git a/docs/manga/Comic.md b/docs/manga/Comic.md deleted file mode 100644 index af9d4bb..0000000 --- a/docs/manga/Comic.md +++ /dev/null @@ -1,4223 +0,0 @@ -# 购买漫画章节 - -> https://manga.bilibili.com/twirp/comic.v1.Comic/BuyEpisode - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 | -| appkey | str | cc8617fd6961e070 | 非必要 | | -| mobi_app | str | android_comic | 非必要 | | -| version | str | 4.13.0 | 非必要 | | -| build | str | 36413002 | 非必要 | | -| channel | str | bilicomic | 非必要 | | -| platform | str | android | 必要 | | -| device | str | android | 非必要 | | -| buvid | str | | 非必要 | | -| machine | str | samsung+SM-G9730 | 非必要 | | -| is_teenager | num | 0 | 非必要 | | -| no_recommend | num | 0 | 非必要 | | -| ts | num | 秒级时间戳 | 非必要 | | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| epId | num | 章节id | 必要 | | -| buyMethod | num | 购买方式 | 必要 | 2:漫读券
4:新人等免
5:通用券 | -| couponId | num | 漫读券id | 必要 | | -| comicId | num | 漫画id | 可选 | buyMethod:4为必要| -| autoPayGoldStatus | num | 2 | 可选 | buyMethod:2,5 为必要
buyMethod:4为不必要 | -| isPresale | num | 0 | 可选 | buyMethod:2,5 为必要
buyMethod:4为不必要 | - -漫读券购买 - -``` -{ - "epId": 484366, - "buyMethod": 2, - "couponId": 7461430, - "autoPayGoldStatus": 2, - "isPresale": 0 -} -``` - -等就免费(新人等免) -``` -{ - "ep_id": 321913, - "comic_id": 26564, - "buy_method": 4 -} -``` - -通用券购买 - -``` -{ - "epId": 484366, - "buyMethod": 5, - "couponId": 0, - "autoPayGoldStatus": 2, - "payAmount": 1, - "isPresale": 0 -} -``` - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
0:本话无需购买
1:没有足够的卡券使用次数
| -| msg | str | 错误信息 | | - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/BuyEpisode?platform=android' \ --H 'Cookie: SESSDATA=xxx;' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "epId": 484366, - "buyMethod": 2, - "couponId": 7461430, - "autoPayGoldStatus": 2, - "isPresale": 0 -}' -``` - -
-购买成功: - -```json -{ - "code": 0, - "msg": "", - "data": { - "auto_use_item": "" - } -} -``` - -
- -# 获取漫画详情 - -> https://manga.bilibili.com/twirp/comic.v1.Comic/ComicDetail - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录凭证 | 非必要 | 可不登录访问 | -| appkey | str | cc8617fd6961e070 | 非必要 | | -| mobi_app | str | android_comic | 非必要 | | -| version | str | 4.13.0 | 非必要 | | -| build | str | 36413002 | 非必要 | | -| channel | str | bilicomic | 非必要 | | -| platform | str | android | 非必要 | 可选值:web/android | -| device | str | android | 必要 | 如不填则不会获取ep_list信息,可选值:pc/android | -| buvid | str | | 非必要 | | -| machine | str | samsung+SM-G9730 | 非必要 | | -| is_teenager | num | 0 | 非必要 | | -| no_recommend | num | 0 | 非必要 | | -| ts | num | 秒级时间戳 | 非必要 | | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| comicId | num | 漫画id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| id | num | 漫画id | | -| title | str | 漫画名称 | | -| comic_type | num | 0,1 | | -| page_default | num | 0,1,2,4,8 | | -| page_allow | num | | | -| horizontal_cover | str | 横板封面 | | -| square_cover | str | 方形封面 | | -| vertical_cover | str | 竖版封面 | | -| author_name | array | 作者列表 | | -| styles | array | | | -| last_ord | num | 最新一话序号 | | -| is_finish | num | 完结状态
0:未完结 1:已完结 | | -| status | num | -1,0 | | -| fav | num | | | -| read_order | num | | | -| evaluate | num | 漫画简介 | | -| total | num | 总话数 | | -| ep_list | array | 章节信息 | | -| release_time | str | | | -| is_limit | num | | | -| read_epid | num | | | -| last_read_time | str | | | -| is_download | num | | | -| read_short_title | str | | | -| styles2 | array | | | -| renewal_time | str | | | -| last_short_title | str | 最新一话短标题 | | -| discount_type | num | | | -| discount | num | | | -| discount_end | str | | | -| no_reward | bool | | | -| batch_discount_type | num | | | -| ep_discount_type | num | | | -| has_fav_activity | bool | | | -| fav_free_amount | num | | | -| allow_wait_free | bool | 是否等就免费 | | -| wait_hour | num | 等待时间(小时) | | -| wait_free_at | num | 等待时间(小时) | | -| no_danmaku | num | | | -| auto_pay_status | num | | | -| no_month_ticket | bool | | | -| immersive | bool | | | -| no_discount | bool | | | -| show_type | num | | | -| pay_mode | num | | | -| chapters | array | | | -| classic_lines | str | 漫画简介 | | -| pay_for_new | num | | | -| fav_comic_info | obj | | | -| serial_status | num | | | -| series_info | obj | | | -| album_count | num | | | -| wiki_id | num | | | -| disable_coupon_amount | num | | | -| japan_comic | bool |是否为日本漫画 | | -| interact_value | num | | | -| temporary_finish_time | str | | | -| video | | | | -| introduction | str | 介绍| | -| comment_status | num | | | -| no_screenshot | bool | | | -| type | num | | | -| vomic_cvs | array | | | -| no_rank | bool | | | -| presale_eps | array | | | -| presale_text | str | | | -| presale_discount | num | | | -| no_leaderboard | bool | | | - -`ep_list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| id | num | 章节id | | -| ord | num | 章节序号,最新章节排在前面 | | -| read | num | 是否阅读过,0:没有 1:阅读过 | | -| pay_mode | num | | | -| is_locked | bool | 是否处于锁定状态 | | -| pay_gold | num | 解锁所需漫币 | | -| size | num | 文件大小(字节) | | -| short_title | str | 短标题 | | -| is_in_free | bool | | | -| title | str | 标题 | | -| cover | str | 封面 | | -| pub_time | str | 发布日期 | | -| comments | num | 评论数 | | -| unlock_expire_at | str | | | -| unlock_type | num | | | -| allow_wait_free | bool | | | -| progress | str | | | -| like_count | num | 点赞数 | | -| chapter_id | num | | | -| type | num | | | -| extra | num | | | - -`styles2`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| id | num | 漫画风格id | | -| name | str | 漫画风格名称 | | - -`fav_comic_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| has_fav_activity | bool | | | -| fav_free_amount | num | | | -| fav_coupon_type | num | | | - -`series_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| id | num | | | -| comics | array | | | - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/ComicDetail?device=pc' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "comicId": 28500 -}' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": { - "id": 28500, - "title": "夏日重现", - "comic_type": 1, - "page_default": 4, - "page_allow": 15, - "horizontal_cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "square_cover": "http://i0.hdslb.com/bfs/manga-static/35fa9fa6190aa528f26f6e1341d9ee80b66b535f.jpg", - "vertical_cover": "https://i0.hdslb.com/bfs/manga-static/965cdb5c83e0b2066b4b60973ba7f4242f592967.jpg", - "author_name": [ - "田中靖规", - "集英社" - ], - "styles": [ - "悬疑灵异" - ], - "last_ord": 152, - "is_finish": 1, - "status": 0, - "fav": 0, - "read_order": 0, - "evaluate": "【此漫画的翻译由版权方提供】青梅竹马的潮死了——。听闻这个悲报,慎平回到了阔别已久的故乡和歌山市·日都岛与家人再会并出席葬礼。但是岛上貌似陡生异变,充斥着不寻常的气息……?\n夏日孤岛上的悬疑剧!!\n\n", - "total": 167, - "ep_list": [ - { - "id": 779804, - "ord": 152, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17973126, - "short_title": "后篇(4)", - "is_in_free": false, - "title": "2026未然凶宅-后篇(4)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 218, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 458, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779788, - "ord": 151, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17654401, - "short_title": "后篇(3)", - "is_in_free": false, - "title": "2026未然凶宅-后篇(3)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 31, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 171, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779782, - "ord": 150, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18250988, - "short_title": "后篇(2)", - "is_in_free": false, - "title": "2026未然凶宅-后篇(2)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 39, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 179, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779752, - "ord": 149, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19374429, - "short_title": "后篇(1)", - "is_in_free": false, - "title": "2026未然凶宅-后篇(1)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 41, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 174, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779751, - "ord": 148, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20993207, - "short_title": "前篇(3)", - "is_in_free": false, - "title": "2026未然凶宅-前篇(3)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 52, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 187, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779749, - "ord": 147, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17048075, - "short_title": "前篇(2)", - "is_in_free": false, - "title": "2026未然凶宅-前篇(2)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 60, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 191, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 779748, - "ord": 146, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21462932, - "short_title": "前篇(1)", - "is_in_free": false, - "title": "2026未然凶宅-前篇(1)", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 151, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 233, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 546499, - "ord": 145, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 26980054, - "short_title": "139", - "is_in_free": false, - "title": "第139话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2021-02-01 12:00:00", - "comments": 1314, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 3241, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 543783, - "ord": 144, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 33822142, - "short_title": "138", - "is_in_free": false, - "title": "第138话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2021-01-25 12:00:00", - "comments": 232, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 514, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 539917, - "ord": 143, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20551895, - "short_title": "137", - "is_in_free": false, - "title": "第137话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2021-01-11 12:00:00", - "comments": 124, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 461, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 529960, - "ord": 142, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18729857, - "short_title": "136", - "is_in_free": false, - "title": "第136话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-12-28 12:00:00", - "comments": 112, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 432, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 526882, - "ord": 141, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 9528871, - "short_title": "135", - "is_in_free": false, - "title": "第135话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-12-21 12:00:00", - "comments": 64, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 397, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 524737, - "ord": 140, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 4658617, - "short_title": "记录", - "is_in_free": false, - "title": "023", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-12-14 12:00:00", - "comments": 63, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 368, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 520819, - "ord": 139, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19569820, - "short_title": "134", - "is_in_free": false, - "title": "第134话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-12-07 12:00:00", - "comments": 234, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 411, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 518563, - "ord": 138, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "133", - "is_in_free": false, - "title": "第133话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-11-30 12:00:00", - "comments": 52, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 404, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 516460, - "ord": 137, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 16923412, - "short_title": "132", - "is_in_free": false, - "title": "第132话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-11-23 12:00:00", - "comments": 66, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 408, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 513494, - "ord": 136, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22397411, - "short_title": "131", - "is_in_free": false, - "title": "第131话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-11-16 00:00:00", - "comments": 73, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 385, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 509309, - "ord": 135, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 11417949, - "short_title": "130", - "is_in_free": false, - "title": "第130话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-11-02 12:00:00", - "comments": 121, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 415, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 507403, - "ord": 134, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 13421937, - "short_title": "129", - "is_in_free": false, - "title": "第129话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-26 00:00:00", - "comments": 108, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 382, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 505464, - "ord": 133, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "128", - "is_in_free": false, - "title": "第128话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 101, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 414, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 504084, - "ord": 132, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 714738, - "short_title": "记录", - "is_in_free": false, - "title": "022", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 38, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 327, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 503749, - "ord": 131, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 13733489, - "short_title": "127", - "is_in_free": false, - "title": "第127话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 87, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 383, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 498378, - "ord": 130, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "126", - "is_in_free": false, - "title": "第126话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 83, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 392, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 496100, - "ord": 129, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17044238, - "short_title": "125", - "is_in_free": false, - "title": "第125话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 59, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 378, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494999, - "ord": 128, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19000950, - "short_title": "124", - "is_in_free": false, - "title": "第124话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 53, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 369, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494997, - "ord": 127, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 757788, - "short_title": "记录", - "is_in_free": false, - "title": "021", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 73, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 295, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494996, - "ord": 126, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 25583325, - "short_title": "123", - "is_in_free": false, - "title": "第123话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 88, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 341, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494995, - "ord": 125, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22945986, - "short_title": "122", - "is_in_free": false, - "title": "第122话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 114, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 382, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494994, - "ord": 124, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22007815, - "short_title": "121", - "is_in_free": false, - "title": "第121话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 60, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 336, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494992, - "ord": 123, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14200387, - "short_title": "120", - "is_in_free": false, - "title": "第120话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 98, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 349, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494990, - "ord": 122, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20253075, - "short_title": "119", - "is_in_free": false, - "title": "第119话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 153, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 352, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494986, - "ord": 121, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 34545559, - "short_title": "118", - "is_in_free": false, - "title": "第118话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 97, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 353, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494983, - "ord": 120, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 26875814, - "short_title": "117", - "is_in_free": false, - "title": "第117话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 38, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 326, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494982, - "ord": 119, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24302773, - "short_title": "116", - "is_in_free": false, - "title": "第116话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 60, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 311, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494981, - "ord": 118, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22563845, - "short_title": "115", - "is_in_free": false, - "title": "第115话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 103, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 332, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494979, - "ord": 117, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 26357441, - "short_title": "114", - "is_in_free": false, - "title": "第114话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 190, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 325, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494978, - "ord": 116, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 3055913, - "short_title": "记录", - "is_in_free": false, - "title": "020", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 27, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 303, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494977, - "ord": 115, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 27213199, - "short_title": "113", - "is_in_free": false, - "title": "第113话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 131, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 344, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494876, - "ord": 114, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 27036215, - "short_title": "112", - "is_in_free": false, - "title": "第112话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 84, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 306, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494872, - "ord": 113, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18077367, - "short_title": "111", - "is_in_free": false, - "title": "第111话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 66, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 317, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494852, - "ord": 112, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 6547152, - "short_title": "记录", - "is_in_free": false, - "title": "019", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 20, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 286, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494849, - "ord": 111, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17709563, - "short_title": "110", - "is_in_free": false, - "title": "第110话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 42, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 326, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494848, - "ord": 110, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "109", - "is_in_free": false, - "title": "第109话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 42, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 325, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494847, - "ord": 109, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20356850, - "short_title": "108", - "is_in_free": false, - "title": "第108话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 52, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 322, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494846, - "ord": 108, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21075013, - "short_title": "107", - "is_in_free": false, - "title": "第107话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 29, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 314, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494698, - "ord": 107, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19078032, - "short_title": "106", - "is_in_free": false, - "title": "第106话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 81, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 320, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494696, - "ord": 106, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21291294, - "short_title": "105", - "is_in_free": false, - "title": "第105话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 56, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 350, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494691, - "ord": 105, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22030863, - "short_title": "104", - "is_in_free": false, - "title": "第104话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 56, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 305, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494690, - "ord": 104, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17400960, - "short_title": "103", - "is_in_free": false, - "title": "第103话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 33, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 304, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494688, - "ord": 103, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "102", - "is_in_free": false, - "title": "第102话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 53, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 329, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552061, - "ord": 102.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1922541, - "short_title": "记录", - "is_in_free": false, - "title": "018", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 8, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 30, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494682, - "ord": 102, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20268719, - "short_title": "101", - "is_in_free": false, - "title": "第101话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 92, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 317, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494666, - "ord": 101, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17542840, - "short_title": "100", - "is_in_free": false, - "title": "第100话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 48, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 323, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494665, - "ord": 100, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 27598387, - "short_title": "99", - "is_in_free": false, - "title": "第99话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 109, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 350, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494664, - "ord": 99, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24852154, - "short_title": "98", - "is_in_free": false, - "title": "第98话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 64, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 326, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494663, - "ord": 98, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20721168, - "short_title": "97", - "is_in_free": false, - "title": "第97话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 57, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 309, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494656, - "ord": 97, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15000137, - "short_title": "96", - "is_in_free": false, - "title": "第96话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 126, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 339, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552060, - "ord": 96.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 3910437, - "short_title": "记录", - "is_in_free": false, - "title": "017", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 5, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 30, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494650, - "ord": 96, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 25062481, - "short_title": "95", - "is_in_free": false, - "title": "第95话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 89, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 360, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494645, - "ord": 95, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19376143, - "short_title": "94", - "is_in_free": false, - "title": "第94话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 82, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 397, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494638, - "ord": 94, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 34661163, - "short_title": "93", - "is_in_free": false, - "title": "第93话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 64, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 352, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494637, - "ord": 93, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 33798923, - "short_title": "92", - "is_in_free": false, - "title": "第92话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 55, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 350, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494632, - "ord": 92, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19784232, - "short_title": "91", - "is_in_free": false, - "title": "第91话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 81, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 387, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494627, - "ord": 91, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18532096, - "short_title": "90", - "is_in_free": false, - "title": "第90话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 121, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 371, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 494009, - "ord": 90, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19527018, - "short_title": "89", - "is_in_free": false, - "title": "第89话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 57, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 330, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552059, - "ord": 89.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 2034891, - "short_title": "记录", - "is_in_free": false, - "title": "016", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 14, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 33, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 493979, - "ord": 89, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18494693, - "short_title": "88", - "is_in_free": false, - "title": "第88话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 87, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 351, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 493950, - "ord": 88, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17416462, - "short_title": "87", - "is_in_free": false, - "title": "第87话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 71, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 343, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 493944, - "ord": 87, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "86", - "is_in_free": false, - "title": "第86话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 88, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 357, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552058, - "ord": 86.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 4837743, - "short_title": "记录", - "is_in_free": false, - "title": "015", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-10 00:00:00", - "comments": 9, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 42, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491230, - "ord": 86, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21039936, - "short_title": "85", - "is_in_free": false, - "title": "第85话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 59, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 319, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491229, - "ord": 85, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14463535, - "short_title": "84", - "is_in_free": false, - "title": "第84话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 87, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 344, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552057, - "ord": 84.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 11625156, - "short_title": "记录", - "is_in_free": false, - "title": "014", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-10 00:00:00", - "comments": 12, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 46, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491228, - "ord": 84, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15900351, - "short_title": "83", - "is_in_free": false, - "title": "第83话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 71, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 347, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491227, - "ord": 83, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19182670, - "short_title": "82", - "is_in_free": false, - "title": "第82话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 67, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 355, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491226, - "ord": 82, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18627336, - "short_title": "81", - "is_in_free": false, - "title": "第81话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 45, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 347, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491225, - "ord": 81, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15574642, - "short_title": "80", - "is_in_free": false, - "title": "第80话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 51, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 346, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491224, - "ord": 80, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24885059, - "short_title": "79", - "is_in_free": false, - "title": "第79话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 79, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 350, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491223, - "ord": 79, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22427296, - "short_title": "78", - "is_in_free": false, - "title": "第78话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 80, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 356, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552056, - "ord": 78.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1551067, - "short_title": "记录", - "is_in_free": false, - "title": "013", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 5, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 38, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491222, - "ord": 78, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18725322, - "short_title": "77", - "is_in_free": false, - "title": "第77话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 100, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 354, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491221, - "ord": 77, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 16185606, - "short_title": "76", - "is_in_free": false, - "title": "第76话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 59, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 341, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491220, - "ord": 76, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18886387, - "short_title": "75", - "is_in_free": false, - "title": "第75话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 88, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 370, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491215, - "ord": 75, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19228812, - "short_title": "74", - "is_in_free": false, - "title": "第74话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 106, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 343, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552054, - "ord": 74.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1106084, - "short_title": "记录", - "is_in_free": false, - "title": "012", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 9, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 43, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491214, - "ord": 74, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17213820, - "short_title": "73", - "is_in_free": false, - "title": "第73话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 105, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 358, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552053, - "ord": 73.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1510250, - "short_title": "记录", - "is_in_free": false, - "title": "011", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-10 00:00:00", - "comments": 7, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 46, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491213, - "ord": 73, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 12514556, - "short_title": "72", - "is_in_free": false, - "title": "第72话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 38, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 356, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491212, - "ord": 72, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24337518, - "short_title": "71", - "is_in_free": false, - "title": "第71话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 45, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 353, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491211, - "ord": 71, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22329539, - "short_title": "70", - "is_in_free": false, - "title": "第70话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 45, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 343, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491210, - "ord": 70, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 12721444, - "short_title": "69", - "is_in_free": false, - "title": "第69话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 59, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 363, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491209, - "ord": 69, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14948018, - "short_title": "68", - "is_in_free": false, - "title": "第68话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 48, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 363, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491208, - "ord": 68, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19604576, - "short_title": "67", - "is_in_free": false, - "title": "第67话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 97, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 370, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491207, - "ord": 67, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18529368, - "short_title": "66", - "is_in_free": false, - "title": "第66话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 136, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 386, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491206, - "ord": 66, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19616688, - "short_title": "65", - "is_in_free": false, - "title": "第65话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 79, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 350, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 491205, - "ord": 65, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17889729, - "short_title": "64", - "is_in_free": false, - "title": "第64话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 77, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 369, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552052, - "ord": 64.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1729726, - "short_title": "记录", - "is_in_free": false, - "title": "010", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-10 00:00:00", - "comments": 47, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 47, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485887, - "ord": 64, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24816564, - "short_title": "63", - "is_in_free": false, - "title": "第63话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 96, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 363, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485886, - "ord": 63, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21990493, - "short_title": "62", - "is_in_free": false, - "title": "第62话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 161, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 377, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485885, - "ord": 62, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 16121252, - "short_title": "61", - "is_in_free": false, - "title": "第61话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 35, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 338, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485884, - "ord": 61, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 23868117, - "short_title": "60", - "is_in_free": false, - "title": "第60话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 54, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 353, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485883, - "ord": 60, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14907334, - "short_title": "59", - "is_in_free": false, - "title": "第59话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 57, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 360, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485882, - "ord": 59, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21003716, - "short_title": "58", - "is_in_free": false, - "title": "第58话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 49, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 362, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485881, - "ord": 58, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21336454, - "short_title": "57", - "is_in_free": false, - "title": "第57话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 43, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 335, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485880, - "ord": 57, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15975510, - "short_title": "56", - "is_in_free": false, - "title": "第56话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 43, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 346, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485879, - "ord": 56, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 16073891, - "short_title": "55", - "is_in_free": false, - "title": "第55话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 48, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 352, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552051, - "ord": 55.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1380370, - "short_title": "记录", - "is_in_free": false, - "title": "009", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 8, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 49, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485878, - "ord": 55, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 13480749, - "short_title": "54", - "is_in_free": false, - "title": "第54话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 56, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 357, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485877, - "ord": 54, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21882584, - "short_title": "53", - "is_in_free": false, - "title": "第53话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 38, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 372, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485853, - "ord": 53, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 23862198, - "short_title": "52", - "is_in_free": false, - "title": "第52话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 56, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 388, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485852, - "ord": 52, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 23267613, - "short_title": "51", - "is_in_free": false, - "title": "第51话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 43, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 370, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485851, - "ord": 51, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17028529, - "short_title": "50", - "is_in_free": false, - "title": "第50话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 63, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 380, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485850, - "ord": 50, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21963399, - "short_title": "49", - "is_in_free": false, - "title": "第49话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 122, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 418, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552050, - "ord": 49.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1650224, - "short_title": "记录", - "is_in_free": false, - "title": "008", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 15, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 57, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485849, - "ord": 49, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "48", - "is_in_free": false, - "title": "第48话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 71, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 392, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485848, - "ord": 48, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18582327, - "short_title": "47", - "is_in_free": false, - "title": "第47话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 64, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 401, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485847, - "ord": 47, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 28025152, - "short_title": "46", - "is_in_free": false, - "title": "第46话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 78, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 444, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485846, - "ord": 46, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18644930, - "short_title": "45", - "is_in_free": false, - "title": "第45话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 27, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 402, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485845, - "ord": 45, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17555220, - "short_title": "44", - "is_in_free": false, - "title": "第44话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 71, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 418, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485844, - "ord": 44, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 23713922, - "short_title": "43", - "is_in_free": false, - "title": "第43话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 41, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 392, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485842, - "ord": 43, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22048242, - "short_title": "42", - "is_in_free": false, - "title": "第42话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 36, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 400, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485841, - "ord": 42, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17956496, - "short_title": "41", - "is_in_free": false, - "title": "第41话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 45, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 423, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485840, - "ord": 41, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20461324, - "short_title": "40", - "is_in_free": false, - "title": "第40话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 102, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 441, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485839, - "ord": 40, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 16463871, - "short_title": "39", - "is_in_free": false, - "title": "第39话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 38, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 404, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485836, - "ord": 39, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18664684, - "short_title": "38", - "is_in_free": false, - "title": "第38话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 42, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 403, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485835, - "ord": 38, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17811979, - "short_title": "37", - "is_in_free": false, - "title": "第37话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 46, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 422, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552049, - "ord": 37.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 4923840, - "short_title": "记录", - "is_in_free": false, - "title": "005~007", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 9, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 59, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485834, - "ord": 37, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22221360, - "short_title": "36", - "is_in_free": false, - "title": "第36话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 78, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 410, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485833, - "ord": 36, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19204738, - "short_title": "35", - "is_in_free": false, - "title": "第35话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 42, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 397, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485832, - "ord": 35, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17688181, - "short_title": "34", - "is_in_free": false, - "title": "第34话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 43, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 407, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485831, - "ord": 34, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14314953, - "short_title": "33", - "is_in_free": false, - "title": "第33话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 138, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 430, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 485826, - "ord": 33, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15190983, - "short_title": "32", - "is_in_free": false, - "title": "第32话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 80, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 409, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484535, - "ord": 32, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21701429, - "short_title": "31", - "is_in_free": false, - "title": "第31话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 81, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 408, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484534, - "ord": 31, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15619952, - "short_title": "30", - "is_in_free": false, - "title": "第30话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 61, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 429, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484528, - "ord": 30, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18250579, - "short_title": "29", - "is_in_free": false, - "title": "第29话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 60, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 435, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484526, - "ord": 29, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 27051218, - "short_title": "28", - "is_in_free": false, - "title": "第28话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 59, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 406, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484514, - "ord": 28, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "27", - "is_in_free": false, - "title": "第27话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 63, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 420, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484507, - "ord": 27, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17113482, - "short_title": "26", - "is_in_free": false, - "title": "第26话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 98, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 447, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484500, - "ord": 26, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14359689, - "short_title": "25", - "is_in_free": false, - "title": "第25话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 63, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 407, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484483, - "ord": 25, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 15182223, - "short_title": "24", - "is_in_free": false, - "title": "第24话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 55, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 421, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484478, - "ord": 24, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20914179, - "short_title": "23", - "is_in_free": false, - "title": "第23话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 75, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 447, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484474, - "ord": 23, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 17764811, - "short_title": "22", - "is_in_free": false, - "title": "第22话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 65, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 434, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484461, - "ord": 22, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 27296421, - "short_title": "21", - "is_in_free": false, - "title": "第21话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 51, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 441, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484443, - "ord": 21, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 15462050, - "short_title": "记录", - "is_in_free": false, - "title": "004", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 115, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 455, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484433, - "ord": 20, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20824911, - "short_title": "20", - "is_in_free": false, - "title": "第20话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 127, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 497, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484422, - "ord": 19, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 25714866, - "short_title": "19", - "is_in_free": false, - "title": "第19话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 106, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 537, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484395, - "ord": 18, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 24927577, - "short_title": "18", - "is_in_free": false, - "title": "第18话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 94, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 527, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484387, - "ord": 17, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 0, - "short_title": "17", - "is_in_free": false, - "title": "第17话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 48, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 493, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484377, - "ord": 16, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 19775909, - "short_title": "16", - "is_in_free": false, - "title": "第16话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 70, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 503, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552046, - "ord": 15.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 3261603, - "short_title": "记录", - "is_in_free": false, - "title": "003", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2021-02-18 13:17:06", - "comments": 39, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 385, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484376, - "ord": 15, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 23101595, - "short_title": "15", - "is_in_free": false, - "title": "第15话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 97, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 510, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484375, - "ord": 14, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 21456269, - "short_title": "14", - "is_in_free": false, - "title": "第14话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 130, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 510, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484373, - "ord": 13, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 22942430, - "short_title": "13", - "is_in_free": false, - "title": "第13话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 64, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 522, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484372, - "ord": 12, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20225389, - "short_title": "12", - "is_in_free": false, - "title": "第12话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 67, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 499, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552048, - "ord": 11.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1569935, - "short_title": "记录", - "is_in_free": false, - "title": "002", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 10, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 52, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484369, - "ord": 11, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18897621, - "short_title": "11", - "is_in_free": false, - "title": "第11话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 82, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 566, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484367, - "ord": 10, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 28021344, - "short_title": "10", - "is_in_free": false, - "title": "第10话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 65, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 519, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484366, - "ord": 9, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14198049, - "short_title": "9", - "is_in_free": false, - "title": "第9话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 72, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 544, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484365, - "ord": 8, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 14137875, - "short_title": "8", - "is_in_free": false, - "title": "第8话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 92, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 575, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 552047, - "ord": 7.5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 1794952, - "short_title": "记录", - "is_in_free": false, - "title": "001", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2022-05-12 00:00:00", - "comments": 23, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 80, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484360, - "ord": 7, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 20283011, - "short_title": "7", - "is_in_free": false, - "title": "第7话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 83, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 589, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484351, - "ord": 6, - "read": 0, - "pay_mode": 1, - "is_locked": true, - "pay_gold": 49, - "size": 18898536, - "short_title": "6", - "is_in_free": false, - "title": "第6话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 43, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 626, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484350, - "ord": 5, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 18623472, - "short_title": "5", - "is_in_free": false, - "title": "第5话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 86, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 1017, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484347, - "ord": 4, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 15209423, - "short_title": "4", - "is_in_free": false, - "title": "第4话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 85, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 976, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484345, - "ord": 3, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 15210025, - "short_title": "3", - "is_in_free": false, - "title": "第3话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 72, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 972, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484344, - "ord": 2, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 26269998, - "short_title": "2", - "is_in_free": false, - "title": "第2话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 147, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 1001, - "chapter_id": 0, - "type": 0, - "extra": 0 - }, - { - "id": 484342, - "ord": 1, - "read": 0, - "pay_mode": 0, - "is_locked": false, - "pay_gold": 0, - "size": 81495763, - "short_title": "1", - "is_in_free": false, - "title": "第1话", - "cover": "http://i0.hdslb.com/bfs/manga-static/94dcf91d49253ab62b601a72772a00fddb5d0c32.jpg", - "pub_time": "2020-10-21 00:00:00", - "comments": 407, - "unlock_expire_at": "0000-00-00 00:00:00", - "unlock_type": 0, - "allow_wait_free": false, - "progress": "", - "like_count": 1283, - "chapter_id": 0, - "type": 0, - "extra": 0 - } - ], - "release_time": "2020.10.21", - "is_limit": 0, - "read_epid": 0, - "last_read_time": "", - "is_download": 1, - "read_short_title": "", - "styles2": [ - { - "id": 1081, - "name": "悬疑灵异" - } - ], - "renewal_time": "", - "last_short_title": "后篇(4)", - "discount_type": 0, - "discount": 0, - "discount_end": "0001-01-01 00:00:00", - "no_reward": false, - "batch_discount_type": 0, - "ep_discount_type": 0, - "has_fav_activity": false, - "fav_free_amount": 0, - "allow_wait_free": false, - "wait_hour": 0, - "wait_free_at": "0000-00-00 00:00:00", - "no_danmaku": 0, - "auto_pay_status": 0, - "no_month_ticket": false, - "immersive": false, - "no_discount": false, - "show_type": 0, - "pay_mode": 1, - "chapters": [], - "classic_lines": "【此漫画的翻译由版权方提供】青梅竹马的潮死了——。听闻这个悲报,慎平回到了阔别已久的故乡和歌山市·日都岛与家人再会并出席葬礼。但是岛上貌似陡生异变,充斥着不寻常的气息……?\n夏日孤岛上的悬疑剧!!\n\n", - "pay_for_new": 0, - "fav_comic_info": { - "has_fav_activity": false, - "fav_free_amount": 0, - "fav_coupon_type": 0 - }, - "serial_status": 0, - "series_info": { - "id": 0, - "comics": [] - }, - "album_count": 0, - "wiki_id": 131075, - "disable_coupon_amount": 2, - "japan_comic": true, - "interact_value": "57514", - "temporary_finish_time": "", - "video": null, - "introduction": "最聪明的男主打最聪明的反派!", - "comment_status": 1, - "no_screenshot": true, - "type": 0, - "vomic_cvs": [], - "no_rank": true, - "presale_eps": [], - "presale_text": "", - "presale_discount": 0, - "no_leaderboard": true - } -} -``` - -
diff --git a/docs/manga/Download.md b/docs/manga/Download.md deleted file mode 100644 index fea8a8f..0000000 --- a/docs/manga/Download.md +++ /dev/null @@ -1,256 +0,0 @@ -# 获取当前话全部图片地址 - -> https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 | -| appkey | str | cc8617fd6961e070 | 非必要 | | -| mobi_app | str | android_comic | 非必要 | | -| version | str | 4.21.0 | 非必要 | | -| build | str | 36421000 | 非必要 | | -| channel | str | bilicomic | 非必要 | | -| platform | str | android | 非必要 | | -| device | str | android | 非必要 | | -| buvid | str | XY118701XXXXXXXXX104911DXXXXXCAEXXXXE | 非必要 | 长度为37 | -| machine | str | | 非必要 | 手机品牌+型号 | -| is_teenager | num | 0 | 非必要 | | -| no_recommend | num | 0 | 非必要 | | -| ts | num | 秒级时间戳 | 非必要 | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| epId(ep_id) | num | 当前话的id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | | -| data | obj | | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| path | str | .index 文件路径 | | -| images | array | 本话图片信息 | | -| last_modified | str | 本话信息最后修改时间 | | -| host | str | `https://manga.hdslb.com` | | -| video | obj | | | - -`images` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| path | str | 图片的路径 | 不包含host | -| x | num | 图片宽度 | 单位:像素px | -| y | num | 图片高度 | 单位:像素px | -| video_path | str | | | -| video_size | str | | | - -`video` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| svid | str | | | -| filename | str | | | -| route | str | | | -| resource | array | | | -| raw_width | str | | | -| raw_height | str | | | -| raw_rotate | str | | | -| img_urls | array | | | -| bin_url | str | | | -| img_x_len | num | | | -| img_x_size | num | | | -| img_y_len | num | | | -| img_y_size | num | | | - - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex' \ --H 'Cookie: SESSDATA=xxx;' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "ep_id": 321912 -}' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "msg": "", - "data": { - "path": "/bfs/manga/26564/321912/data.index?token=80eab62fef85c1c134a6399f817a938f&ts=63404145", - "images": [ - { - "path": "/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg", - "x": 1600, - "y": 2268, - "video_path": "", - "video_size": "0" - }, - { - "path": "/bfs/manga/bf1c48540b68f473b429317d8f6fa8cdb6eed3a5.jpg", - "x": 1600, - "y": 2268, - "video_path": "", - "video_size": "0" - }, - { - "path": "/bfs/manga/a46cfe90cfb49c67a4dbfc0002e5bc3d87d02963.jpg", - "x": 1600, - "y": 2268, - "video_path": "", - "video_size": "0" - } - ], - "last_modified": "2019-05-13 21:15:53", - "host": "https://manga.hdslb.com", - "video": { - "svid": "", - "filename": "", - "route": "", - "resource": [], - "raw_width": "0", - "raw_height": "0", - "raw_rotate": "0", - "img_urls": [], - "bin_url": "", - "img_x_len": 10, - "img_x_size": 160, - "img_y_len": 10, - "img_y_size": 90 - } - } -} -``` - -
- -# 获取某一图片的token - -> https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------------------- | ------ | --------------------- | -| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 | -| appkey | str | cc8617fd6961e070 | 非必要 | | -| mobi_app | str | android_comic | 非必要 | | -| version | str | 4.21.0 | 非必要 | | -| build | str | 36421000 | 非必要 | | -| channel | str | bilicomic | 非必要 | | -| platform | str | android | 非必要 | | -| device | str | android | 非必要 | | -| buvid | str | XY118701XXXXXXXXX104911DXXXXXCAEXXXXE | 非必要 | 长度为37 | -| machine | str | samsung+SM-G9730 | 非必要 | 手机品牌+型号 | -| is_teenager | num | 0 | 非必要 | | -| no_recommend | num | 0 | 非必要 | | -| ts | num | 秒级时间戳 | 非必要 | | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------- | ------ | ------------------------------------------------------------ | -| urls | str | 请求token的图片地址 | 必要 | `[\"https://i0.hdslb.com{path}\"]`
{path}代表图片的相对网站路径,支持jpg和webp | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | | -| data | array | | | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------------- | ------------------------------------ | -| url | str | 图片下载的地址 | 此时网址开头 https://manga.hdslb.com | -| token | str | 图片下载需要的token | | - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/comic.v1.Comic/ImageToken' \ --H 'Cookie: SESSDATA=xxx;' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "urls": "[\"https://i0.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg\"]" -}' -``` - -
-查看响应示例: - - - -```json -{ - "code": 0, - "msg": "", - "data": [ - { - "url": "https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg", - "token": "36931815abb35857627a22c347dc1c86&ts=634045c2" - } - ] -} -``` - -
- -# 下载图片 - -*请求方式:GET* - -在上一步获取token的基础上,构建如下的url - -例如获取到此token - -``` -{ - "code": 0, - "msg": "", - "data": [ - { - "url": "https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg", - "token": "36931815abb35857627a22c347dc1c86&ts=634045c2" - } - ] -} -``` - -则访问以下网址即可,注意需要添加`?token=`。此网址有效期较短 - -``` -https://manga.hdslb.com/bfs/manga/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg?token=36931815abb35857627a22c347dc1c86&ts=634045c2 -``` - -**注**:若不加取图 Token 直接访问 `https://(i0|i1).hdslb.com/bfs/(manga|new_dyn|archive)/11e404e602fa9f709bfb89d692ac56d2e17f974d.jpg`均无法获取 diff --git a/docs/manga/Season.md b/docs/manga/Season.md deleted file mode 100644 index 7f59df6..0000000 --- a/docs/manga/Season.md +++ /dev/null @@ -1,435 +0,0 @@ -# 漫画赛季 - -**注**:漫画赛季仅在 app 端可见,但可以使用 Cookie 鉴权 - -## 获取赛季信息 - -> https://manga.bilibili.com/twirp/user.v1.Season/GetSeasonInfo - -*请求方式:POST* - -**注**:接口不鉴权可查看基本信息,鉴权后可查看赛季个人信息和赛季规则。 - -认证方式:Cookie(SESSDATA)/ APP - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| code | num | 返回值 | | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ----- | ------------------ | -------------------------- | -| current_time | str | 当前时间字符串 | ISO 8601 | -| start_time | str | 赛季开始 | ISO 8601 | -| end_time | str | 赛季结束 | ISO 8601 | -| remain_amount | num | 拥有积分 | 未登录为 `0` | -| season_id | str | 第几个赛季 | | -| tasks | array | 待领取奖励的任务 | 未登录/没有可领取时为 `[]` | -| welfare | array | 赛季奖励 | | -| next | obj | 未知 | 未登录为 `null` | -| cover | str | 版头图片 | | -| today_tasks | array | 今日的任务完成情况 | | -| text | obj | 赛季相关文案 | 未登录为 `null` | -| season_clock_in | obj | | | -| announcement | obj | 未知 | 未登录为 `null` | -| lottery | obj | | | -| mission_point_rate | str | | | -| season_title | str | 赛季标题 | | -| point_rate | obj | | | -| rank | obj | | | - -`data` 对象的 `rank`: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ----- | ---- | -| is_visible | bool | false | | - -`data` 对象的 `tasks`: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---------- | ----------------------- | -| title | str | 任务描述 | | -| id | str | | | -| status | num | 任务状态 | 应该都是`1`:待领取奖励 | -| type | num | | 与 today_tasks 的一致 | -| amount | num | 可获取积分 | | -| ctime | str | 完成时间 | ISO 8601 | - -`data` 对象的 `next`: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---- | ---- | -| title | str | 空 | | -| amount | num | 0 | | -| gap_time | num | 0 | | -| current_time | num | 0 | | - -`data` 对象的 `text`: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ---- | -| notice | str | 赛季公告 | | -| clonckInRule | str | 赛季签到规则 | | - -`data` 对象的 `announcement`: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----- | ---- | -| title | str | 空 | | -| jump_url | str | 空 | | -| enable | bool | false | | - -`data` 对象的 `point_rate`: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ---- | ---- | -| sign_in | num | 0 | | -| game | num | 0 | | -| daily_mission | num | 0 | | -| week_mission | num | 0 | | - -`data` 对象的 `lottery`: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------------- | ---- | ------------ | ---- | -| lottery_act_id | str | '0' | | -| enable_lottery | bool | 是否开启抽奖 | | -| lottery_id | str | '0' | | -| advance_lottery_act_id | str | '0' | | -| advance_pool_id | str | '0' | | - -`data` 对象的 `season_clock_in`: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ---------------- | ---- | -| is_super_luck | bool | | | -| draw_luck_time | str | | | -| prize_type | num | | | -| prize_title | str | | | -| add_up_sign | num | 赛季连续签到天数 | | -| title | str | 签到标题 | | -| sign_old_amount | num | | | -| preluck_amount | num | | | -| continuous_days | num | 连续签到天数 | | -| address_id | str | | | -| has_super_prize | bool | | | -| subtitle | str | 签到子标题 | | -| prize_image | str | | | -| prize_target_days | num | | | -| prize_amount | num | | | -| tomorrow_amount | num | 明日签到积分 | | -| entrance_tag | str | | | - -`data` 对象的 `today_tasks`: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---------- | ------------ | ------------------------------------------- | -| type | num | | | -| title | str | 任务标题 | 可能为空字符串 | -| amount | num | 可获得积分 | | -| status | num | 完成状态 | 0:未完成
1:待领取奖励
2:已完成 | -| duration | num | 耗时(分) | 直接完成的为 0 | -| comics | comic 数组 | 任务指定漫画 | 仅`type=22`时有内容,所有账号是一致的 | -| page_url | str | 空 | | -| progress | num | 已完成进度 | | -| sub_id | num | | `type` 一致时有效 | -| share_type | num | `0` | | - -`today_tasks`对象的 `comics`: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | -------- | -------- | ---- | -| comic_id | num | 漫画 id | | -| title | str | 漫画名称 | | -| vertical_cover | str | 漫画封面 | | -| styles | str 数组 | 漫画类型 | | - -`data` 对象的 `welfare`: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------ | --------------------------------------------------------- | -| type | num | 奖励类型 | 200-限免卡
202-漫读券
203-优惠券
205-最终宝箱 | -| success | num | 兑换状态 | 0-未兑换
2-已兑换 | -| exchange_amount | num | 积分消耗 | | -| boss_welfare | bool | 最终奖励 | | -| boss_remain | num | 最终奖励剩余 | | -| rank | num | 顺序 | | -| title | str | 空 | | -| url | str | 空 | | -| kind_address_id | str | '0' | | - -**示例:** - -```bash -curl -X POST https://manga.bilibili.com/twirp/user.v1.Season/GetSeasonInfo -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": { - "current_time": "2022-11-30T15:12:00+08:00", - "start_time": "2022-11-14T00:00:00+08:00", - "end_time": "2022-12-11T23:59:00+08:00", - "remain_amount": 0, - "season_id": "35", - "tasks": [], - "welfare": [ - { - "type": 200, - "success": 0, - "exchange_amount": 100, - "boss_welfare": false, - "boss_remain": 0, - "rank": 1, - "title": "", - "url": "", - "kind_address_id": "0" - }, - // 中间的省略 - { - "type": 205, - "success": 0, - "exchange_amount": 0, - "boss_welfare": true, - "boss_remain": 0, - "rank": 21, - "title": "", - "url": "", - "kind_address_id": "0" - } - ], - "next": null, - "cover": "https://i0.hdslb.com/bfs/manga-static/b81fcd291cff74965b71d67e7df261de5790c2cd.png", - "today_tasks": [ - { - "type": 18, - "title": "", - "amount": 20, - "status": 0, - "duration": 30, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 1, - "share_type": 0 - }, - { - "type": 20, - "title": "", - "amount": 20, - "status": 0, - "duration": 3, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 1, - "share_type": 0 - }, - { - "type": 22, - "title": "", - "amount": 50, - "status": 0, - "duration": 15, - "comics": [ - { - "comic_id": 32190, - "title": "我的成就有点多", - "vertical_cover": "https://i0.hdslb.com/bfs/manga-static/efc403e323656fad24335aef007af5f318879597.png", - "styles": ["都市"] - }, - { - "comic_id": 30538, - "title": "我知道你的秘密", - "vertical_cover": "https://i0.hdslb.com/bfs/manga-static/607f2c13afcf82ebba98f18213033d93bba7d58a.jpg", - "styles": ["悬疑"] - }, - { - "comic_id": 25874, - "title": "桃花宝典", - "vertical_cover": "http://i0.hdslb.com/bfs/manga-static/bb1d33004af7dfbf197572cb9ef1c5fdd19e17a8.jpg", - "styles": ["都市"] - } - ], - "page_url": "", - "progress": 0, - "sub_id": 1, - "share_type": 0 - }, - { - "type": 17, - "title": "阅读3分钟", - "amount": 10, - "status": 0, - "duration": 3, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 1, - "share_type": 0 - }, - { - "type": 17, - "title": "阅读5分钟", - "amount": 10, - "status": 0, - "duration": 5, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 2, - "share_type": 0 - }, - { - "type": 17, - "title": "阅读10分钟", - "amount": 20, - "status": 0, - "duration": 10, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 3, - "share_type": 0 - }, - { - "type": 17, - "title": "阅读20分钟", - "amount": 40, - "status": 0, - "duration": 20, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 4, - "share_type": 0 - }, - { - "type": 17, - "title": "阅读30分钟", - "amount": 60, - "status": 0, - "duration": 30, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 5, - "share_type": 0 - }, - { - "type": 19, - "title": "每日首次玩猜拳", - "amount": 5, - "status": 0, - "duration": 1, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 1, - "share_type": 0 - }, - { - "type": 1, - "title": "打开系统通知", - "amount": 5, - "status": 0, - "duration": 0, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 0, - "share_type": 0 - }, - { - "type": 2, - "title": "设置个人偏好", - "amount": 5, - "status": 0, - "duration": 0, - "comics": [], - "page_url": "", - "progress": 0, - "sub_id": 0, - "share_type": 0 - } - ], - "text": null, - "season_clock_in": { - "is_super_luck": false, - "draw_luck_time": "", - "prize_type": 0, - "prize_title": "", - "add_up_sign": 0, - "title": "", - "sign_old_amount": 0, - "preluck_amount": 0, - "continuous_days": 0, - "address_id": "0", - "has_super_prize": false, - "subtitle": "", - "prize_image": "", - "prize_target_days": 0, - "prize_amount": 0, - "tomorrow_amount": 0, - "entrance_tag": "" - }, - "announcement": null, - "lottery": { - "lottery_act_id": "0", - "enable_lottery": true, - "lottery_id": "0", - "advance_lottery_act_id": "0", - "advance_pool_id": "0" - }, - "mission_point_rate": 0, - "season_title": "初冬赛季", - "point_rate": { "sign_in": 0, "game": 0, "daily_mission": 0, "week_mission": 0 }, - "rank": { "is_visible": false } - } -} -``` - -
- -## 赛季奖励领取 - -> https://manga.bilibili.com/twirp/user.v1.Season/TakeSeasonGifts - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ------- | ------ | --------------- | -| season_id | num | 赛季 id | 必要 | 必须为本赛季 id | - -**json 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| code | num | 返回值 | | -| msg | str | 错误信息 | | - -`code` - `msg` 对照表: - -| code | msg | 备注 | -| ---- | ------------------------------------ | ---------------------------- | -| 0 | | 领取成功 | -| 2 | 当前没有正在进行的赛季,无法兑换奖励 | season_id 字段不正确 | -| 7 | 任务已领取或者未完成 | 没有已经完成的 `today_tasks` | diff --git a/docs/manga/User.md b/docs/manga/User.md deleted file mode 100644 index 7118a32..0000000 --- a/docs/manga/User.md +++ /dev/null @@ -1,712 +0,0 @@ -# 漫画用户信息 - -## 获取拥有的漫读券列表 - -> https://manga.bilibili.com/twirp/user.v1.User/GetCoupons - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| access_key | str | APP登录凭证 | 必要 | 使用APP鉴权方式时必填 | - -**正文参数 (application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| pageNum | num | 页数 | 必要 | | -| pageSize | num | 分页大小 | 必要 | 默认20,取值范围[1,100] | -| notExpired | bool | true | 非必要 | | -| tabType | num | 1 | 非必要 | | -| type | num | 0 | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | | -| data | obj | | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| total_remain_amount | num | | | -| user_coupons | array | | | -| coupon_info | obj | | | - -`user_coupons` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| ID | num | 漫读券id | | -| remain_amount | num | 漫读券剩余数 | | -| expire_time | num | 过期时间 | | -| reason | num | 获取方式 | | -| type | num | 类型 | | -| ctime | num | 获取时间 | | -| total_amount | num | 漫读券总数 | | -| limits | array | (?) | | -| type_num | num | 7:福利券 | | -| will_expire | num | 是否即将过期?
0:否
1:是 | | -| discount | num | 0 | | -| discount_limit | num | 0 | | -| is_from_card | num | 0 | | -| valid_time | str | 0001-01-01 | | -| discount_base | num | 0 | | - -`coupon_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| new_coupon_num | num | | | -| coupon_will_expire | num | | | -| rent_will_expire | num | | | -| new_rent_num | num | | | -| discount_will_expire | num | | | -| new_discount_num | num | | | -| month_ticket_will_expire | num | | | -| new_month_ticket_num | num | | | -| silver_will_expire | num | | | -| new_silver_num | num | | | -| remain_item | num | | | -| remain_discount | num | | | -| remain_coupon | num | 拥有的漫读券数量 | | -| remain_silver | num | 拥有的通用券数量 | | -| remain_shop_coupon | num | 拥有的商城优惠券数量 | | -| new_shop_num | num | | | -| shop_will_expire | num | | | -| new_suit_id | num | | | -| remain_suit_coupon | num | | | -| new_suit_num | num | | | -| suit_will_expire | num | | | -| vip_priv_coupon | bool | | | - - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/user.v1.User/GetCoupons' \ --H 'Cookie: SESSDATA=xxx;' \ --H 'Content-Type: application/json' \ ---data-raw '{ - "notExpired": true, - "pageNum": 1, - "pageSize": 20, - "tabType": 1, - "type": 0 -}' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": { - "total_remain_amount": 1, - "user_coupons": [ - { - "ID": 7473503, - "remain_amount": 1, - "expire_time": "2022-05-24 12:00:33", - "reason": "积分兑换", - "type": "福利券", - "ctime": "2022-05-17 12:00:33", - "total_amount": 1, - "limits": [], - "type_num": 7, - "will_expire": 0, - "discount": 0, - "discount_limit": 0, - "is_from_card": 0, - "valid_time": "0001-01-01", - "discount_base": 0 - } - ], - "coupon_info": { - "new_coupon_num": 0, - "coupon_will_expire": 0, - "rent_will_expire": 0, - "new_rent_num": 0, - "discount_will_expire": 0, - "new_discount_num": 0, - "month_ticket_will_expire": 0, - "new_month_ticket_num": 0, - "silver_will_expire": 0, - "new_silver_num": 0, - "remain_item": 0, - "remain_discount": 0, - "remain_coupon": 1, - "remain_silver": 8, - "remain_shop_coupon": 1, - "new_shop_num": 0, - "shop_will_expire": 0, - "new_suit_id": 60007, - "remain_suit_coupon": 0, - "new_suit_num": 0, - "suit_will_expire": 0, - "vip_priv_coupon": false - } - } -} -``` - -
- -## 获取已购漫画 - -> https://manga.bilibili.com/twirp/user.v1.User/GetAutoBuyComics - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---- | ------ | ---- | -| device | str | 设备 | 非必要 | | -| platform | str | 平台 | 非必要 | | - -**正文参数 (application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ------------------------------------------------- | -| page_num | num | 页数 | 必要 | | -| page_size | num | 分页大小 | 必要 | 默认15 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---------- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | | -| data | obj(array) | | | - -`data`array中的对象 - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ---------------- | ---- | -| id | num | 内部id | | -| comic_id | str | 漫画id | | -| comic_title | str | 漫画标题 | | -| hcover | str | 横版头图 | | -| scover | str | 方形头图 | | -| vcover | str | 竖版封面图 | | -| bought_ep_count | num | 已购章节数 | | -| gold_status | num | | | -| coupon_status | num | | | -| comic_status | num | 漫画状态 | | -| last_ord | num | 最后一话 | | -| ctime | str | 获取时间 | | -| last_short_title | str | 最后一话的短标题 | | -| bug_type | num | 购买类型 | | -| ep_for_chapters | num | | | -| orders | obj | 自动扣费顺序 | | -| enable_auto_pay | bool | 是否开启自动付费 | | -| type | num | | | - -**示例:** - -```bash -curl -L -X POST 'https://manga.bilibili.com/twirp/user.v1.User/GetAutoBuyComics' \ --H "Cookie: xxxxx" \ --H 'Content-Type: application/json;charset=UTF-8' \ --H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' \ --d '{"page_num": 1,"page_size": 15}' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": [ - { - "id": 20276887, - "comic_id": 26554, - "comic_title": "擅长捉弄的(原)高木同学", - "hcover": "http://i0.hdslb.com/bfs/manga-static/443b4a49be1e92cd204af1472e2a7f41c1df7336.png", - "scover": "http://i0.hdslb.com/bfs/manga-static/e29eb39aed0971851efe5998d3b9c156ba52bb4e.jpg", - "vcover": "http://i0.hdslb.com/bfs/manga-static/9536b3d6c6eaef5992986d6b06d35188c20f4366.jpg", - "bought_ep_count": 13, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 235, - "ctime": "2022-01-26 21:39:33", - "last_short_title": "235", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 15129353, - "comic_id": 29726, - "comic_title": "NEW GAME!", - "hcover": "https://i0.hdslb.com/bfs/manga-static/586df1c03978ef01eac9e6a670f26395f6495ead.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/7110c8751fef26b082b5452bd515736a78bf0670.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/d3aa1477dcc9720f9bcee19c775849baad6b4e66.jpg", - "bought_ep_count": 4, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 180, - "ctime": "2021-06-21 16:29:27", - "last_short_title": "180", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 13525712, - "comic_id": 28080, - "comic_title": "终将成为你", - "hcover": "https://i0.hdslb.com/bfs/manga-static/bed69097d5fdc68bff87fce1e168b810448ee145.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/855e851b58c805b05b347fddb80a46dcb260afac.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/10e8243b502bd19947cd49a6ac2ea0a9b8c5daa3.jpg", - "bought_ep_count": 5, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 45, - "ctime": "2021-04-09 08:26:41", - "last_short_title": "第45话", - "buy_type": 9, - "ep_for_chapters": 0, - "orders": [], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 13469083, - "comic_id": 28198, - "comic_title": "米诺斯的牛肉100%", - "hcover": "http://i0.hdslb.com/bfs/manga-static/75931d991ddd40bc49c655ff3fca770d45eac9aa.jpg", - "scover": "http://i0.hdslb.com/bfs/manga-static/ee37104f5d97bb486e69d660d9a93242a1c2817a.jpg", - "vcover": "http://i0.hdslb.com/bfs/manga-static/be5400d37c1428ecc98a8e2d1772175991a262ed.jpg", - "bought_ep_count": 1, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 6, - "ctime": "2021-04-06 12:21:20", - "last_short_title": "6", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 13436048, - "comic_id": 27545, - "comic_title": "宝石之国", - "hcover": "http://i0.hdslb.com/bfs/manga-static/94637fff52eca04a8f32e19ed0c2f676b9bee96e.png", - "scover": "http://i0.hdslb.com/bfs/manga-static/e538ce332a639809aea70c8e30a19645e9b2ae3e.jpg", - "vcover": "http://i0.hdslb.com/bfs/manga-static/91e03718b03b7d3a2dca53c461b4b84953ce8cb0.jpg", - "bought_ep_count": 11, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 96, - "ctime": "2021-04-05 00:09:17", - "last_short_title": "96", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 13237163, - "comic_id": 27877, - "comic_title": "极主夫道", - "hcover": "https://i0.hdslb.com/bfs/manga-static/5a8b7bd678e2ae135415af31493417ae77bc83dd.png", - "scover": "http://i0.hdslb.com/bfs/manga-static/aa36b8cff89e42c1820e43c483d483ed3eb8d938.png", - "vcover": "http://i0.hdslb.com/bfs/manga-static/96a6b07bcea58955efed4df876bc8f1b5df9d5cc.jpg", - "bought_ep_count": 6, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 96, - "ctime": "2021-03-27 12:28:27", - "last_short_title": "96", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 12913068, - "comic_id": 25519, - "comic_title": "四月是你的谎言", - "hcover": "http://i0.hdslb.com/bfs/manga-static/33cda8ed8e6c89691d5397dc47f8c7c7945a54c4.png", - "scover": "http://i0.hdslb.com/bfs/manga-static/a6ed17ddac9bb568cefeb4eda8f8f3298db6c8cd.jpg", - "vcover": "http://i0.hdslb.com/bfs/manga-static/6d82d75a9a2817a18e16e2b82f76312d0fd02d06.jpg", - "bought_ep_count": 36, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 44, - "ctime": "2021-03-11 23:58:50", - "last_short_title": "44", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 12793711, - "comic_id": 28537, - "comic_title": "前男友成为了那样的男子", - "hcover": "https://i0.hdslb.com/bfs/manga-static/33440f7675a424dcce35459e2392e23e9d345531.jpg", - "scover": "http://i0.hdslb.com/bfs/manga-static/3de961215ad2a96ccf5dbb45d85db88934b545cb.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/77feff2a5f1aab93060e8ce5105e5616cb7313a7.jpg", - "bought_ep_count": 3, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 54, - "ctime": "2021-03-06 19:20:03", - "last_short_title": "44", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 12751111, - "comic_id": 26009, - "comic_title": "辉夜大小姐想让我告白 ~天才们的恋爱头脑战~", - "hcover": "https://i0.hdslb.com/bfs/manga-static/7fe349fd5a3d9522546e1582ad03604e82b1ff41.png", - "scover": "http://i0.hdslb.com/bfs/manga-static/b0ac1e3379e940c47b31209edf016e32e8bcee37.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/6188cad7ec7ac2b0555c0a815f9d2afbe7c0c5cb.jpg", - "bought_ep_count": 2, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 259, - "ctime": "2021-03-05 00:16:13", - "last_short_title": "269", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 12479079, - "comic_id": 27867, - "comic_title": "邪神与厨二病少女", - "hcover": "https://i0.hdslb.com/bfs/manga-static/96594b34528640f51ef5062648b55c871f4d4b1b.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/54a7f8d35024ef46dc270dc758d882bc98c4a1c5.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/1b07c3be74d65cbb707934de190af10ca81588f3.jpg", - "bought_ep_count": 194, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 216.5, - "ctime": "2021-02-23 00:18:06", - "last_short_title": "216.5", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 11749927, - "comic_id": 29119, - "comic_title": "足艺少女小村同学", - "hcover": "https://i0.hdslb.com/bfs/manga-static/30b7917fd7d8b0afe6d913f09bab31e5eafae8b6.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/f4ec445bc209ad473cdf9127528c09e271535617.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/8f83793c06dc0f59cab3a6acf4b978dc3c0a01f9.jpg", - "bought_ep_count": 13, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 58, - "ctime": "2021-01-31 11:04:31", - "last_short_title": "最终话", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 11605399, - "comic_id": 29053, - "comic_title": "如果是理想中的女儿,就算是世界最强也能受到宠爱吗?", - "hcover": "https://i0.hdslb.com/bfs/manga-static/5a7886e2b94515ea75a3ea34d9c77db3f2487b59.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/88f6d08fed2998aba96cedbfdffba555bef4d1c1.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/517a155372e7de966cca2f5f42edabd31a90b169.jpg", - "bought_ep_count": 5, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 28, - "ctime": "2021-01-25 19:40:15", - "last_short_title": "28", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 11386175, - "comic_id": 28656, - "comic_title": "就算这样,“步”还是靠了过来", - "hcover": "http://i0.hdslb.com/bfs/manga-static/c95456b2d00f84293bda62b12539d19172b45db1.jpg", - "scover": "http://i0.hdslb.com/bfs/manga-static/2601c1474cd214d28797381e70b2c19ac7d67869.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/3a556ed655ddf84c7930b3ce180fbdbf8f1d8112.jpg", - "bought_ep_count": 2, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 160, - "ctime": "2021-01-17 10:48:29", - "last_short_title": "160", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 11356706, - "comic_id": 26731, - "comic_title": "在魔王城说晚安", - "hcover": "https://i0.hdslb.com/bfs/manga-static/061f63826f1aa24a5b9346f79b915999004b13da.jpg", - "scover": "http://i0.hdslb.com/bfs/manga-static/94ae037dae4cc61d580c5c3c42702ccf10d977dc.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/2958043a10024ddebfafc4fd47d3566043689300.jpg", - "bought_ep_count": 148, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 292, - "ctime": "2021-01-16 11:25:47", - "last_short_title": "292", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - }, - { - "id": 11079049, - "comic_id": 27355, - "comic_title": "堀与宫村", - "hcover": "https://i0.hdslb.com/bfs/manga-static/b51b905707664415dab91cf81fb0373f970b54b5.jpg", - "scover": "https://i0.hdslb.com/bfs/manga-static/6ac604dfd0ad6c486a520519983212d74c340f28.jpg", - "vcover": "https://i0.hdslb.com/bfs/manga-static/c29ba3ce67613539666582d31d42b40fb48cc3c7.jpg", - "bought_ep_count": 119, - "gold_status": 2, - "coupon_status": 2, - "comic_status": 0, - "last_ord": 126, - "ctime": "2021-01-05 12:52:59", - "last_short_title": "page.122", - "buy_type": 0, - "ep_for_chapters": 0, - "orders": [ - { - "id": 2, - "title": "漫读券" - }, - { - "id": 3, - "title": "通用券" - }, - { - "id": 1, - "title": "漫币" - } - ], - "enable_auto_pay": false, - "type": 0 - } - ] -} -``` - -
\ No newline at end of file diff --git a/docs/manga/index_file.md b/docs/manga/index_file.md deleted file mode 100644 index 8e552f8..0000000 --- a/docs/manga/index_file.md +++ /dev/null @@ -1,269 +0,0 @@ -# data.index - -## data.index文件解析 - -本解密及数据解析例程以《在魔王城说晚安 第 1 话 不眠之城的公主》为例 - -本话链接:https://manga.bilibili.com/mc26731/329893 (mcid=`26731`, epid=`329893`) - -使用 Python 语言为例 - -### 获取data.index - -直接使用 GET 方法请求该话对应的 data.index 文件地址,就会得到一个二进制文件 - -```bash -curl -s 'https://manga.hdslb.com/bfs/manga/26731/329893/data.index?token=4b93ced19dc5ade671064804232ef4f5&ts=634e1943' | hexdump -C -``` - -data.index 文件内容的 HEX 如下 - -首部有 9 Byte 作为 File Magic 内容是 ASCII 编码的 `BILICOMIC` - -``` -00000000 42 49 4c 49 43 4f 4d 49 43 f5 43 06 04 7f 68 08 |BILICOMIC.C...h.| -00000010 00 ad 08 05 00 6b 68 00 00 a5 08 05 00 6b 68 00 |.....kh......kh.| -00000020 00 a5 08 0c 00 6b 68 69 6e c1 6d 7d 2e 0f 09 74 |.....khin.m}...t| -00000030 ec 33 c3 8f 5c 2c 64 86 df 40 a4 82 58 9c 42 f5 |.3..\,d..@..X.B.| -00000040 ab 21 51 4d aa f9 f1 e0 84 84 9b 40 12 58 87 1e |.!QM.......@.X..| -00000050 ba 28 29 7d ce 89 04 03 d9 91 8d fd 7e 31 1d be |.()}........~1..| -00000060 ba d8 35 ef cb a0 83 db 71 5e f1 ee f1 90 19 43 |..5.....q^.....C| -00000070 03 dd 32 f7 b8 7a b7 07 7f b9 3f 7d 3a d5 54 7e |..2..z....?}:.T~| -00000080 5f fa e2 bd c1 90 bb 0f 9c 7d 34 e4 f0 49 2f 17 |_........}4..I/.| -00000090 39 1b c0 cc 45 25 47 72 76 34 13 12 b9 12 f9 f3 |9...E%Grv4......| -000000a0 8b b9 56 13 72 be 60 5e 55 27 5f 98 e0 3e 41 78 |..V.r.`^U'_..>Ax| -000000b0 d5 af 56 d0 82 3c d5 e0 55 94 70 d0 0c 16 5f 33 |..V..<..U.p..._3| -000000c0 c5 bb 14 d7 e9 e5 4a 7c 7f db 04 ea 7b 9b 90 94 |......J|....{...| -000000d0 fd 53 e1 d2 f8 86 1b 7c ea 97 dd 0b 22 33 75 39 |.S.....|...."3u9| -000000e0 24 76 39 38 6d 58 a4 ed b4 14 8f 71 49 95 9c cb |$v98mX.....qI...| -000000f0 eb 42 eb ec df a2 22 ae 39 0c 3d 03 95 43 27 55 |.B....".9.=..C'U| -00000100 c1 c8 b2 37 2c 01 b0 f4 22 7c 51 1a 93 b5 ab 6d |...7,..."|Q....m| -00000110 72 95 0c 33 9a ed 2d d6 22 f0 08 b6 5c bb f6 b5 |r..3..-."...\...| -00000120 07 5f cf a1 3a 66 c8 30 41 29 31 dd 17 63 46 85 |._..:f.0A)1..cF.| -00000130 ea 53 20 a0 aa 89 65 91 78 37 ac 4b 06 e6 59 7a |.S ...e.x7.K..Yz| -00000140 c2 b7 10 56 cc a0 2e 85 94 09 01 89 83 43 82 a4 |...V.........C..| -00000150 db 60 91 89 15 83 aa 45 aa d6 5f fd 6a 64 f9 1c |.`.....E.._.jd..| -00000160 9d ef c3 6c 34 85 e7 49 8a a7 c3 bc 32 09 eb b8 |...l4..I....2...| -00000170 ef 70 ab d6 6a d2 7f f6 96 b1 9a 75 eb f8 47 34 |.p..j......u..G4| -00000180 db 1d 99 78 57 58 04 4e e0 c4 a4 58 d8 81 f5 02 |...xWX.N...X....| -00000190 3c 42 7e 1c 27 98 3c 70 df 04 13 33 fa ff 21 3b | -查看json内容: - -```json -{ - "clips": [ - {"r": 1600, "b": 2300, "t": 0, "l": 0, "pic": 0}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 1}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 2}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 3}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 4}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 5}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 6}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 7}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 8}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 9}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 10}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 11}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 12}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 13}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 14}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 15}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 16}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 17}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 18}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 19}, - {"r": 1600, "b": 2468, "t": 0, "l": 0, "pic": 20}, - {"r": 846, "b": 1200, "t": 0, "l": 0, "pic": 21} - ], - "pics": [ - "/bfs/manga/fc655fa220dfab74bb91b9b6e308e92e1f74fc4b.jpg", - "/bfs/manga/cb3c882f5a72c45385541e65dba6ac7689c24ebc.jpg", - "/bfs/manga/9f79683a30a1f165a6abcd2550066bd0f9bce719.jpg", - "/bfs/manga/592702a6411a8739d041d50cff9ac52ccc3e0ab1.jpg", - "/bfs/manga/52fb305a77f80d4078469c67ca4c4d8031722acc.jpg", - "/bfs/manga/d3bb31ca1943c2558eca9df9a44b7fb52d927f1e.jpg", - "/bfs/manga/2ac06b8dbaae0499edf7fb6cd99c1fe4b424a96f.jpg", - "/bfs/manga/98f63f139ecf30e3b037635fc1f59fb40388e947.jpg", - "/bfs/manga/55099ea5e0e198482ea6d216a5e41b02835701b7.jpg", - "/bfs/manga/ee60daaf9ca659bb0df7d45402c86c79a1f64739.jpg", - "/bfs/manga/8620f9742fddc97d4179f18fd2b9f1b1420138dd.jpg", - "/bfs/manga/0490a9d8bdb6312ac56baa24ed0595a2465d98dc.jpg", - "/bfs/manga/bc3234cb0ba2be2b724b1a640a418f1db7b2ac43.jpg", - "/bfs/manga/0d16c5e9779f187916e4b173e7a6447b14707ece.jpg", - "/bfs/manga/58f3985afc3f2cf57052725dfea47af5634ac1c8.jpg", - "/bfs/manga/de09b30d952566c2c1308f5da59a2ffb3b2deb5c.jpg", - "/bfs/manga/36ecc5565340605883cb000f513b49bfc91e0d3e.jpg", - "/bfs/manga/120f3174def02b3dd908ee69b427d094506b884d.jpg", - "/bfs/manga/fdbe3bd0d446c0129557bd19037785456e55f12c.jpg", - "/bfs/manga/813a1bb68c3f89616583c8662fa81984d6a907db.jpg", - "/bfs/manga/fd3a53f04831e577707e4c873e2fc205e71d5cde.jpg", - "/bfs/manga/50e1c513336e0685ca01723d64c712294e534ca0.jpg" - ], - "sizes": [ - {"cx": 1600, "cy": 2300}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 1600, "cy": 2468}, - {"cx": 846, "cy": 1200} - ] -} -``` - - - -## data.index内容 - -以下内容为解密后的 JSON 数据定义 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | -------- | ---- | -| clips | array | 尺寸信息 | | -| pics | array | 图片路径 | | -| sizes | array | 尺寸信息 | | - -根对象中的`clips`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 第 1 页信息 | | -| n | obj | 第 (n+1) 页信息 | | -| …… | obj | …… | …… | - -`clips`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ------------- | -| r | num | 图片宽度 | | -| b | num | 图片高度 | | -| t | num | (?) | | -| l | num | (?) | | -| pic | num | 图片页码序号 | 从 0 开始递增 | - -根对象中的`pics`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ------------------------------ | -| 0 | str | 第 1 图片路径 | 图片不能直接访问,需要二次鉴权 | -| n | str | 第 (n+1) 图片路径 | | -| …… | str | …… | …… | - -根对象中的`sizes`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 第 1 页信息 | | -| n | obj | 第 (n+1) 页信息 | | -| …… | obj | …… | …… | - -`clips`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| cx | num | 图片宽度 | | -| cy | num | 图片高度 | | diff --git a/docs/manga/light_card.md b/docs/manga/light_card.md deleted file mode 100644 index 405daa4..0000000 --- a/docs/manga/light_card.md +++ /dev/null @@ -1,200 +0,0 @@ -# 获取轻享卡信息 - -> https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------------|-----|----------------|-----|-----------------| -| access_key | str | 登录`access_key` | | 与`SESSDATA`二选其一 | - -**json回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|------|------| -| code | num | 响应码 | 0:成功 | -| msg | str | | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段名 | 类型 | 内容 | 备注 | -|--------------------|-------|----------------|---------------------------------| -| state | num | 轻享卡开通状态 | 0:未开通
1:已开通 | -| show_state | num | | | -| expire_date | str | 轻享卡到期时间 | | -| receive_amount | num | 已领取数量 | | -| save_money | num | 已节省漫币 | | -| index | num | 默认选择签到周期 | | -| week | array | 一个领取周期内的领取状态信息 | | -| month_reward_state | num | 是否可选择全勤奖 | 0:不可领取
1:可领取
2:不可领取(灰色) | -| month_reward | num | | | -| cur_month_end | str | 全勤奖领取剩余时间 | | -| server_time | str | 当前服务器时间 | | - -`week`数组中的对象: - -| 字段名 | 类型 | 内容 | 备注 | -|-------------------|-----|-------------|------------------------------------------------| -| index | num | 第几领取周期 | 从`1`开始 | -| start_time | str | 本周期领取开始时间 | 1:待领取
2:已领取
3:明日可领
4:已失效
5:可领取 | -| end_time | str | 本周期领取结束时间 | `同上` | -| first | num | 本周期第1天的领取状态 | `同上` | -| second | num | 本周期第2天的领取状态 | `同上` | -| third | num | 本周期第3天的领取状态 | `同上` | -| fourth | num | 本周期第4天的领取状态 | `同上` | -| full_reward_state | num | 周期全勤奖领取状态 | 1:不可领取
2:可领取
3:已领取 | - -**示例:** - -`SESSDATA`方式: - -```shell -curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard' \ --H 'Cookie: SESSDATA=xxx' -``` - -`access_key`方式: - -```shell -curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetUserLightCard?access_key=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": { - "state": 1, - "show_state": 1, - "expire_date": "2023-03-09T23:59:59+08:00", - "receive_amount": 18, - "save_money": 890, - "index": 1, - "week": [ - { - "index": 1, - "start_time": "2023-02-10T00:00:00+08:00", - "end_time": "2023-02-16T23:59:59+08:00", - "first": 5, - "second": 1, - "third": 1, - "fourth": 1, - "full_reward_state": 1 - }, - { - "index": 2, - "start_time": "2023-02-17T00:00:00+08:00", - "end_time": "2023-02-23T23:59:59+08:00", - "first": 1, - "second": 1, - "third": 1, - "fourth": 1, - "full_reward_state": 1 - }, - { - "index": 3, - "start_time": "2023-02-24T00:00:00+08:00", - "end_time": "2023-03-02T23:59:59+08:00", - "first": 1, - "second": 1, - "third": 1, - "fourth": 1, - "full_reward_state": 1 - }, - { - "index": 4, - "start_time": "2023-03-03T00:00:00+08:00", - "end_time": "2023-03-09T23:59:59+08:00", - "first": 1, - "second": 1, - "third": 1, - "fourth": 1, - "full_reward_state": 1 - } - ], - "month_reward_state": 0, - "month_reward": 0, - "cur_month_end": "2023-03-10T00:00:00+08:00", - "server_time": "2023-02-10T10:59:43+08:00" - } -} -``` - -
- -# 领取轻享卡奖励 - -> https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon - -*请求方式:POST* - -是否需要登录:`是` - -认证方式:Cookie(SESSDATA)/ APP - -Content-Type:`application/json` - -**URL参数:** - -| 参数名 | 类型 | 必填 | 内容 | 备注 | -|------------|-----|----|-----------------|----| -| access_key | str | | 与`SESSDATA`二选其一 | | - -**正文参数( application/json ):** - -| 参数名 | 类型 | 必填 | 内容 | 备注 | -|-----------|-----|----|------|----------------------| -| weekIndex | num | √ | 第几周 | 从`1`开始 | -| type | num | √ | 领取类型 | 1:领取漫读券
2:领取限免卡 | - -**json回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|-----|-------------------------------------------------------------------| -| code | num | 响应码 | 0:成功
3:今日已领取,请明日再来
3:还未满足领取条件
4:找不到数据~
6:你点击太快了哦~ | -| msg | str | | | -| data | obj | | | - -**示例:** - -`SESSDATA`方式: - -```shell -curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon' \ --H 'content-type: application/json; charset=utf-8' \ --H 'Cookie: SESSDATA=xxx' \ ---data-raw '{"type":1,"weekIndex":1}' -``` - -`access_key`方式: - -```shell -curl -L -X POST 'https://manga.bilibili.com/twirp/card.v1.Card/GetLightCoupon?access_key=xxx' \ --H 'content-type: application/json; charset=utf-8' \ ---data-raw '{"type":1,"weekIndex":1}' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": {} -} -``` - -
\ No newline at end of file diff --git a/docs/manga/point_shop.md b/docs/manga/point_shop.md deleted file mode 100644 index 97d628c..0000000 --- a/docs/manga/point_shop.md +++ /dev/null @@ -1,443 +0,0 @@ -# 积分商城 - -**注**:积分商城由web页面提供功能,地址为 https://manga.bilibili.com/eden/credits-exchange.html - -## 获取当前持有点数 - -> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------------ | -| point | str | 点数 | 不登录时为0 | - -**示例:** - -```bash -curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetUserPoint' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "msg": "", - "data": { - "point": "66666" - } -} -``` - -
- -## 获取兑换奖品列表 - -> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct - -*请求方式:POST* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | | -| msg | str | 错误信息 | | -| data | array | 奖品列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 奖品1 | | -| n | obj | 奖品(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------------ | -| id | num | 物品id | | -| type | num | 物品类型 | 0:商城相关
3:限免券
7:福利券 | -| title | str | 物品名 | | -| image | str | 显示的图像 | 福利券为空 | -| amount | num | 库存总量 | | -| cost | num | 兑换所需点数(原价) | | -| real_cost | num | 兑换所需点数(现价) | | -| remain_amount | num | 库存剩余数 | | -| comic_id | num | 相关漫画id | | -| limits | array | 限定使用范围(漫画) | 限免券所适用的漫画 | -| discount | num | (?) | 目前恒为0 | -| product_type | num | 物品类型 | 1:限免券、福利券
4:商城满99立减10元券、商城5元无门槛券
5:商城5魔晶 | -| pendant_url | str | (?) | | -| pendant_expire | num | (?) | 0:限免券、福利券
7:商城满99立减10元券、商城5元无门槛券、商城5魔晶 | -| exchange_limit | num | 兑换次数限制 | | -| address_deadline | str | (?) | | -| act_type | num | (?) | 目前恒为0 | -| has_exchanged | bool | 是否兑换过该物品 | | -| main_coupon_deadline | str | 兑换后使用截止时间 | | -| deadline | str | 兑换后使用截止时间 | | -| point | str | (?) | 目前恒为0 | - -**示例:** - -```bash -curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/ListProduct' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "msg": "", - "data": [ - { - "id": 195, - "type": 7, - "title": "积分兑换", - "image": "", - "amount": 15999, - "cost": 200, - "real_cost": 100, - "remain_amount": 0, - "comic_id": 0, - "limits": [], - "discount": 0, - "product_type": 1, - "pendant_url": "", - "pendant_expire": 7, - "exchange_limit": 0, - "address_deadline": "0001-01-01T00:00:00Z", - "act_type": 0, - "has_exchanged": false, - "main_coupon_deadline": "0001-01-01T00:00:00Z", - "deadline": "", - "point": "0" - }, - { - "id": 1009, - "type": 0, - "title": "商城5魔晶", - "image": "", - "amount": 500, - "cost": 260, - "real_cost": 30, - "remain_amount": 0, - "comic_id": 0, - "limits": [], - "discount": 0, - "product_type": 5, - "pendant_url": "", - "pendant_expire": 0, - "exchange_limit": 1, - "address_deadline": "0001-01-01T00:00:00Z", - "act_type": 0, - "has_exchanged": false, - "main_coupon_deadline": "2022-03-22T23:59:59+08:00", - "deadline": "2022-03-22T23:59:59+08:00", - "point": "0" - }, - { - "id": 1008, - "type": 0, - "title": "商城满99立减10元券", - "image": "", - "amount": 400, - "cost": 2000, - "real_cost": 400, - "remain_amount": 390, - "comic_id": 0, - "limits": [], - "discount": 0, - "product_type": 4, - "pendant_url": "", - "pendant_expire": 0, - "exchange_limit": 1, - "address_deadline": "0001-01-01T00:00:00Z", - "act_type": 0, - "has_exchanged": false, - "main_coupon_deadline": "2022-03-22T23:59:59+08:00", - "deadline": "2022-03-22T23:59:59+08:00", - "point": "0" - }, - { - "id": 1007, - "type": 0, - "title": "商城5元无门槛券", - "image": "", - "amount": 200, - "cost": 1000, - "real_cost": 200, - "remain_amount": 134, - "comic_id": 0, - "limits": [], - "discount": 0, - "product_type": 4, - "pendant_url": "", - "pendant_expire": 0, - "exchange_limit": 1, - "address_deadline": "0001-01-01T00:00:00Z", - "act_type": 0, - "has_exchanged": false, - "main_coupon_deadline": "2022-03-22T23:59:59+08:00", - "deadline": "2022-03-22T23:59:59+08:00", - "point": "0" - }, - { - "id": 1536, - "type": 3, - "title": "白兔糖", - "image": "http://i0.hdslb.com/bfs/manga-static/c3369754789a77b5d0b15cc31c75538ac035b3aa.jpg", - "amount": 4000, - "cost": 100, - "real_cost": 75, - "remain_amount": 3991, - "comic_id": 27164, - "limits": [ - { - "type": 1, - "id": 27164, - "title": "白兔糖" - } - ], - "discount": 0, - "product_type": 1, - "pendant_url": "", - "pendant_expire": 7, - "exchange_limit": 0, - "address_deadline": "0001-01-01T00:00:00Z", - "act_type": 0, - "has_exchanged": false, - "main_coupon_deadline": "0001-01-01T00:00:00Z", - "deadline": "", - "point": "0" - } - ] -} -``` - -
- - -## 兑换物品 - -> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数( application/x-www-form-urlencoded 或 application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| product_id | str | 物品id | 必要 | | -| product_num | num | 兑换个数 | 必要 | | -| point | num | 物品所需点数 | 必要 | 现价(real_cost) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:兑换成功
1:积分不足
1:您点的太快了~
2:库存不足
3:product point mismatch(point填写错误)
3:超过用户最大可兑换数量
4:现在抢票的人太多啦,再点一下有机会优先上车喔 ε=ε=(ノ≧∇≦)ノ | -| message | str | 错误信息 | | - -**示例:** - -```bash -curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/Exchange' \ ---data-urlencode 'product_id=195' \ ---data-urlencode 'product_num=1' \ ---data-urlencode 'point=real_cost' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "" -} -``` - -
- -## 获取兑换历史记录 - -> https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)/ APP - -**正文参数( application/x-www-form-urlencoded 或 application/json):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | -| act_id | num | 固定值:90018 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | | -| msg | str | 错误信息 | | | -| data | obj | 信息本体 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| prizes | obj | 兑换记录 | | -| addr | obj | (?) | | - -`data`中的`prizes`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------------ | -| user_prize_id | str | 兑换id? | | -| prize_id | num | 兑换的物品id | | -| ctime | str | 兑换时间 | | -| addr | null | (?) | | -| deadline | str | 过期时间 | | -| type | num | 类型 | 1:限免券、福利券
8:商城5魔晶 | -| name | str | 物品名 | | - -**示例:** - -```bash -curl 'https://manga.bilibili.com/twirp/activity.v1.Activity/GetPrizeList' \ ---data-urlencode 'act_id=90018' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "", - "data": { - "prizes": [ - { - "user_prize_id": "55117444", - "prize_id": 1009, - "ctime": "2022-03-21T12:22:53+08:00", - "addr": null, - "deadline": "0001-01-01T00:00:00Z", - "type": 8, - "name": "商城5魔晶" - }, - { - "user_prize_id": "2594073385420523088", - "prize_id": 1536, - "ctime": "2022-03-21T12:07:24+08:00", - "addr": null, - "deadline": "0001-01-01T00:00:00Z", - "type": 1, - "name": "白兔糖限免卡" - }, - { - "user_prize_id": "4899916394614914913", - "prize_id": 195, - "ctime": "2021-12-24T12:01:08+08:00", - "addr": null, - "deadline": "0001-01-01T00:00:00Z", - "type": 1, - "name": "积分兑换" - }, - { - "user_prize_id": "1152921504636496551", - "prize_id": 195, - "ctime": "2021-12-13T12:05:13+08:00", - "addr": null, - "deadline": "0001-01-01T00:00:00Z", - "type": 1, - "name": "积分兑换" - } - ], - "addr": { - "name": "", - "phone": "", - "address": "", - "id_card": "" - } - } -} -``` - -
- -## 获取玩法说明 - -> https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule - -*请求方式:POST* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| code | num | 返回值 | | -| msg | str | 错误信息 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| rule | str | 玩法说明 | | - -**示例:** - -```bash -curl 'https://manga.bilibili.com/twirp/pointshop.v1.Pointshop/GetExchangeRule' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "msg": "", - "data": { - "rule": "日常兑换说明:\n1、赛季积分达到一定数量可兑换积分商城内相应的商品;\n2、日常兑换奖品的刷新时间为每日中午12点,每天可兑换的奖品总数有限(具体可见商品页面展示),请尽快兑换。\n3、兑换的福利券&限免卡奖品有效期详见兑换框内显示或卡券包内详情说明哦,请及时在有效期内使用。\n4、赛季积分有效期为当前赛季时长(每期赛季时长详见福利中心页面倒计时显示),请及时在有效期内进行使用。\n5、赛季积分可在福利中心完成特定任务获取,具体详情可至福利中心查看(部分活动也可获取赛季积分,可随时关注活动信息哦)。" - } -} -``` - -
diff --git a/docs/message/msg.md b/docs/message/msg.md deleted file mode 100644 index 488b8cc..0000000 --- a/docs/message/msg.md +++ /dev/null @@ -1,258 +0,0 @@ -# 通知消息 - -## 获取未读消息数 - -> - -> (新接口) - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -本接口不会返回未读的私信数,要获取未读的私信数请参阅[未读私信数](private_msg.md#未读私信数)相关说明 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------------------- | --------------------------- | -| at | num | 未读at数(旧) | | -| chat | num | 0 | 仅旧接口,**作用尚不明确** | -| coin | num | 未读投币数 | | -| danmu | num | 未读弹幕数 | | -| favorite | num | 未读收藏数 | | -| like | num | 未读点赞数(旧) | | -| recv\_like | num | 未读收到喜欢数(新) | 同 `like` | -| recv\_reply | num | 未读回复与@数(新) | 即 `reply` 与 `at` 的值之和 | -| reply | num | 未读回复数(旧) | | -| sys\_msg | num | 未读系统通知数 | | -| sys\_msg\_style | num | 1 | 仅新接口, **作用尚不明确** | -| up | num | 未读UP主助手信息数 | | - -**示例:** - -以下信息代表了未读点赞数为10,未读回复数为4,未读at消息数为3,未读系统通知数为2,未读UP主助手信息数为1 - -```shell -curl 'https://api.vc.bilibili.com/x/im/web/msgfeed/unread' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "at": 3, - "chat": 0, - "coin": 0, - "danmu": 0, - "favorite": 0, - "like": 10, - "recv_like": 10, - "recv_reply": 4, - "reply": 4, - "sys_msg": 2, - "sys_msg_style": 1, - "up": 1 - } -} -``` - -
- - -## 获取"回复我的"信息 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ---------------- | ------ | ------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| id | num | 起始 id | 非必要 | 详情见返回 | -| reply_time | num | 起始时间 | 非必要 | 详情见返回 | -| platform | str | 平台标识 | 非必要 | 可为 `web` 等 | -| web_location | str | 暂时不知道是啥 | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | ----------- | ------------------------------ | -| cursor | obj | 光标 | 下一次查询的指针 | -| items | array | 通知列表 | 数组,每个元素代表一条回复通知 | -| last_view_at | num | unix 时间戳 | 上次查看的时间 | - -`cursor` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ---------------------------------------------- | -| is_end | bool | 是否结束 | `false` 表示还有更多数据 | -| id | num | 通知 id | 最后(旧)一条通知的 id,用作下次查询的起始 id | -| time | num | unix 时间戳 | 最后一条通知的时间 | - -`items` 数组中的对象(每条通知): - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------------------- | ---------------------------- | -| id | num | 通知 id | | -| user | obj | **回复者**的用户信息 | | -| item | obj | 通知详情 | | -| counts | num | 通知计数 | 固定为 `1`,可能表示单条通知 | -| is_multi | num | 是否多回复 | 固定为 `0`,可能表示单条回复 | -| reply_time | num | unix 时间戳 | 回复时间 | - -`user` 对象(回复者信息): - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------- | ------------------------------ | -| mid | num | 用户 mid | | -| fans | num | 粉丝数 | 固定为 `0`,可能不返回实际数据 | -| nickname | str | 用户昵称 | | -| avatar | str | 头像 URL | | -| mid_link | str | 用户主页链接 | 固定为空字符串 | -| follow | bool | 是否关注该用户 | `false` 表示未关注 | - -`item` 对象(通知详情): - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ----- | ---------------- | ----------------------------- | -| subject_id | num | 主体 id | | -| root_id | num | 根评论 id | 最顶层的评论 ID | -| source_id | num | 源评论 id | 直接回复的评论 ID | -| target_id | num | 目标评论 id | 被回复的评论 ID | -| type | str | 通知类型 | 固定为 `"reply"`(回复类型) | -| business_id | num | 业务类型 id | `1`=视频评论,`11`=动态评论 | -| business | str | 业务名称 | `"评论"` 或 `"视频"` | -| title | str | 通知标题 | 摘要文本 | -| desc | str | 描述 | 固定为空字符串 | -| image | str | 图片 URL | 固定为空字符串 | -| uri | str | 跳转链接 | web 端跳转链接 | -| native_uri | str | 客户端跳转链接 | 客户端专用跳转链接 | -| detail_title | str | 详细标题 | 固定为空字符串 | -| root_reply_content | str | 根评论内容 | 最顶层评论的文本内容 | -| source_content | str | 源评论内容 | 直接回复的评论内容 | -| target_reply_content | str | 目标评论内容 | 被回复的评论内容 | -| at_details | array | @的用户列表 | 数组,每个元素是被@的用户对象 | -| topic_details | array | 话题详情 | 固定为空数组 | -| hide_reply_button | bool | 是否隐藏回复按钮 | | -| hide_like_button | bool | 是否隐藏点赞按钮 | | -| like_state | num | 点赞状态 | `0`=未点赞 | -| danmu | null | 弹幕信息 | 固定为 `null` | -| message | str | 消息内容 | 固定为空字符串 | - -`at_details` 数组中的对象(被@的用户): - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------------- | ------------------ | -| mid | num | 用户 mid | | -| fans | num | 粉丝数 | 固定为 `0` | -| nickname | str | 用户昵称 | | -| avatar | str | 头像 URL | | -| mid_link | str | 用户主页链接 | 固定为空字符串 | -| follow | bool | 是否关注该用户 | `false` 表示未关注 | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/msgfeed/reply' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "data": { - "cursor": { - "is_end": true, - "id": 823260581625886, - "time": 1749474709 - }, - "items": [{ - "id": 823260581625886, - "user": { - "mid": 3546910497441845, - "fans": 0, - "nickname": "佘总累了", - "avatar": "https://i2.hdslb.com/bfs/face/e45c62bd47729e07dd01a788988be865ed3d210e.jpg", - "mid_link": "", - "follow": false - }, - "item": { - "subject_id": 1073543151725051921, - "root_id": 0, - "source_id": 265141324256, - "target_id": 0, - "type": "dynamic", - "business_id": 17, - "business": "动态", - "title": "我已成为哔哩哔哩第245743680位转正会员,挑战转正答题考试获得60分。", - "desc": "", - "image": "", - "uri": "https://www.bilibili.com/opus/1073543151725051921#reply265141324256", - "native_uri": "bilibili://opus/detail/1073543151725051921?comment_root_id=265141324256&comment_on=1", - "detail_title": "", - "root_reply_content": "", - "source_content": "60", - "target_reply_content": "", - "at_details": [], - "topic_details": [], - "hide_reply_button": false, - "hide_like_button": false, - "like_state": 0, - "danmu": null, - "message": "" - }, - "counts": 1, - "is_multi": 0, - "reply_time": 1749474709 - }], - "last_view_at": 1749474724 - } -} -``` - -
diff --git a/docs/message/private_msg.md b/docs/message/private_msg.md deleted file mode 100644 index 0baf0b4..0000000 --- a/docs/message/private_msg.md +++ /dev/null @@ -1,2077 +0,0 @@ -# 私信 - -## 对象与常量说明 - -### 会话对象 - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | -------------------------------- | --------------------------------------------------- | -| talker_id | num | 聊天对象的id | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 1:用户
2:粉丝团 | -| at_seqno | num | 最近一次未读at自己的消息的序列号 | 在粉丝团会话中有效,若没有未读的 at 自己的消息则为 `0` | -| top_ts | num | 置顶该会话的时间 | 微秒级时间戳;若未置顶该会话则为 `0`;用于判断是否置顶了会话 | -| group_name | str | 粉丝团名称 | 在粉丝团会话中有效,其他会话中为空字符串 | -| group_cover | str | 粉丝团头像 | 在粉丝团会话中有效,其他会话中为空字符串 | -| is_follow | num | 是否关注了对方 | 在用户会话中有效,系统会话中为 `1`, 其他会话中为 `0` | -| is_dnd | num | 是否对会话设置了免打扰 | | -| ack_seqno | num | 最近一次已读的消息序列号 | 用于快速跳转到首条未读的消息 | -| ack_ts | num | 最近一次已读时间 | 微秒级时间戳 | -| session_ts | num | 会话时间 | 微秒级时间戳 | -| unread_count | num | 未读消息数 | | -| last_msg | 有效时:obj
无效时:null | 最近的一条消息 | 详见[私信主体对象](#私信主体对象) | -| group_type | num | 粉丝团类型 | 在粉丝团时有效
0:应援团
2:官方群(如:ID 为 10 的粉丝团) | -| can_fold | num | 会话是否可被折叠入未关注人消息 | 在用户会话中有效 | -| status | num | 会话状态 | 详细信息有待补充 | -| max_seqno | num | 最近一条消息的序列号 | | -| new_push_msg | num | 是否有新推送的消息 | | -| setting | num | 推送设置 | 0:接收推送
1:不接收推送
2:(?) | -| is_guardian | num | 自己是否为对方的骑士(?) | 在用户会话中有效
0:否
2:是(?) | -| is_intercept | num | 会话是否被拦截 | | -| is_trust | num | 是否信任此会话 | 若为 `1`,则表示此会话之前被拦截过,但用户选择信任本会话 | -| system_msg_type | num | 系统会话类型 | 0:非系统会话
1:主播小助手
5:系统通知(?)
7:UP主小助手
8:客服消息
9:支付小助手 | -| account_info | obj | 会话信息 | 仅在系统会话中出现 | -| live_status | num | 用户是否正在直播 | 在用户会话中有效,其他会话中为 `0` | -| biz_msg_unread_count | num | 未读通知消息数 | | -| user_label | null | (?) | **作用尚不明确** | - -`account_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| name | str | 会话名称 | | -| pic_url | str | 会话头像 | | - -### 私信主体对象 - -注:私信主体对象≠[私信内容对象](private_msg_content.md) - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | -------------- | -------------------------------------------------------------- | -| sender_uid | num | 发送者mid | | -| receiver_type | num | 接收者类型 | 1:用户
2:粉丝团 | -| receiver_id | num | 接收者id | `receiver_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| msg_type | num | 消息类型 | 详见[私信消息类型、内容说明](private_msg_content.md) | -| content | str | 消息内容 | [私信内容对象](private_msg_content.md)**经过 JSON 序列化后的文本** | -| msg_seqno | num | 消息序列号 | 按照时间顺序从小到大 | -| timestamp | num | 消息发送时间 | 秒级时间戳 | -| at_uids | 有效时:array
无效时:null | at的成员mid | 在粉丝团时有效;此项为 `null` 或 `[0]` 均表示没有 at 成员 | -| msg_key | num | 消息唯一id | 部分库在解析JSON对象中的大数时存在数值的精度丢失问题,因此在处理此字段时可能会出现问题,建议使用修复了这一问题的库(如将大数转换成文本) | -| msg_status | num | 消息状态 | 0:正常
1:被撤回(接口仍能返回被撤回的私信内容)
2:被系统撤回(如:消息被举报;私信将不会显示在前端,B站接口也不会返回被系统撤回的私信的信息)
50:图片已失效(私信内容为一张提示“图片出现问题”的图片) | -| sys_cancel | bool | 是否为系统撤回 | 仅当 `msg_type` 为 `5` 且此项值为 `true` 时有此项;若此项值为 `true`,表示目标消息是被系统撤回的,此时前端将不显示该私信且没有提示 | -| notify_code | str | 通知代码 | 发送通知时使用,以下划线 `_` 分割,第 1 项表示主业务 id,第 2 项表示子业务 id;若这条私信非通知则为空文本;详细信息有待补充 | -| new_face_version | num | 表情包版本 | 为 `0` 或无此项表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]`;`1` 为新版 | -| msg_source | num | 消息来源 | 见[消息来源列表](#消息来源列表msg_source) | - -`私信主体对象`中的`at_uids`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ------- | -| 0 | num | 用户1 | 成员mid | -| n | num | 用户(n+1) | | -| …… | num | …… | …… | - -### 消息来源列表(`msg_source`) - -| 代码 | 含义 | 备注 | -| ---- | ------------------------- | ----------------------------------- | -| 0 | 未知来源 | 在以前发送的部分私信的来源代码 | -| 1 | iOS | | -| 2 | Android | | -| 3 | H5 | | -| 4 | PC客户端 | | -| 5 | 官方推送消息 | 包括:官方向大多数用户自动发送的私信(如:UP主小助手的推广)等 | -| 6 | 推送/通知消息 | 包括:特别关注时稿件的自动推送、因成为契约者而自动发送的私信、包月充电回馈私信、官方发送的特定于自己的消息(如:UP主小助手的稿件审核状态通知)等 | -| 7 | Web | | -| 8 | 自动回复 - 被关注回复 | B站前端会显示“此条消息为自动回复” | -| 9 | 自动回复 - 收到消息回复 | B站前端会显示“此条消息为自动回复” | -| 10 | 自动回复 - 关键词回复 | B站前端会显示“此条消息为自动回复” | -| 11 | 自动回复 - 大航海上船回复 | B站前端会显示“此条消息为自动回复” | -| 12 | 自动推送 - UP 主赠言 | 在以前稿件推送消息与其附带的 UP 主赠言是 2 条不同的私信(其中 UP 主赠言的消息来源代码为 12),现在 UP 主赠言已并入为[稿件自动推送消息](private_msg_content.md#视频推送消息msg_type11)的一部分(`attach_msg`) | -| 13 | 粉丝团系统提示 | 如:粉丝团中的提示信息“欢迎xxx入群” | -| 16 | 系统 | 目前仅在 `msg_type` 为 `51` 时使用该代码 | -| 17 | 互相关注 | 互相关注时自动发送的私信“我们已互相关注,开始聊天吧~” | -| 18 | 系统提示 | 目前仅在 `msg_type` 为 `18` 时使用该代码,如:“对方主动回复或关注你前,最多发送1条消息” | -| 19 | AI | 如:给[搜索AI助手测试版](https://space.bilibili.com/1400565964/)发送私信时对方的自动回复 | - -## 会话相关 - -### 获取未读私信数 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -注: 该接口默认每 2 分钟请求一次;该接口不会返回[未读粉丝团私信数](#获取未读粉丝团私信数) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------------ | ---- | -------------------------- | ------ | -------------------------------------------------------------------------- | -| unread_type | num | 未读类型 | 非必要 | 0:所有
1:仅已关注
2:仅未关注
3:仅被拦截 (须同时设置参数 `show_dustbin=1`)
默认为 `0` | -| show_unfollow_list | num | 是否返回未关注人推送消息数 | 非必要 | 0:否
1:是 | -| show_dustbin | num | 是否返回被拦截私信数 | 非必要 | 0:否
1:是 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------------- | ---- | ------------------------ | ---------------- | -| unfollow_unread | num | 未读未关注用户私信数 | | -| follow_unread | num | 未读已关注用户私信数 | | -| unfollow_push_msg | num | 未读未关注用户推送消息数 | | -| dustbin_push_msg | num | 未读被拦截的推送消息数 | | -| dustbin_unread | num | 未读被拦截的私信数 | | -| biz_msg_unfollow_unread | num | 未读未关注用户通知数 | | -| biz_msg_follow_unread | num | 未读已关注用户通知数 | | -| custom_unread | num | 未读客服消息数 | | - -**示例:** - -以下信息代表未读未关注用户私信数为 `1` 条,未读已关注用户私信数为 `6` 条 - -```shell -curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/single_unread' \ - --data-urlencode 'unread_type=0' \ - --data-urlencode 'show_unfollow_list=1' \ - --data-urlencode 'show_dustbin=1' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "unfollow_unread": 1, - "follow_unread": 6, - "unfollow_push_msg": 0, - "dustbin_push_msg": 0, - "dustbin_unread": 0, - "biz_msg_unfollow_unread": 0, - "biz_msg_follow_unread": 0, - "custom_unread": 0 - } -} -``` - -
- -### 获取未读粉丝团私信数 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------- | ---------------- | -| unread_count | num | 未读粉丝团私信数 | | - -**示例:** - -以下信息代表未读粉丝团私信数为 `497` 条 - -```shell -curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/my_group_unread' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "unread_count": 497 - } -} -``` - -
- -### 获取指定类型会话列表 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | -------------------- | ------ | ------------------------- | -| session_type | num | 会话类型 | 必要 | 1:用户与系统
2:未关注人
3:粉丝团
4:所有
5:被拦截
6:花火商单
7:所有系统消息
8:陌生人(与 “未关注人” 不同,不包含官方消息)
9:关注的人与系统 | -| group_fold | num | 是否折叠粉丝团消息 | 非必要 | 0:否
1:是 | -| unfollow_fold | num | 是否折叠未关注人消息 | 非必要 | 0:否
1:是 | -| sort_rule | num | 排序方式 | 非必要 | 仅当 `session_type` 不为 `4`、`7` 时有效
1、2:按会话时间逆向排序
3:按已读时间逆向排序
其他:用户与系统按会话时间逆向排序,粉丝团按加入时间正向排序 | -| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 | -| end_ts | num | 终止时间 | 非必要 | 微秒级时间戳 | -| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
2:非法参数 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------------- | ---- | ---------------------------- | ------------------------ | -| session_list | 有会话时:array
无会话时:null | 会话列表 | | -| has_more | num | 是否有更多会话 | | -| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | | -| is_address_list_empty | num | 0 | **作用尚不明确** | -| system_msg | obj | 系统会话列表 | 仅当存在系统会话时有此项 | -| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `true` | - -`data`对象中的`session_list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ------------------------- | -| 0 | obj | 会话1 | 详见[会话对象](#会话对象) | -| n | obj | 会话(n+1) | | -| …… | obj | …… | …… | - -`data`对象中的`system_msg`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ---------- | ---------------------------------------------------------- | -| {系统会话类型代码} | num | 系统会话id | 详见[会话对象](#会话对象)中对 `system_msg_type` 字段的说明 | - -**示例:** - -获取所有类型的会话列表: - -```shell -curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions' \ - --data-urlencode 'session_type=4' \ - --data-urlencode 'group_fold=0' \ - --data-urlencode 'unfollow_fold=0' \ - --data-urlencode 'sort_rule=2' \ - --data-urlencode 'size=3' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "session_list": [ - { - "talker_id": 844424930131966, - "session_type": 1, - "at_seqno": 0, - "top_ts": 0, - "group_name": "", - "group_cover": "", - "is_follow": 1, - "is_dnd": 0, - "ack_seqno": 1238729956474887, - "ack_ts": 1709536924979884, - "session_ts": 1712305278098351, - "unread_count": 4, - "last_msg": { - "sender_uid": 844424930131966, - "receiver_type": 1, - "receiver_id": 425503913, - "msg_type": 10, - "content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励,快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}", - "msg_seqno": 1285290404823041, - "timestamp": 1712305278, - "at_uids": null, - "msg_key": 7354295169819585966, - "msg_status": 0, - "notify_code": "2091_253", - "new_face_version": 1, - "msg_source": 6 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 1285290404823041, - "new_push_msg": 1, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 7, - "account_info": { - "name": "UP主小助手", - "pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png" - }, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - }, - { - "talker_id": 293793435, - "session_type": 1, - "at_seqno": 0, - "top_ts": 0, - "group_name": "", - "group_cover": "", - "is_follow": 1, - "is_dnd": 0, - "ack_seqno": 1236306587877408, - "ack_ts": 1709536984481314, - "session_ts": 1709385615744065, - "unread_count": 0, - "last_msg": { - "sender_uid": 293793435, - "receiver_type": 1, - "receiver_id": 425503913, - "msg_type": 11, - "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", - "msg_seqno": 1236306587877408, - "timestamp": 1709385615, - "at_uids": null, - "msg_key": 7341755312943193481, - "msg_status": 0, - "notify_code": "", - "new_face_version": 1, - "msg_source": 6 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 1236306587877408, - "new_push_msg": 0, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 0, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - }, - { - "talker_id": 221082140, - "session_type": 2, - "at_seqno": 0, - "top_ts": 0, - "group_name": "社会易姐QwQ的应援团", - "group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "is_follow": 0, - "is_dnd": 0, - "ack_seqno": 20, - "ack_ts": 1695011620552332, - "session_ts": 1693626568439784, - "unread_count": 0, - "last_msg": { - "sender_uid": 0, - "receiver_type": 2, - "receiver_id": 221082140, - "msg_type": 306, - "content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}", - "msg_seqno": 20, - "timestamp": 1693626568, - "at_uids": null, - "msg_key": 7274070721607234847, - "msg_status": 0, - "notify_code": "", - "msg_source": 13 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 20, - "new_push_msg": 0, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 0, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - } - ], - "has_more": 1, - "anti_disturb_cleaning": false, - "is_address_list_empty": 0, - "system_msg": { - "1": 844424930131967, - "7": 844424930131966, - "9": 844424930131965 - }, - "show_level": true - } -} -``` - -
- -### 获取新会话列表 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -获取指定时间之后的新会话列表 - -注:该接口默认每 20 秒请求一次 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------------------- | -| begin_ts | num | 起始时间 | 非必要 | 微秒级时间戳 | -| size | num | 返回的会话数 | 非必要 | 默认为 `20`,最大为 `100` | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------------- | ---- | ---------------------------- | ---------------------- | -| session_list | 有会话时:array
无会话时:null | 会话列表 | 按发送时间顺序逆向排序 | -| has_more | num | 是否有更多会话 | | -| anti_distrub_cleaning | bool | 是否开启了“一键防骚扰”功能 | | -| is_address_list_empty | num | 0 | **作用尚不明确** | -| show_level | bool | 是否在会话列表中显示用户等级 | 目前恒为 `false` | - -`data`对象中的`session_list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ------------------------- | -| 0 | obj | 会话1 | 详见[会话对象](#会话对象) | -| n | obj | 会话(n+1) | | -| …… | obj | …… | …… | - -**示例:** - -获取`begin_ts=1712420213519391`之后的新会话列表: - -```shell -curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/new_sessions' \ - --data-urlencode 'begin_ts=1712420213519391' \ - --data-urlencode 'size=3' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "session_list": [ - { - "talker_id": 844424930131966, - "session_type": 1, - "at_seqno": 0, - "top_ts": 0, - "group_name": "", - "group_cover": "", - "is_follow": 1, - "is_dnd": 0, - "ack_seqno": 1238729956474887, - "ack_ts": 1709536924979884, - "session_ts": 1712305278098351, - "unread_count": 4, - "last_msg": { - "sender_uid": 844424930131966, - "receiver_type": 1, - "receiver_id": 425503913, - "msg_type": 10, - "content": "{\"title\":\"流量奖励到账通知\",\"text\":\"恭喜您已获得2000流量曝光奖励,快来投稿使用吧。\",\"jump_text\":\"\",\"jump_uri\":\"\",\"modules\":null,\"jump_text_2\":\"\",\"jump_uri_2\":\"\",\"jump_text_3\":\"\",\"jump_uri_3\":\"\",\"notifier\":null,\"jump_uri_config\":{\"all_uri\":\"https://member.bilibili.com/york/flow-reward?navhide=1\\u0026from=msgrecall\",\"text\":\"\"},\"jump_uri_2_config\":{\"text\":\"\"},\"jump_uri_3_config\":{\"text\":\"\"},\"biz_content\":null}", - "msg_seqno": 1285290404823041, - "timestamp": 1712305278, - "at_uids": null, - "msg_key": 7354295169819585966, - "msg_status": 0, - "notify_code": "2091_253", - "new_face_version": 1, - "msg_source": 6 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 1285290404823041, - "new_push_msg": 1, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 7, - "account_info": { - "name": "UP主小助手", - "pic_url": "https://message.biliimg.com/bfs/im/489a63efadfb202366c2f88853d2217b5ddc7a13.png" - }, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - }, - { - "talker_id": 293793435, - "session_type": 1, - "at_seqno": 0, - "top_ts": 0, - "group_name": "", - "group_cover": "", - "is_follow": 1, - "is_dnd": 0, - "ack_seqno": 1236306587877408, - "ack_ts": 1709536984481314, - "session_ts": 1709385615744065, - "unread_count": 0, - "last_msg": { - "sender_uid": 293793435, - "receiver_type": 1, - "receiver_id": 425503913, - "msg_type": 11, - "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", - "msg_seqno": 1236306587877408, - "timestamp": 1709385615, - "at_uids": null, - "msg_key": 7341755312943193481, - "msg_status": 0, - "notify_code": "", - "new_face_version": 1, - "msg_source": 6 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 1236306587877408, - "new_push_msg": 0, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 0, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - }, - { - "talker_id": 221082140, - "session_type": 2, - "at_seqno": 0, - "top_ts": 0, - "group_name": "社会易姐QwQ的应援团", - "group_cover": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "is_follow": 0, - "is_dnd": 0, - "ack_seqno": 20, - "ack_ts": 1695011620552332, - "session_ts": 1693626568439784, - "unread_count": 0, - "last_msg": { - "sender_uid": 0, - "receiver_type": 2, - "receiver_id": 221082140, - "msg_type": 306, - "content": "{\"group_id\":221082140,\"content\":\"欢迎罗板栗入群\"}", - "msg_seqno": 20, - "timestamp": 1693626568, - "at_uids": null, - "msg_key": 7274070721607234847, - "msg_status": 0, - "notify_code": "", - "msg_source": 13 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 20, - "new_push_msg": 0, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 0, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - } - ], - "has_more": 0, - "anti_disturb_cleaning": false, - "is_address_list_empty": 0, - "show_level": false - } -} -``` - -
- -### 获取会话详细信息 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -若从未与该会话聊过天,则返回 1000004 `入口节点已存在` 错误 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ---------------- | ------ | ------------------------------------------------------ | -| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
1000004:入口节点已存在 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj
无效时:null | 数据本体 | 详见[会话对象](#会话对象) | - -**示例:** - -获取会话`talker_id=293793435&session_type=1`的详细信息: - -```shell -curl -G 'https://api.vc.bilibili.com/session_svr/v1/session_svr/session_detail' \ - --data-urlencode 'talker_id=293793435' \ - --data-urlencode 'session_type=1' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "talker_id": 293793435, - "session_type": 1, - "at_seqno": 0, - "top_ts": 0, - "group_name": "", - "group_cover": "", - "is_follow": 1, - "is_dnd": 0, - "ack_seqno": 1236306587877408, - "ack_ts": 1709536984481314, - "session_ts": 1709385615744065, - "unread_count": 0, - "last_msg": { - "sender_uid": 293793435, - "receiver_type": 1, - "receiver_id": 425503913, - "msg_type": 11, - "content": "{\"title\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"times\":14,\"cover\":\"http://i0.hdslb.com/bfs/archive/8821c03ab27a0bcf2bf32af814e758ab17a1e27e.png\",\"rid\":1951316064,\"type_\":8,\"desc\":\"OHHHHHH家人们,我分数终于破w了!紫框了这下确实不好意思说自己是只打红谱的萌新了\",\"bvid\":\"BV1zC411p7JN\",\"view\":452,\"danmaku\":0,\"pub_date\":1709385603,\"attach_msg\":null}", - "msg_seqno": 1236306587877408, - "timestamp": 1709385615, - "at_uids": null, - "msg_key": 7341755312943193481, - "msg_status": 0, - "notify_code": "", - "new_face_version": 1, - "msg_source": 6 - }, - "group_type": 0, - "can_fold": 0, - "status": 0, - "max_seqno": 1236306587877408, - "new_push_msg": 0, - "setting": 0, - "is_guardian": 0, - "is_intercept": 0, - "is_trust": 0, - "system_msg_type": 0, - "live_status": 0, - "biz_msg_unread_count": 0, - "user_label": null - } -} -``` - -
- -### 获取会话限制状态 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -仅支持用户会话 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| uid | num | 聊天对象mid | 必要 | | -| type | num | 1 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------------ | ---------------------------- | -| is_limit | num | 用户是否被封禁 | | -| report_limit | num | 自己是否被限制举报该会话 | 常见于自己被封禁时出现该情况 | - -**示例:** - -获取`uid=123`的限制状态: - -```shell -curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/is_limit' \ - --data-urlencode 'uid=123' \ - --data-urlencode 'type=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "is_limit": 0, - "report_limit": 0 - } -} -``` - -
- -### 获取会话免打扰状态 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ---------------- | ------ | ----------------------- | -| own_uid | num | 自己的mid | 必要 | | -| uids | num | 用户mid | 非必要 | 仅支持填入 **1 个** mid | -| group_ids | num | 粉丝团id | 非必要 | 仅支持填入 **1 个** id | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | ---------------- | ------------------------------------- | -| uid_settings | array | 用户免打扰状态 | 仅当请求参数 `uids` 存在时有此项 | -| group_settings | array | 粉丝团免打扰状态 | 仅当请求参数 `group_ids` 存在时有此项 | - -`data`对象中的`uid_settings`、`group_settings`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | --------------------------------- | -| 0 | obj | 会话免打扰状态 | 仅有1项 | - -`uid_settings`、`group_settings`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ----------------- | -------------------------------- | -| id | num | 用户mid或粉丝团id | | -| setting | num | 免打扰状态 | 0:关闭免打扰
1:开启免打扰 | - -**示例:** - -获取会话`uids=2`与`group_ids=221082140`的免打扰状态: - -```shell -curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_msg_dnd' \ - --data-urlencode 'own_uid=425503913' \ - --data-urlencode 'uids=2' \ - --data-urlencode 'group_ids=221082140' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "uid_settings": [{ - "id": 2, - "setting": 0 - }], - "group_settings": [{ - "id": 221082140, - "setting": 0 - }] - } -} -``` - -
- -### 获取会话推送设置 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -仅支持用户会话 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ---------------- | ------ | ------------- | -| talker_uid | num | 聊天对象mid | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ---------------------- | ----------------------------------- | -| follow_status | num | 对方对于自己的关注属性 | 0:未关注
~~1:悄悄关注(现已下线)~~
2:已关注
6:已互粉
128:已拉黑 | -| special | num | 自己是否特别关注了对方 | | -| push_setting | num | 推送设置 | 0:接收推送
1:不接收推送 | -| show_push_setting | num | 是否显示推送设置 | | - -**示例:** - -获取`talker_uid=123`的推送设置: - -```shell -curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_session_ss' \ - --data-urlencode 'talker_uid=123' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "follow_status": 6, - "special": 1, - "push_setting": 0, - "show_push_setting": 1 - } -} -``` - -
- -### 设置会话为已读 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -将指定会话中的指定消息及以前的消息设置为已读 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | -| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | -| ack_seqno | num | 设置为已读的消息序列号 | 非必要 | 留空表示最新的消息 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -将`talker_id=293793435`、`session_type=1`的`ack_seqno=1236306587877408`消息及之前的消息设置为已读 - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_ack' \ - --data-urlencode 'talker_id=293793435' \ - --data-urlencode 'session_type=1' \ - --data-urlencode 'ack_seqno=1236306587877408' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 移除指定会话 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -将指定会话从会话列表中移除,不会删除聊天记录 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | -| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -移除会话`talker_id=2&session_type=1` - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/remove_session' \ - --data-urlencode 'talker_id=2' \ - --data-urlencode 'session_type=1' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 修改会话置顶状态 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | ------ | ---------------------------------------------------- | -| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | -| op_type | num | 操作类型 | 必要 | 0:置顶
1:取消置顶 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -置顶会话`talker_id=293793435&session_type=1` - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/set_top' \ - --data-urlencode 'talker_id=293793435' \ - --data-urlencode 'session_type=1' \ - --data-urlencode 'op_type=0' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 修改会话免打扰状态 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | ------------ | -------------------------------- | -| uid | num | 自己的mid | 非必要 | | -| setting | num | 免打扰设置 | 必要 | 0:取消免打扰
1:开启免打扰 | -| dnd_uid | num | 用户mid | 必要(可选) | 当聊天对象为用户时有效 | -| dnd_group_id | num | 粉丝团id | 必要(可选) | 当聊天对象为粉丝团时有效 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -对会话`dnd_uid=2`开启免打扰 - -```shell -curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set_msg_dnd' \ - --data-urlencode 'uid=425503913' \ - --data-urlencode 'setting=1' \ - --data-urlencode 'dnd_uid=2' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 修改会话推送设置 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -仅支持用户会话 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------------------------ | -| talker_uid | num | 聊天对象mid | 必要 | | -| setting | num | 推送设置 | 必要 | 0:接收推送
1:不接收推送 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -修改`talker_uid=2`的推送设置为不接收推送 - -```shell -curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set_push_ss' \ - --data-urlencode 'talker_uid=2' \ - --data-urlencode 'setting=1' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 修改会话拦截状态 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -仅支持用户会话 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ---------------------------- | -| talker_id | num | 聊天对象mid | 必要 | | -| status | num | 拦截状态 | 必要 | 0:取消拦截
1:设置拦截 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -对会话`talker_id=2`取消拦截状态 - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/update_intercept' \ - --data-urlencode 'talker_id=2' \ - --data-urlencode 'status=0' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 设置所有拦截会话为已读 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------- | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/batch_update_dustbin_ack' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -### 移除所有拦截会话 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------- | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 成功时为0 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:不存在该项 | 信息本体 | 空对象 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/session_svr/v1/session_svr/batch_rm_dustbin' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 私信消息相关 - -### 查询私信消息记录 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -仅调用该接口不会设置会话为已读,详见[设置会话为已读](#设置会话为已读) - -此接口有设计缺陷,可以获取已经撤回(`msg_status` 为 `1`)的私信内容 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------------- | ---- | ---------------- | ------ | ------------------------------------------------------ | -| talker_id | num | 聊天对象的id | 必要 | `session_type` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| session_type | num | 聊天对象的类型 | 必要 | 1:用户
2:粉丝团 | -| size | num | 返回消息数量 | 非必要 | 默认为 0,最大为 2000
当本参数为 `0` 或不存在时,只返回系统提示 | -| begin_seqno | num | 开始的序列号 | 非必要 | 提供本参数时返回以本序列号开始(不包括本序列号)的消息 | -| end_seqno | num | 结束的序列号 | 非必要 | 提供本参数时返回以本序列号结束(不包括本序列号)的消息 | -| sender_device_id | num | 发送者设备 | 非必要 | 默认为 `1` | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等;**若本参数值为 `web`,则返回新版表情包** | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
2:非法参数
-101:账号未登录
-400:请求错误
700013:已解散QAQ,无法执行此操作
700014:你已不在此同萌中QAQ,无法执行此操作 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------------------------------ | ----------------------------------- | -| messages | 有私信时:array
无私信时:null | 私信列表 | 按发送时间顺序逆向排序 | -| has_more | num | 是否有更多私信 | | -| min_seqno | num | 所有消息中最小的序列号(最早) | 若无私信则为 `18446744073709551615` | -| max_seqno | num | 所有消息中最大的序列号(最晚) | 若无私信则为 `0` | -| e_infos | array | 聊天表情列表 | 若私信列表中无表情则无此项 | - -`data`对象中的`messages`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | --------------------------------- | -| 0 | obj | 私信1 | 详见[私信主体对象](#私信主体对象) | -| n | obj | 私信(n+1) | | -| …… | obj | …… | …… | - -`data`对象中的`e_infos`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 表情1 | | -| n | obj | 表情(n+1) | | -| …… | obj | …… | …… | - -`data`对象中的`e_infos`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ----------- | ----------------------------------- | -| text | str | 表情名称 | 包括左右两侧的中括号,如`[tv_doge]` | -| uri | str | 表情链接 | | -| size | num | 表情尺寸 | 1:小
2:大 | -| gif_url | str | 表情GIF链接 | 仅部分表情存在此项,如小电视表情 | - -**示例:** - -获取与目标用户`mid=123`的私信记录: - -```shell -curl -G 'https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs' \ - --data-urlencode 'talker_id=123' \ - --data-urlencode 'session_type=1' \ - --data-urlencode 'size=20' \ - --data-urlencode 'sender_device_id=1' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "messages": [ - { - "sender_uid": 2239814, - "receiver_type": 1, - "receiver_id": 123, - "msg_type": 1, - "content": "{\"content\":\"[口罩]\"}", - "msg_seqno": 309675413389322, - "timestamp": 1654154093, - "at_uids": [ - 0 - ], - "msg_key": 7104537732714964358, - "msg_status": 0, - "notify_code": "", - "new_face_version": 1, - "msg_source": 2 - }, - { - "sender_uid": 2239814, - "receiver_type": 1, - "receiver_id": 123, - "msg_type": 5, - "content": "{\"content\":\"1\"}", - "msg_seqno": 308302399586307, - "timestamp": 1654072255, - "at_uids": [ - 0 - ], - "msg_key": 7104186240789226795, - "msg_status": 0, - "notify_code": "", - "msg_source": 7 - - }, - ], - "has_more": 0, - "min_seqno": 308188515844097, - "max_seqno": 309675413389322, - "e_infos": [ - { - "text": "[口罩]", - "url": "http://i0.hdslb.com/bfs/emote/3ad2f66b151496d2a5fb0a8ea75f32265d778dd3.png", - "size": 1 - } - ] - } -} -``` - -
- -### 获取多个视频、番剧、专栏的信息 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -可用于获取私信中分享或推送的多个视频、番剧、专栏的信息 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ---------------- | ----------- | --------------------------------------------------------------------------------------------- | -| aids | nums | 视频AV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 | -| ep_ids | nums | 番剧epid列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,最多 50 个成员 | -| article_ids | nums | 专栏CV号列表 | 必要 (可选) | `aids`、`ep_ids` 与 `article_ids` 中须至少存在一个参数,每个成员间用 `,` 分隔,无成员限制 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------------ | --------------------------------------- | -| archive | array | 视频信息列表 | 仅在指定了 `aids` 参数时存在此项 | -| article | array | 专栏信息列表 | 仅在指定了 `article_ids` 参数时存在此项 | -| pgc | array | 番剧信息列表 | 仅在指定了 `ep_ids` 参数时存在此项 | - -`archive`、`article`、`pgc`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 信息1 | | -| n | obj | 信息(n+1) | | -| …… | obj | …… | …… | - -`archive`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------------------ | -| bvid | str | 视频BV号 | | -| aid | num | 视频AV号 | | -| title | str | 视频标题 | 若视频失效则为 `内容已失效` | -| pic | str | 视频封面 | 若视频失效则为空文本 | -| param | str | 提供的参数 | 即 AV 号的文本形式 | -| uri | str | 跳转url | `bilibili://video/{视频AV号}` | -| goto | str | `av` | | -| duration | num | 视频时长 | 以秒为单位,若视频失效则为 `0` | -| up_name | str | 视频UP主昵称 | | -| view | num | 视频播放量 | | -| danmaku | num | 视频弹幕数 | | -| status | num | 视频状态 | 0:正常
-1:已失效 | -| is_started | num | 1 | **作用尚不明确** | - -`article`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ------------ | --------------------------- | -| id | num | 专栏CV号 | | -| title | str | 专栏标题 | 若专栏失效则为 `内容已失效` | -| summary | str | 专栏内容概要 | 若专栏失效则为空文本 | -| template_id | num | (?) | **作用尚不明确** | -| up_name | str | 专栏UP主昵称 | 若专栏失效则为空文本 | -| image_urls | array | 专栏封面列表 | 若专栏失效则为空数组 | -| view_num | num | 专栏观看数 | 若专栏失效则为 `0` | -| like_num | num | 专栏点赞数 | 若专栏失效则为 `0` | -| reply_num | num | 专栏评论数 | 若专栏失效则为 `0` | -| status | num | 专栏状态 | 0:正常
-1:已失效 | - -`image_urls`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | str | 封面1 | | -| n | str | 封面(n+1) | | -| …… | str | …… | …… | - -`pgc`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | --------------------------- | -| ep_id | num | 番剧epid | | -| cover | str | 番剧封面url | | -| title | str | 番剧分享标题 | 如 `《{番剧名}》 第{n}话 {单集标题}`、`《{番剧名}》 {备注}` 等 | -| duration | num | 番剧时长 | 以秒为单位 | -| view | num | 番剧播放量 | | -| danmaku | num | 番剧弹幕数 | | -| url | str | 跳转url | `https://www.bilibili.com/bangumi/play/ep{番剧epid}` | - -**示例:** - -获取`aids=170001&ep_ids=780019&article_ids=1`的信息 - -```shell -curl -G 'https://api.vc.bilibili.com/x/im/feed/infoweb' \ - --data-urlencode 'aids=170001' \ - --data-urlencode 'ep_ids=780019' \ - --data-urlencode 'article_ids=1' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "archive": [ - { - "bvid": "BV17x411w7KC", - "aid": 170001, - "title": "【MV】保加利亚妖王AZIS视频合辑", - "pic": "http://i2.hdslb.com/bfs/archive/1ada8c32a9d168e4b2ee3e010f24789ba3353785.jpg", - "param": "170001", - "uri": "bilibili://video/170001?player_height=288&player_rotate=0&player_width=512", - "goto": "av", - "duration": 2412, - "up_name": "冰封.虾子", - "view": 44809333, - "danmaku": 913266, - "status": 0, - "is_started": 1 - } - ], - "article": [ - { - "id": 1, - "title": "未知的光", - "summary": "天空像是倾倒出的墨水,黑得静谧而深邃。黎明还远,光亮全无。夜不能寐。披衣,起床。茶香的弥漫,一盏灯的相伴。夜,你是我久别重逢的朋友,那一刹那的相见,带给了我久违的安思。如果不是梦魇的皮闹,我本不该投入", - "template_id": 4, - "up_name": "健行见远渐忘", - "image_urls": [ - "https://i0.hdslb.com/bfs/article/d2eedf1fd338bceca10099e2f7b33fa9017c859b.jpg" - ], - "view_num": 1608818, - "like_num": 32247, - "reply_num": 14143, - "status": 0 - } - ], - "pgc": [ - { - "ep_id": 780019, - "cover": "http://i0.hdslb.com/bfs/archive/ee28c04d15fb133a9c70c502fabfbdc7e5051ffe.png", - "title": "《铃芽之旅》 新海诚集大成之作", - "duration": 7283, - "view": 22088209, - "danmaku": 93069, - "url": "https://www.bilibili.com/bangumi/play/ep780019" - } - ] - } -} -``` - -
- -### 发送私信(web端) - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -**仅支持发送 `msg[msg_type]` 为 `1`、`2` 或 `5` 的私信** - -调用该接口会将该会话设置为已读 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | --------------- | ------ | ------------------------------------ | -| w_sender_uid | num | 发送者mid | 非必要 | 同正文参数 `msg[sender_uid]` | -| w_receiver_id | num | 接收者id | 非必要 | 同正文参数 `msg[receiver_id]` | -| w_dev_id | str | 设备id | 非必要 | 同正文参数 `msg[dev_id]` | -| w_rid | str | Wbi 签名 | 非必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | str | UNIX 秒级时间戳 | 非必要 | 参见 [Wbi 签名](../misc/sign/wbi.md) | - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------------------- | ---- | ------------------------ | ------ | ---------------------------------------------------- | -| msg\[sender_uid\] | num | 发送者mid | 必要 | 必须为自己的 mid | -| msg\[receiver_id\] | num | 接收者id | 必要 | `msg[receiver_type]` 为 `1` 时表示用户 mid,为 `2` 时表示粉丝团 id | -| msg\[receiver_type\] | num | 接收者类型 | 必要 | 1:用户
2:粉丝团 | -| msg\[msg_type\] | num | 消息类型 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md)
**此接口仅支持传入 `1`、`2` 或 `5`** | -| msg\[msg_status\] | num | 消息状态 | 非必要 | 恒为 `0` | -| msg\[dev_id\] | str | 设备id | 必要 | 实质上即 UUID(版本 4),**生成方式见下** | -| msg\[timestamp\] | num | 当前时间戳(秒) | 必要 | | -| msg\[new_face_version\] | num | 表情包版本 | 非必要 | 提供 `0` 或者未提供本参数表示旧版表情包,此时 B 站会自动转换成新版表情包,例如 `[doge]` -> `[tv_doge]`;`1` 为新版 | -| msg\[content\] | str | 消息内容 | 必要 | 详见[私信消息类型、内容说明](private_msg_content.md),接受最多2000字节的内容 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - ---- - -**dev_id 的生成:** - -dev_id 实质上就是 UUID(版本 4) - -
-查看生成 UUID 的代码 - -#### Python - -```python -import uuid - -dev_id = str(uuid.uuid4()) -``` - -#### JavaScript - -以下代码适用于较新版的 JS 引擎(Chrome≥92,Firefox≥95,Safari≥15.4,Node.js≥19.0.0): - -```js -const dev_id = crypto.randomUUID(); -``` - -以下为通用代码(来自 [andywang425/BLTH](https://github.com/andywang425/BLTH/blob/45fe93e31754ca8bf07059d46266398e787dbf45/B%E7%AB%99%E7%9B%B4%E6%92%AD%E9%97%B4%E6%8C%82%E6%9C%BA%E5%8A%A9%E6%89%8B.js#L6618)): - -```js -const dev_id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (function (name) { - const randomInt = 16 * Math.random() | 0; - return ("x" === name ? randomInt : 3 & randomInt | 8).toString(16).toUpperCase(); -})); -``` - -#### Java - -```java -import java.util.UUID; - -public class Main { - private String getDevId() { - UUID uuid = UUID.randomUUID(); - return uuid.toString(); - } -} -``` - -
- ---- - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-3:系统错误
-101:账号未登录
-400:请求错误
10005:msgkey不存在
21007:消息过长,无法发送
21015:为了维护社区的良好秩序,只有绑定手机号的账号才能发送消息
21020:你发送消息频率过快,请稍后再发~
21026:不能给自己发送消息哦~
21028:由于系统升级,暂无法发送,敬请谅解
21035:该类消息暂时无法发送
21037:图片格式不合法,不要调戏接口啦
21041:消息已超期,不能撤回了哦
21042:消息已经撤回了哦
21046:你发消息的频率太高了,请在24小时后再发吧~
21047:对方主动回复或关注你前,最多发送1条消息~
25003:因对方隐私设置,暂无法给他发送聊天消息
25005:你已拉黑了对方,请先将对方移出黑名单后才能聊天
700013:已解散QAQ,无法执行此操作
700014:你已不在此同萌中QAQ,无法执行此操作 | -| message | str | 错误信息 | 成功时为0 | -| ttl | num | | 默认为1 | -| data | 有效时:obj
无效时:null | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | ---------- | --------------------------------------------------------------------- | -| msg_key | num | 消息唯一id | | -| e_infos | array | 表情列表 | 仅当请求参数 `msg[msg_type]` 为 `1`,且私信内容中有表情时有此项 | -| msg_content | str | 发送的私信内容 | 一般同请求参数 `msg[content]` 的值,仅当请求参数 `msg[msg_type]` 为 `1` 时有此项 | -| key_hit_infos | obj | 触发的提示 | 仅当请求参数 `msg[msg_type]` 为 `1` 且 `msg[receiver_type]` 为 `1` 时有此项 | - -`e_infos`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 表情1 | | -| n | obj | 表情(n+1) | | -| …… | obj | …… | …… | - -`e_infos`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ----------- | ----------------------------------- | -| text | str | 表情名称 | 包括左右两侧的中括号,如 `[tv_doge]` | -| uri | str | 表情链接 | | -| size | num | 表情尺寸 | 1:小
2:大 | -| gif_url | str | 表情GIF链接 | 仅部分表情存在此项,如小电视表情 | - -`key_hit_infos`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------------ | -------------------------------------- | -| toast | str | 提示信息文字 | 当触发了提示时有此项 | -| rule_id | num | 触发的规则id | 当触发了提示时有此项,详细信息有待补充 | -| high_text | array | 高亮的文本 | 当触发了提示时有此项 | - -`high_text`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---------------- | -| 0 | obj | 高亮文本1 | 详细信息有待补充 | -| n | obj | 高亮文本(n+1) | | -| …… | obj | …… | …… | - -**示例:** - -给目标用户`mid=1`发一条文字私信: - -> up主你好,
催更\[doge\] - -```shell -curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \ - --data-urlencode 'msg[sender_uid]=293793435' \ - --data-urlencode 'msg[receiver_id]=1' \ - --data-urlencode 'msg[receiver_type]=1' \ - --data-urlencode 'msg[msg_type]=1' \ - --data-urlencode 'msg[msg_status]=0' \ - --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ - --data-urlencode 'msg[timestamp]=1626181379' \ - --data-urlencode 'msg[new_face_version]=1' \ - --data-urlencode 'msg[content]={"content":"up主你好,\n催更[doge]"}' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "msg_key": 6984393491767669026, - "e_infos": [ - { - "text": "[doge]", - "url": "https://i0.hdslb.com/bfs/emote/3087d273a78ccaff4bb1e9972e2ba2a7583c9f11.png", - "size": 1 - } - ], - "msg_content": "{\"content\":\"up主你好,\\n催更[doge]\"}", - "key_hit_infos": {} - } -} -``` - -
- -给目标用户`mid=1`发一条图片私信: - -> - -```shell -curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \ - --data-urlencode 'msg[sender_uid]=293793435' \ - --data-urlencode 'msg[receiver_id]=1' \ - --data-urlencode 'msg[receiver_type]=1' \ - --data-urlencode 'msg[msg_type]=2' \ - --data-urlencode 'msg[msg_status]=0' \ - --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ - --data-urlencode 'msg[timestamp]=1626181379' \ - --data-urlencode 'msg[content]={"url":"https://i1.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg","height":300,"width":300,"imageType":"jpeg","original":1,"size":54.144}' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "data": { - "msg_key": 6852570013146024354 - } -} -``` - -
- -给目标用户`mid=1`发送会触发提示的私信: - -> 支付宝 - -```shell -curl 'https://api.vc.bilibili.com/web_im/v1/web_im/send_msg' \ - --data-urlencode 'msg[sender_uid]=293793435' \ - --data-urlencode 'msg[receiver_id]=1' \ - --data-urlencode 'msg[receiver_type]=1' \ - --data-urlencode 'msg[msg_type]=1' \ - --data-urlencode 'msg[msg_status]=0' \ - --data-urlencode 'msg[dev_id]=372778FD-E359-461D-86A3-EA2BCC6FF52A' \ - --data-urlencode 'msg[timestamp]=1626181379' \ - --data-urlencode 'msg[content]={"content":"支付宝"}' \ - --data-urlencode 'csrf=xxx' \ - --data-urlencode 'csrf_token=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "msg_key": 6984393491767669026, - "msg_content": "{\"content\":\"支付宝\"}", - "key_hit_infos": { - "toast": "【温馨提示】为保障消费者权益,根据平台规则,如创作者在与消费者沟通中进行发布要求非法转账、欺诈转账等违规行为,平台有权对此进行处罚,感谢您的理解。", - "rule_id": 2, - "high_text": [{}] - } - } -} -``` - -
diff --git a/docs/message/private_msg_content.md b/docs/message/private_msg_content.md deleted file mode 100644 index 21a5deb..0000000 --- a/docs/message/private_msg_content.md +++ /dev/null @@ -1,627 +0,0 @@ -# 私信消息类型、内容说明 - -## 通用消息类型 - -以下消息类型适用于大多数会话 - -### 文字消息(`msg_type=1`) - -在发送私信时,请确保下面的对象合法且 `content` 项的值为非空文本,否则会提示 `请求错误` - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---- | -| content | str | 私信内容 | | - -**示例:** - -内容为 `Hello` 的文字消息 - -```json -{ - "content": "Hello" -} -``` - -### 图片消息(`msg_type=2`) - -在发送私信时,请确保下面的对象合法且 `url` 项的值为 B 站的图床 url,否则会报 21037 `图片格式不合法,不要调戏接口啦` 错误 - -建议设置 `height` 与 `width` 属性为图片的尺寸,否则可能会导致消息显示异常 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------- | ------------------------- | -| url | str | 图片url | 一般为 B 站图床 url | -| height | num | 图片高度 | 单位:像素(非必要) | -| width | num | 图片宽度 | 单位:像素(非必要) | -| imageType | str | 图片格式 | (非必要) | -| original | num | 是否为原图 | 当本参数值为 `1` 时,APP上会出现“下载原图”按钮(非必要) | -| size | num | 文件大小 | 单位:千字节(非必要) | - -**示例:** - -图片 `https://message.biliimg.com/bfs/im_new/c161fdf51d901c1607a15e30f10116dd425503913.jpg` - -```json -{ - "url": "https://message.biliimg.com/bfs/im_new/c161fdf51d901c1607a15e30f10116dd425503913.jpg", - "height": 300, - "width": 300, - "imageType": "jpeg", - "original": 1, - "size": 55.443 -} -``` - -### 撤回消息(`msg_type=5`) - -内容为目标私信的 `msg_key` - -请确保目标私信存在、在撤回有效期(120 秒)里,且与发送的私信在同一会话内,只能撤回自己发送的私信 - -成功发送此私信后,目标私信的 `msg_status` 会变成 `1`(在前端会显示目标私信被撤回) - -**示例:** - -假如存在 `msg_key` 为 `7345551441311046575` 的私信 A,用户发送了 `msg_type` 为 `5` 且 `content` 为以下内容的私信 B: - -```json -7345551441311046575 -``` - -若发送成功,则私信 A 会被撤回(在前端显示该消息被撤回),并且其 `msg_status` 也会变成 `1` - -### 自定义表情消息(`msg_type=6`) - -结构同[图片消息](#图片消息msg_type2) - -### 分享消息(`msg_type=7`) - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | -------------------------------------------------------------- | -| author | str | 分享内容作者 | 此项不实时更新,在发送私信时设置(非必要) | -| headline | str | 分享内容主标题 | 比 `title` 更突出;此项不实时更新,在发送私信时设置(非必要) | -| id | num | 分享内容id | | -| source | num | 分享内容类型 | ~~1:小视频~~(已弃用)
2:相簿
3:纯文字
4:直播(此类型不常用,见[分享其他内容消息](#分享其他内容消息msg_type14))
5:视频
6:专栏
7:番剧(`id` 为 season_id)
8:音乐
9:国产动画(`id` 为 AV 号)
10:图片
11:动态
16:番剧(`id` 为 epid)
17:番剧 | -| source_desc | str | 分享内容类型说明 | 仅当 `source` 值为 `16` 时有此项 | -| thumb | str | 分享内容封面 | 此项不实时更新,在发送私信时设置 | -| title | str | 分享内容标题 | 此项不实时更新,在发送私信时设置 | -| url | str | 分享内容url | (非必要) | -| bvid | str | 视频BV号 | 当 `source` 值为 `5` 时有效(非必要) | - -**示例:** - -分享 UP 主 “社会易姐QwQ” 的视频 av246551172/BV16v411e7CW - -```json -{ - "author": "社会易姐QwQ", - "headline": "", - "id": 246551172, - "source": 5, - "thumb": "http://i2.hdslb.com/bfs/archive/14ba78056f946ece8c954a10677ef6b073edb178.jpg", - "title": "合 成 大 東 瓜", - "bvid": "BV16v411e7CW" -} -``` - -### ~~系统撤回消息(`msg_type=8`)~~ - -~~此消息类型由于存在安全问题,已被弃用~~ - -
-查看此消息类型说明 - -此类型消息在接收时的 `msg_type` 的值为 `5`(而不是 `8`)且 `sys_cancel` 的值为 `true`,**仅在用户会话中有效;目前已不可直接发送** - -内容为目标私信的 `msg_key` - -请确保目标私信存在,且与发送的私信在同一会话内,只能撤回自己发送的私信;**不限制目标私信的发送时间** - -成功发送此私信后,目标私信的 `msg_status` 会变成 `2`(在前端会直接隐藏目标私信,且后端也不会返回目标私信的任何信息) - -
- -### 小程序消息(`msg_type=9`) - -由于 B 站并没有对外公开小程序,此消息类型不常用 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ------------------------- | -| avatar | str | 小程序图标 | | -| cover | str | 小程序封面 | | -| id | str | 小程序id | | -| jump_uri | str | 小程序链接 | | -| label_cover | str | 标签图标 | | -| label_name | str | 标签文字内容 | 一般为 `小程序` | -| name | str | 小程序名称 | | -| title | str | 小程序标题 | | - -**示例:** - -分享 “主站测试专用小程序” - -```json -{ - "avatar": "http://i0.hdslb.com/bfs/mall/mall/7b/dd/7bdd072290de017593791b52e937ca29.png", - "cover": "http://i0.hdslb.com/bfs/mall/mall/7b/dd/7bdd072290de017593791b52e937ca29.png", - "id": "bili91e3e7e93af281f9", - "jump_uri": "https://mall.bilibili.com/miniapp/bili91e3e7e93af281f9/pages/main?___timestamp=1689526821040&_biliFrom=about_bili_message&share_medium=android&share_source=bili_message&bbid=XU8CE838022AF6625C64B2153A3EF1E571AFF&ts=1689526821048", - "label_cover": "https://i0.hdslb.com/bfs/mall/mall/ae/0e/ae0ee4a857df5e307e1d04b5d420cb5b.png", - "label_name": "小程序", - "name": "主站测试专用小程序", - "title": "主站测试专用小程序" -} -``` - -### 通知消息(`msg_type=10`) - -此类型消息仅可接收,**不可直接发送** - -**按钮显示逻辑说明:** - -- **按钮的url**:首先尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中表示当前设备类型的 url(如 `web_uri`、`android_uri` 等);若为空值,则尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中 `all_uri` 的值;若仍为空值,则读取根对象中 `jump_uri`、`jump_uri_2`、`jump_uri_3` 的值;若仍为空值,则不显示该按钮(无论提示文字是否为空) -- **按钮提示文字**:若按钮是可见的,则先尝试读取 `jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config` 对象中 `text` 的值;若为空值,则读取根对象中 `jump_text`、`jump_text_2`、`jump_text_3` 的值;若仍为空值,则提示文字为 `查看详情` - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ------------- | ------------------------- | -| title | str | 通知标题 | | -| text | str | 通知内容 | | -| jump_text | str | 按钮1提示文字 | 若按钮1不存在则为空;若按钮1存在,此项也可能为空,此时前端显示文字为 `查看详情` | -| jump_uri | str | 按钮1跳转链接 | 若按钮1不存在则为空 | -| modules | 有效时:array
无效时:null | 详细信息 | | -| jump_text_2 | str | 按钮2提示文字 | 若按钮2不存在则为空;若按钮2存在,此项也可能为空,此时前端显示文字为 `查看详情` | -| jump_uri_2 | str | 按钮2跳转链接 | 若按钮2不存在则为空 | -| jump_text_3 | str | 按钮3提示文字 | 若按钮3不存在则为空;若按钮3存在,此项也可能为空,此时前端显示文字为 `查看详情` | -| jump_uri_3 | str | 按钮3跳转链接 | 若按钮3不存在则为空 | -| notifier | 有效时:obj
无效时:null | 发送者信息 | | -| jump_uri_config | obj | 按钮1配置 | | -| jump_uri_2_config | obj | 按钮2配置 | | -| jump_uri_3_config | obj | 按钮3配置 | | -| biz_content | 有效时:obj
无效时:null | 扩展信息 | | - -`modules`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 详细信息1 | | -| n | obj | 详细信息(n+1) | | -| …… | obj | …… | …… | - -`modules`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---- | ---- | -| title | str | 标题 | | -| detail | str | 内容 | | - -`notifier`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | ------ | -| avatar_url | str | 发送者头像 | | -| nickname | str | 发送者名称 | | -| jump_url | str | 发送者链接 | 可为空 | - -`jump_uri_config`、`jump_uri_2_config`、`jump_uri_3_config`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------------------- | -------------------- | -| all_uri | str | 所有设备的跳转链接 | 若按钮不存在则无此项 | -| android_uri | str | Android客户端的跳转链接 | 若按钮不存在则无此项 | -| iphone_uri | str | iPhone客户端的跳转链接 | 若按钮不存在则无此项 | -| ipad_uri | str | iPad客户端的跳转链接 | 若按钮不存在则无此项 | -| web_uri | str | 网页上的跳转链接 | 若按钮不存在则无此项 | -| text | str | 按钮提示文字 | 若按钮不存在则为空 | - -`biz_content`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ----------- | ---------------- | -| cover | str | 封面url | | -| backup_cover | str | 备用封面url | | -| refresh_type | num | (?) | **作用尚不明确** | -| biz_type | num | (?) | **作用尚不明确** | -| biz_id1 | str | (?) | **作用尚不明确** | -| biz_id2 | str | (?) | **作用尚不明确** | -| biz_status | num | (?) | **作用尚不明确** | - -**示例:** - -直播开始提醒 - -```json -{ - "title": "直播开始提醒", - "text": "你预约的直播已开始,快来围观吧~", - "jump_text": "进入直播间", - "jump_uri": "https://live.bilibili.com/22747055?broadcast_type=0&is_room_feed=1&live_from=27040", - "modules": [{ - "title": "预约主题", - "detail": "2024哔哩哔哩拜年纪" - }, { - "title": "开播时间", - "detail": "2024-02-09 19:32" - }, { - "title": "UP主", - "detail": "哔哩哔哩拜年纪" - }], - "jump_text_2": "", - "jump_uri_2": "", - "jump_text_3": "", - "jump_uri_3": "", - "notifier": null, - "jump_uri_config": { - "all_uri": "https://live.bilibili.com/22747055?broadcast_type=0&is_room_feed=1&live_from=27040", - "text": "进入直播间" - }, - "jump_uri_2_config": { - "text": "" - }, - "jump_uri_3_config": { - "text": "" - }, - "biz_content": { - "cover": "", - "backup_cover": "http://i0.hdslb.com/bfs/live/new_room_cover/bdae2665883ec8aa4e79aca16f3c5ee2df1da64f.jpg", - "refresh_type": 1, - "biz_type": 2, - "biz_id1": "1868902080", - "biz_id2": "473923647994271663", - "biz_status": 0 - } -} -``` - -### 视频推送消息(`msg_type=11`) - -此类型消息仅可接收,**不可直接发送**;有小概率会出现即使视频存在,也只会出现 `rid`、`type`(值为 `11` 或 `8`,注意其名称后面没有下划线)和 `attach_msg` 三项的现象 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------------------------------------------ | -| title | str | 视频标题 | 接收私信时实时更新此项,若视频失效则为空文本 | -| times | num | 视频时长 | 以秒为单位,接收私信时实时更新此项,若视频失效则为 `0` | -| cover | str | 视频封面 | 接收私信时实时更新此项,若视频失效则为空文本 | -| rid | num | 视频AV号 | | -| type_ | num | (?) | **作用尚不明确** | -| desc | str | 视频简介 | 接收私信时实时更新此项,若视频失效则为空文本 | -| bvid | str | 视频BV号 | | -| view | num | 视频播放量 | 接收私信时实时更新此项,若视频失效则为 `0` | -| danmaku | num | 视频弹幕数 | 接收私信时实时更新此项,若视频失效则为 `0` | -| pub_date | num | 视频发布时间 | 秒级时间戳,若视频失效则为 `0` | -| attach_msg | 有效时:obj
无效时:null | UP主赠言 | | - -`attach_msg`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------- | -| id | num | 赠言id | | -| content | str | 赠言内容 | 会自动加上 `UP主赠言:` 前缀,可能包含私信表情 | - -**示例:** - -推送视频 av740817783/BV1Dk4y1E7MZ - -```json -{ - "title": "【2023嵌入式大赛】浅浅测试一下龙芯开发板", - "times": 308, - "cover": "http://i2.hdslb.com/bfs/archive/880c937de9af758451aa94ee29771e0264c1903a.jpg", - "rid": 740817783, - "type_": 8, - "desc": "最近把龙芯开发板部分(任务一)程序完成了,时间非常紧迫,就不知道为啥突然给省赛加个(本来国赛的题\n从硬件焊接开始,到软件整完不过5天啊喂,肝疼,过几天比赛完发硬件制作过程\n硬件使用龙芯一号(LS1B010)SOC,软件使用 C 语言+FreeRTOS+VSCode 开发", - "bvid": "BV1Dk4y1E7MZ", - "view": 13492, - "danmaku": 5, - "pub_date": 1683381582, - "attach_msg": null -} -``` - -### 专栏推送消息(`msg_type=12`) - -此类型消息仅可接收,**不可直接发送**;有小概率会出现即使专栏存在,也只会出现 `rid`、`type`(值为 `12`)和 `attach_msg` 三项的现象 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ------------------------------------------------------ | -| rid | num | 专栏CV号 | | -| title | str | 专栏标题 | 接收私信时实时更新此项,若专栏失效则为 `内容已失效` | -| summary | str | 专栏内容概要 | 接收私信时实时更新此项,若专栏失效则为空文本 | -| author | str | 专栏UP主昵称 | 接收私信时实时更新此项,若专栏失效则为空文本 | -| view | num | 专栏观看数 | 接收私信时实时更新此项,若专栏失效则为 `0` | -| like | num | 专栏点赞数 | 接收私信时实时更新此项,若专栏失效则为 `0` | -| reply | num | 专栏评论数 | 接收私信时实时更新此项,若专栏失效则为 `0` | -| template_id | num | (?) | **作用尚不明确** | -| image_urls | 有效时:array
无效时:null | 专栏封面列表 | 接收私信时实时更新此项,若专栏失效则为 `null` | -| attach_msg | 有效时:obj
无效时:null | UP主赠言 | | -| pub_date | num | 专栏发布时间 | 秒级时间戳,若专栏失效则为 `0` | - -`image_urls`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | str | 封面1 | | -| n | str | 封面(n+1) | | -| …… | str | …… | …… | - -`attach_msg`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------- | -| id | num | 赠言id | | -| content | str | 赠言内容 | 会自动加上 `UP主赠言:` 前缀,可能包含私信表情 | - -**示例:** - -推送专栏 cv18275013 - -```json -{ - "rid": 18275013, - "title": "【单片机】遛弯捕捉到野生U盾,点亮它!", - "summary": "前一阵在学校那会,偶然的机会晚上饭后出去遛弯,在路边看到个被抛弃的 U盾,这么一想应该是附近拆迁搬东西时丢出去的,随即捕捉它。作为一个啥都折腾的捡垃圾技术宅肯定要去研究一波(笑是个建行的 U盾,按键部分还有点老灰,屏幕的尺寸盲猜 128x64,不可能再大了背面除了序列号没有别的东西,顶部有个盖子,像极了上古时期的 U盘插上充电宝可以正常点亮,至少屏没坏拆解&分析电路直接开拆,用刀片沿着四周缝隙插入并挑开卡扣内部结构挺简单,只有两颗较大的芯片,屏幕的 FPC 排线直接焊接在 PCB 上中间的这颗是", - "author": "社会易姐QwQ", - "view": 872, - "like": 38, - "reply": 7, - "template_id": 4, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/c7c60e018c43c5c3a6e1520239021ea2753b2880.jpg" - ], - "attach_msg": null, - "pub_date": 1661358081 -} -``` - -### 图片卡片消息(`msg_type=13`) - -此类型消息仅可接收,**不可直接发送** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------------- | -------------------- | -| pic_url | str | 图片url | | -| jump_url | str | 点击图片跳转到的url | | -| title | str | 文字说明 | 显示在聊天列表的文字 | - -**示例:** - -```json -{ - "pic_url": "http://i0.hdslb.com/bfs/location/9e57aff7245c226c05ba46ddd1e82667f74d5a06.png", - "jump_url": "https://www.bilibili.com/h5/mall/suit/detail?navhide=1&id=66359&from=Banner", - "title": "原神,启动!" -} -``` - -### 分享其他内容消息(`msg_type=14`) - -常见于分享直播 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---------------- | -------------------------------- | -| author | str | 分享内容作者 | 此项不实时更新,在发送私信时设置 | -| cover | str | 分享内容封面 | 此项不实时更新,在发送私信时设置 | -| desc | str | 分享内容简介 | 此项不实时更新,在发送私信时设置 | -| source | str | 分享内容类型说明 | 常见的值为 `直播` | -| title | str | 分享内容标题 | 此项不实时更新,在发送私信时设置 | -| url | str | 分享内容url | | - -**示例:** - -分享直播 ID 21738461 - -```json -{ - "author": "哔哩哔哩晚会", - "cover": "https://i1.hdslb.com/bfs/face/1b593d28fcd0cf63837c3ea80ac96d01bb85ec3b.jpg", - "desc": "主播:哔哩哔哩晚会 https://live.bilibili.com/21738461", - "source": "直播", - "title": "2023最美的夜 bilibili晚会", - "url": "https://live.bilibili.com/21738461?broadcast_type=0&is_room_feed=1&live_from=41000&share_medium=android&share_source=bili_message&bbid=XU8CE838022AF6625C64B2153A3EF1E571AFF&ts=1704038936971" -} -``` - -### 被关注时的自动推送消息(`msg_type=16`) - -一般仅在开启了 B 站的 “被关注回复” 功能与勾选 “被关注后,向关注我的人推送我的往期作品” 选项(仅部分用户会显示此选项)时才会发送此类型消息,紧接在自动发送的文字消息后面 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | ---------------- | -------------------------------------------- | -| main_title | str | 主标题 | 一般为 `更多宝藏内容` | -| reply_content | str | 自动回复文字内容 | 仅在聊天列表中的消息概要中显示此内容,在私信内容中不显示 | -| sub_cards | array | 推送的稿件列表 | 一般为3个 | - -`sub_cards`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 稿件1 | | -| n | obj | 稿件(n+1) | | -| …… | obj | …… | …… | - -`sub_cards`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | -------------------------------- | -| card_id | num | 稿件AV号 | | -| card_type | num | 稿件类型 | 一般为 `1` | -| jump_url | str | 稿件链接 | | -| cover_url | str | 稿件封面url | 此项不实时更新,在发送私信时设置 | -| field1 | str | 稿件标题 | 此项不实时更新,在发送私信时设置 | -| field2 | str | 稿件发布时间 | 格式:`YYYY-MM-DD` | -| field3 | str | 字段3 | 此项不实时更新,在发送私信时设置 | -| icon3 | num | 图标3类型 | 1:播放量
3:弹幕数
5:收藏量 | -| field4 | str | 字段4 | 此项不实时更新,在发送私信时设置 | -| icon4 | num | 图标4类型 | 1:播放量
3:弹幕数
5:收藏量 | - -**示例:** - -```json -{ - "main_title": "更多宝藏内容", - "reply_content": "感谢大佬关注哦~[doge][脱单doge][doge]\n这里是科技区底边小UP,日常瞎折腾,软硬件电路程序网络服务器都折腾,视频月更风格硬核略小众,咕咕咕.....\n老大二了,就不中二了\n有什么好的建议欢迎私信", - "sub_cards": [{ - "card_id": 379743801, - "card_type": 1, - "jump_url": "https://b23.tv/BV1hZ4y197Cz", - "cover_url": "http://i2.hdslb.com/bfs/archive/bfb87f033272926efe6ff4caee8e6c49c07ff6fe.jpg", - "field1": "【宿舍评测】性能与便携两全 华为matebook E 2022深度体验及伪开箱", - "field2": "2021-12-10", - "field3": "20万", - "icon3": 1, - "field4": "479", - "icon4": 3 - }, { - "card_id": 768716232, - "card_type": 1, - "jump_url": "https://b23.tv/BV13r4y187R8", - "cover_url": "http://i1.hdslb.com/bfs/archive/bb1d41ef0c17c2df25c8b6ef98f01466bdee0c1f.jpg", - "field1": "【BadApple】使用古董示波器Aron BS-601播放BadApple!!!", - "field2": "2022-05-03", - "field3": "15万", - "icon3": 1, - "field4": "297", - "icon4": 3 - }, { - "card_id": 524989935, - "card_type": 1, - "jump_url": "https://b23.tv/BV17M411E7Kq", - "cover_url": "http://i1.hdslb.com/bfs/archive/17335854dfad9d7990943d8cc6dc07c85912b103.jpg", - "field1": "【拆解】华为 Matebook E 更换固态硬盘:从未见过如此好拆的二合一", - "field2": "2023-02-24", - "field3": "5万", - "icon3": 1, - "field4": "102", - "icon4": 3 - }] -} -``` - -### 系统提示消息(`msg_type=18`) - -此类型消息仅可接收,**不可直接发送**;由系统自动发送,但仅自己可见 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------- | -| content | str | 提示列表 | **经过序列化后**的JSON数组 | - -`content`文本经JSON解析后的数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---- | -| 0 | obj | 提示1 | | -| n | obj | 提示(n+1) | | -| …… | obj | …… | …… | - -`content`文本经JSON解析后的数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------------------ | ----------- | -| text | str | 提示文字 | | -| color_day | str | 浅色模式下的提示文字颜色 | HEX颜色代码 | -| color_nig | str | 深色模式下的提示文字颜色 | HEX颜色代码 | -| jump_url | str | 点击提示跳转到的url | (非必要) | - -**示例:** - -若自己与对方从未聊过天,且对方未关注自己,则会有系统提示 - -```json -{ - "content": "[{\"text\":\"对方主动回复或关注你前,最多发送1条消息\",\"color_day\":\"#9499A0\",\"color_nig\":\"#9499A0\"}]" -} -``` - -### AI 消息(`msg_type=19`) - -此消息类型尚未得到广泛使用 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | -------------------- | ---------------- | -| content | obj | 富文本内容 | | -| show_like | bool | 是否显示点赞按钮 | | -| show_change | bool | 是否显示修改内容按钮 | | -| gpt_session_id | num | GPT 会话 id | | -| gpt_bind_query | str | (?) | **作用尚不明确** | -| session_closed_line | str | (?) | **作用尚不明确** | -| voice_url | str | 语音 url(?) | | -| sub_type | num | 子类型(?) | | -| voice_time | num | 语音时长(?) | | - -`content`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---------------- | -| paragraphs | array | 段落列表 | 详细信息有待补充 | - -**示例:** - -由于 B 站尚未公开此消息类型,暂无示例 - -## 粉丝团消息类型 - -以下消息类型仅常见于粉丝团中的系统消息(`receiver_type` 为 `2` 且 `sender_uid` 为 `0`) - -### 成员入群消息(`msg_type=301`) - -### 成员退群消息(`msg_type=302`) - -### 粉丝团冻结消息(`msg_type=303`) - -### 粉丝团解散消息(`msg_type=304`) - -### 粉丝团开通消息(`msg_type=305`) - -### 成员入群消息(`msg_type=306`) - -以上 6 种类型的消息均为以下数据类型结构 - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---------- | -| group_id | num | 粉丝团id | (非必要) | -| content | str | 提示文字 | | - -**示例:** - -`社会易姐QwQ的应援团` 开通的消息(`msg_type=305`) - -```json -{ - "group_id": 221082140, - "content": "社会易姐QwQ的应援团开通啦 (>▽<)" -} -``` - -成员 `wuziqian211` 进入 `社会易姐QwQ的应援团` 的消息(`msg_type=306`) - -```json -{ - "group_id": 221082140, - "content": "欢迎wuziqian211入群" -} -``` diff --git a/docs/message/settings.md b/docs/message/settings.md deleted file mode 100644 index 5bedfb3..0000000 --- a/docs/message/settings.md +++ /dev/null @@ -1,830 +0,0 @@ -# 消息设置 - -## 获取用户偏好设置 - -> - -*请求方式:GET 或 POST* - -认证方式:Cookie(SESSDATA) - -**url参数(GET)或 正文参数(application/x-www-form-urlencoded,POST):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------------- | ---- | -------------------------------- | ------------ | ------------------------- | -| msg_notify | num | 是否显示 “消息提醒” 设置 | 非必要 | 若此项为任意整数,则返回数据中有 `msg_notify` 项 | -| show_unfollowed_msg | num | 是否显示 “收起未关注人消息” 设置 | 非必要 | 若此项为任意整数,则返回数据中有 `show_unfollowed_msg` 项 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | POST方式必要 | | -| csrf | str | CSRF Token(位于cookie) | POST方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | -------------------- | --------------------------------------------------------------------------- | -| show_unfollowed_msg | num | 收起未关注人消息 | 请求参数 `show_unfollowed_msg` 为整数时显示此项
0:不收起
1:收起 | -| msg_notify | num | 消息提醒 | 请求参数 `msg_notify` 为整数时显示此项
1:接收
3:不接收 | -| set_like | num | 收到的赞提醒(旧) | 0:接收
5:不接收 | -| set_comment | num | 回复我的提醒(旧) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | -| set_at | num | @ 我的提醒 (旧) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | -| is_group_fold | num | 收起应援团消息 | 0:不收起
1:收起 | -| should_receive_group | num | 接收应援团消息 | 0:不接收
1:接收 | -| receive_unfollow_msg | num | 接收未关注人消息 | 前端隐藏此开关
0:不接收
1:接收 | -| followed_reply | num | 被关注回复 | 0:关闭
1:开启 | -| keys_reply | num | 关键词回复 | 0:关闭
1:开启 | -| recv_reply | num | 收到消息回复 | 0:关闭
1:开启 | -| voyage_reply | num | 大航海上船回复 | 0:关闭
1:开启 | -| recommend_followed_reply | num | 被关注时自动推送作品 | 0:关闭
1:开启 | -| ai_intercept | num | 私信智能拦截 | 0:关闭
1:开启 | -| anti_harassment | null | 防骚扰和互动人群设置 | 此接口恒返回 `null` | -| set_recv_reply | num | 回复与@提醒(新) | 0:所有人
1:关注的人
2:不接受任何消息提醒 | -| set_recv_like | num | 收到喜欢提醒(新) | 0:接收
2:不接收 | -| set_new_follow | num | 新增粉丝提醒(新) | 0:接收
2:不接收 | - -**示例:** - -```shell -curl -G 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get' \ - --data-urlencode 'msg_notify=1' \ - --data-urlencode 'show_unfollowed_msg=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "show_unfollowed_msg": 0, - "msg_notify": 1, - "set_like": 0, - "set_comment": 0, - "set_at": 0, - "is_group_fold": 0, - "should_receive_group": 1, - "receive_unfollow_msg": 1, - "followed_reply": 1, - "keys_reply": 0, - "recv_reply": 1, - "voyage_reply": 0, - "recommend_followed_reply": 1, - "ai_intercept": 1, - "anti_harassment": null, - "set_recv_reply": 0, - "set_recv_like": 0, - "set_new_follow": 0 - } -} -``` - -
- -## 修改用户偏好设置 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -参数名称与值基本同「[获取用户偏好设置](#获取用户偏好设置)」中的 `data` 对象,修改设置时只需提供修改的设置对应的参数即可 - -开启自动回复功能需要 1000 粉丝及以上,否则会提示 700009 `权限不足` - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------------------ | ---- | ------------------------ | ------ | ----------------------------------------------------- | -| show_unfollowed_msg | num | 收起未关注人消息 | 非必要 | 0:不收起
1:收起 | -| msg_notify | num | 消息提醒 | 非必要 | 1:接收
3:不接收 | -| set_like | num | 收到的赞提醒 | 非必要 | 0:接收
5:不接收 | -| set_comment | num | 回复我的提醒 | 非必要 | 0:所有人
1:关注的人
2:不接受任何消息提醒 | -| set_at | num | @ 我的提醒 | 非必要 | 0:所有人
1:关注的人
2:不接受任何消息提醒 | -| is_group_fold | num | 收起应援团消息 | 非必要 | 0:不收起
1:收起 | -| should_receive_group | num | 接收应援团消息 | 非必要 | 0:不接收
1:接收 | -| receive_unfollow_msg | num | 接收未关注人消息 | 非必要 | 0:不接收
1:接收 | -| followed_reply | num | 被关注回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | -| keys_reply | num | 关键词回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | -| recv_reply | num | 收到消息回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | -| voyage_reply | num | 大航海上船回复 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | -| recommend_followed_reply | num | 被关注时自动推送作品 | 非必要 | 需要有自动回复权限
0:关闭
1:开启 | -| ai_intercept | num | 私信智能拦截 | 非必要 | 0:关闭
1:开启 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
2:非法参数
700009:权限不足 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 空对象 | - -**示例:** - -开启接收消息提醒 - -```shell -curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/set' \ - --data-urlencode 'msg_notify=1' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 获取消息屏蔽词 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ------------------------------- | ------------------ | ---------------- | -| words | 有效时:array
无效时:null | 消息屏蔽词列表 | | -| message | str | (?) | **作用尚不明确** | -| max_word_length | num | 单个屏蔽词最大长度 | 目前为 `20` | -| max_words_size | num | 屏蔽词最大数量 | 目前为 `200` | - -`data` 中的 `words` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 屏蔽词1 | | -| n | obj | 屏蔽词(n+1) | | -| …… | obj | …… | …… | - -`words` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------------- | ---------- | -| content | str | 屏蔽词内容 | | -| ctime | num | 屏蔽词添加时间 | 秒级时间戳 | - -**示例:** - -```shell -curl -G 'https://api.vc.bilibili.com/x/im/link_setting/get_block_words' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "words": [ - { - "content": "屏蔽词", - "ctime": 1746422088 - } - ], - "message": "", - "max_word_length": 20, - "max_words_size": 200 - } -} -``` - -
- -## 添加消息屏蔽词 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | -------------- | -| content | str | 屏蔽词内容 | 必要 | 最多 20 个字符 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
1900004:添加失败,屏蔽词限制最多20个字
1900005:添加失败,最多可以添加200个屏蔽词
1900006:添加失败,屏蔽词重复
1900007:添加失败,屏蔽词不支持空格 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 空对象 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/x/im/link_setting/add_block_word' \ - --data-urlencode 'content=屏蔽词' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 删除消息屏蔽词 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------- | -| content | str | 屏蔽词内容 | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 空对象 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/x/im/link_setting/del_block_word' \ - --data-urlencode 'content=屏蔽词' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 获取自动回复文本/关键词回复规则 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ---------------------------------------------------------------------------- | -| type\[\] | num | 自动回复类型 | 必要 | 1:被关注回复
2:关键词回复
3:收到消息回复
5:大航海上船回复 | -| uid | num | 自己的mid | 非必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
2:非法参数 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ------------ | -------------------------------------- | -| texts | array | 自动回复文本 | 若未设置此类型自动回复文本,则没有此项 | - -`data` 中的 `texts` 数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | -------------------------------- | -| 0 | obj | 文本1 | | -| n | obj | 文本(n+1) | 当类型为 “关键词回复” 时可有多项 | -| …… | obj | …… | …… | - -`texts` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------- | -------------------------------------------------------------------------- | -| id | num | 自动回复规则id | | -| uid | num | 自己的mid | | -| type | num | 自动回复类型 | 同请求参数 `type[]` | -| title | str | 规则名称 | 当类型为 “关键词回复” 时有效,否则为空文本 | -| key1 | str | 精确匹配关键词 | 当类型为 “关键词回复” 时有效,否则为空文本
以中文逗号分隔每一个关键词 | -| key2 | str | 模糊匹配关键词 | 当类型为 “关键词回复” 时有效,否则为空文本
以中文逗号分隔每一个关键词 | -| reply | str | 回复内容 | | - -**示例:** - -获取关键词回复规则 - -```shell -curl -G 'https://api.vc.bilibili.com/x/im/auto_reply/get_reply_text' \ - --data-urlencode 'type[]=2' \ - --data-urlencode 'uid=425503913' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "texts": [ - { - "id": 201321, - "uid": 425503913, - "type": 2, - "title": "谢谢", - "key1": "谢谢,Thank you", - "key2": "感谢", - "reply": "我也感谢您对我的支持 (=・ω・=)" - }, - { - "id": 201320, - "uid": 425503913, - "type": 2, - "title": "哭2", - "key1": "哭", - "key2": "", - "reply": "我是不会哭的 (=・ω・=)" - }, - { - "id": 201318, - "uid": 425503913, - "type": 2, - "title": "哭", - "key1": "", - "key2": "哭", - "reply": "别哭了[tv_微笑]摸摸您 (^・ω・^)" - } - ] - } -} -``` - -
- -## 修改自动回复文本/关键词回复规则 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -仅调用本接口不会开启或关闭自动回复功能,请使用 “[修改用户偏好设置](#修改用户偏好设置)” 接口 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ---------------------- | ---------------------------------------------------------------------------- | -| type | num | 自动回复类型 | 必要 | 1:被关注回复
2:关键词回复
3:收到消息回复
5:大航海上船回复 | -| reply | str | 回复内容 | 必要 | 最多 500 个字符 | -| id | str | 规则id | 非必要 | 当类型为 “关键词回复” 时有效
为 `0` 或为空时新增回复规则,否则修改 id 对应的回复规则 | -| title | str | 规则名称 | 关键词回复必要 | 当类型为 “关键词回复” 时有效,最多 30 个字符 | -| key1 | str | 精确匹配关键词 | 关键词回复必要(可选) | 当类型为 “关键词回复” 时有效,`key1` 与 `key2` 须至少填一个参数
以中文逗号分隔每一个关键词,最多 20 项 | -| key2 | str | 模糊匹配关键词 | 关键词回复必要(可选) | 当类型为 “关键词回复” 时有效,`key1` 与 `key2` 须至少填一个参数
以中文逗号分隔每一个关键词,最多 20 项 | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
27011:请求参数错误
1500001:自动回复内容太长
1500002:规则数量已达上限,请删除后新建
1500003:您保存的内容含敏感信息,请修改后重试 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 空对象 | - -**示例:** - -修改关键词回复规则 `id=201321`,规则名称为 `谢谢`,精确匹配关键词为 `谢谢,Thank you,感谢`,回复内容为 `嗯嗯,不用谢[tv_微笑]` - -```shell -curl 'https://api.vc.bilibili.com/x/im/auto_reply/set_reply_text' \ - --data-urlencode 'type=2' \ - --data-urlencode 'reply=嗯嗯,不用谢[tv_微笑]' \ - --data-urlencode 'id=201321' \ - --data-urlencode 'title=谢谢' \ - --data-urlencode 'key1=谢谢,Thank you,感谢' \ - --data-urlencode 'key2=' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 删除关键词回复规则 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------ | ------ | ------------- | -| id | str | 规则id | 必要 | | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | -| csrf_token | str | CSRF Token(位于cookie) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-500:服务器错误
1003:不能删除别人的规则 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 空对象 | - -**示例:** - -删除关键词回复规则 `id=201321` - -```shell -curl 'https://api.vc.bilibili.com/x/im/auto_reply/del_reply_text' \ - --data-urlencode 'id=201321' \ - --data-urlencode 'build=0' \ - --data-urlencode 'mobi_app=web' \ - --data-urlencode 'csrf_token=xxx' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 获取系统设置 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -此接口中的设置一般不能由用户随意更改 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------------------------- | ---- | ---------------------------------------------------------------------------------------- | -------------------------- | -| is_create_group_available | num | 是否可创建粉丝团 | 粉丝数达到 1000 后开启 | -| is_auto_reply_available | num | 是否可使用自动回复功能 | 粉丝数达到 1000 后开启 | -| vc_hint_title | str | 稿件自动推送小灰条内容 | `我为什么会收到此类消息` | -| vc_hint_title_button | str | 稿件自动推送小灰条旁的按钮内容 | `了解更多` | -| vc_hint_detail | str | 稿件自动推送详细信息小灰条内容 | `您【特别关注】的UP主更新视频或专栏后,会第一时间在私信推送给您。如有需要可点击右上角设置关闭推送。` | -| vc_hint_detail_button | str | 关闭稿件自动推送按钮内容 | `关闭推送` | -| auto_reply_html | str | 自动回复H5页面url | `https://message.bilibili.com/h5/app/auto-reply` | -| is_receive_unfollow_wl | num | 是否显示限制接收未关注人消息功能 | | -| is_voyage | num | 是否在自动回复页面显示 “大航海自动回复” 选项 | 仅部分用户开启 | -| is_auto_reply_recommend_available | num | 是否在自动回复中的 “被关注回复” 页面显示 “被关注后,向关注我的人推送我的往期作品” 复选框 | 仅部分用户开启 | -| is_discuss_style_im_page | num | (?) | **作用尚不明确** | -| discuss_unread_style_im_page | num | (?) | **作用尚不明确** | -| old_up_assistant_door | obj | 原 “UP主小助手” 入口相关信息 | | -| is_new_up_assistant_effective | num | 新 “UP主小助手” 是否启用 | | -| is_archive_gray | bool | 是否不显示 “私信存档” 按钮 | | -| session_cfg | obj | 特定私信会话配置信息 | | -| migrate_session_api | bool | (?) | **作用尚不明确** | -| game_msg | obj | (?) | **作用尚不明确**;仅当请求参数 `mobi_app` 不为 `web` 时有其中的项目 | -| auto_reply_msg_desc | str | 指示消息为自动回复消息的提示内容 | `此条消息为自动回复` | -| huahuo_group_icon_new | str | 浅色模式下的花火图标url | | -| huahuo_group_icon_dark_new | str | 深色模式下的花火图标url | | -| im_disabled_input_hint | str | 某UP主禁用私信功能时的提示内容 | `请到UP主空间发起咨询` | - -`data` 中的 `old_up_assistant_door` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ---------------------------- | ------------ | -| show_old_up_door | num | 是否显示原 “UP主小助手” 入口 | 目前恒为 `0` | -| title | str | 原 “UP主小助手” 入口标题 | 目前为空文本 | -| sub_title | str | 原 “UP主小助手” 入口子标题 | 目前为空文本 | - -`data` 中的 `session_cfg` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------------- | ---- | -| {用户mid} | obj | 该会话的配置信息 | | - -`session_cfg` 中的 `{用户mid}` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | -------------------- | ------------------- | -| hidden_emote_btn | bool | 是否隐藏表情按钮 | | -| hidden_pic_btn | bool | 是否隐藏发送图片按钮 | | -| max_height | num | 最大高度(?) | **作用尚不明确** | -| hint_text | str | 私信输入框的提示内容 | `你想问什么问题呢?` | -| hidden_top_hint | bool | (?) | **作用尚不明确** | -| is_gpt_account | bool | 是否为AI会话 | | - -`data` 中的 `game_msg` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---- | ------------------------------------------------------------- | -| show_install | bool | true | **作用尚不明确**;仅当请求参数 `mobi_app` 不为 `web` 时有此项 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/link_setting/v1/link_setting/get_sys_setting' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "is_create_group_available": 1, - "is_auto_reply_available": 1, - "vc_hint_title": "我为什么会收到此类消息", - "vc_hint_title_button": "了解更多", - "vc_hint_detail": "您【特别关注】的UP主更新视频或专栏后,会第一时间在私信推送给您。如有需要可点击右上角设置关闭推送。", - "vc_hint_detail_button": "关闭推送", - "auto_reply_html": "https://message.bilibili.com/h5/app/auto-reply", - "is_receive_unfollow_wl": 0, - "is_voyage": 1, - "is_auto_reply_recommend_available": 0, - "is_discuss_style_im_page": 0, - "discuss_unread_style_im_page": 0, - "old_up_assistant_door": { - "show_old_up_door": 0, - "title": "", - "sub_title": "" - }, - "is_new_up_assistant_effective": 1, - "is_archive_gray": true, - "session_cfg": { - "100000000000001": { - "hidden_emote_btn": true, - "hidden_pic_btn": true, - "max_height": 62, - "hint_text": "你想问什么问题呢?", - "hidden_top_hint": true, - "is_gpt_account": true - }, - "100000000000002": { - "hidden_emote_btn": true, - "hidden_pic_btn": true, - "max_height": 62, - "hint_text": "你想问什么问题呢?", - "hidden_top_hint": true, - "is_gpt_account": true - }, - "1400565964": { - "hidden_emote_btn": true, - "hidden_pic_btn": true, - "max_height": 62, - "hint_text": "你想问什么问题呢?", - "hidden_top_hint": true, - "is_gpt_account": true - } - }, - "migrate_session_api": false, - "game_msg": { - "show_install": true - }, - "auto_reply_msg_desc": "此条消息为自动回复", - "huahuo_group_icon_new": "http://i0.hdslb.com/bfs/kfptfe/floor/e2e3829e514ebccab1705636b0354ec89446a4b5.png", - "huahuo_group_icon_dark_new": "http://i0.hdslb.com/bfs/kfptfe/floor/d09bc8c0716a15938ec427db5fa962733703f3ce.png", - "im_disabled_input_hint": "请到UP主空间发起咨询" - } -} -``` - -
- -## 获取创建粉丝团按钮可见性 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------------------- | -| build | num | 客户端内部版本号 | 非必要 | 默认为 `0` | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web` 等 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| msg | str | 错误信息 | 默认为0 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------------- | ---------------------- | -| show | num | 是否显示创建粉丝团按钮 | 粉丝数达到 1000 后显示 | - -**示例:** - -```shell -curl 'https://api.vc.bilibili.com/link_group/v1/member/show_create_group_icon' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": { - "show": 1 - } -} -``` - -
diff --git a/docs/misc/b23tv.md b/docs/misc/b23tv.md deleted file mode 100644 index e395d7e..0000000 --- a/docs/misc/b23tv.md +++ /dev/null @@ -1,127 +0,0 @@ -# b23.tv 短链 - -## 简述 - -b23.tv 是由 Bilibili 提供的短链服务, 主要用于站内长链接缩短便于分享, 目前仅在手机客户端生成 - -### 格式 - -目前已知的 b23.tv 短链格式有以下 3 种 - -- 任意短链, 路径由7位数字或大小写英文字母组成, 为防止滥用似乎有时效限制, 如 https://b23.tv/pigt3PQ - -- 视频短链(AV号), 路径由字符串 `av` 尾随 视频 aid 组成, 如 https://b23.tv/av80433022 - -- 视频短链(BV号), 路径由字符串 `BV` 尾随 视频 bvid 组成, 如 https://b23.tv/BV1GJ411x7h7 - -## 生成 - -### 视频短链 - -1. 直接手动拼接字符串即可 - -2. 参见[任意短链](#任意短链) - -### 任意短链 - -> https://api.bilibili.com/x/share/click -> https://api.biliapi.net/x/share/click - -*请求方式: POST* - -认证方式: 仅APP, 但实际上形同虚设 - -注: 该接口参数对照表基本失效, 基本无实用价值, 已被注释, 参见 [#979](https://github.com/SocialSisterYi/bilibili-API-collect/issues/979) [Nemo2011/bilibili-api#720](https://github.com/Nemo2011/bilibili-api/pull/720) - -**正文参数(application/x-www-form-urlencoded):** - -必要: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------- | ------ | ---- | -| buvid | str | 设备 BUVID | 必要 | 实际任意非空字符串即可 | -| build | num | 客户端版本号 | 必要 | 大于 `5520400` 的任意有效整数, 如 `7710300` | -| platform | str | 客户端平台 | 必要 | 实际任意非空字符串即可 | -| share_channel | str | 分享方式? | 必要 | COPY | -| share_mode | num | 分享模式? | 必要 | 任意有效正整数, 常见 `1`, `3`, `4` | -| share_id | str | 分享 ID | 必要 | 见下方对照表 | -| share_origin | str | 分享来源? | 部分必要 | 见下方对照表 | -| oid | num | 对象 ID | 必要 | 见下方对照表 | - -不必要: - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ---- | ---- | -| object_extra_fields| obj | 额外字段? | 非必要 | 如 `{"jumpfrom_id":30104}` `{"epid":"409808","cid":"1398781253"}` `{"season_type":"1","season_id":"39481","epid":"425006","dubbing_support":false,"background_audio":false,"role_audio_list":false}` | -| panel_type | num | 面板类型? | 非必要 | 1 | -| share_title | str | 分享标题? | 非必要 | 分享标题 | -| share_content | str | 分享内容? | 非必要 | 分享内容, 当 oid 存在时无意义(可是 oid 不可能不存在啊) | -| share_pattern | num | 分享模式? | 非必要 | 0 | -| share_session_id | str | 分享会话 ID? | 非必要 | 各部分用 `-` 分隔的小写的一串 UUID | -| ts | num | UNIX 秒级时间戳 | 非必要 | | - -对照表: - -| 类型 | 分享 ID (share_id) | 对象 ID (oid) | 分享来源? (share_origin) | 备注 | -| --- | ------------------ | ------------- | ----------------------- | ---- | -| 视频 | `main.ugc-video-detail.0.0.pv` | 视频 aid | 非必要 | | -| 动态/图文 | `dt.dt-detail.0.0.pv` | 动态/图文 id | `dynamic` | | -| 专栏 | `read.column-detail.roof.8.click` | 文章 cvid | 非必要 | | -| 文集 | `read.column-readlist.share.0.click` | 文集 rlid | 非必要 | | -| 用户 | `main.space-total.more.0.click` | 用户 mid | 非必要 | | -| 课程 | `pugv.pugv-video-detail.0.0.pv` | 课程 id? | `vinfo_player` 或 `vinfo_share` | | -| 链接 | `public.webview.0.0.pv` | 任意站內链接 | 非必要 | 需填写完整链接,且域名必需为 `*.bilibili.com` | - - - - -**JSON回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| code | num | 0 | 恒为 0 | -| message | str | 0 | 恒为 0 | -| ttl | num | 1 | 恒为 1 | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段名 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ---- | -| content | str | 短链内容 | 若失败则不存在 | -| count | num | 0 | 恒为 0 | - -**示例:** - -为 `av80433022` 生成 b23.tv 短链 - -```shell -curl -X POST "http://api.biliapi.net/x/share/click" \ ---data-urlencode "platform=unix" \ ---data-urlencode "share_channel=COPY" \ ---data-urlencode "share_id=main.ugc-video-detail.0.0.pv" \ ---data-urlencode "share_mode=4" \ ---data-urlencode "oid=80433022" \ ---data-urlencode "buvid=qwq" \ ---data-urlencode "build=6114514" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "content": "【【官方 MV】Never Gonna Give You Up - Rick Astley-哔哩哔哩】 https://b23.tv/5x4wy5f", - "count": 0 - } -} -``` - -
diff --git a/docs/misc/buvid3_4.md b/docs/misc/buvid3_4.md deleted file mode 100644 index 99dc3c1..0000000 --- a/docs/misc/buvid3_4.md +++ /dev/null @@ -1,132 +0,0 @@ -# 获取 buvid3 / buvid4 / b_nut - -## 仅获取 buvid3 - -> https://api.bilibili.com/x/web-frontend/getbuvid - -*请求方式: GET* - - - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| buvid | str | buvid3 | 需手动存放至 cookie 中 | - -**示例:** - -注: 不要复制 - -```shell -curl -G 'https://api.bilibili.com/x/web-frontend/getbuvid' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "buvid": "54E5EFC1-3C8F-F690-2261-439E4F6A20A979439infoc" - } -} -``` - -
- -## 接口获取 buvid3 / buvid4 - -> https://api.bilibili.com/x/frontend/finger/spi - -*请求方式: GET* - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | 0:成功 | -| message | str | 信息 | ok: 成功 | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| b_3 | str | buvid3 | 需手动存放至 cookie 中 | -| b_4 | str | buvid4 | 同上 | - -**示例:** - -注: 建议自行生成, 不要复制本处示例的 buvid3 / buvid4. - -```shell -curl -G 'https://api.bilibili.com/x/frontend/finger/spi' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "b_3": "D9656DA8-9BEF-F464-5B72-C4849AFD336379044infoc", - "b_4": "F6E0FD4B-520C-1902-4F7B-E461D8D1F5AB79044-024072309-666onEZSnlHVPjoRp4kDYg==" - }, - "message": "ok" -} -``` - -
- -## 从响应头获取 buvid3 / b_nut - -使用 `GET` 或 `HEAD` 方法请求 `https://www.bilibili.com/`, 且请求头中 `User-Agent` 字段不包含 `curl` `python` `awa` 等敏感子字符串, 且相同 `User-Agent` 字段不得短时多次请求. 在响应头中的 `Set-Cookie` 字段中, 即可找到 `buvid3` 和 `b_nut`. - -若不带任何 Cookie 请求, 则 `b_nut` 为响应生成时刻的 UNIX 秒级时间戳. -若请求 Cookie 仅带有 `buvid3`, 则 `b_nut` 为 `100`. -若请求 Cookie 仅带有 `b_nut`, 则与不带任何 Cookie 的响应相同. -若请求 Cookie 仅带有 `buvid3` 和 `b_nut`, 则响应无 `Set-Cookie` 字段. -若请求 Cookie 带有其他字段, 无影响. - -**示例:** - -```shell -curl -I "https://www.bilibili.com/" -A "awa" -``` - -
-查看响应示例: - -```http -HTTP/2 200 -date: Fri, 26 Jul 2024 06:38:43 GMT -content-type: text/html; charset=utf-8 -support: nantianmen -set-cookie: buvid3=805E4894-96A2-0684-6F00-C6EA1FFB911023315infoc; path=/; expires=Sat, 26 Jul 2025 06:38:43 GMT; domain=.bilibili.com -set-cookie: b_nut=1721975923; path=/; expires=Sat, 26 Jul 2025 06:38:43 GMT; domain=.bilibili.com -vary: Origin,Accept-Encoding -idc: shjd -expires: Fri, 26 Jul 2024 06:38:42 GMT -cache-control: no-cache -x-cache-webcdn: MISS from blzone01 -x-cache-time: 0 -x-save-date: Fri, 26 Jul 2024 06:38:43 GMT -``` - -
diff --git a/docs/misc/bvid_desc.md b/docs/misc/bvid_desc.md deleted file mode 100644 index d9e3346..0000000 --- a/docs/misc/bvid_desc.md +++ /dev/null @@ -1,850 +0,0 @@ - -# bvid说明 - -2020-03-23 B站推出了全新的稿件视频id`bvid`来接替之前的`avid`,其意义与之相同 - -详见: - -1. [【升级公告】AV号全面升级至BV号(专栏)](https://www.bilibili.com/read/cv5167957) -2. [【升级公告】AV号全面升级至BV号](https://www.bilibili.com/blackboard/activity-BV-PC.html) - -## 概述 - -### 格式 - -“bvid”恒为长度为 12 的字符串,前 3 个固定为“BV1”,后 9 个为 base58 计算结果(不包含数字 `0` 和大写字母 `I`、 `O` 以及小写字母 `l`) - -### 实质 - -“bvid"为“avid”的base58编码,可通过算法进行相互转化 - -### avid发号方式的变化 - -从 2009-09-09 09:09:09 [av2](https://www.bilibili.com/video/av2) 的发布到 2020-03-28 19:45:02 [av99999999](https://www.bilibili.com/video/av99999999) 的发布B站结束了以投稿时间为顺序的avid发放,改为随机发放avid - -~~暗示B站东方要完?泪目~~ - -## 算法概述 - -~~算法以及程序主要参考[知乎@mcfx的回答](https://www.zhihu.com/question/381784377/answer/1099438784)~~ -~~实际上该算法并不完整,新的算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj)~~ -实际上上面的算法依然不完整,新的算法参考自 [SocialSisterYi#740](https://github.com/SocialSisterYi/bilibili-API-collect/issues/740)~~来自 B 站某个 JS 文件?~~ - -### av->bv算法 - -**说明** - -1. 目前的 BV 格式为 BV1XXXXXXXXX,以 BV1 开头,后面包含 9 位有效数据。 -2. AV 最大值为 2⁵¹。 - -**算法** - -- 定义一个包含初始值为 `['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']` 的长度为 12 的数组`bytes`,用于存储转换后的字符。 - - 定义变量 `bv_idx` 并初始化为数组 `bytes` 的最后一个索引。 - - 将输入的 `aid` 与 avid 最大值(2⁵¹)进行按位或运算,其结果与常量 `XOR_CODE`(23442827791579)进行异或运算,得到变量 `tmp`。 - - 当 `tmp` 大于0时,循环执行以下操作直到小于0: - - 将 `tmp` 除以 58(码表的长度) 的余数作为索引,从 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中取出对应的字符,并将其赋值给 `bytes[bv_idx]`。 - - 将 `tmp` 与 58 求模赋值给 `tmp`。 - - 将 `bv_idx` 减1。 - - 将 `bytes` 数组中索引为 3 和 9 的元素进行交换。 - - 将 `bytes` 数组中索引为 4 和 7 的元素进行交换。 - - 将 `bytes` 数组转换为字符串,并返回结果。 - -### bv->av算法 - -是 #av->bv算法 的逆向 - -- 将 `bvid` 中索引为 3 和 9 的字符进行交换。 -- 将 `bvid` 中索引为 4 和 7 的字符进行交换。 -- 删除 `bvid` 前3个字符(固定为 BV1)。 -- 定义变量 `tmp` 并初始化为 0。 -- 遍历 `bvid` 的每个字符,执行以下操作: - - 获取当前字符在 `FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf` 码表中的索引,并将其赋值给变量 `idx`。 - - 将 `tmp` 乘以常量 58,并加上 `idx`,最后赋值给 `tmp`。 -- 将 `tmp` 与常量 2⁵¹ - 1 进行按位与运算,其结果与常量 `XOR_CODE`(23442827791579) 进行异或运算,得到最终结果。 - -## 编程实现 - -### JavaScript/TypeScript - - - - -```javascript -const XOR_CODE = 23442827791579n; -const MASK_CODE = 2251799813685247n; -const MAX_AID = 1n << 51n; -const BASE = 58n; - -const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; - -function av2bv(aid) { - const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; - let bvIndex = bytes.length - 1; - let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; - while (tmp > 0) { - bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; - tmp = tmp / BASE; - bvIndex -= 1; - } - [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; - [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; - return bytes.join(''); -} - -function bv2av(bvid) { - const bvidArr = Array.from(bvid); - [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; - [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; - bvidArr.splice(0, 3); - const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); - return Number((tmp & MASK_CODE) ^ XOR_CODE); -} - -console.log(av2bv(111298867365120)); -console.log(bv2av('BV1L9Uoa9EUx')); -``` - - - - - -```typescript -const XOR_CODE = 23442827791579n; -const MASK_CODE = 2251799813685247n; -const MAX_AID = 1n << 51n; -const BASE = 58n; - -const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; - -function av2bv(aid: number) { - const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; - let bvIndex = bytes.length - 1; - let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; - while (tmp > 0) { - bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; - tmp = tmp / BASE; - bvIndex -= 1; - } - [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; - [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; - return bytes.join('') as `BV1${string}`; -} - -function bv2av(bvid: `BV1${string}`) { - const bvidArr = Array.from(bvid); - [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; - [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; - bvidArr.splice(0, 3); - const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); - return Number((tmp & MASK_CODE) ^ XOR_CODE); -} - -console.log(av2bv(111298867365120)); -console.log(bv2av('BV1L9Uoa9EUx')); -``` - - - -### Python - -来自:[#847](https://github.com/SocialSisterYi/bilibili-API-collect/issues/847#issuecomment-1807020675) - -```python -XOR_CODE = 23442827791579 -MASK_CODE = 2251799813685247 -MAX_AID = 1 << 51 -ALPHABET = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf" -ENCODE_MAP = 8, 7, 0, 5, 1, 3, 2, 4, 6 -DECODE_MAP = tuple(reversed(ENCODE_MAP)) - -BASE = len(ALPHABET) -PREFIX = "BV1" -PREFIX_LEN = len(PREFIX) -CODE_LEN = len(ENCODE_MAP) - -def av2bv(aid: int) -> str: - bvid = [""] * 9 - tmp = (MAX_AID | aid) ^ XOR_CODE - for i in range(CODE_LEN): - bvid[ENCODE_MAP[i]] = ALPHABET[tmp % BASE] - tmp //= BASE - return PREFIX + "".join(bvid) - -def bv2av(bvid: str) -> int: - assert bvid[:3] == PREFIX - - bvid = bvid[3:] - tmp = 0 - for i in range(CODE_LEN): - idx = ALPHABET.index(bvid[DECODE_MAP[i]]) - tmp = tmp * BASE + idx - return (tmp & MASK_CODE) ^ XOR_CODE - -assert av2bv(111298867365120) == "BV1L9Uoa9EUx" -assert bv2av("BV1L9Uoa9EUx") == 111298867365120 -``` - -### Rust - -参考 - -### Swift - -```swift -fileprivate let XOR_CODE: UInt64 = 23442827791579 -fileprivate let MASK_CODE: UInt64 = 2251799813685247 -fileprivate let MAX_AID: UInt64 = 1 << 51 - -fileprivate let data: [UInt8] = [70, 99, 119, 65, 80, 78, 75, 84, 77, 117, 103, 51, 71, 86, 53, 76, 106, 55, 69, 74, 110, 72, 112, 87, 115, 120, 52, 116, 98, 56, 104, 97, 89, 101, 118, 105, 113, 66, 122, 54, 114, 107, 67, 121, 49, 50, 109, 85, 83, 68, 81, 88, 57, 82, 100, 111, 90, 102] - -fileprivate let BASE: UInt64 = 58 -fileprivate let BV_LEN: Int = 12 -fileprivate let PREFIX: String = "BV1" - -func av2bv(avid: UInt64) -> String { - var bytes: [UInt8] = [66, 86, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48] - var bvIdx = BV_LEN - 1 - var tmp = (MAX_AID | avid) ^ XOR_CODE - - while tmp != 0 { - bytes[bvIdx] = data[Int(tmp % BASE)] - tmp /= BASE - bvIdx -= 1 - } - - bytes.swapAt(3, 9) - bytes.swapAt(4, 7) - - return String(decoding: bytes, as: UTF8.self) -} - -func bv2av(bvid: String) -> UInt64 { - let fixedBvid: String - if bvid.hasPrefix("BV") { - fixedBvid = bvid - } else { - fixedBvid = "BV" + bvid - } - var bvidArray = Array(fixedBvid.utf8) - - bvidArray.swapAt(3, 9) - bvidArray.swapAt(4, 7) - - let trimmedBvid = String(decoding: bvidArray[3...], as: UTF8.self) - - var tmp: UInt64 = 0 - - for char in trimmedBvid { - if let idx = data.firstIndex(of: char.utf8.first!) { - tmp = tmp * BASE + UInt64(idx) - } - } - - return (tmp & MASK_CODE) ^ XOR_CODE -} - -print(av2bv(avid: 111298867365120)) -print(bv2av(bvid: "BV1L9Uoa9EUx")) -``` - -### Java - -```java -import java.math.BigInteger; - -/** - * @author cctyl - */ -public class AVBVConverter { - - private static final BigInteger XOR_CODE = BigInteger.valueOf(23442827791579L); - private static final BigInteger MASK_CODE = BigInteger.valueOf(2251799813685247L); - private static final BigInteger MAX_AID = BigInteger.ONE.shiftLeft(51); - private static final int BASE = 58; - - private static final String DATA = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"; - - public static String av2bv(long aidParam) { - BigInteger aid = BigInteger.valueOf(aidParam); - char[] bytes = {'B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0'}; - int bvIndex = bytes.length - 1; - BigInteger tmp = MAX_AID.or(aid).xor(XOR_CODE); - while (tmp.compareTo(BigInteger.ZERO) > 0) { - bytes[bvIndex] = DATA.charAt(tmp.mod(BigInteger.valueOf(BASE)).intValue()); - tmp = tmp.divide(BigInteger.valueOf(BASE)); - bvIndex--; - } - swap(bytes, 3, 9); - swap(bytes, 4, 7); - return new String(bytes); - } - - public static long bv2av(String bvid) { - char[] bvidArr = bvid.toCharArray(); - swap(bvidArr, 3, 9); - swap(bvidArr, 4, 7); - String adjustedBvid = new String(bvidArr, 3, bvidArr.length - 3); - BigInteger tmp = BigInteger.ZERO; - for (char c : adjustedBvid.toCharArray()) { - tmp = tmp.multiply(BigInteger.valueOf(BASE)).add(BigInteger.valueOf(DATA.indexOf(c))); - } - BigInteger xor = tmp.and(MASK_CODE).xor(XOR_CODE); - return xor.longValue(); - } - - - private static void swap(char[] array, int i, int j) { - char temp = array[i]; - array[i] = array[j]; - array[j] = temp; - } - - public static void main(String[] args) { - - final int aid1 = 643755790; - final String bv1 = "BV1bY4y1j7RA"; - - final int aid2 = 305988942; - final String bv2 = "BV1aP411K7it"; - - //av ==> bv - assert av2bv(aid1).equals(bv1); - assert av2bv(aid2).equals(bv2); - - //bv ==>av - assert bv2av(bv1) == aid1; - assert bv2av(bv2) == aid2; - } -} -``` - -### Golang - -```go -package main - -import ( - "fmt" - "strings" -) - -var ( - XOR_CODE = int64(23442827791579) - MAX_CODE = int64(2251799813685247) - CHARTS = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf" - PAUL_NUM = int64(58) -) - -func swapString(s string, x, y int) string { - chars := []rune(s) - chars[x], chars[y] = chars[y], chars[x] - return string(chars) -} - -func Bvid2Avid(bvid string) (avid int64) { - s := swapString(swapString(bvid, 3, 9), 4, 7) - bv1 := string([]rune(s)[3:]) - temp := int64(0) - for _, c := range bv1 { - idx := strings.IndexRune(CHARTS, c) - temp = temp*PAUL_NUM + int64(idx) - } - avid = (temp & MAX_CODE) ^ XOR_CODE - return -} - -func Avid2Bvid(avid int64) (bvid string) { - arr := [12]string{"B", "V", "1"} - bvIdx := len(arr) - 1 - temp := (avid | (MAX_CODE + 1)) ^ XOR_CODE - for temp > 0 { - idx := temp % PAUL_NUM - arr[bvIdx] = string(CHARTS[idx]) - temp /= PAUL_NUM - bvIdx-- - } - raw := strings.Join(arr[:], "") - bvid = swapString(swapString(raw, 3, 9), 4, 7) - return -} - -func main() { - avid := int64(1054803170) - bvid := "BV1mH4y1u7UA" - resAvid := Bvid2Avid(bvid) - resBvid := Avid2Bvid(avid) - - fmt.Printf("convert bvid to avid: %v\tvalue:%v\n", avid == resAvid, resAvid) - fmt.Printf("convert avid to bvid: %v\tvalue:%v\n", bvid == resBvid, resBvid) - -} - -``` - - -### C++ -```cpp -#include -#include -#include -#include - -constexpr int64_t XOR_CODE = 0x1552356C4CDB; -constexpr int64_t MAX_AID = 0x8000000000000; -constexpr int64_t MASK_CODE = MAX_AID - 1; -constexpr int64_t BASE = 58; -constexpr char Table[BASE + 1] = "FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf"; -constexpr char ReverseTable[128] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2c, 0x2d, 0x0b, 0x1a, 0x0e, 0x27, 0x11, 0x1d, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x03, 0x25, 0x2a, 0x31, 0x12, 0x00, 0x0c, 0x15, 0x00, 0x13, 0x06, 0x0f, 0x08, 0x05, 0x00, - 0x04, 0x32, 0x35, 0x30, 0x07, 0x2f, 0x0d, 0x17, 0x33, 0x20, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1f, 0x1c, 0x01, 0x36, 0x21, 0x39, 0x0a, 0x1e, 0x23, 0x10, 0x29, 0x00, 0x2e, 0x14, 0x37, - 0x16, 0x24, 0x28, 0x18, 0x1b, 0x09, 0x22, 0x02, 0x19, 0x2b, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -std::string Av2bv(const int64_t Avid) { - assert(Avid > 0 && "Avid must be greater than 0"); - std::string bv = "BV1"; - bv.resize(12, '\0'); - - int64_t tmp = (Avid | MAX_AID) ^ XOR_CODE; - for (size_t i = bv.size() - 1; tmp > 0 && i > 2; --i) { - bv[i] = Table[tmp % BASE]; - tmp /= BASE; - } - std::ranges::swap(bv.at(3), bv.at(9)); - std::ranges::swap(bv.at(4), bv.at(7)); - return bv; -} - -int64_t Bv2av(const std::string &Bvid) { - assert(Bvid.starts_with("BV1") && "Bvid must start with 'BV1'"); - - auto Bvid_ = Bvid; - std::ranges::swap(Bvid_.at(3), Bvid_.at(9)); - std::ranges::swap(Bvid_.at(4), Bvid_.at(7)); - - int64_t tmp = 0; - for (int i = 3; i < Bvid_.size(); ++i) { - tmp = ReverseTable[Bvid_.at(i)] + BASE * tmp; - } - return (tmp & MASK_CODE) ^ XOR_CODE; -} - -int main() { - assert(Av2bv(1004871019) == "BV16x4y1H7M1"); - assert(Bv2av("BV16x4y1H7M1") == 1004871019); -} -``` - - - -## 老版算法存档 - -**以下算法已失效**,编解码函数值域有限,不推荐使用,在此仅作为存档 - -
-查看折叠内容: - -算法参考自[【揭秘】av号转bv号的过程](https://www.bilibili.com/video/BV1N741127Tj) - -### av->bv算法 - -注:本算法及示例程序仅能编解码`avid < 29460791296`,且暂无法验证`avid >= 29460791296`的正确性 -再注:本人不清楚新算法能否编解码`avid >= 29460791296` - -1. a = (avid ⊕ 177451812) + 100618342136696320 -2. 以 i 为循环变量循环 6 次 b[i] = (a / 58 ^ i) % 58 -3. 将 b[i] 中各个数字转换为以下码表中的字符 - -码表: - -> fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF - -4. 初始化字符串 b[i]=` ` - -5. 按照以下字符顺序编码表编码并填充至 b[i] - -字符顺序编码表: - -> 0 -> 9 -> -> 1 -> 8 -> -> 2 -> 1 -> -> 3 -> 6 -> -> 4 -> 2 -> -> 5 -> 4 -> -> 6 -> 0 -> -> 7 -> 7 -> -> 8 -> 3 -> -> 9 -> 5 - -### bv->av算法 - -为以上算法的逆运算 - -### 编程实现 - -使用 Python C TypeScript Java Kotlin Golang Rust 等语言作为示例,欢迎社区提交更多例程 - -#### Python - -```python -XOR = 177451812 -ADD = 100618342136696320 -TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF" -MAP = 9, 8, 1, 6, 2, 4, 0, 7, 3, 5 - - -def av2bv(av: int) -> str: - av = (av ^ XOR) + ADD - bv = [""] * 10 - for i in range(10): - bv[MAP[i]] = TABLE[(av // 58**i) % 58] - return "".join(bv) - - -def bv2av(bv: int) -> int: - av = [""] * 10 - s = 0 - for i in range(10): - s += TABLE.find(bv[MAP[i]]) * 58**i - av = (s - ADD) ^ XOR - - return av - - -def main(): - while 1: - mode = input("1. AV to BV\n2. BV to AV\n3. Exit\n你的选择:") - if mode == "1": - print(f"BV号是:BV {av2bv(int(input('AV号是:')))}") - elif mode == "2": - print(f"AV号是:AV {bv2av(input('BV号是:'))}") - elif mode == "3": - break - else: - print("输入错误请重新输入") - - -if __name__ == "__main__": - main() -``` - -#### C - -```c -#include -#include -#include -#include - -const char table[] = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; // 码表 -char tr[124]; // 反查码表 -const unsigned long long XOR = 177451812; // 固定异或值 -const unsigned long long ADD = 8728348608; // 固定加法值 -const int s[] = {11, 10, 3, 8, 4, 6}; // 位置编码表 - -// 初始化反查码表 -void tr_init() { - for (int i = 0; i < 58; i++) - tr[table[i]] = i; -} - -unsigned long long bv2av(char bv[]) { - unsigned long long r = 0; - unsigned long long av; - for (int i = 0; i < 6; i++) - r += tr[bv[s[i]]] * (unsigned long long)pow(58, i); - av = (r - ADD) ^ XOR; - return av; -} - -char *av2bv(unsigned long long av) { - char *result = (char*)malloc(13); - strcpy(result,"BV1 4 1 7 "); - av = (av ^ XOR) + ADD; - for (int i = 0; i < 6; i++) - result[s[i]] = table[(unsigned long long)(av / (unsigned long long)pow(58, i)) % 58]; - return result; -} - -int main() { - tr_init(); - printf("%s\n", av2bv(170001)); - printf("%u\n", bv2av("BV17x411w7KC")); - return 0; -} -``` - -输出为: - -``` -BV17x411w7KC -170001 -``` - -#### TypeScript - -感谢[#417](https://github.com/SocialSisterYi/bilibili-API-collect/issues/417#issuecomment-1186475063)提供 - -```typescript -export default class BvCode { - private TABEL = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'; // 码表 - private TR: Record = {}; // 反查码表 - private S = [11, 10, 3, 8, 4, 6]; // 位置编码表 - private XOR = 177451812; // 固定异或值 - private ADD = 8728348608; // 固定加法值 - constructor() { - // 初始化反查码表 - const len = this.TABEL.length; - for (let i = 0; i < len; i++) { - this.TR[this.TABEL[i]] = i; - } - } - av2bv(av: number): string { - const x_ = (av ^ this.XOR) + this.ADD; - const r = ['B', 'V', '1', , , '4', , '1', , '7']; - for (let i = 0; i < 6; i++) { - r[this.S[i]] = this.TABEL[Math.floor(x_ / 58 ** i) % 58]; - } - return r.join(''); - } - bv2av(bv: string): number { - let r = 0; - for (let i = 0; i < 6; i++) { - r += this.TR[bv[this.S[i]]] * 58 ** i; - } - return (r - this.ADD) ^ this.XOR; - } -} - -const bvcode = new BvCode(); - -console.log(bvcode.av2bv(170001)); -console.log(bvcode.bv2av('BV17x411w7KC')); -``` - -输出为: - -``` -BV17x411w7KC -170001 -``` - -#### Java - -```java -/** - * 算法来自:https://www.zhihu.com/question/381784377/answer/1099438784 - */ -public class Util { - private static final String TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; - private static final int[] S = new int[]{11, 10, 3, 8, 4, 6}; - private static final int XOR = 177451812; - private static final long ADD = 8728348608L; - private static final Map MAP = new HashMap<>(); - - static { - for (int i = 0; i < 58; i++) { - MAP.put(TABLE.charAt(i), i); - } - } - - public static String aidToBvid(int aid) { - long x = (aid ^ XOR) + ADD; - char[] chars = new char[]{'B', 'V', '1', ' ', ' ', '4', ' ', '1', ' ', '7', ' ', ' '}; - for (int i = 0; i < 6; i++) { - int pow = (int) Math.pow(58, i); - long i1 = x / pow; - int index = (int) (i1 % 58); - chars[S[i]] = TABLE.charAt(index); - } - return String.valueOf(chars); - } - - public static int bvidToAid(String bvid) { - long r = 0; - for (int i = 0; i < 6; i++) { - r += MAP.get(bvid.charAt(S[i])) * Math.pow(58, i); - } - return (int) ((r - ADD) ^ XOR); - } -} -``` - -#### Kotlin - -```kotlin -/** - * 此程序非完全原创,改编自GH站内某大佬的Java程序,修改了部分代码,且转换为Kotlin - * 算法来源同上 - */ -object VideoUtils { - //这里是由知乎大佬不知道用什么方法得出的转换用数字 - var ss = intArrayOf(11, 10, 3, 8, 4, 6, 2, 9, 5, 7) - var xor: Long = 177451812 //二进制时加减数1 - - var add = 8728348608L //十进制时加减数2 - - //变量初始化工作,加载哈希表 - private const val table = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF" - private val mp = HashMap() - private val mp2 = HashMap() - - //现在,定义av号和bv号互转的方法 -//定义一个power乘方方法,这是转换进制必要的 - fun power(a: Int, b: Int): Long { - var power: Long = 1 - for (c in 0 until b) power *= a.toLong() - return power - } - - //bv转av方法 - fun bv2av(s: String): String { - var r: Long = 0 - //58进制转换 - for (i in 0..57) { - val s1 = table.substring(i, i + 1) - mp[s1] = i - } - for (i in 0..5) { - r += mp[s.substring(ss[i], ss[i] + 1)]!! * power(58, i) - } - //转换完成后,需要处理,带上两个随机数 - return (r - add xor xor).toString() - } - - //av转bv方法 - fun av2bv(st: String): String { - try { - var s = java.lang.Long.valueOf(st.split("av".toRegex()).dropLastWhile { it.isEmpty() } - .toTypedArray()[1]) - val sb = StringBuffer("BV1 4 1 7 ") - //逆向思路,先将随机数还原 - s = (s xor xor) + add - //58进制转回 - for (i in 0..57) { - val s1 = table.substring(i, i + 1) - mp2[i] = s1 - } - for (i in 0..5) { - val r = mp2[(s / power(58, i) % 58).toInt()] - sb.replace(ss[i], ss[i] + 1, r!!) - } - return sb.toString() - } catch (e: ArrayIndexOutOfBoundsException) { - return "" - } - } - -} -``` - -#### Golang - -```go -package main - -import "math" - -const TABLE = "fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF" -var S = [11]uint{11, 10, 3, 8, 4, 6} -const XOR = 177451812 -const ADD = 8728348608 - -var TR = map[string]int64{} - -// 初始化 TR -func init() { - for i := 0; i < 58; i++ { - TR[TABLE[i:i+1]] = int64(i) - } -} - -func BV2AV(bv string) int64 { - r := int64(0) - for i := 0; i < 6; i++ { - r += TR[bv[S[i]:S[i]+1]] * int64(math.Pow(58, float64(i))) - } - return (r - ADD) ^ XOR -} - -func AV2BV(av int64) string { - x := (av ^ XOR) + ADD - r := []rune("BV1 4 1 7 ") - for i := 0; i < 6; i++ { - r[S[i]] = rune(TABLE[x/int64(math.Pow(58, float64(i)))%58]) - } - return string(r) -} - -func main() { - println(AV2BV(170001)) - println(BV2AV("BV17x411w7KC")) -} -``` - -输出为: - -``` -BV17x411w7KC -170001 -``` - -#### Rust - -crate: https://github.com/stackinspector/bvid - -```rust -// Copyright (c) 2023 stackinspector. MIT license. - -const XORN: u64 = 177451812; -const ADDN: u64 = 100618342136696320; -const TABLE: [u8; 58] = *b"fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF"; -const MAP: [usize; 10] = [9, 8, 1, 6, 2, 4, 0, 7, 3, 5]; -const REV_TABLE: [u8; 74] = [ - 13, 12, 46, 31, 43, 18, 40, 28, 5, 0, 0, 0, 0, 0, 0, 0, 54, 20, 15, 8, - 39, 57, 45, 36, 0, 38, 51, 42, 49, 52, 0, 53, 7, 4, 9, 50, 10, 44, 34, 6, - 25, 1, 0, 0, 0, 0, 0, 0, 26, 29, 56, 3, 24, 0, 47, 27, 22, 41, 16, 0, - 11, 37, 2, 35, 21, 17, 33, 30, 48, 23, 55, 32, 14, 19, -]; -const POW58: [u64; 10] = [ - 1, 58, 3364, 195112, 11316496, 656356768, 38068692544, - 2207984167552, 128063081718016, 7427658739644928, -]; - -fn av2bv(avid: u64) -> [u8; 10] { - let a = (avid ^ XORN) + ADDN; - let mut bvid = [0; 10]; - for i in 0..10 { - bvid[MAP[i]] = TABLE[(a / POW58[i]) as usize % 58]; - } - bvid -} - -fn bv2av(bvid: [u8; 10]) -> u64 { - let mut a = 0; - for i in 0..10 { - a += REV_TABLE[bvid[MAP[i]] as usize - 49] as u64 * POW58[i]; - } - (a - ADDN) ^ XORN -} - -// assert_eq!(*b"17x411w7KC", av2bv(170001)); -// assert_eq!(170001, bv2av(*b"17x411w7KC")); -``` - -
diff --git a/docs/misc/device_identity.md b/docs/misc/device_identity.md deleted file mode 100644 index 0335848..0000000 --- a/docs/misc/device_identity.md +++ /dev/null @@ -1,104 +0,0 @@ -# 设备各类标识算法(APP 端) - -## 设备唯一标识 BUVID - -注意区分于 Web 端的 [buvid3, buvid4](buvid3_4.md). - -BUVID 在 APP 首次安装于某设备, 且首次启动时生成. - -APP 首次(即每次安装后)启动, 会向云端发送本机各类设备特征, 含 `AndroidId`, `DrmId` 等, 请求是否有匹配的 BUVID, 有就使用云端的, 否则使用本地生成的. - -APP 请求是否有匹配的 BUVID 发送的本机各类设备特征包括(但不限于): - -+ `AndroidID` -+ `DrmId` -+ `IMEI` -+ `OAID` -+ 手机网卡 `MAC` -+ 设备品牌 -+ 设备 Model -+ 本地生成的 BUVID - -### 生成方法 - -1. 选定设备特征码, 可以是 `AndroidID`, `DrmId`, 手机网卡 `MAC` 等. 记为 `ID`. 特别地, `MAC` 应当去掉 `:`, `GUID`(即 UUID) 应当去掉 `-`. - -2. 计算 `ID` 的 MD5. 记为 `ID_MD5`. - -3. 从 `ID_MD5` 抽取第 3, 13, 23 位, 失败就默认为 000, 记为 `ID_E`. - -4. 根据选定的设备特征码类型确定 BUVID Prefix, 见附录. 记为 `BUVID_Prefix`. - -5. 按 `{BUVID_Prefix}{ID_E}{ID_MD5}` 的顺序连接起来, 共37位(2+3+32). 结果应当为大写. - -### Demo - -#### Rust - -代码及测试样例见 [Rust Playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=40b5906cf3838a60efa83fa368b15147). - -## 设备指纹 fp (fp_local, fp_remote) - -用于请求账户相关 REST API, 及 gRPC Metadata 生成. - -在请求头中, `fp_local` 和 `fp_remote` 设置为同一值即可, 暂不清楚区别. - -### 生成方法 - -1. 获取 BUVID. 此处一般使用 XU Prefix 的 BUVID. - -2. 获取设备 Model(`Build.MODEL`), 如 `NOH-AN01`. - -3. 获取手机无线电固件版本号(`Build.getRadioVersion()`), 失败则留空. 如 `21C20B686S000C000,21C20B686S000C000`. - -4. 按前述顺序拼接字符串, 计算得 MD5. - -5. 获取年月日, 格式 `yyyyMMddhhmmss`, 拼接到 4 得到的字符串后. - -6. 生成 16 位随机字符串, CharSet 为 `0123456789abcdef`, 拼接到 5 得到的字符串后, 记为 `fp_raw`. - -7. 计算得到一个特殊字符串, 拼接到 `fp_raw` 后, 即得到最终的 `fp`, 特殊字符串算法见下: - -```rust -let mut veri_code = 0; -// 有点像 HEX 的操作 -let fp_raw_sub_str = fp_raw - .as_bytes() // 将字符串 fp_raw 转换为字节数组 - .chunks(2) // 按每两个字节一组进行切分 - .map(|s| unsafe { ::std::str::from_utf8_unchecked(s) }) // 对每一组解析作为 UTF-8 字符串 - .collect::>(); // 将结果收集到 Vec 中 -// 如果 fp_raw 的长度小于 62, 则向下取偶数减半作为循环终止条件, 否则终止条件为31 -for i in 0..({ - if fp_raw.len() < 62 { - fp_raw.len() - fp_raw.len() % 2 // 取偶数 - } else { - 62 - } -} / 2) -{ - // 将每组字符串转换为对应的 16 进制整数, 将转换得到的整数加到 veri_code 上. - veri_code += i32::from_str_radix(fp_raw_sub_str[i], 16).unwrap_or(0); -} -// 最后将 veri_code 对 256 取余, 格式化为两位的 16 进制字符串 -let veri_code = format!("{:0>2x}", veri_code % 256); -``` - -### Demo - -#### Rust - -代码及测试样例见 [Rust Playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=40b5906cf3838a60efa83fa368b15147). - -## 附录 - -### BUVID Prefix - -|设备特征码|BUVID Prefix|备注| -|:-:|:-:|:-:| -|`AndroidID`|`XX`|| -|`DrmId`|`XU`|| -|`IMEI`|`XZ`|已弃用| -|`GUID`|`XW`|已弃用| -|`MAC`|`XY`|| -|`GoogleId`|`XG`|东南亚版本| -|`FacebookId`|`XF`|东南亚版本| diff --git a/docs/misc/errcode.md b/docs/misc/errcode.md deleted file mode 100644 index 3fe8264..0000000 --- a/docs/misc/errcode.md +++ /dev/null @@ -1,62 +0,0 @@ -# 公共错误码 - -下表为大部分接口返回值中`code`字段值中公共的错误代码 - -## 权限类 - -| 代码 | 含义 | -| ---- | -------------------------- | -| -1 | 应用程序不存在或已被封禁 | -| -2 | Access Key 错误 | -| -3 | API 校验密匙错误 | -| -4 | 调用方对该 Method 没有权限 | -| -101 | 账号未登录 | -| -102 | 账号被封停 | -| -103 | 积分不足 | -| -104 | 硬币不足 | -| -105 | 验证码错误 | -| -106 | 账号非正式会员或在适应期 | -| -107 | 应用不存在或者被封禁 | -| -108 | 未绑定手机 | -| -110 | 未绑定手机 | -| -111 | csrf 校验失败 | -| -112 | 系统升级中 | -| -113 | 账号尚未实名认证 | -| -114 | 请先绑定手机 | -| -115 | 请先完成实名认证 | - -## 请求类 - -| 代码 | 含义 | -| ---- | --------------------- | -| -304 | 木有改动 | -| -307 | 撞车跳转 | -| -352 | 风控校验失败 (UA 或 wbi 参数不合法) | -| -400 | 请求错误 | -| -401 | 未认证 (或非法请求) | -| -403 | 访问权限不足 | -| -404 | 啥都木有 | -| -405 | 不支持该方法 | -| -409 | 冲突 | -| -412 | 请求被拦截 (客户端 ip 被服务端风控) | -| -500 | 服务器错误 | -| -503 | 过载保护,服务暂不可用 | -| -504 | 服务调用超时 | -| -509 | 超出限制 | -| -616 | 上传文件不存在 | -| -617 | 上传文件太大 | -| -625 | 登录失败次数太多 | -| -626 | 用户不存在 | -| -628 | 密码太弱 | -| -629 | 用户名或密码错误 | -| -632 | 操作对象数量限制 | -| -643 | 被锁定 | -| -650 | 用户等级太低 | -| -652 | 重复的用户 | -| -658 | Token 过期 | -| -662 | 密码时间戳过期 | -| -688 | 地理区域限制 | -| -689 | 版权限制 | -| -701 | 扣节操失败 | -| -799 | 请求过于频繁,请稍后再试 | -| -8888 | 对不起,服务器开小差了~ (ಥ﹏ಥ) | diff --git a/docs/misc/mathjax.md b/docs/misc/mathjax.md deleted file mode 100644 index 545f7c2..0000000 --- a/docs/misc/mathjax.md +++ /dev/null @@ -1,54 +0,0 @@ -# 表达式渲染 - -## LaTeX - -> https://api.bilibili.com/x/web-frontend/mathjax/tex - -*请求方法: GET* - -暂未发现对跨源使用 `` 标签使用该接口的限制 - - - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ------ | ---- | ------ | ----- | -| formula | string | 公式 | 非必要 | LaTeX | - -**SVG 回复:** - -一个完整的 SVG (image/svg+xml) 文件, 可直接用于 HTML `` 或 Markdown `![]()` - -**示例:** - -```markdown -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\pi=3.14159265358979323846...) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=E=mc^2) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\ce{Fe+%2B+CuSO4+=+Cu+%2B+FeSO4}) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\ce{N2(g)+%2B+3H2(g)+<=>[\text{高温、高压、催化剂}]+2NH3(g)}) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=S=\frac{1}{3}Sh) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=y+=+\frac{1}{\dfrac{1}{x}+%2B+1} ) -``` - -
-查看渲染结果: - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\pi=3.14159265358979323846...) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=E=mc^2) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\ce{Fe+%2B+CuSO4+=+Cu+%2B+FeSO4}) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=\ce{N2(g)+%2B+3H2(g)+<=>[\text{高温、高压、催化剂}]+2NH3(g)}) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=S=\frac{1}{3}Sh) - -![](https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=y+=+\frac{1}{\dfrac{1}{x}+%2B+1} ) - -
diff --git a/docs/misc/picture.md b/docs/misc/picture.md deleted file mode 100644 index 646487d..0000000 --- a/docs/misc/picture.md +++ /dev/null @@ -1,97 +0,0 @@ -# 图片格式化 - -已知 `*.hdslb.com` `*.biliimg.com` 等域名作用等效, 对于请求头 `Referer` 要求留空或在 `.bilibili.com` 等 B 站域名下 - -对于以上域名的 `/bfs/` 下的图片文件都可以使用以下可选格式化参数 - -使用 `@` 开始参数 (无论格式如何, 无论是否有参数, 通过计算 HASH 发现, 使用 `@` 均会导致返回图片不同), 多个参数以 `_` 分隔, 图片格式无需分隔且必须放在最后 - -参见: [#191](https://github.com/SocialSisterYi/bilibili-API-collect/issues/191) - -注: jpg 即 jpeg, 二者等效. 网页端常用 AVIF, WebP. - -| 参数 | 格式 | 含义 | 备注 | -| ---- | ------- | ---------------- | ---------------- | -| w | ${int}w | 图片最大限制宽度 | 范围 [1, 9223372036854775807] | -| h | ${int}h | 图片最大限制高度 | 范围 [1, 9223372036854775807] | -| s | ${int}s | 作用尚不明确 | 不影响输出结果, 范围 [1, 9223372036854775807] | -| e | ${int}e | 改变大小 | 0: 保留比例取其小, 1: 保留比例取其大, 2: 不保留原比例 | -| p | ${int}p | 缩放倍数 | 默认100, 范围 [1, 1000] | -| o | ${int}o | 作用尚不明确 | 不影响输出结果 范围 [0, 1] | -| q | ${int}q | 图片质量百分比 | 仅限webp/jpeg/avif | -| c | ${int}c | 裁切图片(如果宽高允许) | 0: 不裁切但会修改图片, 1: 上传时的预设规则(若无则右下), 2: 左上, 3: 右上 | -| f | ${int}f | 作用尚不明确 | [0, 1]: 不改变图片, 2: 会改变图片 | -| progressive | progressive | 图片编码方式 | 仅限 jpeg(无: baseline, 有: progressive)/png(无:non-interlaced, 有: interlaced) | -| ! | !${str} | 加载来源 | web-home-carousel-cover, header, web-dynamic, web-avatar-space-header, ... | -| . | .${str} | 图片格式 | 仅限 png/jpeg/webp/avif/[avg_color](#avg_color格式说明) | - -**示例:** - -
-查看示例: - -原始图片 - -https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg - - - -高度限制为100 - -https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@100h - - - -宽度限制为100 - -https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@100w - - - -转换格式为webp - -https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@.webp - - - -转换为webp图片质量为1% - -https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@1q.webp - - -
- -## avg_color格式说明 - -当图片格式化输出格式为`avg_color`时 - -> /bfs/\*/\*.*@\*.avg_color - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ------ | -| RGB | str | 平均颜色值 | HEX | - -**示例:** - -获取 https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg 的平均颜色值 - -```shell -curl 'https://i1.hdslb.com/bfs/archive/e5fff1472bad1c0c6bcb3004205f9be23b58ffc0.jpg@.avg_color' -``` - -
-查看响应示例: - -```json -{ - "RGB": "#7d6f6c" -} -``` - -
diff --git a/docs/misc/sign/APP.md b/docs/misc/sign/APP.md deleted file mode 100644 index 8b51c05..0000000 --- a/docs/misc/sign/APP.md +++ /dev/null @@ -1,289 +0,0 @@ -# APP API 签名与鉴权 - -## APP API 签名特性 - -部分客户端专用的 REST API 存在基于参数签名的鉴权,需要使用规定的`appkey`及其对应的`appsec`与原始请求参数进行签名计算,部分`AppKey`及与之对应的`AppSec`已经被公开:见该文档 [APPKey](APPKey.md) - -- 不同 `appkey` 对应不同的 app (如客户端、概念版、必剪、漫画、bililink等) - -- 不同平台同 app 也会存在不同的 `appkey` (如安卓端、ios端、TV端等) - -- 同平台同 app 下不同功能也会存在不同的 `appkey`(如登录专用、取流专用等) - -- 不同版本的客户端的 `appkey` 也可能不同 - -- **appkey与appsec一一对应** - -## APP API 签名算法 - -1. 首先为参数中添加`appkey`字段 -2. 然后按照参数的 Key 重新排序 -3. 再对这个 Key-Value 进行 url query 序列化,并拼接与之对应的`appsec` (盐) 进行 **md5 Hash 运算**(32-bit 字符小写),该 hash 便是 API 签名 -4. 最后在参数尾部增添`sign`字段,它的 Value 为上一步计算所得的 hash,一并作为表单或 Query 提交 - -## Demo - -该 Demo 提供 [Python](#python)、[Java](#java)、[TS/JS](#typescript-javascript)、[Swift](#swift)、[C++](#cplusplus) 语言例程 - -使用 appkey = `1d8b6e7d45233436`, appsec = `560c52ccd288fed045859ed18bffd973` 对如下 `params` 参数进行签名 - -上述示例`appkey`、`AppSec`均来自文档 [APPKey](APPKey.md) - -### Python - -```python -import hashlib -import urllib.parse - -def appsign(params, appkey, appsec): - '为请求参数进行 APP 签名' - params.update({'appkey': appkey}) - params = dict(sorted(params.items())) # 按照 key 重排参数 - query = urllib.parse.urlencode(params) # 序列化参数 - sign = hashlib.md5((query+appsec).encode()).hexdigest() # 计算 api 签名 - params.update({'sign':sign}) - return params - -appkey = '1d8b6e7d45233436' -appsec = '560c52ccd288fed045859ed18bffd973' -params = { - 'id':114514, - 'str':'1919810', - 'test':'いいよ,こいよ', -} -signed_params = appsign(params, appkey, appsec) -query = urllib.parse.urlencode(signed_params) -print(signed_params) -print(query) -``` - -输出内容分别是进行 APP 签名的后参数的 key-Value 以及 url query 形式 - -``` -{'appkey': '1d8b6e7d45233436', 'id': 114514, 'str': '1919810', 'test': 'いいよ,こいよ', 'sign': '01479cf20504d865519ac50f33ba3a7d'} -appkey=1d8b6e7d45233436&id=114514&str=1919810&test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88&sign=01479cf20504d865519ac50f33ba3a7d -``` - -### Java - - -```java -package io.github.cctyl; - -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.net.URLEncoder; -import java.util.TreeMap; - -/** - * @author cctyl - */ -public class AppSigner { - - private static final String APP_KEY = "1d8b6e7d45233436"; - private static final String APP_SEC = "560c52ccd288fed045859ed18bffd973"; - - public static String appSign(Map params) { - // 为请求参数进行 APP 签名 - params.put("appkey", APP_KEY); - // 按照 key 重排参数 - Map sortedParams = new TreeMap<>(params); - // 序列化参数 - StringBuilder queryBuilder = new StringBuilder(); - for (Map.Entry entry : sortedParams.entrySet()) { - if (queryBuilder.length() > 0) { - queryBuilder.append('&'); - } - queryBuilder - .append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8)) - .append('=') - .append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8)); - } - return generateMD5(queryBuilder .append(APP_SEC).toString()); - } - - private static String generateMD5(String input) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] digest = md.digest(input.getBytes()); - StringBuilder sb = new StringBuilder(); - for (byte b : digest) { - sb.append(String.format("%02x", b)); - } - return sb.toString(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return null; - } - - public static void main(String[] args) { - Map params = new HashMap<>(); - params.put("id", "114514"); - params.put("str", "1919810"); - params.put("test", "いいよ,こいよ"); - System.out.println(appSign(params)); - } -} -``` - -输出结果为:01479cf20504d865519ac50f33ba3a7d - -### TypeScript/JavaScript - -```typescript -import { createHash } from 'node:crypto' - -type Params = Record - -const md5 = (str: string) => createHash('md5').update(str).digest('hex') - -/** - * 为请求参数进行 APP 签名 - */ -export function appSign(params: Params, appkey: string, appsec: string) { - params.appkey = appkey - const searchParams = new URLSearchParams(params) - searchParams.sort() - return md5(searchParams.toString() + appsec) -} - -console.log( - appSign( - { - id: 114514, - str: '1919810', - test: 'いいよ,こいよ', - }, - '1d8b6e7d45233436', - '560c52ccd288fed045859ed18bffd973', - ), - '01479cf20504d865519ac50f33ba3a7d', -) -``` - -输出结果为:01479cf20504d865519ac50f33ba3a7d - -### Swift - -```swift -import Foundation -import CommonCrypto - -//Swift标准库没有MD5函数,所以我们要自己实现一个 -func MD5(string: String) -> String { - let length = Int(CC_MD5_DIGEST_LENGTH) - var digest = [UInt8](repeating: 0, count: length) - - if let d = string.data(using: .utf8) { - _ = d.withUnsafeBytes { body -> String in - CC_MD5(body.baseAddress, CC_LONG(d.count), &digest) - return "" - } - } - - return (0.. String { - var signedParams = params - signedParams["appkey"] = appKey - let sortedParams = signedParams.sorted { $0.key < $1.key } - //在制作成query时,需要显式addingPercentEncoding转换 - let query = sortedParams.map { "\($0.key)=\($0.value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)" }.joined(separator: "&") - let sign = MD5(string: query+appSec) - return sign -} - - -//testSign -let appKey = "1d8b6e7d45233436" -let appSec = "560c52ccd288fed045859ed18bffd973" -let signResult = appSign(params: [ - "id": "114514", - "str": "1919810", - "test": "いいよ,こいよ", -],appKey:appKey,appSec:appSec) -print(signResult) -``` - -输出结果为:01479cf20504d865519ac50f33ba3a7d - - - -### CplusPlus - -需要 c++ 23 标准库,[cpr](https://github.com/libcpr/cpr)、[cryptopp](https://github.com/weidai11/cryptopp)、[nlohmann/json](https://github.com/nlohmann/json) 等依赖 - -```c++ -#include // std::println - -/// thrid party libraries -#include // cpr::util::urlEncode() -#include -#include -#include - -/* - * 注意,假定不会发生错误! - */ - -/* 获取 md5 hex(lower) */ -std::string Get_md5_hex(const std::string &Input_str) { - CryptoPP::Weak1::MD5 hash; - std::string md5_hex; - - CryptoPP::StringSource ss(Input_str, true, - new CryptoPP::HashFilter(hash, - new CryptoPP::HexEncoder( - new CryptoPP::StringSink(md5_hex) - ) - ) - ); - - std::ranges::for_each(md5_hex, [](char &x) { x = std::tolower(x); }); - return md5_hex; -} - -/* 将 json 转换为 url 编码字符串 */ -std::string Json_to_url_encode_str(const nlohmann::json &Json) { - std::string encode_str; - for (const auto &[key, value]: Json.items()) { - encode_str.append(key).append("=").append(cpr::util::urlEncode(value.is_string() ? value.get() : to_string(value))).append("&"); - } - - // remove the last '&' - encode_str.resize(encode_str.size() - 1, '\0'); - return encode_str; -} - -std::string App_sign(nlohmann::json &Params, const std::string &App_key, const std::string &App_sec) { - Params["appkey"] = App_key; - Params["sign"] = Get_md5_hex(Json_to_url_encode_str(Params) + App_sec); - return Json_to_url_encode_str(Params); -} - -int main() { - nlohmann::json Params; - Params["id"] = 114514; - Params["str"] = "1919810"; - Params["test"] = "いいよ,こいよ"; - - constexpr auto App_key = "1d8b6e7d45233436"; - constexpr auto App_sec = "560c52ccd288fed045859ed18bffd973"; - std::string sign = App_sign(Params, App_key, App_sec); - std::println("{}", to_string(Params)); - std::println("{}", sign); -} -``` - -```text -{"appkey":"1d8b6e7d45233436","id":114514,"sign":"01479cf20504d865519ac50f33ba3a7d","str":"1919810","test":"いいよ,こいよ"} -appkey=1d8b6e7d45233436&id=114514&sign=01479cf20504d865519ac50f33ba3a7d&str=1919810&test=%E3%81%84%E3%81%84%E3%82%88%EF%BC%8C%E3%81%93%E3%81%84%E3%82%88 -``` - diff --git a/docs/misc/sign/APPKey.md b/docs/misc/sign/APPKey.md deleted file mode 100644 index 0203970..0000000 --- a/docs/misc/sign/APPKey.md +++ /dev/null @@ -1,55 +0,0 @@ -# APPKey - -以下为已知的 APPkey / APPSec,及部分使用场景参数信息,均来自抓包与逆向工程 - -| APPKEY | APPSEC | platform2 | APP类型 | neuronAppId1 | mobi_app2 | 备注 | -| :--------------: | :------------------------------: | :------------------: | :----------------: | :---------------------: | :------------------: | :----------------------------------------: | -| 9d5889cf67e615cd | 8fd9bb32efea8cef801fd895bef2713d | `android` | Ai4cCreatorAndroid | | | | -| 1d8b6e7d45233436 | 560c52ccd288fed045859ed18bffd973 | `android` | 粉版 | `1` | `android` | 获取资源通用 | -| 783bbb7264451d82 | 2653583c8873dea268ab9386918b1d65 | `android` | 粉版 | `1` | `android` | 仅获取用户信息时使用(7.X及更新版本) | -| 57263273bc6b67f6 | a0488e488d1567960d3a765e8d129f90 | `android` | 粉版 | `1` | `android` | 可能来自旧版 | -| 07da50c9a0bf829f | 25bdede4e1581c836cab73a48790ca6e | `android` | 概念版 | `3` | `android_b` | | -| 191c3b6b975af184 | 1673b15a09ef5e4427627f47b03a0578 | `android` | 概念版 | `3` | `android_b` | 仅获取用户信息时使用(7.X及更新版本) | -| 178cf125136ca8ea | 34381a26236dd1171185c0beb042e1c6 | `android` | 概念版 | `3` | `android_b` | 可能来自旧版 | -| 7d336ec01856996b | a1ce6983bc89e20a36c37f40c4f1a0dd | `android` | 概念版 | `3` | `android_b` | 可能来自旧版 | -| dfca71928277209b | b5475a8825547a4fc26c7d518eaaa02e | `android` | HD 版 | `5` | `android_hd` | | -| bb3101000e232e27 | 36efcfed79309338ced0380abd824ac1 | `android` | 白版 | `14` | `android_i` | | -| ae57252b0c09105d | c75875c596a69eb55bd119e74b07cfe3 | `android` | 白版 | `14` | `android_i` | 仅获取用户信息时使用(7.X及更新版本) | -| 8e16697a1b4f8121 | f5dd03b752426f2e623d7badb28d190a | `android` | 白版 | `14` | `android_i` | 可能来自旧版 | -| 7d089525d3611b1c | acd495b248ec528c2eed1e862d393126 | `android` | 蓝版 | `30` | `bstar_a` | | -| iVGUTjsxvpLeuDCf | aHRmhWMLkdeMuILqORnYZocwMBpMEOdt | `android` | - | - | - | 视频取流专用, 仅5.X旧版使用 | -| YvirImLGlLANCLvM | JNlZNgfNGKZEpaDTkCdPQVXntXhuiJEM | `ios` | - | - | - | 视频取流专用 | -| 27eb53fc9058f8c3 | c2ed53a74eeefe3cf99fbd01d8c9c375 | `web`/`ios`? | - | - | - | 第三方授权使用 | -| 84956560bc028eb7 | 94aba54af9065f71de72f5508f1cd42e | ? | UWP 版 | - | - | 部分API不接受此appkey, 返回-663错误 | -| 85eb6835b0a1034e | 2ad42749773c441109bdc0191257a664 | ? | UWP 版? | - | - | 部分API不接受此appkey, 返回-663错误 | -| 4ebafd7c4951b366 | 8cb98205e9b2ad3669aad0fce12a4c13 | `ios` | iPhone 客户端? | `iphone` | ? | | -| 8d23902c1688a798 | 710f0212e62bd499b8d3ac6e1db9302a | `android` | AndroidBiliThings | ? | ? | | -| 4c6e1021617d40d9 | e559a59044eb2701b7a8628c86aa12ae | `android` | AndroidMallTicket | ? | ? | | -| c034e8b74130a886 | e4e8966b1e71847dc4a3830f2d078523 | `android` | AndroidOttSdk | `7` | ? | | -| 4409e2ce8ffd12b8 | 59b43e04ad6965f34319062b478f83dd | `android` | 云视听小电视(TV版) | `9`? | `android_tv_yst`? | | -| 37207f2beaebf8d7 | e988e794d4d4b6dd43bc0e89d6e90c43 | `android` | BiliLink | ? | ? | | -| 9a75abf7de2d8947 | 35ca1c82be6c2c242ecc04d88c735f31 | `android` | BiliScan | ? | ? | | -| aae92bc66f3edfab | af125a0d5279fd576c1b4418a3e8276d | ? | PC 投稿工具&PC直播姬| - | ? | | -| bca7e84c2d947ac6 | 60698ba2f68e01ce44738920a0ffe768 | ? | login | - | ? | | -| h9Ejat5tFh81cq8V | BdiI92bjmZ9QRcjJBWv2EEssyjekAGKt | | | | | bilibili游戏 web端 游戏详情页API | - -注释: - -1 `neuronAppId`,产品编号,由数据平台分配,详情如下: - -- 粉(国内版)=1 -- 白(GooglePlay 版)=2 -- 蓝(东南亚版)=3 -- 直播姬=4 -- HD=5 -- 海外=6 -- OTT=7 -- 漫画=8 -- TV野版=9 -- 小视频=10 -- 网易漫画=11 -- 网易漫画lite=12 -- 网易漫画HD=13, -- 国际版=14 - -2 `platform`, `mobi_app` 仅供参考, 具体值需要抓包确定. diff --git a/docs/misc/sign/bili_ticket.md b/docs/misc/sign/bili_ticket.md deleted file mode 100644 index c0ed0d8..0000000 --- a/docs/misc/sign/bili_ticket.md +++ /dev/null @@ -1,304 +0,0 @@ -# BiliTicket - -## 简述 - -`bili_ticket` 位于请求头 Cookie 中, 非必需, 但存在可降低风控概率 - -由 [@aynuarance](https://github.com/aynuarance) 于 [#903](https://github.com/SocialSisterYi/bilibili-API-collect/issues/903) 提供的思路,根据时间戳使用 `hmac_sha256` 算法计算 `hexsign`。 - -是 [JWT 令牌](https://jwt.io/),有效时长为 259260 秒,即 3 天。 -例如 `eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MDI3NDI3NDYsImlhdCI6MTcwMjQ4MzQ4NiwicGx0IjotMX0.xQgtTAc41NA1gzvd9yKUPgucUy_DKcQj6OG1vj8V7ZA` - -```json -{ - "alg": "HS256", - "kid": "s03", - "typ": "JWT" -} -``` - -## 算法 - -1. 获取 UNIX 秒级时间戳存入变量如 `timestamp` -2. 计算变量 `hexsign` 值,使用 `hmac_sha256` 算法,密钥为 `XgwSnGZ1p`,消息为字符串 `"ts"` 与变量 `timestamp` 值拼接 -3. 构造请求参数,`key_id` 为 `ec02`,`hexsign` 为变量 `hexsign` 值,`context[ts]` 为变量 `timestamp` 值,`csrf` 为 cookie 中的 `bili_jct` 值也可为空 -4. 发送 `POST` 请求,获取 `data` 字段中的 `ticket` 字段的值即为所求 - -## 接口 - -> https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket - -*请求方式: POST* - -鉴权方式: 请求头 `Referer` 为空或 `.bilibili.com` 子域下任意页 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----- | ---- | ---- | ------ | ---- | -| key_id | str | ec02 | 必要 | | -| hexsign | str | 由 `hmac_sha256` 算法计算的 `hexsign` 值 | 必要 | | -| context[ts] | num | UNIX 秒级时间戳 | 必要 | | -| csrf | str | cookie 中的 `bili_jct` 值 | 非必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | num | 返回值 | 0: 成功
400: 参数错误 | -| message | str | 返回消息 | OK: 成功 | -| data | obj | 数据本体 | | -| ttl | num | 1 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| ticket | str | bili_ticket | | -| created_at | num | 创建时间 | UNIX 秒级时间戳 | -| ttl | num | 有效时长 | 259200 秒 (3 天) | -| context | obj | 空 | | -| nav | obj | wbi_img 相关 | 参见 [WBI 签名](./wbi.md) | - -`nav` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| img | str | img_key 值 | 参见 [WBI 签名](./wbi.md) | -| sub | str | sub_key 值 | 参见 [WBI 签名](./wbi.md) | - -**示例:** - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "OK", - "data": { - "ticket": "eyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MjM2OTMwODAsImlhdCI6MTcyMzQzMzgyMCwicGx0IjotMX0.efOwv7i4m0ykABrXEDHGAechU2AByMcP_-3EYpQrNKs", - "created_at": 1723433820, - "ttl": 259200, - "context": {}, - "nav": { - "img": "https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png", - "sub": "https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png" - } - }, - "ttl": 1 -} -``` - -
- -## Demo - -此处提供 [Python](#python), [Java](#java), [JavaScript (Node.js)](#javascript-nodejs) 的示例代码 - -### Python - -需要 `requests` 依赖 - -```python -import hmac -import hashlib -import requests -import time - -def hmac_sha256(key, message): - """ - 使用HMAC-SHA256算法对给定的消息进行加密 - :param key: 密钥 - :param message: 要加密的消息 - :return: 加密后的哈希值 - """ - # 将密钥和消息转换为字节串 - key = key.encode('utf-8') - message = message.encode('utf-8') - - # 创建HMAC对象,使用SHA256哈希算法 - hmac_obj = hmac.new(key, message, hashlib.sha256) - - # 计算哈希值 - hash_value = hmac_obj.digest() - - # 将哈希值转换为十六进制字符串 - hash_hex = hash_value.hex() - - return hash_hex - - -if __name__ == '__main__': - o = hmac_sha256("XgwSnGZ1p",f"ts{int(time.time())}") - url = "https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket" - params = { - "key_id":"ec02", - "hexsign":o, - "context[ts]":f"{int(time.time())}", - "csrf": '' - } - - headers = { - 'user-agent': "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" - } - resp = requests.post(url, params=params,headers=headers).json() - print(resp) -``` - -### Java - -无需第三方依赖 - -```java -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URI; -import java.nio.charset.StandardCharsets; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -public class BiliTicketDemo { - - /** - * Convert a byte array to a hex string. - * - * @param bytes The byte array to convert. - * @return The hex string representation of the given byte array. - */ - public static String bytesToHex(byte[] bytes) { - StringBuilder sb = new StringBuilder(); - for (byte b : bytes) { - String hex = Integer.toHexString(0xff & b); - if (hex.length() == 1) { - sb.append('0'); - } - sb.append(hex); - } - return sb.toString(); - } - - /** - * Generate a HMAC-SHA256 hash of the given message string using the given key - * string. - * - * @param key The key string to use for the HMAC-SHA256 hash. - * @param message The message string to hash. - * @throws Exception If an error occurs during the HMAC-SHA256 hash generation. - * @return The HMAC-SHA256 hash of the given message string using the given key - * string. - */ - public static String hmacSha256(String key, String message) throws Exception { - Mac mac = Mac.getInstance("HmacSHA256"); - SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); - mac.init(secretKeySpec); - byte[] hash = mac.doFinal(message.getBytes(StandardCharsets.UTF_8)); - return bytesToHex(hash); - } - - /** - * Get a Bilibili web ticket for the given CSRF token. - * - * @param csrf The CSRF token to use for the web ticket, can be {@code null} or - * empty. - * @return The Bilibili web ticket raw response for the given CSRF token. - * @throws Exception If an error occurs during the web ticket generation. - * @see https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/misc/sign/bili_ticket.md - */ - public static String getBiliTicket(String csrf) throws Exception { - // params - long ts = System.currentTimeMillis() / 1000; - String hexSign = hmacSha256("XgwSnGZ1p", "ts" + ts); - StringBuilder url = new StringBuilder( - "https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket"); - url.append('?'); - url.append("key_id=ec02").append('&'); - url.append("hexsign=").append(hexSign).append('&'); - url.append("context[ts]=").append(ts).append('&'); - url.append("csrf=").append(csrf == null ? "" : csrf); - // request - HttpURLConnection conn = (HttpURLConnection) new URI(url.toString()).toURL().openConnection(); - conn.setRequestMethod("POST"); - conn.addRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"); - InputStream in = conn.getInputStream(); - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int b; - while ((b = in.read()) != -1) { - out.write(b); - } - return new String(out.toByteArray(), StandardCharsets.UTF_8); - } - - /** - * Main method to test the BiliTicketDemo class. - * - * @param args The command line arguments (not used). - */ - public static void main(String[] args) { - try { - System.out.println(getBiliTicket("")); // use empty CSRF here - } catch (Exception e) { - e.printStackTrace(); - } - } - -} -``` - -### JavaScript (Node.js) - -```javascript -const crypto = require('crypto'); - -/** - * Generate HMAC-SHA256 signature - * @param {string} key The key string to use for the HMAC-SHA256 hash - * @param {string} message The message string to hash - * @returns {string} The HMAC-SHA256 signature as a hex string - */ -function hmacSha256(key, message) { - const hmac = crypto.createHmac('sha256', key); - hmac.update(message); - return hmac.digest('hex'); -} - -/** - * Get Bilibili web ticket - * @param {string} csrf CSRF token, can be empty or null - * @returns {Promise} Promise of the ticket response in JSON format - */ -async function getBiliTicket(csrf) { - const ts = Math.floor(Date.now() / 1000); - const hexSign = hmacSha256('XgwSnGZ1p', `ts${ts}`); - const url = 'https://api.bilibili.com/bapis/bilibili.api.ticket.v1.Ticket/GenWebTicket'; - const params = new URLSearchParams({ - key_id: 'ec02', - hexsign: hexSign, - 'context[ts]': ts, - csrf: csrf || '' - }); - const response = await fetch(`${url}?${params.toString()}`, { - method: 'POST', - headers: { - 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0' - } - }); - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); - } - return response.json(); -} - -(async () => { - try { - const ticketResponse = await getBiliTicket(''); // use empty CSRF here - console.log(ticketResponse); - } catch (e) { - console.error('Failed to get BiliTicket:', e); - } -})(); -``` diff --git a/docs/misc/sign/v_voucher.md b/docs/misc/sign/v_voucher.md deleted file mode 100644 index 3804c80..0000000 --- a/docs/misc/sign/v_voucher.md +++ /dev/null @@ -1,179 +0,0 @@ -# v_voucher 验证 - -## 简述 - -当同一接口在短时间内被同一用户/IP/UA多次请求或异常时, 会触发风控, 如接口返回 `code` 为 `-352` 即 `风控校验失败`, 同时 `data` 中出现 `v_voucher` 字段, 响应头出现 `x-bili-gaia-vvoucher` - -`v_voucher` 结构为字符串 `voucher_` 尾随一串以 `-` 为分隔符的小写 UUID - -`v_voucher` 可用于申请 captcha 验证码, 若无意外发生, 根据验证结果使用 `validate` 接口获取 `grisk_id` 作为被风控接口的 `gaia_vtoken` 与 Cookie 中的 `x-bili-gaia-vtoken`, 即可恢复正常访问 - -若该情况出现在使用 Wbi 签名的接口中, 建议先检查 Wbi 签名是否正确. 若已检查 Wbi 签名或无需签名, 检查请求头中 `User-Agent` `Referer` 是否正常, 以及 `Cookie` 中 [`bili_ticket`](bili_ticket.md) [`b_nut` `buvid3` `buvid4`](../buvid3_4.md) 等是否存在. 使用 captcha 是最后的选择, 因为 captcha 验证需要用户操作 - -参见 [#1067](https://github.com/SocialSisterYi/bilibili-API-collect/issues/1067) - -**注意: 不是所有风控都可以使用本方式通过 captcha 解决** - -## 操作流程 - -1. 快速以不正确的姿势请求接口, 直到返回 `v_voucher` 字段如下. 若 `data` 中没有 `v_voucher` 字段, 则检查响应头 `x-bili-gaia-vvoucher` - - ```json - { - "code": -352, - "message": "风控校验失败", - "ttl": 1, - "data": { - "v_voucher": "voucher_84a8c3ce-33f5-4551-9552-9c6b13aa7938" - } - } - ``` - -2. [请求 `register` 接口](#从-v_voucher-申请-captcha), 请求体传入 `csrf` 及 `v_voucher`, 该接口返回与 [申请captcha验证码](../../login/login_action/readme.md#申请captcha验证码) 部分相同, 记录此处返回的 `token` `challenge` - -3. 按照 [验证captcha验证码](../../login/login_action/readme.md#验证captcha验证码) 进行验证, 记下验证结果的 `validate` 与 `seccode` - -4. [请求 `validate` 接口](#从验证结果获取-grisk_id), 请求体传入 `challenge` `token` `validate` `seccode` `csrf`, 该接口返回 `grisk_id` 即 `gaia_vtoken` 与 `x-bili-gaia-vtoken` - -5. 重新请求原接口, 原 URL 参数加入 `gaia_vtoken`, Cookie 加入 `x-bili-gaia-vtoken`, 即恢复正常 - -## 接口列表 - -### 从 v_voucher 申请 captcha - -> https://api.bilibili.com/x/gaia-vgate/v1/register - -注: 同一有效 `v_voucher` 只能请求一次, 请求完毕请立即 [进行验证](../../login/login_action/readme.md#进行验证) 防止过期失效 - -*请求方式: POST* - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------- | ------ | ---- | -| csrf | str | CSRF Token (位于 Cookie 的 bili_jct) | 非必要 | | -| v_voucher | str | v_voucher | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------ | ---- | -| code | num | 返回值 | 0:成功
100000: 验证码获取失败 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------ | ---- | -| type | str | 验证码类型 | 目前只有 `geetest` | -| token | str | 验证码 token | 用于验证 | -| geetest | obj | 极验信息 | 若为 null 则说明该风控无法通过 captcha 解除 | -| biliword | null | | | -| phone | null | | | -| sms | null | | | - -`geetest` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ----- | ------ | -------- | -| gt | str | 极验id | 一般为固定值 | -| challenge | str | 极验KEY | 由B站后端产生用于人机验证 | - -**示例:** - -假设此处 `v_voucher` 为 `voucher_ecca35e6-36da-4f38-bd84-b3f420ea08c1` - -```shell -curl -X POST "https://api.bilibili.com/x/gaia-vgate/v1/register" \ ---data-urlencode "v_voucher=voucher_ecca35e6-36da-4f38-bd84-b3f420ea08c1" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "type": "geetest", - "token": "e7abdb050c3d4609979f1685137e3bc0", - "geetest": { - "challenge": "85118f8714875ca4c6d5641bb0ce9ddf", - "gt": "ac597a4506fee079629df5d8b66dd4fe" - }, - "biliword": null, - "phone": null, - "sms": null - } -} -``` - -
- -## 从验证结果获取 grisk_id - -> https://api.bilibili.com/x/gaia-vgate/v1/validate - -*请求方式: POST* - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------ | ---- | ---- | -| csrf | str | CSRF Token (位于 Cookie 的 bili_jct) | 非必要 | 若登陆则必要 | -| challenge | str | 验证码 challenge | 必要 | | -| token | str | 验证码 token | 必要 | | -| validate | str | 验证结果 validate | 必要 | | -| seccode | str | 验证结果 seccode | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------ | ---- | -| code | num | 返回值 | 0:成功
-111: csrf 校验失败
100003: 验证码过期 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------ | ---- | -| is_valid | num | 验证结果 | 1:验证成功 | -| grisk_id | str | gaia_vtoken | 用于恢复正常访问 | - -**示例:** - -```shell -curl -X POST "https://api.bilibili.com/x/gaia-vgate/v1/validate" \ ---data-urlencode "challenge=e4fcb337b8c0427b56320f97e1064210" \ ---data-urlencode "csrf=xxxxxxxxxxxxxxx" \ ---data-urlencode "seccode=360f7b9cf75c74c68fbb7475416d0e0d|jordan" \ ---data-urlencode "token=0e1e58bdff3d4b8aa298e346fed07eeb" \ ---data-urlencode "validate=360f7b9cf75c74c68fbb7475416d0e0d" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "is_valid": 1, - "grisk_id": "2e91cf2b67172ca8432fe7c9ab66a5c4" - } -} -``` - -
diff --git a/docs/misc/sign/wbi.md b/docs/misc/sign/wbi.md deleted file mode 100644 index a28a204..0000000 --- a/docs/misc/sign/wbi.md +++ /dev/null @@ -1,1481 +0,0 @@ -# WBI 签名 - -自 2023 年 3 月起,Bilibili Web 端部分接口开始采用 WBI 签名鉴权,表现在 REST API 请求时在 Query param 中添加了 `w_rid` 和 `wts` 字段。WBI 签名鉴权独立于 [APP 鉴权](APP.md) 与其他 Cookie 鉴权,目前被认为是一种 Web 端风控手段。 - -经持续观察,大部分查询性接口都已经或准备采用 WBI 签名鉴权,请求 WBI 签名鉴权接口时,若签名参数 `w_rid` 与时间戳 `wts` 缺失、错误,会返回 [`v_voucher`](v_voucher.md),如: - -```json -{"code":0,"message":"0","ttl":1,"data":{"v_voucher":"voucher_******"}} -``` - -感谢 [#631](https://github.com/SocialSisterYi/bilibili-API-collect/issues/631) 的研究与逆向工程。 - -细节更新:[#885](https://github.com/SocialSisterYi/bilibili-API-collect/issues/885)。 - -最新进展: [#919](https://github.com/SocialSisterYi/bilibili-API-collect/issues/919) - -## WBI 签名算法 - -1. 获取实时口令 `img_key`、`sub_key` - - 从 [nav 接口](../../login/login_info.md#导航栏用户信息) 中获取 `img_url`、`sub_url` 两个字段的参数。 - 或从 [bili_ticket 接口](bili_ticket.md#接口) 中获取 `img` `sub` 两个字段的参数。 - - **注:`img_url`、`sub_url` 两个字段的值看似为存于 BFS 中的 png 图片 url,实则只是经过伪装的实时 Token,故无需且不能试图访问这两个 url** - - ```json - {"code":-101,"message":"账号未登录","ttl":1,"data":{"isLogin":false,"wbi_img":{"img_url":"https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png","sub_url":"https://i0.hdslb.com/bfs/wbi/4932caff0ff746eab6f01bf08b70ac45.png"}}} - ``` - - 截取其文件名,分别记为 `img_key`、`sub_key`,如上述例子中的 `7cd084941338484aae1ad9425b84077c` 和 `4932caff0ff746eab6f01bf08b70ac45`。 - - `img_key`、`sub_key` 全站统一使用,观测知应为**每日更替**,使用时建议做好**缓存和刷新**处理。 - - 特别地,发现部分接口将 `img_key`、`sub_key` 硬编码进 JavaScript 文件内,如搜索接口 `https://s1.hdslb.com/bfs/static/laputa-search/client/assets/index.1ea39bea.js`,暂不清楚原因及影响。 - 同时, 部分页面会在 SSR 的 `__INITIAL_STATE__` 包含 `wbiImgKey` 与 `wbiSubKey`, 具体可用性与区别尚不明确 - -2. 打乱重排实时口令获得 `mixin_key` - - 把上一步获取到的 `sub_key` 拼接在 `img_key` 后面(下例记为 `raw_wbi_key`),遍历重排映射表 `MIXIN_KEY_ENC_TAB`,取出 `raw_wbi_key` 中对应位置的字符拼接得到新的字符串,截取前 32 位,即为 `mixin_key`。 - - 重排映射表 `MIXIN_KEY_ENC_TAB` 长为 64,内容如下: - - ```rust - const MIXIN_KEY_ENC_TAB: [u8; 64] = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 - ] - ``` - - 重排操作如下例: - - ```rust - fn gen_mixin_key(raw_wbi_key: impl AsRef<[u8]>) -> String { - const MIXIN_KEY_ENC_TAB: [u8; 64] = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, - 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, - 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52, - ]; - let raw_wbi_key = raw_wbi_key.as_ref(); - let mut mixin_key = { - let binding = MIXIN_KEY_ENC_TAB - .iter() - // 此步操作即遍历 MIXIN_KEY_ENC_TAB,取出 raw_wbi_key 中对应位置的字符 - .map(|n| raw_wbi_key[*n as usize]) - // 并收集进数组内 - .collect::>(); - unsafe { String::from_utf8_unchecked(binding) } - }; - let _ = mixin_key.split_off(32); // 截取前 32 位字符 - mixin_key - } - ``` - - 如 `img_key` -> `7cd084941338484aae1ad9425b84077c`、`sub_key` -> `4932caff0ff746eab6f01bf08b70ac45` 经过上述操作后得到 `mixin_key` -> `ea1db124af3c7062474693fa704f4ff8`。 - -3. 计算签名(即 `w_rid`) - - 若下方内容为欲签名的**原始**请求参数(以 JavaScript Object 为例) - - ```javascript - { - foo: '114', - bar: '514', - zab: 1919810 - } - ``` - - `wts` 字段的值应为当前以秒为单位的 Unix 时间戳,如 `1702204169` - - 复制一份参数列表,添加 `wts` 参数,即: - - ```javascript - { - foo: '114', - bar: '514', - zab: 1919810, - wts: 1702204169 - } - ``` - - 随后按键名升序排序后百分号编码 URL Query,拼接前面得到的 `mixin_key`,如 `bar=514&foo=114&wts=1702204169&zab=1919810ea1db124af3c7062474693fa704f4ff8`,计算其 MD5 即为 `w_rid`。 - - 需要注意的是:如果参数值含中文或特殊字符等,编码字符字母应当**大写** (部分库会错误编码为小写字母),空格应当编码为 `%20`(部分库按 `application/x-www-form-urlencoded` 约定编码为 `+`), 具体正确行为可参考 [encodeURIComponent 函数](https://tc39.es/ecma262/multipage/global-object.html#sec-encodeuricomponent-uricomponent) - - 例如: - - ```javascript - { - foo: 'one one four', - bar: '五一四', - baz: 1919810 - } - ``` - - 应该被编码为 `bar=%E4%BA%94%E4%B8%80%E5%9B%9B&baz=1919810&foo=one%20one%20four`。 - -4. 向原始请求参数中添加 `w_rid`、`wts` 字段 - - 将上一步得到的 `w_rid` 以及前面的 `wts` 追加到**原始**请求参数编码得到的 URL Query 后即可,目前看来无需对原始请求参数排序。 - - 如前例最终得到 `bar=514&foo=114&zab=1919810&w_rid=8f6f2b5b3d485fe1886cec6a0be8c5d4&wts=1702204169`。 - -## Demo - -含 [Python](#python)、[JavaScript](#javascript)、[Golang](#golang)、[C#](#csharp)、[Java](#java)、[Kotlin](#kotlin)、[Swift](#swift)、[C++](#cplusplus)、[Rust](#rust)、[Haskell](#haskell) 语言编写的 Demo - -### Python - -需要`requests`依赖 - -```python -from functools import reduce -from hashlib import md5 -import urllib.parse -import time -import requests - -mixinKeyEncTab = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 -] - -def getMixinKey(orig: str): - '对 imgKey 和 subKey 进行字符顺序打乱编码' - return reduce(lambda s, i: s + orig[i], mixinKeyEncTab, '')[:32] - -def encWbi(params: dict, img_key: str, sub_key: str): - '为请求参数进行 wbi 签名' - mixin_key = getMixinKey(img_key + sub_key) - curr_time = round(time.time()) - params['wts'] = curr_time # 添加 wts 字段 - params = dict(sorted(params.items())) # 按照 key 重排参数 - # 过滤 value 中的 "!'()*" 字符 - params = { - k : ''.join(filter(lambda chr: chr not in "!'()*", str(v))) - for k, v - in params.items() - } - query = urllib.parse.urlencode(params) # 序列化参数 - wbi_sign = md5((query + mixin_key).encode()).hexdigest() # 计算 w_rid - params['w_rid'] = wbi_sign - return params - -def getWbiKeys() -> tuple[str, str]: - '获取最新的 img_key 和 sub_key' - headers = { - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', - 'Referer': 'https://www.bilibili.com/' - } - resp = requests.get('https://api.bilibili.com/x/web-interface/nav', headers=headers) - resp.raise_for_status() - json_content = resp.json() - img_url: str = json_content['data']['wbi_img']['img_url'] - sub_url: str = json_content['data']['wbi_img']['sub_url'] - img_key = img_url.rsplit('/', 1)[1].split('.')[0] - sub_key = sub_url.rsplit('/', 1)[1].split('.')[0] - return img_key, sub_key - -img_key, sub_key = getWbiKeys() - -signed_params = encWbi( - params={ - 'foo': '114', - 'bar': '514', - 'baz': 1919810 - }, - img_key=img_key, - sub_key=sub_key -) -query = urllib.parse.urlencode(signed_params) -print(signed_params) -print(query) -``` - -输出内容分别是进行 Wbi 签名的后参数的 key-Value 以及 url query 形式 - -``` -{'bar': '514', 'baz': '1919810', 'foo': '114', 'wts': '1702204169', 'w_rid': 'd3cbd2a2316089117134038bf4caf442'} -bar=514&baz=1919810&foo=114&wts=1702204169&w_rid=d3cbd2a2316089117134038bf4caf442 -``` - -### JavaScript - -需要 `fetch`(浏览器、NodeJS等环境自带)、`md5` 依赖 - - - - -```javascript -import md5 from 'md5' - -const mixinKeyEncTab = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 -] - -// 对 imgKey 和 subKey 进行字符顺序打乱编码 -const getMixinKey = (orig) => mixinKeyEncTab.map(n => orig[n]).join('').slice(0, 32) - -// 为请求参数进行 wbi 签名 -function encWbi(params, img_key, sub_key) { - const mixin_key = getMixinKey(img_key + sub_key), - curr_time = Math.round(Date.now() / 1000), - chr_filter = /[!'()*]/g - - Object.assign(params, { wts: curr_time }) // 添加 wts 字段 - // 按照 key 重排参数 - const query = Object - .keys(params) - .sort() - .map(key => { - // 过滤 value 中的 "!'()*" 字符 - const value = params[key].toString().replace(chr_filter, '') - return `${encodeURIComponent(key)}=${encodeURIComponent(value)}` - }) - .join('&') - - const wbi_sign = md5(query + mixin_key) // 计算 w_rid - - return query + '&w_rid=' + wbi_sign -} - -// 获取最新的 img_key 和 sub_key -async function getWbiKeys() { - const res = await fetch('https://api.bilibili.com/x/web-interface/nav', { - headers: { - // SESSDATA 字段 - Cookie: 'SESSDATA=xxxxxx', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', - Referer: 'https://www.bilibili.com/'//对于直接浏览器调用可能不适用 - } - }) - const { data: { wbi_img: { img_url, sub_url } } } = await res.json() - - return { - img_key: img_url.slice( - img_url.lastIndexOf('/') + 1, - img_url.lastIndexOf('.') - ), - sub_key: sub_url.slice( - sub_url.lastIndexOf('/') + 1, - sub_url.lastIndexOf('.') - ) - } -} - -async function main() { - const web_keys = await getWbiKeys() - const params = { foo: '114', bar: '514', baz: 1919810 }, - img_key = web_keys.img_key, - sub_key = web_keys.sub_key - const query = encWbi(params, img_key, sub_key) - console.log(query) -} - -main() -``` - - - - - -```typescript -import md5 from 'md5' - -const mixinKeyEncTab = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 -] - -// 对 imgKey 和 subKey 进行字符顺序打乱编码 -const getMixinKey = (orig: string) => - mixinKeyEncTab - .map((n) => orig[n]) - .join("") - .slice(0, 32); - -// 为请求参数进行 wbi 签名 -function encWbi( - params: { [key: string]: string | number | object }, - img_key: string, - sub_key: string -) { - const mixin_key = getMixinKey(img_key + sub_key), - curr_time = Math.round(Date.now() / 1000), - chr_filter = /[!'()*]/g; - - Object.assign(params, { wts: curr_time }); // 添加 wts 字段 - // 按照 key 重排参数 - const query = Object.keys(params) - .sort() - .map((key) => { - // 过滤 value 中的 "!'()*" 字符 - const value = params[key].toString().replace(chr_filter, ""); - return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; - }) - .join("&"); - - const wbi_sign = md5(query + mixin_key); // 计算 w_rid - - return query + "&w_rid=" + wbi_sign; -} -// 获取最新的 img_key 和 sub_key -async function getWbiKeys(SESSDATA: string) { - const res = await fetch('https://api.bilibili.com/x/web-interface/nav', { - headers: { - // SESSDATA 字段 - Cookie: `SESSDATA=${SESSDATA}`, - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', - Referer: 'https://www.bilibili.com/'//对于直接浏览器调用可能不适用 - } - }) - const { - data: { - wbi_img: { img_url, sub_url }, - }, - } = (await res.json()) as { - data: { - wbi_img: { img_url: string; sub_url: string }; - }; - }; - - return { - img_key: img_url.slice( - img_url.lastIndexOf('/') + 1, - img_url.lastIndexOf('.') - ), - sub_key: sub_url.slice( - sub_url.lastIndexOf('/') + 1, - sub_url.lastIndexOf('.') - ) - } -} - -async function main() { - const web_keys = await getWbiKeys("SESSDATA的值") - const params = { foo: '114', bar: '514', baz: 1919810 }, - img_key = web_keys.img_key, - sub_key = web_keys.sub_key - const query = encWbi(params, img_key, sub_key) - console.log(query) -} - -main() -``` - - - - -输出内容为进行 Wbi 签名的后参数的 url query 形式 - -``` -bar=514&baz=1919810&foo=114&wts=1684805578&w_rid=bb97e15f28edf445a0e4420d36f0157e -``` - -### Golang - -无第三方库 - -```go -package main - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "strconv" - "strings" - "time" -) - -func main() { - u, err := url.Parse("https://api.bilibili.com/x/space/wbi/acc/info?mid=1850091") - if err != nil { - panic(err) - } - fmt.Printf("orig: %s\n", u.String()) - err = Sign(u) - if err != nil { - panic(err) - } - fmt.Printf("signed: %s\n", u.String()) - - // 获取 wbi 时未修改 header - // 但实际使用签名后的 url 时发现风控较为严重 -} - -// Sign 为链接签名 -func Sign(u *url.URL) error { - return wbiKeys.Sign(u) -} - -// Update 无视过期时间更新 -func Update() error { - return wbiKeys.Update() -} - -func Get() (wk WbiKeys, err error) { - if err = wk.update(false); err != nil { - return WbiKeys{}, err - } - return wbiKeys, nil -} - -var wbiKeys WbiKeys - -type WbiKeys struct { - Img string - Sub string - Mixin string - lastUpdateTime time.Time -} - -// Sign 为链接签名 -func (wk *WbiKeys) Sign(u *url.URL) (err error) { - if err = wk.update(false); err != nil { - return err - } - - values := u.Query() - - values = removeUnwantedChars(values, '!', '\'', '(', ')', '*') // 必要性存疑? - - values.Set("wts", strconv.FormatInt(time.Now().Unix(), 10)) - - // [url.Values.Encode] 内会对参数排序, - // 且遍历 map 时本身就是无序的 - hash := md5.Sum([]byte(values.Encode() + wk.Mixin)) // Calculate w_rid - values.Set("w_rid", hex.EncodeToString(hash[:])) - u.RawQuery = values.Encode() - return nil -} - -// Update 无视过期时间更新 -func (wk *WbiKeys) Update() (err error) { - return wk.update(true) -} - -// update 按需更新 -func (wk *WbiKeys) update(purge bool) error { - if !purge && time.Since(wk.lastUpdateTime) < time.Hour { - return nil - } - - // 测试下来不用修改 header 也能过 - resp, err := http.Get("https://api.bilibili.com/x/web-interface/nav") - if err != nil { - return err - } - defer resp.Body.Close() - body, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - nav := Nav{} - err = json.Unmarshal(body, &nav) - if err != nil { - return err - } - - if nav.Code != 0 && nav.Code != -101 { // -101 未登录时也会返回两个 key - return fmt.Errorf("unexpected code: %d, message: %s", nav.Code, nav.Message) - } - img := nav.Data.WbiImg.ImgUrl - sub := nav.Data.WbiImg.SubUrl - if img == "" || sub == "" { - return fmt.Errorf("empty image or sub url: %s", body) - } - - // https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png - imgParts := strings.Split(img, "/") - subParts := strings.Split(sub, "/") - - // 7cd084941338484aae1ad9425b84077c.png - imgPng := imgParts[len(imgParts)-1] - subPng := subParts[len(subParts)-1] - - // 7cd084941338484aae1ad9425b84077c - wbiKeys.Img = strings.TrimSuffix(imgPng, ".png") - wbiKeys.Sub = strings.TrimSuffix(subPng, ".png") - - wbiKeys.mixin() - wbiKeys.lastUpdateTime = time.Now() - return nil -} - -func (wk *WbiKeys) mixin() { - var mixin [32]byte - wbi := wk.Img + wk.Sub - for i := range mixin { // for i := 0; i < len(mixin); i++ { - mixin[i] = wbi[mixinKeyEncTab[i]] - } - wk.Mixin = string(mixin[:]) -} - -var mixinKeyEncTab = [...]int{ - 46, 47, 18, 2, 53, 8, 23, 32, - 15, 50, 10, 31, 58, 3, 45, 35, - 27, 43, 5, 49, 33, 9, 42, 19, - 29, 28, 14, 39, 12, 38, 41, 13, - 37, 48, 7, 16, 24, 55, 40, 61, - 26, 17, 0, 1, 60, 51, 30, 4, - 22, 25, 54, 21, 56, 59, 6, 63, - 57, 62, 11, 36, 20, 34, 44, 52, -} - -func removeUnwantedChars(v url.Values, chars ...byte) url.Values { - b := []byte(v.Encode()) - for _, c := range chars { - b = bytes.ReplaceAll(b, []byte{c}, nil) - } - s, err := url.ParseQuery(string(b)) - if err != nil { - panic(err) - } - return s -} - -type Nav struct { - Code int `json:"code"` - Message string `json:"message"` - Ttl int `json:"ttl"` - Data struct { - WbiImg struct { - ImgUrl string `json:"img_url"` - SubUrl string `json:"sub_url"` - } `json:"wbi_img"` - - // ...... - } `json:"data"` -} -``` - -### CSharp - -无需依赖外部库 - -```cs -using System.Security.Cryptography; -using System.Text; -using System.Text.Json.Nodes; - -class Program -{ - private static HttpClient _httpClient = new(); - - private static readonly int[] MixinKeyEncTab = - { - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, - 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, - 57, 62, 11, 36, 20, 34, 44, 52 - }; - - //对 imgKey 和 subKey 进行字符顺序打乱编码 - private static string GetMixinKey(string orig) - { - return MixinKeyEncTab.Aggregate("", (s, i) => s + orig[i])[..32]; - } - - private static Dictionary EncWbi(Dictionary parameters, string imgKey, - string subKey) - { - string mixinKey = GetMixinKey(imgKey + subKey); - string currTime = DateTimeOffset.Now.ToUnixTimeSeconds().ToString(); - //添加 wts 字段 - parameters["wts"] = currTime; - // 按照 key 重排参数 - parameters = parameters.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value); - //过滤 value 中的 "!'()*" 字符 - parameters = parameters.ToDictionary( - kvp => kvp.Key, - kvp => new string(kvp.Value.Where(chr => !"!'()*".Contains(chr)).ToArray()) - ); - // 序列化参数 - string query = new FormUrlEncodedContent(parameters).ReadAsStringAsync().Result; - //计算 w_rid - using MD5 md5 = MD5.Create(); - byte[] hashBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query + mixinKey)); - string wbiSign = BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); - parameters["w_rid"] = wbiSign; - - return parameters; - } - - // 获取最新的 img_key 和 sub_key - private static async Task<(string, string)> GetWbiKeys() - { - var httpClient = new HttpClient(); - httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"); - httpClient.DefaultRequestHeaders.Referrer = new Uri("https://www.bilibili.com/"); - - HttpResponseMessage responseMessage = await httpClient.SendAsync(new HttpRequestMessage - { - Method = HttpMethod.Get, - RequestUri = new Uri("https://api.bilibili.com/x/web-interface/nav"), - }); - - JsonNode response = JsonNode.Parse(await responseMessage.Content.ReadAsStringAsync())!; - - string imgUrl = (string)response["data"]!["wbi_img"]!["img_url"]!; - imgUrl = imgUrl.Split("/")[^1].Split(".")[0]; - - string subUrl = (string)response["data"]!["wbi_img"]!["sub_url"]!; - subUrl = subUrl.Split("/")[^1].Split(".")[0]; - return (imgUrl, subUrl); - } - - - public static async Task Main() - { - var (imgKey, subKey) = await GetWbiKeys(); - - Dictionary signedParams = EncWbi( - parameters: new Dictionary - { - { "foo", "114" }, - { "bar", "514" }, - { "baz", "1919810" } - }, - imgKey: imgKey, - subKey: subKey - ); - - string query = await new FormUrlEncodedContent(signedParams).ReadAsStringAsync(); - - Console.WriteLine(query); - } -} -``` -输出内容为进行 Wbi 签名的后参数的 url query 形式 - -``` -bar=514&baz=1919810&foo=114&wts=1687541921&w_rid=26e82b1b9b3a11dbb1807a9228a40d3b -``` - -### Java - -```java -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.*; -import java.util.stream.Collectors; - -public class WbiTest { - private static final int[] mixinKeyEncTab = new int[]{ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 - }; - - private static final char[] hexDigits = "0123456789abcdef".toCharArray(); - - public static String md5(String input) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - byte[] messageDigest = md.digest(input.getBytes(StandardCharsets.UTF_8)); - char[] result = new char[messageDigest.length * 2]; - for (int i = 0; i < messageDigest.length; i++) { - result[i * 2] = hexDigits[(messageDigest[i] >> 4) & 0xF]; - result[i * 2 + 1] = hexDigits[messageDigest[i] & 0xF]; - } - return new String(result); - } catch (NoSuchAlgorithmException e) { - return null; - } - } - - public static String getMixinKey(String imgKey, String subKey) { - String s = imgKey + subKey; - StringBuilder key = new StringBuilder(); - for (int i = 0; i < 32; i++) - key.append(s.charAt(mixinKeyEncTab[i])); - return key.toString(); - } - - public static String encodeURIComponent(Object o) { - return URLEncoder.encode(o.toString(), StandardCharsets.UTF_8).replace("+", "%20"); - } - - public static void main(String[] args) { - String imgKey = "653657f524a547ac981ded72ea172057"; - String subKey = "6e4909c702f846728e64f6007736a338"; - String mixinKey = getMixinKey(imgKey, subKey); - System.out.println(mixinKey); // 72136226c6a73669787ee4fd02a74c27 - - // 用TreeMap自动排序 - TreeMap map = new TreeMap<>(); - map.put("foo", "one one four"); - map.put("bar", "五一四"); - map.put("baz", 1919810); - map.put("wts", System.currentTimeMillis() / 1000); - String param = map.entrySet().stream() - .map(it -> String.format("%s=%s", it.getKey(), encodeURIComponent(it.getValue()))) - .collect(Collectors.joining("&")); - String s = param + mixinKey; - - String wbiSign = md5(s); - System.out.println(wbiSign); - String finalParam = param + "&w_rid=" + wbiSign; - System.out.println(finalParam); - } -} -``` - -### Kotlin - -说明: 为了便于使用和缓存, 重新编写为实体类形式, 并拆分了多个文件. 使用官方的JSON序列化. (可以根据需要换成其他的) - -WbiParams.kt - -```kotlin -import kotlinx.serialization.Serializable -import kotlinx.serialization.json.JsonElement -import kotlinx.serialization.json.JsonObject -import kotlinx.serialization.json.jsonPrimitive - -private fun JsonElement?.get(): String { - check(this != null) { "No contents found" } - return this.jsonPrimitive.content.split('/').last().removeSuffix(".png") -} - -private val mixinKeyEncTab = intArrayOf( - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 -) - -@Serializable -data class WbiParams( - val imgKey: String, - val subKey: String, -) { - // 此处整合了切分参数(直接传入{img_url:string, sub_url:string}即可), 不需要可以删掉 - constructor(wbiImg: JsonObject) : this(wbiImg["img_url"].get(), wbiImg["sub_url"].get()) - - private val mixinKey: String - get() = (imgKey + subKey).let { s -> - buildString { - repeat(32) { - append(s[mixinKeyEncTab[it]]) - } - } - } - - // 创建对象(GET获取或者读缓存, 比如Redis)之后, 直接调用此函数处理 - fun enc(params: Map): String { - val sorted = params.filterValues { it != null }.toSortedMap() - return buildString { - append(sorted.toQueryString()) - val wts = System.currentTimeMillis() / 1000 - sorted["wts"] = wts - append("&wts=") - append(wts) - append("&w_rid=") - append((sorted.toQueryString() + mixinKey).toMD5()) - } - } -} -``` - -Extensions.kt - -```kotlin -import java.security.MessageDigest - -private val hexDigits = "0123456789abcdef".toCharArray() - -fun ByteArray.toHexString() = buildString(this.size shl 1) { - this@toHexString.forEach { byte -> - append(hexDigits[byte.toInt() ushr 4 and 15]) - append(hexDigits[byte.toInt() and 15]) - } -} - -fun String.toMD5(): String { - val md = MessageDigest.getInstance("MD5") - val digest = md.digest(this.toByteArray()) - return digest.toHexString() -} - -fun Map.toQueryString() = this.filterValues { it != null }.entries.joinToString("&") { (k, v) -> - "${k.encodeURIComponent()}=${v!!.encodeURIComponent()}" -} -``` - -获取和使用案例略 - -### PHP - -来自[SocialSisterYi/bilibili-API-collect#813](https://github.com/SocialSisterYi/bilibili-API-collect/issues/813) - -```php -getWbiKeys(); - return $this->encWbi($query, $wbi_keys['img_key'], $wbi_keys['sub_key']); - } - - private function getMixinKey($orig) { - $t = ''; - foreach ($this->mixinKeyEncTab as $n) $t .= $orig[$n]; - return substr($t, 0, 32); - } - - private function encWbi($params, $img_key, $sub_key) { - $mixin_key = $this->getMixinKey($img_key . $sub_key); - $curr_time = time(); - $chr_filter = "/[!'()*]/"; - - $query = []; - $params['wts'] = $curr_time; - - ksort($params); - - foreach ($params as $key => $value) { - $value = preg_replace($chr_filter, '', $value); - $query[] = urlencode($key) . '=' . urlencode($value); - } - - $query = implode('&', $query); - $wbi_sign = md5($query . $mixin_key); - - return $query . '&w_rid=' . $wbi_sign; - } - - private function getWbiKeys() { - $resp = @json_decode( - $this->curl_get( - 'https://api.bilibili.com/x/web-interface/nav', - null, - 'https://www.bilibili.com/' - ), true - ); - - if (!$resp) throw new Exception('请求失败'); - - $img_url = $resp['data']['wbi_img']['img_url']; - $sub_url = $resp['data']['wbi_img']['sub_url']; - - return [ - 'img_key' => substr(basename($img_url), 0, strpos(basename($img_url), '.')), - 'sub_key' => substr(basename($sub_url), 0, strpos(basename($sub_url), '.')) - ]; - } - - private function curl_get($url, $cookies = null, $referer = 'https://www.bilibili.com/', $ua = null, $proxy = null, $header = []) { - $ch = curl_init(); - $header[] = "Accept: */*"; - $header[] = "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7"; - $header[] = "Connection: close"; - $header[]="Referer:https://www.bilibili.com/"; - $header[] = "Cache-Control: max-age=0"; - curl_setopt_array($ch, [ - CURLOPT_HTTPGET => 1, - CURLOPT_CUSTOMREQUEST => 'GET', - CURLOPT_RETURNTRANSFER => 1, - CURLOPT_HTTPHEADER => $header, - CURLOPT_ENCODING => '', - CURLOPT_URL => $url, - CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.39', - CURLOPT_TIMEOUT => 15 - ]); - - if ($cookies) curl_setopt( - $ch, - CURLOPT_COOKIE, - $cookies - ); - - if ($referer) curl_setopt_array($ch, [ - CURLOPT_AUTOREFERER => $referer, - CURLOPT_REFERER => $referer - ]); - - $content = curl_exec($ch); - curl_close($ch); - return $content; - } -} - -$c = new Bilibili(); -echo $c->reQuery(['foo' => '114', 'bar' => '514', 'baz' => 1919810]); -// bar=514&baz=1919810&foo=114&wts=1700384803&w_rid=4614cb98d60a43e50c3a3033fe3d116b -``` - -### Rust - -需要 serde、serde_json、reqwest、tokio 以及 md5 - -```rust -use reqwest::header::USER_AGENT; -use serde::Deserialize; -use std::time::{SystemTime, UNIX_EPOCH}; - -const MIXIN_KEY_ENC_TAB: [usize; 64] = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, - 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, - 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52, -]; - -#[derive(Deserialize)] -struct WbiImg { - img_url: String, - sub_url: String, -} - -#[derive(Deserialize)] -struct Data { - wbi_img: WbiImg, -} - -#[derive(Deserialize)] -struct ResWbi { - data: Data, -} - -// 对 imgKey 和 subKey 进行字符顺序打乱编码 -fn get_mixin_key(orig: &[u8]) -> String { - MIXIN_KEY_ENC_TAB - .iter() - .take(32) - .map(|&i| orig[i] as char) - .collect::() -} - -fn get_url_encoded(s: &str) -> String { - s.chars() - .filter_map(|c| match c.is_ascii_alphanumeric() || "-_.~".contains(c) { - true => Some(c.to_string()), - false => { - // 过滤 value 中的 "!'()*" 字符 - if "!'()*".contains(c) { - return None; - } - let encoded = c - .encode_utf8(&mut [0; 4]) - .bytes() - .fold("".to_string(), |acc, b| acc + &format!("%{:02X}", b)); - Some(encoded) - } - }) - .collect::() -} - -// 为请求参数进行 wbi 签名 -fn encode_wbi(params: Vec<(&str, String)>, (img_key, sub_key): (String, String)) -> String { - let cur_time = match SystemTime::now().duration_since(UNIX_EPOCH) { - Ok(t) => t.as_secs(), - Err(_) => panic!("SystemTime before UNIX EPOCH!"), - }; - _encode_wbi(params, (img_key, sub_key), cur_time) -} - -fn _encode_wbi( - mut params: Vec<(&str, String)>, - (img_key, sub_key): (String, String), - timestamp: u64, -) -> String { - let mixin_key = get_mixin_key((img_key + &sub_key).as_bytes()); - // 添加当前时间戳 - params.push(("wts", timestamp.to_string())); - // 重新排序 - params.sort_by(|a, b| a.0.cmp(b.0)); - // 拼接参数 - let query = params - .iter() - .map(|(k, v)| format!("{}={}", get_url_encoded(k), get_url_encoded(v))) - .collect::>() - .join("&"); - // 计算签名 - let web_sign = format!("{:?}", md5::compute(query.clone() + &mixin_key)); - // 返回最终的 query - query + &format!("&w_rid={}", web_sign) -} - -async fn get_wbi_keys() -> Result<(String, String), reqwest::Error> { - let client = reqwest::Client::new(); - let ResWbi { data:Data{wbi_img} } = client - .get("https://api.bilibili.com/x/web-interface/nav") - .header(USER_AGENT,"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36") - .header("Referer","https://www.bilibili.com/") - // SESSDATA=xxxxx - .header("Cookie", "SESSDATA=xxxxx") - .send() - .await? - .json::() - .await?; - Ok(( - take_filename(wbi_img.img_url).unwrap(), - take_filename(wbi_img.sub_url).unwrap(), - )) -} - -fn take_filename(url: String) -> Option { - url.rsplit_once('/') - .and_then(|(_, s)| s.rsplit_once('.')) - .map(|(s, _)| s.to_string()) -} - -#[tokio::main] -async fn main() { - let keys = get_wbi_keys().await.unwrap(); - let params = vec![ - ("foo", String::from("114")), - ("bar", String::from("514")), - ("baz", String::from("1919810")), - ]; - let query = encode_wbi(params, keys); - println!("{}", query); -} - -// 取自文档描述的测试用例 -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_get_filename() { - assert_eq!( - take_filename( - "https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png".to_string() - ), - Some("7cd084941338484aae1ad9425b84077c".to_string()) - ); - } - - #[test] - fn test_get_mixin_key() { - let concat_key = - "7cd084941338484aae1ad9425b84077c".to_string() + "4932caff0ff746eab6f01bf08b70ac45"; - assert_eq!( - get_mixin_key(concat_key.as_bytes()), - "ea1db124af3c7062474693fa704f4ff8" - ); - } - - #[test] - fn test_encode_wbi() { - let params = vec![ - ("foo", String::from("114")), - ("bar", String::from("514")), - ("zab", String::from("1919810")), - ]; - assert_eq!( - _encode_wbi( - params, - ( - "7cd084941338484aae1ad9425b84077c".to_string(), - "4932caff0ff746eab6f01bf08b70ac45".to_string() - ), - 1702204169 - ), - "bar=514&foo=114&wts=1702204169&zab=1919810&w_rid=8f6f2b5b3d485fe1886cec6a0be8c5d4" - .to_string() - ) - } -} -``` - -### Swift - -需要 [Alamofire](https://github.com/Alamofire/Alamofire) 和 [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON) 库 - -```swift -import Alamofire -import CommonCrypto -import Foundation -import SwiftyJSON - -func biliWbiSign(param: String, completion: @escaping (String?) -> Void) { - func getMixinKey(orig: String) -> String { - return String(mixinKeyEncTab.map { orig[orig.index(orig.startIndex, offsetBy: $0)] }.prefix(32)) - } - - func encWbi(params: [String: Any], imgKey: String, subKey: String) -> [String: Any] { - var params = params - let mixinKey = getMixinKey(orig: imgKey + subKey) - let currTime = Int(Date().timeIntervalSince1970) - params["wts"] = currTime - let query = params.sorted { - $0.key < $1.key - }.map { (key, value) -> String in - let stringValue: String - if let doubleValue = value as? Double, doubleValue.truncatingRemainder(dividingBy: 1) == 0 { - stringValue = String(Int(doubleValue)) - } else { - stringValue = String(describing: value) - } - let filteredValue = stringValue.filter { !"!'()*".contains($0) } - return "\(key)=\(filteredValue)" - }.joined(separator: "&") - let wbiSign = calculateMD5(string: query + mixinKey) - params["w_rid"] = wbiSign - return params - } - - func getWbiKeys(completion: @escaping (Result<(imgKey: String, subKey: String), Error>) -> Void) { - let headers: HTTPHeaders = [ - "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", - "Referer": "https://www.bilibili.com/" - ] - - AF.request("https://api.bilibili.com/x/web-interface/nav", headers: headers).responseJSON { response in - switch response.result { - case .success(let value): - let json = JSON(value) - let imgURL = json["data"]["wbi_img"]["img_url"].string ?? "" - let subURL = json["data"]["wbi_img"]["sub_url"].string ?? "" - let imgKey = imgURL.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? "" - let subKey = subURL.components(separatedBy: "/").last?.components(separatedBy: ".").first ?? "" - completion(.success((imgKey, subKey))) - case .failure(let error): - completion(.failure(error)) - } - } - } - - func calculateMD5(string: String) -> String { - let data = Data(string.utf8) - var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) - _ = data.withUnsafeBytes { - CC_MD5($0.baseAddress, CC_LONG(data.count), &digest) - } - return digest.map { String(format: "%02hhx", $0) }.joined() - } - - let mixinKeyEncTab = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 - ] - - getWbiKeys { result in - switch result { - case .success(let keys): - let spdParam = param.components(separatedBy: "&") - var spdDicParam = [String: String]() - for pair in spdParam { - let components = pair.components(separatedBy: "=") - if components.count == 2 { - spdDicParam[components[0]] = components[1] - } - } - - let signedParams = encWbi(params: spdDicParam, imgKey: keys.imgKey, subKey: keys.subKey) - let query = signedParams.map { "\($0.key)=\($0.value)" }.joined(separator: "&") - completion(query) - case .failure(let error): - print("Error getting keys: \(error)") - completion(nil) - } - } -} - -// 使用示例 -biliWbiSign(param: "bar=514&foo=114&zab=1919810") { - signedQuery in - if let signedQuery = signedQuery { - print("签名后的参数: \(signedQuery)") - } else { - print("签名失败") - } -} - -RunLoop.main.run()//程序类型为命令行程序时需要添加这行代码 - -``` - -```text -签名后的参数: bar=514&wts=1741082093&foo=114&zab=1919810&w_rid=04775bb3debbb45bab86a93a1c08d12a -``` - - -### CPlusPlus - -需要 c++ 23 标准库,[cpr](https://github.com/libcpr/cpr)、[cryptopp](https://github.com/weidai11/cryptopp)、[nlohmann/json](https://github.com/nlohmann/json) 等依赖 - -```c++ -#include // std::array -#include // std::locale -#include // std::println - -/// thrid party libraries -#include -#include -#include -#include - -/* - * 注意,假定不会发生错误! - */ -class Wbi { - constexpr static std::array MIXIN_KEY_ENC_TAB_ = { - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, - 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, - 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, - 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 - }; - - /* 获取 md5 hex(lower) */ - static std::string Get_md5_hex(const std::string &Input_str) { - CryptoPP::Weak1::MD5 hash; - std::string md5_hex; - - CryptoPP::StringSource ss(Input_str, true, - new CryptoPP::HashFilter(hash, - new CryptoPP::HexEncoder( - new CryptoPP::StringSink(md5_hex) - ) - ) - ); - - std::ranges::for_each(md5_hex, [](char &x) { x = std::tolower(x); }); - return md5_hex; - } - -public: - /* 将 json 转换为 url 编码字符串 */ - static std::string Json_to_url_encode_str(const nlohmann::json &Json) { - std::string encode_str; - for (const auto &[key, value]: Json.items()) { - encode_str.append(key).append("=").append(cpr::util::urlEncode(value.is_string() ? value.get() : to_string(value))).append("&"); - } - - // remove the last '&' - encode_str.resize(encode_str.size() - 1, '\0'); - return encode_str; - } - - /* 获取 wbi key */ - static std::pair Get_wbi_key() { - const auto url = cpr::Url {"https://api.bilibili.com/x/web-interface/nav"}; - const auto cookie = cpr::Cookies { - {"SESSDATA", "xxxxxxxxxxxx"}, - }; - const auto header = cpr::Header { - {"User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}, - {"Referer", "https://www.bilibili.com/"}, - }; - const auto response = cpr::Get(url, cookie, header); - - nlohmann::json json = nlohmann::json::parse(response.text); - - const std::string img_url = json["data"]["wbi_img"]["img_url"]; - const std::string sub_url = json["data"]["wbi_img"]["sub_url"]; - - std::string img_key = img_url.substr(img_url.find("wbi/") + 4, img_url.find(".png") - img_url.find("wbi/") - 4); - std::string sub_key = sub_url.substr(sub_url.find("wbi/") + 4, sub_url.find(".png") - sub_url.find("wbi/") - 4); - return {img_key, sub_key}; - } - - /* 获取 mixin key */ - static std::string Get_mixin_key(const std::string &Img_key, const std::string &Sub_key) { - std::string raw_wbi_key_str = Img_key + Sub_key; - std::string result; - - std::ranges::for_each(MIXIN_KEY_ENC_TAB_, [&result, &raw_wbi_key_str](const uint8_t x) { - result.push_back(raw_wbi_key_str.at(x)); - }); - - return result.substr(0, 32); - } - - /* 计算签名(w_rid) */ - static std::string Calc_sign(nlohmann::json &Params, const std::string &Mixin_key) { - Params["wts"] = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - - const std::string encode_str = Json_to_url_encode_str(Params).append(Mixin_key); - return Get_md5_hex(encode_str); - } -}; - - -int main() { - nlohmann::json Params; - // qn=32&fnver=0&fnval=4048&fourk=1&avid=1755630705&cid=1574294582 - Params["qn"] = 32; - Params["fnver"] = 0; - Params["fnval"] = 4048; - Params["fourk"] = 1; - Params["avid"] = 1755630705; - Params["cid"] = 1574294582; - - auto [img_key, sub_key] = Wbi::Get_wbi_key(); - const auto mixin_key = Wbi::Get_mixin_key(img_key, sub_key); - const auto w_rid = Wbi::Calc_sign(Params, mixin_key); - std::println("{}", Wbi::Json_to_url_encode_str(Params) + "&w_rid=" + w_rid); -} -``` - -```text -avid=1755630705&cid=1574294582&fnval=4048&fnver=0&fourk=1&qn=32&wts=1717922933&w_rid=43571b838a1611fa121189083cfc1784 -``` - -### Haskell - -无第三方依赖: `base`, `Cabal-syntax`, `bytestring`, `containers`
-注: 此处使用自写的 URI 编码模块, 实际可用别的第三方库替代 - -`Main.hs`: -```hs -module Main (wbi, main) where - -import Data.ByteString.Char8 (pack) -import qualified Data.Map.Strict as Map -import Distribution.Utils.MD5 (md5, showMD5) -import URIEncoder (encodeURIComponent) -import Data.Time.Clock.System (getSystemTime, systemSeconds) - -mixinKeyEncTab :: [Int] -mixinKeyEncTab = [ - 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, - 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, - 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, - 36, 20, 34, 44, 52 - ] - -getMixinKey :: String -> String -> String -getMixinKey imgKey subKey = - let s = imgKey ++ subKey - in map (\i -> s !! (mixinKeyEncTab !! i)) [0..31] - -join :: [String] -> String -> String -join arr ins = concatMap (++ ins) (init arr) ++ last arr - -wbi :: String -> String -> Integer -> Map.Map String String -> String -wbi imgKey subKey wts params = - let orig = join (map (\(k, v) -> encodeURIComponent k ++ "=" ++ encodeURIComponent v) (Map.toList $ Map.insert "wts" (show wts) params)) "&" - in orig ++ "&w_rid=" ++ showMD5 (md5 $ pack $ orig ++ getMixinKey imgKey subKey) - -main :: IO () -main = do -- hard encode for test - let params1 = Map.fromList [("aid", "2")] - params2 = Map.fromList [("foo", "114") - ,("bar", "514") - ,("hello", "世 界") - ] - imgKey = "7cd084941338484aae1ad9425b84077c" - subKey = "4932caff0ff746eab6f01bf08b70ac45" - wts1 <- getSystemTime - putStrLn $ wbi imgKey subKey (toInteger $ systemSeconds wts1) params1 - wts2 <- getSystemTime - putStrLn $ wbi imgKey subKey (toInteger $ systemSeconds wts2) params2 -``` - -`URIEncoder.hs`: -```hs -module URIEncoder (encodeURIComponent) where - -import Data.Char (ord, chr, intToDigit) -import Data.Bits (shiftL, shiftR, (.&.)) -import Data.List (isInfixOf) - --- ES 19.2.6.4 encodeURIComponent ( uriComponent ) -encodeURIComponent :: String -> String -encodeURIComponent input = case encode input "" of - Right result -> result - Left err -> error err - --- ES 19.2.6.5 Encode ( string, extraUnescaped ) -encode :: String -> String -> Either String String -encode string extraUnescaped = loop 0 string - where - alwaysUnescaped = ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "-.!~*'()" - unescapedSet = alwaysUnescaped ++ extraUnescaped - - loop k str - | k >= length str = Right [] - | otherwise = case codePointAt str k of - (Nothing, _) -> Left "Unpaired surrogate" - (Just (cp, _), newK) -> - if [str !! k] `isInfixOf` unescapedSet - then (str !! k :) <$> loop (k + 1) str - else do - bytes <- utf8Encode cp - let escaped = concatMap percentEncode bytes - rest <- loop newK str - Right (escaped ++ rest) - -codePointAt :: String -> Int -> (Maybe (Int, Int), Int) -codePointAt s k - | k >= length s = (Nothing, k) - | otherwise = - let c1 = ord (s !! k) - in if 0xD800 <= c1 && c1 <= 0xDBFF && k+1 < length s - then let c2 = ord (s !! (k+1)) - in if 0xDC00 <= c2 && c2 <= 0xDFFF - then ( Just (0x10000 + ((c1 - 0xD800) `shiftL` 10) + (c2 - 0xDC00), 2) - , k + 2 ) - else (Just (c1, 1), k + 1) - else (Just (c1, 1), k + 1) - -utf8Encode :: Int -> Either String [Int] -utf8Encode cp - | cp < 0 = Left "Invalid code point" - | cp <= 0x007F = Right [cp] - | cp <= 0x07FF = Right - [ 0xC0 + (cp `shiftR` 6) - , 0x80 + (cp .&. 0x3F) ] - | cp <= 0xFFFF = Right - [ 0xE0 + (cp `shiftR` 12) - , 0x80 + ((cp `shiftR` 6) .&. 0x3F) - , 0x80 + (cp .&. 0x3F) ] - | cp <= 0x10FFFF = Right - [ 0xF0 + (cp `shiftR` 18) - , 0x80 + ((cp `shiftR` 12) .&. 0x3F) - , 0x80 + ((cp `shiftR` 6) .&. 0x3F) - , 0x80 + (cp .&. 0x3F) ] - | otherwise = Left "Code point out of range" - -percentEncode :: Int -> String -percentEncode byte = '%' : toHex byte - where - toHex n = [hexDigit (n `div` 16), hexDigit (n `mod` 16)] - hexDigit x - | x < 10 = intToDigit x - | otherwise = chr (x - 10 + ord 'A') -``` - -输出: -```text -aid=2&wts=1744823207&w_rid=a3cd246bd42c066932752b24694eaf0d -bar=514&foo=114&hello=%E4%B8%96%20%E7%95%8C&wts=1744823207&w_rid=93acf59d85f74453e40cea00056c3daf -``` diff --git a/docs/misc/time_stamp.md b/docs/misc/time_stamp.md deleted file mode 100644 index 58e0709..0000000 --- a/docs/misc/time_stamp.md +++ /dev/null @@ -1,127 +0,0 @@ -# 获取当前时间戳 - -## 获取当前时间戳 - -> https://api.bilibili.com/x/report/click/now -> https://api.bilibili.com/x/click-interface/click/now - -*请求方式:GET* - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---- | -| now | num | 当前的时间戳 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/report/click/now' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "now": 1592666471 - } -} -``` - -
- -## 获取适用于 RTC 的时间戳 - -> https://api.live.bilibili.com/xlive/open-interface/v1/rtc/getTimestamp - -*请求方法: GET* - - - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | - | - | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | - | - | -| timestamp | num | 服务器端UTC时间戳 | | -| microtime | num | 服务器端UTC时间戳 (毫秒) | | - -**示例:** - -```shell -curl 'https://api.live.bilibili.com/xlive/open-interface/v1/rtc/getTimestamp' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "timestamp": 1723899823, - "microtime": 1723899823683 - } -} -``` - -
- -## 获取服务器端UTC时间 - -> https://interface.bilibili.com/serverdate.js - -*请求方式:GET* - -**js回复:** - -```js -window.serverdate = Date.UTC(YYYY, M, D, h, m, s); -``` - -**示例:** - -```shell -curl 'https://interface.bilibili.com/serverdate.js' -``` - -
-查看响应示例: - -```js -window.serverdate = Date.UTC(2021, 4, 16, 17, 31, 8); -``` - -
diff --git a/docs/newbie_exam/action.md b/docs/newbie_exam/action.md deleted file mode 100644 index d75967a..0000000 --- a/docs/newbie_exam/action.md +++ /dev/null @@ -1,445 +0,0 @@ -# 操作 - -## 提交答题 - -### 提交基础题 - -> https://api.bilibili.com/x/answer/v4/base/check - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ | -| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41020:用户基础题已通过
41023:用户答题记录不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ----------------------------------- | -| passed | bool | 选项是否正确 | true:选项正确
false:选项错误 | - -**示例:** - -提交题目id为`104`的题,选项hash为`cb4c8cc9424fc771f7c1598e74de498f` - -```shell -curl 'https://api.bilibili.com/x/answer/v4/base/check' \ ---data-urlencode 'question_id=104' \ ---data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "passed": true - } -} -``` - -
- -### 提交附加题 - -> https://api.bilibili.com/x/answer/v4/base/check - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ | -| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41023:用户答题记录不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ----------------------------------- | -| passed | bool | 选项是否正确 | true:选项正确
false:选项错误 | - -**示例:** - -提交题目id为`104`的题,选项hash为`cb4c8cc9424fc771f7c1598e74de498f` - -```shell -curl 'https://api.bilibili.com/x/answer/v4/base/check' \ ---data-urlencode 'question_id=104' \ ---data-urlencode 'ans_hash=cb4c8cc9424fc771f7c1598e74de498f' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "passed": true - } -} -``` - -
- -### 提交自选题 - -> https://api.bilibili.com/x/answer/v4/pro/check - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | -------------- | ------------------------------------------ | -| question_id | num | 题目id | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| ans_hash | str | 选项hash | 必要 | 从[拉取基础题api](fetch.md#拉取基础题)获得 | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41012:用户答题提交题目id不合法
41023:用户答题记录不存在
41026:获取用户DB题目信息异常 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---- | ---------- | -| passed | bool | true | 恒为`true` | - -**示例:** - -提交题目id为`2935`的题,选项hash为`ffd55cbe0624f466bee2ea3eb576a4d0` - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/pro/check' \ ---data-urlencode 'question_id=2935' \ ---data-urlencode 'ans_hash=ffd55cbe0624f466bee2ea3eb576a4d0' \ ---data-urlencode 'csrf=xxxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "passed": true - } -} -``` - -
- -## 获取验证码 - -> https://api.bilibili.com/x/answer/v4/captcha - -*请求方式:GET* - -认证方式:APP或Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41020:用户基础题已通过
41021:用户基础题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ----------- | ------------- | -| type | str | 验证码类型? | geetest:极验 | -| gt | str | 极验id | | -| challenge | str | 极验key | | -| token | str | (?) | | -| url | str | (?) | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/answer/v4/captcha' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "type": "geetest", - "gt": "abc55d1fb914cb110cfb4c232a4b4c35", - "challenge": "90a6e03e626e13ee186ddae0107c3ae2", - "token": "", - "url": "" - } -} -``` - -
- -## 提交验证码 - -> https://api.bilibili.com/x/answer/v4/captcha/check - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**注:** - -旧版`edition=0`同时提交自选题分类以及验证码 - -新版`edition=2`仅仅提交验证码 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------------- | ---- | ---------------------- | -------------- | ---------------- | -| types | nums | 自选题分类(旧版) | 非必要 | 新版不需要此字段 | -| type | str | 验证码类型 | 非必要 | | -| bilibili_token | str | | 非必要 | | -| bilibili_code | str | | 非必要 | | -| geetest_challenge | str | 极验key | 非必要 | | -| geetest_seccode | str | 极验结果+\|jordan | 非必要 | | -| geetest_validate | str | 极验结果 | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-105:验证码错误
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/answer/v4/captcha/check' \ ---data-urlencode 'types=' \ ---data-urlencode 'type=geetest' \ ---data-urlencode 'bilibili_token=' \ ---data-urlencode 'bilibili_code=' \ ---data-urlencode 'geetest_challenge=3f809a7a9c51edca751fd26c032c182d' \ ---data-urlencode 'geetest_seccode=513ec576a275a3eb250829202d4dce46|jordan' \ ---data-urlencode 'geetest_validate=513ec576a275a3eb250829202d4dce46' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -## 提交自选题分类 - -> https://api.bilibili.com/x/answer/v4/pro/type/check - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------------------- | -------------- | ---- | -| types | nums | 自选题分类(新版) | 必要 | | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41010:用户答题非法访问
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过
41052:用户题目类型不合法
41055:基础附加题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -选择`游戏` `影视` `科教/知识` `动画/动漫`分类 - -```shell -curl 'https://api.bilibili.com/x/answer/v4/pro/type/check' \ ---data-urlencode 'types=1,2,3,4' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -## 提前交卷 - -> https://api.bilibili.com/x/answer/v4/submit - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -当当前得分>=60时,可请求本接口提前完成答题 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------------------- | -------------- | ---- | -| csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
41014:答题过快或错误太多
41023:用户答题记录不存在
41031:自选题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------------- | -------------------------------------------- | -| hid | num | 答题会话id | | -| mid | num | 答题用户mid | | -| score | num | 得分 | | -| status | num | 0 | | -| number | num | 0 | | -| result | str | succeed | | -| stage | str | result | | -| version | str | 版本 | 目前为`v4` | -| start_time | num | 本次答题开始时间 | 时间戳 | -| first_answer | num | 0 | | -| progress | str | | | -| text | str | | | -| url | str | | | -| in_reg_audit | bool | | | -| edition | num | 答题版本 | 0:旧版(40+10+50)
2:新版(40+30+30) | -| rewards | null | | | -| captcha | num | 1 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/answer/v4/submit' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "hid": 1623207905520705, - "mid": 293793435, - "score": 63, - "status": 3, - "number": 0, - "result": "succeed", - "stage": "result", - "version": "v4", - "start_time": 1636889218, - "first_answer": 0, - "progress": "", - "text": "", - "url": "", - "in_reg_audit": false, - "edition": 0, - "rewards": null, - "captcha": 1 - } -} -``` - -
diff --git a/docs/newbie_exam/fetch.md b/docs/newbie_exam/fetch.md deleted file mode 100644 index f5fbd74..0000000 --- a/docs/newbie_exam/fetch.md +++ /dev/null @@ -1,257 +0,0 @@ -# 拉取题目 - -## 拉取基础题 - -> https://api.bilibili.com/x/answer/v4/base - -*请求方式:GET* - -认证方式:Cookie或APP - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41020:用户基础题已通过
41023:用户答题记录不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ---- | -| question | obj | 题目内容 | | - -`data`中的`question`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ------------------ | ------------------------------------------------------------ | -| id | num | 问题id | **问题id不代表题图,因为选项是打乱的** | -| number | num | 当前题号 | | -| q_height | num | 问题部分总高度 | | -| q_coord_y | num | 问题部分Y裁剪起始 | 当然是0 | -| image | str | 题图url | 题目文字+所有的选项文字排版成一张图,存储在bfs中 | -| from | str | 问题来源页面url | 如:“xx弹幕是否违规”所在的视频页 | -| options | array | 选项列表 | | -| type_id | num | 题目父类型id | 见[查询自选题分类](info.md#查询自选题分类)
**注:36为基础题** | -| type_name | str | 分院小电视提示文案 | 如:xx小电视 | -| type_image | str | 分院小电视图标url | | - -`question`中的`options`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----- | ---------------------- | -| 0 | obj | 选项A | | -| 1 | obj | 选项B | 选项至少2个 | -| 2 | obj | 选项C | 数组长度取决于选项个数 | -| 3 | obj | 选项D | | - -`question`中的`options`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ----------------- | ------------------------ | -| number | num | 选项序号 | 如:1为A 2为B | -| high | num | 选项部分总高度 | | -| coord_y | num | 选项部分Y裁剪起始 | | -| hash | str | 选项hash | 作为提交对应选项时应传参 | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/base' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "question": { - "id": 6511, - "number": 1, - "q_height": 38.4, - "q_coord_y": 0, - "image": "https://i0.hdslb.com/bfs/member/9d7f1f1f0b7478a621d1b998a5a98982.png", - "from": "", - "options": [ - { - "number": 1, - "high": 42, - "coord_y": 38.4, - "hash": "f7619d6c2040d44f39dc87a7aa34fb9e" - }, - { - "number": 2, - "high": 42, - "coord_y": 80.4, - "hash": "dce5140040f40ca4030783585684369d" - } - ], - "type_id": 36, - "type_name": "小电视校长", - "type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png" - } - } -} -``` -
- -## 拉取附加题 - -> https://api.bilibili.com/x/answer/v4/extra - -*请求方式:GET* - -认证方式:Cookie或APP - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41023:用户答题记录不存在
41054:用户附加题已通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -同[拉取基础题](#拉取基础题)的`data`对象 - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/extra' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "question": { - "id": 11492, - "number": 44, - "q_height": 76.8, - "q_coord_y": 0, - "image": "https://i0.hdslb.com/bfs/member/b6c846613bd0b44cd7c8af1d83e3f0c2.png", - "from": "https://www.bilibili.com/video/av14659093", - "options": [ - { - "number": 1, - "high": 42, - "coord_y": 76.8, - "hash": "ca15e6009047cf82358c50ab90fd8d9e" - }, - { - "number": 2, - "high": 42, - "coord_y": 118.8, - "hash": "60e86a1c736c68da3462f66377e4e8ca" - } - ], - "type_id": 36, - "type_name": "小电视校长", - "type_image": "https://i0.hdslb.com/bfs/face/7b67c0c0da64a6ab059ff49bb0d4b92988b91806.png" - } - } -} -``` -
- -## 拉取自选题 - -> https://api.bilibili.com/x/answer/v4/pro - -*请求方式:GET* - -认证方式:Cookie或APP - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41023:用户答题记录不存在
41051:用户答题验证码未通过
41055:基础附加题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -同[拉取基础题](#拉取基础题)的`data`对象 - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/pro' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "question": { - "id": 824, - "number": 54, - "q_height": 38.4, - "q_coord_y": 0, - "image": "https://i0.hdslb.com/bfs/member/417e02be5652f79d0312fa2fcee28869.png", - "from": "", - "options": [ - { - "number": 1, - "high": 42, - "coord_y": 38.4, - "hash": "c4574c23cf728c19abeab3e7525258d4" - }, - { - "number": 2, - "high": 42, - "coord_y": 80.4, - "hash": "ffd48760758fbb8a2c183d1d04f692f8" - }, - { - "number": 3, - "high": 42, - "coord_y": 122.4, - "hash": "898d414dff49fe20c4a1da1e148fadb2" - }, - { - "number": 4, - "high": 42, - "coord_y": 164.4, - "hash": "09018443f09d8ef4f6fec5e96e082270" - } - ], - "type_id": 1, - "type_name": "游戏小电视", - "type_image": "https://i0.hdslb.com/bfs/face/6590bee26086fed66ee7cc5bac26a32d2f733037.png" - } - } -} -``` - -
- diff --git a/docs/newbie_exam/info.md b/docs/newbie_exam/info.md deleted file mode 100644 index b200aa4..0000000 --- a/docs/newbie_exam/info.md +++ /dev/null @@ -1,550 +0,0 @@ -# 查询信息 - -## 查询答题状态 - -> https://api.bilibili.com/x/answer/v4/status - -*请求方式:GET* - -认证方式:Cookie或APP - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------------ | ------------------------------------------------------------ | -| hid | num | 答题会话id | | -| mid | num | 答题用户mid | | -| score | num | 当前得分 | | -| status | num | 答题状态 | 0:未答题
2:答题中
3:已通过 | -| number | num | 当前题号 | | -| result | str | 是否通过答题 | failed:未通过
succeed:已通过 | -| stage | str | 当前答题阶段 | base:基础题
extra:附加题
pro_type:等待选择自选题类型
pro:自选题
complete:已完成 | -| version | str | 答题版本 | 当前为`v4` | -| start_time | num | 本次答题开始时间 | 时间戳 | -| first_answer | num | (?) | | -| progress | str | 当前答题进度 | 百分比
60分为100% | -| text | str | 提示文案 | | -| url | str | 答题页面url | | -| in_reg_audit | bool | 是否为第一次答题 | | -| edition | num | 答题版本 | 0:旧版(40+10+50)
2:新版(40+30+30) | -| rewards | null | (?) | | -| captcha | num | 是否已经提交验证码 | 1:已提交
仅新版提交验证码后存在 | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/status' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "hid": 1623207905520705, - "mid": 293793435, - "score": 2, - "status": 2, - "number": 2, - "result": "failed", - "stage": "base", - "version": "v4", - "start_time": 1623207905, - "first_answer": 2, - "progress": "3", - "text": "继续答题", - "url": "https://www.bilibili.com/h5/newbie/entry?navhide=1", - "in_reg_audit": false, - "edition": 0, - "rewards": null - } -} -``` - -
- -## 查询自选题分类 - -> https://api.bilibili.com/x/answer/v4/pro/type - -*请求方式:GET* - -认证方式:Cookie或APP - -当字段`edition`的值不同时,该接口返回的数据也不同 - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | ---------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
41014:答题过快或错误太多
41021:用户基础题未通过
41031:自选题未通过
41055:基础附加题未通过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 父分类列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 父分类1 | | -| n | obj | 父分类(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---------- | ---- | -| id | num | 父分类id | | -| name | str | 父分类名 | | -| fields | array | 子分类列表 | | - -`data`数组中的对象中的`fields`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 子分类1 | | -| n | obj | 子分类(n+1) | | -| …… | obj | …… | …… | - -`fields`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| id | num | 子分类id | | -| name | str | 子分类名 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/pro/type' \ --b 'SESSDATA=xxx' -``` - -旧版`edition=0`返回: - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 1, - "name": "游戏", - "fields": [ - { - "id": 8, - "name": "动作射击" - }, - { - "id": 9, - "name": "冒险格斗" - }, - { - "id": 12, - "name": "策略模拟 " - }, - { - "id": 13, - "name": "角色扮演 " - }, - { - "id": 14, - "name": "音乐体育 " - } - ] - }, - { - "id": 2, - "name": "影视", - "fields": [ - { - "id": 15, - "name": "纪录片 " - }, - { - "id": 16, - "name": "电影 " - }, - { - "id": 17, - "name": "电视剧 " - } - ] - }, - { - "id": 3, - "name": "科技", - "fields": [ - { - "id": 18, - "name": "军事 " - }, - { - "id": 19, - "name": "地理 " - }, - { - "id": 20, - "name": "历史 " - }, - { - "id": 21, - "name": "文学 " - }, - { - "id": 22, - "name": "数学 " - }, - { - "id": 23, - "name": "物理 " - }, - { - "id": 24, - "name": "化学 " - }, - { - "id": 25, - "name": "生物 " - }, - { - "id": 26, - "name": "数码科技 " - } - ] - }, - { - "id": 4, - "name": "动画", - "fields": [ - { - "id": 27, - "name": "动画声优 " - }, - { - "id": 28, - "name": "动漫内容 " - } - ] - }, - { - "id": 5, - "name": "艺术", - "fields": [ - { - "id": 29, - "name": "ACG音乐 " - }, - { - "id": 30, - "name": "三次元音乐 " - }, - { - "id": 31, - "name": "绘画 " - } - ] - }, - { - "id": 6, - "name": "流行前线", - "fields": [ - { - "id": 32, - "name": "娱乐 " - }, - { - "id": 33, - "name": "时尚 " - }, - { - "id": 34, - "name": "运动 " - } - ] - }, - { - "id": 7, - "name": "鬼畜", - "fields": [ - { - "id": 35, - "name": "鬼畜 " - } - ] - } - ] -} -``` - -
- -新版`edition=2`返回: - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "id": 1, - "name": "游戏", - "fields": [ - { - "id": 1, - "name": "游戏" - } - ] - }, - { - "id": 2, - "name": "影视", - "fields": [ - { - "id": 2, - "name": "影视" - } - ] - }, - { - "id": 3, - "name": "科教/知识", - "fields": [ - { - "id": 3, - "name": "科教/知识" - } - ] - }, - { - "id": 4, - "name": "动画/动漫", - "fields": [ - { - "id": 4, - "name": "动画/动漫" - } - ] - }, - { - "id": 5, - "name": "音乐/舞蹈", - "fields": [ - { - "id": 5, - "name": "音乐/舞蹈" - } - ] - }, - { - "id": 32, - "name": "明星/娱乐", - "fields": [ - { - "id": 32, - "name": "明星/娱乐" - } - ] - }, - { - "id": 35, - "name": "鬼畜", - "fields": [ - { - "id": 35, - "name": "鬼畜" - } - ] - }, - { - "id": 42, - "name": "时尚/健身", - "fields": [ - { - "id": 42, - "name": "时尚/健身" - } - ] - } - ] -} -``` - -
- - -## 查询答题结果 - -> https://api.bilibili.com/x/answer/v4/result - -*请求方式:GET* - -认证方式:无 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ------ | ---- | -| hid | num | 答题会话id | 必要 | | - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
41023:用户答题记录不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ------------------------ | ----------------------------------- | -| hid | num | 答题会话id | | -| mid | num | 答题用户mid | | -| member | num | | | -| score | num | 得分 | | -| level | num | 用户等级 | | -| first_pass | num | | | -| uname | str | 用户昵称 | | -| face | str | 用户头像url | | -| status | str | 答题结果 | failed:未通过
succeed:已通过 | -| question_types | array | 已选择的自选题列表 | | -| power | array | 自选题分类得分情况 | | -| start_time | num | 开始答题时间 | 时间戳 | -| share | obj | | | -| can_show_rank_btn | bool | | | -| is_same_user | bool | | | -| view_more | str | | | -| video_info | obj | | | -| main_tids | array | | | -| sub_tids | array | | | -| power_result | null | | | -| score_rate | num | 分数超过平均用户的百分比 | | -| permission | obj | | | -| rewards | null | | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/answer/v4/result' \ ---data-urlencode 'hid=1615088061307609' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "hid": 1615088061307609, - "mid": 1386643599, - "member": 0, - "score": 70, - "level": 0, - "first_pass": 0, - "uname": "眉凭铱ひ前非", - "face": "http://i0.hdslb.com/bfs/face/cd83d4cdbfb521455c168eaa181915b40cb664d1.jpg", - "status": "succeed", - "question_types": [ - { - "id": 12, - "name": "策略模拟 " - }, - { - "id": 13, - "name": "角色扮演 " - }, - { - "id": 14, - "name": "音乐体育 " - }, - { - "id": 8, - "name": "动作射击" - }, - { - "id": 9, - "name": "冒险格斗" - } - ], - "power": [ - { - "score": 0, - "name": "动画" - }, - { - "score": 0, - "name": "艺术" - }, - { - "score": 5, - "name": "游戏" - }, - { - "score": 0, - "name": "科技" - }, - { - "score": 0, - "name": "影视" - }, - { - "score": 0, - "name": "鬼畜" - } - ], - "start_time": 1615088061, - "share": { - "content": "", - "short_content": "" - }, - "can_show_rank_btn": false, - "is_same_user": true, - "view_more": "", - "video_info": { - "url": "", - "name": "", - "img": "", - "watch_num": "", - "up_num": "" - }, - "main_tids": [], - "sub_tids": [], - "power_result": null, - "score_rate": 84, - "permission": { - "reply": true, - "color_dm": true - } - } -} -``` - -
\ No newline at end of file diff --git a/docs/note/action.md b/docs/note/action.md deleted file mode 100644 index 15c40e9..0000000 --- a/docs/note/action.md +++ /dev/null @@ -1,131 +0,0 @@ -# 笔记操作 - -## 保存视频笔记 - -> https://api.bilibili.com/x/note/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| oid | num | 目标id | 必要 | | -| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) | -| note_id | num | 笔记id | 非必要 | 创建时无需此项 | -| title | str | 笔记标题 | 必要 | | -| summary | str | 笔记预览文本 | 必要 | | -| content | str | 笔记正文json序列 | 必要 | 格式见[附表](readme.md#附表-笔记正文序列格式) | -| tags | str | 笔记跳转标签列表 | 非必要 | | -| cls | num | 1 | 非必要 | 作用尚不明确 | -| from | str | 提交类型 | 非必要 | `auto`自动提交
`save`手动提交
`close`关闭时自动提交 | -| cont_len | num | 正文字数 | 非必要 | | -| platform | str | 平台 | 非必要 | 可为`web` | -| publish | num | 是否公开笔记 | 非必要 | `0`不公开
`1`公开 | -| auto_comment | num | 是否添加到评论区 | 非必要 | `0`不添加
`1`添加 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | `0`成功
`-101`账号未登录
`-111`csrf校验失败
`-400`请求错误
`79508`该稿件已存在笔记,无法新增
`79513`笔记所属视频不合法 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ------------ | ---- | -| note_id | num | 笔记id | | - -**示例:** - -保存内容为加粗的STRONG的笔记`3809605586518023`于`av970322090` - -```shell -curl 'https://api.bilibili.com/x/note/add' \ ---data-urlencode 'oid=970322090' \ ---data-urlencode 'oid_type=0' \ ---data-urlencode 'note_id=3809605586518023' ---data-urlencode 'title=周刊哔哩哔哩排行榜#543' ---data-urlencode 'summary=STRONG' ---data-urlencode 'content=[{"attributes":{"bold":true},"insert":"STRONG"},{"insert":"\n"}]' ---data-urlencode 'tags=' ---data-urlencode 'cls=1' ---data-urlencode 'from=save' ---data-urlencode 'csrf=xxx' --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "note_id": 3809605586518023 - } -} -``` - -
- -## 删除视频笔记 - -> https://api.bilibili.com/x/note/del - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------------------ | ------ | ---- | -| oid | num | 目标稿件avid | 必要 | | -| note_id | num | 笔记id | 非必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -删除稿件`av457253380`下的笔记`4075968478576647` - -```shell -curl 'https://api.bilibili.com/x/note/del' \ ---data-urlencode 'oid=457253380' \ ---data-urlencode 'note_id=4075968478576647' \ ---data-urlencode 'csrf=xxx' --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/note/info.md b/docs/note/info.md deleted file mode 100644 index 5793ee3..0000000 --- a/docs/note/info.md +++ /dev/null @@ -1,309 +0,0 @@ -# 笔记详细信息 - -## 查询该稿件是否禁止笔记 - -> https://api.bilibili.com/x/note/is_forbid - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| aid | num | 稿件avid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | `0`成功
`-400`请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ------------ | ----------------------------------- | -| forbid_note_entrance | bool | 是否禁止笔记 | `true`禁止笔记
`false`允许笔记 | - -**示例:** - -查询视频稿件`av338677252`是否禁止笔记 - -```shell -curl 'https://api.bilibili.com/x/note/info' \ ---data-urlencode 'aid=338677252' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "forbid_note_entrance": false - } -} -``` - -
- -## 查询私有笔记内容 - -> https://api.bilibili.com/x/note/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---------- | ----------- | -------- | -| oid | num | 目标id | 必要 | | -| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) | -| note_id | num | 笔记id | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | `0`成功
`-400`请求错误
`-101`账号未登录
`79502`笔记详情未找到
`79503`笔记正文未找到 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | ---------------- | -------------- | -| arc | obj | 对应视频稿件信息 | | -| audit_status | num | 0 | 作用暂不明确 | -| cid_count | num | 视频分P数 | | -| content | str | 笔记正文json序列 | 格式见[附表](readme.md#附表-笔记正文序列格式) | -| forbid_note_entrance | bool | | | -| pub_reason | str | 公开笔记相关原因 | | -| pub_status | num | 公开笔记状态 | `1`未公开
`2`已公开
`4`退回 | -| pub_version | num | | | -| summary | str | 笔记预览文本 | | -| tags | array | 笔记跳转标签列表 | | -| title | str | 笔记标题 | | - -`data`中的`arc`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ----------------- | -| oid | num | 目标id | | -| oid_type | num | 目标id类型 | `0`视频(oid=avid) | -| title | str | 视频标题 | | -| pic | str | 视频封面 | | -| status | num | | | -| desc | str | 视频简介 | | - -`data`中的`tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---------------- | -| 0 | obj | 标签1 | | -| n | obj | 标签(n+1) | 按照笔记中位置排列 | -| …… | obj | …… | …… | - -`tags`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------------- | ------------ | -| cid | num | 视频cid | | -| status | num | 0 | 作用尚不明确 | -| index | num | 在稿件中的分P索引 | | -| seconds | num | 视频进度 | | -| pos | num | 笔记中位置 | | - -**示例:** - -查询视频`av338677252`中笔记`24508729145690112`的内容 - -```shell -curl 'https://api.bilibili.com/x/note/info' \ ---data-urlencode 'oid=338677252' \ ---data-urlencode 'oid_type=0' \ ---data-urlencode 'note_id=24508729145690112' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "title": "2022哔哩哔哩拜年纪", - "summary": " ...", - "content": "[{"insert":"\n"}]", - "cid_count": 0, - "audit_status": 0, - "pub_status": 0, - "pub_reason": "", - "pub_version": 0, - "forbid_note_entrance": false, - "tags": [], - "arc": { - "oid": 338677252, - "title": "2022哔哩哔哩拜年纪", - "status": 0, - "oid_type": 0, - "pic": "http://i2.hdslb.com/bfs/archive/1e683a5363f35aa0a65419dbf145177099e38f90.jpg", - "desc": "" - } - } -} -``` - -
- -## 查询公开笔记内容 - -> https://api.bilibili.com/x/note/publish/info - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------ | ------ | -------- | -| cvid | num | 笔记对应的专栏cvid | 必要 | 非笔记id | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | `0`成功
`-400`请求错误
`79514`公开笔记详情未找到 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ----- | ---------------------- | --------------------------------------------- | -| cvid | num | 公开笔记对应的专栏cvid | | -| note_id | num | 笔记id | | -| title | str | 笔记标题 | | -| summary | str | 笔记预览 | | -| content | str | 笔记正文json序列 | 格式见[附表](readme.md#附表-笔记正文序列格式) | -| cid_count | num | (?) | | -| pub_status | num | 公开状态 | | -| tags | array | | | -| arc | obj | 稿件信息 | | -| author | obj | 作者信息 | | -| forbid_note_entrance | bool | | | - -`data`中的`arc`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ----------------- | -| oid | num | 目标id | | -| oid_type | num | 目标id类型 | `0`视频(oid=avid) | -| title | str | 标题 | | -| status | num | (?) | | -| pic | str | 封面url | | -| desc | str | 简介 | | - -`data`中的`author`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| mid | num | 用户mid | | -| name | str | 昵称 | | -| face | str | 头像url | | -| level | num | 用户等级 | | -| vip_info | obj | 会员信息 | | -| pendant | obj | 头像框信息 | | - -**示例:** - -查看公开笔记`cv15160286`的信息 - -```shell -curl 'https://api.bilibili.com/x/note/publish/info' \ ---data-urlencode 'cvid=15160286' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "cvid": 15160286, - "note_id": 24114044116402190, - "title": "2022哔哩哔哩拜年纪", - "summary": "我决定再重新做一个系列,叫做影评系列 那么我们这一次是影系列的第n期 我也不知道是多少期,到时候回去统计一下 今天的影评是写,2022年哔哩哔哩拜年纪 【...", - "content": "[{"insert":"我决定再重新做一个系列,叫做影评系列\n那么我们这一次是影系列的第n期\n我也不知道是多少期,到时候回去统计一下\n今天的影评是写,2022年哔哩哔哩拜年纪\n【以及往年的拜年祭,会提一下】\n看完哔哩哔哩拜年纪之后,我的触动真的很大,那今天就先写哔哩哔哩拜年纪吧。\n字数同样有点长,希望看过2022哔哩哔哩拜年纪的人可以认真看完吧!也可以说说你的想法啊!\n\n首先先说一说它的时间,因为每次都在除夕夜播放而出现要和家人看春晚,又要去抢红包之类的,所以每次都看不了直播。这一点就很糟心了。\n所以说这次同往年一样,我也是看的回放。\n一\n一开始是2233跳舞,因为我不太关注这些二次元,所以说就不详细评述了\n但是这个和去年的不问天,应该是一个系列的。都是2233在一起出镜,然后配的是一首歌,但是我觉得这首歌确实没有不问天那么惊艳我了。\n【我觉得很大的可能是今年的作曲没有泡泡老师,去年,前年的泡泡老师作的曲都真的非常的好听,而且今年的拜年纪的预告片上也有一个三首他写的歌的串烧。真的很不错。】\n二\n然后就说一下\n今年以及往年的动画\n这个主体动画真的每年做的都很不错。就是既有意义,又有故事,还有深度,同时还介绍了风俗人情和乡土民俗,真的都是非常非常好的动画,并且动画制作也很精良。\n真的想知道这些动画的主创人员都是谁,可是每次都没有标注。\n【既然谈到动画,就来说一下去年预告的一个动画叫盒中之海。其实我本来是去年看拜年纪的时候是没有看到这个预告片的\n但是今年的评论区底下,几乎每一个评论区中都在催盒中之海,于是我便去看了一下。我发现这个真的变得更有意义和深度了。\n他讲的是一个游戏,还有海神等等\n虽然感觉到它的预告片很乱,但是总觉得其中有什么联系?就是很悬疑又很惊恐但一看就很有深度的动画了!\n所以我也期待着了!】\n今年讲的是哔哩楼的故事,我觉得他的那个创意真的很好,就是自助餐厅的创意\n可以让每一个人都尝到厨师的快乐,\n但又不是真正去做厨师,如果真的能有这样一家店就好了!\n然后拜年纪传统的视频串烧节目就不说了吧。\n三\n再后来就是新春小记,俗称的是拜年曲\n去年的拜年曲是吉祥话,我觉得两个都很好听,但是说去年的都是我认识并且比较喜欢的歌手,可以今年的歌手一个都不认识了[em]e107[/em]\n但是近两年的但连许都用了说话开篇,然后其中高潮的时候都是顶针的方式来演唱,可能这也是一个习俗吧,但真的还比较好听!\n四\n一些没有触动的作品就不说了\n所以接下来是灯火!\n我没有想到今年过年能再一次听到\n《灯火里的中国》!\n因为今年春晚没有周深还有些遗憾呢!\n但虽然这首歌不是周深唱的,但也温暖人心!\n这个应该与去年的《我的祖国》是一个系列的!\n五\n四迹老师的动画一如既往的有意思\n【但就是少了灵魂快板……】\n去年和前年的快板真的深入人心了!\n所以我还是最喜欢去年的\n“这个好诶!”\n六\n邪教老师好几年没有写燃曲了哈哈哈哈哈哈\n但这个风灵玉秀和拜年祭一起做的动画挺好的\n虽然我不知道风灵玉秀是什么动画\n但武侠版的这个动画的动作做的很细致\n又不是很快,看的舒服又清晰\n配上音乐……\n【我不在想再说还不错了哈哈哈哈哈哈哈】\n七\n终于到我最喜欢的一首人演唱的歌曲\n【哈哈哈哈哈为了不与卡农冲突】\n《快乐手帐》\n我要把纳兰寻风的词吹爆!!!!!!!!!\n“跟着我,哒哒哒哒,搭个舞台\n跟着我,哒哒哒哒,大步迈开”\n“生活就是平平淡淡,偶尔磕磕绊绊\n让脑筋多转转,往好处看看!”\n真的好温暖!积极向上!向前看!\n这个初音未来的声音也没有不适感了!\n这个真的好棒!\n八\n然后是沃玛!\n沃玛的脑回路真的很独特!\n他的这个系列是视频真的很独特又新奇!\n这个不好描述……自己去看吧!\n沃玛的声音也好听!哈哈哈哈哈哈哈\n九\n魔术跳过吧\n上面是这次拜年级我最喜欢的一个节目,第大调卡农。\n这个真的很温暖,还有小提琴和钢琴的两个二重奏,就是非常的震撼人心,很感动。\n再配上他的画面,从一个小孩儿到最后的老人,感觉这一生都可以用这首歌来概括。所以说真的很感动又很温暖,\n而且这个节目的副标题是:\n致敬一生中每一个重要时刻\n所以更感动了!\n十\n拜年祭燃曲《弈》\n意境真的很扩大,不看注释完全看不懂词啊\n但去还比较好听,但感觉没有去年的《万象霜天》惊艳\n那我在b站上面看到一个视频,把这八年的八个燃曲在一起放,然后《弈》真的听起来很明显,很明显。\n高潮很高,很好听!\n所以苍穹是sv还是v啊?\n十一\n这次cilicili的《另一个我》没有做好\n可能是因为去年是《时光盲盒》真的太棒了!!!!\n“一遍遍,我回来了!……辛苦了!”\n反而今年的歌没有触动\n这是我唯一一个跳过了大约一分钟的节目\n十二\n后面几个节目都具有讽刺意义\n但那个三年都放的那个讽刺动画系列\n我属实看不懂哈哈哈哈哈哈哈哈\n梗太多了哈哈哈哈哈哈真有些看不懂\n十三\n终于到《除夕》了\n音阙诗听第二次上拜年祭!\n第一次安安和镜子演唱《与梦盛开》\n第二次是音阙诗听团队创作《除夕》\n同样是音阙诗听味啊!\n这次的词写的还不错!\n所以,节日系列开更!\n【但A-SOUL究竟是什么组合,根本没听说过啊】\n十四\n最后一个节目。\n流年如歌,是前年的最后一个节目,但是我那时候还不习惯听V曲,所以说几乎完全就跳过了,那个节目没有听。\n但是这个纳兰寻风作的词,以及这个西门振作的曲,真的配合起来好好听。\n还是要再吹一下纳兰寻风老师的词真的好棒,然后同样和上一个说的一样,温暖,感动,就有积极向上的那种乐观。\n“你是冰雪消融唤醒万物第一缕花香……”\n“湖面上小船儿晃晃岁月长……”\n【但是纳兰寻风老师究竟是做什么的?\n好像经常调教也能看到他哈哈哈哈哈哈\n没有特别关注】\n然后我每次听一听的是泠鸢翻唱的版本,这一次是让刷牙老师来唱的,男声和女声唱有有别样的风味\n这真的就像《难忘今宵》一样,要待在每一场拜年纪嘛?\n新年的那一天晚上都随着流年如歌,进入梦乡!\n人生如梦,流年似水,岁月如歌,\n春夏秋冬,年复一年\n唯有自己不变\n去下一个十年找到属于自己的答案吧!\n哔哩哔哩乾杯!\n\n\n十五【正好是十五哈哈哈哈哈】\n《五十》这个节目是很晚的时候看的\n有些悬疑,甚至有些恐怖,但引起了许多思考\n写太多了,就不详说了……\n【再次期待艾导的《盒中之海》!】\n\n哔哩哔哩( ゜ -゜)つロ 乾杯~​\n——今日发布于Q,转到哔哩哔哩!\n"}]", - "cid_count": 0, - "pub_status": 2, - "tags": [], - "arc": { - "oid": 338677252, - "title": "2022哔哩哔哩拜年纪", - "status": 0, - "oid_type": 0, - "pic": "http://i2.hdslb.com/bfs/archive/1e683a5363f35aa0a65419dbf145177099e38f90.jpg", - "desc": "" - }, - "author": { - "mid": 523870870, - "name": "夜达星xxxxxxx", - "face": "http://i1.hdslb.com/bfs/face/2cdfd277e63b6bb1f400ed616b5caf0a04196f28.jpg", - "level": 3, - "vip_info": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "forbid_note_entrance": false - } -} -``` - -
diff --git a/docs/note/list.md b/docs/note/list.md deleted file mode 100644 index d0d3851..0000000 --- a/docs/note/list.md +++ /dev/null @@ -1,653 +0,0 @@ -# 笔记列表 - -## 查询稿件私有笔记 - -> https://api.bilibili.com/x/note/list/archive - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -该接口只能查询私有笔记,无法查询公开笔记 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ------------------------ | ------ | ----------------- | -| oid | num | 目标id | 必要 | | -| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | -------------------------------------------------- | -| noteIds | array | 笔记列表 | 无笔记则无此项
可能后续会允许视频添加多个笔记 | - -`data`中的`noteIds`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| 0 | str | 笔记id | | - -**示例:** - -查询视频`av970322090`的笔记id - -```shell -curl 'https://api.bilibili.com/x/note/list/archive' \ ---data-urlencode 'oid=970322090' \ ---data-urlencode 'oid_type=0' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":{ - "noteIds":[ - "3809605586518023" - ] - } -} -``` - -
- -## 查询用户私有笔记 - -> https://api.bilibili.com/x/note/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------ | ----------- | ------------------------------------------------------- | -| ps | num | 每页项数 | 必要 | | -| pn | num | 页码 | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ------------ | -| list | array | 明细列表 | | -| page | obj | 页面信息 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---------------- | -| 0 | obj | 笔记1 | | -| n | obj | 笔记(n+1) | 按照创建顺序排列 | -| …… | obj | …… | …… | - -`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ------------ | ------------------------- | -| title | str | 笔记标题 | | -| summary | str | 笔记预览文本 | | -| mtime | str | 提交时间 | YYYY-MM-DD hh:mm | -| arc | obj | 视频信息 | | -| note_id | num | 笔记id | | -| audit_status | num | 0 | 作用尚不明确 | -| web_url | str | 笔记h5页url | | -| note_id_str | str | 笔记id str | | -| message | str | 更新信息 | "更新于 YYYY-MM-DD hh:mm" | -| forbid_note_entrance | bool | (?) | | -| likes | num | 点赞数 | | -| has_like | bool | 是否点赞 | | - -`list`中的`arc`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | ---------------------- | -| oid | num | 目标id | | -| bvid | str | 稿件bvid | | -| pic | str | 稿件封面图片url | | -| desc | str | 视频简介 | | -| status | num | 0 | | -| oid_type | num | 目标id类型 | `0`视频(oid=avid) | -| aid | num | 稿件avid | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | -------------------- | -| total | num | 笔记总数 | | -| size | num | 每页项数 | | -| num | num | 页码 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/note/list' \ ---data-urlencode 'ps=10' \ ---data-urlencode 'pn=1' --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "title": "2022哔哩哔哩拜年纪", - "summary": " ...", - "mtime": "2022-02-16 16:46", - "arc": { - "oid": 338677252, - "bvid": "BV1fR4y1T7aV", - "pic": "http://i2.hdslb.com/bfs/archive/1e683a5363f35aa0a65419dbf145177099e38f90.jpg", - "desc": "愿大家看的开心!新年快乐,虎年大吉,欧气十足,万事顺意!ヾ(≧▽≦*)o", - "status": 0, - "oid_type": 0, - "aid": 338677252 - }, - "note_id": 24508729145690110, - "audit_status": 0, - "web_url": "https://www.bilibili.com/h5/note-app?oid=338677252&oid_type=0&pagefrom=fullpage&navhide=1&-Bct.statusbar.mode=0", - "note_id_str": "24508729145690112", - "message": "更新于 2022-02-16 16:46", - "forbid_note_entrance": false, - "likes": 0, - "has_like": false - } - ], - "page": { - "total": 1, - "size": 10, - "num": 1 - } - } -} -``` - -
- -## 查询稿件公开笔记 - -> https://api.bilibili.com/x/note/publish/list/archive - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------- | ------ | ----------------- | -| oid | num | 目标id | 必要 | | -| oid_type | num | 目标id类型 | 必要 | `0`视频(oid=avid) | -| ps | num | 每页项数 | 必要 | | -| pn | num | 页码 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ----- | ------------ | ---- | -| list | array | 公开笔记列表 | | -| page | obj | 页面信息 | | -| show_public_note | bool | | | -| message | str | | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---------------- | -| 0 | obj | 笔记1 | | -| n | obj | 笔记(n+1) | 按照创建顺序排列 | -| …… | obj | …… | …… | - -`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------------------- | ------------------------- | -| cvid | num | 公开笔记对应的专栏cvid | | -| title | str | 笔记标题 | | -| summary | str | 笔记预览 | | -| pubtime | str | 发布时间 | YYYY-MM-DD hh:mm | -| web_url | str | 笔记h5页url | | -| message | str | 更新信息 | "更新于 YYYY-MM-DD hh:mm" | -| author | obj | 作者信息 | | -| likes | num | 点赞数 | | -| has_like | bool | 是否点赞 | 需要登录(Cookie) | - -`list`中的对象中的`author`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ---- | -| mid | num | 用户mid | | -| name | str | 昵称 | | -| face | str | 头像url | | -| level | num | 用户等级 | | -| vip_info | obj | 会员信息 | | -| pendant | obj | 头像框信息 | | - -**示例:** - -查询视频`av338677252`的公开笔记列表 - -```shell -curl 'https://api.bilibili.com/x/note/publish/list/archive' \ ---data-urlencode 'oid=338677252' \ ---data-urlencode 'oid_type=0' \ ---data-urlencode 'ps=10' \ ---data-urlencode 'pn=1' --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "cvid": 15160286, - "title": "2022哔哩哔哩拜年纪", - "summary": "我决定再重新做一个系列,叫做影评系列 那么我们这一次是影系列的第n期 我也不知道是多少期,到时候回去统计一下 今天的影评是写,2022年哔哩哔哩拜年纪 【...", - "pubtime": "2022-02-07 23:44", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15160286&pagefrom=ugcvideo", - "message": "更新于 2022-02-07 23:44", - "author": { - "mid": 523870870, - "name": "夜达星xxxxxxx", - "face": "http://i1.hdslb.com/bfs/face/2cdfd277e63b6bb1f400ed616b5caf0a04196f28.jpg", - "level": 3, - "vip_info": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "likes": 7, - "has_like": false - }, - { - "cvid": 15086217, - "title": "2022哔哩哔哩拜年纪", - "summary": "节目表,多图预警,方便各位时间戳跳转…… 01:20 New Day [图片] 06:32 重返哔哩楼1 [图片] 11:06 嗨,...", - "pubtime": "2022-02-01 20:07", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15086217&pagefrom=ugcvideo", - "message": "更新于 2022-02-01 20:07", - "author": { - "mid": 3810985, - "name": "Remレム22", - "face": "http://i1.hdslb.com/bfs/face/4cce970eb1b9fb8b322d49133a11caa630178728.jpg", - "level": 6, - "vip_info": { - "type": 2, - "status": 1, - "due_date": 1694880000000, - "vip_pay_type": 1, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "likes": 22, - "has_like": false - }, - { - "cvid": 15080841, - "title": "2022哔哩哔哩拜年纪", - "summary": "2022哔哩哔哩拜年纪从厨师的角度开始了故事,而厨师象征着每个人,每一道菜都是每个厨师用汗水耕耘出来的,并且在主线故事中穿插这不同的小故事,代表了近几年生...", - "pubtime": "2022-02-01 10:10", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15080841&pagefrom=ugcvideo", - "message": "更新于 2022-02-01 10:10", - "author": { - "mid": 482114483, - "name": "沐曦mornal", - "face": "http://i2.hdslb.com/bfs/face/cf1ef9c2045e317dfe6dbe8659b6f7a69c7572d5.jpg", - "level": 4, - "vip_info": { - "type": 1, - "status": 1, - "due_date": 1646755200000, - "vip_pay_type": 1, - "theme_type": 0, - "label": { - "path": "", - "text": "大会员", - "label_theme": "vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "", - "role": 1, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "likes": 7, - "has_like": false - }, - { - "cvid": 15080246, - "title": "2022哔哩哔哩拜年纪", - "summary": "niumniumnium~~~33是我的菜了! 这次的跨年纪呢确实不同于以往。我发现现代技术确实给类似的活动提供了平台与支持,但是不可否认的是bilibi...", - "pubtime": "2022-02-01 08:59", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15080246&pagefrom=ugcvideo", - "message": "更新于 2022-02-01 08:59", - "author": { - "mid": 1049943541, - "name": "吃瓜的DINGBALL", - "face": "http://i1.hdslb.com/bfs/face/93e7a3826586338e15e5703f9d49bb3bbd0adfa5.jpg", - "level": 2, - "vip_info": { - "type": 1, - "status": 0, - "due_date": 1641744000000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "likes": 10, - "has_like": false - }, - { - "cvid": 15077197, - "title": "2022哔哩哔哩拜年纪", - "summary": "23333333333333333333333333333333333333333333333333333333333333333333333333333...", - "pubtime": "2022-01-31 22:53", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15077197&pagefrom=ugcvideo", - "message": "更新于 2022-01-31 22:53", - "author": { - "mid": 433136442, - "name": "KiBi_3", - "face": "http://i0.hdslb.com/bfs/face/4c11d1419316f14b8b0f5c146d0cd34627955244.jpg", - "level": 2, - "vip_info": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "" - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - } - }, - "likes": 2, - "has_like": false - }, - { - "cvid": 15077019, - "title": "2022哔哩哔哩拜年纪", - "summary": "2022加油吖!~~~~~~~~~~~~~~~~~~~~~2022加油吖!2022加油吖!2022加油吖!2022加油吖!2022加油吖!2022加油吖!...", - "pubtime": "2022-01-31 22:36", - "web_url": "https://www.bilibili.com/h5/note-app/view?cvid=15077019&pagefrom=ugcvideo", - "message": "更新于 2022-01-31 22:36", - "author": { - "mid": 11283554, - "name": "zhen_____", - "face": "http://i0.hdslb.com/bfs/baselabs/381fcc3865daf85bd6a1ddc4b6dfbd11ba937dc9.jpg", - "level": 6, - "vip_info": { - "type": 2, - "status": 1, - "due_date": 1730736000000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 5459, - "name": "星座系列:巨蟹座", - "image": "http://i2.hdslb.com/bfs/garb/item/a6e5b6b36a4a6c00ca8881ecc837c2aa9ebcb53d.png", - "expire": 0, - "image_enhance": "http://i2.hdslb.com/bfs/garb/item/a6e5b6b36a4a6c00ca8881ecc837c2aa9ebcb53d.png", - "image_enhance_frame": "" - } - }, - "likes": 5, - "has_like": false - } - ], - "page": { - "total": 6, - "size": 10, - "num": 1 - }, - "show_public_note": true, - "message": "" - } -} -``` - -
- -## 查询用户公开笔记 - -> https://api.bilibili.com/x/note/publish/list/user - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| ps | num | 每页项数 | 必要 | | -| pn | num | 页码 | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| page | obj | 页面信息 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---------------- | -| 0 | obj | 笔记1 | | -| n | obj | 笔记(n+1) | 按照创建顺序排列 | -| …… | obj | …… | …… | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---- | -| total | num | 笔记总数 | | -| size | num | 每页项数 | | -| num | num | 页码 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/note/publish/list/user' \ ---data-urlencode 'ps=10' \ ---data-urlencode 'pn=1' --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "page": { - "total": 0, - "size": 10, - "num": 1 - } - } -} -``` - -
diff --git a/docs/note/readme.md b/docs/note/readme.md deleted file mode 100644 index dbf0223..0000000 --- a/docs/note/readme.md +++ /dev/null @@ -1,159 +0,0 @@ -# 视频笔记 - -2020-11-16 B站推出了测试版的功能——"视频笔记",与视频稿件关联,为富文本模式,可供记录观看视频时的感悟以及视频中的重要内容,目前只可在web端操作 - -笔记分为私有笔记和公开笔记,一个稿件只能添加一篇私有笔记,但可以公开多篇笔记 - -公开笔记与【专栏】性质相同,使用`cvid`寻址相应的公开笔记 - ---- - -**继续查看:** - -- [笔记列表](list.md) -- [笔记详细信息](info.md) -- [笔记操作](action.md) - ---- - -## 附表-笔记正文序列格式 - -根数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 第1个元素 | | -| n | obj | 第(n+1)个元素 | | -| …… | obj | …… | …… | - -根数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------------------- | -| attributes | obj | 元素属性 | 无属性无此项 | -| insert | str | 元素内容 | 为跳转/图片时无此项 | -| insert | obj | 元素跳转信息 | 非跳转/图片时无此项 | - -对象中的`attributes`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | ------------------------------ | -| bold | bool | 是否加粗 | | -| strike | bool | 是否删除线 | | -| underline | bool | 是否下划线 | | -| background | str | 背景颜色 | | -| color | str | 文字颜色 | | -| list | str | 列表属性 | ordered有序列表/bullet无序列表 | -| size | str | 文字字号 | | - -对象中的`insert`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ------ | -| tag | obj | 跳转标签 | 二选一 | -| imageUpload | obj | 笔记图片 | 二选一 | - -`insert`中的`tag`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ----------------- | ------------ | -| cid | num | 视频cid | | -| status | num | 0 | 作用尚不明确 | -| index | num | 在稿件中的分P索引 | | -| seconds | num | 视频进度 | | -| cidCount | num | 稿件总分P数 | | -| key | str | 标签创建时间戳 | | -| title | str | output | 作用尚不明确 | - -`insert`中的`imageUpload`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---------- | ------------ | -| url | str | 图片链接 | | -| status | str | done | 作用尚不明确 | -| width | num | 图片宽度-2 | | - -示例: - -以下笔记正文序列包含`字号`、`加粗`、`高亮`、`普通文本`格式 - -```json -[ - { - "attributes": { - "size": "24px", - "bold": true - }, - "insert": "关掉" - }, - { - "attributes": { - "size": "24px" - }, - "insert": "," - }, - { - "attributes": { - "size": "24px", - "bold": true - }, - "insert": "关掉" - }, - { - "insert": "," - }, - { - "attributes": { - "background": "#fff359" - }, - "insert": "一定要" - }, - { - "attributes": { - "background": "#fff359", - "bold": true - }, - "insert": "关掉" - }, - { - "insert": "\n再不关掉那些" - }, - { - "attributes": { - "bold": true - }, - "insert": "网络游戏" - }, - { - "insert": ",小孩哪有" - }, - { - "attributes": { - "bold": true - }, - "insert": "美好的未来" - }, - { - "insert": ",哪有" - }, - { - "attributes": { - "bold": true - }, - "insert": "美好的前程" - }, - { - "insert": ",祖国哪有" - }, - { - "attributes": { - "bold": true - }, - "insert": "栋梁之才" - }, - { - "insert": "\n" - } -] -``` - diff --git a/docs/opus/detail.md b/docs/opus/detail.md deleted file mode 100644 index 6af3933..0000000 --- a/docs/opus/detail.md +++ /dev/null @@ -1,2739 +0,0 @@ -# 图文详细 - -## 获取图文详细信息 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/detail - -*请求方法: GET* - -鉴权方式: `Cookie` 中 `buvid3` 存在且不为空 - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------------- | ------ | -------- | ------ | ---- | -| id | string | 动态 id | 必要 | 数字 | -| timezone_offset | number | 时区偏移 | 非必要 | 如 `-480` | -| features | string | 功能 | 非必要(部分专栏要求htmlNewStyle) | `onlyfansVote,onlyfansAssetsV2,decorationCard,htmlNewStyle,ugcDelete,editable,opusPrivateVisible,tribeeEdit,avatarAutoTheme,avatarTypeOpus` | - -**JSON 回复(旧版专栏未携带htmlNewStyle feature时)** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功
-352: 风控校验失败 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| fallback | object | 回退的内容信息 | | - -`fallback` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| id | number | 回退的内容ID | | -| type | number | 回退的内容类型 | 已知2为专栏 | - -**JSON 回复(正常返回情况):** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功
-352: 风控校验失败 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| item | object | 项 | 套了个娃 | - -`data.item` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| basic | object | 基本信息 | | -| id_str | string | 动态 id | | -| modules | object[] | 模块信息 | 参见 [功能模块](features.md) | -| type | number | 类型 | | -| fallback | number | 回滚信息 | 请检查请求参数 `features` | - -`data.item.basic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| comment_id_str | string | 评论对象 id 字符串 | | -| comment_type | number | 评论区类型 | | -| like_icon | object | 点赞图标? | | -| rid_str | string | 关联 id 字符串 | | -| title | string | 图文标题 | | -| uid | number | 作者 mid (UID) | | - -`data.item.basic.like_icon` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| action_url | string | | | -| end_url | string | | | -| id | number | | | -| start_url | string | | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/detail' \ ---url-query 'id=933099353259638816' \ ---url-query 'features=onlyfansVote,onlyfansAssetsV2,decorationCard,htmlNewStyle,ugcDelete,editable,opusPrivateVisible,tribeeEdit,avatarAutoTheme,avatarTypeOpus' \ --b 'buvid3=awa' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "item": { - "basic": { - "comment_id_str": "34646640", - "comment_type": 12, - "like_icon": { - "action_url": "", - "end_url": "", - "id": 0, - "start_url": "" - }, - "rid_str": "34646640", - "title": "【服务搭建】零开销在线运行代码!glot.io服务私有化部署 - 哔哩哔哩", - "uid": 293793435 - }, - "id_str": "933099353259638816", - "modules": [ - { - "module_title": { - "text": "【服务搭建】零开销在线运行代码!glot.io服务私有化部署" - }, - "module_type": "MODULE_TYPE_TITLE" - }, - { - "module_author": { - "avatar": { - "container_size": { - "height": 1.375, - "width": 1.375 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - }, - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "var(--bg1)", - "border": "2px solid var(--bg1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "layers": [ - { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.787, - "width": 0.787 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.6875, - "axis_y": 0.6875, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1.375, - "width": 1.375 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": {} - } - }, - "resource": { - "res_animation": { - "webp_src": { - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp" - }, - "src_type": 1 - } - }, - "res_type": 4 - }, - "visible": true - } - ] - }, - { - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.7560000000000001, - "axis_y": 0.7726666666666667, - "coordinate_pos": 1 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 0.41666666666666663, - "width": 0.41666666666666663 - } - }, - "layer_config": { - "tags": { - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "background-color": "var(--bg1)", - "border": "2px solid var(--bg1)", - "borderRadius": "50%", - "boxSizing": "border-box" - } - } - }, - "ICON_LAYER": {} - } - }, - "resource": { - "res_image": { - "image_src": { - "local": 1, - "src_type": 2 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - } - ], - "mid": "293793435" - }, - "decorate_card": { - "big_card_url": "https://i0.hdslb.com/bfs/garb/item/c0cf2235089ed314d92f30efa855c9b5611fa2cd.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/garb/item/c0cf2235089ed314d92f30efa855c9b5611fa2cd.png", - "fan": { - "color": "#07b6d5", - "color_format": { - "colors": [ - "#07b6d5FF", - "#07b6d5FF" - ], - "end_point": "0,100", - "gradients": [ - 0, - 100 - ], - "start_point": "0,0" - }, - "is_fan": 1, - "name": "初音未来周年纪念", - "num_desc": "005638", - "number": 5638 - }, - "id": 2513, - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/c0cf2235089ed314d92f30efa855c9b5611fa2cd.png", - "item_id": 2513, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=2513&isdiy=0&part=card&from=post&f_source=garb&vmid=293793435&native.theme=1&navhide=1", - "name": "初音未来粉丝专属" - }, - "face": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/293793435", - "label": "", - "mid": 293793435, - "more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "name": "社会易姐QwQ", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "https://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "image_enhance": "https://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "https://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png", - "n_pid": 2511, - "name": "初音未来13周年", - "pid": 2511 - }, - "pub_location_text": "", - "pub_time": "编辑于 2024年05月19日 12:18", - "pub_ts": 1716092523, - "views_text": "", - "vip": { - "avatar_icon": { - "icon_resource": {}, - "icon_type": 1 - }, - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": 1770825600000, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png", - "label_theme": "annual_vip", - "path": "http://i0.hdslb.com/bfs/vip/label_annual.png", - "text": "年度大会员", - "text_color": "#FFFFFF", - "use_img_label": true - }, - "nickname_color": "#FB7299", - "role": 3, - "status": 1, - "theme_type": 0, - "tv_due_date": 1640793600, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 2, - "vip_pay_type": 0 - } - }, - "module_type": "MODULE_TYPE_AUTHOR" - }, - { - "module_content": { - "paragraphs": [ - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "感谢 " - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "来笙云 Laysense.cn" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": " 提供算力" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "作为一个全栈工程师,开发、维护和测试一些软件系统时,必然会涉及到多种编程语言,有时还需要测试一些编程语言的安全特性,常常需要敏捷地了解它们并立即上手。在朋友的推荐和社区分享下,我了解到一个名叫 glot.io 的开源项目。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "它支持40多种编程语言,无论是热门的 Python、Go、Rust、Kotlin,还是冷门的 COBOL、Erlang、Haskell 只需在网页上选择对应的语言,即可开始编写。为使用者提供了一个 Sandbox(沙箱)和 Playground(游乐场)环境,既不需要配置它们的 Runtime(运行环境)和 IDE(集成开发环境),也不需要担心误操作对系统产生破坏性,还不会占用任何用户端的系统资源,实现真正的零开销运行代码。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": 1120, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/article/06582181a80a3f367ae0486aec34759f293793435.png", - "width": 1776 - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "在代码编写界面,可以创建多个源码文件,完成后点击Run就能执行它并得到输出,类似我们平时编程那样,将输出打在终端上。整个过程不会生成任何可执行文件,所以它的应用场景不是在线编译,而是在线运行代码片段。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/bb4e8fc35a33ba0b771478f4bc5aaca7293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "glot.io 这个网站提供了公开的代码片段执行和分享功能,任何人在注册后都可以分享自己的代码片段,并使用它的 API。但有时为了安全性和访问速度考量,需要自行搭建这个开源平台,这篇文章将介绍 Glot 的私有化部署。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "Glot是什么" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "根据项目 README 上的一句介绍:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 4, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "an open source pastebin with runnable snippets and API." - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "这是一个开源的共享剪切板和代码片段执行器,并提供 API。它使用 MIT 协议开源,代码托管于 github 之上。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "https://github.com/glotcode/glot" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "Glot 并不是一个独立的工程,它分为多个组件,这样设计底层架构有利于业务解耦,降低后期维护和升级开发的难度,它们之间的逻辑关系如下:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/808dd5fa58016f392b15a36a0df27a29293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "由下面这些组件构成,也全部使用 MIT 协议开源,均托管于 Github:" - } - } - ] - } - }, - { - "align": 0, - "list": { - "items": [ - { - "level": 1, - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "glot-www" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": ":提供 B/S 前端应用" - } - } - ], - "order": 1 - }, - { - "level": 1, - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "docker-run" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": ":提供执行 glot-images 镜像能力的微服务" - } - } - ], - "order": 2 - }, - { - "level": 1, - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "glot-images" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": ":按需构建的执行器镜像" - } - } - ], - "order": 3 - }, - { - "level": 1, - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "code-runner" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": ":容器内的执行调度器" - } - } - ], - "order": 4 - } - ], - "style": 2 - }, - "para_type": 5 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "其中 glot-www 是一个 B/S 架构应用的服务器,用来提供一个面向用户的 WebUI(网站),它包含前后端的组件,后端使用 Haskell 语言编写。实现代码片段保存和共享、用户登录、以及共享剪切板所的功能,由 pgSQL 提供存储支持。与此同时,它与实际的代码执行业务互相解耦,使用 RestAPI 进行 RPC 调用,可做到前端服务器和后端代码执行服务器逻辑上隔离。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "Glot 的代码执行沙箱基于 Docker,在容器中编译和运行,不但与宿主机隔离,且容器之间也相互隔离,还能对运行资源进行限制,防止宿主机被不信任的代码破坏。当然,各编程语言的执行容器构成不尽相同,这样才能在节约存储空间的同时最大保持运行效率,比如 C 和 C++ 共用了glot/clang这个镜像,C" - } - }, - { - "rich": { - "jump_url": "//search.bilibili.com/all?keyword=%20%E5%92%8C%20F", - "orig_text": "# 和 F#", - "text": "# 和 F#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" - }, - "type": "TEXT_NODE_TYPE_RICH" - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": " 的镜像都有 mono 这个依赖……这些 Docker 镜像由 glot-images 项目进行生成,它并非使用传统的 Dockerfile,而是使用了 nix 进行构建,支持多种主流编程语言。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/8627bd181a4c0ef3f5985f2d80ed49a5293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "宿主机与沙箱的通讯,实际上就构建并将代码传入容器。这个传递方式不使用文件,而使用 stdi(基本输入)的方式传递 json,例如这样的形式:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "echo '{\n "language": "python",\n "files": [\n {\n "name": "main.py",\n "content": "print(42)"\n }\n ]\n}' | docker run --rm -i --read-only --tmpfs /tmp:rw,noexec,nosuid,size=65536k --tmpfs /home/glot:rw,exec,nosuid,uid=1000,gid=1000,size=131072k -u glot -w /home/glot glot/javascript:latest", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "执行完成之后以 stdo(基本输出)的方式输出 json,stdout、stderr 流、以及错误信息在序列化后拆分成各个字段:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "stdout": "42\\n",\n "stderr": "",\n "error": ""\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "一般编程语言分为编译型、解释型和虚拟机型,其中解释型直接执行文本文件中的内容,编译型则需将其编译为可执行文件再执行,而虚拟机型在编译完之后,还需用 vm 执行字节码。glot-images 将各类编程语言生成的工作流统一归做 json 格式的文本流,这样标准化更利于开发和扩展,这种能力归功于 code-runner 这个组件。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "code-runner 作为 glot 的一个特殊组件,并不运行在宿主机中,它是一个 cli 工具,运行在执行容器中,使用 Rust 语言开发。在 glot-images 的每个镜像中,均以相同方式工作在底层。它支持多种编程语言从编译到运行的生命周期管理,同时接管运行时的 stdio(基本输入输出)" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": { - "bold": true - }, - "words": "," - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "例如 C 语言,首先会将输入的文本反序列化,写入到文件,接着调用 clang 编译这个文件,最后再运行编译器生成的可执行文件,执行过程中也会将预定义的 stdi 发送给程序,程序的 stdo/stderr 流被它记录下来随后序列化为 json 文本返回。实际上在使用docker run这类命令执行 glot-images 镜像时,就是调用了之中的 code-runner,而不是调用了clang这种编译器。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "使用 stdi 传递 json 给它,就会调用相应的编译执行流程:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "echo '{\n "language": "python",\n "files": [\n {\n "name": "main.py",\n "content": "print(42)"\n }\n ]\n}' | code-runner", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "与 glot-images 的镜像相同,执行后也会使用 stdo 以 json 格式返回:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "stdout": "42\\n",\n "stderr": "",\n "error": ""\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "要将这些跑在 Docker 上的执行器服务化、RPC(远程过程调用)化,必须有一个 daemon 在底层进行调度,一边开放 HTTP 服务,另一边通过 unix socket 操纵 DockerEngine,执行容器操作。提供这个能力的就是 docker-run 组件,它也使用 Rust 语言开发。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "例如这样访问 docker-run,和上文中的例子相同:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "curl 'http://localhost:8088/run' \\\n -H 'X-Access-Token: some-secret-token' \\\n -H 'Content-type: application/json' \\\n -d '{\n "image": "glot/python:latest",\n "payload": {\n "language": "python",\n "files": [\n {\n "name": "main.py",\n "content": "print(42)"\n }\n ]\n }\n}'", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "有了这些组件,就可以自行私有化搭建一个 glot 服务,因为各组件的标准化和解耦,可以随意进行裁剪和二次开发。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "接下来将介绍 docker-run 和 glot-images 这两个基本组件的搭建(不搭建前端 WebUI 和共享服务)。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "Glot服务搭建" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "首先应该准备一台性能不错的服务器,要求 CPU 核心数和 RAM 不能太低。以下步骤使用 Debian 12 系统进行操作,整个过程需要有稳定的网络环境,并且已更新包管理器的索引。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "安装Docker和运行环境" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "首先需要安装前置依赖,其中 git 和 gcc 安装 Rust 时需要,runsc 是 gVisor 运行环境" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "sudo apt-get install ca-certificates curl git gcc runsc", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "安装 Docker,这里参考了官方文档的安装方式,先进行软件源的添加,再安装各组件" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "https://docs.docker.com/engine/install/debian/" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "sudo install -m 0755 -d /etc/apt/keyrings\nsudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc\nsudo chmod a+r /etc/apt/keyrings/docker.asc\necho \\\n "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \\\n $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \\\n sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\nsudo apt update\n\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "gVisor 作为谷歌开源的一款轻量容器运行时沙箱,可作为 Docker 的运行时中间件,隔离容器内的 syscall,提升容器安全性,具体可以参考官网 https://gvisor.dev" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "对于 Docker,需要配置 gVisor 为 DockerEngine 插件,创建配置文件后写入以下内容:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "vi /etc/docker/daemon.json", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "default-runtime": "runsc",\n "runtimes": {\n "runsc": {\n "path": "/usr/bin/runsc"\n }\n }\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "在修改配置文件后,应重启 DockerEngine" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "systemctl restart docker", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "可以使用以下命令检查检查 Docker 和 gVisor 安装状态" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "docker system info\ndocker system info | grep 'runsc'", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/f2a9046662ce5bdc93a5bbe7393dd2b4293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/888de2ab19dede7ec6880f407269519c293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "接者我们创建名为glot的用户,作为 daemon 的运行角色" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "useradd -m glot\nusermod -aG docker glot", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "安装 Rust,这里参考官方文档,使用脚本进行安装" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "https://rustup.rs/" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/2d7118b743cd2f10cd289e59969eeb01293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "安装完毕后,可以使用以下命令检查 Rust 的安装" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "cargo -V", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/0e40ab6cc26aa95bcaf7458159316d7c293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "因官方的 crates 源速度很慢,如果国内使用可以换为镜像源,这里使用了 SJTU 镜像" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "vi ~/.cargo/config.toml", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/4b8b4b8e7550009d6fd0c4439922564a293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "编译docker-run" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "克隆 docker-run 项目,准备使用源码进行编译安装" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "git clone https://github.com/glotcode/docker-run glot-docker-run", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "进入仓库目录,使用 cargo 编译 Rust 工程" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "cd glot-docker-run\ncargo b -r", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/7c39ed2031e7932c1bc24926ea1c3025293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "检查编译结果,在工程目录的target/release中将会生成名为docker-run的可执行文件" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/51d7ad2ddf5dd75c531e267965c6ddb6293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "复制可执行文件和 systemd 服务模板" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "cp target/release/docker-run /home/glot/bin/\ncp systemd/docker-run.service /etc/systemd/system/", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "docker-run 服务使用 systemd 进行托管,作为 daemon 运行,它对外提供一个 http 服务,其他应用使用 RestAPI 与之对接\n编辑 systemd 服务配置文件" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "vi /etc/systemd/system/docker-run.service", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "docker-run 的配置文件全部为环境变量,一些重要的参数已经给出了注释" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "其中SERVER_LISTEN_ADDR和SERVER_LISTEN_PORT决定了 daemon 监听的 ip 和端口号,可以根据需求修改" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "SERVER_WORKER_THREADS为 worker 线程数,根据实际业务并发量修改,即越多可同时执行的任务越多" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "API_ACCESS_TOKEN是 RestAPI 的访问 Token,设定一个较复杂的值,可防止未授权访问,在调用中以 HTTP 请求 Header 的X-Access-Token字段进行传递" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "RUN_MAX_EXECUTION_TIME参数用来限制任务执行的超时时间,其单位为秒,如果一个任务大于这个时间没有执行完毕,docker-run 就会销毁这个容器,并会返回一个 400 错误" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "RUN_MAX_OUTPUT_SIZE参数是用来限制最大输出量的,它的单位是 Byte,如果输出的内容过大,同样会被丢弃并报错\n这些参数的详细配置也可以参考 docker-run 项目的 README: https://github.com/glotcode/docker-run?tab=readme-ov-file#environment-variables" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "[Unit]\nDescription=docker-run\n\n[Service]\nUser=glot\nGroup=glot\nRestart=always\nRestartSec=10\nExecStart=/home/glot/bin/docker-run\n# 服务绑定 ip\nEnvironment="SERVER_LISTEN_ADDR=0.0.0.0"\n# 服务监听端口\nEnvironment="SERVER_LISTEN_PORT=8088"\n# worker 线程数\nEnvironment="SERVER_WORKER_THREADS=10"\n# API Token\nEnvironment="API_ACCESS_TOKEN=some-secret-token"\n# Docker socket 路径\nEnvironment="DOCKER_UNIX_SOCKET_PATH=/var/run/docker.sock"\nEnvironment="DOCKER_UNIX_SOCKET_READ_TIMEOUT=3"\nEnvironment="DOCKER_UNIX_SOCKET_WRITE_TIMEOUT=3"\n# 容器主机名\nEnvironment="DOCKER_CONTAINER_HOSTNAME=glot"\n# 容器用户\nEnvironment="DOCKER_CONTAINER_USER=glot"\n# 容器最大内存限制\nEnvironment="DOCKER_CONTAINER_MEMORY=1000000000"\n# 容器内是否禁用网络支持\nEnvironment="DOCKER_CONTAINER_NETWORK_DISABLED=true"\nEnvironment="DOCKER_CONTAINER_ULIMIT_NOFILE_SOFT=90"\nEnvironment="DOCKER_CONTAINER_ULIMIT_NOFILE_HARD=100"\nEnvironment="DOCKER_CONTAINER_ULIMIT_NPROC_SOFT=90"\nEnvironment="DOCKER_CONTAINER_ULIMIT_NPROC_HARD=100"\nEnvironment="DOCKER_CONTAINER_CAP_DROP=MKNOD NET_RAW NET_BIND_SERVICE"\nEnvironment="DOCKER_CONTAINER_READONLY_ROOTFS=true"\nEnvironment="DOCKER_CONTAINER_TMP_DIR_PATH=/tmp"\nEnvironment="DOCKER_CONTAINER_TMP_DIR_OPTIONS=rw,noexec,nosuid,size=65536k"\n# 容器工作目录\nEnvironment="DOCKER_CONTAINER_WORK_DIR_PATH=/home/glot"\nEnvironment="DOCKER_CONTAINER_WORK_DIR_OPTIONS=rw,exec,nosuid,size=131072k"\n# 容器执行超时时间\nEnvironment="RUN_MAX_EXECUTION_TIME=15"\n# 最大允许输出\nEnvironment="RUN_MAX_OUTPUT_SIZE=100000"\n# 日志级别\nEnvironment="RUST_LOG=debug"\n\n[Install]\nWantedBy=multi-user.target", - "lang": "language-yaml" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "修改完配置文件就可启动服务了,并将它设为开机自启" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "systemctl daemon-reload\nsystemctl enable --now docker-run.service", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "GET 请求刚才配置的那个地址的根路径,测试服务运行状态正常,我这里是 http://localhost:8088/" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/7e0a6d73cdb1ba63bcfcbe94df9c7b39293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "拉取Docker镜像" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "glot-images 构建了各编程语言的执行镜像,这些镜像使用 nix 构建,但因为 nix 的配置比较复杂,且占用存储空间巨大,这里直接使用上传在 DockerHub 的镜像了(弊端就是语言版本比较旧)" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "https://hub.docker.com/u/glot" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/e63013e3c15cd556ec7ce82048d43889293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "通过 docker pull命令拉取各个镜像,可以按照自己的需求拉取,比如你只需要执行某几个编程语言" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "docker pull glot/assembly\ndocker pull glot/ats\ndocker pull glot/bash\ndocker pull glot/clang\ndocker pull glot/clisp\ndocker pull glot/clojure\ndocker pull glot/cobol\ndocker pull glot/coffeescript\ndocker pull glot/crystal\ndocker pull glot/csharp\ndocker pull glot/dart\ndocker pull glot/elixir\ndocker pull glot/elm\ndocker pull glot/erlang\ndocker pull glot/fsharp\ndocker pull glot/golang\ndocker pull glot/groovy\ndocker pull glot/guile\ndocker pull glot/hare\ndocker pull glot/haskell\ndocker pull glot/idris\ndocker pull glot/java\ndocker pull glot/javascript\ndocker pull glot/julia\ndocker pull glot/kotlin\ndocker pull glot/lua\ndocker pull glot/mercury\ndocker pull glot/nim\ndocker pull glot/nix\ndocker pull glot/ocaml\ndocker pull glot/pascal\ndocker pull glot/perl\ndocker pull glot/php\ndocker pull glot/python\ndocker pull glot/raku\ndocker pull glot/ruby\ndocker pull glot/rust\ndocker pull glot/sac\ndocker pull glot/scala\ndocker pull glot/swift\ndocker pull glot/typescript\ndocker pull glot/zig", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "这些全部拉取下来大概需要38GB,可以使用docker images命令检查拉取情况" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/82a01995548eb266d59f7fd22f75e542293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "如果已经拉取了所有的镜像,可以执行单元测试脚本,来验证各编程语言执行容器的正确性,在 docker-run 的目录下的scripts目录内" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "cd glot-docker-run/scripts/\n./test_glot.sh 'http://localhost:8088' 'some-secret-token'", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/004e79df950a4bc93ff42fae8017d0aa293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 24, - "style": { - "bold": true - }, - "words": "使用Glot服务" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "docker-run 这个组件对外提供 RestAPI 接口,其他进程或者其他主机可以直接调用,它共有三个功能对应其路径:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/a28b283d2075bbd78c12e1d2859fd40d293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "查询服务状态" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "curl http://localhost:8088/", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "返回 daemon 的服务名、版本等" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "name": "docker-run",\n "version": "1.4.0",\n "description": "Api for running code in transient docker containers"\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "查询宿主机 DockerEngine 信息,访问这个接口需要在请求 Header 的X-Access-Token字段中携带 Token" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "curl http://localhost:8088/version \\\n -H 'X-Access-Token: some-secret-token'", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "执行成功将会返回 DockerEngine 的版本信息" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "docker": {\n "version": "26.1.2",\n "apiVersion": "1.45",\n "gitCommit": "ef1912d",\n "goVersion": "go1.21.10",\n "os": "linux",\n "arch": "amd64",\n "kernelVersion": "6.2.16-3-pve",\n "buildTime": "2024-05-08T13:59:59.000000000+00:00",\n "platform": {\n "name": "Docker Engine - Community"\n },\n "components": [\n {\n "name": "Engine",\n "version": "26.1.2"\n },\n {\n "name": "containerd",\n "version": "1.6.31"\n },\n {\n "name": "runsc",\n "version": "0.0~20221219.0"\n },\n {\n "name": "docker-init",\n "version": "0.19.0"\n }\n ]\n }\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "执行响应的代码前,需要构建一个 json 请求体,用来描述创建的执行任务的行为,下表是它的定义:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/752ce6ef76a448158eb97222befa7c92293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "payload 结构:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/752ce6ef76a448158eb97222befa7c92293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "文件对象的结构:" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/752ce6ef76a448158eb97222befa7c92293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "eg:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "{\n "image": "glot/python:latest",\n "payload": {\n "language": "python",\n "files": [\n {\n "name": "main.py",\n "content": "print(42)"\n }\n ]\n }\n}", - "lang": "language-json" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "访问这个接口也需要在请求 Header 中携带 Token:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "curl 'http://localhost:8088/run' \\\n -H 'X-Access-Token: some-secret-token' \\\n -H 'Content-type: application/json' \\\n -d '{\n "image": "glot/python:latest",\n "payload": {\n "language": "python",\n "files": [\n {\n "name": "main.py",\n "content": "print(42)"\n }\n ]\n }\n}'", - "lang": "language-bash" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "我们可以直接将它与自己熟悉的编程语言对接,实现给应用或者平台提供运行任意代码的能力。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "这里使用 Python 通过 RestAPI 调用 glot(docker-run),实现运行一段 rust 代码并取回输出为字符串:" - } - } - ] - } - }, - { - "align": 0, - "code": { - "content": "import requests\n\ndef run_code(image, lang, file_name, code):\n resp = requests.post(\n url="http://localhost:8088/run",\n headers={\n "X-Access-Token": "some-secret-token",\n },\n json={\n "image": image,\n "payload": {\n "language": lang,\n "files": [\n {\n "name": file_name,\n "content": code,\n },\n ],\n },\n },\n )\n json_content = resp.json()\n return json_content\n\n\nimage = "glot/rust:latest"\nlang = "rust"\nfile_name = "main.rs"\ncode = """\nfn main() {\n for i in 1..=9 {\n for j in 1..=i {\n print!("{}x{}={:2} ", j, i, j * i);\n }\n println!();\n }\n}\n"""\n\nresult = run_code(image, lang, file_name, code)\nprint(result["stdout"])", - "lang": "language-python" - }, - "para_type": 7 - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "测试可以正确输出执行内容" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": null, - "live_url": null, - "size": null, - "url": "https://i0.hdslb.com/bfs/new_dyn/21e396261fb607d4823f7ec4327908b1293793435.png", - "width": null - } - ], - "style": 2 - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "有了通用接口的能力,我们就有了将其集成进自己平台的可能,只要发挥创造力,就可以围绕在线执行代码提供相关的业务,或者作为微服务连接上游的业务,比如搭建 OJ(在线判题)平台等。以及 glot 项目以 MIT 协议开源,这意味着我们可以随意修改底层代码,比如增加网络和共享路径支持、增加第三方库等。总之,这是一个完成度很高、十分推荐的开源项目。" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "由 " - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "color": "#ff968d", - "font_size": 17, - "style": {}, - "words": "来笙云 Laysense.cn" - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": " 强力支持" - } - } - ] - } - }, - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "原文链接:https://shakaianee.top/archives/1002/" - } - } - ] - } - } - ] - }, - "module_type": "MODULE_TYPE_CONTENT" - }, - { - "module_extend": { - "items": [ - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=%E8%BF%90%E7%BB%B4", - "text": "运维" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA", - "text": "服务搭建" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=glot.io", - "text": "glot.io" - } - ] - }, - "module_type": "MODULE_TYPE_EXTEND" - }, - { - "module_bottom": { - "share_info": { - "pic": "https://static.hdslb.com/mobile/img/app_logo.png", - "summary": "感谢 来笙云 Laysense.cn 提供算力 作为一个全栈工程师,开发、维护和测试一些软件系统时,必然会涉及到多种编程语言,有时还需要测试一些编程语言的安全特性,常常需要敏捷地了解它们并立即上手。在朋友的推荐和社区分享下,我了解到一个名叫 glot.io 的开源项目。 它支持40多种编程语言,无论是热门的 Python、Go、Rust、Kotlin,还是冷门的 COBOL、Erlang、Haskell 只需在网页上选择对应的语言,即可开始编写。为使用者提供了一个 Sandbox(沙箱)和 Playground(游乐场)环境,既不需要配置它们的 Runtime(运行环境)和 IDE(集成开发环境),也不需要担心误操作对系统产生破坏性,还不会占用任何用户端的系统资源,实现真正的零开销运行代码。 [图片] 在代码编写界面,可以创建多个源码文件,完成后点击Run就能执行它并得到输出,类似我们平时编程那样,将输出打在终端上。整个过程不会生成任何可执行文件,所以它的应用场景不是在线编译,而是在线运行代码片段。 [图片] glot.io 这个网站提供了公开的代码片段执行和分享功能,任何人在注册后都可以分享自", - "title": "【服务搭建】零开销在线运行代码!glot.io服务私有化部署" - } - }, - "module_type": "MODULE_TYPE_BOTTOM" - }, - { - "module_stat": { - "coin": { - "count": 1, - "forbidden": false, - "status": false - }, - "comment": { - "count": 3, - "forbidden": false - }, - "favorite": { - "count": 4, - "forbidden": false, - "status": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 17, - "forbidden": false, - "status": false - } - }, - "module_type": "MODULE_TYPE_STAT" - } - ], - "type": 1 - } - }, - "message": "0", - "ttl": 1 -} -``` -
- - diff --git a/docs/opus/features.md b/docs/opus/features.md deleted file mode 100644 index b54e961..0000000 --- a/docs/opus/features.md +++ /dev/null @@ -1,1295 +0,0 @@ -# 功能模块 - -部分动态相关接口请求存在 `features` 参数, 意为功能
-主要用于控制返回结果中的 `modules` 中的内容, 意为模块
-此两者在一定程度上为对应关系, 但也存在大量例外
-本页文档整理了大部分常见的已知功能与模块以供参考 - -## features - -请求 URL 参数, 用 `,` 分隔 - -| 名称 | 含义 | 备注 | 示例 | -| ---- | ---- | ---- | ---- | -| htmlNewStyle | 是否显示专栏正文 | 对于纯动态类型接口无效 | 1056353752004427792 | -| itemOpusStyle | 是否以图文风格显示动态 | 部分动态强制需要, 对于图文类型接口无效 | 1060771233257226247, 1065507757569867779 | -| listOnlyfans | | | | -| opusBigCover | 是否在返回结果中区分大封面与九宫格 | 对于图文接口似乎无效, 前置条件 `itemOpusStyle` | 1052711525276450824 | -| onlyfansVote | 是否在投票信息中增加参与按钮等 | | 1060771233257226247 | -| onlyfansAssetsV2 | | | | -| forwardListHidden | | | | -| ugcDelete | | | | -| onlyfansQaCard | 是否展示更详细的展示充电专属问答 | | 1087983622038749191 | -| commentsNewVersion | | | | -| decorationCard | 是否以卡片形式显示装扮 | | 566950981753221664 | -| editable | 是否在右上角三点菜单中显示 `编辑` | 必须是自己发送的动态才有效果 | 1065142062572109830 | -| opusPrivateVisible | | | | -| tribeeEdit | | | | -| avatarAutoTheme | 头像颜色使用 CSS 变量 | 对于纯动态类型接口无效 | 933099353259638816 | -| avatarTypeOpus | | | | - -## modules - -内容以 [获取图文详细信息](detail.md) 为基础 - -### MODULE_TYPE_TITLE - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_title | object | 标题模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_TITLE` | - -`module_title` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| text | string | 标题内容 | | - -
-查看示例: - -```json -{ - "module_title": { - "text": "欢迎加入粉丝交流群~" - }, - "module_type": "MODULE_TYPE_TITLE" -} -``` -
- - - -### MODULE_TYPE_AUTHOR - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_author | object | 作者模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_AUTHOR` | - -`module_author` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| avater | object | 头像信息 | 主要用于网页渲染, 若感兴趣可参考 [图片格式化](../misc/picture.md) | -| decorate | object | 装扮 | 仅当动态接口且无 `decorationCard` 时存在 | -| decorate_card | object | 装扮 | 仅当图文接口时存在 | -| decoration_card | object | 装扮 | 仅当动态接口且有 `decorationCard` 时存在, 同 `decorate_card` | -| face | string | 头像 URL | | -| face_nft | boolean | 是否为 NFT 头像 | | -| following | boolean | 是否关注此 UP 主 | 自己的动态为 `null` | -| jump_url | string | 跳转链接 | | -| label | string | 名称前标签 | `合集`
`电视剧`
`番剧` | -| mid | number | UP 主 UID
剧集 SeasonId | | -| more | object | 三点按钮中的项目 | 参见 [module_more](#module_more), 仅图文接口 | -| name | string | UP 主名称
剧集名称
合集名称 | | -| official | object | UP 主认证信息 | 仅图文接口 | -| official_verify | object | UP主认证信息 | 仅动态接口 | -| pendant | object | UP 主头像框 | | -| pub_action | string | 更新动作描述 | 仅动态接口
`投稿了视频`
`直播了`
`投稿了文章`
`更新了合集`
`与他人联合创作`
`发布了动态视频`
`投稿了直播回放` | -| pub_location_text | string | 空 | | -| pub_time | string | 更新时间 | `x分钟前`
`x小时前`
`昨天`
等 | -| pub_ts | number | 更新时间戳 | UNIX 秒级时间戳 | -| views_text | string | | | -| vip | object | UP 主大会员信息 | | -| type | string | 作者类型 | 仅动态接口, [作者类型](../dynamic/dynamic_enum.md#作者类型) | -| nft_info | object | NFT 头像信息 | 可能不存在 | - -`module_author.avatar` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| container_size | object | | | -| fallback_layers | object | | | -| mid | string | | | - -`module_author.avatar.container_size` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | | | -| width | number | | | - -`module_author.avatar.fallback_layers` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| is_critical_group | boolean | | | -| layers | object[] | | | - -`module_author.avatar.fallback_layers.layers[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| general_spec | object | | | -| layer_config | object | | | -| resource | object | | | -| visible | boolean | | | - -`module_author.avatar.fallback_layers.layers[].general_spec` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| pos_spec | object | | | -| render_spec | object | | | -| size_spec | object | | | - -`module_author.avatar.fallback_layers.layers[].general_spec.pos_spec` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| axis_x | number | | | -| axis_y | number | | | -| coordinate_pos | number | | | - -`module_author.avatar.fallback_layers.layers[].general_spec.render_spec` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| opacity | number | | | - -`module_author.avatar.fallback_layers.layers[].general_spec.size_spec` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | | | -| width | number | | | - -`module_author.avatar.fallback_layers.layers[].layer_config` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| is_critical | boolean | | | -| tags | object | | | - -`module_author.avatar.fallback_layers.layers[].layer_config.tags` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| AVATAR_LAYER | object | | | -| GENERAL_CFG | object | | | - -`module_author.avatar.fallback_layers.layers[].layer_config.tags.AVATAR_LAYER` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`module_author.avatar.fallback_layers.layers[].layer_config.tags.GENERAL_CFG` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| config_type | number | | | -| general_config | object | | | - -`module_author.avatar.fallback_layers.layers[].layer_config.tags.GENERAL_CFG.general_config` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| web_css_style | object | | | - -`module_author.avatar.fallback_layers.layers[].layer_config.tags.GENERAL_CFG.general_config.web_css_style` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| borderRadius | string | | | - -`module_author.avatar.fallback_layers.layers[].resource` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| res_image | object | | | -| res_type | number | | | - -`module_author.avatar.fallback_layers.layers[].resource.res_image` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| image_src | object | | | - -`module_author.avatar.fallback_layers.layers[].resource.res_image.image_src` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| placeholder | number | | | -| remote | object | | | -| src_type | number | | | - -`module_author.avatar.fallback_layers.layers[].resource.res_image.image_src.remote` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| bfs_style | string | | | -| url | string | | | - -`module_author.decorate` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| card_url | string | 动态卡片小图标图片URL | | -| fan | object | 粉丝装扮信息 | | -| id | number | 装扮 ID | | -| jump_url | string | 跳转 URL | | -| name | string | 装扮名称 | | -| type | number | `1` `2` `3` | | - -`module_author.decorate.fan` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| color | string | 编号颜色 | | -| color_format | object | 颜色格式 | | -| is_fan | boolean | 是否是粉丝装扮 | | -| num_str | string | 装扮编号前缀 | 如 `NO.` | -| number | number | 装扮编号 | | - - -`module_author.decorate.fan.color_format` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| colors | string[] | 颜色 | 带 `#` 前缀的 16 进制颜色代码 | -| end_point | string| 端点 | `0,100` | -| gradients | number[] | 渐变 | 内容 [0, 100] | -| start_point | string | 起点 | `0,0` | - -`module_author.decorate_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| big_card_url | string | 大装扮卡片 URL | | -| card_type | number | 装扮卡片类型 | | -| card_type_name | string | 装扮卡片类型名称 | | -| card_url | string | 装扮卡片 URL | | -| fan | object | 粉丝装扮信息 | 同 `module_author.decorate.fan` | -| id | number | 装扮 ID | | -| image_enhance | string | 同 `card_url`? | | -| item_id | number | 项目 ID? | | -| item_type | number? | 项目类型? | 图文接口当 `decorationCard` 时才有此项 | -| jump_url | string | 跳转 URL | | -| name | string | 装扮名称 | | - - - -`module_author.official` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| desc | string | 认证说明 | | -| role | number | | | -| title | string | | | -| type | number | 认证类型 | | - -`module_author.pendant` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| expire | number | 过期时间 | 此接口返回恒为`0` | -| image | string | 头像框图片 URL | | -| image_enhance | string | 头像框图片 URL | | -| image_enhance_frame | string | 头像框图片逐帧序列 URL | | -| n_pid | number | 同 `pid` | | -| name | string | 头像框名称 | | -| pid | number | 头像框id | | - -`module_author.vip` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| avatar_icon | object | | 仅图文接口 | -| avatar_subscript | number | 是否显示角标 | 0:不显示
1:显示 | -| avatar_subscript_url | string | 空 | | -| due_date | number | 大会员过期时间戳 | UNIX 毫秒时间戳 | -| label | object | 大会员标签 | | -| nickname_color | string | 名字显示颜色 | 大会员:`#FB7299` | -| role | number | | 仅图文接口 | -| status | number | 大会员状态 | 0:无
1:有
2:封禁? | -| theme_type | number | 主题类型? | 仅图文接口 | -| tv_due_date | number | TV 端过期时间? | 仅图文接口 | -| tv_vip_pay_type | number | TV 端付费状态? | 仅图文接口| -| tv_vip_status | number | TV 端会员状态? | | -| type | number | 大会员类型? | | -| vip_pay_type | number | 大会员付费类型? | - -`module_author.vip.avatar_icon` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| icon_resource | object | | | - -`module_author.vip.avatar_icon.icon_resource` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | - -`module_author.vip.label` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| bg_color | string | 会员标签背景颜色 | `#FB7299` | -| bg_style | number | `0` `1` | | -| border_color | string | 空 | | -| img_label_uri_hans | string | 大会员牌子图片 | 动态版 简体版 | -| img_label_uri_hans_static | string | 大会员牌子图片 | 静态版 简体版 | -| img_label_uri_hant | string | 大会员牌子图片 | 动态版 繁体版 | -| img_label_uri_hant_static | string | 大会员牌子图片 | 静态版 繁体版 | -| label_theme | string | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员
fools_day_hundred_annual_vip:最强绿鲤鱼 | -| path | string | 空 | | -| text | string | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | -| text_color | string | 用户名文字颜色 | | -| use_img_label | boolean | `true` | | - -`module_author.nft_info`: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| region_icon | string | NFT头像角标URL | 类型1:https://i0.hdslb.com/bfs/activity-plat/static/20220506/334553dd7c506a92b88eaf4d59ac8b4d/j8AeXAkEul.gif
类型2:https://i0.hdslb.com/bfs/activity-plat/static/20220506/334553dd7c506a92b88eaf4d59ac8b4d/IOHoVs1ebP.gif | -| region_type | number | NFT头像角标类型 | 1,2 | -| show_status | number | `1` | | - -
-查看示例: - -```json -{ - "module_author": { - "avatar": { - "container_size": { - "height": 1.35, - "width": 1.35 - }, - "fallback_layers": { - "is_critical_group": true, - "layers": [ - { - "general_spec": { - "pos_spec": { - "axis_x": 0.675, - "axis_y": 0.675, - "coordinate_pos": 2 - }, - "render_spec": { - "opacity": 1 - }, - "size_spec": { - "height": 1, - "width": 1 - } - }, - "layer_config": { - "is_critical": true, - "tags": { - "AVATAR_LAYER": {}, - "GENERAL_CFG": { - "config_type": 1, - "general_config": { - "web_css_style": { - "borderRadius": "50%" - } - } - } - } - }, - "resource": { - "res_image": { - "image_src": { - "placeholder": 6, - "remote": { - "bfs_style": "widget-layer-avatar", - "url": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg" - }, - "src_type": 1 - } - }, - "res_type": 3 - }, - "visible": true - } - ] - }, - "mid": "645769214" - }, - "decorate_card": { - "big_card_url": "https://i0.hdslb.com/bfs/vip/e2ffa1d1d491fe0464338ed3921327ef5e4b42c5.png", - "card_type": 2, - "card_type_name": "免费", - "card_url": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "fan": {}, - "id": 28, - "image_enhance": "https://i0.hdslb.com/bfs/vip/a9e3d993c7a15e88ce0bf714a142f7d2b44121e2.png", - "item_id": 28, - "item_type": 1, - "jump_url": "https://www.bilibili.com/h5/mall/equity-link/collect-home?item_id=28&isdiy=0&part=card&from=post&f_source=garb&vmid=645769214&native.theme=1&navhide=1", - "name": "2233娘" - }, - "face": "https://i2.hdslb.com/bfs/face/77906db03b1eefac02613de184afad03f7bc58d7.jpg", - "face_nft": false, - "following": true, - "jump_url": "//space.bilibili.com/645769214", - "label": "", - "mid": 645769214, - "more": { - "three_point_items": [ - { - "label": "举报", - "type": "THREE_POINT_REPORT" - } - ] - }, - "name": "Session小胡", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "pendant": { - "expire": 0, - "image": "", - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0, - "name": "", - "pid": 0 - }, - "pub_location_text": "", - "pub_time": "2025年04月06日 20:18", - "pub_ts": 1743941902, - "views_text": "", - "vip": { - "avatar_icon": { - "icon_resource": {} - }, - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": 1665158400000, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - }, - "nickname_color": "", - "role": 0, - "status": 0, - "theme_type": 0, - "tv_due_date": 0, - "tv_vip_pay_type": 0, - "tv_vip_status": 0, - "type": 1, - "vip_pay_type": 0 - } - }, - "module_type": "MODULE_TYPE_AUTHOR" -} -``` -
- - - -### module_more - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_more | object | 三点更多模块 | | - -`module_more` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| three_point_items | object[] | 右上角三点菜单 | 套了个娃 | - -`module_more.three_point_items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| label | string | 显示文本 | | -| modal | object? | 弹出框文本 | | -| params | object? | 参数信息 | | -| type | string | 三点操作类型 | 参见 [右上角三点菜单](../dynamic/dynamic_enum.md#右上角三点菜单) | - -`module_more.three_point_items[].modal` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| cancel | string | 取消文本 | | -| confirm | string | 确认文本 | | -| content | string | 内容文本 | | -| title | string | 标题文本 | | - -`module_more.three_point_items[].params` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| dyn_id_str | string | 动态 id 字符串 | | -| dyn_type | number | 动态类型 | | -| rid_str | string | 动态 id 字符串 | | - - - -
-查看示例: - -```json -{ - "three_point_items": [ - { - "label": "编辑", - "type": "THREE_POINT_EDIT" - }, - { - "label": "可见范围", - "params": { - "dynamic_id": "1067779202512584729", - "status": 0, - "type": 1 - }, - "type": "THREE_POINT_PRIVATE" - }, - { - "label": "删除", - "modal": { - "cancel": "取消", - "confirm": "确认删除", - "content": "动态删除后将无法恢复,请谨慎操作", - "title": "要删除动态吗?" - }, - "params": { - "dyn_id_str": "1067779202512584729", - "dyn_type": 1, - "rid_str": "1067779202512584729" - }, - "type": "THREE_POINT_DELETE" - } - ] -} -``` - -
- -### MODULE_TYPE_STAT - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_stat | object | 统计模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_STAT` | - -`module_stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| coin | object | 硬币数据 | 仅图文接口 | -| comment | object | 评论数据 | | -| favorite | object | 收藏数据 | 仅图文接口 | -| forward | object | 转发数据 | | -| like | object | 点赞数据 | | - -`module_stat` 中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| count | number | 数量 | | -| forbidden | boolean | 是否屏蔽 | | -| hidden | boolean | 是否隐藏 | | -| status | boolean | 当前状态 | 是否已进行该操作 | - -
-查看示例: - -```json -{ - "module_stat": { - "coin": { - "count": 0, - "forbidden": false, - "hidden": true - }, - "comment": { - "count": 42, - "forbidden": false - }, - "favorite": { - "count": 0, - "forbidden": false, - "status": false - }, - "forward": { - "count": 0, - "forbidden": false - }, - "like": { - "count": 56, - "forbidden": false, - "status": true - } - }, - "module_type": "MODULE_TYPE_STAT" -} -``` -
- - - -### MODULE_TYPE_CONTENT - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_content | object | 内容模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_CONTENT` | - -`module_content` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| paragraphs | object[] | 段落 | | - -`module_content.paragraphs[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| align | number | 对齐方式 | 0: 左对齐 (默认)
1: 居中
2: 右对齐 | -| para_type | number | 段落类型 | 1: 文本
2: 图片
3: 分割线
4: 块引用
5: 列表
6: 链接卡片
7: 代码 | -| text | object | 文本 | `para_type=1` 或 `para_type=4` | -| pics | object | 图片 | `para_type=2` | -| line | object | 分割线 | `para_type=3` | -| list | object | 列表 | `para_type=5` | -| link_card | object | 链接卡片 | `para_type=6` | -| code | object | 代码 | `para_type=7` | - -`module_content.paragraphs[].text` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| nodes | object[] | 文本节点 | | - -`module_content.paragraphs[].text.nodes[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| type | string | 文本节点类型 | 纯文本: `TEXT_NODE_TYPE_WORD`
富文本: `TEXT_NODE_TYPE_RICH` | -| word | object | 纯文本 | 仅 `type='TEXT_NODE_TYPE_WORD'` | -| rich | object | 富文本 | 仅 `type='TEXT_NODE_TYPE_RICH'`, 详细参见 [富文本节点](rich_text_nodes.md) | -| formula | object | 公式 | 仅 `type='TEXT_NODE_TYPE_FORMULA' | - -`module_content.paragraphs[].text.nodes[].word` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| font_size | number | 字体大小 | 用于控制文本所用标签名 (如 `h1` `h2` `p`) 及行高 | -| style | object | 补充样式 | | -| words | string | 文本内容 | | - -`module_content.paragraphs[].text.nodes[].formula` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| latex_content | string | 公式内容 | LaTeX | - -`module_content.paragraphs[].line` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| pic | object | 图片 | | - -`module_content.paragraphs[].line.pic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | 高度 | | -| url | string | 图片 URL | | - -`module_content.paragraphs[].list` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| style | number | 样式 | 1: 有序列表
2: 无序列表 | -| items | object[] | 列表项 | | - -`module_content.paragraphs[].list.items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| level | number | 级别 | | -| nodes | object[] | 文本节点 | 同 `module_content.paragraphs[].text.nodes[]` 对象 | -| order | number | 序号 | | - -`module_content.paragraphs[].pic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| pics | object[] | 图片 | 套了个娃 | -| style | number | 样式 | 1: isAlbum | - -`module_content.paragraphs[].pic.pics[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | 高度 | | -| live_url | unknown | 动图 URL? | | -| size | number \| null | 大小 | 单位: ki | -| url | string | 图片 URL | | -| width | number | 宽度 | | - -`module_content.paragraphs[].link_card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| card | object | 卡片内容 | | - -`module_content.paragraphs[].link_card.card` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| oid | string | 关联 id | 可能为 `"undefined"` | -| type | string | 卡片类型 | | -| common | object | 一般信息 | 仅 `type='LINK_CARD_TYPE_COMMON', 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.additional.common` | -| goods | object | 商品信息 | 仅 `type='LINK_CARD_TYPE_GOODS'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.additional.goods` | -| match | object | 比赛信息? | 仅 `type='LINK_CARD_TYPE_MATCH'` | -| vote | object | 投票信息 | 仅 `type='LINK_CARD_TYPE_VOTE'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.additional.vote` | -| ugc | object | 视频信息 | 仅 `type='LINK_CARD_TYPE_UGC'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.additional.ugc` | -| reserve | object | 预约信息 | 仅 `type='LINK_CARD_TYPE_RESERVE'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.additional.reserve` | -| upower_lottery | object | 充电专属抽奖信息 | 仅 `type='LINK_CARD_TYPE_UPOWER_LOTTERY'` | -| opus | object | 图文信息 | 仅 `type='LINK_CARD_TYPE_OPUS'` | -| music | object | 音乐信息 | 仅 `type='LINK_CARD_TYPE_MUSIC'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.major.music` | -| live | object | 直播信息 | 仅 `type='LINK_CARD_TYPE_LIVE'`, 参见 [获取全部动态列表](../dynamic/all.md#获取全部动态列表) 的 `data.items[].modules.module_dynamic.major.live` | -| item_null | object | 提示信息 | 仅 `type='LINK_CARD_TYPE_ITEM_NULL'` | - -`module_content.paragraphs[].link_card.card.match` 对象: - -*注: 该对象结构由 AI 根据前端代码推断得出未经验证仅供参考* - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| id_str | string | 动态 ID | | -| jump_url | string | 跳转 URL | | -| match_info | object | 比赛信息 | 套了个娃 | - -`module_content.paragraphs[].link_card.card.match.match_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| center_bottom | string | 中间区域底部的信息 | | -| center_top | string[] | 中间区域顶部的信息 | 会循环显示出来, 可能用来显示比分或者比赛时间 | -| left_team | object | 右边队伍的信息 | | -| right_team | object | 左边队伍的信息 | | -| status | number | 比赛状态 | 2: 进行中 (文字会高亮)
其他: 正常状态 | -| sub_title | string | 副标题 | | -| title | string | 标题 | | - -`module_content.paragraphs[].link_card.card.match.match_info.left_team` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | string | 队伍名字 | | -| pic | string | 图片 | | - -`module_content.paragraphs[].link_card.card.match.match_info.right_team` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | string | 队伍名字 | | -| pic | string | 图片 | | - - - -`module_content.paragraphs[].link_card.card.upower_lottery` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| button | object | 按钮 | | -| desc | object | 描述 | | -| hint | object | 提示 | | -| jump_url | string | 跳转 URL | | -| rid | number | 关联 id | | -| state | number | 状态 | | -| title | string | 标题 | | -| up_mid | number | UP 主 mid (UID) | | -| upower_action_state | number | 充电操作状态 | | -| upower_level | number | 充电级别 | | - -`module_content.paragraphs[].link_card.card.upower_lottery.button` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| check | object | 选中状态 | | -| status | number | 状态 | | -| type | number | 类型 | 0 1 2 | - -`module_content.paragraphs[].link_card.card.upower_lottery.button.check` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| disable | number | 是否禁用 | 1: 禁用 | -| icon_url | string | 图标 URL | | -| text | string | 文字 | | -| toast | string | 提示 | | - -`module_content.paragraphs[].link_card.card.upower_lottery.desc` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | | -| style | number | 样式 | | -| text | string | 文字 | | - -`module_content.paragraphs[].link_card.card.upower_lottery.hint` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| style | number | 样式 | | -| text | string | 文字 | | - - - -`module_content.paragraphs[].link_card.card.opus` 对象: - -*注: 该对象结构根据前端代码推断得出未经验证仅供参考* - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| author | object | 作者信息 | | -| cover | string | 封面 URL | | -| jump_url | string | 跳转 URL | | -| stat | object | 状态信息 | | -| title | string | 标题 | | - -`module_content.paragraphs[].link_card.card.opus.author` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | string | 作者名 | | - -`module_content.paragraphs[].link_card.card.opus.stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| view | number | 阅读数 | | - -`module_content.paragraphs[].link_card.card.item_null` 对象: - -注: 该对象结构根据前端代码推断得出未经验证仅供参考 - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| text | string | 文字 | | - -`module_content.paragraphs[].code` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| content | string | 内容 | | -| lang | string | 语言 | 如 `language-html` `language-bash` | - -**示例:** - -
-查看示例: - -```json -{ - "module_content": { - "paragraphs": [ - { - "link_card": { - "card": { - "opus": { - "author": { - "name": "作者的名字" - }, - "cover": "https://example.com/path/to/cover.jpg", - "jump_url": "https://www.bilibili.com/read/cvxxxxxxxx", - "stat": { - "view": 12345 - }, - "title": "这里是作品的标题" - } - } - } - } - ] - } -} -``` -
- - - -**示例:** - -
-查看示例: - -```json -{ - "module_content": { - "paragraphs": [ - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "洛天依2025「无限共鸣·流光协奏」全息巡回演唱会·成都站\n部分演出歌曲歌单抢先看~" - } - }, - { - "rich": { - "emoji": { - "gif_url": "https://i0.hdslb.com/bfs/garb/3ed01457a5a2c7c2ec304a1aa0565033f4b7fde4.gif", - "icon_url": "https://i0.hdslb.com/bfs/garb/d6a4aeb51134e1ddf0024a8c1fa48a91700207e2.png", - "size": 2, - "text": "[洛天依·天星问动态_萌]", - "type": 3, - "webp_url": "https://i0.hdslb.com/bfs/garb/1c017fee22994ff261b90c9790a2cfc553ef1845.webp" - }, - "orig_text": "[洛天依·天星问动态_萌]", - "text": "[洛天依·天星问动态_萌]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - "type": "TEXT_NODE_TYPE_RICH" - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n《Dramatic》\n《蝴蝶》\n\n✨成都站城市限定演出歌曲\n《又见月光光》\n\n有没有你期待的歌曲呀?" - } - }, - { - "rich": { - "emoji": { - "gif_url": "https://i0.hdslb.com/bfs/emote/55bbe7e1c69fb5382764cd467a6ef43c97e8fb81.gif", - "icon_url": "https://i0.hdslb.com/bfs/emote/e55207be553ac505ac80892a3f325be383139aa2.png", - "size": 2, - "text": "[心律共鸣动态表情包_啾啾]", - "type": 3, - "webp_url": "https://i0.hdslb.com/bfs/emote/fc0c8ef4ba8271521d934b9b6ee1a7c60ab27e4c.webp" - }, - "orig_text": "[心律共鸣动态表情包_啾啾]", - "text": "[心律共鸣动态表情包_啾啾]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" - }, - "type": "TEXT_NODE_TYPE_RICH" - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "\n天依已经迫不及待在演唱会的舞台上和大家相见啦!" - } - } - ] - } - }, - { - "align": 0, - "para_type": 2, - "pic": { - "pics": [ - { - "height": 5755, - "live_url": null, - "size": 4180.7216796875, - "url": "http://i0.hdslb.com/bfs/new_dyn/bda8c1b1e9c98e09994742a26c1f62c636081646.jpg", - "width": 1080 - } - ], - "style": 1 - } - }, - { - "link_card": { - "card": { - "goods": { - "head_icon": "", - "head_text": "UP主的推荐", - "items": [ - { - "brief": "", - "cover": "https://i0.hdslb.com/bfs/openplatform/202506/aNnr4PFN1749449633226.jpeg", - "id": 102803, - "jump_desc": "去看看", - "jump_url": "https://mall.bilibili.com/neul-next/ticket/detail.html?noTitleBar=1&id=102803&track_id=__BGMT__&contentId=&from=&msource=cps_Mdynamic_36081646_cont-2-1077137468098084900", - "name": "成都·2025洛天依「无限共鸣•流光协奏」全息演唱会-成都站", - "price": "¥480" - } - ], - "jump_url": "" - }, - "oid": "undefined", - "type": "LINK_CARD_TYPE_GOODS" - } - }, - "para_type": 6 - } - ] - }, - "module_type": "MODULE_TYPE_CONTENT" -} -``` - -```json -{ - "module_content": { - "paragraphs": [ - { - "align": 0, - "para_type": 1, - "text": { - "nodes": [ - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "欢迎使用咱开发的 TG 机器人, 自由开源, 目前支持很多功能, 如 天气查询, IP 查询, 甚至可以执行 Shell 命令\nSINO Is Not Object! " - } - }, - { - "type": "TEXT_NODE_TYPE_WORD", - "word": { - "font_size": 17, - "style": {}, - "words": "https://t.me/SessX6cfBot" - } - } - ] - } - } - ] - }, - "module_type": "MODULE_TYPE_CONTENT" -} -``` -
- - - -### MODULE_TYPE_TOPIC - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_topic | object | 话题模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_TOPIC` | - -`module_topic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| id | number | 话题 id | | -| jump_url | string | 跳转 URL | | -| name | string | 话题名称 | | - -**示例:** - -
-查看示例: - -```json -{ - "module_topic": { - "id": 1310025, - "jump_url": "https://m.bilibili.com/topic-detail?topic_id=1310025&topic_name=%E6%B4%9B%E5%A4%A9%E4%BE%9D%E5%96%8A%E4%BD%A0%E6%9D%A5%E7%9C%8B%E5%85%A8%E6%81%AF%E5%B7%A1%E6%BC%94", - "name": "洛天依喊你来看全息巡演" - }, - "module_type": "MODULE_TYPE_TOPIC" -} -``` -
- - - -### MODULE_TYPE_COLLECTION - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_collection | object | 文集模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_COLLECTION` | - -`module_collection` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| count | string | 文章数 | | -| id | number | 文集 id | | -| name | string | 文集名 | | -| title | string | 标题 | `收录于文集` | - -**示例:** - -
-查看示例: - -```json -{ - "module_collection": { - "count": "4篇", - "id": 326286, - "name": "电脑", - "title": "收录于文集" - }, - "module_type": "MODULE_TYPE_COLLECTION" -} -``` -
- - - - -### MODULE_TYPE_EXTEND - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_extend | object | 扩展模块 | | -| module_type | string | 模块类型 | `MODULE_TYPE_EXTEND` | - -`module_extend` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| items | object[] | 项 | 套了个娃 | - -`module_extend.items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| icon | string \| null | 图标 | | -| icon_svg | unknown | SVG 图版 | | -| jump_url | string | 跳转 URL | | -| text | string | 文本 | | - -**示例:** - -
-查看示例: - -```json -{ - "module_extend": { - "items": [ - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=HTML", - "text": "HTML" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=API", - "text": "API" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=BAC", - "text": "BAC" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=JavaScript", - "text": "JavaScript" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=Bilibili", - "text": "Bilibili" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=GitHub", - "text": "GitHub" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=Web", - "text": "Web" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=Chromium", - "text": "Chromium" - }, - { - "icon": null, - "jump_url": "//search.bilibili.com/all?keyword=DevTools", - "text": "DevTools" - } - ] - }, - "module_type": "MODULE_TYPE_EXTEND" -} -``` -
- - - -### MODULE_TYPE_BOTTOM - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| module_bottom | object | 底部模块 | | -| module_type | string | 模块类型 | | - -`module_bottom` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| share_info | object | 分享信息 | | - -`module_bottom.share_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| pic | string | 图片 URL | | -| summary | string | 总结 | | -| title | string | 标题 | | - -**示例:** - -
-查看示例: - -```json -{ - "module_bottom": { - "share_info": { - "pic": "https://static.hdslb.com/mobile/img/app_logo.png", - "summary": "背景", - "title": "通过 DevTools 绕过 SSR 抓包某站专栏正文接口" - } - }, - "module_type": "MODULE_TYPE_BOTTOM" -} -``` -
- - diff --git a/docs/opus/rich_text_nodes.md b/docs/opus/rich_text_nodes.md deleted file mode 100644 index d3e36ed..0000000 --- a/docs/opus/rich_text_nodes.md +++ /dev/null @@ -1,422 +0,0 @@ -# 富文本节点 - -补充: 已知动态与图文接口获取结果的富文本节点与发送时的 `type` 等有关 - -## 富文本节点类型 - -| 类型 | 说明 | type | biz_id | 示例 | -| ---- | ---- | ---- | ------ | ---- | -| RICH_TEXT_NODE_TYPE_NONE | | | | | -| RICH_TEXT_NODE_TYPE_TEXT | 文字节点 | 1 | 空 | [106514206257210983](https://t.bilibili.com/106514206257210983) | -| RICH_TEXT_NODE_TYPE_AT | @用户 | 2 | 用户 mid (UID) | [721296515797090324](https://t.bilibili.com/721296515797090324) | -| RICH_TEXT_NODE_TYPE_LOTTERY | 互动抽奖 | 3 | 抽奖 id | [720907383182721040](https://t.bilibili.com/720907383182721040) | -| RICH_TEXT_NODE_TYPE_VOTE | 投票 | 4 | 投票 id | [721203899129659408](https://t.bilibili.com/721203899129659408) | -| RICH_TEXT_NODE_TYPE_TOPIC | 话题 | | | [721188862459641879](https://t.bilibili.com/721188862459641879) | -| RICH_TEXT_NODE_TYPE_GOODS | 商品链接 | | | [721282703208480790](https://t.bilibili.com/721282703208480790) | -| RICH_TEXT_NODE_TYPE_BV | 视频链接 | | | [716752002311258165](https://t.bilibili.com/716752002311258165) | -| RICH_TEXT_NODE_TYPE_AV | | | | | -| RICH_TEXT_NODE_TYPE_EMOJI | 表情 | 9 | 空 | [1069394178937454662](https://t.bilibili.com/1069394178937454662) | -| RICH_TEXT_NODE_TYPE_CV | 专栏 | | | | -| RICH_TEXT_NODE_TYPE_VIEW_PICTURE | 查看图片 | | | [1069394178937454662](https://t.bilibili.com/1069394178937454662) | -| RICH_TEXT_NODE_TYPE_WEB | 网页链接 | | | [716751027361022055](https://t.bilibili.com/716751027361022055) | -| RICH_TEXT_NODE_TYPE_TAOBAO | | | | | -| RICH_TEXT_NODE_TYPE_MAIL | 邮箱地址 | | | ~~721314095109767220~~ | -| RICH_TEXT_NODE_TYPE_OGV_SEASON | 剧集信息 | | | ~~721282046064853080~~ | -| RICH_TEXT_NODE_TYPE_OGV_EP | | | | | - -## 富文本节点对象 - -### RICH_TEXT_NODE_TYPE_TEXT - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| orig_text | string | 原始文本 | | -| text | string | 显示文本 | 一般与 `orig_text` 内容相同 | -| type | string | `RICH_TEXT_NODE_TYPE_TEXT` | | - -**示例:** - -
-查看示例: - -```json -{ - "orig_text": "【洛天依·共鸣宝石收藏家】设定也分享给大家~!", - "text": "【洛天依·共鸣宝石收藏家】设定也分享给大家~!", - "type": "RICH_TEXT_NODE_TYPE_TEXT" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_AT - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| orig_text | string | 原始文本 | | -| rid | string | 用户 mid (UID) | | -| text | string | 显示文本 | 一般与 `orig_text` 内容相同 | -| type | string | `RICH_TEXT_NODE_TYPE_AT` | | - -**示例:** - -
-查看示例: - -```json -{ - "orig_text": "@wuziqian211 ", - "rid": "425503913", - "text": "@wuziqian211 ", - "type": "RICH_TEXT_NODE_TYPE_AT" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_LOTTERY - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| orig_text | string | 原始文本 | 一般为 `互动抽奖` | -| rid | string | 抽奖 id | | -| text | string | 显示文本 | 一般为 `互动抽奖` | -| type | string | `RICH_TEXT_NODE_TYPE_LOTTERY` | | - -**示例:** - -
-查看示例: - -```json -{ - "orig_text": "互动抽奖", - "rid": "116067", - "text": "互动抽奖", - "type": "RICH_TEXT_NODE_TYPE_LOTTERY" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_VOTE - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| orig_text | string | 原始文本 | | -| rid | string | 抽奖 id | | -| text | string | 显示文本 | 一般与 `orig_text` 一致 | -| type | string | `RICH_TEXT_NODE_TYPE_VOTE` | | - -**示例:** - -
-查看示例: - -```json -{ - "orig_text": "次の文の ★ に入る最もよいものを一つ選びなさい。", - "rid": "3925886", - "text": "次の文の ★ に入る最もよいものを一つ選びなさい。", - "type": "RICH_TEXT_NODE_TYPE_VOTE" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_TOPIC - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | 无协议头 | -| orig_text | string | 原始文本 | | -| text | string | 显示文本 | 一般与 `orig_text` 一致 | -| type | string | `RICH_TEXT_NODE_TYPE_TOPIC ` | | - -**示例:** - -
-查看示例: - -```json -{ - "jump_url": "//search.bilibili.com/all?keyword=ASOUL%E7%9A%84%E5%A5%87%E5%A6%99%E5%AE%87%E5%AE%99", - "orig_text": "#ASOUL的奇妙宇宙#", - "text": "#ASOUL的奇妙宇宙#", - "type": "RICH_TEXT_NODE_TYPE_TOPIC" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_GOODS - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| goods | object | 商品信息 | | -| icon_name | string | 图标名称 | `shop` `taobao` | -| jump_url | string | 跳转 URL | | -| orig_text | string | 原始文本 | | -| rid | string | | | -| text | string | 显示文本 | 一般与 `orig_text` 一致 | -| type | string | `RICH_TEXT_NODE_TYPE_GOODS` | | - -`goods` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | 一般与根对象下的 `jump_url` 相同 | -| type | number | `1` | | - -**示例:** - -
-查看示例: - -```json -{ - "goods": { - "jump_url": "https://s.click.taobao.com/t?e=m%3D2%26s%3DhRVW5Ol4GrZw4vFB6t2Z2ueEDrYVVa64XoO8tOebS%2BdRAdhuF14FMcvdLjw%2BYA8F1aH1Hk3GeOgLhuv3v%2BUO0FVeaszYyErWfp5XqHpg%2Bfwn9kK7XrZu6WxZ8BPtnRZfqGXK58Jc1%2BhtJfOipEYQaSY0lFm97JITUXK%2FCnFktAT05J9EjZ4Cg6Q6sZp7gNLmb4%2BNtrBbTSxr7mxbAs%2BuXGY7X5f4YTwUTi8eJkfcZdQxNgzykgJnxNGRxz%2FytfH1UnsQ1Sg4FG%2Fgk553RHFro7zDM6tzzB%2FwUFU78FEla0%2F6liDBUuxx%2BfRWY0eqeyPKGJZJ34Yh7cK34L0nA6HzjPrdYgTMW7Qubh8ReVU%2F9k2Huec2Q%2B1T%2BJwkZZwMWMdb2FGsw09L73Dq%2F8VFknkEdmd1Il7G%2BufOO%2FbGmELtDp4hhQs2DjqgEA%3D%3D&union_lens=lensId:TAPI@1674460806@212ccf35_0bed_185dda43d7a_a840@01", - "type": 1 - }, - "icon_name": "taobao", - "jump_url": "https://s.click.taobao.com/t?e=m%3D2%26s%3DhRVW5Ol4GrZw4vFB6t2Z2ueEDrYVVa64XoO8tOebS%2BdRAdhuF14FMcvdLjw%2BYA8F1aH1Hk3GeOgLhuv3v%2BUO0FVeaszYyErWfp5XqHpg%2Bfwn9kK7XrZu6WxZ8BPtnRZfqGXK58Jc1%2BhtJfOipEYQaSY0lFm97JITUXK%2FCnFktAT05J9EjZ4Cg6Q6sZp7gNLmb4%2BNtrBbTSxr7mxbAs%2BuXGY7X5f4YTwUTi8eJkfcZdQxNgzykgJnxNGRxz%2FytfH1UnsQ1Sg4FG%2Fgk553RHFro7zDM6tzzB%2FwUFU78FEla0%2F6liDBUuxx%2BfRWY0eqeyPKGJZJ34Yh7cK34L0nA6HzjPrdYgTMW7Qubh8ReVU%2F9k2Huec2Q%2B1T%2BJwkZZwMWMdb2FGsw09L73Dq%2F8VFknkEdmd1Il7G%2BufOO%2FbGmELtDp4hhQs2DjqgEA%3D%3D&union_lens=lensId:TAPI@1674460806@212ccf35_0bed_185dda43d7a_a840@01", - "orig_text": "​啊脑袋周边抱枕", - "rid": "688066082845462528", - "text": "​啊脑袋周边抱枕", - "type": "RICH_TEXT_NODE_TYPE_GOODS" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_BV - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | | -| orig_text | string | 原始文本 | | -| rid | string | 视频 bvid | | -| text | string | 显示文本 | 视频标题 | -| type | string | `RICH_TEXT_NODE_TYPE_BV` | | - -**示例:** - -
-查看示例: - -```json -{ - "jump_url": "https://www.bilibili.com/video/BV1xx411c7mD/", - "orig_text": "https://www.bilibili.com/video/BV1xx411c7mD/", - "rid": "BV1xx411c7mD", - "text": "字幕君交流场所", - "type": "RICH_TEXT_NODE_TYPE_BV" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_EMOJI - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| emoji | object | 表情信息 | | -| orig_text | string | 原始文本 | | -| text | string | 显示文本 | 一般与 `orig_text` 一致 | -| type | string | `RICH_TEXT_NODE_TYPE_EMOJI` | | - -`emoji` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| icon_url | string | 表情图片 URL | | -| size | number | 表情尺寸 | 1: small
2: middle | -| text | string | 表情的文字代码 | 一般与根对象的 `text` 一致 | -| type | number | 表情类型 | `1` `2` `3` | - -**示例:** - -
-查看示例: - -```json -{ - "emoji": { - "icon_url": "https://i0.hdslb.com/bfs/emote/5ce649d5f716566db41dbf68c2e319517516d321.png", - "size": 2, - "text": "[热词系列_干杯]", - "type": 1 - }, - "orig_text": "[热词系列_干杯]", - "text": "[热词系列_干杯]", - "type": "RICH_TEXT_NODE_TYPE_EMOJI" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_CV - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | 无协议名 | -| orig_text | string | 原始文本 | | -| rid | string | 专栏 CV 号 | | -| text | string | 显示文本 | | -| type | string | `RICH_TEXT_NODE_TYPE_CV` | | - -**示例:** - -
-查看示例: - -```json -{ - "jump_url": "//www.bilibili.com/read/cv1/", - "orig_text": "1", - "rid": "1", - "text": "未知的光", - "type": "RICH_TEXT_NODE_TYPE_CV" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_VIEW_PICTURE - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | | | -| orig_text | string | 原始文本 | | -| pics | object[] | 图片信息 | | -| rid | string | 本条动态 id | | -| text | string | 显示文本 | 一般与 `orig_text` 一致 | -| type | string | `RICH_TEXT_NODE_TYPE_VIEW_PICTURE ` | | - -`pics[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | 高度 | | -| size | number | 大小? | 单位为 K | -| src | string | 图片 URL | | -| width | number | 宽度 | | - -**示例:** - -
-查看示例: - -```json -{ - "jump_url": "//www.bilibili.com/read/cv/", - "orig_text": "查看图片", - "pics": [ - { - "height": 4000, - "size": 4218.501, - "src": "http://i0.hdslb.com/bfs/new_dyn/d13a5793f7101824e9c9181ebc4df1a936081646.png", - "width": 6411 - } - ], - "rid": "1069394178937454662", - "text": "查看图片", - "type": "RICH_TEXT_NODE_TYPE_VIEW_PICTURE" -} -``` -
- - - -### RICH_TEXT_NODE_TYPE_WEB - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| jump_url | string | 跳转 URL | | -| orig_text | string | 原始文本 | | -| style | object \| null | 样式信息 | | -| text | string | 显示文本 | | -| type | string | `RICH_TEXT_NODE_TYPE_WEB` | | - -`style` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| font_level | string | 字体等级 | `regular` | -| font_size | number | 字体大小 | `17` | - -**示例:** - -
-查看示例: - -```json -{ - "jump_url": "https://api.bilibili.com/x/web-interface/nav", - "orig_text": "https://api.bilibili.com/x/web-interface/nav", - "style": { - "font_level": "regular", - "font_size": 17 - }, - "text": "网页链接", - "type": "RICH_TEXT_NODE_TYPE_WEB" -} -``` - -```json -{ - "jump_url": "//www.bilibili.com/video/av1", - "orig_text": "//www.bilibili.com/video/av1", - "style": null, - "text": "av1", - "type": "RICH_TEXT_NODE_TYPE_WEB" -} -``` - -
- - - -### RICH_TEXT_NODE_TYPE_OGV_SEASON - -参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv) - -### RICH_TEXT_NODE_TYPE_OGV_EP - -参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv) - -### RICH_TEXT_NODE_TYPE_AV - -参考 [RICH_TEXT_NODE_TYPE_BV](#rich-text-node-type-bv) diff --git a/docs/opus/space.md b/docs/opus/space.md deleted file mode 100644 index 56efa15..0000000 --- a/docs/opus/space.md +++ /dev/null @@ -1,356 +0,0 @@ -## 空间图文 - -## 获取用户空间图文 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/feed/space - -*请求方法: GET* - -注: 该接口**只能**获取图文信息, 无法获取如转发动态一类的内容, 如需获取参见 [获取用户空间动态](docs/dynamic/space.md) - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ------ | ---- | ------ | ---- | -| host_mid | number | 被获取用户的 mid (UID) | 必要 | | -| page | number | 假装自己是分页信息 | 不必要 | 以 `1` 开始 | -| offset | number | 偏移信息 | 不必要 | 上一次返回的 `offset` (同时也是最后一条的 opus id), 默认为空 | -| type | string | 类型 | 不必要 | all: 全部 (默认)
article: 专栏
dynamic: 动态 | -| web_location | string | `333.1387` | 不必要 | | -| w_rid | string | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | number | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| has_more | boolean | 是否还有更多 | | -| items | object[] | 信息本体 | | -| offset | string | 偏移信息 | 下次翻页请求时传入的 `offest` (同时也是最后一条的 opus id) | -| update_num | number | 更新数? | 0 | - -`data.items[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| content | string | 文本内容 | | -| cover | object? | 封面信息 | | -| jump_url | string | 跳转 URL | | -| opus_id | string | opus id | | -| stat | object | 统计信息 | | - -`data.items[].cover` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| height | number | 高度 | | -| url | string | 图片 URL | | -| width | number | 宽度 | | - -`data.items[].stat` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| like | string | 点赞数 | 是个字符串 | -| view | string | 浏览数 | 仅当获取登录状态下获取自己的时才存在, 也是个字符串 | - -**示例:** - -获取 `645769214` 空间的最近几条全部图文 - -```shell -curl 'https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/feed/space' \ ---url-query 'host_mid=645769214' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "has_more": true, - "items": [ - { - "content": "我在 Google I/O 2025 的 puzzle 取得了获胜的优异成绩, 你也来试试吧", - "cover": { - "height": 1640, - "url": "http://i0.hdslb.com/bfs/new_dyn/a48c47c07bf19f07c01b489eb6b42e63645769214.jpg", - "width": 720 - }, - "jump_url": "//www.bilibili.com/opus/1057955152016703512", - "opus_id": "1057955152016703512", - "stat": { - "like": "1" - } - }, - { - "content": "通过 DevTools 绕过 SSR 抓包某站专栏正文接口", - "cover": { - "height": 430, - "url": "http://i0.hdslb.com/bfs/article/9071997152b6fec0ae465fe2a86b580e645769214.jpg", - "width": 768 - }, - "jump_url": "//www.bilibili.com/opus/1056353752004427792", - "opus_id": "1056353752004427792", - "stat": { - "like": "3" - } - }, - { - "content": "今天也是看上 Minecraft 大电影 了, 看的人几乎没有, 虽然看的是中配, 总体上感觉剧情有趣甚至有点小感动, 音乐也感觉不错, 价格也实惠", - "cover": { - "height": 4080, - "url": "http://i0.hdslb.com/bfs/new_dyn/408d4e2b2ad8df6873c303cf26f571db645769214.jpg", - "width": 3060 - }, - "jump_url": "//www.bilibili.com/opus/1052711525276450824", - "opus_id": "1052711525276450824", - "stat": { - "like": "3" - } - }, - { - "content": "糟了没注意, 自己成小丑了", - "cover": { - "height": 1640, - "url": "http://i0.hdslb.com/bfs/new_dyn/6ebb3894cfab53966d6e440e4f5a905d645769214.jpg", - "width": 720 - }, - "jump_url": "//www.bilibili.com/opus/1051313732437671938", - "opus_id": "1051313732437671938", - "stat": { - "like": "3" - } - }, - { - "content": "好消息, 我免费了, 想玩的随时联系\nhttps://t.me/c/2148747379/77", - "cover": { - "height": 720, - "url": "http://i0.hdslb.com/bfs/new_dyn/fbc2b38406099df0bdaea47d08daa6f1645769214.jpg", - "width": 1640 - }, - "jump_url": "//www.bilibili.com/opus/1050579658107518984", - "opus_id": "1050579658107518984", - "stat": { - "like": "2" - } - }, - { - "content": "认真的, 我的 Linux 发行版是 Android", - "cover": { - "height": 1080, - "url": "http://i0.hdslb.com/bfs/new_dyn/3e512d84361323c319f79061d2f078d1645769214.jpg", - "width": 1440 - }, - "jump_url": "//www.bilibili.com/opus/1032607998809210903", - "opus_id": "1032607998809210903", - "stat": { - "like": "8" - } - }, - { - "content": "于学校机房启动 QEMU 珍贵影像", - "cover": { - "height": 1080, - "url": "http://i0.hdslb.com/bfs/new_dyn/2fdc7524449b029f8baf241d94663256645769214.jpg", - "width": 1440 - }, - "jump_url": "//www.bilibili.com/opus/993403941079220225", - "opus_id": "993403941079220225", - "stat": { - "like": "3" - } - }, - { - "content": "BAC 正处于历史以来最困难的时期 - 中秋考古有感", - "cover": { - "height": 188, - "url": "https://i0.hdslb.com/bfs/article/0c9b5e20356e07f89a8bb7769fef8eeb645769214.jpg", - "width": 640 - }, - "jump_url": "//www.bilibili.com/opus/985444108243828741", - "opus_id": "985444108243828741", - "stat": { - "like": "7" - } - }, - { - "content": "发送文件到手机的 N 种正确姿势", - "cover": { - "height": 420, - "url": "http://i0.hdslb.com/bfs/article/56a4024abebf7ed1166a1d247bb5cf64645769214.jpg", - "width": 750 - }, - "jump_url": "//www.bilibili.com/opus/971804623539011587", - "opus_id": "971804623539011587", - "stat": { - "like": "8" - } - }, - { - "content": "我在朝鲜?", - "cover": { - "height": 468, - "url": "http://i0.hdslb.com/bfs/new_dyn/ea12cca6abd75fe3fb5ad1abd1f347d3645769214.png", - "width": 474 - }, - "jump_url": "//www.bilibili.com/opus/971255284349534210", - "opus_id": "971255284349534210", - "stat": { - "like": "5" - } - }, - { - "content": "一周没上 B 站就 99+ 了?", - "cover": { - "height": 284, - "url": "http://i0.hdslb.com/bfs/new_dyn/9e3b889fd2dc75e9bae38a13e55fee26645769214.png", - "width": 165 - }, - "jump_url": "//www.bilibili.com/opus/970197833343827970", - "opus_id": "970197833343827970", - "stat": { - "like": "6" - } - }, - { - "content": "今天因为Linux被骂, 决定放弃支持 Windows. 而且明天要开始军训了, 将停更若干时间, 遂发此动态, 望不知.", - "cover": { - "height": 1080, - "url": "http://i0.hdslb.com/bfs/new_dyn/0f6f939334104ddc347566514fa4bfa7645769214.jpg", - "width": 1440 - }, - "jump_url": "//www.bilibili.com/opus/967717348014293017", - "opus_id": "967717348014293017", - "stat": { - "like": "73" - } - }, - { - "content": "我的萌ICP备案通过了!", - "cover": { - "height": 2712, - "url": "http://i0.hdslb.com/bfs/new_dyn/0a9bb3e82bbefe499b10b7fd02f2a4f4645769214.jpg", - "width": 1220 - }, - "jump_url": "//www.bilibili.com/opus/956241611959828547", - "opus_id": "956241611959828547", - "stat": { - "like": "1" - } - }, - { - "content": "新年第一个AP", - "cover": { - "height": 1220, - "url": "https://album.biliimg.com/bfs/new_dyn/ea5a39d37a4a1f20f32b25bfed466004645769214.jpg", - "width": 2712 - }, - "jump_url": "//www.bilibili.com/opus/896448108088524805", - "opus_id": "896448108088524805", - "stat": { - "like": "1" - } - }, - { - "content": "新年快乐?", - "cover": { - "height": 605, - "url": "https://album.biliimg.com/bfs/new_dyn/dab5d3e2ff03027215e5bfd4933abe45645769214.jpg", - "width": 1220 - }, - "jump_url": "//www.bilibili.com/opus/896342627995090966", - "opus_id": "896342627995090966", - "stat": { - "like": "1" - } - }, - { - "content": "我回苏州了", - "cover": { - "height": 1280, - "url": "https://album.biliimg.com/bfs/new_dyn/65c880f64997fab0c79527649d7fbe1b645769214.png", - "width": 720 - }, - "jump_url": "//www.bilibili.com/opus/831507996405137432", - "opus_id": "831507996405137432", - "stat": { - "like": "1" - } - }, - { - "content": "Phigros RKS 12 纪念", - "cover": { - "height": 720, - "url": "https://album.biliimg.com/bfs/new_dyn/dab03003aee2166987428857acbf4ffb645769214.png", - "width": 1280 - }, - "jump_url": "//www.bilibili.com/opus/830690195959447605", - "opus_id": "830690195959447605", - "stat": { - "like": "0" - } - }, - { - "content": "现在知道B站推荐机制有多烂了吧", - "cover": { - "height": 1280, - "url": "https://album.biliimg.com/bfs/new_dyn/05a5f769bed2705d2c8c3c69f60441df645769214.png", - "width": 720 - }, - "jump_url": "//www.bilibili.com/opus/829284474633060387", - "opus_id": "829284474633060387", - "stat": { - "like": "0" - } - }, - { - "content": "求证: B站创始人们的成分\n证: [图片]", - "cover": { - "height": 1600, - "url": "https://album.biliimg.com/bfs/new_dyn/830a9bbc3d5179a6d33af97e5baac7c8645769214.jpg", - "width": 720 - }, - "jump_url": "//www.bilibili.com/opus/828071498582327315", - "opus_id": "828071498582327315", - "stat": { - "like": "1" - } - }, - { - "content": "如果排除掉可能的误差, 14=12.", - "cover": { - "height": 720, - "url": "https://album.biliimg.com/bfs/new_dyn/79823dd0b617af6fc71126d6e042de3f645769214.png", - "width": 1280 - }, - "jump_url": "//www.bilibili.com/opus/827727935543705620", - "opus_id": "827727935543705620", - "stat": { - "like": "1" - } - } - ], - "offset": "827727935543705620", - "update_num": 0 - }, - "message": "0", - "ttl": 1 -} -``` -
- - diff --git a/docs/search/hot.md b/docs/search/hot.md deleted file mode 100644 index 6c7cdb9..0000000 --- a/docs/search/hot.md +++ /dev/null @@ -1,693 +0,0 @@ -# 默认搜索&热搜 - -## 获取默认搜索内容(web端) - -> https://api.bilibili.com/x/web-interface/wbi/search/default - -> ~~https://api.bilibili.com/x/web-interface/search/default~~ (旧链接) - -*请求方式:GET* - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -默认搜索为搜索框中默认填充内容,用于官方推荐内容,若不输入点击搜索按钮跳转为`url`中的链接 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | --------------- | -------------- | -| seid | str | 搜索seid | | -| id | num | 默认搜索id | | -| type | num | 0 | | -| show_name | str | 显示文字 | | -| name | str | 空 | | -| goto_type | num | 跳转类型 | 1:视频 | -| goto_value | str | 搜索目标id | 视频:稿件avid | -| url | str | 搜索目标跳转url | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/web-interface/search/default' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "seid": "17607543598496143098", - "id": 3296036255232726331, - "type": 0, - "show_name": "歪果仁在中国做模特能赚多少钱?", - "name": "", - "goto_type": 1, - "goto_value": "243920322", - "url": "https://www.bilibili.com/video/BV1Tv411q7gx" - } -} -``` - -
- -## 获取热搜列表 - -> https://api.bilibili.com/x/web-interface/wbi/search/square -> ~~https://api.bilibili.com/x/web-interface/search/square~~ - -*请求方式: GET* - -**URL参数:** - -|参数名|类型|内容|必要性|备注| -|-|-|-|-|-| -|limit|num|结果限制|必要|范围 [1, 50]| -|platform|str|平台标识|不必要|web: web 端| - -**JSON回复:** - -根对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|code|num|返回值|0: 成功
-400: 请求错误| -|message|str|错误信息|默认为空| -|ttl|num|1|| -|data|obj|数据本体|| - -`data`对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|trending|obj|热搜榜单|套了个娃| - -`data`中的`trending`对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|title|str|标题|| -|trackid|str|跟踪 ID?|| -|list|array|热搜列表|| -|top_list|array|空|| - -`trending`中的`list`数组: - -|项|类型|内容|备注| -|-|-|-|-| -|0|obj|热搜 1|| -|1|obj|热搜 2|| -|……|obj|……|| -|n|obj|热搜 (n+1)|| - -`list`数组中的对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|keyword|str|关键词|| -|show_name|str|显示文字|| -|icon|str|图标 URL|| -|uri|str|空|| -|goto|str|空|| - -**示例:** - -获取热搜列表, 数量限制 4 - -```shell -curl -G --url 'https://api.bilibili.com/x/web-interface/search/square' \ ---url-query 'limit=4' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "trending": { - "title": "bilibili热搜", - "trackid": "8079760748892487175", - "list": [ - { - "keyword": "马克龙祝贺中国世界前两名", - "show_name": "马克龙祝贺中国世界前两名", - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "uri": "", - "goto": "" - }, - { - "keyword": "小孩电竞世界杯夺冠", - "show_name": "小孩电竞世界杯夺冠", - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "uri": "", - "goto": "" - }, - { - "keyword": "孙颖莎说我全勤下班了", - "show_name": "孙颖莎说我全勤下班了", - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "uri": "", - "goto": "" - }, - { - "keyword": "7月广东新冠新增一万余例", - "show_name": "7月广东新冠新增一万余例", - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "uri": "", - "goto": "" - } - ], - "top_list": [] - } - } -} -``` - -
- -## 获取热搜列表(web端) - -> https://s.search.bilibili.com/main/hotword - -*请求方式:GET* - -榜单每隔固定时间统计一次,请求后返回搜索前10的关键词 - -带有转义 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------------ | ------------- | -| exp_str | str | ??? | | -| code | num | 返回值 | 0:成功 | -| cost | obj | 详细搜索用时 | 大概是吧? | -| seid | str | 搜索seid | | -| timestamp | num | 榜单统计时间 | 时间戳 | -| message | str | 错误信息 | 默认为success | -| list | array | 热搜列表 | | - -`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------ | -| 0 | obj | 榜单第1名 | | -| n | obj | 榜单第(n+1)名 | 按照名次顺序 | -| 10 | obj | 榜单第10名 | 最后一项 | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ------- | -| status | str | 空 | | -| hot_id | num | 热词id | 大概是吧? | -| keyword | str | 关键词 | | -| resource_id| num | 资源id | | -| goto_type | num | 0 | | -| res | array| null | | -| show_name | str | 完整关键词| | -| pos | num | 名次 | 1-10 | -| word_type | num | 条目属性 | 4: 新
5: 热
6: [雾,咒,小丑(愚人节)] 具体看icon7: 直播中
8: 默认(无标签)
9: 梗
11: 话题
12: 独家 | -| id | num | 名次 | 1-10 | -| goto_value | str | 空 | | -| live_id | array| null | | -| name_type | str | 空 | | -| icon | str | 图标url | | - -**示例:** - -```shell -curl 'https://s.search.bilibili.com/main/hotword' -``` - -
-查看响应示例: - -```json -{ - "exp_str": "8104#8200#8300#8401#8500#5502#6699", - "code": 0, - "cost": { - "reas_request": "0.001895", - "params_check": "0.000127", - "reas_response_format": "0.000098", - "deserialize_response": "0.000080", - "reas_request_format": "0.000076", - "total": "0.002479", - "main_handler": "0.002252" - }, - "seid": "9318821020548476185", - "timestamp": 1596034742, - "message": "success", - "list": [{ - "status": "", - "hot_id": 11003, - "keyword": "流浪地球2刘德华", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "流浪地球2刘德华造型", - "pos": 1, - "word_type": 8, - "id": 1, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" - }, - { - "status": "", - "hot_id": 11012, - "keyword": "QQ飞车手游飞跃黄河", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "QQ飞车手游飞跃黄河", - "pos": 2, - "word_type": 8, - "id": 2, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" - }, - { - "status": "", - "hot_id": 10996, - "keyword": "西工大遭网络攻击最新调查", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "西工大遭网络攻击最新调查", - "pos": 3, - "word_type": 8, - "id": 3, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" - }, - { - "status": "", - "hot_id": 11004, - "keyword": "EDG 起诉", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "EDGJieJie已起诉多家企业", - "pos": 4, - "word_type": 8, - "id": 4, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" - }, - { - "status": "", - "hot_id": 10992, - "keyword": "隐入尘烟", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "隐入尘烟全平台下架", - "pos": 5, - "word_type": 8, - "id": 5, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/e9e7a2d8497d4063421b685e72680bf1cfb99a0d.png" - }, - { - "status": "", - "hot_id": 10987, - "keyword": "原神半年内最良心封神池", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "原神半年内最良心封神池", - "pos": 6, - "word_type": 8, - "id": 6, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "" - }, - { - "status": "", - "hot_id": 10988, - "keyword": "高校回应设国内首个元宇宙院系", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "高校回应设国内首个元宇宙院系", - "pos": 7, - "word_type": 8, - "id": 7, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "" - }, - { - "status": "", - "hot_id": 10994, - "keyword": "美宇宙飞船成功撞击小行星", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "美宇宙飞船成功撞击小行星", - "pos": 8, - "word_type": 8, - "id": 8, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "" - }, - { - "status": "", - "hot_id": 10991, - "keyword": "你薅的羊毛可能已违法", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "你薅的羊毛可能已违法", - "pos": 9, - "word_type": 8, - "id": 9, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "" - }, - { - "status": "", - "hot_id": 11013, - "keyword": "辛普森一家", - "resource_id": 0, - "goto_type": 0, - "res": [ - - ], - "show_name": "辛普森一家", - "pos": 10, - "word_type": 8, - "id": 10, - "goto_value": "", - "live_id": [ - - ], - "name_type": "", - "icon": "http://i0.hdslb.com/bfs/feed-admin/4d579fb61f9655316582db193118bba3a721eec0.png" - } - ] -} -``` - -
- -## 获取热搜列表(手机端) - -> https://app.bilibili.com/x/v2/search/trending/ranking - -*请求方式:GET* - -榜单每隔固定时间统计一次 - -带有转义 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---------------- | ------ | ---- | -| limit | num | 热搜数量 | 非必要 | 留空为20, 最大为100 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------------ | ------------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 返回值 | 默认为1 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------ | -| trackid | num | | 不知用途 | -| list | array | 热搜列表 | | - -`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------ | -| 0 | obj | 榜单第1名 | | -| n | obj | 榜单第(n+1)名 | 按照名次顺序 | -| 20/limit | obj | 榜单第20名 | 最后一项 | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ------- | -| position | num | 名次 | 1-20/limit | -| keyword | str | 关键词 | | -| show_name | str | 完整关键词| | -| word_type | num | 条目属性 | 同 web 端 | -| icon | str | 图标url | | -| hot_id | num | 热词id | 大概是吧? | - -**示例:** - -```shell -curl 'https://app.bilibili.com/x/v2/search/trending/ranking' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "trackid": "2578006123492681222", - "list": [{ - "position": 1, - "keyword": "列车延误乘务员哽咽安抚乘客", - "show_name": "列车延误乘务员哽咽安抚乘客", - "word_type": 5, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "hot_id": 107814, - "is_commercial": "0" - }, { - "position": 2, - "keyword": "黑神话悟空首次线下试玩", - "show_name": "黑神话悟空首次线下试玩", - "word_type": 5, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "hot_id": 107781, - "is_commercial": "0" - }, { - "position": 3, - "keyword": "22万人打出9.9分的动画", - "show_name": "22万人打出9.9分的动画", - "word_type": 6, - "icon": "https://i0.hdslb.com/bfs/legacy/463fa23613670218608e68247a137dd071c0e9c8.png", - "hot_id": 107818, - "is_commercial": "0" - }, { - "position": 4, - "keyword": "冰冻近五万年线虫被复活", - "show_name": "冰冻近五万年线虫被复活", - "word_type": 5, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221213/eaf2dd702d7cc14d8d9511190245d057/lrx9rnKo24.png", - "hot_id": 107774, - "is_commercial": "0" - }, { - "position": 5, - "keyword": "LNG前任和现任的较量", - "show_name": "LNG前任和现任的较量", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107853, - "is_commercial": "0" - }, { - "position": 6, - "keyword": "LOL手游剑姬女警新皮", - "show_name": "LOL手游剑姬女警新皮", - "word_type": 8, - "hot_id": 107841, - "is_commercial": "0" - }, { - "position": 7, - "keyword": "抽奖中金条却因过号被取消", - "show_name": "抽奖中金条却因过号被取消", - "word_type": 8, - "hot_id": 107817, - "is_commercial": "0" - }, { - "position": 8, - "keyword": "雪王到长城开蜜雪冰城", - "show_name": "雪王到长城开蜜雪冰城", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107849, - "is_commercial": "0" - }, { - "position": 9, - "keyword": "堡垒之夜联动终结者", - "show_name": "堡垒之夜联动终结者", - "word_type": 8, - "hot_id": 107846, - "is_commercial": "0" - }, { - "position": 10, - "keyword": "王者新英雄海诺动画", - "show_name": "王者新英雄海诺动画", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107870, - "is_commercial": "0" - }, { - "position": 11, - "keyword": "周星驰功夫10万字拆解", - "show_name": "周星驰功夫10万字拆解", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107848, - "is_commercial": "0" - }, { - "position": 12, - "keyword": "张杰铁粉彭奶奶去世", - "show_name": "张杰铁粉彭奶奶去世", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107840, - "is_commercial": "0" - }, { - "position": 13, - "keyword": "李玟二姐回应礼服争议", - "show_name": "李玟二姐回应礼服争议", - "word_type": 8, - "hot_id": 107833, - "is_commercial": "0" - }, { - "position": 14, - "keyword": "洪水中飘来冰箱市民取走饮料", - "show_name": "洪水中飘来冰箱市民取走饮料", - "word_type": 8, - "hot_id": 107802, - "is_commercial": "0" - }, { - "position": 15, - "keyword": "LOL斗魂觉醒佛耶戈语音", - "show_name": "LOL斗魂觉醒佛耶戈语音", - "word_type": 8, - "hot_id": 107790, - "is_commercial": "0" - }, { - "position": 16, - "keyword": "全面落实带薪休假制度", - "show_name": "全面落实带薪休假制度", - "word_type": 4, - "icon": "http://i0.hdslb.com/bfs/activity-plat/static/20221118/eaf2dd702d7cc14d8d9511190245d057/UF7B1wVKT2.png", - "hot_id": 107839, - "is_commercial": "0" - }, { - "position": 17, - "keyword": "花少北 把病娇治好了", - "show_name": "花少北 把病娇治好了", - "word_type": 8, - "hot_id": 107782, - "is_commercial": "0" - }, { - "position": 18, - "keyword": "2.28米高的村超娃", - "show_name": "2.28米高的村超娃", - "word_type": 8, - "hot_id": 107805, - "is_commercial": "0" - }, { - "position": 19, - "keyword": "当在动漫中不小心撞到", - "show_name": "当在动漫中不小心撞到", - "word_type": 8, - "hot_id": 107832, - "is_commercial": "0" - }, { - "position": 20, - "keyword": "台风卡努路径趋向日本", - "show_name": "台风卡努路径趋向日本", - "word_type": 8, - "hot_id": 107800, - "is_commercial": "0" - }], - "exp_str": "8000#5508#6604#7703", - "hotword_egg_info": "0" - } -} -``` - -
diff --git a/docs/search/search_request.md b/docs/search/search_request.md deleted file mode 100644 index 038c8f7..0000000 --- a/docs/search/search_request.md +++ /dev/null @@ -1,1440 +0,0 @@ -# 搜索 - -> **B站于2022年8月24日更新了搜索api,增加了一大堆Cookies的校验,如果Cookies不足会返回-412搜索被拦截。如果没有cookies的话,请在搜索之前先GET一遍 https://bilibili.com 以获取cookies** - -## 综合搜索(web端) - -> https://api.bilibili.com/x/web-interface/wbi/search/all/v2 - -> ~~https://api.bilibili.com/x/web-interface/search/all/v2~~ (旧链接) - -*方式:GET* - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie 中含有 [`buvid3`](../misc/buvid3_4.md) 字段 - -返回和关键字相关的20条信息 - -综合搜索为默认搜索方式,主要用于优先搜索用户、影视、番剧、游戏、话题等,并加载第一页的20项相关视频,还用于展示各个类型的结果数目,便于进一步分类搜索 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ---------------- | ------ | ---- | -| keyword | str | 需要搜索的关键词 | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-412:请求被拦截 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ----- | ---------------- | ---------------- | -| seid | str | 搜索id | | -| page | num | 页数 | 固定为1 | -| page_size | num | 每页条数 | 固定为20 | -| numResults | num | 总条数 | 最大值为1000 | -| numPages | num | 分页数 | 最大值为50 | -| suggest_keyword | str | 空 | **作用尚不明确** | -| rqt_type | str | search | **作用尚不明确** | -| cost_time | obj | 详细搜索用时 | 大概是吧? | -| exp_list | obj | ??? | **作用尚不明确** | -| egg_hit | num | 0 | **作用尚不明确** | -| pageinfo | obj | 分类页数信息 | | -| top_tlist | obj | 分类结果数目信息 | | -| show_column | num | 0 | **作用尚不明确** | -| show_module_list | array | 返回结果类型列表 | | -| result | array | 结果列表 | | - -`data`中的`cost_time`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ---- | ---- | -| params_check | str | | | -| illegal_handler | str | | | -| as_response_format | str | | | -| as_request | str | | | -| save_cache | str | | | -| deserialize_response | str | | | -| as_request_format | str | | | -| total | str | | | -| main_handler | str | | | - -`data`中的`pageinfo`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------- | ---- | -| pgc | obj | - | | -| live_room | obj | 直播数 | | -| photo | obj | 相簿数 | | -| topic | obj | 话题数 | | -| video | obj | 视频数 | | -| user | obj | - | | -| bili_user | obj | 用户数 | | -| media_ft | obj | 电影数 | | -| article | obj | 专栏数 | | -| media_bangumi | obj | 番剧数 | | -| special | obj | - | | -| operation_card | obj | - | | -| upuser | obj | - | | -| movie | obj | - | | -| live_all | obj | - | | -| tv | obj | - | | -| live | obj | 直播间数 | | -| bangumi | obj | - | | -| activity | obj | 活动数 | | -| live_master | obj | - | | -| live_user | obj | 主播数 | | - -`pageinfo`中的所有对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ---- | -| numResults | num | 总计数量 | | -| total | num | 总计数量 | | -| pages | num | 分页数量 | | - -`data`中的`top_tlist`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------- | ---- | -| pgc | num | - | | -| live_room | num | 直播数 | | -| photo | num | 相簿数 | | -| topic | num | 话题数 | | -| video | num | 视频数 | | -| user | num | - | | -| bili_user | num | 用户数 | | -| media_ft | num | 电影数 | | -| article | num | 专栏数 | | -| media_bangumi | num | 番剧数 | | -| card | num | - | | -| operation_card | num | - | | -| upuser | num | - | | -| movie | num | - | | -| live_all | num | - | | -| tv | num | - | | -| live | num | 直播间数 | | -| special | num | - | | -| bangumi | num | - | | -| activity | num | 活动数 | | -| live_master | num | - | | -| live_user | num | 主播数 | | - -`data`中的`show_module_list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | str | activity | | -| 1 | str | web_game | 游戏 | -| 2 | str | card | | -| 3 | str | media_bangumi | 番剧 | -| 4 | str | media_ft | 电影 | -| 5 | str | bili_user | 用户 | -| 6 | str | user | | -| 7 | str | star | | -| 8 | str | video | 视频 | - -`data`中的`result`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| 0 | obj | - | | -| 1 | obj | 游戏结果 | | -| 2 | obj | - | | -| 3 | obj | 番剧结果 | | -| 4 | obj | 电影结果 | | -| 5 | obj | 用户结果 | | -| 6 | obj | - | | -| 7 | obj | - | | -| 8 | obj | 视频结果 | | - -`result`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------- | ------------------------------ | -| result_type | str | 结果类型 | 与`result`数组对应的项相同 | -| data | array | 搜索结果 | 结果为该项所对应的对象条目格式 | - -`result`数组中的对象中的`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---------------------------------------- | -| 0 | obj | 搜索结果1 | 对象详情见[搜索结果](search_response.md) | -| n | obj | 搜索结果(n+1) | 按照参数指定的顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -使用综合搜索进行搜索关键字`洛天依` - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/search/all/v2' \ ---data-urlencode 'keyword=洛天依' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "seid": "8850295244740510044", - "page": 1, - "pagesize": 20, - "numResults": 1000, - "numPages": 50, - "suggest_keyword": "", - "rqt_type": "search", - "cost_time": { - "params_check": "0.000496", - "get upuser live status": "0.002325", - "illegal_handler": "0.000118", - "as_response_format": "0.007020", - "mysql_request": "0.000054", - "as_request": "0.099139", - "as_request_format": "0.002199", - "deserialize_response": "0.000342", - "total": "0.109753", - "main_handler": "0.109041" - }, - "exp_list": { - "5520": true - }, - "egg_hit": 0, - "pageinfo": { - "pgc": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "live_room": { - "numResults": 1, - "total": 1, - "pages": 1 - }, - "photo": { - "numResults": 1000, - "total": 1000, - "pages": 50 - }, - "bili_user": { - "numResults": 548, - "total": 548, - "pages": 28 - }, - "topic": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "video": { - "numResults": 1000, - "total": 1000, - "pages": 50 - }, - "user": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "article": { - "numResults": 1000, - "total": 1000, - "pages": 50 - }, - "media_ft": { - "numResults": 1, - "total": 1, - "pages": 1 - }, - "media_bangumi": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "special": { - "numResults": 14, - "total": 14, - "pages": 1 - }, - "operation_card": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "upuser": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "movie": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "live_all": { - "numResults": 2, - "total": 2, - "pages": 1 - }, - "tv": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "live": { - "numResults": 773, - "total": 773, - "pages": 39 - }, - "bangumi": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "activity": { - "numResults": 0, - "total": 0, - "pages": 0 - }, - "live_master": { - "numResults": 1, - "total": 1, - "pages": 1 - }, - "live_user": { - "numResults": 772, - "total": 772, - "pages": 39 - } - }, - "top_tlist": { - "pgc": 0, - "live_room": 1, - "photo": 1000, - "bili_user": 548, - "topic": 0, - "video": 1000, - "user": 0, - "article": 1000, - "media_ft": 1, - "media_bangumi": 0, - "card": 0, - "operation_card": 0, - "upuser": 0, - "movie": 0, - "tv": 0, - "live": 2, - "special": 14, - "bangumi": 0, - "activity": 0, - "live_master": 1, - "live_user": 772 - }, - "show_column": 0, - "show_module_list": [ - "bili_user", - "user", - "activity", - "web_game", - "card", - "media_bangumi", - "media_ft", - "star", - "video" - ], - "result": [ - { - "result_type": "bili_user", - "data": [ - { - "type": "bili_user", - "mid": 36081646, - "uname": "洛天依", - "usign": "上海禾念Vsinger旗下歌手,世界第一位VOCALOID中文虚拟歌姬。投食请戳:luotianyi@sh-henian.com", - "fans": 1982688, - "videos": 45, - "upic": "//i2.hdslb.com/bfs/face/cc96d1d6bf76f8198263f9083921997ab3a80d8b.jpg", - "verify_info": "", - "level": 6, - "gender": 2, - "is_upuser": 1, - "is_live": 0, - "room_id": 1546736, - "res": [ - { - "aid": 753839250, - "bvid": "BV1Hk4y1B7Cx", - "title": "【洛天依】2020.7.12洛天依生日会", - "pubdate": 1594559234, - "arcurl": "http://www.bilibili.com/video/av753839250", - "pic": "//i2.hdslb.com/bfs/archive/5347eafb5a65ad9a9ffc39063d686772ea1298c4.jpg", - "play": "269428", - "dm": 30648, - "coin": 33838, - "fav": 24066, - "desc": "从2012年一路走至2020年,8年间刻画下的无数回忆,都在生日会上娓娓道来。\n大家的每一次应援,每一条弹幕都无可替代,都凝结着无可比拟的珍贵回忆。\n希望天依的歌声能鼓起每个人心中的勇气,跨过悲伤、无力,去迎接希望。\n愿我们一同携手成长~相扶相伴。\n天依的首张官方数字专辑也已经上线,等你来听。\n试听: BV1Tp4y1S7cu\n购买:https://y.music.163.com/m/album?id=92206376", - "duration": "58:6", - "is_pay": 0, - "is_union_video": 0 - }, - { - "aid": 968772260, - "bvid": "BV1Tp4y1S7cu", - "title": "【洛天依原创曲】万分之一的光", - "pubdate": 1594557008, - "arcurl": "http://www.bilibili.com/video/av968772260", - "pic": "//i1.hdslb.com/bfs/archive/67c6118e4f94bee89b984525ca665fc88c969cac.jpg", - "play": "333322", - "dm": 9323, - "coin": 39961, - "fav": 29818, - "desc": "8年间我们一起经历了许多,有欢乐也有悲伤,有相遇自然也有别离,但曾相处的日子永远那么辉光闪耀。\n感谢你成为我的光芒,而我也会是你万分之一的光。\n\n音乐:ChiliChill\n贝斯:山口進也\n鼓手:口口口口口\n调校:动点P\n弦乐编配:胡静成 / ChiliChill\n小提琴:庞阔 / 张浩\n中提琴:毕芳\n大提琴:郎莹\n监制:人形兎\n出品:Vsinger", - "duration": "4:12", - "is_pay": 0, - "is_union_video": 1 - }, - { - "aid": 883803983, - "bvid": "BV1kK4y1s7Dd", - "title": "洛天依2020官方专辑《Moments》试听PV", - "pubdate": 1594526467, - "arcurl": "http://www.bilibili.com/video/av883803983", - "pic": "//i1.hdslb.com/bfs/archive/2ff004df9d98e2a78531c6400ee8e823fb30e6f4.jpg", - "play": "205340", - "dm": 7748, - "coin": 18792, - "fav": 14222, - "desc": "8是数字也是象征;\n∞是循环也是无限;\n \n音乐给予了我诞生和成长的力量,让我不断汲取养分,直至冲破险阻向阳生长;\n音乐让我更加幸运,在曾经未知的道路上遇见属于我们彼此的蓝色星光;\n那些一路上的美好,我都想和你们一起收集,瞬间即永恒。\n\n--------Staff--------\n作曲:Chilichill / COP / 人形兎 / 纯白P / 花之祭P / 希望索任合资 / 银临 / JUSF周存\n作词: Chilichill / COP / 人形兎 / 果汁凉菜 / 沈病娇 / 南岐 / 冥凰 / ", - "duration": "3:44", - "is_pay": 0, - "is_union_video": 0 - } - ], - "official_verify": { - "type": 0, - "desc": "洛天依官方账号" - }, - "hit_columns": [ - "uname" - ] - } - ] - }, - { - "result_type": "user", - "data": [] - }, - { - "result_type": "activity", - "data": [] - }, - { - "result_type": "web_game", - "data": [] - }, - { - "result_type": "card", - "data": [] - }, - { - "result_type": "media_bangumi", - "data": [] - }, - { - "result_type": "media_ft", - "data": [] - }, - { - "result_type": "star", - "data": [] - }, - { - "result_type": "video", - "data": [ - { - "type": "video", - "id": 753839250, - "author": "洛天依", - "mid": 36081646, - "typeid": "30", - "typename": "VOCALOID·UTAU", - "arcurl": "http://www.bilibili.com/video/av753839250", - "aid": 753839250, - "bvid": "BV1Hk4y1B7Cx", - "title": "【洛天依】2020.7.12洛天依生日会", - "description": "从2012年一路走至2020年,8年间刻画下的无数回忆,都在生日会上娓娓道来。\n大家的每一次应援,每一条弹幕都无可替代,都凝结着无可比拟的珍贵回忆。\n希望天依的歌声能鼓起每个人心中的勇气,跨过悲伤、无力,去迎接希望。\n愿我们一同携手成长~相扶相伴。\n天依的首张官方数字专辑也已经上线,等你来听。\n试听: BV1Tp4y1S7cu\n购买:https://y.music.163.com/m/album?id=92206376", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/5347eafb5a65ad9a9ffc39063d686772ea1298c4.jpg", - "play": 269428, - "video_review": 30648, - "favorites": 24066, - "tag": "VSINGER,洛天依生日快乐,2020洛天依生日会,洛天依生日会,VOCALOID,洛天依", - "review": 4391, - "pubdate": 1594559234, - "senddate": 1594559234, - "duration": "58:6", - "badgepay": false, - "hit_columns": [ - "title", - "author", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 102616359 - }, - { - "type": "video", - "id": 753460703, - "author": "低调的黑叔", - "mid": 22065421, - "typeid": "25", - "typename": "MMD·3D", - "arcurl": "http://www.bilibili.com/video/av753460703", - "aid": 753460703, - "bvid": "BV1Zk4y1B7bn", - "title": "【4K/布料/水手服】洛天依 - GimmexGimme", - "description": "喜欢本期4K请点个关注并长按视频下方大拇指一键三连拜托啦这对我真的很重要\n\nModel:\niRon0129/夏夜/Tda様/やまもと/Samsink(机动战士牛肉)\n\nMotion:\nシガー\n\nSailor Suit:\n星音\n\nStage:\nG_Wuuuuu\n\nRenderer:\nToolbag 3\n\nMusic:\n【初音ミク×鏡音リン】Gimme×Gimme【八王子P×Giga】", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/d1bd3d4d12b1e115ce82463853ff791a45472f1f.jpg", - "play": 809854, - "video_review": 1189, - "favorites": 47632, - "tag": "自制,3D,TDA,动画,百万剪辑师挑战,洛天依,美腿,舞蹈MMD,4K", - "review": 798, - "pubdate": 1591367468, - "senddate": 1591404973, - "duration": "1:11", - "badgepay": false, - "hit_columns": [ - "title", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 102465557 - }, - { - "type": "video", - "id": 10131337, - "author": "赛亚♂sya", - "mid": 157056, - "typeid": "30", - "typename": "VOCALOID·UTAU", - "arcurl": "http://www.bilibili.com/video/av10131337", - "aid": 10131337, - "bvid": "BV1fx411U7Kg", - "title": "【洛天依原创】自言自语", - "description": "词曲编调绘:Sya;混音:JUSF周存;简介你随便拿个之前的复制粘贴就行", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/e5aab7ddab3e060854e420edae6c5282cbe09324.jpg", - "play": 746480, - "video_review": 4665, - "favorites": 49097, - "tag": "黑洛,诚信代投,自言自语,洛天依,VOCALOID中文曲,原创,高级一图流,自x自x,自A自B系列,赛亚♂sya,JUSF周存", - "review": 7310, - "pubdate": 1493282828, - "senddate": 1542308981, - "duration": "4:14", - "badgepay": false, - "hit_columns": [ - "title", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 102432728 - }, - ………… - ] - } - ] - } -} -``` - -
- -## 分类搜索(web端) - -> https://api.bilibili.com/x/web-interface/wbi/search/type - -> ~~https://api.bilibili.com/x/web-interface/search/type~~ (旧链接) - -*请求方式:GET* - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie 中含有 [`buvid3`](../misc/buvid3_4.md) 字段, Referer 在 `.bilibili.com` 下, User-Agent 不含敏感子串 - -根据关键词进行搜索,返回结果每页20项 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| search_type | str | 搜索目标类型 | 必要 | 视频:video
番剧:media_bangumi
影视:media_ft
直播间及主播:live
直播间:live_room
主播:live_user
专栏:article
话题:topic
用户:bili_user
相簿:photo | -| keyword | str | 需要搜索的关键词 | 必要 | | -| order | str | 结果排序方式 | 非必要 | 搜索类型为视频、专栏及相簿时:
默认为totalrank
综合排序:totalrank
最多点击:click
最新发布:pubdate
最多弹幕:dm
最多收藏:stow
最多评论:scores
最多喜欢:attention(仅用于专栏)
----------------------------
搜索结果为直播间时:
默认为online
人气直播:online
最新开播:live_time
----------------------------
搜索结果为用户时:
默认为0
默认排序:0
粉丝数:fans
用户等级:level | -| order_sort | num | 用户粉丝数及等级排序顺序 | 非必要 | 仅用于搜索用户
默认为0
由高到低:0
由低到高:1 | -| user_type | num | 用户分类筛选 | 非必要 | 仅用于搜索用户
默认为0
全部用户:0
up主:1
普通用户:2
认证用户:3 | -| duration | num | 视频时长筛选 | 非必要 | 仅用于搜索视频
默认为0
全部时长:0
10分钟以下:1
10-30分钟:2
30-60分钟:3
60分钟以上:4 | -| tids | num | 视频分区筛选 | 非必要 | 仅用于搜索视频
默认为0
全部分区:0
筛选分区:目标分区tid | -| category_id | num | 专栏及相簿分区筛选 | 非必要 | 搜索结果为专栏时:
默认为0
全部分区:0
动画:2
游戏:1
影视:28
生活:3
兴趣:29
轻小说:16
科技:17
--------
搜索结果为相簿时:
默认为0
全部分区:0
画友:1
摄影:2 | -| page | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0: 成功
-400: 请求错误
-412: 请求被拦截
-1200: 被降级过滤的请求(搜索目标类型不存在) | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---------------------------------------------------------- | ------------ | ------------------------------ | -| seid | num | 搜索seid | | -| page | num | 当前页码 | | -| pagesize | num | 每页条数 | 固定20 | -| numResults | num | 总条数 | 最大值为1000 | -| numPages | num | 总计分页数 | 最大值为50 | -| suggest_keyword | str | 空 | **作用尚不明确** | -| rqt_type | str | search | **作用尚不明确** | -| cost_time | obj | 详细搜索用时 | 大概 | -| exp_list | obj | ??? | **作用尚不明确** | -| egg_hit | num | 0 | **作用尚不明确** | -| pageinfo | obj | 副分页信息 | 只在搜索类型为直播间及主播有效 | -| result | 搜索类型为直播间及主播时:obj
搜索类型为其他时:array | 结果列表 | | -| show_column | num | 0 | **作用尚不明确** | - -`data`中的`cost_time`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ---- | ---- | -| params_check | str | | | -| illegal_handler | str | | | -| as_response_format | str | | | -| as_request | str | | | -| save_cache | str | | | -| deserialize_response | str | | | -| as_request_format | str | | | -| total | str | | | -| main_handler | str | | | - -`data`中的`pageinfo`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------- | ---- | -| live_room | obj | 直播间信息 | | -| live_user | obj | 主播信息 | | - -`pageinfo`中的`live_room`及`live_user`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ---- | -| numPages | num | 总计页数 | | -| numResults | num | 总计项数 | | -| total | num | 总计项数 | | -| pages | num | 总计页数 | | - -**搜索类型为直播间及主播时:** - -`data`中的`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------- | ---- | -| live_room | array | 直播间信息 | | -| live_user | array | 主播信息 | | - -`result`中的`live_room`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------------- | ---------------------------------------- | -| 0 | obj | 直播间搜索结果1 | 对象详情见[搜索结果](search_response.md) | -| n | obj | 直播间搜索结果(n+1) | 按照参数指定的顺序排列 | -| …… | obj | …… | …… | - -`result`中的`live_user`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---------------------------------------- | -| 0 | obj | 主播搜索结果1 | 对象详情见[搜索结果](search_response.md) | -| n | obj | 主播搜索结果(n+1) | 按照参数指定的顺序排列 | -| …… | obj | …… | …… | - -**搜索类型为其他时:** - -`data`中的`result`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---------------------------------------- | -| 0 | obj | 搜索结果1 | 对象详情见[搜索结果](search_response.md) | -| n | obj | 搜索结果(n+1) | 按照参数指定的顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -按照关键词` 少年 `搜索视频,默认排序,全部时长,全部分区,第1页 - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/search/type' \ ---data-urlencode 'search_type=video' \ ---data-urlencode 'keyword=少年' \ ---data-urlencode 'order=totalrank' \ ---data-urlencode 'duration=0' \ ---data-urlencode 'tids=0' \ ---data-urlencode 'page=1' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "seid": "9339963973663795027", - "page": 1, - "pagesize": 20, - "numResults": 1000, - "numPages": 50, - "suggest_keyword": "", - "rqt_type": "search", - "cost_time": { - "params_check": "0.000300", - "illegal_handler": "0.000077", - "as_response_format": "0.003071", - "as_request": "0.072525", - "save_cache": "0.001115", - "deserialize_response": "0.000310", - "as_request_format": "0.000319", - "total": "0.077996", - "main_handler": "0.076419" - }, - "exp_list": { - "5520": true - }, - "egg_hit": 0, - "result": [ - { - "type": "video", - "id": 243082173, - "author": "大橘爱吃猫", - "mid": 178932626, - "typeid": "193", - "typename": "MV", - "arcurl": "http://www.bilibili.com/video/av243082173", - "aid": 243082173, - "bvid": "BV1De411p77r", - "title": "梦然-《少年》官方版", - "description": "https://www.ixigua.com/i6822128361129640462/?logTag=EBTB5DTpBmxcfK1GYOOea\n梦然老师《少年》MV官方版,原版:西瓜视频搜索“抖音梦然-《少年》” 抖音搜索 “《少年》MV梦然。", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/e25120857a6298d1d4b9e64a805c023b5143c8ff.jpg", - "play": 1037655, - "video_review": 2616, - "favorites": 27341, - "tag": "华语MV,国语MV,梦然,少年,梦想,成长,循环,热歌", - "review": 1265, - "pubdate": 1588407050, - "senddate": 1588407051, - "duration": "4:18", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 105415949 - }, - { - "type": "video", - "id": 97387124, - "author": "小石头和孩子们", - "mid": 324914635, - "typeid": "31", - "typename": "翻唱", - "arcurl": "http://www.bilibili.com/video/av97387124", - "aid": 97387124, - "bvid": "BV1B7411R7a8", - "title": "你还是从前的那个少年吗?来自元气少女超甜的《少年》", - "description": "", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/8502088a888aeb37df7c4bd1b77d57aabae4f4d3.jpg", - "play": 1953494, - "video_review": 5934, - "favorites": 50883, - "tag": "全民音乐UP主,小石头和孩子们,少年,MV,翻唱,音乐推荐", - "review": 2963, - "pubdate": 1584581433, - "senddate": 1584581434, - "duration": "4:1", - "badgepay": false, - "hit_columns": [ - "title", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 101083208 - }, - { - "type": "video", - "id": 200115746, - "author": "似乎一脸懵逼", - "mid": 110939266, - "typeid": "22", - "typename": "鬼畜调教", - "arcurl": "http://www.bilibili.com/video/av200115746", - "aid": 200115746, - "bvid": "BV1Yz411b7A3", - "title": "【马化腾】我还是充钱那个少年,没有一丝丝改变~", - "description": "临时做的小作品\n音源:-提问-", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/078a9b50b4df8d25c2f586668741b30348604173.jpg", - "play": 1069066, - "video_review": 3198, - "favorites": 16321, - "tag": "黄绿合战5th-绿队应援,马化腾,鬼畜调教,腾讯,腾讯游戏,QQ,氪金,少年,我还是从前那个少年", - "review": 1438, - "pubdate": 1585650825, - "senddate": 1586310556, - "duration": "1:26", - "badgepay": false, - "hit_columns": [ - "title", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100482941 - }, - { - "type": "video", - "id": 96440301, - "author": "Da圣音乐", - "mid": 353230307, - "typeid": "130", - "typename": "音乐综合", - "arcurl": "http://www.bilibili.com/video/av96440301", - "aid": 96440301, - "bvid": "BV1LE411G7F4", - "title": "最近突然火的《少年》太好听了,单曲循环了很多遍!", - "description": "Hello,大家好,我是阿光\n本期节目为大家盘点三首最近特别火的中文歌曲\n我保证每一首歌都能撩动你的心弦\n来喽,正如:恰同学少年,风华正茂!\n第一首就是歌手梦然发行于2019年的《少年》\n第二首《后会无期》\n第三首《平凡天使》", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/bcde6fb455902b367138b7a4026419de0a50a42d.jpg", - "play": 2440158, - "video_review": 2314, - "favorites": 7163, - "tag": "乐评盘点,音乐,少年,后会无期,平凡天使,邓紫棋,热门歌曲,感动,高考,疫情", - "review": 1072, - "pubdate": 1584334818, - "senddate": 1584339026, - "duration": "3:2", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100455675 - }, - { - "type": "video", - "id": 370000842, - "author": "猫耳半圆", - "mid": 485450109, - "typeid": "24", - "typename": "MAD·AMV", - "arcurl": "http://www.bilibili.com/video/av370000842", - "aid": 370000842, - "bvid": "BV1AZ4y1j7t6", - "title": "最近火爆全网的《少年》,你喜欢吗?", - "description": "BGM:少年——梦然\n花了好多心思的作品,求个三连呀φ(>ω<*)", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/7437b6f66856b0d87437afd8827939954716cb2f.jpg", - "play": 2257050, - "video_review": 16225, - "favorites": 95864, - "tag": "bilibili新星计划,AMV,MAD,新人向,论BGM的重要性,青春,少年,治愈向,催泪向,多素材", - "review": 3548, - "pubdate": 1585459066, - "senddate": 1585459067, - "duration": "1:37", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100409086 - }, - { - "type": "video", - "id": 837972700, - "author": "Da圣音乐", - "mid": 353230307, - "typeid": "130", - "typename": "音乐综合", - "arcurl": "http://www.bilibili.com/video/av837972700", - "aid": 837972700, - "bvid": "BV1Ug4y1z7oN", - "title": "终于找到日语版《少年》了!开口就是恋爱的味道,岛国也要被洗脑", - "description": "终于找到日语版《少年》了!开口就是恋爱的味道,岛国也要被洗脑", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/413b5417418c0e1107b3f79a284d20040b8bb4e9.jpg", - "play": 1390981, - "video_review": 2344, - "favorites": 11330, - "tag": "乐评盘点,梦然,少年,下山,日语,斋藤飞鸟,告白气球,花泽香菜,火影忍者,海贼王", - "review": 988, - "pubdate": 1588239130, - "senddate": 1588241127, - "duration": "3:12", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100407822 - }, - { - "type": "video", - "id": 285145715, - "author": "潮汕好男人", - "mid": 19071708, - "typeid": "22", - "typename": "鬼畜调教", - "arcurl": "http://www.bilibili.com/video/av285145715", - "aid": 285145715, - "bvid": "BV1ac411h7BC", - "title": "【全明星】少年", - "description": "我还是充钱那个少年,又大又圆的少年\nBGM:少年\n制作:MC传奇(潮汕好男人/永远的MG)\n\n黄绿合战Day.3 对阵作品:BV1qQ4y1K7Gs, 投票传送门:https://www.bilibili.com/blackboard/activity-yellowVSgreen5th.html", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/911faee003fc828c46497cbd58fab0e22c7554f8.jpg", - "play": 3689254, - "video_review": 38262, - "favorites": 115408, - "tag": "鬼畜调教,鬼畜,黄绿合战,少年,黄绿合战5th,全明星", - "review": 4560, - "pubdate": 1586404524, - "senddate": 1592816392, - "duration": "3:1", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100254286 - }, - { - "type": "video", - "id": 51475845, - "author": "吃你的馒头", - "mid": 25770774, - "typeid": "137", - "typename": "明星", - "arcurl": "http://www.bilibili.com/video/av51475845", - "aid": 51475845, - "bvid": "BV1K4411i7mw", - "title": "【日本少年混剪】氧气/心动瞬间/薄荷味的夏天要来了", - "description": "个人喜欢的霓虹国少年们混剪\n\n喜欢的少年会让我想起夏天,淡淡的薄荷味在校服衬衫晕开,笑容在空气里变成汽水,砰的一声打开砸向心脏。\n\nBGM:米津玄师/菅田将晖《灰色与青》\n\n道枝骏佑/新田真剑佑/菅田将晖\n坂口健太郎/古川雄辉/山崎贤人\n山田凉介/片寄凉太/贺来贤人\n龙星凉/佐藤健/吉沢亮\n柏原崇/锦户亮\n\n不按出场顺序(剪得昏天黑地完全记不住)\n\n禁二改转载出站,微博非本人发布皆为盗取视频,请随手举报或@吃你的馒头。\n\n原创作品不易,谢谢喜欢和理解。", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/93ae9d66eaf62161f1f12d0102b6c2d66ebe05a9.jpg", - "play": 1842547, - "video_review": 10738, - "favorites": 136384, - "tag": "明星,龙星凉,新田真剑佑,菅田将晖,古川雄辉,片寄凉太,柏原崇,山崎贤人,道枝骏佑,贺来贤人,山田凉介,锦户亮", - "review": 2385, - "pubdate": 1556992133, - "senddate": 1559716273, - "duration": "3:5", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100239604 - }, - { - "type": "video", - "id": 967814999, - "author": "沙拉酱merry", - "mid": 492472, - "typeid": "31", - "typename": "翻唱", - "arcurl": "http://www.bilibili.com/video/av967814999", - "aid": 967814999, - "bvid": "BV1Hp4y1y7iQ", - "title": "真的不是原唱?!《少年》超A御姐音翻唱", - "description": "少年\n词/曲/原唱/Rap:梦然\n和声编写:海青/梦然\n和声演唱:海青/梦然\n翻唱:沙拉酱merry\n后期:小敏\n这首歌真好听!\nPs:由于这首歌的难度和换气问题,音频和视频是分开录的所以会有口型差异,敬请谅解!!!大家听歌愉快~", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/565e8cdc98dab13dfa547cb13744410964f2fc00.jpg", - "play": 959598, - "video_review": 2447, - "favorites": 15166, - "tag": "被才华封印的颜值,少年,翻唱,女声,沙拉酱merry,御姐音", - "review": 1371, - "pubdate": 1587114006, - "senddate": 1587114030, - "duration": "7:58", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100235329 - }, - { - "type": "video", - "id": 455021866, - "author": "鲨然鲨然", - "mid": 435476320, - "typeid": "126", - "typename": "人力VOCALOID", - "arcurl": "http://www.bilibili.com/video/av455021866", - "aid": 455021866, - "bvid": "BV195411673y", - "title": "【川普】我还是曾经那个少年", - "description": "鬼畜娱乐,请勿当真哦\n希望大家能开怀一笑\n笑了的话别忘了点赞哦", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/7cee31977deb39f297d2d2598e736d26ed337568.jpg", - "play": 3845319, - "video_review": 34660, - "favorites": 74705, - "tag": "黄绿合战5th-黄队应援,鬼畜调教,人力VOCALOID,自制,UTAU,川普,搞笑,少年,恶搞,青春", - "review": 4469, - "pubdate": 1585651085, - "senddate": 1586266006, - "duration": "2:56", - "badgepay": false, - "hit_columns": [ - "title", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100163091 - }, - { - "type": "video", - "id": 753055295, - "author": "大门E", - "mid": 735734, - "typeid": "31", - "typename": "翻唱", - "arcurl": "http://www.bilibili.com/video/av753055295", - "aid": 753055295, - "bvid": "BV1xk4y1k7aw", - "title": "【完整版日语版《少年》本尊来了】竟是国人元老唱见~", - "description": "词:lolo2513&梦然\n曲:梦然\n编曲:张亮\n混音:顾潇予\nPV:大门E\n之前唱了一个片段不料被许多人误以为《少年》原版是日本歌曲改编。因为没有版权一直没full,如今终于得到梦然老师(版权方)的认可及改编授权,终于出来了,再次感谢~!以我的key重新编曲,好哥们儿@lolo2513 老师的完整版日文填词,满满的少年jump既视感,唱的时候满脑子鸣人路飞,作为一个十五年的国人老唱见能被大家认可一首ACG歌曲简直泪流满面,希望大家能够喜欢~", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/363ece7b0fd61d1eb48a4bc3c2e804446b46ca1d.jpg", - "play": 676181, - "video_review": 1209, - "favorites": 31147, - "tag": "bilibili新星计划,少年,日语歌,翻唱", - "review": 1964, - "pubdate": 1588932007, - "senddate": 1588957659, - "duration": "4:1", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100152701 - }, - { - "type": "video", - "id": 328601322, - "author": "萌宠教主", - "mid": 23976014, - "typeid": "24", - "typename": "MAD·AMV", - "arcurl": "http://www.bilibili.com/video/av328601322", - "aid": 328601322, - "bvid": "BV1EA411i7MD", - "title": "用三十部动漫唱一首《少年》——你长大了,你还在追番吗?", - "description": "BGM:少年\n【剪辑,填词】萌宠教主\n【演唱】浅若_natsu", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/eb7c1be356fd3bc6a947bb6398b6f02fc961bec2.jpg", - "play": 381018, - "video_review": 2881, - "favorites": 28530, - "tag": "少年,AMV,多素材,MAD,综漫,混剪,梦然,催泪", - "review": 922, - "pubdate": 1592020805, - "senddate": 1592020836, - "duration": "4:5", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100129139 - }, - { - "type": "video", - "id": 838737756, - "author": "bili_148834382", - "mid": 148834382, - "typeid": "138", - "typename": "搞笑", - "arcurl": "http://www.bilibili.com/video/av838737756", - "aid": 838737756, - "bvid": "BV1Ug4y1v7mU", - "title": "大爷:我还是从前那个少年,没有一丝丝改变!", - "description": "大爷:我还是从前那个少年,没有一丝丝改变!", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/912cb238879558119d2f129438d7c71bb4372f9e.jpg", - "play": 7052, - "video_review": 18, - "favorites": 17, - "tag": "逗比,挑战,卧槽,沙雕,搞笑,大爷,厉害了,不一样呀,秀", - "review": 8, - "pubdate": 1593489906, - "senddate": 1593489906, - "duration": "1:34", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100123108 - }, - { - "type": "video", - "id": 541162396, - "author": "鬼兄奇谈", - "mid": 94641579, - "typeid": "124", - "typename": "社科人文", - "arcurl": "http://www.bilibili.com/video/av541162396", - "aid": 541162396, - "bvid": "BV1Bi4y1G7mo", - "title": "少年黑帮“新龙会”覆灭记!史上最“中二”的黑社会,作案后竟留下错别字?", - "description": "少年黑帮“新龙会”覆灭记!史上最“中二”的黑社会,作案后竟留下错别字?\n视频内容及素材均来源于网络", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/4c0c8d8f720119e3087b6b02025c3d957d642781.jpg", - "play": 150747, - "video_review": 627, - "favorites": 487, - "tag": "犯罪,案件,奇闻,全能打卡挑战,学生,法制,黑社会,中二,违法", - "review": 438, - "pubdate": 1593596709, - "senddate": 1593596710, - "duration": "8:42", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100120066 - }, - { - "type": "video", - "id": 413715309, - "author": "wkkm13", - "mid": 4056950, - "typeid": "76", - "typename": "美食圈", - "arcurl": "http://www.bilibili.com/video/av413715309", - "aid": 413715309, - "bvid": "BV1gV41167WS", - "title": "梦开始的地方,一年前那个不会剪辑的少年阿强。", - "description": "转自强哥第一个视频,那时候他还叫“浮华d假象”。\n梦开始的地方,那个不会剪辑的少年。", - "arcrank": "0", - "pic": "//i0.hdslb.com/bfs/archive/73772867e6a4ebaf66a12c73f1bc0d7a1f0fa085.jpg", - "play": 149332, - "video_review": 332, - "favorites": 86, - "tag": "cram阿强,泪目,美食,吃播,梦想,剪辑", - "review": 437, - "pubdate": 1593604848, - "senddate": 1593604848, - "duration": "5:31", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100102196 - }, - { - "type": "video", - "id": 838507935, - "author": "木子山上起酥酥", - "mid": 185924591, - "typeid": "75", - "typename": "动物圈", - "arcurl": "http://www.bilibili.com/video/av838507935", - "aid": 838507935, - "bvid": "BV1Jg4y1q77h", - "title": "少年人,这是修行。", - "description": "微博", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/8eae881830a5fc2be1434781e086f7191082cec8.jpg", - "play": 120068, - "video_review": 43, - "favorites": 312, - "tag": "逗比,正能量,水豚,动物", - "review": 155, - "pubdate": 1592366769, - "senddate": 1592366769, - "duration": "0:15", - "badgepay": false, - "hit_columns": [ - "title" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100101593 - }, - { - "type": "video", - "id": 47749359, - "author": "Da圣音乐", - "mid": 353230307, - "typeid": "130", - "typename": "音乐综合", - "arcurl": "http://www.bilibili.com/video/av47749359", - "aid": 47749359, - "bvid": "BV12b411W7nF", - "title": "16岁中国少年韩国综艺上怒怼:老子来自中国!现场一片哗然", - "description": "16岁中国少年韩国综艺上怒怼:老子来自中国!现场一片哗然", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/171d9b27a0b9823b71894008117501014dd561ba.jpg", - "play": 5042589, - "video_review": 3949, - "favorites": 26065, - "tag": "说唱,韩国,中国,音乐选集,Rap,瞧不起,DISS,迪亚克,D.ark,综艺节目", - "review": 2793, - "pubdate": 1553926233, - "senddate": 1553926233, - "duration": "2:38", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100101064 - }, - { - "type": "video", - "id": 82363754, - "author": "在下甘柒辣", - "mid": 374835894, - "typeid": "24", - "typename": "MAD·AMV", - "arcurl": "http://www.bilibili.com/video/av82363754", - "aid": 82363754, - "bvid": "BV1qJ411V7QH", - "title": "我已不再是少年,但你们终究活在我心里", - "description": "国动会越来越好的,它由我们一同注目它的成长。\nBGM: start\n可否给个币,给这个肝疼的up点鼓励( ̄y▽ ̄)~*", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/2c7afbc835dbce9f554eb1b21b583ef6bed34cce.jpg", - "play": 1588667, - "video_review": 6782, - "favorites": 37909, - "tag": "国产动画,国漫良心,国漫,国漫王者归来,星游记,镇魂街,灵笼,刺客伍六七,大圣归来,哪吒", - "review": 1190, - "pubdate": 1578320753, - "senddate": 1582999612, - "duration": "3:44", - "badgepay": false, - "hit_columns": [ - "title" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100099970 - }, - { - "type": "video", - "id": 413742409, - "author": "音乐Fans小琼", - "mid": 342943435, - "typeid": "130", - "typename": "音乐综合", - "arcurl": "http://www.bilibili.com/video/av413742409", - "aid": 413742409, - "bvid": "BV1bV41167Un", - "title": "《少年》霸占7周热歌第一,如今终于被新的神曲打破!网友:听吐了!", - "description": "bgm 纸砚zyan《画皮》\n《惊雷》MC六道\n《素颜》许嵩\n《麻雀》李荣浩\n《点歌的人》海来阿木\n《桥边姑娘》海伦 \n《旧梦一场》阿悠悠\n《世界这么大还是遇见你》程响(翻唱)\n《后来遇见他》胡66\n《处处吻》杨千嬅\n《少年》梦然", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/f004565df82a9ac3a8a168b4c12e244861f1d812.jpg", - "play": 12363, - "video_review": 137, - "favorites": 100, - "tag": "乐评盘点,全能打卡挑战,翻唱,许嵩,杨千嬅,李荣浩,喊麦,民谣,热歌,神曲", - "review": 71, - "pubdate": 1593523679, - "senddate": 1593576757, - "duration": "3:37", - "badgepay": false, - "hit_columns": [ - "title", - "description" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100097483 - }, - { - "type": "video", - "id": 625380628, - "author": "涩廊", - "mid": 178366933, - "typeid": "137", - "typename": "明星", - "arcurl": "http://www.bilibili.com/video/av625380628", - "aid": 625380628, - "bvid": "BV1Xt4y127bX", - "title": "这TM才叫日系美少年!", - "description": "道枝骏佑,02年霓虹国弟弟!杰尼斯美少年!没长残的童星代表!身高现在180+了!绰号米七(谐音)\n出演过电视剧《成为母亲》《我的裙子去哪了》\n\n米七是一个超级帅气可爱的男孩子!一直都在努力提升自己,请敬请期待他未来的作品!\n米七米七!未来可期!\n跪求三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连三连", - "arcrank": "0", - "pic": "//i2.hdslb.com/bfs/archive/9d727949eed2d82eb0561d08cbb3e28ac6603532.jpg", - "play": 768179, - "video_review": 1595, - "favorites": 29494, - "tag": "全能打卡挑战,杰尼斯,美少年,道枝骏佑,日系,米七", - "review": 1545, - "pubdate": 1588381204, - "senddate": 1590253109, - "duration": "1:22", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 100094816 - } - ], - "show_column": 0 - } -} -``` - -
diff --git a/docs/search/search_response.md b/docs/search/search_response.md deleted file mode 100644 index fb97747..0000000 --- a/docs/search/search_response.md +++ /dev/null @@ -1,765 +0,0 @@ -# 搜索响应条目 - -本页为搜索结果数组`result`中的对象的说明 - -## 对象类型1-结果为视频 - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | -------------- | ----------------------------------------- | -| type | str | 结果类型 | 固定为video | -| id | num | 结果 | 为稿件avid | -| author | str | UP主昵称 | | -| mid | num | UP主mid | | -| typeid | str | 视频分区tid | | -| typename | str | 视频子分区名 | | -| arcurl | str | 视频重定向url | | -| aid | num | 稿件avid | | -| bvid | str | 稿件bvid | | -| title | str | 视频标题 | 关键字用xml标签``标注 | -| description | str | 视频简介 | | -| arcrank | str | 0 | **作用尚不明确** | -| pic | str | 视频封面url | | -| play | num | 视频播放量 | | -| video_review | num | 视频弹幕量 | | -| favorites | num | 视频收藏数 | | -| tag | str | 视频TAG | 每项TAG用`,`分隔 | -| review | num | 视频评论数 | | -| pubdate | num | 视频投稿时间 | 时间戳 | -| senddate | num | 视频发布时间 | 时间戳 | -| duration | str | 视频时长 | HH:MM | -| badgepay | bool | false | **作用尚不明确** | -| hit_columns | array | 关键字匹配类型 | | -| view_type | str | 空 | **作用尚不明确** | -| is_pay | num | 0 | **作用尚不明确** | -| is_union_video | num | 是否为合作视频 | 0:否
1:是 | -| rec_tags | null | - | **作用尚不明确** | -| new_rec_tags | array | 空 | **作用尚不明确** | -| rank_score | num | 结果排序量化值 | | - -`视频条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------------------------------------------ | -| 0 | str | 匹配类型1 | title:标题匹配
description:简介匹配
author:UP主昵称匹配
tag:视频TAG匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "type": "video", - "id": 78977417, - "author": "MitchieM", - "mid": 5669526, - "typeid": "30", - "typename": "VOCALOID·UTAU", - "arcurl": "http://www.bilibili.com/video/av78977417", - "aid": 78977417, - "bvid": "BV1KJ411C7Un", - "title": "【Mitchie M】初音未来《买买买》【2020拜年祭单品】", - "description": "bilibili拜年祭のために、ダンスミュージックと中国の伝統楽器を組み合わせた曲を作りました。歌詞に「买买买」を使ったユニークな曲が出来上がったので、最高のクオリティーのMVと共に楽しんでもらえたら嬉しいです!\n为哔哩哔哩拜年祭制作了一首电子舞曲与中国传统乐器相结合的音乐,歌词是描写【买买买】的独特作品,和最棒的PV一起享受吧!\n\n▶︎ 舞蹈视频 [BV1pA411i7J6]", - "arcrank": "0", - "pic": "//i1.hdslb.com/bfs/archive/f0403bbd1ff3bad1df79aaa159d9e1cfb52c92de.jpg", - "play": 2915520, - "video_review": 14572, - "favorites": 114102, - "tag": "2020拜年祭单品,买买买,初音未来", - "review": 6124, - "pubdate": 1579877678, - "senddate": 1593099008, - "duration": "4:2", - "badgepay": false, - "hit_columns": [ - "title", - "description", - "tag" - ], - "view_type": "", - "is_pay": 0, - "is_union_video": 0, - "rec_tags": null, - "new_rec_tags": [], - "rank_score": 109020056 -} -``` - -
- -## 对象类型2-结果为番剧&影视 - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ------------------------------- | ---------------------------- | ------------------------------------------------------------ | -| type | str | 结果类型 | media_bangumi:番剧
media_ft:影视 | -| media_id | num | 剧集mdid | | -| season_id | num | 剧集ssid | | -| title | str | 剧集标题 | 关键字用xml标签``标注 | -| org_title | str | 剧集原名 | 关键字用xml标签``标注
可为空 | -| cover | str | 剧集封面url | | -| media_type | num | 剧集类型 | 1:番剧
2:电影
3:纪录片
4:国创
5:电视剧
7:综艺 | -| areas | str | 地区 | | -| styles | str | 风格 | | -| cv | str | 声优 | | -| staff | str | 制作组 | | -| play_state | num | 0 | **作用尚不明确** | -| goto_url | str | 剧集重定向url | | -| desc | str | 简介 | | -| corner | num | 角标有无 | 2:无
13:有 | -| pubtime | num | 开播时间 | 时间戳 | -| media_mode | num | 2 | **作用尚不明确** | -| is_avid | bool | false | **作用尚不明确** | -| fix_pubtime_str | str | 开播时间重写信息 | 优先级高于`pubtime`
可为空 | -| media_score | 有效时:obj
无效时:null | 评分信息 | | -| hit_columns | 有效时:array
无效时:null | 关键字匹配类型 | | -| all_net_name | str | 空 | **作用尚不明确** | -| all_net_icon | str | 空 | **作用尚不明确** | -| all_net_url | str | 空 | **作用尚不明确** | -| angle_title | str | 角标内容 | | -| angle_color | num | 角标颜色 | 0:红色
2:橙色 | -| display_info | array | 剧集标志信息 | | -| hit_epids | str | 关键字匹配分集标题的分集epid | 多个用`,`分隔 | -| pgc_season_id | num | 剧集ssid | | -| season_type | num | 剧集类型 | 1:番剧
2:电影
3:纪录片
4:国创
5:电视剧
7:综艺 | -| season_type_name | str | 剧集类型文字 | | -| selection_style | str | 分集选择按钮风格 | horizontal:横排式
grid:按钮式 | -| ep_size | num | 结果匹配的分集数 | | -| url | str | 剧集重定向url | | -| button_text | str | 观看按钮文字 | | -| is_follow | num | 是否追番 | 需要登录(SESSDATA)
未登录则恒为0
0:否
1:是 | -| is_selection | num | 1 | **作用尚不明确** | -| eps | array | 结果匹配的分集信息 | | -| badges | array | 剧集标志信息 | | - -`番剧条目`中的`media_score`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ---- | -| user_count | num | 总计评分人数 | | -| score | num | 评分 | | - -`番剧条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | -------------------------------------- | -| 0 | str | 匹配类型1 | title:标题匹配
org_title:原标题 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -`番剧条目`中的`display_info`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---- | -| 0 | obj | 剧集标志信息 | | - -`display_info`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ------------ | ------ | -| bg_color_night | str | 夜间背景颜色 | 颜色码 | -| text | str | 剧集标志 | 颜色码 | -| border_color | str | 背景颜色 | 颜色码 | -| bg_style | num | 1 | | -| text_color | str | 文字颜色 | 颜色码 | -| bg_color | str | 背景颜色 | 颜色码 | -| text_color_night | str | 夜间文字颜色 | 颜色码 | -| border_color_night | str | 夜间背景颜色 | 颜色码 | - -`番剧条目`中的`eps`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------ | -| 0 | obj | 分集信息1 | | -| n | obj | 分集信息(n+1) | 项数为同时匹配到的分集数 | -| …… | obj | …… | …… | - -`eps`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | ------------- | ---- | -| id | num | 分集epid | | -| cover | str | 分集封面url | | -| title | str | 完整标题 | | -| url | str | 分集重定向url | | -| release_date | str | 空 | | -| badges | array | 分集标志 | | -| index_title | str | 短标题 | | -| long_title | str | 单集标题 | | - -`番剧条目`中的`badges`数组(同`eps`数组中的对象中的`badges`数组): - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---- | -| 0 | obj | 剧集标志信息 | | - -`badges`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ------------ | ------ | -| text | str | 剧集标志 | 颜色码 | -| text_color | str | 文字颜色 | 颜色码 | -| text_color_night | str | 夜间文字颜色 | 颜色码 | -| bg_color | str | 背景颜色 | 颜色码 | -| bg_color_night | str | 夜间背景颜色 | 颜色码 | -| border_color | str | 空 | | -| border_color_night | str | 空 | | -| bg_style | num | 1 | | - -**示例:** - -
-查看响应示例: - -```json -{ - "media_id": 28224080, - "season_id": 29310, - "type": "media_bangumi", - "title": "异度侵入 ID:INVADED", - "org_title": "イド:インヴェイデッド", - "cover": "//i0.hdslb.com/bfs/bangumi/image/9bf9e66968f85b33ec3769a16c86b36dc984abbc.png", - "media_type": 1, - "areas": "日本", - "styles": "原创/科幻/推理", - "cv": "酒井户:津田健次郎\n百贵:细谷佳正\n富久田:竹内良太\n本堂町:M・A・O\n东乡:布里德卡特·塞拉·惠美\n早濑浦:村治学\n白岳:近藤隆\n羽二重:岩濑周平\n若鹿:榎木淳弥\n国府:加藤涉\n西村:落合福嗣\n松冈:西凛太朗 ", - "staff": "监督:青木英\n脚本:舞城王太郎\n角色原案:小玉有起\n角色设计:碇谷敦\n美术:曽野由大\n作画监督:又贺大介\n副监督:久保田雄大\n色彩设计:千叶絵美\n动画制作:NAZ", - "play_state": 0, - "goto_url": "https://www.bilibili.com/bangumi/play/ss29310/", - "desc": "本片讲述利用能检测出人们杀意的装置以及利用思想粒子做出的“井”,来探知事件真相的科幻故事。", - "corner": 13, - "pubtime": 1578240000, - "media_mode": 2, - "is_avid": false, - "fix_pubtime_str": "", - "media_score": { - "user_count": 275391, - "score": 9.8 - }, - "hit_columns": [ - "title" - ], - "all_net_name": "", - "all_net_icon": "", - "all_net_url": "", - "angle_title": "会员专享", - "angle_color": 0, - "display_info": [ - { - "bg_color_night": "#BB5B76", - "text": "会员专享", - "border_color": "#FB7299", - "bg_style": 1, - "text_color": "#FFFFFF", - "bg_color": "#FB7299", - "text_color_night": "#E5E5E5", - "border_color_night": "#BB5B76" - } - ], - "hit_epids": "", - "pgc_season_id": 29310, - "season_type": 1, - "season_type_name": "番剧", - "selection_style": "grid", - "ep_size": 13, - "url": "https://www.bilibili.com/bangumi/play/ss29310", - "button_text": "立即观看", - "is_follow": 1, - "is_selection": 1, - "eps": [ - { - "id": 307446, - "cover": "http://i0.hdslb.com/bfs/archive/4a1895e5b675209b6948dc321c3cc4991a6262bc.jpg", - "title": "1", - "url": "https://www.bilibili.com/bangumi/play/ep307446", - "release_date": "", - "badges": [], - "index_title": "1", - "long_title": "JIGSAWED 碎片世界" - }, - { - "id": 307447, - "cover": "http://i0.hdslb.com/bfs/archive/c66175203fdb6f54a9fb3accd793da0341b3140a.jpg", - "title": "2", - "url": "https://www.bilibili.com/bangumi/play/ep307447", - "release_date": "", - "badges": [ - { - "text": "会员", - "text_color": "#FFFFFF", - "text_color_night": "#E5E5E5", - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "border_color": "", - "border_color_night": "", - "bg_style": 1 - } - ], - "index_title": "2", - "long_title": "JIGSAWED Ⅱ 碎片世界" - }, - ………… - ], - "badges": [ - { - "text": "会员专享", - "text_color": "#FFFFFF", - "text_color_night": "#E5E5E5", - "bg_color": "#FB7299", - "bg_color_night": "#BB5B76", - "border_color": "", - "border_color_night": "", - "bg_style": 1 - } - ] -}, -``` - -
- -## 对象类型3-结果为直播间 - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------------- | ----------------------------------------- | -| type | str | 结果类型 | 固定为live_room | -| rank_offset | num | 搜索结果排名值 | | -| uid | num | 主播mid | | -| tas | str | 直播间TAG | 多个用`,`分隔 | -| hit_columns | array | 关键字匹配类型 | | -| live_time | str | 开播时间 | YYYY-MM-DD HH:MM:SS | -| cate_name | str | 子分区名 | | -| live_status | num | 1 | | -| uname | str | 主播昵称 | | -| uface | str | 主播头像url | | -| user_cover | str | 直播间封面url | | -| short_id | num | 0 | **作用尚不明确** | -| area | num | 1 | **作用尚不明确** | -| title | str | 直播间标题 | 关键字用xml标签``标注 | -| cover | str | 关键帧截图url | | -| online | num | 在线人数 | | -| rank_index | num | 0 | **作用尚不明确** | -| rank_score | num | 结果排序量化值 | | -| roomid | num | 直播间id | | -| attentions | num | 主播粉丝数 | | - -`直播间条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------------------------------------------ | -| 0 | str | 匹配类型1 | title:直播间标题匹配
cate_name:子分区名匹配
uname:主播昵称匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "rank_offset": 1, - "uid": 682508, - "tags": "minecraft,声控,我的世界,虚拟主播,助眠", - "hit_columns": [ - "title", - "cate_name" - ], - "live_time": "2020-07-03 19:08:46", - "cate_name": "我的世界", - "live_status": 1, - "uname": "超心塞的十六", - "uface": "//i0.hdslb.com/bfs/face/dc33ad47b5e299c08bea9cfe565373213012599c.jpg", - "user_cover": "//i0.hdslb.com/bfs/live/new_room_cover/cbc7b1d0ba181df2c714c2e45ab00937129d3c5c.jpg", - "short_id": 148, - "area": 1, - "type": "live_room", - "title": "MC 1.16 极限服", - "cover": "//i0.hdslb.com/bfs/live/keyframe07031915000000010313u3z18a.jpg", - "online": 34702, - "rank_index": 0, - "rank_score": 34702, - "roomid": 10313, - "attentions": 317864 -} -``` - -
- -## 对象类型4-结果为主播 - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------------- | ------------------------------------------------------ | -| type | str | 结果类型 | 固定为live_user | -| rank_offset | num | 搜索结果排名值 | | -| uid | num | 主播mid | | -| tas | str | 直播间TAG | 多个用`,`分隔 | -| live_time | str | 开播时间 | YYYY-MM-DD HH:MM:SS
如未开播为0000-00-00 00:00:00 | -| hit_columns | array | 关键字匹配类型 | | -| live_status | num | 是否开播 | 0:未开播
1:已开播 | -| area | num | 1 | **作用尚不明确** | -| is_live | bool | 是否开播 | false:未开播
true:已开播 | -| uname | str | 主播昵称 | 关键字用xml标签``标注 | -| uface | str | 主播头像url | | -| rank_index | num | 0 | **作用尚不明确** | -| rank_score | num | 结果排序量化值 | | -| attentions | num | 主播粉丝数 | | - -`主播条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------ | -| 0 | str | 匹配类型1 | uname:主播昵称匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "rank_offset": 1, - "uid": 322892, - "tags": "鬼畜,游戏,瞎扯淡,轰炸挂", - "type": "live_user", - "live_time": "2020-07-03 17:57:30", - "hit_columns": [ - "uname" - ], - "live_status": 1, - "area": 1, - "is_live": true, - "uname": "痒局长", - "uface": "//i2.hdslb.com/bfs/face/bcdf640faa16ebaacea1d4c930baabaec9087a80.jpg", - "rank_index": 0, - "rank_score": 2620790, - "roomid": 5441, - "attentions": 2570790 -} -``` - -
- -## 对象类型5-结果为专栏 - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | -------------- | ---------------- | -| type | str | 结果类型 | 固定为article | -| rank_offset | num | 搜索结果排名值 | | -| pub_time | num | 投稿时间 | 时间戳 | -| like | num | 获赞数 | | -| title | str | 标题 | | -| mid | num | UP主mid | | -| image_urls | array | 封面图组 | | -| template_id | num | ??? | **作用尚不明确** | -| category_id | num | 专栏分区 | | -| view | num | 阅读数 | | -| reply | num | 评论数 | | -| rank_index | num | 0 | **作用尚不明确** | -| desc | str | 文章预览 | | -| rank_score | num | 结果排序量化值 | | -| id | num | 专栏cvid | | -| category_name | str | 子分区名 | | - -`专栏条目`中的`covers`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 封面图片1 | | -| n | str | 封面图片(n+1) | | -| …… | str | …… | | - -**示例:** - -
-查看响应示例: - -```json -{ - "pub_time": 1582123245, - "like": 113, - "title": "【洛水闲谈】《普通DISCO》神话达成后的个人感想", - "rank_offset": 1, - "mid": 295535204, - "image_urls": [ - "//i0.hdslb.com/bfs/article/0c2e7e3cc14f7e097482688600be713a9e9a7029.png" - ], - "template_id": 4, - "category_id": 4, - "view": 843, - "reply": 58, - "rank_index": 0, - "desc": "今天,2020年2月19日,随着bilibili弹幕网上《普通DISCO》的播放量突破1000W,中文VOCALOID的第一首神话级歌曲诞生了。笔者昨夜盯着《普通DISCO》的播放量的增长速率熬到很晚,今早又起了个大早盯着那最后一万的播放量差距,直到播放量突破1000W才放松紧绷的神经,敲打键盘时肢体困倦神疲乏力,故长话短说,若有表达不妥之处还望各位海涵。ilem教主,其拥有近二十首百万传说曲,占bilibili弹幕网中文VOCALOID百万传说曲的三分之一,中文VOCALOID第一首传说曲与第", - "rank_score": 19, - "type": "article", - "id": 4743576, - "category_name": "动漫杂谈" -} -``` - -
- -## 对象类型6-结果为话题 - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ----------------- | ---------------- | -| type | str | 结果类型 | 固定为topic | -| description | str | 简介 | | -| pubdate | nm | 发布时间 | 时间戳 | -| title | str | 标题 | | -| favourite | num | 0 | **作用尚不明确** | -| hit_columns | array | 关键字匹配类型 | | -| review | num | 0 | **作用尚不明确** | -| rank_offset | num | 搜索结果排名值 | | -| cover | str | 话题封面url | | -| update | num | 上传时间 | 时间戳 | -| mid | nm | 0 | **作用尚不明确** | -| click | num | ??? | **作用尚不明确** | -| tp_type | num | ??? | **作用尚不明确** | -| keyword | str | 空 | **作用尚不明确** | -| tp_id | num | 话题tp | | -| rank_index | num | 0 | **作用尚不明确** | -| author | str | UP主昵称 | | -| arcurl | str | 话题页面重定向url | | -| rank_score | num | 结果排序量化值 | | - -`话题条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------ | -| 0 | str | 匹配类型1 | title:话题标题匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "description": "「Bad Apple」的各式各样的PV有很多很多,小编在这里给大家推荐一些比较特别且高人气的特别PV......", - "pubdate": 1479380676, - "title": "「Bad Apple」 的N种特别PV", - "favourite": 0, - "hit_columns": [ - "title" - ], - "review": 0, - "rank_offset": 1, - "cover": "//i0.hdslb.com/bfs/active/3005a94d446db3873d97b483323156b491d850ac.jpg", - "update": 31507200, - "mid": 0, - "click": 211843, - "tp_type": 0, - "keyword": "", - "tp_id": 2215, - "rank_index": 0, - "author": "Nuuu", - "type": "topic", - "arcurl": "http://www.bilibili.com/topic/50.html", - "rank_score": 1851888 -} -``` - -
- -## 对象类型7-结果为用户 - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | -------------- | ----------------------------- | -| type | str | 结果类型 | 固定为bili_user | -| mid | num | 用户mid | | -| uname | str | 用户昵称 | | -| usign | str | 用户签名 | | -| fans | num | 用户粉丝数 | | -| videos | num | 用户稿件数 | | -| upic | str | 用户头像url | | -| verify_info | str | 空 | **作用尚不明确** | -| level | num | 用户等级 | | -| gender | num | 用户性别 | 1:男
2:女
3:私密 | -| is_upuser | num | 是否为UP主 | 0:否
1:是 | -| is_live | num | 是否正在直播 | 0:否
1:是 | -| room_id | num | 用户直播间id | | -| res | array | 用户投稿内容 | | -| official_verify | obj | 用户认证信息 | | -| hit_columns | array | 关键字匹配类型 | | - -`用户条目`中的`res`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ------------------------- | -| 0 | obj | 用户投稿视频1 | | -| n | obj | 用户投稿视频(n+1) | 项数为用户投稿的3个视频数 | -| …… | obj | …… | …… | - -`res`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ----------------- | ---------------- | -| aid | num | 稿件avid | | -| bvid | str | 稿件bvid | | -| title | str | 视频标题 | | -| pubdate | num | 视频投稿时间 | 时间戳 | -| arcurl | str | 视频页面重定向url | | -| pic | str | 视频封面图片url | | -| play | str | 播放量 | | -| dm | str | 弹幕量 | | -| coin | num | 投币数 | | -| fav | num | 收藏数 | | -| desc | str | 视频简介 | | -| duration | str | 视频时长 | MM:SS | -| is_pay | num | 0 | **作用尚不明确** | -| is_union_video | num | 是否为合作视频 | 0:否
1:是 | - -`用户条目`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ----------------------------------------- | -| type | num | 是否认证 | 127:无
0:个人认证
1:组织认证 | -| desc | str | 认证名称 | | - -`用户条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------ | -| 0 | str | 匹配类型1 | uname:用户昵称匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "type": "bili_user", - "mid": 208259, - "uname": "陈睿", - "usign": "喜欢的话就坚持吧", - "fans": 1561640, - "videos": 5, - "upic": "//i1.hdslb.com/bfs/app/8920e6741fc2808cce5b81bc27abdbda291655d3.png", - "verify_info": "", - "level": 6, - "gender": 1, - "is_upuser": 1, - "is_live": 0, - "room_id": 3394945, - "res": [ - { - "aid": 883660923, - "bvid": "BV1SK4y1477d", - "title": "BILIBILI 11周年演讲", - "pubdate": 1593176427, - "arcurl": "http://www.bilibili.com/video/av883660923", - "pic": "//i0.hdslb.com/bfs/archive/b28021df9c67ee2821cb9c1142b9d5e594e3b951.jpg", - "play": "6144081", - "dm": 185789, - "coin": 167803, - "fav": 147421, - "desc": "BILIBILI 11周年演讲,邀请数位嘉宾分享他们与B站的故事。\n陈睿《bilibili 11周年主题演讲》\n机智的党妹 《在B站,表达自我》\n腾格尔《在B站,做全新的腾格尔》\n周深《在B站,做一个歌手》《起风了》\n罗翔《在B站,授业与解惑》\nCarly李旎《在B站,一起成长》\nBILIBILI 11周年特映片《喜相逢》", - "duration": "217:7", - "is_pay": 0, - "is_union_video": 1 - }, - { - "aid": 838688095, - "bvid": "BV1Wg4y1v77h", - "title": "我们的五年——B站五年员工纪念视频 2020版", - "pubdate": 1593004830, - "arcurl": "http://www.bilibili.com/video/av838688095", - "pic": "//i1.hdslb.com/bfs/archive/701da662dfe00fb180eb4a47f1c38403838570a7.jpg", - "play": "957960", - "dm": 10830, - "coin": 44030, - "fav": 23108, - "desc": "每年626前夕,我们都会给本年度满五年工龄的员工颁发金LOGO(金质的小电视胸章),感谢他们对公司的陪伴和付出。“五年守护,感恩有你”", - "duration": "4:51", - "is_pay": 0, - "is_union_video": 0 - }, - { - "aid": 327892668, - "bvid": "BV1fA411b7zo", - "title": "【推荐一本喜欢的书】上帝掷骰子吗?", - "pubdate": 1587632267, - "arcurl": "http://www.bilibili.com/video/av327892668", - "pic": "//i0.hdslb.com/bfs/archive/c3ec25e2e4425303d7f4915692e3a9f0ec027669.jpg", - "play": "2131624", - "dm": 13570, - "coin": 37432, - "fav": 35498, - "desc": "#推荐一本喜欢的书# 423世界读书日,推荐我看过的最好看的量子物理科普书籍《上帝掷骰子吗》#读书等身#\n欢迎参与B站读书日活动:https://www.bilibili.com/blackboard/activity-gNeFPygv0.html 你每投一个读书视频,B站都会为你捐出一本书。", - "duration": "4:46", - "is_pay": 0, - "is_union_video": 0 - } - ], - "official_verify": { - "type": 0, - "desc": "bilibili董事长兼CEO" - }, - "hit_columns": [ - "uname" - ] -} -``` - -
- -## 对象类型8-结果为相簿 - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | -------------- | ---------------- | -| type | str | 结果类型 | 固定为photo | -| count | num | 图片数 | | -| like | num | 收藏数 | | -| title | str | 相簿标题 | | -| hit_columns | array | 关键字匹配类型 | | -| rank_offset | num | 搜索结果排名值 | | -| cover | str | 相簿封面url | | -| mid | num | UP主mid | | -| uname | str | UP主昵称 | | -| rank_index | num | 0 | **作用尚不明确** | -| view | num | 观看次数 | | -| id | num | 相簿id | | -| rank_score | num | 结果排序量化值 | | - -`相簿条目`中的`hit_columns`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------------------------------------------ | -| 0 | str | 匹配类型1 | title:相簿标贴匹配
description:相簿简介匹配
source_tag:相簿TAG匹配 | -| n | str | 匹配类型(n+1) | 项数为同时匹配到的类型数 | -| …… | str | …… | …… | - -**示例:** - -
-查看响应示例: - -```json -{ - "count": 4, - "like": 42, - "title": "EVA Q 绫波丽", - "hit_columns": [ - "title" - ], - "rank_offset": 1, - "cover": "http://i0.hdslb.com/bfs/album/1043ee70b677c9aab406142c6aa00d097be07c1e.jpg", - "mid": 3306217, - "uname": "迷失人形LLS", - "rank_index": 0, - "view": 100924, - "type": "photo", - "id": 8952802, - "rank_score": 25315 -} -``` - -
\ No newline at end of file diff --git a/docs/search/suggest.md b/docs/search/suggest.md deleted file mode 100644 index 276b0d0..0000000 --- a/docs/search/suggest.md +++ /dev/null @@ -1,175 +0,0 @@ -# 搜索建议 - -## 获取搜索建议关键词(web端) - -> https://s.search.bilibili.com/main/suggest - -*请求方式:GET* - -搜索建议最多提供10个候选关键词 - -搜索建议内容可为任意语言(中 英 日等....),中文拼音支持全拼联想词 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------------- | ---- | ---------------------- | ------ | ------------------------ | -| term | str | 需要获得建议的输入内容 | 必要 | | -| main_ver | str | v1 | 非必要 | 默认为 `v1` | -| highlight | str | 任意, 无明显作用 | 非必要 | 默认为空 | -| func | str | 函数? | 非必要 | 默认为 `suggest` | -| suggest_type | str | 建议类型? | 非必要 | 默认为 `accurate` | -| sub_type | str | 子类型? | 非必要 | 默认为 `tag` | -| userid | num | 本用户 mid | 非必要 | 可能用于个性化推荐 | -| bangumi_acc_num | num | 番剧累积数? | 非必要 | 默认为 `1` | -| special_acc_num | num | 特殊累积数? | 非必要 | 默认为 `1` | -| topic_acc_num | num | 话题累积数? | 非必要 | 默认为 `1` | -| upuser_acc_num | num | UP主累积数? | 非必要 | 默认为 `1` | -| tag_num | num | Tag 数? | 非必要 | 默认为 `10` | -| special_num | num | 特殊推荐数? | 非必要 | 默认为 `10` | -| bangumi_num | num | 番剧推荐数? | 非必要 | 默认为 `10` | -| upuser_num | num | UP主推荐数? | 非必要 | 默认为 `3` | -| rnd | num | 一个随机浮点数 | 非必要 | 由 `Math.random()` 生成? | -| buvid | str | 同 Cookie 中 buvid3 | 非必要 | | -| spmid | str | 333.1007 | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ------------ | -| exp_str | str | 实验字符串? | 作用尚不明确 | -| code | num | 返回值 | 0:成功 | -| result | obj | 搜索建议结果 | | -| stoken | str | ??? | 作用尚不明确 | - -`result`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ---- | -| tag | array | 套了个娃 | | - -`result`中的`tag`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------- | ---------------------- | -| 0 | obj | 第1建议关键词 | | -| n | obj | 第(n+1)建议关键词 | 按照相关程度与热度顺序 | -| 9 | obj | 第10建议关键词 | 最后一项 | - -`tag`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | -------------------------------------------------- | -| value | str | 关键词内容 | | -| ref | num | 0 | 作用尚不明确 | -| name | str | 显示内容 | 带有 `` 的 XML 标签 | -| spid | num | 5 | 作用尚不明确 | -| type | str | 空 | | - -**示例:** - -获取关于 `洛天依` 的搜索建议 - -```shell -curl -G 'https://s.search.bilibili.com/main/suggest' \ ---data-urlencode 'term=洛天依' -``` - -
-查看响应示例: - -```json -{ - "exp_str": "106301_106700", - "code": 0, - "result": { - "tag": [ - { - "value": "洛天依", - "term": "洛天依", - "ref": 0, - "name": "洛天依", - "spid": 5, - "type": "" - }, - { - "value": "洛天依十二周年", - "term": "洛天依十二周年", - "ref": 0, - "name": "洛天依十二周年", - "spid": 5, - "type": "" - }, - { - "value": "洛天依演唱会", - "term": "洛天依演唱会", - "ref": 0, - "name": "洛天依演唱会", - "spid": 5, - "type": "" - }, - { - "value": "洛天依手办", - "term": "洛天依手办", - "ref": 0, - "name": "洛天依手办", - "spid": 5, - "type": "" - }, - { - "value": "洛天依歌曲", - "term": "洛天依歌曲", - "ref": 0, - "name": "洛天依歌曲", - "spid": 5, - "type": "" - }, - { - "value": "洛天依童话镇", - "term": "洛天依童话镇", - "ref": 0, - "name": "洛天依童话镇", - "spid": 5, - "type": "" - }, - { - "value": "洛天依东京不太热", - "term": "洛天依东京不太热", - "ref": 0, - "name": "洛天依东京不太热", - "spid": 5, - "type": "" - }, - { - "value": "洛天依霜雪千年", - "term": "洛天依霜雪千年", - "ref": 0, - "name": "洛天依霜雪千年", - "spid": 5, - "type": "" - }, - { - "value": "洛天依生日会", - "term": "洛天依生日会", - "ref": 0, - "name": "洛天依生日会", - "spid": 5, - "type": "" - }, - { - "value": "洛天依生日", - "term": "洛天依生日", - "ref": 0, - "name": "洛天依生日", - "spid": 5, - "type": "" - } - ] - }, - "stoken": "4020133863501304726" -} -``` - -
diff --git a/docs/teenager/teenager_mode.md b/docs/teenager/teenager_mode.md deleted file mode 100644 index e7f5a1b..0000000 --- a/docs/teenager/teenager_mode.md +++ /dev/null @@ -1,84 +0,0 @@ -# 青少年模式 -## 开启/关闭 -> https://app.bilibili.com/x/v2/account/teenagers/update - -*请求方式:POST* - -认证方式:APP(详见[设备各类标识算法](../misc/device_identity.md)) - -**POST参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-----|-------|---------|-----| -| appkey | str | APP密钥 | APP必要 | | -| ts | num | 当前时间戳 | APP必要 | | -| sign | str | APP签名 | APP必要 | | -| access_key | str | APP登录Token | APP必要 | | -| device_model | str | 设备 Model | APP必要 | | -| channel | str | APP下载渠道 | APP必要 | 比如yingyongbao | -| mobi_app | str |APP 包类型 | APP必要 | | -| platform | str |平台类型| APP必要 | android | -| c_locale | str |语言| 非必要 | zh_CN | -| s_locale | str |语言| 非必要 | zh_CN | -| statistics | str | ? | 必要 | 一般固定为{"appId":1,"platform":3,"version":"7.27.0","abtest":""},非key-value入参需要转URL编码 | -| pwd | num |密码| 必要 | 开启时为4位,关闭时必须为空 | -| teenagers_mode | num |开启/关闭模式| 必要 | 0为开启,1为关闭 | -| teenagers_status | num |当前模式状态| 必要 | 0为已经开启,1为目前关闭 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** -关闭本账号的青少年模式(pwd=&teenagers_mode=1&teenagers_status=0) -```shell -curl --location 'https://app.bilibili.com/x/v2/account/teenagers/update' \ ---header 'Device-Id: 你的设备id' \ ---header 'Fp_local: 你的本地设备指纹' \ ---header 'Fp_remote: 你的远程设备指纹' \ ---header 'Session_id: 会话id' \ ---header 'App-Key: android' \ ---header 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \ ---data-urlencode 'access_key=你的access_key' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'build=6270200' \ ---data-urlencode 'c_locale=zh_CN' \ ---data-urlencode 'channel=yingyongbao' \ ---data-urlencode 'device_model=samsung%257CSM-G955N' \ ---data-urlencode 'mobi_app=android' \ ---data-urlencode 'platform=android' \ ---data-urlencode 's_locale=zh_CN' \ ---data-urlencode 'statistics=%257B%2522appId%2522%253A1%252C%2522platform%2522%253A3%252C%2522version%2522%253A%25226.27.0%2522%252C%2522abtest%2522%253A%2522%2522%257D' \ ---data-urlencode 'pwd=' \ ---data-urlencode 'teenagers_mode=1' \ ---data-urlencode 'teenagers_status=0' \ ---data-urlencode 'ts=1699301298' \ ---data-urlencode 'sign=0666c38cb79691c4a0d9570a0669ec96' \ -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` -pwd有数值时 -```json -{ - "code": -400, - "message": "关闭时密码必须为空", - "ttl": 1 -} -``` - -
diff --git a/docs/user/batch.md b/docs/user/batch.md deleted file mode 100644 index 98953e9..0000000 --- a/docs/user/batch.md +++ /dev/null @@ -1,85 +0,0 @@ -# 批量查询 - -## 用户名查 mid - -### 动态 - -> https://api.bilibili.com/x/polymer/web-dynamic/v1/name-to-uid - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - - - -**URL 参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ------ | ------ | ------ | ---- | -| names | string | 用户名 | 必要 | 多个用户名以 `,` 分隔 | - -**JSON 回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| code | number | 返回值 | 0: 成功
-101: 账号未登录
-400: 请求错误 | -| data | object | 数据本体 | | -| message | string | 错误信息 | 成功时为 `0` | -| ttl | number | `1` | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| uid_list | object[] | UID 列表 | 套了个娃 | - -`data.uid_list[]` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | string | 用户名 | | -| uid | string | mid (UID) | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/polymer/web-dynamic/v1/name-to-uid' \ ---url-query 'names=社会易姐qwq,session小胡,陈睿,洛天依' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "uid_list": [ - { - "name": "社会易姐QwQ", - "uid": "293793435" - }, - { - "name": "陈睿", - "uid": "208259" - }, - { - "name": "Session小胡", - "uid": "645769214" - }, - { - "name": "洛天依", - "uid": "36081646" - } - ] - }, - "message": "0", - "ttl": 1 -} -``` -
- - diff --git a/docs/user/check_nickname.md b/docs/user/check_nickname.md deleted file mode 100644 index b006dbc..0000000 --- a/docs/user/check_nickname.md +++ /dev/null @@ -1,145 +0,0 @@ -# 检查昵称是否可注册 - -## ~~检查昵称(已失效)~~ - -
-查看折叠内容 - -> https://passport.bilibili.com/web/generic/check/nickname - -*请求方式:GET* - -也可用于判断指定昵称的用户是否存在 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ----------- | ------ | ---- | -| nickName | str | 目标昵称 | 必要 | 最长为16字符 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 状态码 | -400:请求错误
-500:服务器端异常
**详细说明见下一表格** | -| message | str | 错误详情 | 若昵称可用,则不返回message | - -`code`状态码: - -| 值 | 含义 | -| ----- | --------------------------------- | -| 0 | 昵称未被注册 | -| 2001 | 该昵称已被他人使用 | -| 40002 | 昵称包含敏感信息 | -| 40004 | 昵称不可包含除\-和_以外的特殊字符 | -| 40005 | 昵称过长(超过16字符) | -| 40006 | 昵称过短(少于2字符) | -| 40014 | 昵称已存在 | - -**示例:** - -查询昵称 `xijinping` 是否被使用: - -```shell -curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ ---data-urlencode 'nickName=xijinping' -``` - -
-查看响应示例: - -```json -{ - "code":40002, - "message":"昵称包含敏感信息" -} -``` - -
- -查询昵称 `//` 是否被使用: - -```shell -curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ ---data-urlencode 'nickName=//' -``` - -
-查看响应示例: - -```json -{ - "code": 40004, - "message": "昵称不可包含除-和_以外的特殊字符" -} -``` - -
- -查询昵称 `test0000000000000 ` 是否被使用: - -```shell -curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ ---data-urlencode 'nickName=test0000000000000 ' -``` - -
-查看响应示例: - -```json -{ - "code": 40005, - "message": "昵称过长" -} -``` - -
- -查询昵称 `0` 是否被使用: - -```shell -curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ ---data-urlencode 'nickName=0' -``` - -
-查看响应示例: - -```json -{ - "code": 40006, - "message": "昵称过短" -} -``` - -
- -查询昵称 `test` 是否被使用: - -```shell -curl -G 'https://passport.bilibili.com/web/generic/check/nickname' \ ---data-urlencode 'nickName=test' -``` - -
-查看响应示例: - -```json -{ - "code":40014, - "message":"昵称已存在" -} -``` - -
- -
- -目前该接口无论参数,稳定返回: -```json -{ - "code": 0 -} -``` diff --git a/docs/user/contract.md b/docs/user/contract.md deleted file mode 100644 index ec4d110..0000000 --- a/docs/user/contract.md +++ /dev/null @@ -1,131 +0,0 @@ -# 加入老粉计划 - -> https://api.bilibili.com/x/v1/contract/add_contract - -*请求方式:POST* - -是否需要登录:`是` - -认证方式:Cookie(SESSDATA) - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|--------|-----|-----| -| aid | str | `空串` | | | -| up_mid | str | UP主UID | 必要 | | -| source | str | `4` | | | -| scene | str | `105` | | | -| platform | str | `web` | | | -| mobi_app | str | `pc` | | | -| csrf | str | 用户csrf | 必要 | | - -**json回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|------|-------------------------| -| code | num | 响应码 | 0:成功
158001:`不满足条件` | -| message | str | 0 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|------|-----------------------------------|-----| -| allow_message | bool | `true` | | -| input_text | str | `UP主加油!看好你噢~` | | -| input_title | str | `感谢你对UP主的特别支持,“老粉”可期!私信留言鼓励下TA吧~ ` | | - -**示例:** - -```shell -curl --location --request POST 'https://api.bilibili.com/x/v1/contract/add_contract' \ ---header 'Cookie: SESSDATA=xxx' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'up_mid=2' \ ---data-urlencode 'csrf=xxx' -``` - -
-点击查看 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "allow_message": true, - "input_text": "UP主加油!看好你噢~", - "input_title": "感谢你对UP主的特别支持,“老粉”可期!私信留言鼓励下TA吧~" - } -} -``` - -
- -# 老粉计划发送留言 - -> https://api.bilibili.com/x/v1/contract/add_message - -*请求方式:POST* - -认证方式:Cookie (SESSDATA) - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------|-----|--------|-----|-----| -| aid | str | `空串` | | | -| up_mid | str | UP主UID | 必要 | | -| source | str | `4` | | | -| scene | str | `105` | | | -| content | str | 留言内容 | 必要 | | -| csrf | str | 用户csrf | 必要 | | - -**json回复:** - -根对象: - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------------| -| code | num | 响应码 | 0:成功
158005:您跟up主还不是契约关系 | -| message | str | 0 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------------|-----|------------------|-----| -| success_toast | str | `提交成功,UP主已收到留言~` | | - -**示例:** - -```shell -curl --location --request POST 'https://api.bilibili.com/x/v1/contract/add_message' \ ---header 'Cookie: SESSDATA=xxx' \ ---header 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'up_mid=2' \ ---data-urlencode 'content=..' \ ---data-urlencode 'csrf=xxx' -``` - -
-点击查看 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "success_toast": "提交成功,UP主已收到留言~" - } -} -``` - -
diff --git a/docs/user/info.md b/docs/user/info.md deleted file mode 100644 index ead40b3..0000000 --- a/docs/user/info.md +++ /dev/null @@ -1,1777 +0,0 @@ -# 用户基本信息 - - - -## 用户空间详细信息 - -> https://api.bilibili.com/x/space/wbi/acc/info - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md), Cookie (包含 SESSDATA 与空值的总项数大于等于 3) - -~~该接口的旧版 API :~~(已废弃,不建议使用) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ------------------------------------ | -| mid | num | 目标用户mid | 必要 | | -| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-403:访问权限不足
-404:用户不存在(如注销账号) | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| mid | num | mid | | -| name | str | 昵称 | | -| sex | str | 性别 | 男/女/保密 | -| face | str | 头像链接 | | -| face_nft | num | 是否为 NFT 头像 | 0:不是 NFT 头像
1:是 NFT 头像 | -| face_nft_type | num | NFT 头像类型? | | -| sign | str | 签名 | | -| rank | num | 用户权限等级 | 目前应该无任何作用
5000:0级未答题
10000:普通会员
20000:字幕君
25000:VIP
30000:真·职人
32000:管理员 | -| level | num | 当前等级 | 0-6 级 | -| jointime | num | 注册时间 | 此接口返回恒为`0` | -| moral | num | 节操值 | 此接口返回恒为`0` | -| silence | num | 封禁状态 | 0:正常
1:被封 | -| coins | num | 硬币数 | 需要登录(Cookie)
只能查看自己的
默认为`0` | -| fans_badge | bool | 是否具有粉丝勋章 | false:无
true:有 | -| fans_medal | obj | 粉丝勋章信息 | | -| official | obj | 认证信息 | | -| vip | obj | 会员信息 | | -| pendant | obj | 头像框信息 | | -| nameplate | obj | 勋章信息 | | -| user_honour_info | obj | (?) | | -| is_followed | bool | 是否关注此用户 | true:已关注
false:未关注
需要登录(Cookie)
未登录恒为`false` | -| top_photo | str | 主页头图链接 | | -| theme | obj | (?) | | -| sys_notice | obj | 系统通知 | 无内容则为空对象
主要用于展示如用户争议、纪念账号等等的小黄条 | -| live_room | obj | 直播间信息 | | -| birthday | str | 生日 | MM-DD
如设置隐私为空 | -| school | obj | 学校 | | -| profession | obj | 专业资质信息 | | -| tags | 有效时:array
无效时:null | 个人标签 | | -| series | obj | (?) | | -| is_senior_member | num | 是否为硬核会员 | 0:否
1:是 | -| mcn_info | null | (?) | | -| gaia_res_type | num | (?) | | -| gaia_data | null | (?) | | -| is_risk | bool | (?) | | -| elec | obj | 充电信息 | | -| contract | obj | 是否显示老粉计划 | | -| certificate_show | bool | (?) | | -| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | - -`rank`示例 - -| UID | rank | -| --------- | ----- | -| 2 | 20000 | -| 16765 | 20000 | -| 15773384 | 20000 | -| 124416 | 20000 | -| 429736362 | 25000 | -| 424261768 | 25000 | -| 41273726 | 25000 | -| 15080107 | 25000 | -| 9847497 | 25000 | -| 4856007 | 25000 | -| 928123 | 25000 | -| 132704 | 25000 | -| 70093 | 25000 | -| 47291 | 25000 | -| 27380 | 25000 | -| 22445 | 25000 | -| 3351 | 25000 | -| 1101 | 25000 | -| 93066 | 30000 | -| 2443068 | 30000 | -| 46368 | 30000 | -| 11167 | 30000 | - -`profession`示例 - -| UID | -| ------- | -| 654391 | -| 1440295 | -| 1785155 | -| 2990100 | -| 3875803 | - -`data`中的`official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---------------------------------------- | -| role | num | 认证类型 | 见 [用户认证类型一览](official_role.md) | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 是否认证 | -1:无
0:个人认证
1:机构认证 | - -`data`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------------- | ---- | ------------------ | -------------------------------------------------------------------- | -| type | num | 会员类型 | 0:无
1:月大会员
2:年度及以上大会员 | -| status | num | 会员状态 | 0:无
1:有 | -| due_date | num | 会员过期时间 | 毫秒时间戳 | -| vip_pay_type | num | 支付类型 | 0:未开启自动续费
1:已开启自动续费 | -| theme_type | num | 0 | 作用尚不明确 | -| label | obj | 会员标签 | | -| avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | -| nickname_color | str | 会员昵称颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 | -| role | num | 大角色类型 | 1:月度大会员
3:年度大会员
7:十年大会员
15:百年大会员 | -| avatar_subscript_url | str | 大会员角标地址 | | -| tv_vip_status | num | 电视大会员状态 | 0:未开通 | -| tv_vip_pay_type | num | 电视大会员支付类型 | | -| tv_due_date | num | 电视大会员过期时间 | 秒级时间戳 | -| avatar_icon | obj | 大会员角标信息 | | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------- | ---- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -| path | str | 空 | 作用尚不明确 | -| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | -| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员
fools_day_hundred_annual_vip:最强绿鲤鱼 | -| text_color | str | 会员标签 | | -| bg_style | num | 1 | | -| bg_color | str | 会员标签背景颜色 | 颜色码,一般为`#FB7299`,曾用于愚人节改变大会员配色 | -| border_color | str | 会员标签边框颜色 | 未使用 | -| use_img_label | bool | `true` | | -| img_label_uri_hans | str | `空串` | | -| img_label_uri_hant | str | `空串` | | -| img_label_uri_hans_static | str | 大会员牌子图片 | 简体版 | -| img_label_uri_hant_static | str | 大会员牌子图片 | 繁体版 | - -`vip`中的`avatar_icon`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------ | ------------ | -| icon_type | num | (?) | 作用尚不明确 | -| icon_resource | obj | (?) | 作用尚不明确 | - -`data`中的`pendant`对象: - -**普通头像框的`image`与`image_enhance`内容相同** - -**动态头像框的`image`为png静态图片,`image_enhance`为webp动态图片,`image_enhance_frame`为png逐帧序列** - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | --------------------- | ----------------- | -| pid | num | 头像框id | | -| name | str | 头像框名称 | | -| image | str | 头像框图片url | | -| expire | num | 过期时间 | 此接口返回恒为`0` | -| image_enhance | str | 头像框图片url | | -| image_enhance_frame | str | 头像框图片逐帧序列url | | -| n_pid | num | 新版头像框id | | - -`data`中的`nameplate`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ---- | -| nid | num | 勋章id | | -| name | str | 勋章名称 | | -| image | str | 勋章图标 | | -| image_small | str | 勋章图标(小) | | -| level | str | 勋章等级 | | -| condition | str | 获取条件 | | - -`data`中的`fans_medal`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------------ | ---- | -| show | bool | | | -| wear | bool | 是否佩戴了粉丝勋章 | | -| medal | obj | 粉丝勋章信息 | | - -`fans_medal`中的`medal`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | ------------------- | -------------------------------- | -| uid | num | 此用户mid | | -| target_id | num | 粉丝勋章所属UP的mid | | -| medal_id | num | 粉丝勋章id | | -| level | num | 粉丝勋章等级 | | -| medal_name | str | 粉丝勋章名称 | | -| medal_color | num | 颜色 | | -| intimacy | num | 当前亲密度 | | -| next_intimacy | num | 下一等级所需亲密度 | | -| day_limit | num | 每日亲密度获取上限 | | -| today_feed | num | 今日已获得亲密度 | | -| medal_color_start | num | 粉丝勋章颜色 | 十进制数,可转为十六进制颜色代码 | -| medal_color_end | num | 粉丝勋章颜色 | 十进制数,可转为十六进制颜色代码 | -| medal_color_border | num | 粉丝勋章边框颜色 | 十进制数,可转为十六进制颜色代码 | -| is_lighted | num | | | -| light_status | num | | | -| wearing_status | num | 当前是否佩戴 | 0:未佩戴
1:已佩戴 | -| score | num | | | - -`data`中的`sys_notice`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ---- | -| id | num | id | | -| content | str | 显示文案 | | -| url | str | 跳转地址 | | -| notice_type | num | 提示类型 | 1,2 | -| icon | str | 前缀图标 | | -| text_color | str | 文字颜色 | | -| bg_color | str | 背景颜色 | | - -`sys_notice`示例 - -| id | content | notice_type | 示例用户 | -| --- | ---------------------------------------------------------------------------------------------- | ----------- | --------------------------------------------------- | -| 5 | 该用户存在争议行为,已冻结其帐号功能的使用 | 1 | | -| 8 | 该用户存在较大争议,请谨慎甄别其内容 | 1 | [28062215](https://space.bilibili.com/28062215) | -| 11 | 该账号涉及合约争议,暂冻结其账号功能使用。详见公告-> | 1 | | -| 16 | 该UP主内容存在争议,请注意甄别视频内信息 | 1 | [382534165](https://space.bilibili.com/382534165) | -| 20 | 请允许我们在此献上最后的告别,以此纪念其在哔哩哔哩留下的回忆与足迹。请点此查看纪念账号相关说明 | 2 | [212535360](https://space.bilibili.com/212535360) | -| 22 | 该账号涉及合约诉讼,封禁其账号使用 | | | -| 24 | 该账号涉及合约争议,暂冻结其账号功能使用 | 1 | [291229008](https://space.bilibili.com/291229008) | -| 25 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [81447581](https://space.bilibili.com/81447581) | -| 31 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [22439273](https://space.bilibili.com/22439273) | -| 34 | 该用户涉及严重指控,暂冻结其账号功能使用 | 1 | [1640486775](https://space.bilibili.com/1640486775) | -| 36 | 该账户存在争议,请谨慎甄别 | 1 | | - -`data`中的`live_room`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | -------------- | ------------------------ | -| roomStatus | num | 直播间状态 | 0:无房间
1:有房间 | -| liveStatus | num | 直播状态 | 0:未开播
1:直播中 | -| url | str | 直播间网页 url | | -| title | str | 直播间标题 | | -| cover | str | 直播间封面 url | | -| watched_show | obj | | | -| roomid | num | 直播间 id | | -| roundStatus | num | 轮播状态 | 0:未轮播
1:轮播 | -| broadcast_type | num | 0 | | - -`live_room`中的`watched_show`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------- | ---- | -| switch | bool | ? | | -| num | num | total watched users | | -| text_small | str | | | -| text_large | str | | | -| icon | str | watched icon url | | -| icon_location | str | ? | | -| icon_web | str | watched icon url | | - -`data`中的`school`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---------- | -| name | str | 就读大学名称 | 没有则为空 | - -`data`中的`profession`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | --------------------- | -| name | str | 资质名称 | | -| department | str | 职位 | | -| title | str | 所属机构 | | -| is_show | num | 是否显示 | 0:不显示
1:显示 | - -`data`中的`user_honour_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---- | ---- | -| mid | num | 0 | | -| colour | str | null | | -| tags | array | null | | - -`data`中的`series`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ---- | ---- | -| user_upgrade_status | num | (?) | | -| show_upgrade_window | bool | (?) | | - -`data`中的`elec`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------------- | ---- | -| show_info | obj | 显示的充电信息 | | - -`elec`中的`show_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------------- | ------------------------------------------------------------------------------------------------------------- | -| show | bool | 是否显示充电按钮 | | -| state | num | 充电功能开启状态 | -1:未开通充电功能
1:已开通自定义充电
2:已开通包月、自定义充电
3:已开通包月高档、自定义充电 | -| title | str | 充电按钮显示文字 | 空字符串或 `充电` 或 `充电中` | -| icon | str | 充电图标 | | -| jump_url | str | 跳转url | | - -`data`中的`contract`对象: - -| 字段名 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ------------------ | ----------------------------------- | -| is_display | bool | | true/false
在页面中未使用此字段 | -| is_follow_display | bool | 是否在显示老粉计划 | true:显示
false:不显示 | - -**示例:** - -查询用户`mid=2`的详细信息,Wbi 签名的 `wts`、`w_rid`生成方式详见 [Wbi 签名](../misc/sign/wbi.md) 文档 - -```shell -curl -G 'https://api.bilibili.com/x/space/wbi/acc/info' \ - --data-urlencode 'mid=2' \ - --data-urlencode 'wts=1685070149' \ - --data-urlencode 'w_rid=f7b376124782ae8cb42c56fdd69144ed' \ - -b 'SESSDATA=xxx ;a= ; b=' \ - -A 'Mozilla/9.0 (X11; qwq)' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 2, - "name": "碧诗", - "sex": "男", - "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "face_nft": 0, - "face_nft_type": 0, - "sign": "https://kami.im 直男过气网红 # We Are Star Dust", - "rank": 20000, - "level": 6, - "jointime": 0, - "moral": 0, - "silence": 0, - "coins": 0, - "fans_badge": true, - "fans_medal": { - "show": true, - "wear": true, - "medal": { - "uid": 2, - "target_id": 548076, - "medal_id": 32525, - "level": 28, - "medal_name": "桜樱怪", - "medal_color": 398668, - "intimacy": 25364, - "next_intimacy": 160000, - "day_limit": 250000, - "today_feed": 2382, - "medal_color_start": 398668, - "medal_color_end": 6850801, - "medal_color_border": 6809855, - "is_lighted": 1, - "guard_level": 3, - "light_status": 1, - "wearing_status": 1, - "score": 50185364 - } - }, - "official": { - "role": 2, - "title": "bilibili创始人(站长)", - "desc": "", - "type": 0 - }, - "vip": { - "type": 2, - "status": 1, - "due_date": 3979555200000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "十年大会员", - "label_theme": "ten_annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 7, - "avatar_subscript_url": "", - "tv_vip_status": 1, - "tv_vip_pay_type": 1, - "tv_due_date": 2003500800, - "avatar_icon": { - "icon_type": 1, - "icon_resource": {} - } - }, - "pendant": { - "pid": 32257, - "name": "EveOneCat2", - "image": "https://i2.hdslb.com/bfs/garb/item/488870931b1bba66da36d22848f0720480d3d79a.png", - "expire": 0, - "image_enhance": "https://i2.hdslb.com/bfs/garb/item/5974f17f9d96a88bafba2f6d18d647a486e88312.webp", - "image_enhance_frame": "https://i2.hdslb.com/bfs/garb/item/4316a3910bb0bd6f2f1c267a3e9187f0b9fe5bd0.png", - "n_pid": 32257 - }, - "nameplate": { - "nid": 10, - "name": "见习偶像", - "image": "https://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", - "image_small": "https://i2.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", - "level": "普通勋章", - "condition": "所有自制视频总播放数>=10万" - }, - "user_honour_info": { - "mid": 0, - "colour": null, - "tags": [], - "is_latest_100honour": 0 - }, - "is_followed": false, - "top_photo": "http://i0.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", - "theme": {}, - "sys_notice": {}, - "live_room": { - "roomStatus": 1, - "liveStatus": 0, - "url": "https://live.bilibili.com/1024?broadcast_type=0&is_room_feed=0", - "title": "试图恰鸡", - "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/96ee5bfd0279a0f18b190340334f43f473038288.jpg", - "roomid": 1024, - "roundStatus": 0, - "broadcast_type": 0, - "watched_show": { - "switch": true, - "num": 3, - "text_small": "3", - "text_large": "3人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": "", - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - } - }, - "birthday": "09-19", - "school": { - "name": "" - }, - "profession": { - "name": "", - "department": "", - "title": "", - "is_show": 0 - }, - "tags": null, - "series": { - "user_upgrade_status": 3, - "show_upgrade_window": false - }, - "is_senior_member": 0, - "mcn_info": null, - "gaia_res_type": 0, - "gaia_data": null, - "is_risk": false, - "elec": { - "show_info": { - "show": true, - "state": 1, - "title": "", - "icon": "", - "jump_url": "?oid=2" - } - }, - "contract": { - "is_display": false, - "is_follow_display": false - }, - "certificate_show": false, - "name_render": null - } -} -``` - -
- -## 用户名片信息 - -> https://api.bilibili.com/x/web-interface/card - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------------------- | ------ | ----------------------- | -| mid | num | 目标用户mid | 必要 | | -| photo | bool | 是否请求用户主页头图 | 非必要 | true:是
false:否 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------- | ------------------------------------------------------------------------ | -| card | obj | 卡片信息 | | -| following | bool | 是否关注此用户 | true:已关注
false:未关注
需要登录(Cookie)
未登录为false | -| archive_count | num | 用户稿件数 | | -| article_count | num | 0 | **作用尚不明确** | -| follower | num | 粉丝数 | | -| like_num | num | 点赞数 | | - -`data`中的`card`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | ------------ | ----------------------- | -| mid | str | 用户mid | | -| approve | bool | false | **作用尚不明确** | -| name | str | 用户昵称 | | -| sex | str | 用户性别 | 男 女 保密 | -| face | str | 用户头像链接 | | -| DisplayRank | str | 0 | **作用尚不明确** | -| regtime | num | 0 | **作用尚不明确** | -| spacesta | num | 用户状态 | 0:正常
-2:被封禁 | -| birthday | str | 空 | **作用尚不明确** | -| place | str | 空 | **作用尚不明确** | -| description | str | 空 | **作用尚不明确** | -| article | num | 0 | **作用尚不明确** | -| attentions | array | 空 | **作用尚不明确** | -| fans | num | 粉丝数 | | -| friend | num | 关注数 | | -| attention | num | 关注数 | | -| sign | str | 签名 | | -| level_info | obj | 等级 | | -| pendant | obj | 挂件 | | -| nameplate | obj | 勋章 | | -| Official | obj | 认证信息 | | -| official_verify | obj | 认证信息2 | | -| vip | obj | 大会员状态 | | -| space | obj | 主页头图 | | - -`card`中的`level_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------- | ---------------- | -| current_level | num | 当前等级 | 0-6级 | -| current_min | num | 0 | **作用尚不明确** | -| current_exp | num | 0 | **作用尚不明确** | -| next_exp | num | 0 | **作用尚不明确** | - -`card`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | ---------------- | -| pid | num | 挂件id | | -| name | str | 挂件名称 | | -| image | str | 挂件图片url | | -| expire | num | 0 | **作用尚不明确** | - -`card`中的`nameplate`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | -------------------- | -| nid | num | 勋章id | **详细说明有待补充** | -| name | str | 勋章名称 | | -| image | str | 挂件图片url 正常 | | -| image_small | str | 勋章图片url 小 | | -| level | str | 勋章等级 | | -| condition | str | 勋章条件 | | - -`card`中的`Official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | ---------------------------------------- | -| role | num | 认证类型 | 见[用户认证类型一览](official_role.md) | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 是否认证 | -1:无
0:UP主认证
1:机构认证 | - -`card`中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---------------------------------------- | -| type | num | 是否认证 | -1:无
0:UP主认证
1:机构认证 | -| desc | str | 认证信息 | 无为空 | - -`card`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ---------- | ------------------------------------------------- | -| vipType | num | 大会员类型 | 0:无
1:月度大会员
2:年度及以上大会员 | -| dueRemark | str | 空 | **作用尚不明确** | -| accessStatus | num | 0 | **作用尚不明确** | -| vipStatus | num | 大会员状态 | 0:无
1:有 | -| vipStatusWarn | str | 空 | **作用尚不明确** | -| theme_type | num | 0 | **作用尚不明确** | - -`card`中的`space`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------------- | ---- | -| s_img | str | 主页头图url 小图 | | -| l_img | str | 主页头图url 正常 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/card' \ ---data-urlencode 'mid=2' \ ---data-urlencode 'photo=true' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "card": { - "mid": "2", - "name": "碧诗", - "approve": false, - "sex": "男", - "rank": "20000", - "face": "http://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "DisplayRank": "0", - "regtime": 0, - "spacesta": 0, - "birthday": "", - "place": "", - "description": "", - "article": 0, - "attentions": [], - "fans": 969999, - "friend": 234, - "attention": 234, - "sign": "kami.im 直男过气网红 # av362830 “We Are Star Dust”", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "" - }, - "nameplate": { - "nid": 10, - "name": "见习偶像", - "image": "http://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", - "image_small": "http://i2.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", - "level": "普通勋章", - "condition": "所有自制视频总播放数\u003e=10万" - }, - "Official": { - "role": 2, - "title": "bilibili创始人(站长)", - "desc": "", - "type": 0 - }, - "official_verify": { - "type": 0, - "desc": "bilibili创始人(站长)" - }, - "vip": { - "type": 2, - "status": 1, - "due_date": 3896524800000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "十年大会员", - "label_theme": "ten_annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 7, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png", - "vipType": 2, - "vipStatus": 1 - } - }, - "space": { - "s_img": "http://i1.hdslb.com/bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", - "l_img": "http://i1.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png" - }, - "following": true, - "archive_count": 37, - "article_count": 0, - "follower": 969999, - "like_num": 3547978 - } -} -``` - -
- -## 登录用户空间详细信息 - -> https://api.bilibili.com/x/space/myinfo - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------- | -| code | num | 返回值 | 0:成功
-101:未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------ | ------------------------ | -| mid | num | mid | | -| name | str | 昵称 | | -| sex | str | 性别 | 男 女 保密 | -| face | str | 头像图片url | | -| sign | str | 签名 | | -| rank | num | 10000 | **作用尚不明确** | -| level | num | 当前等级 | 0-6级 | -| jointime | num | 0 | **作用尚不明确** | -| moral | num | 节操 | 默认70 | -| silence | num | 封禁状态 | 0:正常
1:被封 | -| email_status | num | 已验证邮箱 | 0:未验证
1:已验证 | -| tel_status | num | 已验证手机号 | 0:未验证
1:已验证 | -| identification | num | 1 | **作用尚不明确** | -| vip | obj | 大会员状态 | | -| birthday | num | 生日 | 时间戳 | -| is_tourist | num | 0 | **作用尚不明确** | -| is_fake_account | num | 0 | **作用尚不明确** | -| pin_prompting | num | 0 | **作用尚不明确** | -| is_deleted | num | 0 | **作用尚不明确** | -| coins | num | 硬币数 | | -| following | num | 粉丝数 | | -| follower | num | 粉丝数 | | - -`data`中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------- | ---- | ---------------- | ----------------------------------------------- | -| type | num | 会员类型 | 0:无
1:月大会员
2:年度及以上大会员 | -| status | num | 会员状态 | 0:无
1:有 | -| due_date | num | 会员过期时间 | Unix时间戳(毫秒) | -| theme_type | num | 0 | 作用尚不明确 | -| label | obj | 会员标签 | | -| avatar_subscript | num | 是否显示会员图标 | 0:不显示
1:显示 | -| nickname_color | str | 会员昵称颜色 | 颜色码 | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ----------------------------------------------------------------------------------------------------------- | -| path | str | 空 | 作用尚不明确 | -| text | str | 会员名称 | | -| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员 | - -`data`中的`pendant`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ----------- | -------------------- | -| pid | num | 挂件id | **详细说明有待补充** | -| name | str | 挂件名称 | | -| image | str | 挂件图片url | | -| expire | num | 0 | **作用尚不明确** | - -`data`中的`nameplate`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | -------------------- | -| nid | num | 勋章id | **详细说明有待补充** | -| name | str | 勋章名称 | | -| image | str | 挂件图片url 正常 | | -| image_small | str | 勋章图片url 小 | | -| level | str | 勋章等级 | | -| condition | str | 勋章条件 | | - -`data`中的`Official`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------- | -------------------------------------- | -| role | num | 认证类型 | 见[用户认证类型一览](official_role.md) | -| title | str | 认证信息 | 无为空 | -| desc | str | 认证备注 | 无为空 | -| type | num | 是否认证 | -1:无
0:认证 | - -`data`中的`level_exp`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------- | ------------------------------------------ | -| current_level | num | 当前等级 | 0-6级 | -| current_min | num | 0 | 指当前等级从多少经验值开始 | -| current_exp | num | 0 | 当前账户的经验值 | -| next_exp | num | 0 | 下一个等级所需的经验值**(不是还需要多少)** | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/space/myinfo' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 293793435, - "name": "社会易姐QwQ", - "sex": "男", - "face": "http://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "sign": "高考刚结束的普通技术宅一枚,喜欢MC和编程以及电子,是车车人也是术术人,粉丝群:1136462265", - "rank": 10000, - "level": 5, - "jointime": 0, - "moral": 70, - "silence": 0, - "email_status": 1, - "tel_status": 1, - "identification": 1, - "vip": { - "type": 2, - "status": 1, - "due_date": 1644163200000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "http://i0.hdslb.com/bfs/vip/icon_Certification_big_member_22_3x.png" - }, - "pendant": { - "pid": 2511, - "name": "初音未来13周年", - "image": "http://i0.hdslb.com/bfs/garb/item/4f8f3f1f2d47f0dad84f66aa57acd4409ea46361.png", - "expire": 0, - "image_enhance": "http://i0.hdslb.com/bfs/garb/item/fe0b83b53e2342b16646f6e7a9370d8a867decdb.webp", - "image_enhance_frame": "http://i0.hdslb.com/bfs/garb/item/127c507ec8448be30cf5f79500ecc6ef2fd32f2c.png" - }, - "nameplate": { - "nid": 4, - "name": "青铜殿堂", - "image": "http://i0.hdslb.com/bfs/face/2879cd5fb8518f7c6da75887994c1b2a7fe670bd.png", - "image_small": "http://i0.hdslb.com/bfs/face/6707c120e00a3445933308fd9b7bd9fad99e9ec4.png", - "level": "普通勋章", - "condition": "单个自制视频总播放数\u003e=1万" - }, - "official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "birthday": 1015257600, - "is_tourist": 0, - "is_fake_account": 0, - "pin_prompting": 0, - "is_deleted": 0, - "in_reg_audit": 0, - "is_rip_user": false, - "profession": { - "id": 0, - "name": "", - "show_name": "" - }, - "level_exp": { - "current_level": 5, - "current_min": 10800, - "current_exp": 27125, - "next_exp": 28800 - }, - "coins": 9, - "following": 1122, - "follower": 1122 - } -} -``` - -
- -## 多用户详细信息 - -> https://api.bilibili.com/x/polymer/pc-electron/v1/user/cards - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------------- | ------ | --------------------------------- | -| uids | nums | 目标用户的mid列表 | 必要 | 每个成员间用`,`分隔,最多50个成员 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
40143:批量大小超过限制 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 用户信息随机排序 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------------- | ---- | -| {用户mid} | obj | 该mid对应的用户信息 | | -| …… | obj | …… | …… | - -`data`中的`{用户mid}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------- | -| mid | str | mid | | -| face | str | 头像链接 | | -| name | str | 昵称 | | -| official | obj | 认证信息 | 基本同「[用户空间详细信息](#用户空间详细信息)」中的 `data.official` 对象 | -| vip | obj | 会员信息 | 基本同「[用户空间详细信息](#用户空间详细信息)」中的 `data.vip` 对象,其中有些类型为 `num` 的字段在本接口中类型为 `str` | -| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | - -`{用户mid}`中的`name_render`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | --------------------------- | ---------------- | -| colors_info | obj | 昵称颜色信息(?) | **作用尚不明确** | -| render_scheme | str | `"Default"` 或 `"Colorful"` | **作用尚不明确** | - -`name_render`中的`colors_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------------- | ---------------- | -| color | array | 昵称颜色(?) | **作用尚不明确** | -| color_ids | array | `["6"]` | **作用尚不明确** | - -`color`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------- | ---- | -| 0 | obj | 颜色1 | | -| n | obj | 颜色(n+1) | | -| …… | obj | …… | …… | - -`color`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------- | ----------- | -| color_day | str | 浅色模式昵称颜色 | HEX颜色代码 | -| color_night | str | 深色模式昵称颜色 | HEX颜色代码 | - -**示例:** - -查询用户`uids=1,2,3`的详细信息 - -```shell -curl -G 'https://api.bilibili.com/x/polymer/pc-electron/v1/user/cards' \ ---data-urlencode 'uids=1,2,3' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "1": { - "mid": "1", - "face": "http://i1.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", - "name": "bishi", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": "1912521600000", - "nickname_color": "#FB7299", - "role": "7", - "status": 1, - "theme_type": 0, - "type": 2, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/adb599797dd171e2d3d6d012f448b49679258344.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/sGu57N6pgK.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - } - }, - "name_render": null - }, - "2": { - "mid": "2", - "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "name": "碧诗", - "official": { - "desc": "", - "role": 2, - "title": "bilibili创始人(站长)", - "type": 0 - }, - "vip": { - "avatar_subscript": 1, - "avatar_subscript_url": "", - "due_date": "3995625600000", - "nickname_color": "#FB7299", - "role": "7", - "status": 1, - "theme_type": 0, - "type": 2, - "label": { - "bg_color": "#FB7299", - "bg_style": 1, - "border_color": "", - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png", - "label_theme": "ten_annual_vip", - "path": "", - "text": "十年大会员", - "text_color": "#FFFFFF", - "use_img_label": true - } - }, - "name_render": null - }, - "3": { - "mid": "3", - "face": "http://i0.hdslb.com/bfs/face/d4de6a84557eea8f18510a3f61115d96832aa071.jpg", - "name": "囧囧倉", - "official": { - "desc": "", - "role": 0, - "title": "", - "type": -1 - }, - "vip": { - "avatar_subscript": 0, - "avatar_subscript_url": "", - "due_date": "0", - "nickname_color": "", - "role": "0", - "status": 0, - "theme_type": 0, - "type": 0, - "label": { - "bg_color": "", - "bg_style": 0, - "border_color": "", - "img_label_uri_hans": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant": "", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png", - "label_theme": "", - "path": "", - "text": "", - "text_color": "", - "use_img_label": true - } - }, - "name_render": null - } - } -} -``` - -
- -## 多用户详细信息2 - -> https://api.vc.bilibili.com/account/v1/user/cards - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -本接口较其他接口相比,只会返回非常有限的信息 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------------- | ------ | --------------------------------------------------------------------- | -| uids | nums | 目标用户的mid列表 | 必要 | 每个成员间用`,`分隔,最多50个成员,若超过此限制则返回的`data`数组为空 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 信息本体 | 用户信息随机排序 | - - -**示例:** - -查询用户`uids=1,2,3`的详细信息 - -```shell -curl -G 'https://api.vc.bilibili.com/account/v1/user/cards' \ ---data-urlencode 'uids=1,2,3' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "mid": 3, - "name": "囧囧倉", - "face": "http://i0.hdslb.com/bfs/face/d4de6a84557eea8f18510a3f61115d96832aa071.jpg", - "sign": "富强、民主、文明、和谐、自由、平等、公正、法治、爱国、敬业、诚信、友善。", - "rank": 10000, - "level": 6, - "silence": 0 - }, - { - "mid": 2, - "name": "碧诗", - "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "sign": "https://kami.im 直男过气网红 # We Are Star Dust", - "rank": 20000, - "level": 6, - "silence": 0 - }, - { - "mid": 1, - "name": "bishi", - "face": "http://i1.hdslb.com/bfs/face/34c5b30a990c7ce4a809626d8153fa7895ec7b63.gif", - "sign": "", - "rank": 10000, - "level": 6, - "silence": 0 - } - ] -} -``` - -
- -## 多用户详细信息3 - -> https://api.vc.bilibili.com/x/im/user_infos - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------------- | ------ | ------------------- | -| uids | nums | 目标用户的mid列表 | 必要 | 每个成员间用`,`分隔 | - - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------- | ---- | -| 0 | obj | 用户1 | | -| n | obj | 用户(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | ------------ | -------------------- | -| mid | num | mid | | -| name | str | 昵称 | | -| face | str | 头像链接 | | -| sign | str | 签名 | | -| rank | num | 用户权限等级 | | -| level | num | 当前等级 | 0-6 级 | -| silence | num | 封禁状态 | 0:正常
1:被封 | -| vip | obj | 大会员信息 | | -| offical | obj | 认证信息 | | -| is_fake_account | bool | | | -| expert_info | obj | 专业信息? | | - -**示例:** - -查询用户`uids=1,2,3`的详细信息 - -```shell -curl -G 'https://api.vc.bilibili.com/x/im/user_infos' \ ---data-urlencode 'uids=2,114514' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "0", - "message": "0", - "ttl": 1, - "data": [ - { - "mid": 2, - "name": "碧诗", - "sex": "男", - "face": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "sign": "https://kami.im 直男过气网红 # We Are Star Dust", - "rank": 20000, - "level": 6, - "silence": 0, - "vip": { - "type": 2, - "status": 1, - "due_date": 4000982400000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "十年大会员", - "label_theme": "ten_annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/wltavwHAkL.gif", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/802418ff03911645648b63aa193ba67997b5a0bc.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/8u7iRTPE7N.png" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 7, - "avatar_subscript_url": "", - "tv_vip_status": 1, - "tv_vip_pay_type": 1, - "tv_due_date": 2003500800, - "avatar_icon": { - "icon_type": 1, - "icon_resource": { - - } - } - }, - "pendant": { - "pid": -338454175, - "name": "箱庭少女之梦头像", - "image": "https://i2.hdslb.com/bfs/garb/open/efe5e579cbb95a404c2ba289f37c5965dee7a3a2.png", - "expire": 0, - "image_enhance": "https://i2.hdslb.com/bfs/garb/open/efe5e579cbb95a404c2ba289f37c5965dee7a3a2.png", - "image_enhance_frame": "", - "n_pid": 1743418268001 - }, - "nameplate": { - "nid": 10, - "name": "见习偶像", - "image": "https://i2.hdslb.com/bfs/face/e93dd9edfa7b9e18bf46fd8d71862327a2350923.png", - "image_small": "https://i2.hdslb.com/bfs/face/275b468b043ec246737ab8580a2075bee0b1263b.png", - "level": "普通勋章", - "condition": "所有自制视频总播放数\u003E=10万" - }, - "official": { - "role": 2, - "title": "bilibili创始人(站长)", - "desc": "", - "type": 0 - }, - "birthday": 622137600, - "is_fake_account": 0, - "is_deleted": 0, - "in_reg_audit": 0, - "face_nft": 0, - "face_nft_new": 0, - "is_senior_member": 0, - "digital_id": "", - "digital_type": -2, - "attestation": { - "type": 2, - "common_info": { - "title": "bilibili创始人(站长)", - "prefix": "bilibili UP主认证", - "prefix_title": "bilibili UP主认证:bilibili创始人(站长)" - }, - "splice_info": { - "title": "bilibili创始人(站长)" - }, - "icon": "https://i0.hdslb.com/bfs/activity-plat/static/20230828/e3b8ebec8e86f060b930a2c0536bb88b/72wejSxl9Z.png", - "desc": "" - }, - "expert_info": { - "title": "", - "state": 0, - "type": 0, - "desc": "" - }, - "honours": { - "mid": 2, - "colour": { - "dark": "#CE8620", - "normal": "#F0900B" - }, - "tags": null, - "is_latest_100honour": 0 - }, - "name_render": null, - "json_ava": { - "container_size": { - "width": 1.375, - "height": 1.375 - }, - "fallback_layers": { - "layers": [ - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.6875, - "axis_y": 0.6875 - }, - "size_spec": { - "width": 0.787, - "height": 0.787 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "AVATAR_LAYER": { - - } - }, - "is_critical": true, - "layer_mask": { - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.6875, - "axis_y": 0.6875 - }, - "size_spec": { - "width": 0.787, - "height": 0.787 - }, - "render_spec": { - "opacity": 1 - } - }, - "mask_src": { - "src_type": 3, - "draw": { - "draw_type": 1, - "fill_mode": 1, - "color_config": { - "day": { - "argb": "#FF000000" - } - } - } - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 1, - "placeholder": 6, - "remote": { - "url": "https://i2.hdslb.com/bfs/face/ef0457addb24141e15dfac6fbf45293ccf1e32ab.jpg", - "bfs_style": "widget-layer-avatar" - } - } - } - } - }, - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.6875, - "axis_y": 0.6875 - }, - "size_spec": { - "width": 1.375, - "height": 1.375 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "PENDENT_LAYER": { - - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 1, - "remote": { - "url": "https://i2.hdslb.com/bfs/garb/open/efe5e579cbb95a404c2ba289f37c5965dee7a3a2.png", - "bfs_style": "widget-layer-avatar" - } - } - } - } - }, - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 1, - "axis_x": 0.806, - "axis_y": 0.822666666666667 - }, - "size_spec": { - "width": 0.35, - "height": 0.35 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "ICON_LAYER": { - - } - } - }, - "resource": { - "res_type": 5, - "res_native_draw": { - "draw_src": { - "src_type": 3, - "draw": { - "draw_type": 1, - "fill_mode": 1, - "color_config": { - "is_dark_mode_aware": true, - "day": { - "argb": "#FFFFFFFF" - }, - "night": { - "argb": "#FF17181A" - } - } - } - } - } - } - }, - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 1, - "axis_x": 0.831, - "axis_y": 0.847666666666667 - }, - "size_spec": { - "width": 0.3, - "height": 0.3 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "ICON_LAYER": { - - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 2, - "local": 3 - } - } - } - } - ], - "is_critical_group": true - }, - "mid": "2" - } - }, - { - "mid": 114514, - "name": "田所こうじ", - "sex": "保密", - "face": "http://i1.hdslb.com/bfs/face/875eb66bb952f16afa9634081a820dea8e3fac96.jpg", - "sign": "?!", - "rank": 10000, - "level": 6, - "silence": 0, - "vip": { - "type": 1, - "status": 0, - "due_date": 1683043200000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 0, - "avatar_icon": { - "icon_resource": { - - } - } - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0 - }, - "nameplate": { - "nid": 0, - "name": "", - "image": "", - "image_small": "", - "level": "", - "condition": "" - }, - "official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "birthday": -1590393600, - "is_fake_account": 0, - "is_deleted": 0, - "in_reg_audit": 0, - "face_nft": 0, - "face_nft_new": 0, - "is_senior_member": 0, - "digital_id": "", - "digital_type": -2, - "attestation": { - "type": 0, - "common_info": { - "title": "", - "prefix": "", - "prefix_title": "" - }, - "splice_info": { - "title": "" - }, - "icon": "", - "desc": "" - }, - "expert_info": { - "title": "", - "state": 0, - "type": 0, - "desc": "" - }, - "honours": { - "mid": 114514, - "colour": { - "dark": "#CE8620", - "normal": "#F0900B" - }, - "tags": null, - "is_latest_100honour": 0 - }, - "name_render": null, - "json_ava": { - "container_size": { - "width": 1.35, - "height": 1.35 - }, - "fallback_layers": { - "layers": [ - { - "visible": true, - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.675, - "axis_y": 0.675 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "layer_config": { - "tags": { - "AVATAR_LAYER": { - - } - }, - "is_critical": true, - "layer_mask": { - "general_spec": { - "pos_spec": { - "coordinate_pos": 2, - "axis_x": 0.675, - "axis_y": 0.675 - }, - "size_spec": { - "width": 1, - "height": 1 - }, - "render_spec": { - "opacity": 1 - } - }, - "mask_src": { - "src_type": 3, - "draw": { - "draw_type": 1, - "fill_mode": 1, - "color_config": { - "day": { - "argb": "#FF000000" - } - } - } - } - } - }, - "resource": { - "res_type": 3, - "res_image": { - "image_src": { - "src_type": 1, - "placeholder": 6, - "remote": { - "url": "http://i1.hdslb.com/bfs/face/875eb66bb952f16afa9634081a820dea8e3fac96.jpg", - "bfs_style": "widget-layer-avatar" - } - } - } - } - } - ], - "is_critical_group": true - }, - "mid": "114514" - } - } - ] -} -``` -
diff --git a/docs/user/medals.md b/docs/user/medals.md deleted file mode 100644 index d2374bc..0000000 --- a/docs/user/medals.md +++ /dev/null @@ -1,822 +0,0 @@ -# 所有粉丝勋章 - -## 指定用户的所有粉丝勋章信息 - -> https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall - -*请求方法: GET* - -认证方式: Cookie (SESSDATA) - - - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------- | ------ | ---- | -| target_id | num | 目标 mid | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0: 成功
-101: 账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | 失败时不存在 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | --------------------- | ----- | -| list | array | 勋章列表 | | -| count | num | 勋章数 | | -| close_space_medal | num | 关闭空间粉丝勋章显示? | 0: 否 | -| only_show_wearing | num | 只显示当前佩戴的? | 0: 否 | -| name | str | 目标用户名 | | -| icon | str | 目标用户头像 URL | | -| uid | num | 目标用户 mid | | -| level | num | 目标用户等级 | | - -`data` 对象中 `list` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------ | ---- | -| medal_info | obj | 勋章信息 | | -| target_name | str | 主播名称 | | -| target_icon | str | 主播头像 URL | | -| link | str | 主播主页 URL | | -| live_status | num | 直播状态 | 0: 未直播
1: 正在直播
2: 轮播中 | -| offical | num | 主播认证类型 | 参见 [用户认证类型一览](official_role.md) | -| uinfo_medal | str | 用户勋章信息 | | - -`list` 数组中的对象中的 `medal_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | -------- | ---- | -| target_id | num | 主播 mid | | -| level | num | 勋章等级 | | -| medal_name | str | 勋章名称 | | -| medal_color_start | num | 勋章开始颜色 | 十进制(自行转换为16进制) | -| medal_color_end | num | 勋章结束颜色 | 同上 | -| medal_color_border | num | 勋章边框颜色 | 同上 | -| guard_level | num | 守护等级? | 1: 总督
2: 提督
3: 舰长 | -| wearing_status | num | 佩戴状态 | 0: 未佩戴
1: 佩戴中 | -| medal_id | num | 勋章 ID | | -| intimacy | num | 当前亲密度 | | -| next_intimacy | num | 下一等级所需亲密度 | | -| today_feed | num | 今日已获得亲密度 | | -| day_limit | num | 亲密度每日上限? | | -| guard_icon | str | 守护徽章图标 URL? | | -| honor_icon | str | 荣誉徽章图标 URL? | | - -`list` 数组中的对象中的 `uinfo_medal` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ---- | ---- | -| name | str | 勋章名称 | | -| level | num | 勋章等级 | | -| color_start | num | 勋章渐变开始颜色 | 十进制(自行转换为16进制) | -| color_end | num | 勋章渐变结束颜色 | 同上 | -| color_border | num | 勋章边框颜色 | 同上 | -| color | num | 勋章颜色 | 同上 | -| id | num | 勋章 ID | | -| typ | num | 勋章类型? | | -| is_light | num | 是否点亮? | | -| ruid | num | 主播 mid | | -| guard_level | num | 大航海等级 | 1: 总督
2: 提督
3: 舰长 | -| score | num | 勋章分数? | | -| guard_icon | str | 大航海图标 URL? | 粉丝牌左边的图标 | -| honor_icon | str | 荣誉徽章图标 URL? | | -| v2_medal_color_start | str | 勋章开始颜色 | 16进制 | -| v2_medal_color_end | str | 勋章结束颜色 | 同上 | -| v2_medal_color_border | str | 勋章边框颜色 | 同上 | -| v2_medal_color_text | str | 勋章文本色 | 同上 | -| v2_medal_color_level | str | 勋章等级颜色 | 同上 | -| user_receive_count | num | 勋章已获得数量? | | - -**示例:** - -```shell -curl -G 'https://api.live.bilibili.com/xlive/web-ucenter/user/MedalWall' \ ---url-query 'target_id=293793435' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "medal_info": { - "target_id": 178429408, - "level": 3, - "medal_name": "滑稽果", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 1, - "medal_id": 113190, - "intimacy": 248, - "next_intimacy": 500, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "老弟一号", - "target_icon": "https://i1.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", - "link": "https://space.bilibili.com/178429408", - "live_status": 2, - "official": 1, - "uinfo_medal": { - "name": "滑稽果", - "level": 3, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 113190, - "typ": 0, - "is_light": 1, - "ruid": 178429408, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 15858903, - "level": 9, - "medal_name": "二技猿", - "medal_color_start": 9272486, - "medal_color_end": 9272486, - "medal_color_border": 9272486, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 159670, - "intimacy": 168, - "next_intimacy": 1900, - "today_feed": 0, - "day_limit": 3000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "暮光小猿wzt", - "target_icon": "https://i0.hdslb.com/bfs/face/4113913241f83b03301c316fec6e4c3923bef64e.jpg", - "link": "https://space.bilibili.com/15858903", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "二技猿", - "level": 9, - "color_start": 9272486, - "color_end": 9272486, - "color_border": 9272486, - "color": 0, - "id": 159670, - "typ": 0, - "is_light": 1, - "ruid": 15858903, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#596FE099", - "v2_medal_color_end": "#596FE099", - "v2_medal_color_border": "#596FE099", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 24022863, - "level": 7, - "medal_name": "粉丝团", - "medal_color_start": 6126494, - "medal_color_end": 6126494, - "medal_color_border": 6126494, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 233401, - "intimacy": 1499, - "next_intimacy": 1600, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "黄禄轩电脑专用账号", - "target_icon": "https://i0.hdslb.com/bfs/face/a70ec7d2a3822980a915ef4b30371af0cbc79132.jpg", - "link": "https://space.bilibili.com/24022863", - "live_status": 2, - "official": 0, - "uinfo_medal": { - "name": "粉丝团", - "level": 7, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 0, - "id": 233401, - "typ": 0, - "is_light": 1, - "ruid": 24022863, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 1347373376, - "level": 6, - "medal_name": "Geek范", - "medal_color_start": 6126494, - "medal_color_end": 6126494, - "medal_color_border": 6126494, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 658512, - "intimacy": 999, - "next_intimacy": 1500, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "GeekLogic", - "target_icon": "https://i2.hdslb.com/bfs/face/fc4ba4087efa80dce11dfdd1c2bc07d84fb603b9.jpg", - "link": "https://space.bilibili.com/1347373376", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "Geek范", - "level": 6, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 0, - "id": 658512, - "typ": 0, - "is_light": 1, - "ruid": 1347373376, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 451664, - "level": 5, - "medal_name": "粉丝团", - "medal_color_start": 6126494, - "medal_color_end": 6126494, - "medal_color_border": 6126494, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 408689, - "intimacy": 799, - "next_intimacy": 1000, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "刘师兄_liujun", - "target_icon": "https://i2.hdslb.com/bfs/face/90665d1613cc5501a3f7bbc79b5dc83bcc30667d.jpg", - "link": "https://space.bilibili.com/451664", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "粉丝团", - "level": 5, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 0, - "id": 408689, - "typ": 0, - "is_light": 1, - "ruid": 451664, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 89240844, - "level": 5, - "medal_name": "六零", - "medal_color_start": 6126494, - "medal_color_end": 6126494, - "medal_color_border": 6126494, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 306526, - "intimacy": 799, - "next_intimacy": 1000, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "A60_OnE", - "target_icon": "https://i0.hdslb.com/bfs/face/483513f7b0533d666fdf7eff96a70b69992056fd.jpg", - "link": "https://space.bilibili.com/89240844", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "六零", - "level": 5, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 0, - "id": 306526, - "typ": 0, - "is_light": 1, - "ruid": 89240844, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 1850091, - "level": 5, - "medal_name": "観測者", - "medal_color_start": 6126494, - "medal_color_end": 6126494, - "medal_color_border": 6126494, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 118910, - "intimacy": 98, - "next_intimacy": 1000, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "Jannchie见齐", - "target_icon": "https://i0.hdslb.com/bfs/face/983034448f81f45f05956d0455a86fe0639d6a36.jpg", - "link": "https://space.bilibili.com/1850091", - "live_status": 2, - "official": 1, - "uinfo_medal": { - "name": "観測者", - "level": 5, - "color_start": 6126494, - "color_end": 6126494, - "color_border": 6126494, - "color": 0, - "id": 118910, - "typ": 0, - "is_light": 1, - "ruid": 1850091, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5866C799", - "v2_medal_color_end": "#5866C799", - "v2_medal_color_border": "#5866C799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 4911405, - "level": 4, - "medal_name": "毛狐狸", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 18887, - "intimacy": 658, - "next_intimacy": 700, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "粉毛变态老狐狸", - "target_icon": "https://i0.hdslb.com/bfs/face/5924e9201ac87066e76534472303b636a9961647.jpg", - "link": "https://space.bilibili.com/4911405", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "毛狐狸", - "level": 4, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 18887, - "typ": 0, - "is_light": 1, - "ruid": 4911405, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 130914376, - "level": 3, - "medal_name": "江草", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 166326, - "intimacy": 463, - "next_intimacy": 500, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "江灵夏草", - "target_icon": "https://i1.hdslb.com/bfs/face/63eb615514fddbc6024a34ddcacfb0bc6103d019.jpg", - "link": "https://space.bilibili.com/130914376", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "江草", - "level": 3, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 166326, - "typ": 0, - "is_light": 1, - "ruid": 130914376, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 316568752, - "level": 3, - "medal_name": "SEAL", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 312420, - "intimacy": 428, - "next_intimacy": 500, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "马督工", - "target_icon": "https://i1.hdslb.com/bfs/face/1c56737dfc0deffffc31c78e0cefb0c3ecf7e000.jpg", - "link": "https://space.bilibili.com/316568752", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "SEAL", - "level": 3, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 312420, - "typ": 0, - "is_light": 1, - "ruid": 316568752, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 633003, - "level": 3, - "medal_name": "器材党", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 57027, - "intimacy": 198, - "next_intimacy": 500, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "和光Channel", - "target_icon": "https://i0.hdslb.com/bfs/face/c34413202f3f4ab6c7955a2c9ca5a9ac8e86d8c2.jpg", - "link": "https://space.bilibili.com/633003", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "器材党", - "level": 3, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 57027, - "typ": 0, - "is_light": 1, - "ruid": 633003, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 5760446, - "level": 2, - "medal_name": "花泪", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 32283, - "intimacy": 298, - "next_intimacy": 300, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "花儿不哭", - "target_icon": "https://i2.hdslb.com/bfs/face/4f220d57ca877167f3efdc60e40d0cb53ca58b72.jpg", - "link": "https://space.bilibili.com/5760446", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "花泪", - "level": 2, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 32283, - "typ": 0, - "is_light": 1, - "ruid": 5760446, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 3644545, - "level": 2, - "medal_name": "东方狗", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 249059, - "intimacy": 98, - "next_intimacy": 300, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "白倉カナ", - "target_icon": "https://i1.hdslb.com/bfs/face/ae839f221a5812683fe0a3967f4a612dd65a05d2.jpg", - "link": "https://space.bilibili.com/3644545", - "live_status": 0, - "official": 0, - "uinfo_medal": { - "name": "东方狗", - "level": 2, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 249059, - "typ": 0, - "is_light": 1, - "ruid": 3644545, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 614801, - "level": 1, - "medal_name": "神油", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 627, - "intimacy": 119, - "next_intimacy": 201, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "神游八方", - "target_icon": "https://i2.hdslb.com/bfs/face/98f8e0f609ff2403cc086f7254f388336b6f5366.jpg", - "link": "https://space.bilibili.com/614801", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "神油", - "level": 1, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 627, - "typ": 0, - "is_light": 1, - "ruid": 614801, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - }, - { - "medal_info": { - "target_id": 12246, - "level": 1, - "medal_name": "纯色派", - "medal_color_start": 6067854, - "medal_color_end": 6067854, - "medal_color_border": 6067854, - "guard_level": 0, - "wearing_status": 0, - "medal_id": 5171, - "intimacy": 99, - "next_intimacy": 201, - "today_feed": 0, - "day_limit": 2000, - "guard_icon": "", - "honor_icon": "" - }, - "target_name": "囧仙", - "target_icon": "https://i0.hdslb.com/bfs/face/b7ee967282a33a59908218df5b240b45f51afda8.jpg", - "link": "https://space.bilibili.com/12246", - "live_status": 0, - "official": 1, - "uinfo_medal": { - "name": "纯色派", - "level": 1, - "color_start": 6067854, - "color_end": 6067854, - "color_border": 6067854, - "color": 0, - "id": 5171, - "typ": 0, - "is_light": 1, - "ruid": 12246, - "guard_level": 0, - "score": 0, - "guard_icon": "", - "honor_icon": "", - "v2_medal_color_start": "#5762A799", - "v2_medal_color_end": "#5762A799", - "v2_medal_color_border": "#5762A799", - "v2_medal_color_text": "#FFFFFFFF", - "v2_medal_color_level": "#000B7099", - "user_receive_count": 0 - } - } - ], - "count": 15, - "close_space_medal": 0, - "only_show_wearing": 0, - "name": "社会易姐QwQ", - "icon": "https://i0.hdslb.com/bfs/face/aebb2639a0d47f2ce1fec0631f412eaf53d4a0be.jpg", - "uid": 645769214, - "level": 6 - } -} -``` - -
diff --git a/docs/user/official_role.md b/docs/user/official_role.md deleted file mode 100644 index fb70aac..0000000 --- a/docs/user/official_role.md +++ /dev/null @@ -1,12 +0,0 @@ -# 用户认证类型一览 -| ID | 认证类型 | 详细类型 | -| -- | ------- | ------- | -| 0 | 无 | | -| 1 | 个人认证 | 知名UP主 | -| 2 | 个人认证 | 大V达人 | -| 3 | 机构认证 | 企业 | -| 4 | 机构认证 | 组织 | -| 5 | 机构认证 | 媒体 | -| 6 | 机构认证 | 政府 | -| 7 | 个人认证 | 高能主播 | -| 9 | 个人认证 | 社会知名人士 | \ No newline at end of file diff --git a/docs/user/register.md b/docs/user/register.md deleted file mode 100644 index 21be1d6..0000000 --- a/docs/user/register.md +++ /dev/null @@ -1,100 +0,0 @@ -# 用户注册 - -## 人机验证 - -[完成人机验证(参考验证登录)](../login/login_action/readme.md#验证登录) - -完成后得到`key`, `challenge`, `validate`, `seccode`四个参数 - -## 发送短信验证码 - -[发送短信验证码(参考短信登录)](../login/login_action/SMS.md#发送短信验证码(web端)) - -**注意不同的是这里type=1而非21**,推测此参数决定短信内容 - -```bash -curl 'https://passport.bilibili.com/web/sms/general/v2/send' \ - --data-urlencode 'key=6eeb28e7bbd64b389da2be3a2778c7e3' \ - --data-urlencode 'captchaType=6' \ - --data-urlencode 'type=1' \ - --data-urlencode 'cid=1' \ - --data-urlencode 'tel=13888888888' \ - --data-urlencode 'challenge=c52148f88a28b6011db52bb213483ee8' \ - --data-urlencode 'validate=a98841cd6ea58e1b1f5783fca73cddb6' \ - --data-urlencode 'seccode=a98841cd6ea58e1b1f5783fca73cddb6|jordan' -``` - -
-查看示例 - -```json -{ - "code": 0, - "message": "验证码短信已下发" -} -``` - -
- -## 提交注册请求 - -> https://passport.bilibili.com/web/reg/tel - -*请求方式:POST* - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------- | ---- | ---------------- | ------ | ------------------------------------------------------------ | -| cid | num | 国际冠字码 | 必要 | 可以从 [获取国际冠字码](../login/login_action/SMS.md#获取国际冠字码_web端) 接口中获取 | -| tel | num | 手机号码 | 必要 | | -| code | num | 短信验证码 | 必要 | | -| nickName | str | 昵称 | 必要 | | -| pwd | str | 密码 | 必要 | 密码为明文 | -| plat | num | 0 | 必要 | 平台? | -| gourl | str | 注册成功跳转地址 | 非必要 | 默认为主页`https://www.bilibili.com/` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------- | -| code | num | 返回值 | 0:成功
1005:验证码错误
1007:验证码过期 | -| message | str | 错误信息 | 成功时无此字段 | -| data | obj | 信息本体 | 只在成功时存在 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ---------- | ----------------------------- | -| redirectUrl | str | 跳转链接 | | -| hint | str | "注册成功" | 成功后不提示成功还能提示什么? | -| in_reg_audit | num | (?) | | - -```bash -curl 'https://passport.bilibili.com/web/reg/tel' \ - --data-urlencode 'plat=0' \ - --data-urlencode 'cid=1' \ - --data-urlencode 'tel=13888888888' \ - --data-urlencode 'code=121314' \ - --data-urlencode 'nickName=萌系小妹纸わ' - --data-urlencode 'pwd=Password1234' \ - --data-urlencode 'gourl=https://www.bilibili.com' -``` - -
-查看示例 - -```json -{ - "code": 0, - "data": { - "redirectUrl": "https://www.bilibili.com", - "hint": "注册成功", - "in_reg_audit": 0 - } -} -``` - -
\ No newline at end of file diff --git a/docs/user/relation.md b/docs/user/relation.md deleted file mode 100644 index b8d4fa0..0000000 --- a/docs/user/relation.md +++ /dev/null @@ -1,2724 +0,0 @@ -# 用户关系相关 - -## 查询关系列表 - - - -### 关系列表对象 - -以下说明中的 “目标用户” 指被查询的用户,“对方” 指返回的关系列表中的用户。 - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ------------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------- | -| mid | num | 用户 mid | | -| attribute | num | 对方对于**自己**的关系属性 | 0:未关注
~~1:悄悄关注(现已下线)~~
2:已关注
6:已互粉
128:已拉黑 | -| mtime | num | 对方关注目标用户时间 | 秒级时间戳
互关后刷新 | -| tag | 默认分组:null
存在至少一个分组:array | 目标用户将对方分组到的 id | | -| special | num | 目标用户特别关注对方标识 | 0:否
1:是 | -| contract_info | obj | 契约计划相关信息 | | -| uname | str | 用户昵称 | | -| face | str | 用户头像url | | -| sign | str | 用户签名 | | -| face_nft | num | 是否为 NFT 头像 | 0:非 NFT 头像
1:NFT 头像 | -| official_verify | obj | 认证信息 | | -| vip | obj | 会员信息 | | -| name_render | 有效时:obj
无效时:null | 昵称渲染信息 | | -| nft_icon | str | (?) | | -| rec_reason | str | 推荐该用户的原因 | 大多数情况下为空;如:`xxx关注了TA`、`xx粉丝 xx视频` | -| track_id | str | 内部记录id | 大多数情况下为空;如:`up_rec_0.router-main-2021485-5f84c987cf-dv8fg.1746380060327.607` | -| follow_time | str | (?) | | - -`list`中的对象中的`tag`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ------------------------ | ---- | -| 0 | num | 位于分组 1 的分组 id | | -| n | num | 位于分组(n+1)的分组 id | | -| …… | num | …… | …… | - -`list`中的对象中的`contract_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------------------ | ----------------------------------------------------------- | -| is_contract | bool | 目标用户是否为对方的契约者 | 仅当为 `true` 时才有此项 | -| is_contractor | bool | 对方是否为目标用户的契约者 | 仅当为 `true` 时才有此项 | -| ts | num | 对方成为目标用户的契约者的时间 | 秒级时间戳,仅当 `is_contractor` 项的值为 `true` 时才有此项 | -| user_attr | num | 对方作为目标用户的契约者的属性 | 1:老粉
否则为原始粉丝
仅当有特殊属性时才有此项 | - -`list`中的对象中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------------------------------- | -| type | num | 用户认证类型 | -1:无
0:UP 主认证
1:机构认证 | -| desc | str | 用户认证信息 | 无为空 | - -`list`中的对象中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ----------------------------------------------- | -| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | -| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | -| dueRemark | str | (?) | | -| accessStatus | num | (?) | | -| vipStatus | num | 大会员状态 | 0:无
1:有 | -| vipStatusWarn | str | (?) | | -| themeType | num | (?) | | -| label | obj | (?) | | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| path | str | (?) | | - -### 查询用户粉丝明细(新) - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 - -- 当请求参数 `from=main` 且目标用户为自己时,返回列表按照**智能推荐算法**排序,**仅返回前 1000 名粉丝**,且返回的列表中不含 `mtime` 字段 -- 否则,返回列表按关注时间排序,此时**当前用户仅返回前 1000 名粉丝,其他用户仅返回前 100 名粉丝**,若继续往后查询则返回空列表 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| -------------- | ---- | ---------------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| vmid | num | 目标用户 mid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1 | -| offset | str | 偏移量 | 非必要 | 从上次请求的响应数据中的 `data.offset` 获取
此项有效且不为 `rcmd` 时会从此偏移量开始返回粉丝列表,忽略参数 `pn` | -| last_access_ts | num | 上次访问粉丝列表的时间 | 非必要 | 秒级时间戳,从[获取自己粉丝列表的未读状态](#获取自己粉丝列表的未读状态)接口获取
当按照**智能推荐算法**排序时,会优先展示此时间后关注的粉丝 | -| from | str | 请求来源 | 非必要 | 当为 `main` 且目标用户为自己时,粉丝列表按照**智能推荐算法**排序,此时响应数据中的 `data.list` 的成员中的 `rec_reason` 与 `track_id` 为非空 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22118:由于该用户隐私设置,粉丝列表不可见 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ----------------------------------------------------------------------------------------------------- | -| list | array | 明细列表 | | -| offset | str | 偏移量 | 供下次请求使用
普通:`{列表最后的粉丝的 mtime}:{列表最后的粉丝的 mid}`
智能推荐算法:`rcmd` | -| re_version | num | (?) | | -| total | num | 粉丝总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ------------ | ---------------------------------- | -| 0 | obj | 粉丝 1 | 详见 [关系列表对象](#关系列表对象) | -| n | obj | 粉丝 (n+1) | | -| …… | obj | …… | …… | - -**示例:** - -获取用户`mid=293793435`的粉丝明细 - -```shell -curl -G 'https://api.bilibili.com/x/relation/fans' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 289796932, - "attribute": 0, - "mtime": 1746199088, - "tag": null, - "special": 0, - "contract_info": {}, - "uname": "Astlinga_星灵", - "face": "https://i1.hdslb.com/bfs/face/005264524d05c0b8c132acc3ee88bb839351025b.jpg", - "sign": "", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1734278400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - }, - { - "mid": 3494375621396821, - "attribute": 0, - "mtime": 1746098997, - "tag": null, - "special": 0, - "contract_info": {}, - "uname": "JSRCode", - "face": "https://i1.hdslb.com/bfs/face/f6c74700c72d27ae224c5311634b4a3770e3cdcf.jpg", - "sign": "一个喜欢码代码的高中牲", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - } - ], - "offset": "1746098997:3494375621396821", - "re_version": 0, - "total": 3776 - } -} -``` - -
- -### 查询用户粉丝明细(旧) - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 - -**本接口仅可返回前 1000 名粉丝**,若继续往后查询则返回空列表 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ------------------------------------ | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| vmid | num | 目标用户 mid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1
仅可查看前 1000 名粉丝 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22118:由于该用户隐私设置,粉丝列表不可见 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 粉丝总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ------------ | ---------------------------------- | -| 0 | obj | 粉丝 1 | 详见 [关系列表对象](#关系列表对象) | -| n | obj | 粉丝 (n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -获取用户`mid=293793435`的粉丝明细 - -```shell -curl -G 'https://api.bilibili.com/x/relation/followers' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 289796932, - "attribute": 0, - "mtime": 1746199088, - "tag": null, - "special": 0, - "contract_info": {}, - "uname": "Astlinga_星灵", - "face": "https://i1.hdslb.com/bfs/face/005264524d05c0b8c132acc3ee88bb839351025b.jpg", - "sign": "", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1734278400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - }, - { - "mid": 3494375621396821, - "attribute": 0, - "mtime": 1746098997, - "tag": null, - "special": 0, - "contract_info": {}, - "uname": "JSRCode", - "face": "https://i1.hdslb.com/bfs/face/f6c74700c72d27ae224c5311634b4a3770e3cdcf.jpg", - "sign": "一个喜欢码代码的高中牲", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - } - ], - "re_version": 0, - "total": 3776 - } -} -``` - -
- -### 查询用户粉丝明细 - -> - -*请求方式:GET* - -认证方式:无 - -返回目标用户前100个粉丝 - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | --------- | -| vmid | num | 目标用户 mid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 20 | -| pn | num | 页码 | 非必要 | 默认为 1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------- | -| code | num | 返回值 | | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | -| ts | num | 时间戳 | | - -`data.list`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------- | ---- | -| mid | num | 用户mid | | -| uname | str | 用户名 | | -| face | str | 头像 | | -| attribute | num | | | - - -**示例:** - -```shell -curl 'https://line3-h5-mobile-api.biligame.com/game/center/h5/user/relationship/follower_list?vmid=504140200&pn=5&ps=21' -``` -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "list": [ - { - "mid": "3493078644034173", - "attribute": 0, - "uname": "雨天下小雪啦", - "face": "//i0.hdslb.com/bfs/face/28ad110baa58db9265eca657fcba501589981555.jpg", - "attestation_display": { - "type": 0, - "desc": "" - } - }, - { - "mid": "1356049904", - "attribute": 0, - "uname": "一埋子", - "face": "//i2.hdslb.com/bfs/face/84356fd3b183284bc11b011b676432badb4096bf.jpg", - "attestation_display": { - "type": 0, - "desc": "" - } - }, - ] - }, - "ts": 1748829553371, - "request_id": "0684785391344bdc85e4e701bed41b1c" -} -``` -
- -### 获取自己粉丝列表的未读状态 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -调用此接口后会重置未读状态 - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------------------- | ---------------------------------- | -| count | num | 自上次访问后新增的粉丝个数 | | -| time | num | 上次访问粉丝列表时间 | 秒级时间戳;当没有新增粉丝时为 `0` | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/relation/followers/unread/count' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 55, - "time": 1743677191 - } -} -``` - -
- -### 查询用户关注明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -本接口只有登录、标头 `referer` 为 `bilibili.com` 下的子域名、UA 不含 `python` 时才会返回列表 - -登录可看当前用户全部,其他用户仅可查看前 100 个,访问超过 100 个时返回空列表(但 `code` 值为 `0`) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ----------------------------------------------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| vmid | num | 目标用户 mid | 必要 | | -| order_type | str | 排序方式 | 非必要 | 当目标用户为自己时有效
按照关注顺序排列:留空
按照最常访问排列:attention | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1
其他用户仅可查看前 100 个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-352:请求被拦截
-400:请求错误
22115:用户已设置隐私,无法查看 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 关注总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ----------- | -------------------------------- | -| 0 | obj | 关注1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 关注(n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -获取用户`mid=293793435`的关注明细,按照关注顺序 - -```shell -curl -G 'https://api.bilibili.com/x/relation/followings' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'order_type=' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [{ - "mid": 14082, - "attribute": 2, - "mtime": 1584271945, - "tag": null, - "special": 0, - "contract_info": {}, - "uname": "山新", - "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", - "sign": "都说了是天依爹地,不是妈咪。\r私信有点多回复不过来~商业合作啥的请移步Weibo私信@山新 哦哦哦~", - "official_verify": { - "type": 0, - "desc": "配音演员、声优。洛天依声源提供者。" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1601654400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - }, { - "mid": 420831218, - "attribute": 2, - "mtime": 1584208169, - "tag": [207542], - "special": 0, - "contract_info": {}, - "uname": "支付宝Alipay", - "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", - "sign": "阿支来了,关注点赞转发投币四连走起!", - "official_verify": { - "type": 1, - "desc": "支付宝官方账号" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1585065600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "avatar_subscript_url": "" - }, - "name_render": {}, - "nft_icon": "", - "rec_reason": "", - "track_id": "", - "follow_time": "" - }], - "re_version": 0, - "total": 1028 - } -} -``` - -
- -### 查询用户关注明细2 - -> - -*请求方式:GET* - -仅可查看前 5 页,对于已设置可见性隐私关注列表的用户,响应数据中的 `data.list` 为 null,且 `data.total` 为0 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ----------------------------------------------------------- | -| vmid | num | 目标用户 mid | 必要 | | -| order | str | 排序方式 | 非必要 | 按照降序排列:desc
按照升序排列:asc
默认降序排列 | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1
仅可查看前 5 页 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
22007:访问超过 5 页 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 关注总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ----------- | ------------------------------------------------- | -| 0 | obj | 关注 1 | 与 [关系列表对象](#关系列表对象) 数据结构**不同** | -| n | obj | 关注(n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -数组`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ------------------------------------------- | ------------ | --------------------------------------- | -| mid | num | 用户 mid | | -| attribute | num | 关注属性 | 0:未关注
2:已关注
6:已互粉 | -| mtime | num | 关注对方时间 | 时间戳
互关后刷新 | -| tag | 默认分组:null
存在至少一个分组:array | 分组 id | | -| special | num | 特别关注标志 | 0:否
1:是 | -| uname | str | 用户昵称 | | -| face | str | 用户头像 url | | -| sign | str | 用户签名 | | -| official_verify | obj | 认证信息 | | -| vip | obj | 会员信息 | | -| live | num | 是否直播 | 0:未直播
1:直播中 | - -数组`list`中的对象中的`tag`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ------------------------ | ---- | -| 0 | num | 位于分组 1 的分组 id | | -| n | num | 位于分组(n+1)的分组 id | | -| …… | num | …… | …… | - -`list`中的对象中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---------------------------------------- | -| type | num | 用户认证类型 | -1:无
0:UP主认证
1:机构认证 | -| desc | str | 用户认证信息 | 无为空 | - -`list`中的对象中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ----------------------------------------------- | -| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | -| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | -| dueRemark | str | (?) | | -| accessStatus | num | (?) | | -| vipStatus | num | 大会员状态 | 0:无
1:有 | -| vipStatusWarn | str | (?) | | -| themeType | num | (?) | | -| label | obj | (?) | | - -`vip`中的`label`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------ | ---- | -| path | str | (?) | | - -**示例:** - -获取用户`mid=293793435`的关注明细,按照关注顺序 - -```shell -curl -G 'https://app.biliapi.net/x/v2/relation/followings' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [{ - "mid": 14082, - "attribute": 2, - "mtime": 1584271945, - "tag": null, - "special": 0, - "uname": "山新", - "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", - "sign": "都说了是天依爹地,不是妈咪。\r私信有点多回复不过来~商业合作啥的请移步Weibo私信@山新 哦哦哦~", - "official_verify": { - "type": 0, - "desc": "配音演员、声优。洛天依声源提供者。" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1601654400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "live": 0 - }, { - "mid": 420831218, - "attribute": 2, - "mtime": 1584208169, - "tag": [207542], - "special": 0, - "uname": "支付宝Alipay", - "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", - "sign": "阿支来了,关注点赞转发投币四连走起!", - "official_verify": { - "type": 1, - "desc": "支付宝官方账号" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1585065600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - }, - "live": 0 - }], - "re_version": 3228575555, - "total": 699 - } -} -``` - -
- -### 查询用户关注明细3 - -> - -*请求方式:GET* - -对于设置了可见性隐私关注列表的用户会返回空列表 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | -------- | -| vmid | num | 目标用户mid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为20 | -| pn | num | 页码 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 成功时无此项 | -| data | obj | 信息本体 | 失败时无此项 | -| ts | num | 当前时间戳 | 单位为毫秒 | -| request_id | str | 请求id | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ---- | -| list | array | 明细列表 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------- | ---------------- | -| 0 | obj | 关注1 | | -| n | obj | 关注(n+1) | 按照关注顺序排列 | -| …… | obj | …… | …… | - -数组`list`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ------------------------------ | --------------------------------------- | -| mid | str | 用户mid | | -| attribute | num | 对方对于**目标用户**的关注属性 | 0:未关注
2:已关注
6:已互粉 | -| uname | str | 用户昵称 | | -| face | str | 用户头像url | | -| attention_display | obj | 用户认证信息 | | - -`attention_display`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------------------------------------------------------ | -| type | num | 是否认证 | 0:无
1:UP主专业认证
2:UP主认证
3:机构认证 | -| desc | str | 认证信息 | | - -**示例:** - -获取用户`mid=293793435`的关注明细 - -```shell -curl -G 'https://line3-h5-mobile-api.biligame.com/game/center/h5/user/relationship/following_list' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "list": [{ - "mid": "14082", - "attribute": 2, - "uname": "山新", - "face": "https://i0.hdslb.com/bfs/face/74c82caee6d9eb623e56161ea8ed6d68afabfeae.jpg", - "attestation_display": { "type": 0, "desc": "" } - }, { - "mid": "420831218", - "attribute": 2, - "uname": "支付宝Alipay", - "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", - "attestation_display": { "type": 3, "desc": "bilibili机构认证:支付宝官方账号" } - }] - }, - "ts": 1677410818395, - "request_id": "d9d541b9f2d24e21821e2d6d2d16c17d" -} -``` - -
- -### 搜索关注明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | --------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| vmid | str | 目标用户 mid | 必要 | | -| name | str | 搜索关键词 | 非必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1 | - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
22007:访问超过 5 页 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 关注总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------- | -------------------------------- | -| 0 | obj | 匹配项目 1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 匹配项目(n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -搜索我的关注列表中关键词`warma` - -```shell -curl -G 'https://api.bilibili.com/x/relation/followings/search' \ - --data-urlencode 'vmid=293793435' \ - --data-urlencode 'name=warma' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 53456, - "attribute": 2, - "mtime": 1586415053, - "tag": [-10], - "special": 1, - "uname": "Warma", - "face": "https://i2.hdslb.com/bfs/face/c1bbee6d255f1e7fc434e9930f0f288c8b24293a.jpg", - "sign": "我是沃玛,做点傻开心的视频。日常发在微博:@_warma_ ", - "official_verify": { - "type": 0, - "desc": "bilibili 知名UP主" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1637424000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - } - ], - "total": 1 - } -} -``` - -
- -### 查询共同关注明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | --------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| vmid | num | 目标用户 mid | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 50 | -| pn | num | 页码 | 非必要 | 默认为 1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 关注总数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------- | -------------------------------- | -| 0 | obj | 共同关注 1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 共同关注(n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -获取自己与用户`mid=2`的共同关注明细 - -```shell -curl -G 'https://api.bilibili.com/x/relation/same/followings' \ - --data-urlencode 'vmid=2' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 116683, - "attribute": 2, - "mtime": 1564627532, - "tag": null, - "special": 0, - "uname": "=咬人猫=", - "face": "https://i0.hdslb.com/bfs/face/8fad84a4470f3d894d8f0dc95555ab8f2cb10a83.jpg", - "sign": "面瘫女仆酱~小粗腿~事业线什么的!!吐槽你就输了!喵~", - "official_verify": { - "type": 0, - "desc": "bilibili 2019百大UP主、高能联盟成员" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1618934400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - }, - { - "mid": 517717593, - "attribute": 2, - "mtime": 1592126052, - "tag": [207542], - "special": 0, - "uname": "上海爱丽丝幻乐团", - "face": "https://i0.hdslb.com/bfs/face/851a9191cbe93e66304d7577c0f6f83834e52109.jpg", - "sign": "日本同人社团 上海爱丽丝幻乐团", - "official_verify": { - "type": 0, - "desc": "上海爱丽丝幻乐团官方账号" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1593792000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - } - ], - "re_version": 2498273968, - "total": 38 - } -} -``` - -
- -### 查询悄悄关注明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------- | -------------------------------- | -| 0 | obj | 悄悄关注 1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 悄悄关注(n+1) | 按照操作顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/relation/whispers' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 178429408, - "attribute": 1, - "mtime": 1605972105, - "tag": null, - "special": 0, - "uname": "老弟一号", - "face": "https://i2.hdslb.com/bfs/face/21426275f3d3149b96b88783275205ba574c09e3.jpg", - "sign": "萌新硬件玩家,前垃圾佬~(◦˙▽˙◦某宝店 老弟一号 粉丝群679540094商务合作V13869651328", - "official_verify": { - "type": 0, - "desc": "知识领域优质UP主" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1632499200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - } - ], - "re_version": 2137574562 - } -} -``` - -
- -### 查询互相关注明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -查询与自己互关的用户明细,可看全部 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------- | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ----------- | -------------------------------- | -| 0 | obj | 互关 1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 互关(n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/relation/friends' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 596000, - "attribute": 6, - "mtime": 1685110154, - "tag": null, - "special": 0, - "uname": "椛椛在睡觉", - "face": "https://i2.hdslb.com/bfs/face/365c1ef3b2a3afe21d6832796338fad5119b2592.jpg", - "sign": "欢迎来找椛椛玩~ https://blogs.momiji-jin.com/", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1702742400000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "avatar_subscript_url": "" - }, - "nft_icon": "", - "rec_reason": "", - "track_id": "" - }, - { - "mid": 24022863, - "attribute": 6, - "mtime": 1685026230, - "tag": [-10], - "special": 1, - "uname": "黄禄轩电脑专用账号", - "face": "https://i0.hdslb.com/bfs/face/a70ec7d2a3822980a915ef4b30371af0cbc79132.jpg", - "sign": "若要私信,请私信「黄禄轩手机专用账号」http://space.bilibili.com/17640193/,群:410311648", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1686412800000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "avatar_subscript_url": "" - }, - "nft_icon": "", - "rec_reason": "", - "track_id": "" - }, - { - "mid": 85438718, - "attribute": 6, - "mtime": 1684759843, - "tag": [194110], - "special": 0, - "uname": "忘忧北萱草Official", - "face": "https://i2.hdslb.com/bfs/face/68d8cba01aab907dbb2cf2e17074f20947156237.jpg", - "sign": "现已加入 OrangeFire 豪华套餐!", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 2, - "vipDueDate": 1691683200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "avatar_subscript_url": "" - }, - "nft_icon": "", - "rec_reason": "", - "track_id": "" - }, - { - "mid": 41620134, - "attribute": 6, - "mtime": 1684759649, - "tag": null, - "special": 0, - "uname": "Tiggy_Chan", - "face": "https://i0.hdslb.com/bfs/face/8c8d9f43eda207f8cb8503bfdf6cc3802a1cd6c1.jpg", - "sign": "此号只发科技类视频,娱乐类转至:虎子酱233", - "face_nft": 0, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1669219200000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "avatar_subscript_url": "" - }, - "nft_icon": "", - "rec_reason": "", - "track_id": "" - }, - // …… - ], - "re_version": 0 - } -} -``` - -
- -### 查询黑名单明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | --------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| ps | num | 每页项数 | 非必要 | 默认为 50,且最多为50,大于50则按50输出 | -| pn | num | 页码 | 非必要 | 默认为 1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ------------ | ---- | -| list | array | 明细列表 | | -| re_version | num | (?) | | -| total | num | 黑名单总计数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | -------------- | -------------------------------- | -| 0 | obj | 黑名单 1 | 见 [关系列表对象](#关系列表对象) | -| n | obj | 黑名单 (n+1) | 按照添加顺序排列 | -| …… | obj | …… | …… | - -**示例:** - -获取黑名单明细 - -```shell -curl -G 'https://api.bilibili.com/x/relation/blacks' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "mid": 22179720, - "attribute": 128, - "mtime": 1603032789, - "tag": null, - "special": 0, - "uname": "咩2016", - "face": "https://i0.hdslb.com/bfs/face/41fe435a7e62eae605a5908652f32f3afff2ae74.jpg", - "sign": "", - "official_verify": { - "type": 0, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - }, - { - "mid": 16174624, - "attribute": 128, - "mtime": 1603026420, - "tag": null, - "special": 0, - "uname": "其实死亡没有那么痛", - "face": "https://i2.hdslb.com/bfs/face/79257f5a2e7194a71337ccca5927afba7706d316.jpg", - "sign": "等我,我马上就来", - "official_verify": { - "type": 0, - "desc": "" - }, - "vip": { - "vipType": 0, - "vipDueDate": 0, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - } - ], - "re_version": 897205356, - "total": 2 - } -} -``` - -
- -## 操作关系 - - - -### 操作用户关系 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fid | num | 目标用户mid | 必要 | | -| act | num | 操作代码 | 必要 | **操作代码见下表** | -| re_src | num | 关注来源代码 | 非必要 | 包月充电:1
个人空间:11
视频:14
评论区:15
视频播放器结束页面:17
H5推荐关注:58
H5关注列表:106
H5粉丝列表:107
专栏:115
私信:118
搜索:120
视频播放器左上角关注按钮:164
H5共同关注:167
创作激励计划:192
活动页面:222
联合投稿视频:229
消息中心点赞详情:235
视频播放器关注弹幕:245 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -操作代码`act`: - -| 代码 | 含义 | 备注 | -| ---- | ------------ | ---------------------------------------------------- | -| 1 | 关注 | 无法对已注销或不存在的用户进行此操作 | -| 2 | 取关 | | -| 3 | 悄悄关注 | **现已下线**,使用本操作代码请求接口会提示“请求错误” | -| 4 | 取消悄悄关注 | | -| 5 | 拉黑 | 无法对已注销或不存在的用户进行此操作 | -| 6 | 取消拉黑 | | -| 7 | 踢出粉丝 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
22001:不能对自己进行此操作
22002:因对方隐私设置,你还不能关注
22003:关注失败,请将该用户移除黑名单之后再试
22008:黑名单达到上限
22009:关注失败,已达关注上限
22013:账号已注销,无法完成操作
22014:已经关注用户,无法重复关注
22120:重复加入黑名单
40061:用户不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -关注`mid=14082`的用户 - -```shell -curl 'https://api.bilibili.com/x/relation/modify' \ - --data-urlencode 'fid=14082' \ - --data-urlencode 'act=1' \ - --data-urlencode 're_src=11' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 批量操作用户关系 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -此接口只支持关注和拉黑操作 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ----------------------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fids | nums | 目标用户 mid 列表 | 必要 | 每个成员之间用 `,` 间隔,最多 50 个成员,不能包含自己的 mid | -| act | num | 操作代码 | 必要 | 同上
仅可为 1 或 5,故只能进行批量关注和拉黑 | -| re_src | num | 关注来源代码 | 非必要 | 同上 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-111:csrf校验失败
-400:请求错误
22003:用户位于黑名单 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ------------------- | ---- | -| failed_fids | array | 操作失败的 mid 列表 | | - -`data`中的`failed_fids`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------------- | ---- | -| 0 | num | 操作失败的 mid 1 | | -| n | num | 操作失败的 mid(n+1) | | -| …… | num | …… | …… | - -**示例:** - -批量关注`mid=1,2,3,4,5`的用户 - -```shell -curl 'https://api.bilibili.com/x/relation/batch/modify' \ - --data-urlencode 'fid=1,2,3,4,5' \ - --data-urlencode 'act=1' \ - --data-urlencode 're_src=11' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "failed_fids": [] - } -} -``` - -
- -## 查询关系属性 - -### 关系属性对象 - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ------------------------------------------- | ------------ | --------------------------------------------------------------------------------------- | -| mid | num | 目标用户 mid | | -| attribute | num | 关系属性 | 0:未关注
~~1:悄悄关注(已弃用)~~
2:已关注
6:已互粉
128:已拉黑 | -| mtime | num | 关注对方时间 | 时间戳
未关注为 0 | -| tag | 默认分组:null
存在至少一个分组:array | 分组 id | | -| special | num | 特别关注标志 | 0:否
1:是 | - -`tag`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------------- | ---- | -| 0 | num | 位于分组 1 的分组 | | -| n | num | 位于分组(n+1)的分组 | | -| …… | num | …… | …… | - -### 查询用户与自己关系(仅关注) - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fid | num | 目标用户 mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 详见 [关系属性对象](#关系属性对象) | - -**示例:** - -可得对于`mid=258150656`的用户,在`2018/10/28 0:51:41`时关注,且设为特别关注,并位于为`-10`分组中 - -```shell -curl -G 'https://api.bilibili.com/x/relation' \ - --data-urlencode 'fid=258150656' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 258150656, - "attribute": 2, - "mtime": 1540659101, - "tag": [-10], - "special": 1 - } -} -``` - -
- -### 查询用户与自己关系(互相关系) - -> 接口1: - -> 接口2: - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -鉴权方式(仅接口1):[Wbi 签名](../misc/sign/wbi.md) - -~~该接口的旧版 API :~~(已废弃,不建议使用) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ------------------------------------ | -| access_key | str | APP登录Token | APP方式必要 | | -| mid | num | 目标用户mid | 必要 | | -| w_rid | str | Wbi 签名 | 仅接口1必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | 当前时间戳 | 仅接口1必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------------------- | ---------------------------------- | -| relation | obj | 目标用户对于当前用户的关系 | 详见 [关系属性对象](#关系属性对象) | -| be_relation | obj | 当前用户对于目标用户的关系 | 详见 [关系属性对象](#关系属性对象) | - -**示例:** - -可得对于`mid=15858903`的用户,在`2019/1/24 14:24:19`时关注了对方,且互相关注,自己将对方特别关注,并同时位于为`-10`和`194110`的分组中,对方也将自己设为特别关注,并同时位于为`-10`和`56502`的分组中(虽然我看不到) - -Wbi 签名的 `wts`、`w_rid`生成方式详见 [Wbi 签名](../misc/sign/wbi.md) 文档 - -```shell -curl -G 'https://api.bilibili.com/x/space/acc/relation' \ - --data-urlencode 'mid=15858903' \ - --data-urlencode 'wts=1686015899' \ - --data-urlencode 'w_rid=e10a3c566c9be80a7cebe7bcdf262588' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "relation": { - "mid": 15858903, - "attribute": 6, - "mtime": 1548311059, - "tag": [-10, 194110, 248468], - "special": 1 - }, - "be_relation": { - "mid": 293793435, - "attribute": 6, - "mtime": 1548311059, - "tag": [56502, -10], - "special": 1 - } - } -} -``` - -
- -### 批量查询用户与自己关系 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ----------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fids | nums | 目标用户 mid | 必要 | 每个之间用`,`间隔,无成员限制 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ---------- | ---------------------------------- | -| {用户mid} | obj | 关注的用户 | 详见 [关系属性对象](#关系属性对象) | -| …… | obj | …… | 下同 | - -**示例:** - -批量查询`mid=1,2,3,4,5`的关系 - -```shell -curl -G 'https://api.bilibili.com/x/relation/relations' \ - --data-urlencode 'fid=258150656' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "1": { - "mid": 1, - "attribute": 2, - "mtime": 1601654227, - "tag": null, - "special": 0 - }, - "2": { - "mid": 2, - "attribute": 2, - "mtime": 1601654225, - "tag": null, - "special": 0 - } - } -} -``` - -
- -## 关注分组相关 - -分组 id 特殊值: - -| id | 含义 | -| --- | -------- | -| 0 | 默认分组 | -| -10 | 特别关心 | - -### 查询关注分组列表 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 分组列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ----------- | ---- | -| 0 | obj | 分组 1 | | -| n | obj | 分组(n+1) | | -| …… | num | …… | …… | - -数组`data`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | ------------------------------ | -| tagid | num | 分组 id | -10:特别关注
0:默认分组 | -| name | str | 分组名称 | | -| count | num | 分组成员数 | | -| tip | str | 提示信息 | | - -**示例:** - -查询所有的分组的名字以及id - -```shell -curl 'https://api.bilibili.com/x/relation/tags' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "tagid": -10, - "name": "特别关注", - "count": 19, - "tip": "第一时间收到该分组下用户更新稿件的通知" - }, - { - "tagid": 0, - "name": "默认分组", - "count": 340, - "tip": "" - }, - { - "tagid": 194110, - "name": "基友们", - "count": 127, - "tip": "" - }, - { - "tagid": 194111, - "name": "我的同学", - "count": 22, - "tip": "" - }, - // …… - ] -} -``` - -
- -### 查询关注分组明细 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -只可查询属于自己的分组 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ------------------------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| tagid | num | 分组 id | 必要 | 0:默认分组
-10:特别关注
-20:所有 | -| order_type | str | 排序方式 | 非必要 | 按照关注顺序排列:留空
按照最常访问排列:attention | -| ps | num | 每页项数 | 非必要 | 默认为 20 | -| pn | num | 页数 | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | -------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
22104:该分组不存在 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 成员列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | --------------- | --------------------------------------- | -| 0 | obj | 成员信息 1 | 与[关系列表对象](#关系列表对象)**不同** | -| n | obj | 成员信息(n+1) | 按照添加顺序排序 | -| …… | obj | …… | …… | - -`data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | --------------- | ----------- | -| mid | num | 用户mid | | -| attribute | num | 关系属性 | 恒为 `0` | -| tag | null | 关注分组id | 恒为 `null` | -| special | num | 是否特别关注 | 恒为 `0` | -| contract_info | obj | 契约计划信息 | | -| uname | str | 用户昵称 | | -| face | str | 用户头像url | | -| sign | str | 用户签名 | | -| face_nft | num | 是否为 NFT 头像 | | -| official_verify | obj | 认证信息 | 具体见下 | -| vip | obj | 会员信息 | | -| live | obj | 直播状态 | 具体见下 | -| nft_icon | str | (?) | | -| rec_reason | str | (?) | | -| track_id | str | (?) | | -| follow_time | str | (?) | | - -`data`中的对象中的`official_verify`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------------------------------- | -| type | num | 用户认证类型 | -1:无
0:UP 主认证
1:机构认证 | -| desc | str | 用户认证信息 | 无为空 | - -`data`中的对象中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------ | ----------------------------------------------- | -| vipType | num | 会员类型 | 0:无
1:月度大会员
2:年度以上大会员 | -| vipDueDate | num | 会员到期时间 | 时间戳 毫秒 | -| dueRemark | str | (?) | | -| accessStatus | num | (?) | | -| vipStatus | num | 大会员状态 | 0:无
1:有 | -| vipStatusWarn | str | (?) | | -| themeType | num | (?) | | -| label | obj | (?) | | - -`data`数组中的对象中的`live`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | ------------------------ | -| live_status | num | 直播状态 | 0:未开播
1:已直播 | -| jump_url | str | 直播链接 | | - -`data`数组中的对象中的`contract_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------------------ | ----------------------------------------------------------- | -| is_contract | bool | 目标用户是否为对方的契约者 | 仅当为 `true` 时才有此项 | -| is_contractor | bool | 对方是否为目标用户的契约者 | 仅当为 `true` 时才有此项 | -| ts | num | 对方成为目标用户的契约者的时间 | 秒级时间戳,仅当 `is_contractor` 项的值为 `true` 时才有此项 | -| user_attr | num | 对方作为目标用户的契约者的属性 | 1:老粉
否则为原始粉丝
仅当有特殊属性时才有此项 | - -**示例:** - -以每页2项的方式获取了id为`207542`分组的第1页的粉丝明细,按照关注顺序 - -```shell -curl -G 'https://api.bilibili.com/x/relation/tag' \ - --data-urlencode 'tagid=207542' \ - --data-urlencode 'order_type=' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "mid": 420831218, - "uname": "支付宝Alipay", - "face": "https://i2.hdslb.com/bfs/face/aaf18aeb2d9822e28a590bd8d878572ca8c59e04.jpg", - "sign": "阿支来了,关注点赞转发投币四连走起!", - "official_verify": { - "type": 1, - "desc": "支付宝官方账号" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1585065600000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 1, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - }, { - "mid": 125086406, - "uname": "MSI微星科技", - "face": "https://i1.hdslb.com/bfs/face/a844760e4e491677615b39399bc761e74c579bb4.jpg", - "sign": "你好,这里是微星显卡官方!专注显卡三十年,欢迎私信咨询或提问MSI", - "official_verify": { - "type": 1, - "desc": "微星科技官方账号" - }, - "vip": { - "vipType": 1, - "vipDueDate": 1540656000000, - "dueRemark": "", - "accessStatus": 0, - "vipStatus": 0, - "vipStatusWarn": "", - "themeType": 0, - "label": { - "path": "" - } - } - }] -} -``` - -
- -### 查询目标用户所在的分组 - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fid | num | 目标用户 mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------- | ---------------------------------- | -| {加入的分组 id} | str | 分组名称 | 若目标用户存在默认分组中,则不显示 | -| …… | str | …… | 下同 | - -**示例:** - -查询用户`mid=319214221`存在的所有分组和名称 - -```shell -curl -G 'https://api.bilibili.com/x/relation/tag/user' \ - --data-urlencode 'fid=319214221' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "-10": "特别关注", - "194111": "我的同学" - } -} -``` - -
- -### 查询所有特别关注 mid - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或 APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ----------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | array | 成员列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | -------------- | ---- | -| 0 | num | 成员 1 mid | | -| n | num | 成员(n+1)mid | | -| …… | num | …… | …… | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/relation/tag/special' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - 500716647, - 32832243, - 53456, - 25944552, - 301839556, - 427494870, - 319214221, - 31949159, - 382666849, - 258318451, - 15858903, - 54992199, - 3379951, - 392279807, - 23215368, - 258150656, - 20165629, - 22179720 - ] -} -``` - -
- -### 创建分组 - - - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| tag | str | 分组名 | 必要 | 最长 16 字符 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22101:分组名称存在不允许的字符
22102:分组数量超过限制
22103:分组名过长
22106:该分组已经存在 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | --------------- | ---- | -| tagid | num | 创建的分组的 id | | - -**示例:** - -创建了名为`测试`的分组,得到id为`216677` - -```shell -curl 'https://api.bilibili.com/x/relation/tag/create' \ - --data-urlencode 'tag=测试' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "tagid": 216677 - } -} -``` - -
- -### 重命名分组 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ------------ | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| tagid | num | 分组 id | 必要 | | -| name | str | 新名称 | 必要 | 最长 16 字符 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22101:分组名称存在不允许的字符
22103:分组名过长
22104:该分组不存在 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -把id为`194112`的分组更名为`膜法师` - -```shell -curl 'https://api.bilibili.com/x/relation/tag/update' \ - --data-urlencode 'tagid=194112' \ - --data-urlencode 'name=膜法师' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 删除分组 - - - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| tagid | num | 分组 id | 必要 | | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -示例: - -删除分组id为`216699`的分组 - -```shell -curl 'https://api.bilibili.com/x/relation/tag/del' \ - --data-urlencode 'tagid=216699' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 修改分组成员 - - - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -如需删除分组中的成员,请将`tagids`设为 0,即移动至默认分组,而不是取关 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ----------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fids | nums | 目标用户 mid 列表 | 必要 | 每个之间用`,`间隔 | -| tagids | nums | 分组 id 列表 | 必要 | 每个之间用`,`间隔 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -把关注用户`mid=205631797`同时添加分组关系到id为`-10`和`207542`的分组中 - -```shell -curl 'https://api.bilibili.com/x/relation/tags/addUsers' \ - --data-urlencode 'fids=205631797' \ - --data-urlencode 'tagids=-10,207542' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 复制关注到分组 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------------------- | --------------- | ----------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| fids | nums | 待复制的用户 mid 列表 | 必要 | 每个之间用`,`间隔 | -| tagids | nums | 目标分组 id 列表 | 必要 | 每个之间用`,`间隔 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -把关注用户`mid=4856007`和`mid=326499679`同时复制到为`231305`的分组id中 - -```shell -curl 'https://api.bilibili.com/x/relation/tags/copyUsers' \ - --data-urlencode 'fids=4856007,326499679' \ - --data-urlencode 'tagids=231305' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 移动关注到分组 - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA)或 APP - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------ | ---- | ------------------------- | --------------- | ----------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| beforeTagids | nums | 原分组 id 列表 | 必要 | 每个之间用`,`间隔 | -| afterTagids | nums | 新分组 id 列表 | 必要 | 每个之间用`,`间隔 | -| fids | nums | 待移动的用户 mid 列表 | 必要 | 每个之间用`,`间隔 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-111:csrf校验失败
-101:账号未登录
-400:请求错误
22104:分组不存在
22105:未关注 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | - -**示例:** - -把关注用户`mid=321173469`和`mid=327086920`同时从id为`207542`的分组移动到为`231305`的分组中 - -```shell -curl 'https://api.bilibili.com/x/relation/tags/moveUsers' \ - --data-urlencode 'beforeTagids=207542' \ - --data-urlencode 'afterTagids=23130' \ - --data-urlencode 'fids=321173469,327086920' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/user/space.md b/docs/user/space.md deleted file mode 100644 index 24dd9cb..0000000 --- a/docs/user/space.md +++ /dev/null @@ -1,4981 +0,0 @@ -# 用户空间相关 - -## 主页 - - - -### 置顶视频 - -#### 查询用户置顶视频 - ->https://api.bilibili.com/x/space/top/arc - -*请求方式:GET* - -粉丝在其主页上可见 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| vmid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53016:没有置顶视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ------------------------------ | ------------------------------------------------------------ | -| aid | num | 稿件avid | | -| videos | num | 视频分P总数 | 默认为1 | -| tid | num | 分区tid | | -| tname | str | 子分区名称 | | -| copyright | num | 是否转载 | 1:原创
2:转载
3:未填写 | -| pic | str | 视频封面图片url | | -| title | str | 稿件标题 | | -| pubdate | num | 稿件发布时间 | 时间戳 | -| ctime | num | 用户提交稿件的时间 | 时间戳 | -| desc | str | 视频简介 | | -| state | num | 视频状态 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`state`备注 | -| attribute | num | 稿件属性位配置 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`attribute`备注 | -| duration | num | 视频总计持续时长(所有分P) | 单位为秒 | -| rights | obj | 视频属性标志 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`rights`对象 | -| owner | obj | 视频UP主信息 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`owner`对象 | -| stat | obj | 视频状态数 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`stat`对象 | -| dynamic | str | 视频同步发布的的动态的文字内容 | 无为空 | -| cid | num | 视频1P cid | | -| dimension | obj | 视频1P分辨率 | 略,见[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中的`dimension`对象 | -| bvid | str | 稿件bvid | | -| reason | str | 置顶视频备注 | | -| inter_video | bool | 是否为合作视频 | false:否
true:是 | - -**示例:** - -查询用户`mid=23215368`的置顶视频 - -```shell -curl -G 'https://api.bilibili.com/x/space/top/arc' \ ---data-urlencode 'vmid=23215368' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 37896701, - "videos": 1, - "tid": 28, - "tname": "原创音乐", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/cc9e72822d68fffdd0406144f1b5348a13c89652.jpg", - "title": "燃烧吧!铃声!把主流手机铃声编成一首曲子", - "pubdate": 1544469671, - "ctime": 1544469671, - "desc": "各品牌的手机铃声大合奏,毫无违和感~", - "state": 0, - "attribute": 16768, - "duration": 208, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 23215368, - "name": "Wayjon冰冰酱", - "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" - }, - "stat": { - "aid": 37896701, - "view": 1058237, - "danmaku": 16821, - "reply": 3725, - "favorite": 76888, - "coin": 100694, - "share": 17091, - "now_rank": 0, - "his_rank": 0, - "like": 90521, - "dislike": 0 - }, - "dynamic": "#编曲##FL##纯音乐#", - "cid": 66621209, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV18t411q7zz", - "reason": "", - "inter_video": false - } -} -``` - -
- -#### 设置置顶视频 - -> https://api.bilibili.com/x/space/top/arc/set - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | -------------------------------- | -| aid | num | 置顶目标稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 置顶目标稿件bvid | 必要(可选) | avid与bvid任选一个 | -| reason | str | 置顶视频备注 | 非必要 | 置顶备注最大40字符
默认为空 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-304:未修改
-400:请求错误
53014:稿件已失效
53015:备注过长
53017:置顶非自己的稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -置顶视频`av98948772`/`BV1n741127LD` - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/space/top/arc/set' \ ---data-urlencode 'aid=98948772' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/space/top/arc/set' \ ---data-urlencode 'bvid=BV1n741127LD' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -#### 取消置顶视频 - -> https://api.bilibili.com/x/space/top/arc/cancel - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误(重复取消) | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/space/top/arc/cancel' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 代表作视频 - -#### 查询用户代表作视频列表 - -> https://api.bilibili.com/x/space/masterpiece - -*请求方式:GET* - -新访客在其主页上可见 - -最多可以设置3个 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| vmid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | ---------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 代表作列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------- | ------------------------- | -| 0 | obj | 代表作1 | 无则为空 | -| 1 | obj | 代表作2 | 无则为空 | -| 2 | obj | 代表作3 | 无则为空
最多设置3个 | - -`data`数组中的对象: - -同[查询用户置顶视频](#查询用户置顶视频)中的`data`对象 - -**示例:** - -查询用户`mid=23215368`的代表作视频列表 - -```shell -curl -G 'https://api.bilibili.com/x/space/masterpiece' \ ---data-urlencode 'vmid=23215368' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "aid": 37896701, - "videos": 1, - "tid": 28, - "tname": "原创音乐", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/cc9e72822d68fffdd0406144f1b5348a13c89652.jpg", - "title": "燃烧吧!铃声!把主流手机铃声编成一首曲子", - "pubdate": 1544469671, - "ctime": 1544469671, - "desc": "各品牌的手机铃声大合奏,毫无违和感~", - "state": 0, - "attribute": 16768, - "duration": 208, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 23215368, - "name": "Wayjon冰冰酱", - "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" - }, - "stat": { - "aid": 37896701, - "view": 1058241, - "danmaku": 16821, - "reply": 3725, - "favorite": 76888, - "coin": 100694, - "share": 17091, - "now_rank": 0, - "his_rank": 0, - "like": 90521, - "dislike": 0 - }, - "dynamic": "#编曲##FL##纯音乐#", - "cid": 66621209, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV18t411q7zz", - "reason": "", - "inter_video": false - }, { - "aid": 39596658, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/431e51d0e40e3461e1c1b0f59c755ae8843b1adb.jpg", - "title": "MY2018 - 纪念我的2018年", - "pubdate": 1546328392, - "ctime": 1546328392, - "desc": "", - "state": 0, - "attribute": 16768, - "duration": 239, - "mission_id": 10996, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 23215368, - "name": "Wayjon冰冰酱", - "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" - }, - "stat": { - "aid": 39596658, - "view": 1518, - "danmaku": 16, - "reply": 40, - "favorite": 22, - "coin": 60, - "share": 9, - "now_rank": 0, - "his_rank": 0, - "like": 112, - "dislike": 0 - }, - "dynamic": "#vlog##记录##生活记录#", - "cid": 69561078, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV1Jt411B7La", - "reason": "", - "inter_video": false - }, { - "aid": 44721369, - "videos": 1, - "tid": 28, - "tname": "原创音乐", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/9887797402599c42f74a7624f3db4a92a0ebf465.jpg", - "title": "【铃声串烧系列】华米两开花;中华有为,国之荣耀!把主流手机铃声编成一首曲子", - "pubdate": 1551128445, - "ctime": 1551128445, - "desc": "把主流手机铃声编成一首曲子,这一版用华为的铃声作为主旋律,毫无违和感~伴随着2019mwc的开幕,希望国产厂商能获得全世界的目光,并且将属于中国人的科技自信传递到全世界!", - "state": 0, - "attribute": 16768, - "duration": 174, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 23215368, - "name": "Wayjon冰冰酱", - "face": "http://i2.hdslb.com/bfs/face/7c9715f1768191137eb7ebf91918ca0f99532012.jpg" - }, - "stat": { - "aid": 44721369, - "view": 306757, - "danmaku": 7713, - "reply": 1520, - "favorite": 17216, - "coin": 16489, - "share": 2917, - "now_rank": 0, - "his_rank": 0, - "like": 21439, - "dislike": 0 - }, - "dynamic": "#铃声##纯音乐##音乐#【铃声串烧】Mix Ringtones!船新的版本来啦!这一版用华为的铃声作为主旋律,毫无违和感~伴随着2019mwc的开幕,希望国产厂商能获得全世界的目光,并且将属于中国人的科技自信传递到全世界!", - "cid": 78290138, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV1vb411879C", - "reason": "", - "inter_video": false - }] -} -``` - -
- -#### 添加代表作视频 - -> https://api.bilibili.com/x/space/masterpiece/add - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -代表作上限为3个稿件 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | -------------------------------- | -| aid | num | 置顶目标稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 置顶目标稿件bvid | 必要(可选) | avid与bvid任选一个 | -| reason | str | 代表作备注 | 非必要 | 置顶备注最大40字符
默认为空 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
53014:稿件已失效
53015:备注过长
53017:置顶非自己的稿件
53019:达到上限
53020:已经存在该稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -添加视频`av94916552`/`BV1ZE411K7ux`到代表作列表 - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/space/masterpiece/add' \ ---data-urlencode 'aid=94916552' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/space/masterpiece/add' \ ---data-urlencode 'bvid=BV1ZE411K7ux' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -#### 删除代表作视频 - -> https://api.bilibili.com/x/space/masterpiece/cancel - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------------ | ------------------ | -| aid | num | 要删除的目标稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 要删除的目标稿件bvid | 必要(可选) | avid与bvid任选一个 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
53021:置顶列表中没有该视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | - -**示例:** - -删除置顶视频`av59765630`/`BV1Yt41137T6` - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/space/masterpiece/cancel' \ ---data-urlencode 'aid=59765630' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/space/masterpiece/cancel' \ ---data-urlencode 'bvid=BV1Yt41137T6' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -### 个人TAG - -#### 查看用户个人TAG - -> https://api.bilibili.com/x/space/acc/tags - -*请求方式:GET* - -上限5条,且内容由用户自定义 - -带有转义 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 信息本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------------- | -| 0 | obj | 套了个娃 | 只有1项??? | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | ----------- | ---- | -| mid | num | 目标用户mid | | -| tags | array | TAG名称 | | - -`data`数组中的对象中的`tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ------- | -| 0 | str | TAG1 | | -| n | str | TAG(n+1) | | -| …… | str | …… | | -| 4 | str | TAG5 | 上限5条 | - -**示例:** - -查看用户`mid=53456`的个人TAG - -```shell -curl -G 'https://api.bilibili.com/x/space/acc/tags' \ ---data-urlencode 'mid=53456' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "mid": 53456, - "tags": [ - "游戏", - "音乐", - "warma", - "搞笑", - "动画" - ] - } - ] -} -``` - -
- -#### 修改个人TAG - -> https://api.bilibili.com/x/space/acc/tags/set - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`存在且不为0 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| tags | strs | 要设置的TAG内容 | 非必要 | 删除公告留空或省去即可
各TAG长度小于10字符
最多5个TAG
各TAG之间用","(%2C)分隔
重复TAG无效 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误(超出长度限制) | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -修改个人TAG为`minecraft,技术宅,大佬,小哥哥,可爱` - -```shell -curl 'https://api.bilibili.com/x/space/acc/tags/set' \ ---data-urlencode 'tags=minecraft,技术宅,大佬,小哥哥,可爱' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;DedeUserID=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 空间公告 - -#### 查看用户空间公告 - -> https://api.bilibili.com/x/space/notice - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | str | 公告信息 | 无则为空 | - -**示例:** - -查看用户`mid=53456`的空间公告 - -```shell -curl -G 'https://api.bilibili.com/x/space/notice' \ ---data-urlencode 'mid=53456' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":"我的微博 @_warma_\n直播录像上传到:warma养鸽场\n头像画师是:微博@Dr-H_喵_\n横幅画师:@薬屋" -} -``` - -
- -#### 修改空间公告 - -> https://api.bilibili.com/x/space/notice/set - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | --------------------------------------- | -| notice | str | 要设置的公告内容 | 非必要 | 删除公告留空或省去即可
少于150字符 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-304:未修改
-400:请求错误(超出长度限制) | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | 作用尚不明确 | - -**示例:** - -修改个人空间公告为`鸽子` - -```shell -curl 'https://api.bilibili.com/x/space/notice/set' \ ---data-urlencode 'notice=鸽子' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 主页板块布局与权限 - -#### 查询空间设置 - -> http://space.bilibili.com/ajax/settings/getSettings - -*请求方式:GET* - -注:带有转义 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ------------------- | -------- | ---- | -| status | bool | 用户是否存在 | true:存在
false:不存在 | -| data | 用户存在时:obj
用户不存在时:str| 用户存在时:信息本体
用户不存在时:错误信息 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------------------- | ----- | ---------------- | ------------ | -| privacy | obj | 空间隐私权限 | | -| index_order | array | 空间板块布局 | | -| theme | str | default主题? | 作用尚不明确 | -| theme_preview_img_path | str | 主题预览图路径? | 作用尚不明确 | -| toutu | obj | 空间头图 | | - -`privacy`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | ------------------------------ | -| bangumi | num | 追番及追剧 | 0:隐藏
1:公开
**下同** | -| bbq | num | 轻视频 | | -| channel | num | 频道 | | -| coins_video | num | 最近投币的视频 | | -| comic | num | 追漫 | | -| dress_up | num | 装扮 | | -| fav_video | num | 收藏夹 | | -| groups | num | 圈子? | 作用尚不明确 | -| likes_video | num | 最近点赞的视频 | | -| played_game | num | 最近玩过的游戏 | | -| tags | num | 订阅标签 | | -| user_info | num | 个人资料 | | - -`index_order`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | -------------------------------------------- | -| 0 | obj | 板块1 | 根据板块布局顺序排序
先左侧布局后右侧布局 | -| n | obj | 板块(n+1) | | -| …… | obj | …… | …… | - -`index_order`数组内对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| id | num | 板块编号 | | -| name | str | 板块名称 | | - -`toutu`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------------- | -------------------------------------------------- | -| sid | num | 空间头图ID | | -| expire | num | 到期时间? | 时间戳?
作用尚不明确 | -| s_img | str | 空间头图小图相对路径 | 完整url为`http://i0.hdslb.com/`+相对路径 | -| l_img | str | 空间头图相对路径 | **同上** | -| android_img | str | 空 | 注:**手机端头图与web端不同,需要用另一个api获取** | -| iphone_img | str | 空 | | -| ipad_img | str | 空 | | -| thumbnail_img | str | 缩略图 | | -| platform | num | 0 | 作用尚不明确 | - -**示例:** - -查看`mid=2`的空间设置 - -```shell -curl -G 'http://space.bilibili.com/ajax/settings/getSettings' \ ---data-urlencode 'mid=2' -``` - -
-查看响应示例: - -```json -{ - "status":true, - "data":{ - "privacy":{ - "bangumi":1, - "bbq":1, - "channel":1, - "coins_video":0, - "comic":1, - "dress_up":1, - "fav_video":0, - "groups":0, - "likes_video":0, - "played_game":1, - "tags":1, - "user_info":1 - }, - "index_order":[ - { - "id":1, - "name":"我的稿件" - }, - { - "id":8, - "name":"我的专栏" - }, - { - "id":7, - "name":"我的频道" - }, - { - "id":2, - "name":"我的收藏夹" - }, - { - "id":3, - "name":"订阅番剧" - }, - { - "id":4, - "name":"订阅标签" - }, - { - "id":5, - "name":"最近投币的视频" - }, - { - "id":6, - "name":"我的圈子" - }, - { - "id":9, - "name":"我的相簿" - }, - { - "id":21, - "name":"公告" - }, - { - "id":22, - "name":"直播间" - }, - { - "id":23, - "name":"个人资料" - }, - { - "id":24, - "name":"官方活动" - }, - { - "id":25, - "name":"最近玩过的游戏" - } - ], - "theme":"default", - "theme_preview_img_path":"", - "toutu":{ - "sid":1, - "expire":2861874560, - "s_img":"bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", - "l_img":"bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", - "android_img":"", - "iphone_img":"", - "ipad_img":"", - "thumbnail_img":"", - "platform":0 - } - } -} -``` - -
- -#### 查询可用头图列表 (Web端) - -> https://space.bilibili.com/ajax/topphoto/getlist - -*请求方式: GET* - -注: 带有转义 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | -------------------------- | -| mid | num | 目标用户mid | 必要 | 非负数, 即使该用户并不存在 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ------------------------- | -------------------------------------- | ---- | -| status | bool | 成功: true
失败: false | | -| data | 成功: array
失败: str | 成功: 信息本体
失败: "用户id错误" | | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ----------- | ------------------------------------ | -| id | num | 空间头图 ID | | -| product_name | str | 显示名称 | | -| price | num | 价格 | | -| coin_type | num | 支付类型? | | -| vip_free | num | 大会员免费 | | -| s_img | str | 小图 URI | 需要自行与 `i0.hdslb.com` 拼接成 URL | -| l_img | str | 大图 URI | 同 s_img | -| thumbnail_img | str | 空 | 并不存在的缩略图? | -| sort_num | num | 排序编号 | | -| is_disable | num | 已禁用 | 0: 未禁用 | -| expire | num | 过期时间? | UNIX 时间戳, 或 0 为永不过期 | -| had | num | 是否拥有? | 当 expire 不为 0 时 为 1, 否则为 0 | - -**示例:** - -查询`mid=1145141919810000000`的可用空间头图 - -```shell -curl -G "https://space.bilibili.com/ajax/topphoto/getlist" \ ---data-urlencode "mid=1145141919810000000" -``` - -
-查看响应示例: - -```json -{ - "status": true, - "data": [ - { - "id": 1, - "product_name": "bilibili春", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/768cc4fd97618cf589d23c2711a1d1a729f42235.png", - "l_img": "bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png", - "thumbnail_img": "", - "sort_num": 19, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 2, - "product_name": "两人单车", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/d60a4be11f1bca6168a60a53c64bca18eddd6443.jpg", - "l_img": "bfs/space/44873d3568bdcb3d850d234e02a19602972450f1.png", - "thumbnail_img": "", - "sort_num": 16, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 5, - "product_name": "成为偶像", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/5fe2632486a5a91a234f0e7cb368ab6397477da4.jpg", - "l_img": "bfs/space/87277d30cd19edcec9db466a9a3e556aeb0bc0ed.png", - "thumbnail_img": "", - "sort_num": 15, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 11, - "product_name": "星际勘探", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/6849abc6e67000ad807b35a970aba31dd1e400dd.jpg", - "l_img": "bfs/space/c919a9818172a8297f8b0597722f96504a1e1d88.png", - "thumbnail_img": "", - "sort_num": 14, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 10, - "product_name": "星O大战", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/ff3b0882e55c1099738e59616e5956ad357d9948.jpg", - "l_img": "bfs/space/e22f5b8e06ea3ee4de9e4da702ce8ef9a2958f5a.png", - "thumbnail_img": "", - "sort_num": 13, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 12, - "product_name": "王牌特工", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/f5d38e2af44fd12fa65423aff55933fcf9071419.jpg", - "l_img": "bfs/space/8cd85a382756ab938df23a856017abccd187188e.png", - "thumbnail_img": "", - "sort_num": 12, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 3, - "product_name": "仰望星空", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/c9dae917e24b4fc17c4d544caf6b6c0b17f8692b.jpg", - "l_img": "bfs/space/9ccc0447aebf0656809b339b41aa5b3705f27c47.png", - "thumbnail_img": "", - "sort_num": 11, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 14, - "product_name": "雨过天晴", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/1115b2fdabd128337f892feada4ce32e51f3a5ad.jpg", - "l_img": "bfs/space/6a1198e25f8764bd30d53411dac9fdf840bc3265.png", - "thumbnail_img": "", - "sort_num": 10, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 6, - "product_name": "绿荫秘境", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/dc02d22a718c1c436f1a355b3cd726b04098ef7d.jpg", - "l_img": "bfs/space/265ecddc52d74e624dc38cf0cff13317085aedf7.png", - "thumbnail_img": "", - "sort_num": 9, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 13, - "product_name": "漫游仙境", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/184abe52a5ea9390b506c064cfba4f8f20ae9cca.jpg", - "l_img": "bfs/space/24d0815514951bb108fbb360b04a969441079315.png", - "thumbnail_img": "", - "sort_num": 7, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 15, - "product_name": "放课后time", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/aea2dd7b8894ce31d578d4fad6a7188c7b49cb2f.jpg", - "l_img": "bfs/space/6e799ff2de2de55d27796707a283068d66cdf3f4.png", - "thumbnail_img": "", - "sort_num": 6, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 4, - "product_name": "昴宿星团", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/1f4eaf70d1bb981f6057b3e440249d7a1f65774f.jpg", - "l_img": "bfs/space/3ab888c1d149e864ab44802dea8c1443e940fa0d.png", - "thumbnail_img": "", - "sort_num": 5, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 7, - "product_name": "蔷薇洛丽塔", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/718eac8c71e29b8a80431c46110805c3a40e30a6.jpg", - "l_img": "bfs/space/70ce28bcbcb4b7d0b4f644b6f082d63a702653c1.png", - "thumbnail_img": "", - "sort_num": 4, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 9, - "product_name": "黑暗之门", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/ef1b08e62fdc35b06e39795bc6de8e510935bf97.jpg", - "l_img": "bfs/space/cd52d4ac1d336c940cc4958120170f7928d9e606.png", - "thumbnail_img": "", - "sort_num": 3, - "is_disable": 0, - "expire": 0, - "had": 0 - }, - { - "id": 19, - "product_name": "你的名字", - "price": 0, - "coin_type": 0, - "vip_free": 0, - "s_img": "bfs/space/373e127e8784d3e4c1b5e6db0c27702ba077643f.jpg", - "l_img": "bfs/space/f49642b3683a08e3190f29d5a095386451f8952c.jpg", - "thumbnail_img": "", - "sort_num": 2, - "is_disable": 0, - "expire": 0, - "had": 0 - } - ] -} -``` - -
- -### 设置空间头图 (Web端) - -> https://space.bilibili.com/ajax/settings/setToutu - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -鉴权方式: referer为 `.bilibili.com` 域名下 - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------------------------------- | ------ | ---- | -| id | num | 头图 ID | 必要 | | -| csrf | str | CSRF Token (即 Cookie bili_jct 值) | 不必要 | | - -**JSON回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | --------------------------- | -| status | bool | 状态 | true: 成功
false: 失败 | -| data | str | 错误信息 | 正确时无此项 (带有转义) | - -**示例:** - -设置空间头图为为`王牌特工(id=12)` - -```shell -curl -X POST "https://space.bilibili.com/ajax/settings/setToutu" \ ---referer "https://space.bilibili.com/" \ ---data-urlencode "id=12" \ ---data-urlencode "csrf=xxx" \ --b "SESSDATA=xxx; bili_jct=xxx" -``` - -
-查看响应示例: - -```json -{ - "status": true -} -``` - -
- -#### 调整空间板块布局 - -> http://space.bilibili.com/ajax/settings/setIndexOrder - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`及`DedeUserID__ckMd5`存在且不为0,referer为 `.bilibili.com`域名下 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | ------ | ------------------------------------------------------------ | -| index_order | nums | 布局列表 | 必要 | 每个值之间用","(%2C)分隔
先左侧布局再右侧布局
值的意义见下表 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -布局参数`index_order`: - -| 值 | 含义 | -| ---- | ------------------------------------ | -| 1 | (左侧)我的稿件 | -| 2 | (左侧)我的收藏夹 | -| 3 | (左侧)订阅番剧 | -| 4 | (左侧)订阅标签 | -| 5 | (左侧)最近投币的视频 | -| 6 | (左侧)我的圈子 **(此板块被隐藏)** | -| 7 | (左侧)我的频道 | -| 8 | (左侧)我的专栏 | -| 9 | (左侧)我的相簿 | -| 21 | (右侧)公告 | -| 22 | (右侧)直播间 | -| 23 | (右侧)个人资料 | -| 24 | (右侧)官方活动 | -| 25 | (右侧)最近玩的游戏 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ----------------------------------- | -| status | bool | 操作结果 | true:操作成功
false:操作失败 | -| data | str | 错误信息 | 正确时无此项 | - -**示例:** - -调整空间布局为: - -```text -我的稿件 直播间 -我的专栏 个人资料 -订阅番剧 公告 -我的收藏夹 官方活动 -我的相簿 最近玩的游戏 -最近投币的视频 -订阅标签 -我的频道 -``` - -```shell -curl 'https://space.bilibili.com/ajax/settings/setIndexOrder' \ ---data-urlencode 'index_order=1,8,3,2,9,5,4,7,22,23,21,24,25,6' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ --e 'https://www.bilibili.com' -``` - -
-查看响应示例: - -```json -{ - "status": true -} -``` - -
- -#### 修改空间隐私权限 - -> http://space.bilibili.com/ajax/settings/setPrivacy - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:Cookie中`DedeUserID`及`DedeUserID__ckMd5`存在且不为0,referer为 `.bilibili.com`域名下 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------ | ------ | ---------------------------------- | -| fav_video | num | 收藏视频 | 非必要 | 0:隐藏
1:公开
**下同** | -| bangumi | num | 追番及追剧 | 非必要 | | -| tags | num | 关注的TAG | 非必要 | | -| coins_video | num | 投币的视频 | 非必要 | | -| user_info | num | 个人信息 | 非必要 | | -| played_game | num | 玩过的游戏 | 非必要 | | -| csrf | nstr | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------- | ----------------------------------- | -| status | bool | 操作结果 | true:操作成功
false:操作失败 | -| data | str | 错误信息 | 正确时无此项 | - -**示例:** - -设置`关注的TAG`为隐藏 - -```shell -curl 'https://space.bilibili.com/ajax/settings/setPrivacy' \ ---data-urlencode 'tags=0' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx;DedeUserID=1;DedeUserID__ckMd5=1;' \ --e 'https://www.bilibili.com' -``` - -
-查看响应示例: - -```json -{ - "status": true -} -``` - -
- -### 查询用户最近访问内容 - -#### 查询用户最近玩过的游戏 - -> https://api.bilibili.com/x/space/lastplaygame - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null
公开时:array | 信息本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 游戏1 | | -| n | obj | 游戏(n+1) | 项数为总计游戏数 | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ---- | -| website | str | 游戏主页 url | | -| image | str | 游戏图标 url | | -| name | str | 游戏名 | | - -**示例:** - -查询`mid=2`的最近玩过的游戏 - -```shell -curl -G 'https://api.bilibili.com/x/space/lastplaygame' \ - --data-urlencode 'mid=2' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "website": "https://game.bilibili.com/fgo/event_meihosou", - "image": "http://i0.hdslb.com/bfs/game/f7d4ee0877089e4079b8f0b4f5c95dd4ceba512a.png", - "name": "命运-冠位指定(Fate/GO)" - }, - { - "website": "https://game.bilibili.com/pcr/xxtix", - "image": "http://i0.hdslb.com/bfs/game/7922ecea5cc76fe3c8c177e1d4a6c8cf1c36a700.jpg", - "name": "公主连结Re:Dive" - }, - { - "website": "https://game.bilibili.com/dwbgx/", - "image": "http://i0.hdslb.com/bfs/game/6d5b2df70dfa987408d8d09110cdc327949885e3.png", - "name": "大王不高兴" - }, - { - "website": "https://game.bilibili.com/bangdream/1stanniversary-yxzx/", - "image": "http://i0.hdslb.com/bfs/game/4a7d0b7272dffe5a489ee935b6bd2d4f7d5f1257.png", - "name": "BanG Dream!" - }, - { - "website": "http://www.biligame.com/detail/?id=101772", - "image": "http://i0.hdslb.com/bfs/game/8e8b04e7bd2170c2ba2c9f563a62c72bac2eba2c.jpg", - "name": "明日方舟" - } - ] -} -``` - -
- -#### 查询用户最近玩过的游戏V2 - -> https://api.bilibili.com/x/space/lastplaygame/v2 - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null
公开时:obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ------ | --- | -| page_num | num | 当前页码 | | -| page_size | num | 每页项数 | | -| total_count | num | 游戏总数 | | -| list | array | 游戏列表 | | - -`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | ---------------- | -| 0 | obj | 游戏1 | | -| n | obj | 游戏(n+1) | 项数为总计游戏数 | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | ----------- | ----------------- | -| game_base_id | num | 游戏 id | biligame 的游戏 id | -| game_name | str | 游戏名 | | -| game_icon | str | 游戏图标 url | | -| grade | num | 游戏评分 | 如`8.2`、`6.8` | -| detail_url | str | 游戏主页 url | | -| game_tags | array | 游戏标签 | | -| notice | str | 游戏简介文案 | | -| gift_title | str | 游戏礼物文案 | | -| game_status_v2 | num | (?) | | - -`game_tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | --------------------------- | -| 0 | obj | 游戏标签1 | 如`角色扮演`、`音乐节奏`、`休闲` | -| n | obj | 游戏标签(n+1) | | -| …… | obj | …… | …… | - -**示例:** - -查询`mid=2`的最近玩过的游戏 - -```shell -curl -G 'https://api.bilibili.com/x/space/lastplaygame/v2' \ - --data-urlencode 'mid=2' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "page_num": 0, - "page_size": 15, - "total_count": 8, - "list": [ - { - "game_base_id": 102567, - "game_name": "坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险", - "game_icon": "https://i0.hdslb.com/bfs/game/fc2f4fd3a347eeb9b8b6ab59d961269bdd05d4e0.png", - "grade": 8.2, - "detail_url": "https://www.biligame.com/detail/?id=102567", - "game_tags": [ - "角色扮演", - "像素风" - ], - "notice": "像素风欢脱冒险RPG", - "gift_title": "", - "game_status_v2": 0 - }, - { - "game_base_id": 101661, - "game_name": "光·遇", - "game_icon": "https://i0.hdslb.com/bfs/game/9a1be39915f057597f9328afe503a2bbd0de7754.png", - "grade": 6.8, - "detail_url": "https://www.biligame.com/detail/?id=101661", - "game_tags": [ - "休闲", - "治愈", - "唯美" - ], - "notice": "九色鹿季开启,探索本真之旅", - "gift_title": "光·遇九色鹿季回归礼包", - "game_status_v2": 0 - }, - { - "game_base_id": 103496, - "game_name": "原神", - "game_icon": "https://i0.hdslb.com/bfs/game/2b29383536b3d1a2517bfcb73767f78c242f0458.png", - "grade": 6.5, - "detail_url": "https://www.biligame.com/detail/?id=103496", - "game_tags": [ - "角色扮演", - "二次元", - "冒险" - ], - "notice": "跨越尘世的探索之旅", - "gift_title": "bilibili-原神4.4版本独家礼包", - "game_status_v2": 0 - }, - { - "game_base_id": 49, - "game_name": "命运-冠位指定(Fate/GO)", - "game_icon": "https://i0.hdslb.com/bfs/game/ca5d8d4b3a042beddf7cabca20ae0c946527d1bf.png", - "grade": 6, - "detail_url": "https://www.biligame.com/detail/?id=49", - "game_tags": [ - "卡牌", - "fate", - "厨向" - ], - "notice": "第2部现已开启!", - "gift_title": "", - "game_status_v2": 0 - }, - { - "game_base_id": 102216, - "game_name": "公主连结Re:Dive", - "game_icon": "https://i0.hdslb.com/bfs/game/3bb819e010fe6d594d8f4d417ee380f40e8b5b06.png", - "grade": 8.4, - "detail_url": "https://www.biligame.com/detail/?id=102216", - "game_tags": [ - "角色扮演" - ], - "notice": "新角色「璃乃(圣诞节)」登场!", - "gift_title": "", - "game_status_v2": 0 - }, - { - "game_base_id": 168, - "game_name": "BanG Dream!", - "game_icon": "https://i0.hdslb.com/bfs/game/d196365d9f112a5adede7eedea1e4154e98c5e53.png", - "grade": 9.2, - "detail_url": "https://www.biligame.com/detail/?id=168", - "game_tags": [ - "音乐节奏", - "BanG Dream" - ], - "notice": "「迎风展翅的我们」活动开启!", - "gift_title": "", - "game_status_v2": 0 - }, - { - "game_base_id": 101772, - "game_name": "明日方舟", - "game_icon": "https://i0.hdslb.com/bfs/game/faa556b00d29fffc88281c1ee038b1b7f23aa5c2.jpg", - "grade": 7.4, - "detail_url": "https://www.biligame.com/detail/?id=101772", - "game_tags": [ - "策略", - "架空文明", - "末世" - ], - "notice": "2023感谢庆典正式开启", - "gift_title": "", - "game_status_v2": 0 - }, - { - "game_base_id": 97, - "game_name": "碧蓝航线", - "game_icon": "https://i0.hdslb.com/bfs/game/b141a7690c226a0eae66518c713d3af62613b21d.png", - "grade": 8.7, - "detail_url": "https://www.biligame.com/detail/?id=97", - "game_tags": [ - "养成" - ], - "notice": "指挥官,欢迎回港", - "gift_title": "", - "game_status_v2": 0 - } - ] - } -} -``` - -
- -#### 查询用户最近投币视频(Web) - -> https://api.bilibili.com/x/space/coin/video - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ------ | ---- | -| vmid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null
公开时:array | 信息本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 投币视频1 | | -| n | obj | 投币视频(n+1) | | -| …… | obj | …… | | - -`data`数组中的对象: - -基本与[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中`data`对象字段一致 - -**示例:** - -查看用户`mid=15858903`的最近投币视频 - -```shell -curl -G 'http://space.bilibili.com/x/space/coin/video' \ - --data-urlencode 'vmid=15858903' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "aid": 669644066, - "videos": 1, - "tid": 75, - "tname": "动物圈", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/0f73a68b8f449cc72e9ef109685bd295dc0c0c9d.jpg", - "title": "在人类幼崽身上用尽了温柔", - "pubdate": 1600608261, - "ctime": 1600608261, - "desc": "https://weibo.com/tv/show/1034:4551253766897703?from=old_pc_videoshow", - "state": 0, - "attribute": 16384, - "duration": 29, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 258457966, - "name": "卧龙寺", - "face": "http://i2.hdslb.com/bfs/face/f868d1f522733fdcf72a6267e0237157dd0e9948.jpg" - }, - "stat": { - "aid": 669644066, - "view": 3412898, - "danmaku": 719, - "reply": 1481, - "favorite": 21909, - "coin": 2864, - "share": 13702, - "now_rank": 0, - "his_rank": 0, - "like": 86970, - "dislike": 0 - }, - "dynamic": "", - "cid": 237319289, - "dimension": { - "width": 576, - "height": 1024, - "rotate": 0 - }, - "bvid": "BV1sa4y1j7jk", - "coins": 1, - "time": 1601802763, - "ip": "", - "inter_video": false - }, - { - "aid": 202267998, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/ca7746f2207114513f1a421d7f744523275ee679.jpg", - "title": "充 电 器 の 痛", - "pubdate": 1601750952, - "ctime": 1601750952, - "desc": "这个简介吓到我了!", - "state": 0, - "attribute": 16512, - "duration": 50, - "mission_id": 14725, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 129922746, - "name": "-白糖洒一地-", - "face": "http://i0.hdslb.com/bfs/face/1f581f3b20a380c2fd13ecb8bbe409f8b49c6418.jpg" - }, - "stat": { - "aid": 202267998, - "view": 109, - "danmaku": 2, - "reply": 11, - "favorite": 5, - "coin": 9, - "share": 0, - "now_rank": 0, - "his_rank": 0, - "like": 20, - "dislike": 0 - }, - "dynamic": "", - "cid": 241861687, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV1oh411X7iA", - "coins": 2, - "time": 1601773750, - "ip": "", - "inter_video": false - }, - { - "aid": 839722373, - "videos": 1, - "tid": 208, - "tname": "校园学习", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/11ed53241ceab314c919adba9f85582d24d9313c.jpg", - "title": "“白piáo”用日语到底怎么说?油管人气日语老师来教你!", - "pubdate": 1601026026, - "ctime": 1601026026, - "desc": "志方老师的B站用语日语课又来了~\n欢迎大家来看哦,\n如果喜欢我们的作品的话,欢迎大家用2~3连+转发来支持我们~\n如果拒绝的话,也可以用日语在评论和弹幕里刷上一波~即可以锻炼日语又可以拒绝我们,岂不美哉~~", - "state": 0, - "attribute": 16768, - "duration": 310, - "mission_id": 14655, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 677926489, - "name": "日语志方老师", - "face": "http://i2.hdslb.com/bfs/face/d465e5cd42e3523a52b3bef38dce7b23627b7723.jpg" - }, - "stat": { - "aid": 839722373, - "view": 130688, - "danmaku": 1320, - "reply": 799, - "favorite": 3722, - "coin": 5883, - "share": 339, - "now_rank": 0, - "his_rank": 0, - "like": 17585, - "dislike": 0 - }, - "dynamic": "志方老师的B站用语日语课又来了~\n欢迎大家来看哦,\n如果喜欢我们的作品的话,欢迎大家用2~3连+转发来支持我们~\n如果拒绝的话,也可以用日语在评论和弹幕里刷上一波~即可以锻炼日语又可以拒绝我们,岂不美哉~~", - "cid": 238876133, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "BV1n54y117kq", - "coins": 2, - "time": 1601036198, - "ip": "", - "inter_video": false - } - ] -} -``` - -
- -#### 查询用户最近投币视频(APP) - -> https://app.bilibili.com/x/v2/space/coinarc - -*请求方式:GET* - -认证方式:APP - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ----------- | ------ | -------- | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| vmid | num | 目标用户mid | 必要 | | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | 默认为20 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------ | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---------- | ---- | -| count | num | 投币的视频数 | | -| item | array | 投币视频列表 | | - -`item`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | ---- | -| 0 | obj | 投币的视频信息1 | | -| n | obj | 投币的视频信息(n+1) | | -| …… | obj | …… | | - -`item`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ------------ | ---------------------- | -| title | str | 稿件标题 | | -| subtitle | str | 空 | | -| tname | str | 空 | | -| cover | str | 封面图片 url | | -| cover_icon | str | 空 | | -| uri | str | APP 跳转 uri | 如`bilibili://video/2` | -| param | str | 稿件 avid | | -| goto | str | av | | -| length | num | 空 | | -| duration | num | 稿件视频长度 | 单位为秒 | -| is_popular | bool | (?) | | -| is_steins | bool | (?) | | -| is_ugcpay | bool | (?) | | -| is_cooperation | str | (?) | | -| is_pgc | str | (?) | | -| is_live_playback | str | (?) | | -| is_pugv | str | (?) | | -| is_fold | num | (?) | | -| play | num | 播放量 | | -| danmaku | num | 弹幕量 | | -| ctime | num | 发布时间 | 时间戳 | -| ugc_pay | num | 0 | | -| author | str | UP主昵称 | | -| state | bool | true | | -| videos | num | 0 | | -| view_content | str | 稿件播放量文案 | | -| icon_type | num | 0 | | -| publish_time_text | str | 空 | | - -**示例:** - -用户`mid=2`的投币列表 - -```shell -curl -G 'https://app.bilibili.com/x/v2/space/coinarc' \ - --data-urlencode 'appkey=1d8b6e7d45233436' \ - --data-urlencode 'access_key=xxx' \ - --data-urlencode 'vmid=2' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 2, - "item": [ - { - "title": "请打开麦克风交流", - "subtitle": "", - "tname": "", - "cover": "http://i1.hdslb.com/bfs/archive/cf9aea43b72354ee8c9486e4bf8e07cb38920a65.jpg", - "cover_icon": "", - "uri": "bilibili://video/496832459?player_width=1080\u0026player_height=1920\u0026player_rotate=0", - "param": "496832459", - "goto": "av", - "length": "", - "duration": 134, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "play": 706480, - "danmaku": 167, - "ctime": 1706431476, - "ugc_pay": 0, - "author": "三个猪鼓励", - "state": true, - "videos": 0, - "view_content": "70.6万", - "icon_type": 0, - "publish_time_text": "" - }, - { - "title": "【裏命】地球的内部【いよわ】【中文CC字幕】", - "subtitle": "", - "tname": "", - "cover": "http://i0.hdslb.com/bfs/archive/e087224ae4a5ff9ef3f2f6b7644d635276b8f5c6.jpg", - "cover_icon": "", - "uri": "bilibili://video/860645391?player_width=1920\u0026player_height=1080\u0026player_rotate=0", - "param": "860645391", - "goto": "av", - "length": "", - "duration": 264, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "play": 194375, - "danmaku": 173, - "ctime": 1669713070, - "ugc_pay": 0, - "author": "精神安定剤", - "state": true, - "videos": 0, - "view_content": "19.4万", - "icon_type": 0, - "publish_time_text": "" - } - ] - } -} -``` - -
- -#### 查询用户最近点赞视频(Web) - -> https://api.bilibili.com/x/space/like/video - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ------ | ---- | -| vmid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------------------------------- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 隐藏时:null
公开时:array | 信息本体 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 点赞视频1 | | -| n | obj | 点赞视频(n+1) | | -| …… | obj | …… | | - -`data`数组中的对象: - -基本与[获取视频详细信息(web端)](../video/info.md#获取视频详细信息web端)中`data`对象字段一致 - -**示例:** - -查看用户`mid=15858903`的最近点赞视频 - -```shell -curl -G 'http://space.bilibili.com/x/space/like/video' \ - --data-urlencode 'vmid=15858903' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [ - { - "aid": 1700085880, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/7fad4ca408c66eb7ea72188f56bcf952306d5807.jpg", - "title": "你是从什么时候,意识到自己缺爱的呢?", - "pubdate": 1706706000, - "ctime": 1706602115, - "desc": "关于个人情感问题,私信发“2024”我来帮你~", - "state": 0, - "duration": 91, - "mission_id": 4009559, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 2104592226, - "name": "鲸落艳红尘", - "face": "https://i0.hdslb.com/bfs/face/80160fbcf71958e6f5ad3a4fdfa39a55cc0699a5.jpg" - }, - "stat": { - "aid": 1700085880, - "view": 930, - "danmaku": 1, - "reply": 5, - "favorite": 18, - "coin": 0, - "share": 4, - "now_rank": 0, - "his_rank": 0, - "like": 27, - "dislike": 0, - "vt": 0, - "vv": 930 - }, - "dynamic": "", - "cid": 1424231007, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1XK421y7ZL", - "first_frame": "http://i2.hdslb.com/bfs/storyff/n240130sa1k9birz4lwlsm21ya1w3p2c_firsti.jpg", - "pub_location": "湖北", - "bvid": "BV1XK421y7ZL", - "inter_video": false, - "resource_type": "ugc", - "subtitle": "", - "enable_vt": 0 - }, - { - "aid": 836926413, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/dceaf79d1cc4f74ab8cd862f454a8ec4b4a44343.jpg", - "title": "内心的创伤,是建立深度亲密关系的桥梁!", - "pubdate": 1706594400, - "ctime": 1706515438, - "desc": "关于个人情感问题,私信发“2024”我来帮你~", - "state": 0, - "duration": 297, - "mission_id": 4009559, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 2104592226, - "name": "鲸落艳红尘", - "face": "https://i0.hdslb.com/bfs/face/80160fbcf71958e6f5ad3a4fdfa39a55cc0699a5.jpg" - }, - "stat": { - "aid": 836926413, - "view": 1903, - "danmaku": 0, - "reply": 7, - "favorite": 142, - "coin": 34, - "share": 30, - "now_rank": 0, - "his_rank": 0, - "like": 118, - "dislike": 0, - "vt": 0, - "vv": 1903 - }, - "dynamic": "", - "cid": 1423127570, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1xg4y1e7kY", - "first_frame": "http://i0.hdslb.com/bfs/storyff/n240129qn55at7dr1775k12hp34tw284_firsti.jpg", - "pub_location": "湖北", - "bvid": "BV1xg4y1e7kY", - "inter_video": false, - "resource_type": "ugc", - "subtitle": "", - "enable_vt": 0 - }, - …… - ] - } -} -``` - -
- -#### 查询用户最近点赞视频(APP) - -> https://app.bilibili.com/x/v2/space/likearc - -*请求方式:GET* - -认证方式:APP - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ----------- | ------ | -------- | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| vmid | num | 目标用户mid | 必要 | | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | 默认为20 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ---------- | ---- | -| count | num | 点赞的视频数 | | -| item | array | 点赞视频列表 | | - -`item`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------ | ---- | -| 0 | obj | 点赞的视频信息1 | | -| n | obj | 点赞的视频信息(n+1) | | -| …… | obj | …… | | - -`item`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ---- | ------------ | ---------------------- | -| title | str | 稿件标题 | | -| subtitle | str | 空 | | -| tname | str | 空 | | -| cover | str | 封面图片 url | | -| cover_icon | str | 空 | | -| uri | str | APP 跳转 uri | 如`bilibili://video/2` | -| param | str | 稿件 avid | | -| goto | str | av | | -| length | num | 空 | | -| duration | num | 稿件视频长度 | 单位为秒 | -| is_popular | bool | (?) | | -| is_steins | bool | (?) | | -| is_ugcpay | bool | (?) | | -| is_cooperation | str | (?) | | -| is_pgc | str | (?) | | -| is_live_playback | str | (?) | | -| is_pugv | str | (?) | | -| is_fold | num | (?) | | -| play | num | 播放量 | | -| danmaku | num | 弹幕量 | | -| ctime | num | 发布时间 | 时间戳 | -| ugc_pay | num | 0 | | -| author | str | UP主昵称 | | -| state | bool | true | | -| videos | num | 0 | | -| view_content | str | 稿件播放量文案 | | -| icon_type | num | 0 | | -| publish_time_text | str | 空 | | - -**示例:** - -用户`mid=2`的点赞列表 - -```shell -curl -G 'https://app.bilibili.com/x/v2/space/likearc' \ - --data-urlencode 'appkey=1d8b6e7d45233436' \ - --data-urlencode 'access_key=xxx' \ - --data-urlencode 'vmid=2' \ - --data-urlencode 'ps=2' \ - --data-urlencode 'pn=1' \ -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 2, - "item": [ - { - "title": "兄弟难舍也难分", - "subtitle": "", - "tname": "", - "cover": "http://i1.hdslb.com/bfs/archive/58f031a52eab6d5faec5a39dfaab5728f65672d5.jpg", - "cover_icon": "", - "uri": "bilibili://video/624351941?player_width=1080\u0026player_height=1920\u0026player_rotate=0", - "param": "624351941", - "goto": "av", - "length": "", - "duration": 216, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "play": 423652, - "danmaku": 362, - "ctime": 1706320200, - "ugc_pay": 0, - "author": "甜蜜老张", - "state": true, - "videos": 0, - "view_content": "42.4万", - "icon_type": 0, - "publish_time_text": "" - }, - { - "title": "技能搭配不累,共赴热血团战!", - "subtitle": "", - "tname": "", - "cover": "http://i2.hdslb.com/bfs/archive/2094b8e0be819222d320e2841ee1c39f5f2e4357.jpg", - "cover_icon": "", - "uri": "bilibili://video/793597196?player_width=1280\u0026player_height=720\u0026player_rotate=0", - "param": "793597196", - "goto": "av", - "length": "", - "duration": 41, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "play": 1237, - "danmaku": 2, - "ctime": 1704855559, - "ugc_pay": 0, - "author": "38047aa1-cb8a-4", - "state": true, - "videos": 0, - "view_content": "1237", - "icon_type": 0, - "publish_time_text": "" - } - ] - } -} -``` - -
- -## 投稿 - - - -### 查询用户投稿视频明细 - -> https://api.bilibili.com/x/space/wbi/arc/search - -> ~~https://api.bilibili.com/x/space/arc/search~~ (已废弃,保留是方便遇到问题的人搜索到此处) - -*请求方式:GET* - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -另见 [根据关键词查找视频](../video/collection.md#根据关键词查找视频), 功能基本相同, 暂未发现风控校验 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------- | ---- | ------------ | ------ | ----------------------------------------------------------------------------- | -| mid | num | 目标用户mid | 必要 | | -| order | str | 排序方式 | 非必要 | 默认为pubdate
最新发布:pubdate
最多播放:click
最多收藏:stow | -| tid | num | 筛选目标分区 | 非必要 | 默认为0
0:不进行分区筛选
分区tid为所筛选的分区 | -| keyword | str | 关键词筛选 | 非必要 | 用于使用关键词搜索该UP主视频稿件 | -| pn | num | 页码 | 非必要 | 默认为 `1` | -| ps | num | 每页项数 | 非必要 | 默认为 `30` | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-412:请求被拦截 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------------- | ---- | -| list | obj | 列表信息 | | -| page | obj | 页面信息 | | -| episodic_button | obj | “播放全部“按钮 | | -| is_risk | bool | | | -| gaia_res_type | num | | | -| gaia_data | obj | | | - -`data`中的`list`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ---------------- | ---- | -| slist | array | 空数组 | | -| tlist | obj | 投稿视频分区索引 | | -| vlist | array | 投稿视频列表 | | - -`list`中的`tlist`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | --------------------- | -| {tid} | obj | 该分区的详情 | 字段名为存在的分区tid | -| …… | obj | …… | 向下扩展 | - -`tlist`中的`{tid}`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------------- | ---- | -| count | num | 投稿至该分区的视频数 | | -| name | str | 该分区名称 | | -| tid | num | 该分区tid | | - -`list`中的`vlist`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 投稿视频1 | | -| n | obj | 投稿视频(n+1) | | -| …… | obj | …… | …… | - -`list`中的`vlist`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ---- | -------------- | ---------------------------- | -| aid | num | 稿件avid | | -| attribute | num | | | -| author | str | 视频UP主 | 不一定为目标用户(合作视频) | -| bvid | str | 稿件bvid | | -| comment | num | 视频评论数 | | -| copyright | str | 视频版权类型 | | -| created | num | 投稿时间 | 时间戳 | -| description | str | 视频简介 | | -| elec_arc_type | num | 充电为1,否则0 | 可能还有其他情况 | -| enable_vt | num | 0 | 作用尚不明确 | -| hide_click | bool | false | 作用尚不明确 | -| is_avoided | num | 0 | 作用尚不明确 | -| is_charging_arc | bool | 是否为充电视频 | | -| is_lesson_video | num | 是否为课堂视频 | 0:否
1:是 | -| is_lesson_finished | num | 课堂是否已完结 | 0:否
1:是 | -| is_live_playback | num | 是否为直播回放 | 0:否
1:是 | -| is_pay | num | 0 | 作用尚不明确 | -| is_self_view | bool | 是否仅自己可见 | | -| is_steins_gate | num | 是否为互动视频 | 0:否
1:是 | -| is_union_video | num | 是否为合作视频 | 0:否
1:是 | -| jump_url | str | 跳转链接 | 跳转到课堂的链接,否则为"" | -| length | str | 视频长度 | MM:SS | -| mid | num | 视频UP主mid | 不一定为目标用户(合作视频) | -| meta | obj | 所属合集或课堂 | 无数据时为 null | -| pic | str | 视频封面 | | -| play | num | 视频播放次数 | | -| playback_position | num | 百分比播放进度 | 封面下方显示的粉色条 | -| review | num | 0 | 作用尚不明确 | -| season_id | num | 合集或课堂编号 | 都不属于时为0 | -| subtitle | str | 空 | 作用尚不明确 | -| title | str | 视频标题 | | -| typeid | num | 视频分区tid | | -| video_review | num | 视频弹幕数 | | -| vt | num | 0 | 作用尚不明确 | -| vt_display | str | 空 | 作用尚不明确 | - -`list`中的`vlist`数组中的对象中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ---------------- | -| attribute | num | 0 | 作用尚不明确 | -| cover | str | 合集封面URL | | -| ep_count | num | 合集视频数量 | | -| ep_num | num | 合集视频数量 | | -| first_aid | num | 首个视频av号 | | -| id | num | 合集id | | -| intro | str | 合集介绍 | | -| mid | num | UP主uid | 若为课堂,则为0 | -| ptime | num | unix时间(s) | 最后更新时间 | -| sign_state | num | 0 | 作用尚不明确 | -| stat | obj | 合集统计数据 | | -| title | str | 合集名称 | | - -`list`中的`vlist`数组中的对象中的`meta`对象中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | -------------------- | -| coin | num | 合集总投币数 | | -| danmaku | num | 合集总弹幕数 | | -| favorite | num | 合集总收藏数 | | -| like | num | 合集总点赞数 | | -| mtime | num | unix时间(s) | 其他统计数据更新时间 | -| reply | num | 合集总评论数 | | -| season_id | num | 合集id | | -| share | num | 合集总分享数 | | -| view | num | 合集总播放量 | | -| vt | num | 0 | 作用尚不明确 | -| vv | num | 0 | 作用尚不明确 | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ---------- | ---- | -| count | num | 总计稿件数 | | -| pn | num | 当前页码 | | -| ps | num | 每页项数 | | - -`data`中的`episodic_button`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| text | str | 按钮文字 | | -| uri | str | 全部播放页url | | - -**示例:** - -`pn`(页码)和`ps`(每页项数)只改变`vlist`中成员的多少与内容 - -以每页2项查询用户`mid=53456`的第1页投稿视频明细 - -```shell -curl -G 'https://api.bilibili.com/x/space/arc/search' \ ---data-urlencode 'mid=53456' \ ---data-urlencode 'ps=2' \ ---data-urlencode 'pn=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": { - "slist": [], - "tlist": { - "1": { - "tid": 1, - "count": 3, - "name": "动画" - }, - "129": { - "tid": 129, - "count": 1, - "name": "舞蹈" - }, - "160": { - "tid": 160, - "count": 96, - "name": "生活" - }, - "177": { - "tid": 177, - "count": 4, - "name": "纪录片" - }, - "181": { - "tid": 181, - "count": 50, - "name": "影视" - }, - "188": { - "tid": 188, - "count": 444, - "name": "科技" - }, - "196": { - "tid": 196, - "count": 2, - "name": "课堂" - } - }, - "vlist": [{ - "comment": 985, - "typeid": 250, - "play": 224185, - "pic": "http://i0.hdslb.com/bfs/archive/5e56c10a9bd67f2fcac46fdd0fc2caa8769700c8.jpg", - "subtitle": "", - "description": "这一次,我们的样片日记首次来到了西藏,在桃花季开启了藏东样片之旅!这趟“开荒”之旅我们跋山涉水,一路硬刚,多亏有路虎卫士这样的神队友撑全场!这次的素材我们也上传到了官网(ysjf.com/material),欢迎大家去看看~如果你喜欢这期视频,请多多支持我们,并把视频分享给你的朋友们一起看看!", - "copyright": "1", - "title": "和朋友去西藏拍样片日记……", - "review": 0, - "author": "影视飓风", - "mid": 946974, - "created": 1745290800, - "length": "22:11", - "video_review": 2365, - "aid": 114375683741573, - "bvid": "BV1ac5yzhE94", - "hide_click": false, - "is_pay": 0, - "is_union_video": 1, - "is_steins_gate": 0, - "is_live_playback": 0, - "is_lesson_video": 0, - "is_lesson_finished": 0, - "lesson_update_info": "", - "jump_url": "", - "meta": { - "id": 2046621, - "title": "样片日记", - "cover": "https://archive.biliimg.com/bfs/archive/e2ca3e5a6672cf35c9e61ac02e8d739cc0aafa8b.jpg", - "mid": 946974, - "intro": "", - "sign_state": 0, - "attribute": 140, - "stat": { - "season_id": 2046621, - "view": 31755096, - "danmaku": 171253, - "reply": 33685, - "favorite": 409505, - "coin": 935105, - "share": 199467, - "like": 1791607, - "mtime": 1745309513, - "vt": 0, - "vv": 0 - }, - "ep_count": 13, - "first_aid": 238588630, - "ptime": 1745290800, - "ep_num": 13 - }, - "is_avoided": 0, - "season_id": 2046621, - "attribute": 16793984, - "is_charging_arc": false, - "elec_arc_type": 0, - "vt": 0, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0, - "is_self_view": false - }, { - "comment": 0, - "typeid": 197, - "play": 8506, - "pic": "https://archive.biliimg.com/bfs/archive/489f3df26a190a152ad479bfe50a73f1cd4c43c5.jpg", - "subtitle": "", - "description": "8节课,Tim和青青带你用iPhone拍出电影感", - "copyright": "1", - "title": "【影视飓风】只看8节课,用iPhone拍出电影感", - "review": 0, - "author": "影视飓风", - "mid": 946974, - "created": 1744865737, - "length": "00:00", - "video_review": 9, - "aid": 114351440726681, - "bvid": "BV1WB5ezxEnz", - "hide_click": false, - "is_pay": 0, - "is_union_video": 0, - "is_steins_gate": 0, - "is_live_playback": 0, - "is_lesson_video": 1, - "is_lesson_finished": 1, - "lesson_update_info": "8", - "jump_url": "https://www.bilibili.com/cheese/play/ss190402215", - "meta": { - "id": 190402215, - "title": "【影视飓风】只看8节课,用iPhone拍出电影感", - "cover": "https://archive.biliimg.com/bfs/archive/489f3df26a190a152ad479bfe50a73f1cd4c43c5.jpg", - "mid": 0, - "intro": "", - "sign_state": 0, - "attribute": 0, - "stat": { - "season_id": 190402215, - "view": 1111222, - "danmaku": 1853, - "reply": 0, - "favorite": 0, - "coin": 0, - "share": 0, - "like": 0, - "mtime": 0, - "vt": 0, - "vv": 0 - }, - "ep_count": 0, - "ptime": 1744865737, - "ep_num": 0 - }, - "is_avoided": 0, - "season_id": 190402215, - "attribute": 1073758592, - "is_charging_arc": false, - "elec_arc_type": 0, - "vt": 0, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0, - "is_self_view": false - }] - }, - "page": { - "pn": 1, - "ps": 42, - "count": 786 - }, - "episodic_button": { - "text": "播放全部", - "uri": "//www.bilibili.com/medialist/play/946974?from=space" - }, - "is_risk": false, - "gaia_res_type": 0, - "gaia_data": null - } -} -``` - -
- - -### 查询用户投稿明细(APP、无需wbi鉴权) - -> https://app.biliapi.com/x/v2/space/archive/cursor - -*请求方式:GET* - -可以获取APP端可获得的用户空间投稿所有信息 - -APP端请求对web端包容度最高,无需Cookie以外的任何认证,只需填写vmid即可查询 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ----------------------- | -------------- | ------------- | -| vmid | num | 目标用户mid | 必要 | | -| aid | num | 请求返回起始视频 | 首次请求不需要 | 填写上次请求返回最后视频的aid | -| order | str | 排序方式 | 非必要 | `click`代表最多播放,`pubdate`代表最新发布 | -| sort | str | 确有影响,但这是什么呢? | 非必要 | 创建时间: asc
修改时间: desc | -| access_key | str | APP登录Token | APP方式必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| build | num | 版本 | APP方式必要 | 可为`8130300` | -| c_locale | str | 语言 | 非必要 | zh_CN | -| channel | num | 频道 | 非必要 | | -| fnval | num | 视频流类型 | 非必要 | | -| fnver | num | 请求时提供的fnver | 非必要 | 可为 0 | -| force_host | num | 源url类型 | 非必要 | 0:无限制 1:使用http 2:使用https | -| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | -| include_cursor| bool | 未知 | 非必要 | 可为false | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web`、`android` 等 | -| platform | str | 平台 | 非必要 | 可为`web` | -| ps | int | 每页条数 | 非必要 | 默认为 `20` | -| pn | int | 似乎不是页码 | 非必要 | 默认为 `32` | -| pn_policy | int | 未知 | 非必要 | 可为 `1` | -| s_locale | str | 语言 | 非必要 | zh_CN | -| statistics | str | 位置 | 非必要 | 可为{"appId":1,"platform":3,"version":"8.13.0","abtest":""} | -| ts | num | 秒级时间戳 | 非必要 | | -| voice_balance | num | 未知 | 非必要 | 默认为 `1` | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 视频信息 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------------- | ------ | ------------- | ----------------------------- | -| count | num | 总数 | 0:成功
-400:请求错误 | -| episodic_button | obj | 播放按钮 | 播放按钮的显示文字与跳转链接 | -| has_next | bool | 有无后续 | true:有;false:没有 | -| has_prev | bool | 有无前置 | true:有;false:没有 | -| item | array | 视频列表 | 注意是item没有复数 | -| last_watched_locator | obj | 上次播放定位 | 上次播放定位的一些信息 | -| order | array | 排列方式 | 排列方式的显示与值 | - -`episodic_button`对象 - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | ----------------- | ------ | -| text | str | 四个大字“播放全部” | | -| uri | str | 跳转链接 | | - -`item`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---- | -| 0 | obj | 视频信息1 | | -| n | obj | 视频信息(n+1) | | -| …… | obj | …… | …… | - -`item`数组元素: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ----------------------- | ------------------------ | -| author | str | 作者昵称 | | -| bvid | str | 视频bv号 | | -| cover | str | 封面url | | -| cover_icon | str | 封面icon?未知 | | -| ctime | num | 应该是发布时间秒级时间戳 | | -| cursor_attr | obj | 上次观看标记 | | -| danmaku | num | 弹幕数 | | -| duration | num | 视频时长 | | -| first_cid | num | 首个频道cid | | -| goto | str | 应该是跳转去向类型 | 已知av为视频 | -| icon_type | num | icon类型?未知 | | -| is_cooperation | bool | 是否为合作视频 | 如果true会有粉色合作视频标签 | -| is_fold | bool | 是否折叠?未知 | | -| is_live_playback | bool | 是否为直播回放 | 如果true会有粉色直播回放标签 | -| is_onself | bool | 是否自己?未知 | | -| is_pgc | bool | 是否开pgc | | -| is_popular | bool | 是否上热门 | 如果true会有热门标签 | -| is_pugv | bool | 未知 | | -| is_steins | bool | 未知 | | -| is_ugcpay | bool | 未知 | | -| length | num | 长度?未知 | | -| param | str | 参数,实际为视频aid | | -| play | num | 播放量 | | -| publish_time_text | str | 发布时间汉字字符串版 | | -| state | bool | 状态?未知 | | -| subtitle | str | 子标题 | | -| three_points | array | 三点按钮内容 | 关于稍后再看和分享的显示内容 | -| title | str | 标题 | | -| tname | str | tag的name | | -| ugc_pay | num | ugc支付?未知 | | -| uri | str | APP 跳转 uri | | -| video | num | 未知 | | -| view_content | str | 播放量字符串版 | | - -`item`元素中的`cursor_attr`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ---- | ----------------------- | -------------------------------------- | -| is_last_watched_arc | bool | 是否为上次播放 | 如果ture则封面笼罩一层写有“上次播放”的灰幕 | -| rank | num | 视频所处该列表排名 | | - -`last_watched_locator`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ----- | ----------------- | ------ | -| display_threshold | num | 显示阈值 | | -| insert_ranking | num | 嵌入排名 | | -| text | str | 定位上次观看字样 | | - -`order`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------- | -| 0 | obj | 最新发布的内容 | 内包括文字和值 | -| 1 | obj | 最多播放的内容 | 内包括文字和值 | - -**示例:** - -查询用户mid=1240283469的稿件 -以播放量排序,显示3个稿件,但假设aid=1301087872及以前稿件已经加载过 - -> https://app.biliapi.com/x/v2/space/archive/cursor?vmid=1240283469&order=click&ps=3&aid=1301087872 - -输入浏览器 - -
-查看响应示例: - -```json - -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "episodic_button": { - "text": "播放全部", - "uri": "bilibili://music/playlist/spacepage/1240283469?desc=1\u0026offset=0\u0026oid=0\u0026order=time\u0026page_type=1\u0026playlist_intro=UP%E4%B8%BB%E7%9A%84%E5%85%A8%E9%83%A8%E8%A7%86%E9%A2%91\u0026ps=20\u0026sort_field=2\u0026sort_hidden=1\u0026total_count=33\u0026user_name=%E7%A5%9E%E5%9D%A1%E5%86%9C%E8%8E%AB" - }, - "order": [ - { - "title": "最新发布", - "value": "pubdate" - }, - { - "title": "最多播放", - "value": "click" - } - ], - "count": 33, - "item": [ - { - "title": "【神坡农二】后半段更是天籁!汉堡仙人神坡农二吃完快餐深情演唱《樱花树下的约定》", - "subtitle": "", - "tname": "搞笑", - "cover": "http://i2.hdslb.com/bfs/archive/3e5d02f50b2e0a756cc5e3dd7f705abc58c3a439.jpg", - "cover_icon": "", - "uri": "bilibili://video/1351875564?history_progress=0\u0026player_height=1920\u0026player_rotate=0\u0026player_width=1080", - "param": "1351875564", - "goto": "av", - "length": "", - "duration": 45, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "is_oneself": false, - "play": 1248, - "danmaku": 1, - "ctime": 1710518403, - "ugc_pay": 0, - "author": "神坡农莫", - "state": false, - "bvid": "BV1H6421w7Gy", - "videos": 1, - "three_point": [ - { - "type": "addtoview", - "icon": "https://i0.hdslb.com/bfs/app/25cc01346574a601dafd45c94226d92a67eed79a.png", - "text": "添加至稍后再看" - }, - { - "type": "share", - "icon": "https://i0.hdslb.com/bfs/app/a5787f586c72f2d6f6ade4b33c64908938c4a01f.png", - "text": "分享", - "share_succ_toast": "分享成功", - "share_fail_toast": "分享失败", - "share_path": "pages/video/video?avid=1351875564", - "short_link": "https://b23.tv/BV1H6421w7Gy" - } - ], - "first_cid": 1471110689, - "cursor_attr": { - "is_last_watched_arc": false, - "rank": 1 - }, - "view_content": "1248", - "icon_type": 0, - "publish_time_text": "3月16日" - }, - { - "title": "【迪迦奥特曼】亲自配音?迪迦超战神联合网络新星神坡农二!共同打造奥特曼大电影!", - "subtitle": "", - "tname": "搞笑", - "cover": "http://i0.hdslb.com/bfs/archive/c6c94d16aeeefca148c1694e45fd352b22cac3fb.jpg", - "cover_icon": "", - "uri": "bilibili://video/1950389780?history_progress=0\u0026player_height=1080\u0026player_rotate=0\u0026player_width=1920", - "param": "1950389780", - "goto": "av", - "length": "", - "duration": 101, - "is_popular": false, - "is_steins": false, - "is_ugcpay": false, - "is_cooperation": false, - "is_pgc": false, - "is_live_playback": false, - "is_pugv": false, - "is_fold": false, - "is_oneself": false, - "play": 1184, - "danmaku": 0, - "ctime": 1707431804, - "ugc_pay": 0, - "author": "神坡农莫", - "state": false, - "bvid": "BV1fC411x7uf", - "videos": 1, - "three_point": [ - { - "type": "addtoview", - "icon": "https://i0.hdslb.com/bfs/app/25cc01346574a601dafd45c94226d92a67eed79a.png", - "text": "添加至稍后再看" - }, - { - "type": "share", - "icon": "https://i0.hdslb.com/bfs/app/a5787f586c72f2d6f6ade4b33c64908938c4a01f.png", - "text": "分享", - "share_succ_toast": "分享成功", - "share_fail_toast": "分享失败", - "share_path": "pages/video/video?avid=1950389780", - "short_link": "https://b23.tv/BV1fC411x7uf" - } - ], - "first_cid": 1434820367, - "cursor_attr": { - "is_last_watched_arc": false, - "rank": 2 - }, - "view_content": "1184", - "icon_type": 0, - "publish_time_text": "2月9日" - } - ], - "last_watched_locator": { - "display_threshold": 10, - "insert_ranking": 6, - "text": "定位至上次观看" - }, - "has_next": true, - "has_prev": true - } -} - -``` - -
- - -### 查询用户投稿相簿预览 - -
-相簿功能已下线, 以下接口失效, 参见 -#801 - - -> https://api.bilibili.com/x/space/album/index - -*请求方式:GET* - -所有类型的相簿 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------ | ------ | ------- | -| mid | num | 目标用户mid | 必要 | | -| ps | num | 获取的相簿量 | 非必要 | 默认为8 定义域 1-大于1700 (注意滥用风险) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 相簿列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 相簿内容1 | | -| n | obj | 相簿内容(n+1) | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ------ | ----------- | -------------- | -| count | num | 总计图片数 | | -| ctime | num | 发布时间 | 时间戳 | -| description | str | 简介 | | -| doc_id | num | 相簿id | 非动态!!! | -| like | num | 点赞数 | | -| pictures | array | 图片内容 | | -| poster_uid | num | 上传用户mid | | -| title | str | 标题 | 动态内容无 | -| view | num | 浏览数 | | - -`data`数组中的对象中的`pictures`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | --------------------- | -| 0 | obj | 内容图片1 | | -| n | obj | 内容图片(n+1) | 项数取决于`count`的值 | -| …… | obj | …… | …… | - -`pictures`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ----------- | -| img_height | num | 图片高度 | | -| img_size | num | 图片大小 | 单位为KByte | -| img_src | str | 图片url | | -| img_width | num | 图片宽度 | | - -**示例:** - -查询用户`mid=53456`的投稿相簿预览 - -```shell -curl -G 'https://api.bilibili.com/x/space/album/index' \ ---data-urlencode 'mid=53456' \ ---data-urlencode 'ps=2' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "doc_id": 60470424, - "poster_uid": 53456, - "title": "", - "description": "你醒啦![tv_大佬]\n之前说到过的百万粉纪念的视频已经定时在了今天下午七点,欢迎来看呀!", - "pictures": [{ - "img_src": "https://i0.hdslb.com/bfs/album/2840366e30bf7c0aba9da5adde1a771255a57bc7.jpg", - "img_width": 625, - "img_height": 134, - "img_size": 14 - }], - "count": 1, - "ctime": 1583444859, - "view": 1677521, - "like": 29974 - }, { - "doc_id": 58962388, - "poster_uid": 53456, - "title": "", - "description": "上次的那些写实儿童画发出来啦!可以打印下来辟邪[tv_大佬]", - "pictures": [{ - "img_src": "https://i0.hdslb.com/bfs/album/8acaf7c7897cb858cccab36c33a5e875adfef177.jpg", - "img_width": 2172, - "img_height": 3258, - "img_size": 2831 - }, { - "img_src": "https://i0.hdslb.com/bfs/album/1611b6b56d3d4328889a62b9f9bdc92e9d065532.jpg", - "img_width": 3456, - "img_height": 5184, - "img_size": 3024 - }, { - "img_src": "https://i0.hdslb.com/bfs/album/f3a30a2ef5b39711af8b945d54d85ffd1e932b8a.jpg", - "img_width": 1200, - "img_height": 757, - "img_size": 313 - }], - "count": 3, - "ctime": 1582881332, - "view": 1176646, - "like": 25734 - }] -} -``` - -
- -
- -### 查询用户投稿相簿明细 - -
- -相簿功能已下线, 以下接口失效 - - -> https://api.vc.bilibili.com/link_draw/v1/doc/doc_list -> https://api.bilibili.com/x/dynamic/feed/draw/doc_list - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ----------- | ------ | ------------------------------------------------------------ | -| uid | num | 目标用户mid | 必要 | | -| page_num | num | 页码 | 必要 | 默认为0 | -| page_size | num | 每页项数 | 必要 | 默认为30 | -| biz | str | 查询类型 | 非必要 | 全部:all
绘画:draw
摄影:photo
日常:daily
默认为all | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ------ | -------- | ---- | -| items | array | 相簿列表 | | - -`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 相簿内容1 | | -| n | obj | 相簿内容(n+1) | | -| …… | obj | …… | …… | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ------ | ----------- | -------------- | -| count | num | 总计图片数 | | -| ctime | num | 发布时间 | 时间戳 | -| description | str | 简介 | | -| doc_id | num | 相簿id | 非动态!!! | -| like | num | 点赞数 | | -| pictures | array | 图片内容 | | -| poster_uid | num | 上传用户mid | | -| title | str | 标题 | 动态内容无 | -| view | num | 浏览数 | | - -`items`数组中的对象中的`pictures`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | --------------------- | -| 0 | obj | 内容图片1 | | -| n | obj | 内容图片(n+1) | 项数取决于`count`的值 | -| …… | obj | …… | …… | - -`pictures`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | -------- | ----------- | -| img_height | num | 图片高度 | | -| img_size | num | 图片大小 | 单位为KByte | -| img_src | str | 图片url | | -| img_width | num | 图片宽度 | | - -**示例:** - -查询用户`mid=53456`的投稿明细中的全部类型 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/doc_list' \ ---data-urlencode 'uid=2' \ ---data-urlencode 'page_num=1' \ ---data-urlencode 'page_size=2' \ ---data-urlencode 'biz=all' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "success", - "message": "success", - "data": { - "items": [{ - "doc_id": 59015720, - "poster_uid": 2, - "title": "", - "description": "6影是真的无脑,2个宝石都护不住(设计师:这真是太酷了)", - "pictures": [{ - "img_src": "http://i0.hdslb.com/bfs/album/8456f050ec8639c6e0cef36aba27bfdedc550590.jpg", - "img_width": 1824, - "img_height": 840, - "img_size": 1024 - }], - "count": 1, - "ctime": 1582894607, - "view": 707073, - "like": 7055 - }, { - "doc_id": 46853140, - "poster_uid": 2, - "title": "", - "description": "#年度报告# #新年Flag# https://www.bilibili.com/blackboard/timemachine2019.html\n决定了,这就是我的新年Flag!今年我一定要…", - "pictures": [{ - "img_src": "http://i0.hdslb.com/bfs/album/5b3ae76f79d7cf2501afc3ca7c7da509dcf0e38a.jpg", - "img_width": 1125, - "img_height": 2184, - "img_size": 465 - }, { - "img_src": "http://i0.hdslb.com/bfs/album/87789fe9644337a1f7e6a0655a32584705af8bda.jpg", - "img_width": 1125, - "img_height": 2184, - "img_size": 421 - }, { - "img_src": "http://i0.hdslb.com/bfs/album/f752d7f3bb7952f6c0013b3f48ddcb07060b4721.jpg", - "img_width": 1125, - "img_height": 2184, - "img_size": 524 - }, { - "img_src": "http://i0.hdslb.com/bfs/active/7a52a411bccb716c8e67fe70e6c330d5209346de.jpg", - "img_width": 1125, - "img_height": 2184, - "img_size": 534 - }], - "count": 4, - "ctime": 1577966163, - "view": 833193, - "like": 5667 - }] - } -} -``` - -
- -
- -### 查询用户投稿专栏明细 - -> https://api.bilibili.com/x/space/wbi/article - -> ~~https://api.bilibili.com/x/space/article~~(旧链接) - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|-------|--------------------------------------------------------------------------|-----| -| mid | num | 用户uid | | √ | -| pn | num | | 默认:1 | | -| ps | num | | 默认:30
范围:\[1,30\] | | -| sort | str | | `publish_time`:最新发布
`view`:最多阅读
`fav`:最多收藏
默认:`publish_time` | | - -**json回复:** - -根对象 - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|--------------------| -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------|-------|----------|-----| -| articles | array | 专栏文章信息列表 | | -| pn | num | 本次请求分页页数 | | -| ps | num | 本次请求分页大小 | | -| count | num | 专栏文章总数 | | - -`data`对象 -> `articles`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------------------|-------|----------|------| -| id | num | 专栏文章id | | -| category | obj | 分类 | | -| categories | array | 分类 | | -| title | str | 标题 | | -| summary | str | 摘要 | | -| banner_url | str | 封面图 | | -| template_id | num | | | -| state | num | | | -| author | obj | UP主信息 | | -| reprint | num | | | -| image_urls | array | | | -| publish_time | num | 发布时间戳 | 单位:秒 | -| ctime | num | 提交时间戳 | 单位:秒 | -| stats | obj | 专栏文章数据统计 | | -| tags | array | 标签 | | -| words | num | | | -| dynamic | str | 粉丝动态文案 | | -| origin_image_urls | array | | | -| list | | `null` | | -| is_like | bool | | | -| media | obj | | | -| apply_time | str | `空串` | | -| check_time | str | `空串` | | -| original | num | | | -| act_id | num | | | -| dispute | | `null` | | -| authenMark | | `null` | | -| cover_avid | num | | | -| top_video_info | | `null` | | -| type | num | | | - -`data`对象 -> `articles`数组中的对象 -> `category`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|--------|-----| -| id | num | 分类id | | -| parent_id | num | 父级分类id | | -| name | str | 分类名称 | | - -`data`对象 -> `articles`数组中的对象 -> `categories`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|--------|-----| -| id | num | 分类id | | -| parent_id | num | 父级分类id | | -| name | str | 分类名称 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------------|-----|--------|-----| -| mid | num | 用户uid | | -| name | str | 用户名 | | -| face | str | 头像 | | -| pendant | obj | 头像框信息 | | -| official_verify | obj | 账号认证信息 | | -| nameplate | obj | 成就勋章信息 | | -| vip | obj | 大会员信息 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `pendant`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|--------|-----|----------|-----| -| pid | num | 头像框id | | -| name | str | 头像框名称 | | -| image | str | 头像框图片url | | -| expire | num | 过期时间 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `official_verify`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|------|------------------------------| -| type | num | 是否认证 | -1:无
0:个人认证
1:机构认证 | -| desc | str | 认证备注 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `nameplate`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------------|-----|---------|-----| -| nid | num | 勋章id | | -| name | str | 勋章名称 | | -| image | str | 勋章图标 | | -| image_small | str | 勋章图标(小) | | -| level | str | 勋章等级 | | -| condition | str | 获取条件 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `vip`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------------------|-----|------------|---------------------------------| -| type | num | 大会员类型 | 0:无
1:月大会员
2:年度及以上大会员 | -| status | num | 大会员状态 | 0:无
1:有 | -| due_date | num | 大会员过期时间时间戳 | 单位:毫秒 | -| vip_pay_type | num | 支付类型 | | -| theme_type | num | `0` | | -| label | obj | 大会员标签 | | -| avatar_subscript | num | 是否显示大会员图标 | 0:不显示
1:显示 | -| nickname_color | str | 大会员昵称颜色 | | - -`data`对象 -> `articles`数组中的对象 -> `author`对象 -> `vip`对象 -> `label`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------------|-----|--------|------------------------------------------------------------------------------------------------------------------------------| -| path | str | `空串` | | -| text | str | 会员类型文案 | `大会员` `年度大会员` `十年大会员` `百年大会员` `最强绿鲤鱼` | -| label_theme | str | 会员标签 | vip:大会员
annual_vip:年度大会员
ten_annual_vip:十年大会员
hundred_annual_vip:百年大会员
fools_day_hundred_annual_vip:最强绿鲤鱼 | - -`data`对象 -> `articles`数组中的对象 -> `stats`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------|-----|-----|-------| -| view | num | 浏览数 | | -| favorite | num | 收藏数 | | -| like | num | 点赞数 | | -| dislike | num | 点踩数 | 恒为`0` | -| reply | num | 回复数 | | -| share | num | 转发数 | | -| coin | num | 投币数 | | -| dynamic | num | | | - -`data`对象 -> `articles`数组中的对象 -> `tags`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|------|-----|------|-----| -| tid | num | 标签id | | -| name | str | 标签名称 | | - -`data`对象 -> `articles`数组中的对象 -> `media`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-----------|-----|------|-----| -| score | num | `0` | | -| media_id | num | `0` | | -| title | str | `空串` | | -| cover | str | `空串` | | -| area | str | `空串` | | -| type_id | num | `0` | | -| type_name | str | `空串` | | -| spoiler | num | `0` | | - -**示例:** - -```shell -curl -L -X GET 'https://api.bilibili.com/x/space/article?mid=300021061&pn=1&ps=2&sort=publish_time' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "articles": [ - { - "id": 18989884, - "category": { - "id": 15, - "parent_id": 3, - "name": "日常" - }, - "categories": [ - { - "id": 3, - "parent_id": 0, - "name": "生活" - }, - { - "id": 15, - "parent_id": 3, - "name": "日常" - } - ], - "title": "B站UP主日报2022年10月08日23点(v1.1)", - "summary": "冠:罗翔说刑法(2485.45万粉,+7204) 涨:肯德基(+18.37万粉) 掉:Overidea_China(-186850粉) 播:开心锤锤(+927.56万) 赞:荒草音乐(+31.02万) 赞:飞翔的丘丘人(+22.08万) 充:冰糖IO(+210)", - "banner_url": "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg", - "template_id": 4, - "state": 0, - "author": { - "mid": 300021061, - "name": "狸工智能", - "face": "https://i1.hdslb.com/bfs/face/4cba9bc9d6cf6935a37ec156dedb8f8d26c1df95.jpg", - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "nameplate": { - "nid": 3, - "name": "白银殿堂", - "image": "https://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png", - "image_small": "https://i2.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png", - "level": "高级勋章", - "condition": "单个自制视频总播放数>=10万" - }, - "vip": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - } - }, - "reprint": 0, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/8e5497f7854e7df3468fbc29b0dd10fcf17d1223.png" - ], - "publish_time": 1665278884, - "ctime": 1665278884, - "stats": { - "view": 689, - "favorite": 2, - "like": 61, - "dislike": 0, - "reply": 18, - "share": 0, - "coin": 1, - "dynamic": 0 - }, - "words": 0, - "dynamic": "狸子的UP主日报📰v1.1,每天稳定更新~(如果咕咕咕了,请艾特狸子LePtC检查狐务器 [tv_微笑] #排行榜##大数据##狸工智能#", - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg" - ], - "list": null, - "is_like": false, - "media": { - "score": 0, - "media_id": 0, - "title": "", - "cover": "", - "area": "", - "type_id": 0, - "type_name": "", - "spoiler": 0 - }, - "apply_time": "", - "check_time": "", - "original": 1, - "act_id": 0, - "dispute": null, - "authenMark": null, - "cover_avid": 0, - "top_video_info": null, - "type": 0 - }, - { - "id": 18972446, - "category": { - "id": 15, - "parent_id": 3, - "name": "日常" - }, - "categories": [ - { - "id": 3, - "parent_id": 0, - "name": "生活" - }, - { - "id": 15, - "parent_id": 3, - "name": "日常" - } - ], - "title": "B站UP主日报2022年10月07日23点(v1.1)", - "summary": "冠:罗翔说刑法(2484.73万粉,+8020) 涨:靖菌命(+3.61万粉) 掉:Overidea_China(-8593粉) 播:开心锤锤(+971.44万) 赞:荒草音乐(+53.14万) 赞:南方都市报(+18.05万) 充:内德维德(+190)", - "banner_url": "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg", - "template_id": 4, - "state": 0, - "author": { - "mid": 300021061, - "name": "狸工智能", - "face": "https://i1.hdslb.com/bfs/face/4cba9bc9d6cf6935a37ec156dedb8f8d26c1df95.jpg", - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "nameplate": { - "nid": 3, - "name": "白银殿堂", - "image": "https://i2.hdslb.com/bfs/face/f6a31275029365ae5dc710006585ddcf1139bde1.png", - "image_small": "https://i2.hdslb.com/bfs/face/b09cdb4c119c467cf2d15db5263b4f539fa6e30b.png", - "level": "高级勋章", - "condition": "单个自制视频总播放数>=10万" - }, - "vip": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "" - }, - "avatar_subscript": 0, - "nickname_color": "" - } - }, - "reprint": 0, - "image_urls": [ - "https://i0.hdslb.com/bfs/article/8e5497f7854e7df3468fbc29b0dd10fcf17d1223.png" - ], - "publish_time": 1665189149, - "ctime": 1665189149, - "stats": { - "view": 1021, - "favorite": 1, - "like": 66, - "dislike": 0, - "reply": 21, - "share": 2, - "coin": 2, - "dynamic": 0 - }, - "tags": [ - { - "tid": 1598, - "name": "粉丝" - }, - { - "tid": 422982, - "name": "狸子" - }, - { - "tid": 526616, - "name": "大数据" - }, - { - "tid": 14082112, - "name": "狸工智能" - }, - { - "tid": 438, - "name": "排行榜" - } - ], - "words": 0, - "dynamic": "狸子的UP主日报📰v1.1,每天稳定更新~(如果咕咕咕了,请艾特狸子LePtC检查狐务器 [tv_微笑] #排行榜##大数据##狸工智能#", - "origin_image_urls": [ - "https://i0.hdslb.com/bfs/article/5e53260f58f77fff0b8ba6b20179db85b8741b76.jpg" - ], - "list": null, - "is_like": false, - "media": { - "score": 0, - "media_id": 0, - "title": "", - "cover": "", - "area": "", - "type_id": 0, - "type_name": "", - "spoiler": 0 - }, - "apply_time": "", - "check_time": "", - "original": 1, - "act_id": 0, - "dispute": null, - "authenMark": null, - "cover_avid": 0, - "top_video_info": null, - "type": 0 - } - ], - "pn": 1, - "ps": 2, - "count": 1563 - } -} -``` - -
- -### 查询用户专栏文集明细 - -> https://api.bilibili.com/x/article/up/lists - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|----------|-----|-------|-----|-------------------| -| mid | num | 用户uid | √ | | -| sort | num | 排序方式 | | 0:最近更新
1:最多阅读 | -| jsonp | str | | | | -| callback | str | | | | - -**json回复:** - -根对象 - -| 字段名 | 类型 | 内容 | 备注 | -|---------|-----|------|--------------------| -| code | num | 响应码 | 0:成功
-400:请求错误 | -| message | str | 0 | | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象 - -| 字段名 | 类型 | 内容 | 备注 | -|-------|-------|--------|-----| -| lists | array | 文集信息列表 | | -| total | num | 文集总数 | | - -`data`对象 -> `lists`数组中的对象 - -| 字段名 | 类型 | 内容 | 备注 | -|----------------|-----|---------|------| -| id | num | 文集id | | -| mid | num | 作者uid | | -| name | str | 文集名称 | | -| image_url | str | 封面 | | -| update_time | num | 最后更新时间戳 | 单位:秒 | -| ctime | num | 创建时间戳 | 单位:秒 | -| publish_time | num | | 单位:秒 | -| summary | str | `空串` | | -| words | num | 总字数 | | -| read | num | 阅读量 | | -| articles_count | num | 包含文章数 | | -| state | num | `1` | | -| reason | str | `空串` | | -| apply_time | str | `空串` | | -| check_time | str | `空串` | | - -**示例:** - -```shell -curl -X GET 'https://api.bilibili.com/x/article/up/lists' \ - --data-urlencode 'mid=2859372' \ - --data-urlencode 'sort=0' -``` - -
-点击查看 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "lists": [ - { - "id": 77163, - "mid": 2859372, - "name": "碟报", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1664854854, - "ctime": 1554785697, - "publish_time": 1664863200, - "summary": "", - "words": 71532, - "read": 478726, - "articles_count": 113, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 26407, - "mid": 2859372, - "name": "周榜", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1664721205, - "ctime": 1537942450, - "publish_time": 1664721307, - "summary": "", - "words": 102099, - "read": 1366280, - "articles_count": 206, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 107952, - "mid": 2859372, - "name": "制作委员会", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1646663919, - "ctime": 1563107348, - "publish_time": 1646910000, - "summary": "", - "words": 47564, - "read": 72911, - "articles_count": 10, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 26457, - "mid": 2859372, - "name": "实时榜", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1603115712, - "ctime": 1537955117, - "publish_time": 1603115719, - "summary": "", - "words": 206741, - "read": 1136352, - "articles_count": 76, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 49769, - "mid": 2859372, - "name": "预测", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1593933314, - "ctime": 1546153226, - "publish_time": 1593933314, - "summary": "", - "words": 2518, - "read": 55123, - "articles_count": 6, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 96916, - "mid": 2859372, - "name": "书籍周榜", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1559815260, - "ctime": 1559815159, - "publish_time": 1559815577, - "summary": "", - "words": 272, - "read": 2955, - "articles_count": 1, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 96610, - "mid": 2859372, - "name": "原始周榜存档", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1559721231, - "ctime": 1559720762, - "publish_time": 1559721271, - "summary": "", - "words": 290, - "read": 1498, - "articles_count": 1, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 26453, - "mid": 2859372, - "name": "杂谈", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1557303117, - "ctime": 1537954625, - "publish_time": 1557303168, - "summary": "", - "words": 10673, - "read": 38363, - "articles_count": 4, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - }, - { - "id": 59028, - "mid": 2859372, - "name": "新春访谈", - "image_url": "https://i0.hdslb.com/bfs/article/96d2b3d2a72e6497a011c885ab9245c51507ce18.png", - "update_time": 1549878596, - "ctime": 1549343048, - "publish_time": 1549884125, - "summary": "", - "words": 33472, - "read": 34597, - "articles_count": 13, - "state": 1, - "reason": "", - "apply_time": "", - "check_time": "" - } - ], - "total": 9 - } -} -``` - -
- -### 查询用户投稿音频明细 - -> https://api.bilibili.com/audio/music-service/web/song/upper - -*请求方法: GET* - - - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --- | --- | --- | --- | --- | -| mid | num | 用户 mid | 必要 | | -| pn | num | 页码 | 必要 | 默认为 1 | -| ps | num | 每页项数 | 必要 | 默认为 30 | -| order | str | 排序方式 | 必要 | 1: 最新发布
2: 最多播放
3: 最多收藏 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| code | num | 返回值 | 0: 成功
72000000: 缺少参数 | -| msg | str | 返回信息 | 成功为 `success` | -| data | str | 数据本体 | 失败时不存在 | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| curPage | num | 当前页码 | | -| pageCount | num | 总页数 | | -| totalSize | num | 总计数 | | -| pageSize | num | 每页项数 | | -| data | array | 音频列表 | | - -`data` 对象中的 `data` 数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| id | num | 音频 AU 号 | | -| uid | num | 用户 mid | | -| uname | str | 用户名 | | -| author | null | | | -| title | str | 音频标题 | | -| cover | str | 音频封面图片 URL | | -| intro | null | | | -| lyric | str | 音频歌词 URL | | -| crtype | num | 1 | | -| duration | num | 音频时长 | 单位为 秒 | -| passtime | num | 发布时间 | UNIX 秒级时间戳 | -| curtime | num | 0 | | -| aid | null | | | -| cid | null | | | -| msid | null | | | -| attr | null | | | -| limit | null | | | -| activityId | null | | | -| limitdesc | null | | | -| ctime | num | 发布时间 | UNIX 毫秒时间戳 | -| statistic | obj | 统计数 | | -| coin_num | num | 硬币数量 | | -| is_cooper | null | | | - -`data` 数组中的对象中的 `statistic` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| sid | num | 音频 AU 号 | | -| play | num | 播放数 | | -| collect | num | 收藏数 | | -| comment | num | 评论数 | | -| share | num | 分享数 | | - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/audio/music-service/web/song/upper' \ ---url-query 'uid=8047632' \ ---url-query 'pn=1' \ ---url-query 'ps=30' \ ---url-query 'order=2' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "msg": "success", - "data": { - "curPage": 1, - "pageCount": 1, - "totalSize": 2, - "pageSize": 30, - "data": [ - { - "id": 257709, - "uid": 8047632, - "uname": "哔哩哔哩弹幕网", - "author": null, - "title": "【2018拜年祭单品】与你同行~B With U~", - "cover": "http://i0.hdslb.com/bfs/music/0f890889c8e1101f37317def0c4c555068054c88.jpg", - "intro": null, - "lyric": "http://i0.hdslb.com/bfs/music/1519959250257709.lrc", - "crtype": 1, - "duration": 301, - "passtime": 1519878405, - "curtime": 0, - "aid": null, - "cid": null, - "msid": null, - "attr": null, - "limit": null, - "activityId": null, - "limitdesc": null, - "ctime": 1519875632000, - "statistic": { - "sid": 257709, - "play": 845264, - "collect": 21978, - "comment": 1983, - "share": 1685 - }, - "coin_num": 13368, - "is_cooper": null - }, - { - "id": 378521, - "uid": 8047632, - "uname": "哔哩哔哩弹幕网", - "author": null, - "title": "《B TOGETHER》-bilibili九周年主题曲", - "cover": "http://i0.hdslb.com/bfs/music/109136c63e16d83fbad5ec9282a6fb96498d8144.jpg", - "intro": null, - "lyric": "http://i0.hdslb.com/bfs/music/1529979007378521.lrc", - "crtype": 1, - "duration": 261, - "passtime": 1529928347, - "curtime": 0, - "aid": null, - "cid": null, - "msid": null, - "attr": null, - "limit": null, - "activityId": null, - "limitdesc": null, - "ctime": 1529928235000, - "statistic": { - "sid": 378521, - "play": 123264, - "collect": 5501, - "comment": 1591, - "share": 535 - }, - "coin_num": 3640, - "is_cooper": null - } - ] - } -} -``` - -
- -## 频道 - - - -[所有旧接口](https://github.com/SocialSisterYi/bilibili-API-collect/blob/7d89ece2ac46425810647c4ac92acf5f3721cb68/docs/user/space.md#%E9%A2%91%E9%81%93) 已弃用, 现可用接口参见 [合集和视频列表信息](../video/collection.md) - -## 课程 - - - -### 查询用户发布的课程列表 - -> https://api.bilibili.com/pugv/app/web/season/page - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | -------- | -| mid | num | 目标用户mid | 必要 | | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | 默认为20 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | -------- | ---- | -| list | array | 课程列表 | | -| page | obj | 页面信息 | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | -------------- | ------------------------------------- | -| next | bool | 是否存在下一页 | false:最后一页
true:存在下一页 | -| num | num | 当前页码 | | -| size | num | 每页项数 | | -| total | num | 总计项数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | -------------------------- | -| 0 | obj | 课程1 | | -| n | obj | 课程(n+1) | 按照目标用户的发布顺序排列 | -| …… | obj | …… | | - -`data`中的`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ------------- | -| cover | str | 课程封面url | | -| ep_count | num | 课程集数 | | -| link | str | 课程页面url | 手机版页面url | -| page | num | 1 | 作用尚不明确 | -| play | num | 课程播放数 | | -| season_id | num | 课程ssid | | -| status | str | 更新状态说明 | | -| subtitle | str | 课程副标题 | | -| title | str | 课程标题 | | - -**示例:** - -查询用户`mid=33683045`的课程发布列表 - -```shell -curl -G 'https://api.bilibili.com/pugv/app/web/season/page' \ ---data-urlencode 'mid=33683045' \ ---data-urlencode 'ps=5' \ ---data-urlencode 'pn=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "items": [ - { - "cover": "http://i0.hdslb.com/bfs/archive/596575057885fff7f0ceff047437186cba459358.jpg", - "ep_count": 10, - "link": "https://m.bilibili.com/cheese/play/ss80", - "page": 1, - "play": 174467, - "season_id": 80, - "status": "共10期", - "subtitle": "百科全书式军事科普短视频系列", - "title": "《战忽知道》第一季" - }, - { - "cover": "http://i0.hdslb.com/bfs/archive/322aa94d27cece62d2a859caf71ac2426f29eee2.jpg", - "ep_count": 1, - "link": "https://m.bilibili.com/cheese/play/ss145", - "page": 1, - "play": 22155, - "season_id": 145, - "status": "更新至第1期", - "subtitle": "此课程为《局座:第四次工业革命来了》部分集数,请谨慎购买", - "title": "【体验课】局座讲5G:5G如何改变我们的生活?" - }, - { - "cover": "http://i0.hdslb.com/bfs/archive/b9794ac4507f8764e219df413b661b5faf499a19.jpg", - "ep_count": 10, - "link": "https://m.bilibili.com/cheese/play/ss113", - "page": 1, - "play": 49833, - "season_id": 113, - "status": "更新至第10期", - "subtitle": "百科全书式军事科普短视频系列", - "title": "《战忽知道》第二季" - }, - { - "cover": "http://i0.hdslb.com/bfs/archive/7351fcb33592a4bc7aac9f71d421b4b5ce0177d3.jpg", - "ep_count": 10, - "link": "https://m.bilibili.com/cheese/play/ss51", - "page": 1, - "play": 4981037, - "season_id": 51, - "status": "共10期", - "subtitle": "洞悉国际局势,学习战略思维", - "title": "局座的国际战略课" - }, - { - "cover": "http://i0.hdslb.com/bfs/archive/31e2a170b5a815e34f0537a2727b28f1b87dca18.jpg", - "ep_count": 10, - "link": "https://m.bilibili.com/cheese/play/ss121", - "page": 1, - "play": 30754, - "season_id": 121, - "status": "更新至第10期", - "subtitle": "百科全书式军事科普短视频系列", - "title": "《战忽知道》第三季" - } - ], - "page": { - "next": true, - "num": 1, - "size": 5, - "total": 8 - } - }, - "message": "success" -} -``` - -
- -## 订阅 - - - -### 查询用户追番预览列表 - -> http://space.bilibili.com/ajax/Bangumi/getList - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -带有转义,且只能获取最多15条 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ------------------------ | ---------------------------------- | --------------------------- | -| status | bool | 状态 | false:失败
true:成功 | -| data | 失败:str
成功:obj | 失败:错误信息
成功:信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ----- | ------------ | ------------ | -| count | num | 总计追番数 | | -| pages | num | 0 | 作用尚不明确 | -| result | array | 追番预览列表 | | - -`data`中的`result`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | -------------------------- | -| 0 | obj | 追番1 | | -| n | obj | 追番(n+1) | 按照目标用户的关注顺序排列 | -| …… | obj | …… | | -| 14 | obj | 追番15 | 最后一项 | - -`data`中的`result`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | --------------- | --------------------------------- | -| brief | str | 简介 | | -| cover | str | 封面图片url | | -| evaluate | str | 空 | | -| favorites | num | 追番数 | | -| is_finish | num | 是否已完结 | 0:未完结
1:已完结 | -| last_ep_index | num | 0 | 作用尚不明确 | -| newest_ep_index | num | 最新一话 | 可能为0 | -| season_id | str | 番剧ssid | | -| share_url | str | 播放页面链接url | | -| title | str | 标题 | | -| total_count | num | 总计集数 | 未完结:-1
已完结:非0正整数 | - -**示例:** - -查看用户`mid=14082`的追番预览列表 - -```shell -curl -G 'http://space.bilibili.com/ajax/Bangumi/getList' \ ---data-urlencode 'mid=14082' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "status": true, - "data": { - "count": 25, - "pages": 0, - "result": [{ - "season_id": "29310", - "share_url": "http:\/\/bangumi.bilibili.com\/anime\/29310\/", - "title": "异度侵入 ID:INVADED", - "is_finish": 1, - "favorites": 3479220, - "newest_ep_index": 13, - "last_ep_index": 0, - "total_count": 13, - "cover": "http:\/\/i0.hdslb.com\/bfs\/bangumi\/image\/9bf9e66968f85b33ec3769a16c86b36dc984abbc.png", - "evaluate": "", - "brief": "本片讲述利用能检测出人们杀意的装置以及利用思想粒子做出的“井”,来探知事件真相的科幻故事。" - }, { - "season_id": "25739", - "share_url": "http:\/\/bangumi.bilibili.com\/anime\/25739\/", - "title": "关于我转生变成史莱姆这档事", - "is_finish": 1, - "favorites": 5518829, - "newest_ep_index": 0, - "last_ep_index": 0, - "total_count": 27, - "cover": "http:\/\/i0.hdslb.com\/bfs\/bangumi\/a4c0e0ccc44fe3949a734f546cf5bb07da925bad.png", - "evaluate": "", - "brief": "史莱姆生活,开始了。\n上班族的三上悟在道路上被歹徒给刺杀身亡后,回过神来发现自己转生到了异世界。\n不..." - }, - ………… - ] - } -} -``` - -
- -### 查询用户追番(追剧)明细 - -> https://api.bilibili.com/x/space/bangumi/follow/list - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | -------------------- | -| vmid | num | 目标用户mid | 必要 | | -| pn | num | 页码 | 非必要 | 默认为1 | -| ps | num | 每页项数 | 非必要 | 默认为15 定义域1-30 | -| type | num | 查询类型 | 必要 | 1:追番
2:追剧 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
53013:用户隐私设置未公开 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ---------- | ---- | -| list | array | 追番列表 | | -| pn | num | 当前页码 | | -| ps | num | 每页项数 | | -| total | num | 总计追番数 | | - -`data`中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | -------------------------- | -| 0 | obj | 追番1 | | -| n | obj | 追番(n+1) | 按照目标用户的关注顺序排列 | -| …… | obj | …… | | - -`data`中的`list`数组中的对象: - -基本同「番剧详细信息」中的result对象(未完工) - -**示例:** - -查看用户`mid=14082`的追番明细 - -```shell -curl -G 'https://api.bilibili.com/x/space/bangumi/follow/list' \ ---data-urlencode 'vmid=14082' \ ---data-urlencode 'type=1' \ ---data-urlencode 'ps=2' \ ---data-urlencode 'pn=1' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "list": [{ - "season_id": 29310, - "media_id": 28224080, - "season_type": 1, - "season_type_name": "番剧", - "title": "异度侵入 ID:INVADED", - "cover": "http://i0.hdslb.com/bfs/bangumi/image/9bf9e66968f85b33ec3769a16c86b36dc984abbc.png", - "total_count": 13, - "is_finish": 1, - "is_started": 1, - "is_play": 1, - "badge": "会员专享", - "badge_type": 0, - "rights": { - "allow_review": 1, - "is_selection": 1, - "selection_style": 1 - }, - "stat": { - "follow": 3475768, - "view": 87500861, - "danmaku": 1334654, - "reply": 316632, - "coin": 835150, - "series_follow": 3475242, - "series_view": 87500861 - }, - "new_ep": { - "id": 307774, - "index_show": "全13话", - "cover": "http://i0.hdslb.com/bfs/archive/3dce2b856a7b0ea667aa288b51b7c0478fa56c4d.jpg", - "title": "13", - "long_title": "CHANNELEDⅡ", - "pub_time": "2020-03-23 00:30:00", - "duration": 1481000 - }, - "rating": { - "score": 9.8, - "count": 262589 - }, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/image/664dbf039ec2da8dd982b697a108e28e87b9897e.jpg", - "season_status": 13, - "season_title": "TV", - "badge_ep": "会员", - "media_attr": 196608, - "season_attr": 0, - "evaluate": "本片讲述利用能检测出人们杀意的装置以及利用思想粒子做出的“井”,来探知事件真相的科幻故事。...", - "areas": [{ - "id": 2, - "name": "日本" - }], - "subtitle": "", - "first_ep": 307446, - "can_watch": 1, - "series": { - "series_id": 4760, - "title": "ID:INVADED", - "season_count": 1, - "new_season_id": 29310 - }, - "publish": { - "pub_time": "2020-01-06 00:30:00", - "pub_time_show": "敬请期待", - "release_date": "2020-01-06", - "release_date_show": "2020年1月6日" - }, - "mode": 2, - "section": [{ - "section_id": 39327, - "season_id": 29310, - "limit_group": 328, - "watch_platform": 15, - "copyright": "dujia", - "ban_area_show": 1 - }, { - "section_id": 39633, - "season_id": 29310, - "limit_group": 328, - "watch_platform": 15, - "type": 1, - "copyright": "dujia", - "title": "其他", - "ban_area_show": 1 - }, { - "section_id": 44101, - "season_id": 29310, - "limit_group": 316, - "watch_platform": 15, - "type": 4, - "copyright": "ugc", - "ban_area_show": 1 - }], - "url": "https://www.bilibili.com/bangumi/play/ss29310", - "follow_status": 2, - "is_new": 0, - "progress": "", - "both_follow": true - }, { - "season_id": 25739, - "media_id": 139252, - "season_type": 1, - "season_type_name": "番剧", - "title": "关于我转生变成史莱姆这档事", - "cover": "http://i0.hdslb.com/bfs/bangumi/a4c0e0ccc44fe3949a734f546cf5bb07da925bad.png", - "total_count": 27, - "is_finish": 1, - "is_started": 1, - "is_play": 1, - "badge": "会员专享", - "badge_type": 0, - "rights": { - "allow_review": 1, - "is_selection": 1, - "selection_style": 1 - }, - "stat": { - "follow": 5516519, - "view": 246739631, - "danmaku": 3802465, - "reply": 460225, - "coin": 1338958, - "series_follow": 5516535, - "series_view": 246739631 - }, - "new_ep": { - "id": 316957, - "index_show": "全27话", - "cover": "http://i0.hdslb.com/bfs/archive/81d07d1a478ce3a6209b557e14df9b9c78c42abb.jpg", - "title": "OAD03", - "long_title": "外传:利姆鲁的华丽教师生活 其一", - "pub_time": "2020-03-27 00:00:03", - "duration": 1493000 - }, - "rating": { - "score": 9.4, - "count": 83354 - }, - "square_cover": "http://i0.hdslb.com/bfs/bangumi/8d9f5b4a566d0547bc2e3f6f733b732a09c0d3d4.jpg", - "season_status": 13, - "season_title": "TV", - "badge_ep": "会员", - "media_attr": 0, - "season_attr": 0, - "evaluate": "史莱姆生活,开始了。\n上班族的三上悟在道路上被歹徒给刺杀身亡后,回过神来发现自己转生到了异世界。\n不过,自己居然是“史莱姆”!\n他在得到利姆鲁这个名字后开始了自己的史莱姆人生,随着与各个种族相处交流的...", - "areas": [{ - "id": 2, - "name": "日本" - }], - "subtitle": "", - "first_ep": 250460, - "can_watch": 1, - "series": { - "series_id": 4188, - "title": "关于我转生变成史莱姆这档事", - "season_count": 1, - "new_season_id": 25739 - }, - "publish": { - "pub_time": "2018-10-02 00:30:00", - "pub_time_show": "2018年10月02日00:30", - "release_date": "2018-10-02", - "release_date_show": "2018年10月2日" - }, - "mode": 2, - "section": [{ - "section_id": 34988, - "season_id": 25739, - "limit_group": 328, - "watch_platform": 15, - "copyright": "bilibili", - "ban_area_show": 1 - }], - "url": "https://www.bilibili.com/bangumi/play/ss25739", - "follow_status": 2, - "is_new": 0, - "progress": "", - "both_follow": true - }], - "pn": 1, - "ps": 2, - "total": 25 - } -} -``` - -
- -### 查询用户关注的TAG(话题) - -> http://space.bilibili.com/ajax/tags/getSubList - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -如设置隐私查看自己的需要认证 - -带有转义 - -只显示前100个 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---------------------------- | -------------------------------------- | --------------------------- | -| status | bool | 返回值 | false:错误
true:正确 | -| data | 错误时:str
正确时:obj | 错误时:错误信息
正确时:数据本体 | 正确时不返回错误信息 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ----------- | ---- | -| tags | array | 关注TAG列表 | | -| count | num | 关注TAG的数 | | - -`data`中的`tags`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | -------- | -| 0 | obj | 关注TAG1 | | -| n | obj | 关注TAG(n+1) | | -| …… | obj | …… | …… | -| 99 | obj | 关注TAG100 | 最后一项 | - -`data`中的`tags`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | ------------------- | ------------ | -| archive_count | num | 0 | 作用尚不明确 | -| cover | str | TAG图片url | 无则为空 | -| name | str | TAG名 | | -| notify | num | 1 | 作用尚不明确 | -| tag_id | num | tag_id | | -| updated_ts | str | 1970-01-01 08:00:00 | 作用尚不明确 | - -**示例:** - -查询用户`mid=2`的关注TAG - -```shell -curl -G 'http://space.bilibili.com/ajax/tags/getSubList' \ ---data-urlencode 'mid=2' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "status": true, - "data": { - "tags": [{ - "name": "豪宅", - "cover": "", - "tag_id": 47637, - "notify": 1, - "archive_count": 0, - "updated_ts": "1970-01-01 08:00:00" - }, { - "name": "死亡搁浅", - "cover": "", - "tag_id": 1737239, - "notify": 1, - "archive_count": 0, - "updated_ts": "1970-01-01 08:00:00" - }, - ………… - ], - "count": 58 - } -} -``` - -
diff --git a/docs/user/status_number.md b/docs/user/status_number.md deleted file mode 100644 index e33ac45..0000000 --- a/docs/user/status_number.md +++ /dev/null @@ -1,305 +0,0 @@ -# 用户状态数 - -## 关系状态数 -> https://api.bilibili.com/x/relation/stat - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| vmid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ----------- | ----------------------------------------------- | -| mid | num | 目标用户mid | | -| following | num | 关注数 | | -| whisper | num | 悄悄关注数 | 需要登录(Cookie或APP)
未登录或非自己恒为0 | -| black | num | 黑名单数 | 需要登录(Cookie或APP)
未登录或非自己恒为0 | -| follower | num | 粉丝数 | | - -**示例:** - -查询用户`mid=332704117`的关系状态数 - -```shell -curl -G 'https://api.bilibili.com/x/relation/stat' \ ---data-urlencode 'vmid=332704117' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "mid": 332704117, - "following": 32, - "whisper": 0, - "black": 0, - "follower": 919515 - } -} -``` - -
- -## UP主状态数 - -> https://api.bilibili.com/x/space/upstat - -*请求方式:GET* - -认证方式:Cookie(SESSDATA)或APP - -注:该接口需要**任意用户**登录,否则**不会返回任何数据** - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---- | -| access_key | str | APP登录Token | APP方式必要 | | -| mid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | ---------- | ----- | -| archive | obj | 视频播放量 | | -| article | obj | 专栏阅读量 | | -| likes | num | 获赞次数 | | - -`data`中的`archive`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | ---------- | ----- | -| view | num | 视频播放量 | | - -`data`中的`article`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ----- | ---------- | ----- | -| view | num | 专栏阅读量 | | - -**示例:** - -查询用户`mid=456664753`的UP主状态数 - -```shell -curl -G 'https://api.bilibili.com/x/space/upstat' \ ---data-urlencode 'mid=456664753' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "archive": { - "view": 213567370 - }, - "article": { - "view": 3230808 - }, - "likes": 20295095 - } -} -``` - -
- -## 用户导航栏状态数 - -> https://api.bilibili.com/x/space/navnum - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| mid | num | 目标用户mid | 必要 | | -| web_location | str | 333.999 | 不必要 || - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ---------- | ------------ | -| video | num | 投稿视频数 | | -| bangumi | num | 追番数 | 无视隐私设置 | -| cinema | num | 追剧数 | 无视隐私设置 | -| channel | obj | 视频列表数 | | -| favourite | obj | 收藏夹数 | | -| tag | num | 关注TAG数 | 无视隐私设置 | -| article | num | 投稿专栏数 | | -| playlist | num | 0 | 作用尚不明确 | -| album | num | 投稿图文数 | | -| audio | num | 投稿音频数 | | -| pugv | num | 投稿课程数 | | -| upos | num | 动态数 | | -| season_num | num | 视频合集数 | | - -`data`中的`channel`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | ---------- | ------------ | -| master | num | 视频列表数 | | -| guest | num | 视频列表数 | | - -`data`中的`favourite`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ------------ | --------------------------------------- | -| master | num | 全部收藏夹数 | 需要登录(SESSDATA)
只能查看自己的 | -| guest | num | 公开收藏夹数 | | - -**示例:** - -查询用户`mid=645769214`的订阅&投稿状态数 - -```shell -curl -G 'https://api.bilibili.com/x/space/navnum' \ ---data-urlencode 'mid=645769214' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "video": 34, - "bangumi": 1, - "cinema": 0, - "channel": { - "master": 5, - "guest": 5 - }, - "favourite": { - "master": 0, - "guest": 0 - }, - "tag": 0, - "article": 1, - "playlist": 0, - "album": 59, - "audio": 0, - "pugv": 0, - "season_num": 1, - "opus": 59 - } -} -``` - -
- -## 相簿投稿数 - -> https://api.vc.bilibili.com/link_draw/v1/doc/upload_count - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ----------- | ------ | ---- | -| uid | num | 目标用户mid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------- | -| code | num | 返回值 | 0:成功 | -| msg | str | 错误信息 | 默认为success | -| message | str | 错误信息 | 默认为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ---------------------- | ------------------ | -| all_count | num | 相簿总数 | 总数为以下三者之和 | -| draw_count | num | 发布绘画数 | | -| photo_count | num | 发布摄影数 | | -| daily_count | num | 发布日常(图片动态)数 | | - -**示例:** - - 查询用户`mid=53456`的投稿相簿数 - -```shell -curl -G 'https://api.vc.bilibili.com/link_draw/v1/doc/upload_count' \ ---data-urlencode 'uid=53456' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "msg":"success", - "message":"success", - "data":{ - "all_count":92, - "draw_count":5, - "photo_count":0, - "daily_count":87 - } -} -``` - -
diff --git a/docs/video/action.md b/docs/video/action.md deleted file mode 100644 index c6ecb1a..0000000 --- a/docs/video/action.md +++ /dev/null @@ -1,893 +0,0 @@ -# 稿件观众操作 - -## 点赞 - - - -### 点赞视频(web端) - -> https://api.bilibili.com/x/web-interface/archive/like - -*请求方式:POST* - -认证方式:仅可Cookie(SESSDATA) - -需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------- | ------------ | ---------------------- | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | -| like | num | 操作方式 | 必要 | 1:点赞
2:取消赞 | -| csrf | str | CSRF Token(位于 Cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
-403: 账号异常
10003:不存在该稿件
65004:取消点赞失败
65006:重复点赞 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -点赞视频`av79677524`/`BV1uJ411r7hL` - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/archive/like' \ ---data-urlencode 'aid=79677524' \ ---data-urlencode 'like=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/archive/like' \ ---data-urlencode 'bvid=BV1uJ411r7hL' \ ---data-urlencode 'like=1' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -### 点赞视频(APP端) - -> https://app.bilibili.com/x/v2/view/like - -*请求方式:POST* - -认证方式:仅可APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| aid | num | 稿件 avid | 必要 | | -| like | num | 操作方式 | 必要 | 0:点赞
1:取消赞 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-403: 账号异常
10003:不存在该稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------ | ---- | -| toast | str | 提示信息内容 | | - -**示例:** - -点赞视频`av79677524` - -```shell -curl 'https://app.bilibili.com/x/v2/view/like' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'aid=79677524' \ ---data-urlencode 'like=0' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "toast": "点赞收到!视频可能推荐哦" - } -} -``` - -
- -### 判断视频近期是否被点赞(双端) - -> https://api.bilibili.com/x/web-interface/archive/has/like - -*请求方式:GET* - -认证方式:APP或Cookie(SESSDATA) - -注: 这一 API 实际上只能判断出视频**在近期内**是否被点赞, 并不能判断出视频是否被点赞. -「近期」的定义不明, 但至少半年前点赞过的视频, 用这一接口获取到的结果就已经是 `0` 了. 参见 [#380](https://github.com/SocialSisterYi/bilibili-API-collect/issues/380). - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | --------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | num | 被点赞标志 | 0:未点赞
1:已点赞 | - -**示例:** - -视频`av39330059`/`BV1Bt411z799`的状态为已点赞 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/has/like' \ ---data-urlencode 'aid=39330059' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/has/like' \ ---data-urlencode 'bvid=BV1Bt411z799' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": 1 -} -``` - -
- -## 点踩 - -### 点踩视频(App端) - -> https://app.biliapi.net/x/v2/view/dislike - -*请求方式:POST* - -认证方式:仅可App - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------ | ----------------------- | -| access_key | str | APP 登录 Token | 必要 | | -| aid | num | 视频 aid | 必要 | | -| dislike | num | 操作类型 | 必要 | 0:点踩
1:取消点踩 | - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|-----------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
-404:啥都木有
65005:取消踩失败 未点踩过
65007:已踩过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -点踩视频 - -```shell -curl -L -X POST 'https://app.biliapi.net/x/v2/view/dislike' \ --H 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'aid=xxx' \ ---data-urlencode 'dislike=0' -``` - -取消点踩 - -```shell -curl -L -X POST 'https://app.biliapi.net/x/v2/view/dislike' \ --H 'Content-Type: application/x-www-form-urlencoded' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'aid=xxx' \ ---data-urlencode 'dislike=1' -``` - -## 投币 - - - - -### 投币视频(web端) - -> https://api.bilibili.com/x/web-interface/coin/add - -*请求方式:POST* - -认证方式:仅可Cookie(SESSDATA) - -需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | ------------------------- | ------------ | --------------------------------------- | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | -| multiply | num | 投币数量 | 必要 | 上限为2 | -| select_like | num | 是否附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | -| csrf | str | CSRF Token(位于 Cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-104:硬币不足
-111:csrf校验失败
-400:请求错误
-403: 账号异常
10003:不存在该稿件
34002:不能给自己投币
34003:非法的投币数量
34004:投币间隔太短
34005:超过投币上限 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------------------------------------------- | -| like | bool | 是否点赞成功 | true:成功
false:失败
已赞过则附加点赞失败 | - -**示例:** - -为视频`av90671873`/`BV1N7411A7wC`投币2枚 - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/coin/add' \ ---data-urlencode 'aid=90671873' \ ---data-urlencode 'select_like=1' \ ---data-urlencode 'multiply=2' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/coin/add' \ ---data-urlencode 'bvid=BV1N7411A7wC' \ ---data-urlencode 'select_like=1' \ ---data-urlencode 'multiply=2' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": true - } -} -``` - -
- -### 投币视频(APP端) - -> https://app.bilibili.com/x/v2/view/coin/add - -*请求方式:POST* - -认证方式:仅可APP - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------- | ---- | -------------- | ------------ | --------------------------------------- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| aid | num | 稿件 avid | 必要 | | -| multiply | num | 投币数量 | 必要 | 上限为2 | -| select_like | num | 附加点赞 | 非必要 | 0:不点赞
1:同时点赞
默认为0 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-102:账号被封停
-104:硬币不足
-400:请求错误
10003:不存在该稿件
34002:不能给自己投币
34003:非法的投币数量
34004:投币间隔太短
34005:超过投币上限 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ----------------------------------------------------- | -| like | bool | 是否点赞成功 | true:成功
false:失败
已赞过则附加点赞失败 | - -为视频`av90671873`投币2枚 - -```shell -curl 'https://app.bilibili.com/x/v2/view/coin/add' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'aid=90671873' \ ---data-urlencode 'select_like=1' \ ---data-urlencode 'multiply=2' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": true - } -} -``` - -
- -### 判断视频是否被投币(双端) - -> https://api.bilibili.com/x/web-interface/archive/coins - -*请求方式:GET* - -认证方式:APP或Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | --------------------- | -| access_key | str | APP 登录 Token | APP方式必要 | | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | --------- | -| multiply | num | 投币枚数 | 未投币为0 | - -**示例:** - -视频`av37896701`/`BV18t411q7zz`的投币数为2枚 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \ ---data-urlencode 'aid=37896701' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/coins' \ ---data-urlencode 'bvid=BV18t411q7zz' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "multiply": 2 - } -} -``` - -
- -## 收藏 - - - -### 收藏视频(双端) - -> https://api.bilibili.com/medialist/gateway/coll/resource/deal - -*请求方式:POST* - -认证方式:APP或Cookie(SESSDATA) - -鉴权方式:Cookie方式时需要验证referer为 `.bilibili.com`域名下 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ------------------------ | -------------- | ------------------------------ | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| rid | num | 稿件 avid | 必要 | | -| type | num | 必须为2 | 必要 | | -| add_media_ids | nums | 需要加入的收藏夹 mlid | 必要(可选) | 同时添加多个,用`,`(%2C)分隔 | -| del_media_ids | nums | 需要取消的收藏夹 mlid | 必要(可选) | 同时取消多个,用`,`(%2C)分隔 | -| csrf | str | CSRF Token(位于 Cookie) | Cookie 方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
-403:访问权限不足
10003:不存在该稿件
11010: 您访问的内容不存在
11201:已经收藏过了
11202:已经取消收藏了
11203:达到收藏上限
72010017:参数错误 | -| message | str | 错误信息 | 正确为success | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------------------- | ----------------------- | -| prompt | bool | 是否为未关注用户收藏 | false:否
true:是 | - -**示例:** - -将视频`av49166435`添加到收藏夹`49166435`中 - -Cookie方式: - -```shell -curl 'https://api.bilibili.com/medialist/gateway/coll/resource/deal' \ ---data-urlencode 'rid=90671873' \ ---data-urlencode 'type=2' \ ---data-urlencode 'add_media_ids=49166435' \ ---data-urlencode 'del_media_ids=' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' \ --e 'https://www.bilibili.com' -``` - -APP方式: - -```shell -curl 'https://api.bilibili.com/medialist/gateway/coll/resource/deal' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'rid=90671873' \ ---data-urlencode 'type=2' \ ---data-urlencode 'add_media_ids=49166435' \ ---data-urlencode 'del_media_ids=' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "data": { - "prompt": false - }, - "message": "success" -} -``` - -
- -### 收藏视频(Web端) - -> https://api.bilibili.com/x/v3/fav/resource/deal - -*请求方式: POST* - -认证方式: Cookie(SESSDATA) - -**正文参数(application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | ---------------------------------- | ------------ | ------------------------------ | -| rid | num | 稿件 avid | 必要 | | -| type | num | 必须为2 | 必要 | | -| add_media_ids | nums | 需要加入的收藏夹 mlid | 必要(可选) | 同时添加多个,用`,`(%2C)分隔 | -| del_media_ids | nums | 需要取消的收藏夹 mlid | 必要(可选) | 同时取消多个,用`,`(%2C)分隔 | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 必要 | | -| platform | str | 平台标识? | 非必要 | web端: web | -| eab_x | num | 1 | 非必要 | 作用尚不明确 | -| ramval | num | 正整数 | 非必要 | 可能与在该页面的停留时间相关? | -| ga | num | 1 | 非必要 | 作用尚不明确 | -| gaia_source | str | ??? | 非必要 | web端: web_normal | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0: 成功
-101: 账号未登录
-111: csrf 校验失败
2001000: 参数错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | 错误时为 null 或不存在 | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | --------------------- | ----------------------- | -| prompt | bool | 是否为未关注用户收藏? | false:否
true:是 | -| ga_data | null | | 作用尚不明确 | -| toast_msg | str | 空 | 作用尚不明确 | -| success_num | num | 0 | 作用尚不明确 | - -**示例:** - -将视频 `av2` 添加到收藏夹 `645769214` 中 - -```shell -curl -X POST "https://api.bilibili.com/x/v3/fav/resource/deal" \ ---data-urlencode "rid=2" \ ---data-urlencode "type=2" \ ---data-urlencode "csrf=xxx" \ ---data-urlencode "add_media_ids=1428261914" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "prompt": false, - "ga_data": null, - "toast_msg": "", - "success_num": 0 - } -} -``` - -
- -### 判断视频是否被收藏(双端) - -> https://api.bilibili.com/x/v2/fav/video/favoured - -*请求方式:GET* - -认证方式:APP或Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---------- | --------------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| aid | num 或 str | 稿件 avid 或稿件 bvid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-101:账号未登录 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -data 对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | -------- | ------------------------------- | -| count | num | 1 | 作用尚不明确 | -| favoured | bool | 是否收藏 | true:已收藏
false:未收藏 | - -**示例:** - -视频`av46281123`/`BV1Bb411H7Dv`的状态为已收藏 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/v2/fav/video/favoured' \ ---data-urlencode 'aid=46281123' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/v2/fav/video/favoured' \ ---data-urlencode 'aid=BV1Bb411H7Dv' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "count": 1, - "favoured": true - } -} -``` - -
- -## 一键三连 - - - -### 一键三连视频(web端) - -> https://api.bilibili.com/x/web-interface/archive/like/triple - -*请求方式:POST* - -认证方式:仅可Cookie(SESSDATA) - -同时点赞投币收藏视频,收藏于默认收藏夹中 - -需验证 Cookie 中`buvid3`字段存在且正常, 否则将导致触发风控 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------- | ------------ | --------------------- | -| aid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | -| csrf | str | CSRF Token(位于 Cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- |------------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-101:账号未登录
-111:csrf校验失败
-400:请求错误
10003:不存在该稿件
-403: 账号异常 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | --------------------------- | -| like | bool | 是否点赞成功 | true:成功
false:失败 | -| coin | bool | 是否投币成功 | true:成功
false:失败 | -| fav | bool | 是否收藏成功 | true:成功
false:失败 | -| multiply | num | 投币枚数 | 默认为2 | - -**示例:** - -将视频`av91003840`/`BV1Wj411f79U`一键三连 - -avid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/archive/like/triple' \ ---data-urlencode 'aid=91003840' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl 'https://api.bilibili.com/x/web-interface/archive/like/triple' \ ---data-urlencode 'bvid=BV1Wj411f79U' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": true, - "coin": true, - "fav": true, - "multiply": 2 - } -} -``` - -
- -### 一键三连视频(APP端) - -> https://app.bilibili.com/x/v2/view/like/triple - -*请求方式:POST* - -认证方式:仅可APP - -同时点赞投币收藏视频,收藏于默认收藏夹中 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | -------------- | ------------ | ---- | -| access_key | str | APP 登录 Token | APP 方式必要 | | -| aid | num | 稿件 avid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | -------------------------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-101:账号未登录
-400:请求错误
10003:不存在该稿件 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | --------------------------- | -| like | bool | 是否点赞成功 | true:成功
false:失败 | -| coin | bool | 是否投币成功 | true:成功
false:失败 | -| fav | bool | 是否收藏成功 | true:成功
false:失败 | -| multiply | num | 投币枚数 | 默认为2 | - -**示例:** - -将视频`av91003840`一键三连 - -```shell -curl 'https://app.bilibili.com/x/v2/view/like/triple' \ ---data-urlencode 'access_key=xxx' \ ---data-urlencode 'aid=91003840' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "like": true, - "coin": true, - "fav": true, - "multiply": 2 - } -} -``` - -
- -## 分享 - -### 分享视频 (Web端) - -> https://api.bilibili.com/x/web-interface/share/add - -*请求方式:POST* - -鉴权方式: Cookie (buvid3) - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------- | ------------ | --------------------- | -| aid | num | 稿件 aid | 必要 (可选) | aid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要 (可选) | aid 与 bvid 任选一个 | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 不必要 | | -| eab_x | num | 2 | 不必要 | 作用尚不明确 | -| ramval | num | 0 | 不必要 | 作用尚不明确 | -| source | str | web_normal | 不必要 | | -| ga | num | 1 | 不必要 | 可能与风控有关? | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | ---------- | ------------------------------------------------------------------------- | -| code | num | 返回值 | 0: 成功
-101: 账号未登录
-111: csrf校验失败
-400: 请求错误
403: 账号异常,操作失败
71000: 重复分享 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | num | 当前分享数 | | - -**示例:** - -分享视频`BV1oA411776z` - -```shell -curl 'https://api.bilibili.com/x/web-interface/share/add' \ ---data-urlencode 'csrf=xxx' \ ---data-urlencode 'bvid=BV1oA411776z' -``` - -
-查看响应示例: - -```json -{ - "code":0, - "message":"0", - "ttl":1, - "data":19 -} -``` - -
diff --git a/docs/video/appeal.md b/docs/video/appeal.md deleted file mode 100644 index 2324e45..0000000 --- a/docs/video/appeal.md +++ /dev/null @@ -1,425 +0,0 @@ -# 稿件投诉 - -## 附件上传 - -> 附件上传与视频封面上传共用一个api。 - -## 获取投诉类型 - -> https://api.bilibili.com/x/web-interface/archive/appeal/tags - -*请求类型:GET* - -**json回复:** - -| 参数名 | 类型 | 内容 | 备注 | -| ------- | ------------- | ---- | ------- | -| code | num | | 成功为0 | -| message | str | | 成功为0 | -| ttl | num | 1 | | -| data | array | | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ------------------ | -| 0 | obj | 类型条目 1 | | -| n | obj | 类型条目 (n+1) | 按照指定的顺序排列 | -| …… | obj | …… | …… | - -`data`数组中的对象 - -| 项 | 类型 | 内容 | 备注 | -| -------- | ------------------------------ | ---------------- | -------- | -| tid | num | 类型tid | | -| business | num | | 意义不明 | -| weight | num | 权重 | | -| round | num | | 意义不明 | -| state | num | | 意义不明 | -| name | str | 类型名称 | | -| remark | str | 类型备注 | | -| ctime | str | | 意义不明 | -| mtime | str | | 意义不明 | -| controls | 拥有时:array
没有时:null | 详细信息填写提示 | | - -`controls`数组中的对象: - -| 项 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------------- | -------- | -| tid | num | 同上 | | -| bid | num | | 意义不明 | -| name | str | 提示名称 | | -| title | str | 提示标题 | | -| component | str | 需要填入的类型 | | -| placeholder | str | 文本框占位符 | | -| required | num | 是否为必填 | | - -**示例:** - -```bash -curl --location --request GET 'https://api.bilibili.com/x/web-interface/archive/appeal/tags' -``` - -
-查看响应示例 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "tid": 1, - "business": 1, - "weight": 1, - "round": 2, - "state": 1, - "name": "其他", - "remark": "为帮助审核人员更快处理,请补充问题类型和出现位置等详细信息", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2023-09-21T18:40:20+08:00", - "controls": null - }, - { - "tid": 8, - "business": 1, - "weight": 40, - "round": 2, - "state": 1, - "name": "与站内其他视频撞车", - "remark": "为帮助审核人员更快处理, 请描述撞车信息", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2023-03-06T16:36:02+08:00", - "controls": [ - { - "tid": 8, - "bid": 1, - "name": "撞车对象", - "title": "撞车对象", - "component": "input", - "placeholder": "BVID", - "required": 1 - } - ] - }, - { - "tid": 9, - "business": 1, - "weight": 30, - "round": 2, - "state": 1, - "name": "引战", - "remark": "为帮助审核人员更快处理, 请补充引战的话题和出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 10, - "business": 1, - "weight": 20, - "round": 2, - "state": 1, - "name": "不能参加充电", - "remark": "为帮助审核人员更快处理, 请补充问题类型和出现位置等详细信息", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-23T11:35:28+08:00", - "controls": null - }, - { - "tid": 52, - "business": 1, - "weight": 35, - "round": 2, - "state": 1, - "name": "转载/自制错误", - "remark": "为帮助审核人员更快处理, 请补充原创作品出处", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2023-09-20T16:23:39+08:00", - "controls": [ - { - "tid": 52, - "bid": 1, - "name": "出处", - "title": "原创视频出处", - "component": "link", - "placeholder": "请填写链接", - "required": 1 - } - ] - }, - { - "tid": 10018, - "business": 1, - "weight": 36, - "round": 2, - "state": 1, - "name": "违规推广", - "remark": "", - "ctime": "2023-09-21T17:56:21+08:00", - "mtime": "2023-09-22T14:36:41+08:00", - "controls": null - }, - { - "tid": 10019, - "business": 1, - "weight": 34, - "round": 2, - "state": 1, - "name": "其他不规范行为", - "remark": "", - "ctime": "2023-09-21T18:05:33+08:00", - "mtime": "2023-09-22T14:37:03+08:00", - "controls": null - }, - { - "tid": 10020, - "business": 1, - "weight": 89, - "round": 2, - "state": 1, - "name": "危险行为", - "remark": "", - "ctime": "2023-09-21T18:05:51+08:00", - "mtime": "2023-09-22T14:38:08+08:00", - "controls": null - }, - { - "tid": 10022, - "business": 1, - "weight": 1, - "round": 2, - "state": 1, - "name": "其他", - "remark": "", - "ctime": "2023-09-21T19:07:01+08:00", - "mtime": "2023-09-22T14:38:59+08:00", - "controls": null - }, - { - "tid": 10023, - "business": 1, - "weight": 59, - "round": 2, - "state": 1, - "name": "企业商誉侵权", - "remark": "", - "ctime": "2023-12-01T14:06:58+08:00", - "mtime": "2023-12-01T15:33:26+08:00", - "controls": null - }, - { - "tid": 10024, - "business": 1, - "weight": 58, - "round": 2, - "state": 1, - "name": "侵权申诉", - "remark": "", - "ctime": "2023-12-01T14:07:18+08:00", - "mtime": "2023-12-01T15:33:37+08:00", - "controls": null - }, - { - "tid": 2, - "business": 1, - "weight": 100, - "round": 1, - "state": 1, - "name": "违法违禁", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 3, - "business": 1, - "weight": 90, - "round": 1, - "state": 1, - "name": "色情低俗", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2023-09-21T19:07:10+08:00", - "controls": null - }, - { - "tid": 4, - "business": 1, - "weight": 80, - "round": 1, - "state": 1, - "name": "低俗", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 5, - "business": 1, - "weight": 70, - "round": 1, - "state": 1, - "name": "赌博诈骗", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 6, - "business": 1, - "weight": 60, - "round": 1, - "state": 1, - "name": "血腥暴力", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 7, - "business": 1, - "weight": 50, - "round": 1, - "state": 1, - "name": "人身攻击", - "remark": "为帮助审核人员更快处理,补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 10000, - "business": 1, - "weight": 10, - "round": 1, - "state": 1, - "name": "青少年不良信息", - "remark": "为帮助审核人员更快处理, 请补充违规内容出现位置", - "ctime": "2018-08-13T15:41:20+08:00", - "mtime": "2018-08-13T15:41:20+08:00", - "controls": null - }, - { - "tid": 10013, - "business": 1, - "weight": 37, - "round": 1, - "state": 1, - "name": "不良封面/标题", - "remark": "为帮助审核人员更快处理, 请描述详细信息", - "ctime": "2019-04-17T19:18:09+08:00", - "mtime": "2019-04-17T20:42:25+08:00", - "controls": null - }, - { - "tid": 10014, - "business": 1, - "weight": 8, - "round": 1, - "state": 1, - "name": "涉政谣言", - "remark": "为帮助审核人员更快处理,请补充谣言内容出现位置", - "ctime": "2022-09-15T17:23:44+08:00", - "mtime": "2022-09-16T09:56:07+08:00", - "controls": null - }, - { - "tid": 10015, - "business": 1, - "weight": 7, - "round": 1, - "state": 1, - "name": "涉社会事件谣言", - "remark": "为帮助审核人员更快处理,请补充谣言内容出现位置", - "ctime": "2022-09-15T17:25:56+08:00", - "mtime": "2022-09-16T09:56:07+08:00", - "controls": null - }, - { - "tid": 10017, - "business": 1, - "weight": 5, - "round": 1, - "state": 1, - "name": "虚假不实信息", - "remark": "为帮助审核人员更快处理,请补充不实内容出现位置", - "ctime": "2022-09-15T17:28:16+08:00", - "mtime": "2022-09-16T09:56:08+08:00", - "controls": null - }, - { - "tid": 10021, - "business": 1, - "weight": 88, - "round": 1, - "state": 1, - "name": "观感不适", - "remark": "", - "ctime": "2023-09-21T18:06:15+08:00", - "mtime": "2023-09-21T18:06:15+08:00", - "controls": null - } - ] -} -``` - -
- -## 投诉稿件 - -> https://api.bilibili.com/x/web-interface/appeal/v2/submit -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -**正文参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ------------------------ | -| csrf | str | csrf token(位于cookie bili_jct) | 必要 | 位于request body | -| aid | num | 稿件aid | 必要 | 位于request body | -| tid | num | 投诉理由tid | 必要 | 位于request body | -| desc | str | 投诉理由详细描述 | 必要 | 位于request body | -| attach | str | 附件(多个附件用逗号隔开 | 非必要 | 位于request body | -| buid | str | 风控代码 | 必要 | 位于request header | -| Buid | str | 风控代码 | 必要 | 位于request cookies | - -上下两个buid值必须相同,可随机 - -**json回复:** - -| 参数名 | 类型 | 内容 | 备注 | -| ------- | ---- | ------ | ------- | -| code | num | 返回码 | 成功为0 | -| message | str | | 成功为0 | -| ttl | | 1 | | - -**示例:举报av号为61080066的视频,理由为人身攻击,描述为“xxxxx”,并附带了一个图片附件 - -```bash -curl --location --request POST 'https://api.bilibili.com/x/web-interface/appeal/v2/submit' \ ---form 'csrf="xxxx"'\ ---form 'aid="61080066"' \ ---form 'tid="7"' \ ---form 'desc="xxxxx"' \ ---form 'attach="https://archive.biliimg.com/bfs/archive/xxxxx.png"' -``` - -
- 查看响应示例 - -```json -{ - "code":0, - "message":"0", - "ttl":1 -} -``` - -
diff --git a/docs/video/attribute_data.md b/docs/video/attribute_data.md deleted file mode 100644 index a3d1e70..0000000 --- a/docs/video/attribute_data.md +++ /dev/null @@ -1,71 +0,0 @@ -# 视频属性数据说明 - -**PS**:以下部分内容来源不明,且部分值前端不可见,有待验证 - -## attribute字段值(稿件属性位) - -该字段前端已弃用, 相关接口返回恒为 `0`, 参见 [验证视频属性字段,实锤B站视频限流](https://shakaianee.top/archives/9/) - -该字段为二进制标志位,多个标志请用`OR`运算叠加 - -| 位 | 内容 | 备注 | -| ---- | ---------------------- | ------------------------------------------------------------ | -| 0 | 禁止排行 | | -| 1 | 动态禁止 | 禁止APP推送动态 | -| 2 | 禁止网页输出 | | -| 3 | 禁止客户端列表 | | -| 4 | 搜索禁止 | 打全标题或av/bv号都搜索不到的那种 | -| 5 | 海外禁止 | | -| 6 | 禁止推荐 | 禁止被APP端天马列表推荐 | -| 7 | 是否显示“禁止转载“标志 | **注:未经作者授权 禁止转载** | -| 8 | 是否高清 | 视频清晰度>=1080P | -| 9 | 是否PGC稿件 | 番剧&影视 | -| 10 | 允许承包 | | -| 11 | 是否番剧 | | -| 12 | 是否私单 | 存在商业推广恰饭内容 | -| 13 | 是否限制地区 | 大多数番剧&影视 | -| 14 | 禁止其他人添加TAG | | -| 15 | ? | 大多数旧视频会有这个标志 | -| 16 | 跳转 | 番剧及影视av/bv->ep跳转 | -| 17 | 是否影视 | | -| 18 | 是否付费 | | -| 19 | 推送动态 | | -| 20 | 家长模式 | | -| 21 | 是否限制游客和外链 | 分为两种情况,默认全部网页限制referer跳转,但第二种未登录无法访问,可以通过未登陆b站访问https://api.bilibili.com/x/web-interface/view 返回的code为-403来判断 | -| 22 | ? | | -| 23 | ? | | -| 24 | 是否为联合投稿 | | -| 25 | ? | | -| 26 | ? | | -| 27 | ? | | -| 28 | ? | | -| 29 | 是否为互动视频 | | - -## state字段值(稿件状态) - -| 值 | 内容 | 备注 | -| ---- | ------------ | ---------- | -| 1 | 橙色通过 | | -| 0 | 开放浏览 | | -| -1 | 待审 | | -| -2 | 被打回 | | -| -3 | 网警锁定 | | -| -4 | 被锁定 | 视频撞车了 | -| -5 | 管理员锁定 | | -| -6 | 修复待审 | | -| -7 | 暂缓审核 | | -| -8 | 补档待审 | | -| -9 | 等待转码 | | -| -10 | 延迟审核 | | -| -11 | 视频源待修 | | -| -12 | 转储失败 | | -| -13 | 允许评论待审 | | -| -14 | 临时回收站 | | -| -15 | 分发中 | | -| -16 | 转码失败 | | -| -20 | 创建未提交 | | -| -30 | 创建已提交 | | -| -40 | 定时发布 | | -| -50 | 仅UP主可见 | | -| -100 | 用户删除 | | - diff --git a/docs/video/collection.md b/docs/video/collection.md deleted file mode 100644 index 40efe80..0000000 --- a/docs/video/collection.md +++ /dev/null @@ -1,1986 +0,0 @@ -# 合集和视频列表信息 - -请注意区分 **合集(seasons_archives)** 和 **视频列表(seasons_series)** - -合集是后加入的功能, 图标为立体叠放的正方形(.icon-heji), 可以在创作中心管理, 参见 [合集管理](../creativecenter/season.md) - -列表即系列(series)或频道(channel), 图标为平面叠放的矩形且中央有播放按钮标识(.icon-ic_channel1), 在个人空间直接操作 - -此处保留原 Issue 的表述, 参见 [#945](https://github.com/SocialSisterYi/bilibili-API-collect/issues/945) - -## 获取视频合集信息 - -> https://api.bilibili.com/x/polymer/web-space/seasons_archives_list (需验证referer) -> -> https://api.bilibili.com/x/polymer/space/seasons_archives_list (旧接口, 不推荐使用, 无鉴权验证) - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-----|------|--------|-----| -| mid | num | 用户 mid | 必要 | 创建者的 mid,但也可以是任意的非负整数 | -| season_id | num | 视频合集 ID | 必要 | | -| sort_reverse | bool | 排序方式 | 可选 | true: 升序排序
false: 默认排序 | -| page_num | num | 页码索引 | 可选 | 默认为 1 | -| page_size | num | 单页内容数量 | 可选 | 默认为 30 | -| gaia_vtoken | str | 风控验证? | 可选 | 若被风控则必要(如User-Agent不正常) | -| web_location | str | 页面位置? | 可选 | 333.999 | -| w_rid | str | WBI 签名 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------------- | ------- | ------------------------------ | ----------------------------------------------------------- | -| aids | array | 稿件 avid 列表 | 对应下方数组中内容 aid | -| archives | array | 合集中的视频 | | -| meta | obj | 合集元数据 | | -| page | obj | 分页信息 | | - -`data`中的`archives`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|----------|---------| -| 0 | obj | 合集内容 | | -| n | obj | (n+1)P内容 | | -| …… | obj | …… | …… | - -`archives`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|------|-----| -| aid | num | 稿件 avid || -| bvid | str | 稿件 bvid || -| ctime | num | 创建时间 | Unix 时间戳 | -| duration | num | 视频时长 | 单位为秒 | -| enable_vt | bool | false | 旧接口无 | -| interactive_video | bool | 是否是互动视频 | | -| pic | str | 封面 URL || -| playback_position | num || 会随着播放时间增长,播放完成后为 -1 。单位为 % | -| pubdate | num | 发布日期 | Unix 时间戳 | -| stat | obj | 稿件信息 || -| state | num | 0 || -| title | str | 稿件标题|| -| ugc_pay | num | UGC 付费? | 0: 否 | -| vt_display | str | 空 | 旧接口无 | - -`archives`中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|------|-----| -| view | num | 稿件播放量 || -| vt | num | 0 || - -`data`中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|--------------|--------| -| category | num | 0 | | -| cover | str | 合集封面 URL | | -| description | str | 合集描述 | | -| mid | num | UP 主 ID | | -| name | str | 合集标题 | | -| ptime | num | 发布时间 | Unix 时间戳 | -| season_id | num | 合集 ID | | -| total | num | 合集内视频数量 | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|--------------|--------| -| page_num | num | 分页页码 | | -| page_size | num | 单页个数 | | -| total | num | 合集内视频数量 | | - -**示例:** - -获取 `mid=37737161` 的 `season_id=1227671` 视频合集信息,默认排序,第 1 页,每页 30 个视频 - -```shell -curl -G "https://api.bilibili.com/x/polymer/space/seasons_archives_list" \ ---data-urlencode "mid=37737161" \ ---data-urlencode "sort_reverse=false" \ ---data-urlencode "season_id=1227671" \ ---data-urlencode "page_num=1" \ ---data-urlencode "page_size=30" -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aids": [ - 311606079, - 400546145 - ], - "archives": [ - { - "aid": 311606079, - "bvid": "BV1XN411K7g9", - "ctime": 1679651747, - "duration": 261, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/234e6bd061176dba9e148f4373c52fa7cd2d801f.jpg", - "pubdate": 1679651747, - "stat": { - "view": 12145 - }, - "state": 0, - "title": "某些IT社区平台乱象,文章千篇一律,毫不注重版权,文章互相抄袭成潮流,希望能够好好管管!", - "ugc_pay": 0 - }, - { - "aid": 400546145, - "bvid": "BV1qo4y1L73P", - "ctime": 1682777426, - "duration": 335, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/a6b6fb0330bbf6c500720a024e5a9ade24d888c3.jpg", - "pubdate": 1682777425, - "stat": { - "view": 52743 - }, - "state": 0, - "title": "某些搜索引擎得到的结果,官方网站反而排在一些诈骗广告后面,诱导用户下载大量捆绑垃圾软件", - "ugc_pay": 0 - } - ], - "meta": { - "category": 0, - "cover": "https://archive.biliimg.com/bfs/archive/5e1c1f77c3065ec31eec43d7e35f7a061602e4d6.jpg", - "description": "白马首席讲师吐槽系列视频", - "mid": 37737161, - "name": "水浅王八多,真假白马说", - "ptime": 1682777425, - "season_id": 1227671, - "total": 2 - }, - "page": { - "page_num": 1, - "page_size": 30, - "total": 2 - } - } -} -``` - -
- -## 只获取系列视频 - -> https://api.bilibili.com/x/polymer/web-space/home/seasons_series - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | ------------ | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| page_num | num | 页码索引 | 必要 | | -| page_size | num | 单页内容数量 | 必要 | | -| gaia_vtoken | str | 风控验证? | 可选 | 若被风控则必要(如User-Agent不正常) | -| w_rid | str | WBI 签名 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 不必要 | 参见 [WBI 签名](../misc/sign/wbi.md) | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功
-352: 请求被风控
-400: 请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | -------- | -------- | -| items_lists | obj | 内容列表 | 套了个娃 | - -`data`中的`items_lists`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ----- | -------- | ---- | -| page | obj | 分页信息 | | -| seasons_list | array | 空 | | -| series_list | array | 系列列表 | | - -`items_lists`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | -------- | ---- | -| page_num | num | 分页页码 | | -| page_size | num | 单页个数 | | -| total | num | 总页数 | | - -`items_lists`中的`series_list`数组: - -| 项 | 类型 | 内容 | 备注 | -| -- | ---- | ----------------- | ---- | -| 0 | obj | 第1个系列内容 | | -| 1 | obj | 第2个系列内容 | | -| …… | obj | …… | …… | -| n | obj | 第(n+1)个系列内容 | | - -`series_list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ----- | ----------------- | ------------- | -| archives | array | 系列视频列表 | | -| meta | obj | 系列元数据 | | -| recent_aids | array | 系列视频 aid 列表 | 内容类型为num | - -`series_list`中的`archives`数组: - -同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 - -`series_list`中的`meta`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | -------------- | ------------- | -| category | num | 1 | | -| cover | str | 系列封面 URL | | -| creator | str | auto | | -| ctime | num | 创建时间 | Unix 时间戳 | -| description | str | 系列描述 | | -| keywords | array | 系列关键词列表 | 内容类型为str | -| last_update_ts | num | 最近更新时间 | Unix 时间戳 | -| mid | num | UP 主 ID | | -| mtime | num | 修改时间 | Unix 时间戳 | -| name | str | 系列标题 | | -| raw_keywords | str | 原始系列关键词 | | -| series_id | num | 系列 ID | | -| state | num | 2 | | -| total | num | 系列视频数量 | | - -**示例:** - -```shell -curl -G "https://api.bilibili.com/x/polymer/web-space/home/seasons_series" \ ---data-urlencode "mid=37737161" \ ---data-urlencode "page_num=1" \ ---data-urlencode "page_size=10" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "items_lists": { - "page": { - "page_num": 1, - "page_size": 10, - "total": 1 - }, - "seasons_list": [], - "series_list": [ - { - "archives": [ - { - "aid": 284063097, - "bvid": "BV1Fc411x7xF", - "ctime": 1705925782, - "duration": 8885, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/5aa1bb0a121d89969e9bd2634bc7ae23272bf850.jpg", - "playback_position": 0, - "pubdate": 1705925781, - "stat": { - "view": 14683, - "vt": 0 - }, - "state": 0, - "title": "Gradle 教程 已完结 (基于Kotlin DSL讲解) 4K蓝光画质 超强的脚本式项目依赖和构建工具", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 367948632, - "bvid": "BV1P94y1c7tV", - "ctime": 1703844221, - "duration": 52036, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/499aeb41a0428e05523b766e367540b04f7c3ae2.jpg", - "playback_position": 0, - "pubdate": 1703844220, - "stat": { - "view": 82997, - "vt": 0 - }, - "state": 0, - "title": "Kotlin 教程 已完结 (IDEA 2024 最新版) 4K蓝光画质+杜比音效 零基础入门一套搞定 入门到入土经典版", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 836303388, - "bvid": "BV1Hg4y1m7Ca", - "ctime": 1705401362, - "duration": 5873, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/a20b09d1cc1a81f6a9c5ed8ea322656e406be725.jpg", - "playback_position": 0, - "pubdate": 1705401362, - "stat": { - "view": 8417, - "vt": 0 - }, - "state": 0, - "title": "Kotlin 扩展篇 已完结 (IDEA 2024 最新版) 4K蓝光画质 与Java语言混合编程", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 1, - "cover": "http://i0.hdslb.com/bfs/archive/5aa1bb0a121d89969e9bd2634bc7ae23272bf850.jpg", - "creator": "auto", - "ctime": 1705401630, - "description": "包含Kotlin语言学习的完整流程,正在不断完善中哦~", - "keywords": [ - "Kotlin" - ], - "last_update_ts": 1705925782, - "mid": 37737161, - "mtime": 1705925782, - "name": "Kotlin开心路线", - "raw_keywords": "Kotlin", - "series_id": 3908327, - "state": 2, - "total": 3 - }, - "recent_aids": [ - 284063097, - 367948632, - 836303388 - ] - }, - { - "archives": [ - { - "aid": 848832470, - "bvid": "BV1CL4y1i7qR", - "ctime": 1635258883, - "duration": 106474, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/45dddea811257f78ddd6f1e70197d95d7d6b5187.jpg", - "playback_position": 0, - "pubdate": 1635258883, - "stat": { - "view": 438645, - "vt": 0 - }, - "state": 0, - "title": "JavaWeb 教程 已完结(IDEA 2021版本)4K蓝光画质 入土到起立", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 566880413, - "bvid": "BV1Kv4y1x7is", - "ctime": 1676544280, - "duration": 25149, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/cc59de5afebc66447ba93ad9ea0ba73a9b09c117.jpg", - "playback_position": 0, - "pubdate": 1676544280, - "stat": { - "view": 87171, - "vt": 0 - }, - "state": 0, - "title": "Spring 核心教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 615286308, - "bvid": "BV1Lh4y1M7kx", - "ctime": 1688117457, - "duration": 10373, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/5f860de4bc0fab30651ae93396f9c572be8380b2.jpg", - "playback_position": 0, - "pubdate": 1688117457, - "stat": { - "view": 41428, - "vt": 0 - }, - "state": 0, - "title": "Spring MVC 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 403104913, - "bvid": "BV1fV411M7aS", - "ctime": 1688560394, - "duration": 17611, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/c4557a16aa3519183d6ae0114e1c64107bb23703.jpg", - "playback_position": 0, - "pubdate": 1688560394, - "stat": { - "view": 59298, - "vt": 0 - }, - "state": 0, - "title": "Spring Security 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于Spring6的全新重制版本 起立到起飞", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 828666773, - "bvid": "BV1xu4y1m7UP", - "ctime": 1689767299, - "duration": 29696, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/06cf686d4d3f7ce6731975ef59938d759283318e.jpg", - "playback_position": 0, - "pubdate": 1689767299, - "stat": { - "view": 108078, - "vt": 0 - }, - "state": 0, - "title": "Spring Boot 教程 已完结(IDEA 2023最新版)4K蓝光画质 基于SpringBoot 3 的全新重制版本 起飞到删库跑路", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 852857221, - "bvid": "BV1AL4y1j7RY", - "ctime": 1648811079, - "duration": 55544, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/629755f79c13c96c9b6d91da80257a352b29dd86.jpg", - "playback_position": 0, - "pubdate": 1648811079, - "stat": { - "view": 168251, - "vt": 0 - }, - "state": 0, - "title": "SpringCloud 教程 已完结(IDEA 2022.1最新版)4K蓝光画质 微服务开发", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 1, - "cover": "http://i0.hdslb.com/bfs/archive/45dddea811257f78ddd6f1e70197d95d7d6b5187.jpg", - "creator": "auto", - "ctime": 1669273103, - "description": "已排序完成,共4个系列,请至少完成Java SE篇视频之后再开始JavaEE路线哦~ 整个路线大致为:JavaWeb基础篇、SSM成长篇、SpringBoot成熟篇、SpringCloud进阶篇", - "keywords": [ - "" - ], - "last_update_ts": 1696249622, - "mid": 37737161, - "mtime": 1696249622, - "name": "JavaEE通关路线", - "raw_keywords": "", - "series_id": 2800548, - "state": 2, - "total": 9 - }, - "recent_aids": [ - 848832470, - 566880413, - 615286308, - 403104913, - 828666773, - 852857221 - ] - }, - { - "archives": [ - { - "aid": 445283537, - "bvid": "BV14j411S76G", - "ctime": 1687946670, - "duration": 7008, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/208bb09ecf97fbbd73e45b3839715276ffbbe8f4.jpg", - "playback_position": 0, - "pubdate": 1687946670, - "stat": { - "view": 9483, - "vt": 0 - }, - "state": 0, - "title": "Apache Maven 依赖管理 极速上手 已完结(2021 版本)4K蓝光画质+杜比音效 从导入到冲突", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 813084463, - "bvid": "BV1r34y1p7j9", - "ctime": 1656909478, - "duration": 17457, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/798135f31dc9e03121458f32825dc81d8e403887.jpg", - "playback_position": 0, - "pubdate": 1656909478, - "stat": { - "view": 46179, - "vt": 0 - }, - "state": 0, - "title": "Docker 容器技术 已完结(2022 最新版)4K蓝光画质+杜比音效 从内卷到开摆", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 432905025, - "bvid": "BV1a3411f7nh", - "ctime": 1669296029, - "duration": 10393, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/d14c0fad064a224de7afb7edd147f8b335324c53.jpg", - "playback_position": 0, - "pubdate": 1669296029, - "stat": { - "view": 37040, - "vt": 0 - }, - "state": 0, - "title": "Linux 操作系统 光速入门 已完结(2021 版本)4K蓝光画质+杜比音效 从讨厌到喜欢", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 390385576, - "bvid": "BV19d4y147Df", - "ctime": 1669272992, - "duration": 23389, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/8ba763e1a1e14c47c1c178ecf21240896d3fbb5e.jpg", - "playback_position": 0, - "pubdate": 1669272992, - "stat": { - "view": 32189, - "vt": 0 - }, - "state": 0, - "title": "MySQL 数据库技术 已完结(2021版本)4K蓝光画质+杜比音效 从内卷到开摆", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 647924810, - "bvid": "BV1ce4y1W7YB", - "ctime": 1669275447, - "duration": 8492, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/f5bcc92a4e181cb12a8b80499cea255f43f2d97b.jpg", - "playback_position": 0, - "pubdate": 1669275447, - "stat": { - "view": 20004, - "vt": 0 - }, - "state": 0, - "title": "Git 版本控制 快速上手 已完结(2021版本)4K蓝光画质+杜比音效 从开摆到放弃", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 347934006, - "bvid": "BV1vR4y1o7Z2", - "ctime": 1669295228, - "duration": 10631, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/f95d39b0bc1a2bdad07461a8f4b1ea48c174902c.jpg", - "playback_position": 0, - "pubdate": 1669295228, - "stat": { - "view": 25860, - "vt": 0 - }, - "state": 0, - "title": "Redis 缓存技术 已完结(2021版本)4K蓝光画质+杜比音效 从内卷到开摆", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 1, - "cover": "http://i1.hdslb.com/bfs/archive/208bb09ecf97fbbd73e45b3839715276ffbbe8f4.jpg", - "creator": "auto", - "ctime": 1669273164, - "description": "包含主线中讲解的中间件归档视频与当下必学的火热技术。", - "keywords": [ - "" - ], - "last_update_ts": 1688123428, - "mid": 37737161, - "mtime": 1688123428, - "name": "必学技术与中间件", - "raw_keywords": "", - "series_id": 2800550, - "state": 2, - "total": 7 - }, - "recent_aids": [ - 445283537, - 813084463, - 432905025, - 390385576, - 647924810, - 347934006 - ] - }, - { - "archives": [ - { - "aid": 900707014, - "bvid": "BV1YP4y1o75f", - "ctime": 1663494406, - "duration": 103542, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/291dd3b60b67a8f74567a81999612bd50b4e8017.jpg", - "playback_position": 0, - "pubdate": 1663494406, - "stat": { - "view": 312144, - "vt": 0 - }, - "state": 0, - "title": "JavaSE 教程 已完结 (IDEA 2022 最新版) 4K蓝光画质+杜比音效 零基础入门一套搞定 入门到入土", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 604837097, - "bvid": "BV1G84y1v7Vj", - "ctime": 1667815711, - "duration": 19395, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/4a4522194a1d0c8ae684976b26fb2fe43ce28f39.jpg", - "playback_position": 0, - "pubdate": 1667815711, - "stat": { - "view": 74496, - "vt": 0 - }, - "state": 0, - "title": "JavaSE AWT/Swing 图形化编程 (IDEA 2022 最新版) 4K蓝光画质+杜比音效 快速上手桌面程序 用IDEA写IDEA", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 766688029, - "bvid": "BV1Er4y1r7as", - "ctime": 1645157763, - "duration": 21585, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/ced6a8c8548f0f921f306ea3589f9d470adc0446.jpg", - "playback_position": 0, - "pubdate": 1645157763, - "stat": { - "view": 133409, - "vt": 0 - }, - "state": 0, - "title": "Java JVM 虚拟机 已完结(IDEA 2021版本)4K蓝光画质 全程劝退", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 936955310, - "bvid": "BV1JT4y1S7K8", - "ctime": 1646391131, - "duration": 31736, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/9347ef3cdb6cf0e5bca29ce32e211b488e90ab7b.jpg", - "playback_position": 0, - "pubdate": 1646391131, - "stat": { - "view": 74731, - "vt": 0 - }, - "state": 0, - "title": "Java JUC 并发编程 已完结(IDEA 2021版本)4K蓝光画质 玩转多线程", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 768437265, - "bvid": "BV1ar4y1J7mC", - "ctime": 1650881312, - "duration": 26314, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/7f97549147c09a386d9402b121cc6206c36e4079.jpg", - "playback_position": 0, - "pubdate": 1650881312, - "stat": { - "view": 67900, - "vt": 0 - }, - "state": 0, - "title": "Java NIO Netty网络编程 已完结(IDEA 2022.1最新版)4K蓝光画质 网络I/O进阶编程", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 684547077, - "bvid": "BV1tU4y1y7Fg", - "ctime": 1653900327, - "duration": 10243, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/dc0cc9464c6fc274c1f23f682a01dab5a358217b.jpg", - "playback_position": 0, - "pubdate": 1653900327, - "stat": { - "view": 47693, - "vt": 0 - }, - "state": 0, - "title": "JavaSE 9-17 新特性 已完结(IDEA 2022.1最新版)4K蓝光画质 Java9/10/11/12/13/14/15/16/17讲解", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 1, - "cover": "http://i0.hdslb.com/bfs/archive/291dd3b60b67a8f74567a81999612bd50b4e8017.jpg", - "creator": "auto", - "ctime": 1648810702, - "description": "已排序完成,共3个系列,完成JavaSE篇之后,就可以开启JavaEE路线了", - "keywords": [ - "" - ], - "last_update_ts": 1667816253, - "mid": 37737161, - "mtime": 1667816253, - "name": "JavaSE基础路线", - "raw_keywords": "", - "series_id": 2158988, - "state": 2, - "total": 6 - }, - "recent_aids": [ - 900707014, - 604837097, - 766688029, - 936955310, - 768437265, - 684547077 - ] - }, - { - "archives": [ - { - "aid": 770027221, - "bvid": "BV1Cr4y137os", - "ctime": 1655371329, - "duration": 48185, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/5d9bd135f068e623e50c7341244635f6cc96c3ea.jpg", - "playback_position": 0, - "pubdate": 1655371329, - "stat": { - "view": 275378, - "vt": 0 - }, - "state": 0, - "title": "C语言程序设计 已完结(CLion 2022 最新版)4K蓝光画质+杜比音效 梦开始的地方", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 941207928, - "bvid": "BV13W4y127Ey", - "ctime": 1658474799, - "duration": 69081, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/0bf055a0961c0f9bbb7f869b47c3e3d7df21f55c.jpg", - "playback_position": 0, - "pubdate": 1658474798, - "stat": { - "view": 220072, - "vt": 0 - }, - "state": 0, - "title": "数据结构与算法 已完结(CLion 2022 最新版)4K蓝光画质+杜比音效 全程高能", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 426681358, - "bvid": "BV1u3411P7Na", - "ctime": 1653033628, - "duration": 12346, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i0.hdslb.com/bfs/archive/4174e2976f750d5410d6cef374c3035190717cac.jpg", - "playback_position": 0, - "pubdate": 1653033628, - "stat": { - "view": 71911, - "vt": 0 - }, - "state": 0, - "title": "Java 设计模式 已完结(IDEA 2022.1最新版)4K蓝光画质+杜比音效", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 1, - "cover": "http://i0.hdslb.com/bfs/archive/5d9bd135f068e623e50c7341244635f6cc96c3ea.jpg", - "creator": "auto", - "ctime": 1653296733, - "description": "Java设计模式系列视频,提升你的代码编写规范。", - "keywords": [ - "" - ], - "last_update_ts": 1658735292, - "mid": 37737161, - "mtime": 1658735292, - "name": "高等院校计算机必修课", - "raw_keywords": "", - "series_id": 2318088, - "state": 2, - "total": 3 - }, - "recent_aids": [ - 770027221, - 941207928, - 426681358 - ] - } - ] - } - } -} -``` - -
- -## 获取系列和合集视频 - -> https://api.bilibili.com/x/polymer/web-space/seasons_series_list - -*请求方式: GET* - -鉴权方式: 请求头 User-Agent 为正常浏览器, 若仍被风控则请求头再带上 Referer 为 `.bilibili.com` 下任意页 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| page_num | num | 页码 | 必要 | 默认为 1 | -| page_size | num | 每页数量 | 必要 | 默认为 20 | -| w_rid | str | WBI 签名 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 可选 | 参见 [WBI 签名](../misc/sign/wbi.md) | -| web_location | str | 页面位置? | 可选 | 333.999 | - -**JSON回复:** - -与 [只获取系列视频](#只获取系列视频) 基本一致, 但 `.data.items_lists.seasons_list` 数组不为空, -且该数组中的元素结构与 `.data.items_lists.series_list` 相同, 略 - -**示例:** - -获取 `mid=37737161` 的系列视频列表,每页 5 条,页码为 1 - -```shell -curl -G "https://api.bilibili.com/x/polymer/web-space/seasons_series_list" \ ---data-urlencode "mid=37737161" \ ---data-urlencode "page_num=1" \ ---data-urlencode "page_size=5" \ ---data-urlencode "w_rid=xxx" \ ---data-urlencode "wts=xxx" -``` - -
-查看响应示例: - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "items_lists": { - "page": { - "page_num": 1, - "page_size": 5, - "total": 9 - }, - "seasons_list": [ - { - "archives": [ - { - "aid": 343807541, - "bvid": "BV1t94y1D79E", - "ctime": 1658907465, - "duration": 2164, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i1.hdslb.com/bfs/archive/0af0faa77a1921db4cf86c115db70aa2594983f0.jpg", - "playback_position": 0, - "pubdate": 1658907465, - "stat": { - "view": 43096, - "vt": 0 - }, - "state": 0, - "title": "Java学习路线两条龙版,让你不再迷茫!包含各个知识点梳理,常用技术栈介绍等。", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 429032764, - "bvid": "BV11G411h7NB", - "ctime": 1659499261, - "duration": 197, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/5235a0ab2738e288b08654aa8e0cd3a509a7ef96.jpg", - "playback_position": 0, - "pubdate": 1659499200, - "stat": { - "view": 22700, - "vt": 0 - }, - "state": 0, - "title": "好书推荐《On Java》都什么年代了,还在看传统Java书籍?", - "ugc_pay": 0, - "vt_display": "" - }, - // ... - ], - "meta": { - "category": 0, - "cover": "https://archive.biliimg.com/bfs/archive/27733cf13514d990c880154b937cd8633f583aa4.jpg", - "description": "除教程视频外其他的视频,均在此。", - "mid": 37737161, - "name": "合集·拾枝杂谈", - "ptime": 1694682652, - "season_id": 587216, - "total": 10 - }, - "recent_aids": [ - 343807541, - 429032764, - 857089796, - 560181990, - 774119786, - 859397126 - ] - }, - { - "archives": [ - { - "aid": 311606079, - "bvid": "BV1XN411K7g9", - "ctime": 1679651747, - "duration": 261, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/234e6bd061176dba9e148f4373c52fa7cd2d801f.jpg", - "playback_position": 0, - "pubdate": 1679651747, - "stat": { - "view": 12150, - "vt": 0 - }, - "state": 0, - "title": "某些IT社区平台乱象,文章千篇一律,毫不注重版权,文章互相抄袭成潮流,希望能够好好管管!", - "ugc_pay": 0, - "vt_display": "" - }, - { - "aid": 400546145, - "bvid": "BV1qo4y1L73P", - "ctime": 1682777426, - "duration": 335, - "enable_vt": false, - "interactive_video": false, - "pic": "http://i2.hdslb.com/bfs/archive/a6b6fb0330bbf6c500720a024e5a9ade24d888c3.jpg", - "playback_position": 0, - "pubdate": 1682777425, - "stat": { - "view": 52744, - "vt": 0 - }, - "state": 0, - "title": "某些搜索引擎得到的结果,官方网站反而排在一些诈骗广告后面,诱导用户下载大量捆绑垃圾软件", - "ugc_pay": 0, - "vt_display": "" - } - ], - "meta": { - "category": 0, - "cover": "https://archive.biliimg.com/bfs/archive/5e1c1f77c3065ec31eec43d7e35f7a061602e4d6.jpg", - "description": "白马首席讲师吐槽系列视频", - "mid": 37737161, - "name": "合集·水浅王八多,真假白马说", - "ptime": 1682777425, - "season_id": 1227671, - "total": 2 - }, - "recent_aids": [ - 311606079, - 400546145 - ] - }, - // ... - ], - "series_list": [ - // 与前接口基本相同 - ] - } - } -} -``` - -
- -## 查询指定系列 - -> https://api.bilibili.com/x/series/series - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| series_id | num | 系列ID | 必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ---- | -| meta | obj | 系列信息 | | -| recent_aids | array | 系列 aid 列表 | 内容类型为 num | - -`data`中的`meta`对象: - -同[只获取系列视频](#只获取系列视频)中的`meta`对象 - -**示例:** - -```shell -curl -G 'https://api.bilibili.com/x/series/series' \ ---data-urlencode 'series_id=2158988' -``` - -
-查看响应示例 - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "meta": { - "series_id": 2158988, - "mid": 37737161, - "name": "JavaSE基础路线", - "description": "已排序完成,共3个系列,完成JavaSE篇之后,就可以开启JavaEE路线了", - "keywords": [ - "" - ], - "creator": "auto", - "state": 2, - "last_update_ts": 1667816253, - "total": 6, - "ctime": 1648810702, - "mtime": 1667816253, - "raw_keywords": "", - "category": 1 - }, - "recent_aids": [ - 900707014, - 604837097, - 766688029, - 936955310, - 768437265, - 684547077 - ] - } -} -``` - -
- -## 获取指定系列视频 - -> https://api.bilibili.com/x/series/archives - -*请求方式: GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| series_id | num | 系列ID | 必要 | | -| only_normal | bool | 作用尚不明确 | 可选 | 默认为 true | -| sort | str | 排序方式 | 可选 | desc: 默认排序
asc: 升序排序 | -| pn | num | 页码 | 可选 | 默认为 1 | -| ps | num | 每页数量 | 可选 | 默认为 20 | -| current_mid | num | 当前用户 mid | 可选 | 用于 `playback_position` 播放进度 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------- | -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------ | ---- | ------------ | ---- | -| aids | array | 视频 aid 列表 | 内容类型为 num | -| page | obj | 页码信息 | | -| archives | array | 视频信息列表 | | - -`data`中的`page`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| num | num | 当前页码 | | -| size | num | 每页数量 | | -| total | num | 视频总数 | | - -`data`中的`archives`数组: - -基本同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 - -**示例:** - -获取 `mid=39665558` 的 `series_id=534501` 系列视频列表,每页 16 条,页码为 1,默认排序, 当前用户 mid 为 `1070915568` - -```shell -curl -G "https://api.bilibili.com/x/series/archives" \ ---data-urlencode "mid=39665558" \ ---data-urlencode "series_id=534501" \ ---data-urlencode "only_normal=true" \ ---data-urlencode "sort=desc" \ ---data-urlencode "pn=1" \ ---data-urlencode "ps=16" \ ---data-urlencode "current_mid=1070915568" -``` - -
-查看响应示例: - -```jsonc -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aids": [ - 695029098, - 724599872, - 594794875, - 41565264, - 541053051, - 499696652, - 673071936, - 462891077, - 973903762, - 61692380, - 336713491, - 372661682, - 550840795, - 51839931, - 718592873, - 87838863 - ], - "page": { - "num": 1, - "size": 16, - "total": 25 - }, - "archives": [ - { - "aid": 695029098, - "title": "Python控制Minecraft教程(下):自动建造", - "pubdate": 1677321251, - "ctime": 1677321251, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/187c0ba21b9ceba908a8760e83d49f466316824b.jpg", - "duration": 275, - "stat": { - "view": 26555 - }, - "bvid": "BV1k24y1J78X", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 724599872, - "title": "『教程』一看就懂!Github基础教程", - "pubdate": 1646740815, - "ctime": 1646740824, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/1401ebe64e88deddf2b44ad6a740ff8872c2fda6.jpg", - "duration": 296, - "stat": { - "view": 2412054 - }, - "bvid": "BV1hS4y1S7wL", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 594794875, - "title": "『教程』手把手教你流畅访问Github", - "pubdate": 1647345613, - "ctime": 1647336725, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/71cc640a84087cc99399449c00b93212fe78ee6f.jpg", - "duration": 236, - "stat": { - "view": 910491 - }, - "bvid": "BV1Aq4y1q7hr", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 41565264, - "title": "《Python负基础到入门教程》专为\"非计算机专业和编程困难户\"制作(全13集 配音字幕重制版)", - "pubdate": 1548316071, - "ctime": 1548316072, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/5f4f6acfc00723c84f726d35add94b1d4b4ee482.jpg", - "duration": 6395, - "stat": { - "view": 261286 - }, - "bvid": "BV1et411b76c", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 541053051, - "title": "『教程』文字频频乱码 这背后是显卡的扭曲还是规则的沦丧?", - "pubdate": 1592996906, - "ctime": 1592996907, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/8a3c3e3d01a91776763d34bba79add698869c82d.jpg", - "duration": 381, - "stat": { - "view": 1184937 - }, - "bvid": "BV1ai4y1x7Uz", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 499696652, - "title": "『教程』VsCode五分钟上手教程 无一句废话", - "pubdate": 1601207369, - "ctime": 1601207369, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/cb78c07a090ed456bdcc217b0417670867772a29.jpg", - "duration": 329, - "stat": { - "view": 417610 - }, - "bvid": "BV1bK411P767", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 673071936, - "title": "『教程』补码怎么来的?", - "pubdate": 1620994814, - "ctime": 1620986531, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/12c02599321a0b1386b29ddc4653ff7df9bd54b4.jpg", - "duration": 445, - "stat": { - "view": 247578 - }, - "bvid": "BV16U4y1t7LD", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 462891077, - "title": "『教程』回调函数是个啥?", - "pubdate": 1631274885, - "ctime": 1631274885, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/df294350462558601f65b743ca25e2fdc01de628.jpg", - "duration": 452, - "stat": { - "view": 213895 - }, - "bvid": "BV1vL411t78b", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 98 - }, - { - "aid": 973903762, - "title": "『教程』堆栈是个啥?", - "pubdate": 1625227205, - "ctime": 1625227209, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/bf7956b6311ec0787fd52d1293bb4287d16b7e65.jpg", - "duration": 370, - "stat": { - "view": 535174 - }, - "bvid": "BV1P44y1q7uL", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 99 - }, - { - "aid": 61692380, - "title": "『教程』什么是递归?", - "pubdate": 1564660818, - "ctime": 1564637347, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/4af853671204b9bc631fada1934a3e86145a7d19.jpg", - "duration": 658, - "stat": { - "view": 487397 - }, - "bvid": "BV194411f71o", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 79 - }, - { - "aid": 336713491, - "title": "『教程』几分钟听懂迭代器", - "pubdate": 1636713476, - "ctime": 1636713476, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/6e255cce7c0303ab0211acd0f9d1ec5980ff03f7.jpg", - "duration": 453, - "stat": { - "view": 110688 - }, - "bvid": "BV18R4y1t7Hg", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 97 - }, - { - "aid": 372661682, - "title": "『教程』桌面精灵是怎样实现的?", - "pubdate": 1604916264, - "ctime": 1604916264, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/aaa8bb7b6fced63dd4792e28c1f78ba903fcc4cc.jpg", - "duration": 326, - "stat": { - "view": 168775 - }, - "bvid": "BV1aZ4y1V7aa", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 550840795, - "title": "『教程』什么是钩子技术?", - "pubdate": 1642744335, - "ctime": 1642744335, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/380b1ff9726c673411cf916b03268c7fb16aff68.jpg", - "duration": 240, - "stat": { - "view": 237568 - }, - "bvid": "BV1Cq4y1c7kK", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 51839931, - "title": "『教程』学编程前必知的8个电脑操作", - "pubdate": 1557313623, - "ctime": 1557313623, - "state": 0, - "pic": "http://i2.hdslb.com/bfs/archive/b54535ee3ff27006912d8013f2ea1667b2a50f80.jpg", - "duration": 641, - "stat": { - "view": 139385 - }, - "bvid": "BV1t4411v78E", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 718592873, - "title": "『教程』这些常见编程单词到底该怎么读?看你能否读对?对✔❌✅☑", - "pubdate": 1634300675, - "ctime": 1634265090, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/de43275f44aea9f6d79c13ee68c6dcdfc9e5fc5e.jpg", - "duration": 783, - "stat": { - "view": 81193 - }, - "bvid": "BV1JQ4y1D79p", - "ugc_pay": 0, - "interactive_video": true, - "enable_vt": 0, - "vt_display": "", - "playback_position": 100 - }, - { - "aid": 87838863, - "title": "『教程』什么是环境变量", - "pubdate": 1581258353, - "ctime": 1581258353, - "state": 0, - "pic": "http://i0.hdslb.com/bfs/archive/331b2304d8262c4252f338599846761d6a5a8e0c.jpg", - "duration": 353, - "stat": { - "view": 99797 - }, - "bvid": "BV1w741147G9", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - } - ] - } -} -``` - -
- -## 根据关键词查找视频 - -> https://api.bilibili.com/x/series/recArchivesByKeywords - -*请求方式:GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| keywords | str | 关键词 | 必要 | 可为空, 即获取所有视频 | -| ps | num | 每页视频数 | 非必要 | 默认为 0, 留空为 20,最大值 100 | -| pn | num | 页码 | 非必要 | 留空为 1,为 0 则直接忽略 ps 参数获取所有 | -| orderby | str | 排序方式 | 非必要 | 最新发布: pubdate(默认)
最多播放: views
senddate: 最新发布 | -| series_id | num | 系列 ID | 非必要 | 用于过滤结果, 即若某一视频包含在系列内则不返回该视频 | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| archives | arr | 视频列表 | | -| page | obj | 页码信息 | | - -`archives` 数组: - -同[获取视频合集信息](#获取视频合集信息)中的`archives`数组 - -`page` 对象: - -同[获取视频合集信息](#获取视频合集信息)中的`page`对象 - -**示例:** - -查询用户 `mid=2` 关键词为 `幕` 的视频, 不限制每页视频数 - -```shell -curl -G "https://api.bilibili.com/x/series/recArchivesByKeywords" \ ---data-urlencode "mid=2" \ ---data-urlencode "keywords=幕" \ ---data-urlencode "ps=0" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "archives": [ - { - "aid": 120040, - "title": "高级语言弹幕测试", - "pubdate": 1311616515, - "ctime": 1497344798, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/55a553659799d8a6fcb645d8f1f9df418ad6fe4e.jpg", - "duration": 911, - "stat": { - "view": 3584767 - }, - "bvid": "BV1Xx411c7cH", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 2, - "title": "字幕君交流场所", - "pubdate": 1252458549, - "ctime": 1497344798, - "state": 0, - "pic": "http://static.hdslb.com/images/transparent.gif", - "duration": 2055, - "stat": { - "view": 4609291 - }, - "bvid": "BV1xx411c7mD", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - }, - { - "aid": 271, - "title": "弹幕测试专用", - "pubdate": 1249886475, - "ctime": 1497344798, - "state": 0, - "pic": "http://i1.hdslb.com/bfs/archive/a5980672f3d03e8292148748a63de99cd45679d3.jpg", - "duration": 1213, - "stat": { - "view": 4857422 - }, - "bvid": "BV1xx411c7Xg", - "ugc_pay": 0, - "interactive_video": false, - "enable_vt": 0, - "vt_display": "", - "playback_position": 0 - } - ], - "page": { - "num": 1, - "size": 0, - "total": 3 - } - } -} -``` - -
- -## 创建视频列表 - -> https://api.bilibili.com/x/series/series/createAndAddArchives - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ----| ---- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | - -**正文参数 (multipart/form-data):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| name | str | 标题 | 必要 | | -| keywords | str | 关键词 | 不必要 | | -| description | str | 简介 | 不必要 | | -| aids | str | 视频 aid 列表 | 不必要 | 以 `,` 分隔, 如 `2,112861,112861976201494,976201494` | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ---- | ------------ | ---- | -| series_id | num | 视频列表 ID | | - -**示例:** - -为 `mid=616368979` 创建视频列表, 标题为 `NAME`, 视频为 `112861976201494` - -```shell -curl -X POST --url "https://api.bilibili.com/x/series/series/createAndAddArchives" \ ---url-query "csrf=xxxxxxxxxx" \ ---data-urlencode "mid=616368979" \ ---data-urlencode "name=NAME" \ ---data-urlencode "aids=112861976201494" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "series_id": 4269765 - } -} -``` - -
- -## 删除视频列表 - -> https://api.bilibili.com/x/series/series/delete - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ----| ---- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | -| mid | num | 用户 mid | 必要 | | -| series_id | num | 视频列表 ID | 必要 | | -| aids | str | 空 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 空 | | - -**示例:** - -为 `mid=616368979` 删除视频列表 `series_id=4269765` - -```shell -curl -X POST --url "https://api.bilibili.com/x/series/series/delete" \ ---url-query "csrf=xxxxxxxxxx" \ ---url-query "series_id=4269765" \ ---url-query "mid=616368979" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 删除视频列表中的稿件 - -> https://api.bilibili.com/x/series/series/delArchives - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ----| ---- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| series_id | num | 视频列表 ID | 必要 | | -| aids | str | 视频 aid 列表 | 必要 | 以 `,` 分隔, 如 `2,112861,112861976201494,976201494` | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------- | -| code | num | 返回值 | 0: 成功 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 空 | | - -**示例:** - -为 `mid=616368979` 删除视频列表 `series_id=4269782` 中的 `112861976201494` - -```shell -curl -X POST --url "https://api.bilibili.com/x/series/series/delArchives" \ ---url-query "csrf=xxxxxxxxxx" \ ---data-urlencode "mid=616368979" \ ---data-urlencode "series_id=4269782" \ ---data-urlencode "aids=112861976201494" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 添加稿件至视频列表 - -> https://api.bilibili.com/x/series/series/addArchives - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -同[删除视频列表中的稿件](#删除视频列表中的稿件) - -**正文参数 (application/x-www-form-urlencoded):** - -同[删除视频列表中的稿件](#删除视频列表中的稿件) - -**JSON回复:** - -同[删除视频列表中的稿件](#删除视频列表中的稿件) - -**示例:** - -为 `mid=616368979` 添加视频 `112861976201494` 至视频列表 `series_id=4269782` - -```shell -curl -X POST --url "https://api.bilibili.com/x/series/series/addArchives" \ ---url-query "csrf=xxxxxxxxxx" \ ---data-urlencode "mid=616368979" \ ---data-urlencode "series_id=4269782" \ ---data-urlencode "aids=112861976201494" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
- -## 编辑视频列表信息 - -> https://api.bilibili.com/x/series/series/update - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ----| ---- | ------ | ---- | -| csrf | str | CSRF Token (即 Cookies 中 bili_jct ) | 必要 | | - -**正文参数 (application/x-www-form-urlencoded):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| mid | num | 用户 mid | 必要 | | -| series_id | num | 视频列表 ID | 必要 | | -| name | str | 标题 | 必要 | | -| keywords | str | 关键词 | 不必要 | | -| description | str | 简介 | 不必要 | | -| add_aids | str | 视频 aid 列表 | 不必要 | 以 `,` 分隔 | -| del_aids | str | 视频 aid 列表 | 不必要 | | -| aids | str | 空 | 不必要 | | - -**JSON回复:** - -同[删除视频列表中的稿件](#删除视频列表中的稿件) - -**示例:** - -为 `mid=616368979` 编辑视频列表 `series_id=4269782`, 设置标题为 `NAME`, 设置简介为空, 设置关键词 `Telnet`, 添加视频 `112861976201494` - -```shell -curl -X POST --url "https://api.bilibili.com/x/series/series/update" \ ---url-query "csrf=xxxxxxxxxx" \ ---data-urlencode "name=NAME" \ ---data-urlencode "mid=616368979" \ ---data-urlencode "series_id=4269782" \ ---data-urlencode "keywords=Telnet" \ ---data-urlencode "add_aids=112861976201494" \ --b "SESSDATA=xxx" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": {} -} -``` - -
diff --git a/docs/video/info.md b/docs/video/info.md deleted file mode 100644 index 75c14d8..0000000 --- a/docs/video/info.md +++ /dev/null @@ -1,4779 +0,0 @@ -# 视频基本信息 - - - -## 获取视频详细信息(web端) - -> https://api.bilibili.com/x/web-interface/wbi/view -> https://api.bilibili.com/x/web-interface/view - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -限制游客访问的视频需要登录 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|--------|--------|---------------| -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------------------------------------------------------------------| -| code | num | 返回值 | 0:成功
-400:请求错误
-403:权限不足
-404:无视频
62002:稿件不可见
62004:稿件审核中
62012:仅UP主自己可见 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------------- | ------- | ------------------------------ | ------------------------------------------------------------ | -| bvid | str | 稿件bvid | | -| aid | num | 稿件avid | | -| videos | num | 稿件分P总数 | 默认为1 | -| tid | num | 分区tid | 详情见[视频分区一览](video_zone.md) | -| tid_v2 | num | 分区tid (v2) | 详情见[视频分区一览 (v2)](video_zone_v2.md) | -| tname | str | 子分区名称 | | -| tname_v2 | str | 子分区名称 (v2) | | -| copyright | num | 视频类型 | 1:原创
2:转载
3:未填写 | -| pic | str | 稿件封面图片url | | -| title | str | 稿件标题 | | -| pubdate | num | 稿件发布时间 | 秒级时间戳 | -| ctime | num | 用户投稿时间 | 秒级时间戳 | -| desc | str | 视频简介 | | -| desc_v2 | array | 新版视频简介 | | -| state | num | 视频状态 | 详情见[属性数据文档](attribute_data.md#state字段值稿件状态) | -| ~~attribute~~(已经弃用) | ~~num~~ | ~~稿件属性位配置~~ | 详情见[属性数据文档](attribute_data.md#attribute字段值稿件属性位) | -| duration | num | 稿件总时长(所有分P) | 单位为秒 | -| forward | num | 撞车视频跳转avid | 仅撞车视频存在此字段 | -| mission_id | num | 稿件参与的活动id | | -| redirect_url | str | 重定向url | 仅番剧或影视视频存在此字段
用于番剧&影视的av/bv->ep | -| rights | obj | 视频属性标志 | | -| owner | obj | 视频UP主信息 | | -| stat | obj | 视频状态数 | | -| argue_info | obj | 争议/警告信息 | | -| dynamic | str | 视频同步发布的的动态的文字内容 | | -| cid | num | 视频1P cid | | -| dimension | obj | 视频1P分辨率 | | -| premiere | | null | | -| teenage_mode | num | | 用于青少年模式 | -| is_chargeable_season | bool | | | -| is_story | bool | 是否为动态视频 | | -| is_upower_exclusive | bool | 是否为充电专属视频 | | -| is_upower_play | bool | | | -| is_upower_preview | bool | 充电专属视频是否支持试看 | | -| no_cache | bool | 是否不允许缓存? | | -| pages | array | 视频分P列表 | | -| subtitle | obj | 视频CC字幕信息 | | -| ugc_season | obj | 视频合集信息 | 不在合集中的视频无此项 | -| staff | array | 合作成员列表 | 非合作视频无此项 | -| is_season_display | bool | | | -| user_garb | obj | 用户装扮信息 | | -| honor_reply | obj | | | -| like_icon | str | 空串 | | -| need_jump_bv | bool | 需要跳转到BV号? | | -| disable_show_up_info | bool | 禁止展示UP主信息? | | -| is_story_play | bool | | 作用未知,可能与动态视频有关 | -| is_view_self | bool | 是否尽自己可见 | | - -`data`中的`desc_v2`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|--------|-----| -| 0 | obj | 新版简介内容 | | - -`desc_v2`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|------|-----| -| raw_text | str | 简介内容 |type=1时显示原文
type=2时显示'@'+raw_text+' '并链接至biz_id的主页| -| type | num | 类型 |1:普通,2:@他人| -| biz_id | num |被@用户的mid|=0,当type=1| - -`data`中的`rights`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|--------------|--------| -| bp | num | 是否允许承包 | | -| elec | num | 是否支持充电 | | -| download | num | 是否允许下载 | | -| movie | num | 是否电影 | | -| pay | num | 是否PGC付费 | | -| hd5 | num | 是否有高码率 | | -| no_reprint | num | 是否显示“禁止转载”标志 | | -| autoplay | num | 是否自动播放 | | -| ugc_pay | num | 是否UGC付费 | | -| is_cooperation | num | 是否为联合投稿 | | -| ugc_pay_preview | num | 0 | 作用尚不明确 | -| no_background | num | 0 | 作用尚不明确 | -| clean_mode | num | 0 | 作用尚不明确 | -| is_stein_gate | num | 是否为互动视频 | | -| is_360 | num | 是否为全景视频 | | -| no_share | num | 0 | 作用尚不明确 | -| arc_pay | num | 0 | 作用尚不明确 | -| free_watch | num | 0 | 作用尚不明确 | - -`data`中的`owner`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|-----| -| mid | num | UP主mid | | -| name | str | UP主昵称 | | -| face | str | UP主头像 | | - -`data`中的`stat`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ------------ | ------- | -| aid | num | 稿件avid | | -| view | num | 播放数 | | -| danmaku | num | 弹幕数 | | -| reply | num | 评论数 | | -| favorite | num | 收藏数 | | -| coin | num | 投币数 | | -| share | num | 分享数 | | -| now_rank | num | 当前排名 | | -| his_rank | num | 历史最高排行 | | -| like | num | 获赞数 | | -| dislike | num | 点踩数 | 恒为`0` | -| evaluation | str | 视频评分 | | -| vt | int | 作用尚不明确 | 恒为`0` | - -`data`中的`argue_info`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ---- | ----------------- | ------------ | -| argue_link | str | | 作用尚不明确 | -| argue_msg | str | 警告/争议提示信息 | | -| argue_type | int | | 作用尚不明确 | - -`data`中的`pages`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|----------|---------| -| 0 | obj | 1P内容 | 无分P仅有此项 | -| n | obj | (n+1)P内容 | | -| …… | obj | …… | …… | - -`pages`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------|-----|-----------|---------------------------------------------| -| cid | num | 分P cid | | -| page | num | 分P序号 | 从1开始 | -| from | str | 视频来源 | vupload:普通上传(B站)
hunan:芒果TV
qq:腾讯 | -| part | str | 分P标题 | | -| duration | num | 分P持续时间 | 单位为秒 | -| vid | str | 站外视频vid | 仅站外视频有效 | -| weblink | str | 站外视频跳转url | 仅站外视频有效 | -| dimension | obj | 当前分P分辨率 | 部分较老视频无分辨率值 | - -`pages`数组中的对象中的`dimension`对象(同`data`中的`dimension`对象): - -| 字段 | 类型 | 内容 | 备注 | -|--------|-----|---------|----------------| -| width | num | 当前分P 宽度 | | -| height | num | 当前分P 高度 | | -| rotate | num | 是否将宽高对换 | 0:正常
1:对换 | - -`subtitle`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-------|----------|-----| -| allow_submit | bool | 是否允许提交字幕 | | -| list | array | 字幕列表 | 未登录为空 | - -`subtitle`对象中的`list`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|---------|-----| -| 0 | obj | 字幕1 | | -| n | obj | 字幕(n+1) | | -| …… | obj | …… | …… | - -`list`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|------|---------------|-----| -| id | num | 字幕id | | -| lan | str | 字幕语言 | | -| lan_doc | str | 字幕语言名称 | | -| is_lock | bool | 是否锁定 | | -| author_mid | num | 字幕上传者mid | | -| subtitle_url | str | json格式字幕文件url | | -| author | obj | 字幕上传者信息 | | - -`list`数组中的对象中的`author`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------------|-----|------------|--------| -| mid | num | 字幕上传者mid | | -| name | str | 字幕上传者昵称 | | -| sex | str | 字幕上传者性别 | 男 女 保密 | -| face | str | 字幕上传者头像url | | -| sign | str | 字幕上传者签名 | | -| rank | num | 10000 | 作用尚不明确 | -| birthday | num | 0 | 作用尚不明确 | -| is_fake_account | num | 0 | 作用尚不明确 | -| is_deleted | num | 0 | 作用尚不明确 | - -`ugc_season`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-------|---------|--------| -| id | num | 视频合集id | | -| title | str | 视频合集标题 | | -| mid | str | 视频合集作者id | | -| intro | str | 视频合集介绍 | | -| sign_state | num | ? | 作用尚不明确 | -| attribute | num | 稿件属性位 | 详情见[属性数据文档](attribute_data.md#attribute字段值(稿件属性位)) | -| sections | array | 视频合集中分部列表,名称可由up主自定义,默认为正片 | | -| stat | obj | 视频合集状态数 | | -| ep_count | num | 视频合集中视频数量 | | -| season_type | num | 作用尚不明确 | | -| is_pay_season | bool | 是否为付费合集 | | -| enable_vt | num | 作用尚不明确 | | - -`ugc_season`中的`sections`数组: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-------|---------|--------| -| season_id | num | 视频合集中分部所属视频合集id | | -| section_id | num | 视频合集中分部id | | -| title | str | 视频合集中分部标题 | | -| type | num | ? | 作用尚不明确 | -| episodes | array | 视频合集中分部的视频列表 | | - -`sections`中的`episodes`数组: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-------|---------|--------| -| season_id | num | 视频合集中分部中视频所属视频合集id | | -| section_id | num | 视频合集中视频合集中分部中视频所属视频合集分部id | | -| id | num | 视频合集分部中视频id(以下简称视频) | | -| aid | num | 视频aid | | -| cid | num | 视频cid | | -| title | str | 视频标题 | 合集列表中展示的标题。默认视频真实标题,在[创作中心-合集管理-单集标题](https://member.bilibili.com/platform/upload-manager/ep)修改后则以修改后为准 | -| ~~attribute~~(已经弃用) | ~~num~~ | ~~稿件属性位配置~~ | 详情见[属性数据文档](attribute_data.md#attribute字段值(稿件属性位)) | -| arc | obj | 视频详细信息 | 基本同「[获取视频详细信息(web端)](#获取视频详细信息(web端))」中的data对象 | - -`ugc_season`中的`stat`对象: - -|字段 | 类型 | 内容 | 备注 | -|------------|-------|---------|--------| -| season_id | num | 视频合集id | | -| view | num | 视频合集总浏览量 | | -| danmaku | num | 视频合集总弹幕量 | | -| reply | num | 视频合集总评论量 | | -| fav | num | 视频合集总收藏数 | | -| coin | num | 视频合集总投币数 | | -| share | num | 视频合集总分享数 | | -| now_rank | num | 视频合集当前排名 | | -| his_rank | num | 视频合集历史排名 | | -| like | num | 视频合集总获赞数 | | -| vt | num | 作用尚不明确 | | -| vv | num | 作用尚不明确 | | - -`ugc_season`示例 - -```jsonc - "ugc_season": { - "id": 2974525, - "title": "楚汉传奇", - "cover": "https://archive.biliimg.com/bfs/archive/5a853e8bd10a041360b45a462785d90a58ec469e.png", - "mid": 1557073149, - "intro": "", - "sign_state": 0, - "attribute": 140, - "sections": [ - { - "season_id": 2974525, - "id": 3341804, - "title": "正片", - "type": 1, - "episodes": [ - { - "season_id": 2974525, - "section_id": 3341804, - "id": 64976947, - "aid": 1804383120, - "cid": 1541093346, - "title": "项燕的10万大军惨败秦国,临死前,立下狠誓“楚虽三户,亡秦必楚”", - "attribute": 0, - "arc": { - "aid": 1804383120, - "videos": 0, - "type_id": 0, - "type_name": "", - "copyright": 0, - "pic": "http://i1.hdslb.com/bfs/archive/9d0ebd0a8abd7b005466cb57632ddaa550d24dab.jpg", - "title": "项燕的10万大军惨败秦国,临死前,立下狠誓“楚虽三户,亡秦必楚”", - "pubdate": 1715427472, - "ctime": 1715427472, - "desc": "", - "state": 0, - "duration": 612, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "arc_pay": 0, - "free_watch": 0 - }, - "author": { - "mid": 0, - "name": "", - "face": "" - }, - "stat": { - "aid": 1804383120, - "view": 787330, - "danmaku": 1298, - "reply": 774, - "fav": 2589, - "coin": 1947, - "share": 271, - "now_rank": 0, - "his_rank": 0, - "like": 12320, - "dislike": 0, - "evaluation": "", - "argue_msg": "", - "vt": 2630119, - "vv": 787330 - }, - "dynamic": "", - "dimension": { - "width": 0, - "height": 0, - "rotate": 0 - }, - "desc_v2": null, - "is_chargeable_season": false, - "is_blooper": false, - "enable_vt": 0, - "vt_display": "" - }, - "page": { - "cid": 1541093346, - "page": 1, - "from": "vupload", - "part": "项燕的10万大军惨败秦国,临死前,立下狠誓“楚虽三户,亡秦必楚”", - "duration": 612, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - } - }, - "bvid": "BV1Tb421b7mi", - "pages": [ - { - "cid": 1541093346, - "page": 1, - "from": "vupload", - "part": "项燕的10万大军惨败秦国,临死前,立下狠誓“楚虽三户,亡秦必楚”", - "duration": 612, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - } - } - ] - }, - { - "season_id": 2974525, - "section_id": 3341804, - "id": 65121012, - "aid": 1004394994, - "cid": 1542426326, - "title": "卢绾斗鸡输了,眼看十个手指头保不住,刘邦倾家荡产帮了他", - "attribute": 0, - "arc": { - /// - } - } - ] - } - ], - "stat": { - "season_id": 3617611, - "view": 1826438, - "danmaku": 5193, - "reply": 3036, - "fav": 5970, - "coin": 2303, - "share": 663, - "now_rank": 0, - "his_rank": 0, - "like": 40848, - "vt": 0, - "vv": 0 - }, - "ep_count": 21, - "season_type": 1, - "is_pay_season": false, - "enable_vt": 0 - - } -``` - -`staff`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-----------|-----| -| 0 | obj | 合作成员1 | | -| n | obj | 合作成员(n+1) | | -| …… | obj | …… | …… | - -`staff`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|---------|-----| -| mid | num | 成员mid | | -| title | str | 成员名称 | | -| name | str | 成员昵称 | | -| face | str | 成员头像url | | -| vip | obj | 成员大会员状态 | | -| official | obj | 成员认证信息 | | -| follower | num | 成员粉丝数 | | -| label_style | num | | | - -`staff`数组中的对象中的`vip`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------------|-----|--------|---------------------------| -| type | num | 成员会员类型 | 0:无
1:月会员
2:年会员 | -| status | num | 会员状态 | 0:无
1:有 | -| due_date | num | 到期时间 | UNIX 毫秒时间戳 | -| vip_pay_type | num | | | -| theme_type | num | 0 | | -| label | obj | | | - -`staff`数组中的对象中的`official`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-----|--------|---------------------------------------| -| role | num | 成员认证级别 | 见[用户认证类型一览](../user/official_role.md) | -| title | str | 成员认证名 | 无为空 | -| desc | str | 成员认证备注 | 无为空 | -| type | num | 成员认证类型 | -1:无
0:有 | - -`data`中的`user_garb`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|-----|-------|-----| -| url_image_ani_cut | str | 某url? | | - -`data`中的`honor_reply`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-------|-----|-----| -| honor | array | | | - -`honor`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------------------|-----|-------------------------------------|-----| -| aid | num | 当前稿件aid | | -| type | num | 1:入站必刷收录
2:第?期每周必看
3:全站排行榜最高第?名
4:热门 | | -| desc | num | 描述 | | -| weekly_recommend_num | num | | | - -**示例:** - -获取视频`av85440373`/`BV117411r7R1`的基本信息 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view' \ ---data-urlencode 'aid=85440373' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view' \ ---data-urlencode 'bvid=BV117411r7R1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "bvid": "BV117411r7R1", - "aid": 85440373, - "videos": 1, - "tid": 28, - "tid_v2": 2061, - "tname": "原创音乐", - "tname_v2": "人力VOCALOID", - "copyright": 1, - "pic": "http://i1.hdslb.com/bfs/archive/ea0dd34bf41e23a68175680a00e3358cd249105f.jpg", - "title": "当我给拜年祭的快板加了电音配乐…", - "pubdate": 1580377255, - "ctime": 1580212263, - "desc": "【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天", - "desc_v2": [ - { - "raw_text": "【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天", - "type": 1, - "biz_id": 0 - } - ], - "state": 0, - "duration": 486, - "mission_id": 11838, - "rights": { - "bp": 0, - "elec": 0, - "download": 1, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 1, - "ugc_pay_preview": 0, - "no_background": 0, - "clean_mode": 0, - "is_stein_gate": 0, - "is_360": 0, - "no_share": 0, - "arc_pay": 0, - "free_watch": 0 - }, - "owner": { - "mid": 66606350, - "name": "陈楒潼桶桶桶", - "face": "https://i2.hdslb.com/bfs/face/c9af3b32cf74baec5a4b65af8ca18ae5ff571f77.jpg" - }, - "stat": { - "aid": 85440373, - "view": 2404179, - "danmaku": 12348, - "reply": 2676, - "favorite": 58329, - "coin": 72793, - "share": 9620, - "now_rank": 0, - "his_rank": 55, - "like": 161270, - "dislike": 0, - "evaluation": "", - "vt": 0 - }, - "argue_info": { - "argue_msg": "", - "argue_type": 0, - "argue_link": "" - }, - "dynamic": "进来就出不去了!!!\n#全民音乐UP主##CB##warma##电音##快板##拜年祭##诸神的奥运##编曲##Remix#", - "cid": 146044693, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "premiere": null, - "teenage_mode": 0, - "is_chargeable_season": false, - "is_story": false, - "is_upower_exclusive": false, - "is_upower_play": false, - "is_upower_preview": false, - "enable_vt": 0, - "vt_display": "", - "is_upower_exclusive_with_qa": false, - "no_cache": false, - "pages": [ - { - "cid": 146044693, - "page": 1, - "from": "vupload", - "part": "建议改成:建议改成:诸 神 的 电 音 节(不是)", - "duration": 486, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "ctime": 1580212263 - } - ], - "subtitle": { - "allow_submit": false, - "list": [ - { - "id": 1061981378473779968, - "lan": "ai-zh", - "lan_doc": "中文(自动生成)", - "is_lock": false, - "subtitle_url": "", - "type": 1, - "id_str": "1061981378473779968", - "ai_type": 0, - "ai_status": 2, - "author": { - "mid": 0, - "name": "", - "sex": "", - "face": "", - "sign": "", - "rank": 0, - "birthday": 0, - "is_fake_account": 0, - "is_deleted": 0, - "in_reg_audit": 0, - "is_senior_member": 0, - "name_render": null - } - } - ] - }, - "staff": [ - { - "mid": 66606350, - "title": "UP主", - "name": "陈楒潼桶桶桶", - "face": "https://i2.hdslb.com/bfs/face/c9af3b32cf74baec5a4b65af8ca18ae5ff571f77.jpg", - "vip": { - "type": 2, - "status": 1, - "due_date": 1769443200000, - "vip_pay_type": 1, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d4f8bfc713826a5412a0a27eaaac4d6b9ede1d9.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/VEW8fCC0hg.png" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 0, - "avatar_icon": { - "icon_type": 1, - "icon_resource": {} - } - }, - "official": { - "role": 1, - "title": "bilibili 知名音乐UP主", - "desc": "", - "type": 0 - }, - "follower": 616428, - "label_style": 0 - }, - { - "mid": 53456, - "title": "曲绘", - "name": "Warma", - "face": "https://i2.hdslb.com/bfs/face/87c0b7e4d3eedf04c458a82b9271013beaa4bc59.jpg", - "vip": { - "type": 2, - "status": 1, - "due_date": 1770480000000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "年度大会员", - "label_theme": "annual_vip", - "text_color": "#FFFFFF", - "bg_style": 1, - "bg_color": "#FB7299", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "https://i0.hdslb.com/bfs/activity-plat/static/20220608/e369244d0b14644f5e1a06431e22a4d5/0DFy9BHgwE.gif", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/8d7e624d13d3e134251e4174a7318c19a8edbd71.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/uckjAv3Npy.png" - }, - "avatar_subscript": 1, - "nickname_color": "#FB7299", - "role": 3, - "avatar_subscript_url": "", - "tv_vip_status": 1, - "tv_vip_pay_type": 1, - "tv_due_date": 1753286400, - "avatar_icon": { - "icon_type": 1, - "icon_resource": {} - } - }, - "official": { - "role": 1, - "title": "bilibili 知名UP主", - "desc": "", - "type": 0 - }, - "follower": 4818052, - "label_style": 0 - } - ], - "is_season_display": false, - "user_garb": { - "url_image_ani_cut": "https://i0.hdslb.com/bfs/garb/item/e4c1c34e8b87fc05a893ed4a04ad322f75edbed9.bin" - }, - "honor_reply": { - "honor": [ - { - "aid": 85440373, - "type": 2, - "desc": "第45期每周必看", - "weekly_recommend_num": 45 - }, - { - "aid": 85440373, - "type": 3, - "desc": "全站排行榜最高第55名", - "weekly_recommend_num": 0 - }, - { - "aid": 85440373, - "type": 4, - "desc": "热门", - "weekly_recommend_num": 0 - }, - { - "aid": 85440373, - "type": 7, - "desc": "热门收录", - "weekly_recommend_num": 0 - } - ] - }, - "like_icon": "", - "need_jump_bv": false, - "disable_show_up_info": false, - "is_story_play": 1, - "is_view_self": false - } -} -``` - -
- -视频标题为:`当我给拜年祭的快板加了电音配乐…` - -视频分区为:`tid=28(音乐->原创音乐)` - -视频时长:`486s` - -视频发布时间:`2020/1/30 17:40:55` - -视频投稿时间:`2020/1/28 19:51:3` - -视频分P为:`1` - -视频类型为:`1(原创)` - -视频UP主为:`66606350(Crazy_Bucket_陈楒潼)` - -视频简介为: - -`【CB想说的】看完拜年祭之后最爱的一个节目!给有快板的部分简单加了一些不同风格的配乐hhh,感谢沃玛画的我!太可爱了哈哈哈哈哈哈哈!!!\n【Warma想说的】我画了打碟的CB,画风为了还原原版视频所以参考了四迹老师的画风,四迹老师的画真的太可爱啦!不过其实在画的过程中我遇到了一个问题,CB的耳机……到底是戴在哪个耳朵上呢?\n\n原版:av78977080\n编曲(配乐):Crazy Bucket\n人声(配音):Warma/谢拉\n曲绘:四迹/Warma\n动画:四迹/Crazy Bucket\n剧本:Mokurei-木灵君\n音频后期:DMYoung/纳兰寻风/Crazy Bucket\n包装:破晓天` - -视频状态为:`0(开放浏览)` - -视频属性为: `显示“禁止转载“标志`、`高清`、`禁止其他人添加TAG`、`联合投稿视频` - -视频封面为: - -https://i1.hdslb.com/bfs/archive/ea0dd34bf41e23a68175680a00e3358cd249105f.jpg - - - -## 获取视频超详细信息(web端) - -> https://api.bilibili.com/x/web-interface/view/detail - -> https://api.bilibili.com/x/web-interface/wbi/view/detail - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -限制游客访问的视频需要登录 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| --------- | ---- | -------------------- | ---------- | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| need_elec | num | 是否获取UP主充电信息 | 非必要 | 0:否
1:是 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-400:请求错误
-403:权限不足
-404:无视频
62002:稿件不可见
62004:稿件审核中
62012:仅UP主自己可见 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------------- | ----- | ---------------- | ------------ | -| View | obj | 视频基本信息 | | -| Card | obj | 视频UP主信息 | | -| Tags | array | 视频TAG信息 | | -| Reply | obj | 视频热评信息 | | -| Related | array | 推荐视频信息 | | -| Spec | null | ? | 作用尚不明确 | -| hot_share | obj | ? | 作用尚不明确 | -| elec | 有效时:obj
无效时:null | 充电信息 | 当请求参数 `need_elec=1` 且有充电信息时有效 | -| recommend | null | ? | 作用尚不明确 | -| emergency | obj | 视频操作按钮信息 | | -| view_addit | obj | ? | 作用尚不明确 | -| guide | null | ? | 作用尚不明确 | -| query_tags | null | ? | 作用尚不明确 | -| participle | array | 分词信息 | 用于推荐 | -| module_ctrl | null | ? | 作用尚不明确 | -| replace_recommend | bool | ? | 作用尚不明确 | - -`data`中的`View`对象: - -基本同「[获取视频详细信息(web端)](#获取视频详细信息web端)」中的data对象 - -`data`中的`Card`对象: - -基本同「[用户名片信息](../user/info.md#用户名片信息)」中的data对象 - -`data`中的`Tags`数组: - -基本同「[获取视频TAG信息(新)](tags.md#获取视频TAG信息新)」中的data数组 - -`data`中的`Reply`对象: - -基本同「[获取评论区热评](../comment/list.md#获取评论区热评)」中的data对象 - -`data`中的`Related`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|-----------|-----| -| 0 | obj | 推荐视频1 | | -| n | obj | 推荐视频(n+1) | | -| …… | obj | …… | …… | - -`Related`数组中的对象: - -基本同「[获取视频详细信息(web端)](#获取视频详细信息web端)」中的data对象,已知部分字段有差异,如没有分P信息 - -`data`中的`hot_share`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-------|-------|--------| -| show | bool | false | 作用尚不明确 | -| list | array | 空 | 作用尚不明确 | - -`data`中的`elec`对象: - -基本同「[获取视频充电鸣谢名单](../electric/charge_list.md#获取视频充电鸣谢名单)」中的data对象 - -`data`中的`emergency`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------------ | -------- | -| no_like | bool | 是否不显示点赞按钮 | | -| no_coin | bool | 是否不显示投币按钮 | | -| no_fav | bool | 是否不显示收藏按钮 | | -| no_share | bool | 是否不显示分享按钮 | | - -`data`中的`view_addit`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------------- | ------------ | -| 63 | bool | 是否不显示直播推荐 | | -| 64 | bool | 是否不显示活动推荐 | | -| 69 | bool | ? | 作用尚不明确 | -| 71 | bool | 是否不显示标签与笔记 | | -| 72 | bool | ? | 作用尚不明确 | - -**示例:** - -获取视频`av170001`/`BV17x411w7KC`的详细信息 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view/detail' \ ---data-urlencode 'aid=170001' \ ---data-urlencode 'need_elec=1' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view/detail' \ ---data-urlencode 'bvid=BV17x411w7KC' \ ---data-urlencode 'need_elec=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "View": { - "bvid": "BV17x411w7KC", - "aid": 170001, - "videos": 10, - "tid": 193, - "tid_v2": 2017, - "tname": "MV", - "tname_v2": "MV", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/1ada8c32a9d168e4b2ee3e010f24789ba3353785.jpg", - "title": "【MV】保加利亚妖王AZIS视频合辑", - "pubdate": 1320850533, - "ctime": 1497380562, - "desc": "sina 保加利亚超级天王 Azis1999年出道。他的音乐融合保加利亚名族曲风chalga和pop、rap等元素,不过他惊艳的易装秀与浮夸的角色诠释才是他最为出名的地方 Azis与众多保加利亚天王天后级歌手都有过合作.06年,他作为Mariana Popova的伴唱,在欧洲半决赛上演唱了他们的参赛曲Let Me Cry 06年他被Velikite Balgari评为保加利亚有史以来最伟大的名人之一", - "desc_v2": [ - { - "raw_text": "sina 保加利亚超级天王 Azis1999年出道。他的音乐融合保加利亚名族曲风chalga和pop、rap等元素,不过他惊艳的易装秀与浮夸的角色诠释才是他最为出名的地方 Azis与众多保加利亚天王天后级歌手都有过合作.06年,他作为Mariana Popova的伴唱,在欧洲半决赛上演唱了他们的参赛曲Let Me Cry 06年他被Velikite Balgari评为保加利亚有史以来最伟大的名人之一", - "type": 1, - "biz_id": 0 - } - ], - "state": 0, - "duration": 2412, - "rights": { - "bp": 0, - "elec": 0, - "download": 1, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "clean_mode": 0, - "is_stein_gate": 0, - "is_360": 0, - "no_share": 0, - "arc_pay": 0, - "free_watch": 0 - }, - "owner": { - "mid": 122541, - "name": "冰封.虾子", - "face": "http://i0.hdslb.com/bfs/face/40c46ee74dd6ea33d46c38cd6083e6a1286aa482.gif" - }, - "stat": { - "aid": 170001, - "view": 45252521, - "danmaku": 914336, - "reply": 184686, - "favorite": 883733, - "coin": 291585, - "share": 12779204, - "now_rank": 0, - "his_rank": 13, - "like": 928358, - "dislike": 0, - "evaluation": "", - "vt": 0 - }, - "argue_info": { - "argue_msg": "", - "argue_type": 0, - "argue_link": "" - }, - "dynamic": "", - "cid": 279786, - "dimension": { - "width": 512, - "height": 288, - "rotate": 0 - }, - "premiere": null, - "teenage_mode": 0, - "is_chargeable_season": false, - "is_story": false, - "is_upower_exclusive": false, - "is_upower_play": false, - "is_upower_preview": false, - "enable_vt": 0, - "vt_display": "", - "is_upower_exclusive_with_qa": false, - "no_cache": false, - "pages": [ - { - "cid": 279786, - "page": 1, - "from": "vupload", - "part": "Хоп", - "duration": 199, - "vid": "", - "weblink": "", - "dimension": { - "width": 512, - "height": 288, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 275431, - "page": 2, - "from": "vupload", - "part": "Imash li surce", - "duration": 205, - "vid": "", - "weblink": "", - "dimension": { - "width": 640, - "height": 360, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 279787, - "page": 3, - "from": "vupload", - "part": "No Kazvam Ti Stiga", - "duration": 308, - "vid": "", - "weblink": "", - "dimension": { - "width": 432, - "height": 324, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 280467, - "page": 4, - "from": "vupload", - "part": "Samo za teb", - "duration": 273, - "vid": "", - "weblink": "", - "dimension": { - "width": 360, - "height": 288, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 280468, - "page": 5, - "from": "vupload", - "part": "Tochno sega", - "duration": 241, - "vid": "", - "weblink": "", - "dimension": { - "width": 584, - "height": 360, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 280469, - "page": 6, - "from": "vupload", - "part": "Kak boli", - "duration": 336, - "vid": "", - "weblink": "", - "dimension": { - "width": 384, - "height": 288, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 274491, - "page": 7, - "from": "vupload", - "part": "Obicham Te", - "duration": 250, - "vid": "", - "weblink": "", - "dimension": { - "width": 402, - "height": 208, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 267410, - "page": 8, - "from": "vupload", - "part": "Mrazish", - "duration": 201, - "vid": "", - "weblink": "", - "dimension": { - "width": 540, - "height": 360, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 267714, - "page": 9, - "from": "vupload", - "part": "Няма накъде", - "duration": 201, - "vid": "", - "weblink": "", - "dimension": { - "width": 450, - "height": 360, - "rotate": 0 - }, - "ctime": 1497380562 - }, - { - "cid": 270380, - "page": 10, - "from": "vupload", - "part": "Gadna poroda", - "duration": 198, - "vid": "", - "weblink": "", - "dimension": { - "width": 432, - "height": 324, - "rotate": 0 - }, - "ctime": 1497380562 - } - ], - "subtitle": { - "allow_submit": false, - "list": [] - }, - "is_season_display": false, - "user_garb": { - "url_image_ani_cut": "https://i0.hdslb.com/bfs/garb/item/e4c1c34e8b87fc05a893ed4a04ad322f75edbed9.bin" - }, - "honor_reply": { - "honor": [ - { - "aid": 170001, - "type": 3, - "desc": "全站排行榜最高第13名", - "weekly_recommend_num": 0 - } - ] - }, - "like_icon": "", - "need_jump_bv": false, - "disable_show_up_info": false, - "is_story_play": 0, - "is_view_self": false - }, - "Card": { - "card": { - "mid": "122541", - "name": "冰封.虾子", - "approve": false, - "sex": "保密", - "rank": "10000", - "face": "http://i0.hdslb.com/bfs/face/40c46ee74dd6ea33d46c38cd6083e6a1286aa482.gif", - "face_nft": 0, - "face_nft_type": 0, - "DisplayRank": "0", - "regtime": 0, - "spacesta": 0, - "birthday": "", - "place": "", - "description": "", - "article": 0, - "attentions": [], - "fans": 64052, - "friend": 45, - "attention": 45, - "sign": "路亚钓鱼爱好者交流群411267154", - "level_info": { - "current_level": 6, - "current_min": 0, - "current_exp": 0, - "next_exp": 0 - }, - "pendant": { - "pid": 0, - "name": "", - "image": "", - "expire": 0, - "image_enhance": "", - "image_enhance_frame": "", - "n_pid": 0 - }, - "nameplate": { - "nid": 9, - "name": "出道偶像", - "image": "https://i0.hdslb.com/bfs/face/3f2d64f048b39fb6c26f3db39df47e6080ec0f9c.png", - "image_small": "https://i0.hdslb.com/bfs/face/90c35d41d8a19b19474d6bac672394c17b444ce8.png", - "level": "高级勋章", - "condition": "所有自制视频总播放数>=50万" - }, - "Official": { - "role": 0, - "title": "", - "desc": "", - "type": -1 - }, - "official_verify": { - "type": -1, - "desc": "" - }, - "vip": { - "type": 1, - "status": 0, - "due_date": 1493827200000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 0, - "avatar_icon": { - "icon_resource": {} - }, - "vipType": 1, - "vipStatus": 0 - }, - "is_senior_member": 0, - "name_render": null - }, - "space": { - "s_img": "http://i1.hdslb.com/bfs/activity-plat/static/LRjqHhi0wL.png", - "l_img": "http://i1.hdslb.com/bfs/space/cb1c3ef50e22b6096fde67febe863494caefebad.png" - }, - "following": false, - "archive_count": 382, - "article_count": 0, - "follower": 64052, - "like_num": 1048712 - }, - "Tags": [ - { - "tag_id": 0, - "tag_name": "发现《Hop》", - "music_id": "MA407124762800730394", - "tag_type": "bgm", - "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA407124762800730394&cid=279786&aid=170001&na_close_hide=1" - }, - { - "tag_id": 117552, - "tag_name": "保加利亚妖王", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 112503, - "tag_name": "保加利亚", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 2958988, - "tag_name": "Азис", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 2622213, - "tag_name": "azis", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 2512079, - "tag_name": "mv", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - } - ], - "Reply": { - "page": null, - "replies": [ - { - "rpid": 1, - "oid": 0, - "type": 0, - "mid": 0, - "root": 0, - "parent": 0, - "dialog": 0, - "count": 0, - "rcount": 0, - "state": 0, - "fansgrade": 0, - "attr": 0, - "ctime": 0, - "like": 0, - "action": 0, - "content": null, - "replies": null, - "assist": 0, - "show_follow": false - } - ] - }, - "Related": [ - { - "aid": 1252180876, - "videos": 1, - "tid": 130, - "tname": "音乐综合", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/5a4eef19e38a3fa27f9db53cc45e7233e714ae03.jpg", - "title": "Ricardo Milos - Dancin song [1080p]", - "pubdate": 1711002767, - "ctime": 1711002768, - "desc": "https://www.youtube.com/watch?v=e9ASqhs9770", - "state": 0, - "duration": 259, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 477132, - "name": "TAKERA", - "face": "https://i0.hdslb.com/bfs/face/5af8b319889ba7a7d20ac59edb8464d65f43c1e1.gif" - }, - "stat": { - "aid": 1252180876, - "view": 1590321, - "danmaku": 2766, - "reply": 2405, - "favorite": 58654, - "coin": 13468, - "share": 15966, - "now_rank": 0, - "his_rank": 0, - "like": 144640, - "dislike": 0, - "vt": 0, - "vv": 1590321, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 1483741030, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1hJ4m177RN", - "first_frame": "http://i0.hdslb.com/bfs/storyff/n240327ad1t4c11o1bbzfc2bkvg5fkuc_firsti.jpg", - "pub_location": "中国香港", - "cover43": "", - "tidv2": 2036, - "tnamev2": "舞蹈综合", - "pid_v2": 1004, - "pid_name_v2": "舞蹈", - "bvid": "BV1hJ4m177RN", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 1252180876, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 80433022, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 1, - "pic": "http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg", - "title": "【官方 MV】Never Gonna Give You Up - Rick Astley", - "pubdate": 1577835803, - "ctime": 1577835803, - "desc": "-", - "state": 0, - "duration": 213, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 1, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 486906719, - "name": "索尼音乐中国", - "face": "https://i2.hdslb.com/bfs/face/6bc95d0670863d36bf9167a37b825c39ce258506.jpg" - }, - "stat": { - "aid": 80433022, - "view": 91790223, - "danmaku": 128050, - "reply": 170137, - "favorite": 1286326, - "coin": 1061915, - "share": 396054, - "now_rank": 0, - "his_rank": 0, - "like": 2464595, - "dislike": 0, - "vt": 0, - "vv": 91790223, - "fav_g": 10, - "like_g": 0 - }, - "dynamic": "", - "cid": 137649199, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1GJ411x7h7", - "up_from_v2": 15, - "pub_location": "未知", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1GJ411x7h7", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 80433022, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 718913090, - "videos": 1, - "tid": 27, - "tname": "综合", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/6567760d676268e2bf2e2c57486085a31427ed79.jpg", - "title": "【咩栗】镇 站 之 宝", - "pubdate": 1636448401, - "ctime": 1636448403, - "desc": "可以关注一下可爱的小羊和小狼呀~\n小羊主页:https://space.bilibili.com/745493\n小狼主页:https://space.bilibili.com/617459493\n⚡️☀️\n微博@电击咩阿栗\n微博@呜米嗷呜\n⚡️☀️\n网易云@咩栗\n网易云@呜米", - "state": 0, - "duration": 188, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 674421433, - "name": "呜米咩栗的草原日常", - "face": "https://i1.hdslb.com/bfs/face/5566e3a4786959527a72545f908b5664693a2945.jpg" - }, - "stat": { - "aid": 718913090, - "view": 315224, - "danmaku": 195, - "reply": 462, - "favorite": 2897, - "coin": 702, - "share": 202, - "now_rank": 0, - "his_rank": 0, - "like": 15615, - "dislike": 0, - "vt": 0, - "vv": 315224, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "咩栗,不可以。", - "cid": 436835160, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV14Q4y1S7HU", - "first_frame": "http://i0.hdslb.com/bfs/storyff/n211105a23d8ue6bh0m1ed1cu6yztac5_firsti.jpg", - "cover43": "", - "tidv2": 2047, - "tnamev2": "虚拟UP主", - "pid_v2": 1005, - "pid_name_v2": "二次元", - "bvid": "BV14Q4y1S7HU", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 718913090, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 895258574, - "videos": 2, - "tid": 130, - "tname": "音乐综合", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/b94b8be43cd0a9a12bf1a334541b017a3bd24cb6.jpg", - "title": "【全弹幕】av10388 武器A", - "pubdate": 1648906567, - "ctime": 1648906567, - "desc": "sm9307581\n武器A\n[日常]UP主:博丽·灵梦(UID:13308)\n播放:1605344 | 收藏:20926 | 弹幕:42522\n投稿时间:2010/06/20 10:13\n啊哈哈哈,啊哈哈,啊哈,啊……总之就是武器……", - "state": 0, - "duration": 144, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 104657830, - "name": "尚宜鼎MEMZ", - "face": "https://i1.hdslb.com/bfs/face/6761798442c6e9607c62803ac4fa5fe4a3e7b25b.jpg" - }, - "stat": { - "aid": 895258574, - "view": 3769820, - "danmaku": 22377, - "reply": 2776, - "favorite": 12271, - "coin": 484, - "share": 3748, - "now_rank": 0, - "his_rank": 0, - "like": 47622, - "dislike": 0, - "vt": 0, - "vv": 3769820, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 1491314436, - "dimension": { - "width": 2848, - "height": 1600, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1NP4y1K7Ze", - "first_frame": "http://i0.hdslb.com/bfs/storyff/n240402sa2muwqb7q7sbvedoskth1279_firsti.jpg", - "pub_location": "广东", - "cover43": "", - "tidv2": 2041, - "tnamev2": "动漫剪辑", - "pid_v2": 1005, - "pid_name_v2": "二次元", - "bvid": "BV1NP4y1K7Ze", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 895258574, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 56927206, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/fd8324a72f0c6629f6d9b6af0daa11d950863993.jpg", - "title": "【每天一遍,网抑再见】万恶之源,抖就完事了", - "pubdate": 1561555314, - "ctime": 1561555314, - "desc": "【带字幕版】本人亲自翻译\nBGM:coincidance \n有些人看着看着就抖起来了,别说了,护士姐姐真漂亮\nhttps://www.youtube.com/watch?v=nBHkIWAJitg&feature=share\n肩膀好了,就来摇头吧\nav65659850", - "state": 0, - "duration": 139, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 34232005, - "name": "200斤的五条艾", - "face": "https://i1.hdslb.com/bfs/face/5135289ba858105ae466429ba9610e7980cf73f0.jpg" - }, - "stat": { - "aid": 56927206, - "view": 43534329, - "danmaku": 77687, - "reply": 19894, - "favorite": 1584517, - "coin": 721148, - "share": 563420, - "now_rank": 0, - "his_rank": 15, - "like": 2118557, - "dislike": 0, - "vt": 0, - "vv": 43534329, - "fav_g": 3, - "like_g": 0 - }, - "dynamic": "#沙雕##搞笑视频##魔性#", - "cid": 99428737, - "dimension": { - "width": 960, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Ax411d7jD", - "up_from_v2": 11, - "cover43": "", - "tidv2": 2059, - "tnamev2": "鬼畜调教", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1Ax411d7jD", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 56927206, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 3643130, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/bc23ac6f17c82700d5c1941e0991bc8a6fcbd46c.png", - "title": "金坷垃原版", - "pubdate": 1453518942, - "ctime": 1497431869, - "desc": "http://v.youku.com/v_show/id_XNTkzMDUxNzI0.html?from=y1.2-1-102.3.1-1.1-1-1-0-0#paction 给知道金坷垃的孩子们补补课", - "state": 0, - "duration": 101, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 11374676, - "name": "LX秦先生", - "face": "https://i2.hdslb.com/bfs/face/90a808cdd9414d5f53e04d85b8929333eb61f474.jpg" - }, - "stat": { - "aid": 3643130, - "view": 11110768, - "danmaku": 29385, - "reply": 7168, - "favorite": 287656, - "coin": 61435, - "share": 190334, - "now_rank": 0, - "his_rank": 0, - "like": 379164, - "dislike": 0, - "vt": 0, - "vv": 11110768, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 5827830, - "dimension": { - "width": 640, - "height": 354, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Rs411R7Hi", - "cover43": "", - "tidv2": 2059, - "tnamev2": "鬼畜调教", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1Rs411R7Hi", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 3643130, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 1601123876, - "videos": 1, - "tid": 130, - "tname": "音乐综合", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/bc7442c6c54ef573ebe0455104ad87703703fad5.jpg", - "title": "「保加利亚妖王」Hop - Azis 阿吉斯 百万级装备试听【Hi-Res】", - "pubdate": 1709023713, - "ctime": 1709023713, - "desc": "作词 : Azis\n作曲 : Azis\n\n\n\n音响:天朗皇家西敏寺\n功放:麦景图 \n录音MIC:纽曼149 \n录音设备:SSL+ Protools", - "state": 0, - "duration": 189, - "mission_id": 4009709, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 440121192, - "name": "JLRS日落fm", - "face": "https://i0.hdslb.com/bfs/face/008f2cf802f48e1d7f837887a3cefd95b918a0e5.jpg" - }, - "stat": { - "aid": 1601123876, - "view": 549485, - "danmaku": 1576, - "reply": 1569, - "favorite": 7872, - "coin": 5056, - "share": 4117, - "now_rank": 0, - "his_rank": 0, - "like": 22458, - "dislike": 0, - "vt": 0, - "vv": 549485, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "还记得这位妖王吗?", - "cid": 1452568619, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "season_id": 4499678, - "short_link_v2": "https://b23.tv/BV1e1421f7rA", - "first_frame": "http://i2.hdslb.com/bfs/storyff/n240227sauzmn6l1y49t5cjnklc5tyvk_firsti.jpg", - "pub_location": "吉林", - "cover43": "", - "tidv2": 2024, - "tnamev2": "电台·歌单", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1e1421f7rA", - "season_type": 1, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 1601123876, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 1581914, - "videos": 1, - "tid": 130, - "tname": "音乐综合", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/7437f19df1061f4a9cd2972b81dbd3a6723bf74c.jpg", - "title": "妖王都开始男人了,怎么办!", - "pubdate": 1412259320, - "ctime": 1497428704, - "desc": "音悦台 保加利亚妖男Azis /Азис携手流行男歌手Giorgos Tsalikis/Тсаликис 最新单曲 Estar Loco /Полудяваме\n纯爷们,男人就该干男人,该干的事。", - "state": 0, - "duration": 227, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 4685783, - "name": "FoolishJoker", - "face": "https://i2.hdslb.com/bfs/face/a81786a76af0cbd6d7e35adc488ccc22b0030d72.jpg" - }, - "stat": { - "aid": 1581914, - "view": 2303678, - "danmaku": 5815, - "reply": 6856, - "favorite": 28958, - "coin": 5696, - "share": 14014, - "now_rank": 0, - "his_rank": 0, - "like": 24255, - "dislike": 0, - "vt": 0, - "vv": 2303678, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 2403522, - "dimension": { - "width": 640, - "height": 360, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1gx411P77L", - "up_from_v2": 8, - "cover43": "", - "tidv2": 2027, - "tnamev2": "音乐综合", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1gx411P77L", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 1581914, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 31130726, - "videos": 1, - "tid": 130, - "tname": "音乐综合", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/e9755c62c5a38ec352e424aa0d7d20417c1a3fde.jpg", - "title": "PPAP原版完整视频", - "pubdate": 1536122369, - "ctime": 1536122367, - "desc": "视频时长令强迫症不爽(我故意的)", - "state": 0, - "duration": 121, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 180305935, - "name": "不懂事的记忆", - "face": "https://i1.hdslb.com/bfs/face/7c1510f2fc8911cf885c9b14a94a99db738813c2.jpg" - }, - "stat": { - "aid": 31130726, - "view": 3810989, - "danmaku": 5269, - "reply": 2587, - "favorite": 76845, - "coin": 7721, - "share": 21117, - "now_rank": 0, - "his_rank": 0, - "like": 122042, - "dislike": 0, - "vt": 0, - "vv": 3810989, - "fav_g": 8, - "like_g": 0 - }, - "dynamic": "", - "cid": 54379754, - "dimension": { - "width": 640, - "height": 360, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1BW411Z7J3", - "up_from_v2": 8, - "cover43": "", - "tidv2": 2027, - "tnamev2": "音乐综合", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1BW411Z7J3", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 31130726, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 675490509, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/58f8f3c8dfcf3b1ac6cf7a7b0eda660aa2e1e1fc.jpg", - "title": "奥地利美术生就业经历", - "pubdate": 1631273645, - "ctime": 1631272999, - "desc": "https://m.youtube.com/watch?v=h7s410TPnWg", - "state": 0, - "duration": 128, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 489656132, - "name": "古米廖夫", - "face": "https://i2.hdslb.com/bfs/face/633ed3ba1ec5bcde5db105849c2498b03f6b7eee.jpg" - }, - "stat": { - "aid": 675490509, - "view": 40823108, - "danmaku": 48676, - "reply": 12360, - "favorite": 952804, - "coin": 557605, - "share": 256173, - "now_rank": 0, - "his_rank": 0, - "like": 1531015, - "dislike": 0, - "vt": 0, - "vv": 40823108, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 405970117, - "dimension": { - "width": 1280, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1jU4y1N7vg", - "up_from_v2": 35, - "first_frame": "http://i1.hdslb.com/bfs/storyff/n210910a2u7yjx97xzec435kyzziyn8s_firsti.jpg", - "pub_location": "黑龙江", - "cover43": "", - "tidv2": 2060, - "tnamev2": "鬼畜剧场", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1jU4y1N7vg", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 675490509, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 44501, - "videos": 1, - "tid": 26, - "tname": "音MAD", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/1dff881735a73cdc4757237e45eff03d42c81137.jpg", - "title": "久本雅美の頭がカービィのBGMに合わせて爆発したようです", - "pubdate": 1293118092, - "ctime": 1497366357, - "desc": "sm6999999 恭请四代御本尊様,45秒后大量召唤三色弹幕,顺带头像同步测试┗(^o^ )┓", - "state": 0, - "duration": 72, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 59948, - "name": "高興帝", - "face": "http://i2.hdslb.com/bfs/face/68a4fb8cf9442f0db277d58a9dbccbf02eacdad4.jpg" - }, - "stat": { - "aid": 44501, - "view": 2450853, - "danmaku": 16774, - "reply": 5627, - "favorite": 25342, - "coin": 3316, - "share": 3531, - "now_rank": 0, - "his_rank": 0, - "like": 47552, - "dislike": 0, - "vt": 0, - "vv": 2450853, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 74884, - "dimension": { - "width": 480, - "height": 360, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Bx411c7NF", - "cover43": "", - "tidv2": 2062, - "tnamev2": "音MAD", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1Bx411c7NF", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 44501, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 1706416465, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/2365889cfca6e33566104487604138906a610c59.jpg", - "title": "【4K珍藏】诈骗神曲《Never Gonna Give You Up》!愿者上钩!", - "pubdate": 1723457882, - "ctime": 1723042776, - "desc": "《‌Never Gonna Give You Up》‌这首歌曲发行于1987年11月16日。‌这首歌曲由Rick Astley演唱,‌并收录于他的专辑《‌Whenever You Need Somebody》‌中。", - "state": 0, - "duration": 213, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 2043250564, - "name": "4K音乐馆", - "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" - }, - "stat": { - "aid": 1706416465, - "view": 1001774, - "danmaku": 1150, - "reply": 1204, - "favorite": 20440, - "coin": 2354, - "share": 12072, - "now_rank": 0, - "his_rank": 0, - "like": 28749, - "dislike": 0, - "vt": 0, - "vv": 1001774, - "fav_g": 38, - "like_g": 0 - }, - "dynamic": "", - "cid": 1641702404, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "season_id": 257515, - "short_link_v2": "https://b23.tv/BV1UT42167xb", - "first_frame": "http://i1.hdslb.com/bfs/storyff/n240807sa3h3ta5x4y8t48d3i1ld43yn_firsti.jpg", - "pub_location": "山东", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1UT42167xb", - "season_type": 1, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 1706416465, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 70025529, - "videos": 1, - "tid": 130, - "tname": "音乐综合", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/49948624e5b18fda60ec255eeffe9fb86e2a73a0.jpg", - "title": "大悲咒(高品质珍藏版)", - "pubdate": 1570435422, - "ctime": 1570183927, - "desc": "净化心情,佛祖保佑,大吉大利!!!", - "state": 0, - "duration": 1792, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 362819520, - "name": "抹茶牛油果", - "face": "http://i0.hdslb.com/bfs/face/3b2571027baef2a954c2fc1b5473ed609ef00fb3.jpg" - }, - "stat": { - "aid": 70025529, - "view": 15194194, - "danmaku": 126652, - "reply": 36609, - "favorite": 447623, - "coin": 115299, - "share": 201225, - "now_rank": 0, - "his_rank": 0, - "like": 432430, - "dislike": 0, - "vt": 0, - "vv": 15194194, - "fav_g": 49, - "like_g": 0 - }, - "dynamic": "#大悲咒##高音质##循环#", - "cid": 121325699, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1XE411S7Ew", - "cover43": "", - "tidv2": 2192, - "tnamev2": "疗愈成长", - "pid_v2": 1028, - "pid_name_v2": "神秘学", - "bvid": "BV1XE411S7Ew", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 70025529, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 827984205, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/ffacd250c10ca7cea1a665e89b691b3b7b837587.jpg", - "title": "燃!保加利亚妖王2023新歌MV!", - "pubdate": 1688208848, - "ctime": 1688208848, - "desc": "youtube\n保加利亚妖王azis新歌mv", - "state": 0, - "duration": 225, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 1295732260, - "name": "蒂尼黄DiniHuang", - "face": "https://i1.hdslb.com/bfs/face/71cc994f3b717fb64dec53cab8b825b471f3886a.jpg" - }, - "stat": { - "aid": 827984205, - "view": 168546, - "danmaku": 188, - "reply": 343, - "favorite": 851, - "coin": 79, - "share": 2315, - "now_rank": 0, - "his_rank": 0, - "like": 4373, - "dislike": 0, - "vt": 0, - "vv": 168546, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 1181623685, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV19g4y1A7xq", - "up_from_v2": 8, - "first_frame": "http://i0.hdslb.com/bfs/storyff/n230701qn3tfuifpjvvh0e2pctwqbkep_firsti.jpg", - "pub_location": "上海", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV19g4y1A7xq", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 827984205, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 80573606, - "videos": 1, - "tid": 29, - "tname": "音乐现场", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/b0433e71df7f856cf1a45a926361661eca28b8fb.jpg", - "title": "满级大佬屠杀新手村", - "pubdate": 1577243562, - "ctime": 1577243562, - "desc": "YouTube\n\n*《She Taught Me How to Yodel》\n\n约德尔唱法(Yodeling)是瑞士阿尔卑斯山区的一种特殊唱法,采用真假声迅速切换的方式演唱。“约德尔”,在当地方言中是“树林歌唱”的意思,因此有时也将其翻译为“woods sing”。\n\n小女孩叫Sofia Shkidchenko,演唱于乌克兰达人秀,她有自己的油管频道可以去订阅哦~\n\n自己也没想到随手上传的个视频突然播放量这么多,不是专业的搬运博主,此视频留作纪念,但更新随缘啦。祝大家万事如意。", - "state": 0, - "duration": 126, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 247412150, - "name": "Ueroey", - "face": "https://i2.hdslb.com/bfs/face/f8cef132ebaeac9da8c73ad52f6c53b7d1f74637.jpg" - }, - "stat": { - "aid": 80573606, - "view": 62129265, - "danmaku": 106580, - "reply": 27081, - "favorite": 1259191, - "coin": 453054, - "share": 189609, - "now_rank": 0, - "his_rank": 7, - "like": 2766708, - "dislike": 0, - "vt": 0, - "vv": 62129265, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#音乐#", - "cid": 137890032, - "dimension": { - "width": 638, - "height": 312, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1LJ411W7Bo", - "up_from_v2": 9, - "pub_location": "浙江", - "cover43": "", - "tidv2": 2018, - "tnamev2": "音乐现场", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1LJ411W7Bo", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 80573606, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 370010949, - "videos": 2, - "tid": 138, - "tname": "搞笑", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/8339e4a40c1a10cfb0e0abe0bc4ef6ecbd61a45f.jpg", - "title": "黑人抬棺原版视频", - "pubdate": 1585735296, - "ctime": 1585735296, - "desc": "up主关于本条视频收入的说明戳:BV1YK41157dT\n转载自https://www.youtube.com/watch?v=b3Y_9bTRGVg\n其他:抖棺(肩)舞:BV1kt4y127Ee\n苏卡棺裂:BV1GZ4y1x7mZ\n我是比划,感谢您的观看感谢点赞感谢一切!改天一定陪老铁好好比划比划!(咕)\n(建议大家戳一下宝藏2p)", - "state": 0, - "duration": 200, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 479724334, - "name": "比划大魔王", - "face": "http://i1.hdslb.com/bfs/face/910e60494f7deff1b3bdcf1eaaead6779d77bac5.jpg" - }, - "stat": { - "aid": 370010949, - "view": 65490009, - "danmaku": 454078, - "reply": 47875, - "favorite": 1008732, - "coin": 445010, - "share": 783444, - "now_rank": 0, - "his_rank": 2, - "like": 1912992, - "dislike": 0, - "vt": 0, - "vv": 65490009, - "fav_g": 24, - "like_g": 0 - }, - "dynamic": "", - "cid": 172423516, - "dimension": { - "width": 1280, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1NZ4y1j7nw", - "cover43": "", - "tidv2": 2059, - "tnamev2": "鬼畜调教", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1NZ4y1j7nw", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 370010949, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 161596, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/90bc3229e862994ac021a5f0894f232bc49b36bf.jpg", - "title": "据说80%的男生都听过这段音乐,有木有?", - "pubdate": 1319379031, - "ctime": 1497399731, - "desc": "据说男生都听过,为啥我没有呢? ", - "state": 0, - "duration": 0, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 211322, - "name": "卍解←死神", - "face": "https://i2.hdslb.com/bfs/face/2cb86d5f33a409732e4a0dcc7cda70bc8c199a7f.jpg" - }, - "stat": { - "aid": 161596, - "view": 576962, - "danmaku": 1042, - "reply": 1638, - "favorite": 6576, - "coin": 227, - "share": 931, - "now_rank": 0, - "his_rank": 612, - "like": 9845, - "dislike": 0, - "vt": 0, - "vv": 576962, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 266868, - "dimension": { - "width": 448, - "height": 336, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Nx411w7tR", - "cover43": "", - "tidv2": 2027, - "tnamev2": "音乐综合", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1Nx411w7tR", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 161596, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 112699505707398, - "videos": 1, - "tid": 22, - "tname": "鬼畜调教", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/54c8218801e90a957e67541ea7d76e6d310614fe.jpg", - "title": "【范小勤】HOP", - "pubdate": 1719658405, - "ctime": 1719658405, - "desc": "", - "state": 0, - "duration": 200, - "mission_id": 1729431, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 40488241, - "name": "帅气的五岁少年", - "face": "https://i1.hdslb.com/bfs/face/0438443dd2bbb2fe1b46aa1d2134745f8d9f26c8.jpg" - }, - "stat": { - "aid": 112699505707398, - "view": 47395, - "danmaku": 176, - "reply": 125, - "favorite": 566, - "coin": 242, - "share": 1366, - "now_rank": 0, - "his_rank": 0, - "like": 1598, - "dislike": 0, - "vt": 0, - "vv": 47395, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 500001599795260, - "dimension": { - "width": 1440, - "height": 1080, - "rotate": 0 - }, - "season_id": 3617308, - "short_link_v2": "https://b23.tv/BV1J63veXEvH", - "first_frame": "http://i1.hdslb.com/bfs/storyff/n240629sabnqqnvswrfyh2h8capwsas5_firsti.jpg", - "pub_location": "上海", - "cover43": "", - "tidv2": 2059, - "tnamev2": "鬼畜调教", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1J63veXEvH", - "season_type": 1, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 112699505707398, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 345957866, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/2327de6051626e9f263e265805cbb1be3a05ad8d.jpg", - "title": "【越南神曲】-《Kẻ Cắp Gặp Bà Già 》!终于找到原版了!", - "pubdate": 1664102700, - "ctime": 1664027264, - "desc": "提到「越南电音」,大家可能会感到比较陌生,甚至摸不着头脑。 事实上,越南电音已经席卷国内短视频平台,没有人可以逃过它的轰炸。 音乐一开,无人不嗨~", - "state": 0, - "duration": 234, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 2043250564, - "name": "4K音乐馆", - "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" - }, - "stat": { - "aid": 345957866, - "view": 8519264, - "danmaku": 3892, - "reply": 3755, - "favorite": 143914, - "coin": 9867, - "share": 8152, - "now_rank": 0, - "his_rank": 0, - "like": 136218, - "dislike": 0, - "vt": 0, - "vv": 8519264, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 842321779, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "season_id": 725909, - "short_link_v2": "https://b23.tv/BV1Ud4y1M7C7", - "first_frame": "http://i1.hdslb.com/bfs/storyff/n220924qn371jsgk4te6781w32102ovo_firsti.jpg", - "pub_location": "山东", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1Ud4y1M7C7", - "season_type": 1, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 345957866, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 456093155, - "videos": 1, - "tid": 59, - "tname": "演奏", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/9c160af2907ba2c161d565a99e61032ba72868ff.png", - "title": "太羞耻了!敢于琴行挑战演奏《Hop》!", - "pubdate": 1592883074, - "ctime": 1592883074, - "desc": "太羞耻了!敢于琴行挑战演奏《Hop》! Hop改编版", - "state": 0, - "duration": 168, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 13677047, - "name": "Piano莱特", - "face": "https://i2.hdslb.com/bfs/face/edf6a0ae7dfe9adb5e8d5e813a69455554931c73.jpg" - }, - "stat": { - "aid": 456093155, - "view": 1432473, - "danmaku": 3867, - "reply": 1839, - "favorite": 14907, - "coin": 7949, - "share": 5164, - "now_rank": 0, - "his_rank": 0, - "like": 75832, - "dislike": 0, - "vt": 0, - "vv": 1432473, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 204234033, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1r5411W71r", - "cover43": "", - "tidv2": 2021, - "tnamev2": "演奏", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1r5411W71r", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 456093155, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 88379669, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/44deb7e35de1c0d19fc79e6f838ad334585755f6.jpg", - "title": "当你怂恿网课老师放HOP", - "pubdate": 1581481509, - "ctime": 1581481509, - "desc": "我受不了了我要笑死了\n网课欢乐多", - "state": 0, - "duration": 131, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 8307655, - "name": "-Holog-", - "face": "https://i1.hdslb.com/bfs/face/797edf7cf269bdf89d1deb46b2b5068e65920b88.jpg" - }, - "stat": { - "aid": 88379669, - "view": 1553672, - "danmaku": 5349, - "reply": 1662, - "favorite": 7998, - "coin": 2519, - "share": 6023, - "now_rank": 0, - "his_rank": 0, - "like": 57979, - "dislike": 0, - "vt": 0, - "vv": 1553672, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#保加利亚妖王##搞笑视频##HOP#\n把害怕打在公屏上_(:з」∠)_", - "cid": 150977310, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1D7411G76q", - "up_from_v2": 8, - "cover43": "", - "tidv2": 2207, - "tnamev2": "随拍·综合", - "pid_v2": 1032, - "pid_name_v2": "其他", - "bvid": "BV1D7411G76q", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 88379669, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 752882938, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/f5a60b4edaef1b44faab4ffc47384843a7d47c56.jpg", - "title": "【av100000000】b站视频破亿了!第一亿个视频十小时循环(补档)", - "pubdate": 1588142976, - "ctime": 1588142976, - "desc": "【av100000000】b站视频破亿了!第一亿个视频十小时循环(补档)\nBV1y7411Q743/av100000000", - "state": 0, - "duration": 36000, - "mission_id": 13243, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 382043832, - "name": "輝夜姬想讓人告白", - "face": "https://i0.hdslb.com/bfs/face/647d2a40ac51b8e1379d6c46c64f5a8e28b269ab.jpg" - }, - "stat": { - "aid": 752882938, - "view": 161614, - "danmaku": 357, - "reply": 497, - "favorite": 1217, - "coin": 165, - "share": 166, - "now_rank": 0, - "his_rank": 0, - "like": 4623, - "dislike": 0, - "vt": 0, - "vv": 161614, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#B站##BILIBILI##哔哩哔哩#", - "cid": 184673331, - "dimension": { - "width": 960, - "height": 600, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Yk4y1r7g2", - "cover43": "", - "tidv2": 2207, - "tnamev2": "随拍·综合", - "pid_v2": 1032, - "pid_name_v2": "其他", - "bvid": "BV1Yk4y1r7g2", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 752882938, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 676186170, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/24e8bd7eb31bbc142cd2676d28efa4c45c06bc33.jpg", - "title": "【4K60FPS】查理·普斯《See You Again》爆火神曲!珍惜身边的人!", - "pubdate": 1634983053, - "ctime": 1634983053, - "desc": "官方MV\n原盘提取制作,进行了部分调整\n中英文双语字幕制作,自己双语翻译\n《See You Again》是由美国说唱歌手维兹·卡利法与歌手查理·普斯合作演唱的一首歌曲\n这首歌,我想不用多说了,因为太多人点这首歌了\n希望大家珍惜身边的人", - "state": 0, - "duration": 229, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 229733301, - "name": "音乐私藏馆", - "face": "https://i0.hdslb.com/bfs/face/91a6526445f61e2d491523242b532d5e76f0435a.jpg" - }, - "stat": { - "aid": 676186170, - "view": 19331747, - "danmaku": 55418, - "reply": 19047, - "favorite": 459123, - "coin": 125647, - "share": 58270, - "now_rank": 0, - "his_rank": 30, - "like": 560583, - "dislike": 0, - "vt": 0, - "vv": 19331747, - "fav_g": 208, - "like_g": 0 - }, - "dynamic": "", - "cid": 429657756, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1qU4y1F73A", - "first_frame": "http://i1.hdslb.com/bfs/storyff/n211023qn35uju26iwo4pw2enpricqvy_firsti.jpg", - "pub_location": "陕西", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1qU4y1F73A", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 676186170, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 11841799, - "videos": 1, - "tid": 236, - "tname": "竞技体育", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/20b223c72345a544272f70014f3a9ce2e30b39c8.jpg", - "title": "【万恶之源】游泳教练原视频", - "pubdate": 1499056716, - "ctime": 1499056716, - "desc": "在网盘里翻出来的不知道有没有人上传过。不断地摸索和练习,你就学会了游泳\n其中重点不能上传,我试过一次了。", - "state": 0, - "duration": 231, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 25844288, - "name": "希爾薇", - "face": "https://i2.hdslb.com/bfs/face/67b49b90952cd64320432ae561e78e54ea3ecb53.jpg" - }, - "stat": { - "aid": 11841799, - "view": 693786, - "danmaku": 4253, - "reply": 1097, - "favorite": 20296, - "coin": 2820, - "share": 14821, - "now_rank": 0, - "his_rank": 0, - "like": 13990, - "dislike": 0, - "vt": 0, - "vv": 693786, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 19555184, - "dimension": { - "width": 352, - "height": 288, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1ox411B7jr", - "cover43": "", - "tidv2": 2063, - "tnamev2": "鬼畜综合", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1ox411B7jr", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 11841799, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 96842562, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/5c33d3957fee3dac7376ab12b3e9a2b595600d84.jpg", - "title": "真正的冰雪女王", - "pubdate": 1584448702, - "ctime": 1584448702, - "desc": "转载https://weibo.com/tv/v/FlXRiE62K?fid=1034:217aa2b6ddb0f47e65468914c7d2c9af\n妖王的歌简直可以洗涤灵魂", - "state": 0, - "duration": 219, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 388982725, - "name": "萌萌四海为家", - "face": "https://i1.hdslb.com/bfs/face/f4ce35193db8743094a4efb4e00e97442244f2aa.jpg" - }, - "stat": { - "aid": 96842562, - "view": 39902, - "danmaku": 47, - "reply": 32, - "favorite": 372, - "coin": 39, - "share": 627, - "now_rank": 0, - "his_rank": 0, - "like": 507, - "dislike": 0, - "vt": 0, - "vv": 39902, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#欧美MV##BGM##歌曲#", - "cid": 165335972, - "dimension": { - "width": 480, - "height": 360, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1V7411Z7HX", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1V7411Z7HX", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 96842562, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 84204989, - "videos": 1, - "tid": 267, - "tname": "电台", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/c6533d1b6c9fcd3cd574a0117acaa4e5ddbe7fa4.jpg", - "title": "【B站入站曲】(全站最清晰音质)", - "pubdate": 1579462179, - "ctime": 1579462179, - "desc": "【B站音乐同名】本曲是本人使用Chrome+多种技术手段历时4个小时扒出的原曲,扒曲不易(如有异议请自行尝试即可知之),请多支持!", - "state": 0, - "duration": 131, - "mission_id": 12642, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 189708807, - "name": "Yc云灿", - "face": "https://i0.hdslb.com/bfs/face/c815a0c66ab6adbd208558a0fe25c59c6ee916fa.jpg" - }, - "stat": { - "aid": 84204989, - "view": 113298, - "danmaku": 2640, - "reply": 426, - "favorite": 6659, - "coin": 1578, - "share": 238, - "now_rank": 0, - "his_rank": 0, - "like": 8192, - "dislike": 0, - "vt": 0, - "vv": 113298, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#2019##2019年度报告##年度报告#", - "cid": 144036516, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV157411v76Z", - "pub_location": "山西", - "cover43": "", - "tidv2": 2024, - "tnamev2": "电台·歌单", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV157411v76Z", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 84204989, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 45213203, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/1c73c8c16fe733568c3b6a5332c85be3ddc41acd.jpg", - "title": "如果把极乐净土的背景音乐换成hop会怎么样", - "pubdate": 1551585358, - "ctime": 1551585358, - "desc": "-", - "state": 0, - "duration": 222, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 300015102, - "name": "砂糖血块", - "face": "https://i0.hdslb.com/bfs/face/77d73e4aa3fa669255be492596e02f1570f4fb5d.jpg" - }, - "stat": { - "aid": 45213203, - "view": 521576, - "danmaku": 4054, - "reply": 867, - "favorite": 12646, - "coin": 12832, - "share": 8799, - "now_rank": 0, - "his_rank": 0, - "like": 31530, - "dislike": 0, - "vt": 0, - "vv": 521576, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 79166580, - "dimension": { - "width": 1144, - "height": 640, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1bb411B7dn", - "cover43": "", - "tidv2": 2036, - "tnamev2": "舞蹈综合", - "pid_v2": 1004, - "pid_name_v2": "舞蹈", - "bvid": "BV1bb411B7dn", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 45213203, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 66372123, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/a12315d2efc49f1862be996093c8076284719e43.jpg", - "title": "学校食堂公然放HOP,这到底是人性的泯灭,还是道德的伦桑?", - "pubdate": 1567398824, - "ctime": 1567398825, - "desc": "吃饭时的我惊呆了。。。", - "state": 0, - "duration": 61, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 298061175, - "name": "Dusk-氵夕", - "face": "https://i0.hdslb.com/bfs/face/803bf620ead9c25168935e31797b25d51f2cb614.jpg" - }, - "stat": { - "aid": 66372123, - "view": 270243, - "danmaku": 238, - "reply": 211, - "favorite": 1443, - "coin": 116, - "share": 427, - "now_rank": 0, - "his_rank": 0, - "like": 7846, - "dislike": 0, - "vt": 0, - "vv": 270243, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#自制##奇葩##HOP#", - "cid": 115113475, - "dimension": { - "width": 1280, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV174411177w", - "up_from_v2": 8, - "pub_location": "宁夏", - "cover43": "", - "tidv2": 2088, - "tnamev2": "社会观察", - "pid_v2": 1010, - "pid_name_v2": "知识", - "bvid": "BV174411177w", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 66372123, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 669351541, - "videos": 1, - "tid": 138, - "tname": "搞笑", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/fa08f65dc87fa6a26a99d0dc6fbc141adcef917b.jpg", - "title": "这TM才是东京热!!!", - "pubdate": 1597827562, - "ctime": 1597827562, - "desc": "祝大家长高3cm!", - "state": 0, - "duration": 73, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 641529005, - "name": "海胆君の日本留学日记", - "face": "https://i2.hdslb.com/bfs/face/75b3ddf5767533667d08c4475823fdf6ed7111d0.jpg" - }, - "stat": { - "aid": 669351541, - "view": 183005, - "danmaku": 78, - "reply": 54, - "favorite": 685, - "coin": 101, - "share": 225, - "now_rank": 0, - "his_rank": 0, - "like": 1310, - "dislike": 0, - "vt": 0, - "vv": 183005, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#bilibili新星计划##搞笑##全程高能#", - "cid": 226269297, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1ea4y177Rj", - "pub_location": "辽宁", - "cover43": "", - "tidv2": 2002, - "tnamev2": "影视剪辑", - "pid_v2": 1001, - "pid_name_v2": "影视", - "bvid": "BV1ea4y177Rj", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 669351541, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 239236582, - "videos": 1, - "tid": 22, - "tname": "鬼畜调教", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/60e0c8b0bdb8781ae5213d06e35a80e416b624fd.jpg", - "title": "av10388闪版", - "pubdate": 1706161150, - "ctime": 1706160987, - "desc": "-", - "state": 0, - "duration": 72, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 352435610, - "name": "尼911a", - "face": "https://i2.hdslb.com/bfs/face/dca0c49ddabaae204209764e73a1eeddd4e94fa3.jpg" - }, - "stat": { - "aid": 239236582, - "view": 98736, - "danmaku": 149, - "reply": 201, - "favorite": 700, - "coin": 45, - "share": 379, - "now_rank": 0, - "his_rank": 0, - "like": 875, - "dislike": 0, - "vt": 0, - "vv": 98736, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 1418632218, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1he411Y7MB", - "up_from_v2": 11, - "first_frame": "http://i2.hdslb.com/bfs/storyff/n240125saqkgdlb6aio291t2cc5qola0_firsti.jpg", - "pub_location": "江苏", - "cover43": "", - "tidv2": 2207, - "tnamev2": "随拍·综合", - "pid_v2": 1032, - "pid_name_v2": "其他", - "bvid": "BV1he411Y7MB", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 239236582, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 294464399, - "videos": 1, - "tid": 21, - "tname": "日常", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/8327a7955381a3a7fc0606b08ad87dd74a948a4b.png", - "title": "B站的两个极限AV号被我找到了!", - "pubdate": 1638019819, - "ctime": 1638019819, - "desc": "-", - "state": 0, - "duration": 71, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 495847991, - "name": "Tedsan", - "face": "https://i2.hdslb.com/bfs/face/d3689b9a5f93d82deb1f8b6a081767a16b16e5ca.jpg" - }, - "stat": { - "aid": 294464399, - "view": 86852, - "danmaku": 25, - "reply": 280, - "favorite": 338, - "coin": 54, - "share": 61, - "now_rank": 0, - "his_rank": 0, - "like": 450, - "dislike": 0, - "vt": 0, - "vv": 86852, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 450235439, - "dimension": { - "width": 1440, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1fF411b7Hm", - "up_from_v2": 19, - "first_frame": "http://i1.hdslb.com/bfs/storyff/n211127a23442em8g5nug2775mg3789m_firsti.jpg", - "pub_location": "四川", - "cover43": "", - "tidv2": 2207, - "tnamev2": "随拍·综合", - "pid_v2": 1032, - "pid_name_v2": "其他", - "bvid": "BV1fF411b7Hm", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 294464399, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 592220402, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/234b7c4a99412224007bf21a0e3902946dc45cd6.jpg", - "title": "【4K50帧】“我在东北玩泥巴”原曲 Daler Mehndi - Tunak Tunak Tun", - "pubdate": 1638883948, - "ctime": 1638883948, - "desc": "-", - "state": 0, - "duration": 257, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 472562429, - "name": "智英武54", - "face": "https://i2.hdslb.com/bfs/face/e7bb5b2f16863992562f10ce2a686035bf33a1b4.jpg" - }, - "stat": { - "aid": 592220402, - "view": 2711581, - "danmaku": 7298, - "reply": 1980, - "favorite": 58898, - "coin": 5115, - "share": 17577, - "now_rank": 0, - "his_rank": 0, - "like": 72931, - "dislike": 0, - "vt": 0, - "vv": 2711581, - "fav_g": 11, - "like_g": 0 - }, - "dynamic": "", - "cid": 456563995, - "dimension": { - "width": 2880, - "height": 2160, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1bq4y1q7Ho", - "up_from_v2": 8, - "first_frame": "http://i2.hdslb.com/bfs/storyff/n211207a24niqqktio4no1wmwd5tsget_firsti.jpg", - "pub_location": "江苏", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1bq4y1q7Ho", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 592220402, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 441264199, - "videos": 1, - "tid": 26, - "tname": "音MAD", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/4e36449edad0021385e5477bbe427ca9243d549a.jpg", - "title": "五大哲学", - "pubdate": 1679426636, - "ctime": 1679426636, - "desc": "-", - "state": 0, - "duration": 13, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 613658683, - "name": "长瀞重度依赖", - "face": "https://i1.hdslb.com/bfs/face/c53f852b5ca574eed9be9877d7ce3f28a2e89385.jpg" - }, - "stat": { - "aid": 441264199, - "view": 671881, - "danmaku": 92, - "reply": 230, - "favorite": 2720, - "coin": 228, - "share": 1060, - "now_rank": 0, - "his_rank": 0, - "like": 9049, - "dislike": 0, - "vt": 0, - "vv": 671881, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 1064182352, - "dimension": { - "width": 720, - "height": 720, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1nL411r7mS", - "up_from_v2": 8, - "first_frame": "http://i2.hdslb.com/bfs/storyff/n230322qntglnzeqo4m1c23cnoyehccs_firsti.jpg", - "pub_location": "广西", - "cover43": "", - "tidv2": 2015, - "tnamev2": "娱乐综合", - "pid_v2": 1002, - "pid_name_v2": "娱乐", - "bvid": "BV1nL411r7mS", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 441264199, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 49016435, - "videos": 1, - "tid": 31, - "tname": "翻唱", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/9b7da84975469b7ddcd78717d06c092c4433ccf4.jpg", - "title": "【喵会长】妹子竟被逼着翻唱保加利亚妖王!⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄!", - "pubdate": 1555135227, - "ctime": 1554999201, - "desc": "这次视频改了N遍,剪的好累~希望大家能多多支持一下\n网易云音频链接:https://music.163.com/#/song?id=1358976277\n关注微博有惊喜!@隔壁班的喵会长", - "state": 0, - "duration": 200, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 21330948, - "name": "隔壁班的喵会长", - "face": "https://i0.hdslb.com/bfs/face/75a4a80496daacb478496f6a0aaf4d3ab357393d.jpg" - }, - "stat": { - "aid": 49016435, - "view": 1988312, - "danmaku": 8866, - "reply": 5413, - "favorite": 53008, - "coin": 136074, - "share": 13019, - "now_rank": 0, - "his_rank": 4, - "like": 268302, - "dislike": 0, - "vt": 0, - "vv": 1988312, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "那个曾经制霸b站的男银又肥来了!!!!", - "cid": 86290623, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1vb411M79s", - "pub_location": "山西", - "cover43": "", - "tidv2": 2061, - "tnamev2": "人力VOCALOID", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1vb411M79s", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 49016435, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 730704908, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i1.hdslb.com/bfs/archive/2fd2b442a3f42ed0ba20c5204afdd92dbdfb9a68.jpg", - "title": "【越南神曲】-《Cứ Chill Thôi》!终于找到原版了!", - "pubdate": 1663586400, - "ctime": 1663574508, - "desc": "听完以后瞬间心情舒畅,太绝了!", - "state": 0, - "duration": 281, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 0, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 2043250564, - "name": "4K音乐馆", - "face": "https://i1.hdslb.com/bfs/face/4be964615e70e18ab469e4403cb0fa320f8d2fdc.jpg" - }, - "stat": { - "aid": 730704908, - "view": 4715077, - "danmaku": 3141, - "reply": 4132, - "favorite": 75716, - "coin": 9002, - "share": 7597, - "now_rank": 0, - "his_rank": 0, - "like": 79627, - "dislike": 0, - "vt": 0, - "vv": 4715077, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 837595821, - "dimension": { - "width": 3840, - "height": 2160, - "rotate": 0 - }, - "season_id": 725909, - "short_link_v2": "https://b23.tv/BV1GD4y1i7dA", - "first_frame": "http://i2.hdslb.com/bfs/storyff/n220919qn29hpyl52if2k1dthb32a0ji_firsti.jpg", - "pub_location": "山东", - "cover43": "", - "tidv2": 2017, - "tnamev2": "MV", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1GD4y1i7dA", - "season_type": 1, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 730704908, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 413754644, - "videos": 1, - "tid": 59, - "tname": "演奏", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/4769bc9c91af6fc8598d1b22d16033b540af33a8.jpg", - "title": "【东京热】TOKY HOT THEME SONG ( FULL VERSION)", - "pubdate": 1594208253, - "ctime": 1594208253, - "desc": "-", - "state": 0, - "duration": 157, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 476156735, - "name": "星际的小喵", - "face": "http://i2.hdslb.com/bfs/face/b6fcd4d4d23047432012576dda4239b5d0b5fa6e.jpg" - }, - "stat": { - "aid": 413754644, - "view": 476215, - "danmaku": 166, - "reply": 906, - "favorite": 6630, - "coin": 627, - "share": 3116, - "now_rank": 0, - "his_rank": 0, - "like": 6086, - "dislike": 0, - "vt": 0, - "vv": 476215, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "#日本##音乐##东京#", - "cid": 210245452, - "dimension": { - "width": 426, - "height": 240, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1pV41167y7", - "cover43": "", - "tidv2": 2027, - "tnamev2": "音乐综合", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1pV41167y7", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 413754644, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 468509831, - "videos": 1, - "tid": 193, - "tname": "MV", - "copyright": 2, - "pic": "http://i0.hdslb.com/bfs/archive/03971484b4c3931e89cbcf5862f8c10645e6aaec.jpg", - "title": "补裆 av3440 -", - "pubdate": 1651067890, - "ctime": 1651067890, - "desc": "新浪\nbiliplus,里面只有残缺的信息,发布时间应该是2010-2-27", - "state": 0, - "duration": 215, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 675115853, - "name": "゚゙゙゙゚゚゙゚゚", - "face": "https://i2.hdslb.com/bfs/face/8706d12c0df1f27aff5ae3c045b7da0133bd8c4a.png" - }, - "stat": { - "aid": 468509831, - "view": 280276, - "danmaku": 89, - "reply": 324, - "favorite": 4518, - "coin": 151, - "share": 209, - "now_rank": 0, - "his_rank": 0, - "like": 6403, - "dislike": 0, - "vt": 0, - "vv": 280276, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 586522933, - "dimension": { - "width": 320, - "height": 240, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1H541117sZ", - "up_from_v2": 8, - "first_frame": "http://i2.hdslb.com/bfs/storyff/n220427qn2g6emv26rnqxq247csj5kgn_firsti.jpg", - "cover43": "", - "tidv2": 2027, - "tnamev2": "音乐综合", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1H541117sZ", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 468509831, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 19390801, - "videos": 1, - "tid": 22, - "tname": "鬼畜调教", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/d52994a1876d07a975dc6683b78a898d9b581208.png", - "title": "【春晚鬼畜】赵本山:我就是念诗之王!【改革春风吹满地】", - "pubdate": 1518339644, - "ctime": 1518230987, - "desc": "小时候每次吃完年夜饭,都会急急忙忙跑回自己房间跟朋友玩彩虹岛,街头篮球,泡泡堂,极品飞车,CS。一旦听到外面大人们喊“哦!赵本山来咯!”,就马上暂停手上的游戏赶紧跑出去看。对我来说没有赵本山的春晚根本不是春晚。\n鬼畜本家:av18521530\n【举起手来】花姑娘又要吸旺仔牛奶!\nby @疯猴pme", - "state": 0, - "duration": 152, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 353246678, - "name": "UP-Sings", - "face": "http://i2.hdslb.com/bfs/face/224815f69567dfbdacffc64185b89568bf8da0f3.jpg" - }, - "stat": { - "aid": 19390801, - "view": 123739584, - "danmaku": 667864, - "reply": 325458, - "favorite": 3047850, - "coin": 4800461, - "share": 1494973, - "now_rank": 0, - "his_rank": 3, - "like": 5445710, - "dislike": 0, - "vt": 0, - "vv": 123739584, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "不管今年春晚有没有本山叔,鬼畜区总归是有的!", - "cid": 31621681, - "dimension": { - "width": 640, - "height": 360, - "rotate": 0 - }, - "season_id": 879555, - "short_link_v2": "https://b23.tv/BV1bW411n7fY", - "cover43": "", - "tidv2": 2059, - "tnamev2": "鬼畜调教", - "pid_v2": 1007, - "pid_name_v2": "鬼畜", - "bvid": "BV1bW411n7fY", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 19390801, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 305593327, - "videos": 1, - "tid": 255, - "tname": "颜值·网红舞", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/b4917bb0a9147f205e6af9d87d6d50b864a7a97f.jpg", - "title": "蝴蝶步2.0(◦˙▽˙◦)", - "pubdate": 1669474753, - "ctime": 1669474753, - "desc": "-", - "state": 0, - "duration": 15, - "mission_id": 1039224, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 43724742, - "name": "怎么这样的呐", - "face": "https://i0.hdslb.com/bfs/face/f9e9ae6025a9e02b134eec3dd84b87c3689216a3.jpg" - }, - "stat": { - "aid": 305593327, - "view": 13909975, - "danmaku": 1401, - "reply": 7111, - "favorite": 235000, - "coin": 83120, - "share": 24633, - "now_rank": 0, - "his_rank": 0, - "like": 383239, - "dislike": 0, - "vt": 0, - "vv": 13909975, - "fav_g": 14, - "like_g": 0 - }, - "dynamic": "双更一下~", - "cid": 904012490, - "dimension": { - "width": 1456, - "height": 2592, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1kP411u7jr", - "up_from_v2": 19, - "first_frame": "http://i2.hdslb.com/bfs/storyff/n221126qn2i92o9zf8m22h34kykxw0dl_firsti.jpg", - "pub_location": "浙江", - "cover43": "", - "tidv2": 2030, - "tnamev2": "颜值·网红舞", - "pid_v2": 1004, - "pid_name_v2": "舞蹈", - "bvid": "BV1kP411u7jr", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 305593327, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - }, - { - "aid": 114075187020133, - "videos": 1, - "tid": 256, - "tname": "短片", - "copyright": 1, - "pic": "http://i1.hdslb.com/bfs/archive/3d3aaf0ab2da5e41f4de7ed3e7995babbfd1168a.jpg", - "title": "中国人自己的保加利亚妖王", - "pubdate": 1740649401, - "ctime": 1740649401, - "desc": "-", - "state": 0, - "duration": 53, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0, - "arc_pay": 0, - "pay_free_watch": 0 - }, - "owner": { - "mid": 1247190580, - "name": "麦克瑟瑟大型纪录片", - "face": "https://i1.hdslb.com/bfs/face/98df710e5e76e7fe37c0d5fd8047b899b21943d5.jpg" - }, - "stat": { - "aid": 114075187020133, - "view": 9167, - "danmaku": 1, - "reply": 12, - "favorite": 24, - "coin": 2, - "share": 9, - "now_rank": 0, - "his_rank": 0, - "like": 166, - "dislike": 0, - "vt": 0, - "vv": 9167, - "fav_g": 0, - "like_g": 0 - }, - "dynamic": "", - "cid": 28602729880, - "dimension": { - "width": 1440, - "height": 1080, - "rotate": 0 - }, - "short_link_v2": "https://b23.tv/BV1Xg9cYYEDZ", - "up_from_v2": 19, - "first_frame": "http://i0.hdslb.com/bfs/storyff/n250227sao3m0apa1gc9g2yxt3vx2l53_firsti.jpg", - "pub_location": "河南", - "cover43": "", - "tidv2": 2026, - "tnamev2": "乐评盘点", - "pid_v2": 1003, - "pid_name_v2": "音乐", - "bvid": "BV1Xg9cYYEDZ", - "season_type": 0, - "is_ogv": false, - "ogv_info": null, - "rcmd_reason": "", - "enable_vt": 0, - "ai_rcmd": { - "id": 114075187020133, - "goto": "av", - "trackid": "web_related_0.router-related-2004712-fdb74c5f6-v6rmv.1744730526909.62", - "uniq_id": "" - } - } - ], - "Spec": null, - "hot_share": { - "show": false, - "list": [] - }, - "elec": null, - "emergency": { - "no_like": false, - "no_coin": false, - "no_fav": false, - "no_share": false - }, - "view_addit": { - "63": false, - "64": false, - "69": false, - "71": false, - "72": false - }, - "guide": null, - "query_tags": null, - "participle": [ - "保加利亚", - "azis", - "mv" - ], - "module_ctrl": null, - "replace_recommend": false - } -} -``` - -
- -## 获取视频简介 - -> https://api.bilibili.com/x/web-interface/archive/desc - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|--------|--------|---------------| -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|--------------------------------------| -| code | num | 返回值 | 0:成功
-400:请求错误
62002:稿件不可见 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | str | 简介内容 | | - -**示例:** - -查看视频(教主的咕鸽)`av39330059`/`BV1Bt411z799`的简介 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/archive/desc' \ ---data-urlencode 'aid=39330059' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/archive/desc' \ ---data-urlencode 'bvid=BV1Bt411z799' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": "1.小朋友们大家好,我是你们爷爷最喜欢的超威一列姆!\r\n2.在过去的一年里,我创作了无数脍炙人口的歌曲,常常被人夸赞高产似雌豚。\r\n3.接下来的日子里我会一如既往地勤勉创作,争取继续保持现在的产量,文体两开花。\r\n4.我感觉照这个势头和速度下去别说日常更新不在话下,连出张新专辑都指日可待了啊。\r\n5.也感谢你们一如既往的支持和鼓励,我会注意身体,不把自己累垮掉的。\r\n6.我个人不建议你们在评论区里艾特任何UP主,我真的不建议,当然你们非要这么做我也没办法的。" -} -``` - -
- -## 查询视频分P列表 (avid/bvid转cid) - -> https://api.bilibili.com/x/player/pagelist - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|--------|--------|---------------| -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-------|------|-----------------------------------| -| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 分P列表 | | - -数组`data`: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|----------|---------| -| 0 | obj | 1P内容 | 无分P仅有此项 | -| n | obj | (n+1)P内容 | | -| …… | obj | …… | …… | - -数组`data`中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|-----------|---------------------------------------------| -| cid | num | 当前分P cid | | -| page | num | 当前分P | | -| from | str | 视频来源 | vupload:普通上传(B站)
hunan:芒果TV
qq:腾讯 | -| part | str | 当前分P标题 | | -| duration | num | 当前分P持续时间 | 单位为秒 | -| vid | str | 站外视频vid | | -| weblink | str | 站外视频跳转url | | -| dimension | obj | 当前分P分辨率 | 有部分视频无法获取分辨率 | -| first_frame | str | 分P封面 | | - -数组`data`中的对象中的`dimension`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------|-----|---------|----------------| -| width | num | 当前分P 宽度 | | -| height | num | 当前分P 高度 | | -| rotate | num | 是否将宽高对换 | 0:正常
1:对换 | - -**示例:** - -查询视频`av13502509`/`BV1ex411J7GE`的分P列表 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/pagelist' \ ---data-urlencode 'aid=13502509' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/pagelist' \ ---data-urlencode 'bvid=BV1ex411J7GE' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "cid": 66445301, - "page": 1, - "from": "vupload", - "part": "00. 宣传短片", - "duration": 33, - "vid": "", - "weblink": "", - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - } - }, { - "cid": 35039663, - "page": 2, - "from": "vupload", - "part": "01. 火柴人与动画师", - "duration": 133, - "vid": "", - "weblink": "", - "dimension": { - "width": 1484, - "height": 1080, - "rotate": 0 - } - }, { - "cid": 35039678, - "page": 3, - "from": "vupload", - "part": "02. 火柴人与动画师 II", - "duration": 210, - "vid": "", - "weblink": "", - "dimension": { - "width": 1484, - "height": 1080, - "rotate": 0 - } - }, { - "cid": 35039693, - "page": 4, - "from": "vupload", - "part": "03. 火柴人与动画师 III", - "duration": 503, - "vid": "", - "weblink": "", - "dimension": { - "width": 992, - "height": 720, - "rotate": 0 - } - }] -} -``` - -
diff --git a/docs/video/interact_video.md b/docs/video/interact_video.md deleted file mode 100644 index c87892d..0000000 --- a/docs/video/interact_video.md +++ /dev/null @@ -1,369 +0,0 @@ -# 互动视频信息 - -注:互动视频分P与普通视频分P不互通 - -## 获取互动视频模块详细信息 - -> https://api.bilibili.com/x/stein/edgeinfo_v2 - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------- | ---- | -------- | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| graph_version | num | 剧情图id | 必要 | 可于[播放器](/docs/video/player.md)接口的 `interaction` 對象取得 | -| edge_id | num | 模块编号 | 非必要 | 0或留空为起始模块 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频
99003:剧情图被修改已失效
99077:请输入aid/bvid | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | ------------------- | ------------------------------------------------ | -| title | str | 视频模块(分P)标题 | | -| edge_id | num | 当前模块id | | -| story_list | array | 进度回溯信息 | 未登录仅有起始模块 | -| edges | obj | 当前模块信息 | | -| preload | obj | 预加载的分P | | -| hidden_vars | array | 变量列表 | 无变量时不存在此项 | -| is_leaf | num | 是否为结束模块 | 0:当前模块为普通模块
1:当前模块为结束模块 | -| no_tutorial | num | 禁止记录选择 | 1:禁止
非禁止时无此项 | -| no_backtracking | num | 禁止进度回溯 | 1:禁止
非禁止时无此项 | -| no_evaluation | num | 禁止结尾评分 | 1:禁止
非禁止时无此项 | - -`data`中的`story_list`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ---- | -| 0 | obj | 回溯第一项模块 | | -| n | obj | 回溯第(n+1)项模块 | | -| …… | obj | …… | …… | - -`story_list`数组中的对象: - -| 项 | 类型 | 内容 | 备注 | -| ---------- | ---- | ---------------- | ----------------------------- | -| node_id | num | 模块编号 | | -| edge_id | num | **同上** | | -| title | str | 模块(分P)标题 | | -| cid | num | 模块(分P)cid | | -| start_pos | num | 记录播放开始位置 | 单位为毫秒 | -| cover | str | 分P封面url | | -| is_current | num | 是否为当前模块 | 1:是
仅为当前模块时存在 | -| cursor | num | 进度序号 | 从0开始向上增长 | - -`data`中的`edges`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | ------------- | ------------------------ | -| dimension | obj | 当前分P分辨率 | 有部分视频无法获取分辨率 | -| questions | array | 问题 | 结束模块无此项 | -| skin | obj | 问题外观 | | - -`edges`中的`dimension`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | -------------- | -------------------- | -| width | num | 当前分P 宽度 | | -| height | num | 当前分P 高度 | | -| rotate | num | 是否将宽高对换 | 0:正常
1:对换 | -| sar | str | ??? | 作用尚不明确 | - -`edges`中的`questions`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| 0 | obj | 套了个娃 | | - -`edges`中的`questions`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ----- | ---------------- | ------------------------------------------------------------ | -| id | num | ??? | 作用尚不明确 | -| type | num | 选项显示模式 | 0:不显示选项
1:底部选项模式
2:坐标定点模式
3:???
127:??? | -| start_time_r | num | 300 或 duration | 作用尚不明确 | -| duration | num | 回答限时 | 单位为毫秒
不限时为`-1` | -| pause_video | num | 是否暂停播放视频 | 0:不暂停
1:暂停播放 | -| title | str | 空 | 作用尚不明确 | -| choices | array | 选项列表 | | -| fade_in_time | num | 选项淡入时间 | 毫秒 | -| fade_out_time | num | 选项淡出时间 | 毫秒 | - -`questions`数组中的对象中的`choices`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------- | ---- | -| 0 | obj | 第一选项 | | -| n | obj | 第(n+1)选项 | | -| …… | obj | …… | …… | - -`questions`数组中的对象中的`choices`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ---- | -------------------- | ------------------------------------- | -| id | num | 选项所跳转的模块id | | -| platform_action | str | 跳转信息文字 | JUMP+{所跳转的模块编号}+{所跳转的cid} | -| native_action | str | 点击后对变量运算语句 | 每项间用分号隔开
无为空 | -| condition | str | 选项出现条件判断语句 | 无为空 | -| cid | num | 选项所跳转分P的cid | | -| x | num | 选项出现的x坐标 | 仅坐标模式有此项 | -| y | num | 选项出现的y坐标 | 仅坐标模式有此项 | -| text_align | num | 选项文本对齐方式 | | -| option | str | 选项文字 | | -| selected | obj | 选择动画信息 | | -| submited | obj | 提交动画信息 | | -| is_default | num | 是否为默认选项 | 1:是
非默认选项无此项 | -| is_hidden | num | 是否为隐藏选项 | 1:是
非隐藏选项无此项 | - -`edges`中的`skin`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ---- | ------------------- | ---------------- | -| choice_image | str | 选项组件外观图片url | | -| title_text_color | str | 文字颜色 | 以下均为RGBA格式 | -| title_shadow_color | str | 文字阴影颜色 | | -| title_shadow_offset_x | num | 文字阴影x偏移 | | -| title_shadow_offset_y | num | 文字阴影y偏移 | | -| title_shadow_radius | num | 文字阴影半径 | | -| progressbar_color | str | 倒计时条颜色 | | -| progressbar_shadow_color | str | 倒计时条阴影颜色 | | - -`data`中的`preload`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ----- | ----------- | ---- | -| video | array | 预加载的分P | | - -`preload`中的`video`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ------------------------------------ | -| 0 | obj | 预加载第一项 | 预加载的内容为当前所有选项的跳转视频 | -| n | obj | 预加载第(n+1)项 | | -| …… | obj | …… | …… | - -`preload`中的`video`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | -------- | ---- | -| aid | num | 稿件avid | | -| cid | num | 分P cid | | - -`data`中的`hidden_vars`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 第一个变量 | | -| n | obj | 第(n+1)个变量 | | -| …… | obj | …… | …… | - -`data`中的`hidden_vars`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------ | -------------------------- | -| value | num | 变量值 | 随机值为随机整数 | -| id | str | 变量编号 | | -| id_v2 | str | 变量编号 | 语句中一般使用这种 | -| type | num | 变量类型 | 1:普通变量
2:随机值 | -| is_show | num | 是否展示变量 | 0:否
1:是 | -| name | str | 变量名 | | -| skip_overwrite | num | 0 | 作用尚不明确 | - -**示例:** - -查询互动视频`av73267982`下剧情图`155446`模块`5556092`的信息 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/stein/edgeinfo_v2' \ ---data-urlencode 'aid=73267982' \ ---data-urlencode 'graph_version=155446' \ ---data-urlencode 'edge_id=5556092' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/stein/edgeinfo_v2' \ ---data-urlencode 'bvid=BV1UE411y7Wy' \ ---data-urlencode 'graph_version=155446' \ ---data-urlencode 'edge_id=5556092' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "title": "4", - "edge_id": 5556092, - "story_list": [ - { - "node_id": 1, - "edge_id": 1, - "title": "0 片头", - "cid": 127486603, - "start_pos": 27000, - "cover": "http://i0.hdslb.com/bfs/steins-gate/127486603_screenshot.jpg", - "cursor": 0 - }, - { - "node_id": 5556092, - "edge_id": 5556092, - "title": "4", - "cid": 125499378, - "start_pos": 82000, - "cover": "http://i0.hdslb.com/bfs/steins-gate/125499378_screenshot.jpg", - "is_current": 1, - "cursor": 15 - } - ], - "edges": { - "dimension": { - "width": 1920, - "height": 1000, - "rotate": 0, - "sar": "" - }, - "questions": [ - { - "id": 0, - "type": 2, - "start_time_r": 300, - "duration": -1, - "pause_video": 1, - "title": "", - "choices": [ - { - "id": 5556133, - "platform_action": "JUMP 5556133 125499249", - "native_action": "", - "condition": "$H7g_64_PG2EVS>=1.00 && $H7g_64_PG2EVS<=80.00", - "cid": 125499249, - "x": 947, - "y": 499, - "text_align": 2, - "option": "A <你已成为杀手> 试图砍死萌新 (成功率20%)", - "is_default": 1 - }, - { - "id": 5556134, - "platform_action": "JUMP 5556134 125502707", - "native_action": "", - "condition": "$H7g_64_PG2EVS>=81.00 && $H7g_64_PG2EVS<=100.00", - "cid": 125502707, - "x": 949, - "y": 502, - "text_align": 2, - "option": "B <你已成为杀手> 试图砍死萌新 (成功率20%)" - }, - { - "id": 5556135, - "platform_action": "JUMP 5556135 125499249", - "native_action": "", - "condition": "", - "cid": 125499249, - "x": 120, - "y": 145, - "text_align": 2, - "option": "C 直接【砍杀失败】" - } - ] - } - ], - "skin": { - "choice_image": "https://i0.hdslb.com/bfs/app/db0ae7700d4fb1416c8b305bcfb6f0948f818cc9.png", - "title_text_color": "d8fbffff", - "title_shadow_color": "00000033", - "title_shadow_offset_y": 1, - "title_shadow_radius": 1, - "progressbar_color": "ffffffff", - "progressbar_shadow_color": "000000cc" - } - }, - "preload": { - "video": [ - { - "aid": 73267982, - "cid": 125499249 - }, - { - "aid": 73267982, - "cid": 125502707 - } - ] - }, - "hidden_vars": [ - { - "value": 97, - "id": "v-H7g@PG2EVS", - "id_v2": "$H7g_64_PG2EVS", - "type": 2, - "is_show": 0, - "name": "随机值", - "skip_overwrite": 0 - }, - { - "value": 0, - "id": "v-YWB6dk1oCP", - "id_v2": "$YWB6dk1oCP", - "type": 1, - "is_show": 1, - "name": "达成假结局次数", - "skip_overwrite": 0 - }, - { - "value": 0, - "id": "v-Zh4JACIiId", - "id_v2": "$Zh4JACIiId", - "type": 1, - "is_show": 1, - "name": "死亡次数", - "skip_overwrite": 0 - }, - { - "value": 0, - "id": "v-a2vplaQlsP", - "id_v2": "$a2vplaQlsP", - "type": 1, - "is_show": 1, - "name": "达成真结局次数", - "skip_overwrite": 0 - }, - { - "value": 1, - "id": "v-lMQqQ994Sk", - "id_v2": "$lMQqQ994Sk", - "type": 1, - "is_show": 1, - "name": "循环编号", - "skip_overwrite": 0 - } - ], - "is_leaf": 0 - } -} -``` - -
diff --git a/docs/video/online.md b/docs/video/online.md deleted file mode 100644 index 4b80f0e..0000000 --- a/docs/video/online.md +++ /dev/null @@ -1,143 +0,0 @@ -# 视频在线人数 - -## 获取视频在线人数_web端 - -> https://api.bilibili.com/x/player/online/total - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ---------- | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 视频cid | 必要 | 用于选择目标分P | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----------- | ---- | ----------------- | ----------- | -| total | str | 所有终端总计人数 | 例如`10万+` | -| count | str | web端实时在线人数 | | -| show_switch | obj | 数据显示控制 | | - -`data`中的`show_switch`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | --------------------- | ---- | -| total | bool | 展示所有终端总计人数 | | -| count | bool | 展示web端实时在线人数 | | - -**示例:** - -查询视频`av759949922`/`BV1y64y1q757`中1P(`392402545`)的在线人数 - -```shell -curl -G 'https://api.bilibili.com/x/player/online/total' \ ---data-urlencode 'aid=759949922' \ ---data-urlencode 'cid=392402545' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "total": "9.4万+", - "count": "50953", - "show_switch": { - "total": true, - "count": true - } - } -} -``` - -
- -## 获取视频在线人数_APP端 - -> https://app.bilibili.com/x/v2/view/video/online - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ----------- | --------------- | -| aid | num | 稿件avid | 必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| cid | num | 视频cid | 必要 | 用于选择目标分P | -| ts | num | 当前时间戳 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---------------- | ---- | -| online | obj | 所有终端总计人数 | | - -`data`中的`show_switch`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------ | ---- | ---------------- | ----------------- | -| online | str | 所有终端总计人数 | 例如`10万+人在看` | - -**示例:** - -查询视频`av759949922`/`BV1y64y1q757`中1P(`392402545`)的在线人数 - -```shell -curl -G 'https://app.bilibili.com/x/v2/view/video/online' \ ---data-urlencode 'aid=759949922' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'cid=392402545' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=172dfd9941a01275eb93ce6246cd8556' -``` - -
-查看响应示例: - - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "online": { - "total_text": "8.8万+人在看" - } - } -} -``` - -
\ No newline at end of file diff --git a/docs/video/pbp.md b/docs/video/pbp.md deleted file mode 100644 index 9ce5824..0000000 --- a/docs/video/pbp.md +++ /dev/null @@ -1,69 +0,0 @@ -# 高能进度条 - -高能进度条反应了在时域上,单位时间内弹幕发送量的变化趋势 - -并用曲线顶点表示在进度条上,实现可视化 - -## 获取弹幕趋势顶点列表 - -> https://bvc.bilivideo.com/pbp/data - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| cid | num | 视频cid | 必要 | | -| aid | num | 稿件avid | 非必要 | | -| bvid | num | 稿件bvid | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ------------ | ---------------------------- | -| step_sec | num | 采样间隔时间 | 单位为秒
由视频时长决定 | -| tagstr | str | ??? | 作用尚不明确 | -| events | obj | 数据本体 | | -| debug | str | 调试信息 | json字串 | - -`events`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ------ | ---------- | ---- | -| default | array | 顶点值列表 | | - -`events`对象中的数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------- | -------------------------------- | -| 0 | num | 顶点1 | | -| n | num | 顶点(n+1) | 顶点个数由视频时长和采样时间决定 | -| …… | num | …… | …… | - -**示例:** - -获取视频`cid=3724723`的获取弹幕趋势顶点列表 - -```shell -curl -G 'https://api.bilibili.com/pbp/data' \ ---data-urlencode 'cid=3724723' -``` - -
-查看响应示例: - -```json -{ - "step_sec": 3, - "tagstr": "pbphide_0&client_&innersign_0&group_eg&nocheck_0&version_&pbphide_0", - "events": { - "default": [0, 8853, 8011, 8043.5, 8602.5, 9377, 18838, 9645, 10396, 10672.5, 10316.5, 9987, 9524, 9040, 9081, 8747, 8517, 8559.5, 8220.5, 8133, 7164, 5626, 4992, 4628.5, 4570.5, 4473.5, 4681.5, 4365.5, 3811.5, 3813, 3883, 4059.5, 4103.5, 4227.5, 4330.5, 4096.5, 4228.5, 4337, 5017, 5897, 6220, 5711.5, 4871.5, 4533, 4364, 3976, 4012, 3985, 3658, 3540, 3789, 3646, 3045, 2769, 2587, 2488.5, 2402.5, 2521.5, 2508.5, 2763.5, 2941.5, 3685.5, 3337.5, 2457, 2313, 2322.5, 2480.5, 2595, 2520, 2173.5, 2058.5, 2268.5, 2312.5, 2847, 1083, 1.5, 2.5, 0, 0, 2] - }, - "debug": "{\"max_time\":237,\"zero_points_ratio\":0.025,\"total_dm\":1000,\"event_count\":400147}" -} -``` - -
diff --git a/docs/video/player.md b/docs/video/player.md deleted file mode 100644 index 66bce57..0000000 --- a/docs/video/player.md +++ /dev/null @@ -1,520 +0,0 @@ -# 播放器 - -## web 播放器信息 - -web 播放器的信息接口,提供正常播放需要的元数据,包括:智能防挡弹幕、字幕、章节看点等。 - -> https://api.bilibili.com/x/player/wbi/v2 -> https://api.bilibili.com/x/player/v2 - -*请求方式:GET* - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | --------- | ----------- | ----------------- | -| aid | num | 稿件 avid | 必要 (可选) | aid 与 bvid 任选 | -| bvid | str | 稿件 bvid | 必要 (可选) | aid 与 bvid 任选 | -| cid | num | 稿件 cid | 必要 | | -| season_id | num | 番剧 season_id | 不必要 | | -| ep_id | num | 剧集 ep_id | 不必要 | | -| w_rid | str | WBI 签名 | 不必要 | | -| wts | num | 当前 unix 时间戳 | 不必要 | | - -**JSON回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0: 成功
-400: 请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -| aid | num | 视频 aid | | -| bvid | str | 视频 bvid | | -| allow_bp | bool | | | -| no_share | bool | 禁止分享? | | -| cid | num | 视频 cid | | -| dm_mask | obj | webmask 防挡字幕信息 | 若无则没有防挡功能 | -| subtitle | obj | 字幕信息 | 若无则没有字幕, 若不登陆则为空 | -| view_points | array | 分段章节信息 | | -| ip_info | obj | 请求 IP 信息 | | -| login_mid | num | 登录用户 mid | | -| login_mid_hash | str | | | -| is_owner | bool | 是否为该视频 UP 主 | | -| name | str | | | -| permission | num | | | -| level_info | obj | 登录用户等级信息 | | -| vip | obj | 登录用户 VIP 信息 | | -| answer_status | num | 答题状态 | | -| block_time | num | 封禁时间? | | -| role | str | | | -| last_play_time | num | 上次观看时间? | | -| last_play_cid | num | 上次观看 cid? | | -| now_time | num | 当前 UNIX 秒级时间戳 | | -| online_count | num | 在线人数 | | -| need_login_subtitle | bool | 是否必须登陆才能查看字幕 | 是的 | -| preview_toast | str | `为创作付费,购买观看完整视频\|购买观看` | | -| interaction | obj | 互动视频资讯 | 若非互动视频,则无该栏位(直接没有该键,而非栏位值为空)| -| options | obj | | | -| guide_attention | any | | | -| jump_card | any | | | -| operation_card | any | | | -| online_switch | obj | | | -| fawkes | obj | 播放器相关信息? | | -| show_switch | obj | | | -| bgm_info | obj | 背景音乐信息 | | -| toast_block | bool | | | -| is_upower_exclusive | bool | 是否为充电专属视频 | | -| is_upower_play | bool | | | -| is_ugc_pay_preview | bool | | | -| elec_high_level | obj | 充电专属视频信息 | | -| disable_show_up_info | bool | | | - -`data` 对象中的 `options` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---- | ---- | --- | --- | -| is_360 | bool | 是否 360 全景视频 | | -| without_vip | bool | | | - -`data` 对象中的 `bgm_info` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --- | --- | --- | --- | -| music_id | str | 音乐 id | | -| music_title | str | 音乐标题 | | -| jump_url | str | 跳转 URL | | - -`data` 对象中的 `dm_mask` 对象 (如果有): - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -|cid | num | 视频 cid | | -|plat | num | 未知 | | -|fps | num | webmask 取样 fps | | -|time | num | 未知 | | -|mask_url | str | webmask 资源 url | | - -解析 webmask 请看 [智能防挡弹幕](../danmaku/webmask.md) - -`data` 对象中的 `subtitle` 对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -|allow_submit|bool | true | | -| lan | str | "" | | -|lan_doc | str | "" | | -|subtitles| array | | 不登录为 `[]` | - -`subtitle` 对象中的 `subtitles` 数组内的元素: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -| ai_status | num | | | -| ai_type | num | | | -| id | num | | | -|id_str | str| | 和 id 不一样 | -| is_lock | bool | | | -| lan | str | 语言类型英文字母缩写 || -| lan_doc | str| 语言类型中文名称 | | -|subtitle_url|str| 资源 url 地址 | | -|type| num | 0 | | - -`data`对象中的`view_point` 数组内的元素: - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -| content | str | 分段章节名 | | -| from | num | 分段章节起始秒数 | | -| to | num | 分段章节结束秒数 | | -| type | num | | | -| imgUrl | str | 图片资源地址 | | -| logoUrl | str | "" | | -| team_type | str | | | -| team_name | str | | | - -`data` 对象中的 `interaction` 对象 (如果有): - -| 字段 | 类型 | 内容 | 备注 | -| --------- | ----- | -------- | ---- | -| graph_version | num | 剧情图id | | -| msg | str | | 未登入有机会返回 `登录后才能体验全部结局哦~` | -| error_toast | str | 错误信息? | 所有互动视频皆返回 `剧情图被修改已失效`,不确定有没有例外 | -| mark | num | 0? | | -| need_reload | num | 0? | | - -`data`对象中的`elec_high_level`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ------------------------------ | ---------------- | -| privilege_type | num | 解锁视频所需最低定价档位的代码 | 见[充电档位代码与定价](../electric/monthly.md#充电档位代码privilege_type与定价) | -| title | str | 提示标题 | `该视频为「{充电档位名称}」专属视频` | -| sub_title | str | 提示子标题 | `开通「{充电档位定价}元档包月充电」即可观看` | -| show_button | bool | 是否显示按钮 | | -| button_text | str | 按钮文本 | `去开通` | -| jump_url | obj | 跳转url信息 | 详细信息有待补充 | -| intro | str | 充电介绍语 | | -| open | bool | (?) | | -| new | bool | (?) | | -| question_text | str | (?) | | -| qa_detail_link | str | (?) | | - -**示例:** - -未登录, `aid=1906473802` - -```shell -curl -G 'https://api.bilibili.com/x/player/wbi/v2' \ ---url-query 'bvid=BV1MU411S7iJ' \ ---url-query 'aid=1906473802' \ ---url-query 'cid=1625992822' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 1906473802, - "bvid": "BV1MU411S7iJ", - "allow_bp": false, - "no_share": false, - "cid": 1625992822, - "max_limit": 1000, - "page_no": 1, - "has_next": false, - "ip_info": { - "ip": "104.28.152.138", - "zone_ip": " 10.163.150.25", - "zone_id": 29409280, - "country": "美国", - "province": "加利福尼亚州", - "city": "东洛杉矶" - }, - "login_mid": 0, - "login_mid_hash": "", - "is_owner": false, - "name": "", - "permission": "0", - "level_info": { - "current_level": 0, - "current_min": 0, - "current_exp": 0, - "next_exp": 0, - "level_up": 0 - }, - "vip": { - "type": 0, - "status": 0, - "due_date": 0, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": false, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "", - "img_label_uri_hant_static": "" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 0, - "avatar_icon": { - "icon_resource": {} - } - }, - "answer_status": 0, - "block_time": 0, - "role": "", - "last_play_time": 0, - "last_play_cid": 0, - "now_time": 1725002188, - "online_count": 1, - "need_login_subtitle": false, - "view_points": [], - "preview_toast": "为创作付费,购买观看完整视频|购买观看", - "options": { - "is_360": false, - "without_vip": false - }, - "guide_attention": [], - "jump_card": [], - "operation_card": [], - "online_switch": { - "enable_gray_dash_playback": "500", - "new_broadcast": "1", - "realtime_dm": "1", - "subtitle_submit_switch": "1" - }, - "fawkes": { - "config_version": 30787, - "ff_version": 21289 - }, - "show_switch": { - "long_progress": false - }, - "bgm_info": { - "music_id": "MA436038343856245020", - "music_title": "Unwelcome school", - "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA436038343856245020&cid=1625992822&aid=1906473802" - }, - "toast_block": false, - "is_upower_exclusive": false, - "is_upower_play": false, - "is_ugc_pay_preview": false, - "elec_high_level": { - "privilege_type": 0, - "title": "", - "sub_title": "", - "show_button": false, - "button_text": "", - "jump_url": "", - "intro": "", - "new": false - }, - "disable_show_up_info": false - } -} -``` - -
- -已登陆, `aid=60977932` - -```shell -curl -G 'https://api.bilibili.com/x/player/v2' \ ---url-query 'aid=60977932' \ ---url-query 'cid=106101299' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 60977932, - "bvid": "BV1Jt411P77c", - "allow_bp": false, - "no_share": false, - "cid": 106101299, - "max_limit": 1000, - "page_no": 1, - "has_next": true, - "ip_info": { - "ip": "108.181.22.55", - "zone_ip": " 172.27.132.5", - "zone_id": 29409296, - "country": "美国", - "province": "加利福尼亚州", - "city": "洛杉矶" - }, - "login_mid": 616368979, - "login_mid_hash": "445e7035", - "is_owner": false, - "name": "淡紫玲儿", - "permission": "10000,1001", - "level_info": { - "current_level": 3, - "current_min": 1500, - "current_exp": 2962, - "next_exp": 4500, - "level_up": -62135596800 - }, - "vip": { - "type": 1, - "status": 0, - "due_date": 1665417600000, - "vip_pay_type": 0, - "theme_type": 0, - "label": { - "path": "", - "text": "", - "label_theme": "", - "text_color": "", - "bg_style": 0, - "bg_color": "", - "border_color": "", - "use_img_label": true, - "img_label_uri_hans": "", - "img_label_uri_hant": "", - "img_label_uri_hans_static": "https://i0.hdslb.com/bfs/vip/d7b702ef65a976b20ed854cbd04cb9e27341bb79.png", - "img_label_uri_hant_static": "https://i0.hdslb.com/bfs/activity-plat/static/20220614/e369244d0b14644f5e1a06431e22a4d5/KJunwh19T5.png" - }, - "avatar_subscript": 0, - "nickname_color": "", - "role": 0, - "avatar_subscript_url": "", - "tv_vip_status": 0, - "tv_vip_pay_type": 0, - "tv_due_date": 0, - "avatar_icon": { - "icon_resource": {} - } - }, - "answer_status": 0, - "block_time": 0, - "role": "0", - "last_play_time": 0, - "last_play_cid": 0, - "now_time": 1725003260, - "online_count": 1, - "need_login_subtitle": false, - "subtitle": { - "allow_submit": true, - "lan": "zh-CN", - "lan_doc": "中文(中国)", - "subtitles": [ - { - "id": 13643112644608002, - "lan": "zh-Hans", - "lan_doc": "中文(简体)", - "is_lock": true, - "subtitle_url": "//aisubtitle.hdslb.com/bfs/subtitle/c49b18a284739d99df1e3723cdf72c0c82db98e0.json?auth_key=1725003260-5d0391a07f4f47f6960f60cf5045dff3-0-fc16c1f67a6b41edcb2a89d5e0c9bfdd", - "type": 0, - "id_str": "13643112644608002", - "ai_type": 0, - "ai_status": 0 - }, - { - "id": 13643200114196484, - "lan": "en-US", - "lan_doc": "英语(美国)", - "is_lock": true, - "subtitle_url": "//aisubtitle.hdslb.com/bfs/subtitle/2b38bc0f5d7671176964d4c3de441ed37568500c.json?auth_key=1725003260-5f709a74aa884751b77f86b6f6a48078-0-9b2fc3c18b99b1bf0cc7c7e63d18f686", - "type": 0, - "id_str": "13643200114196484", - "ai_type": 0, - "ai_status": 0 - } - ] - }, - "view_points": [], - "preview_toast": "为创作付费,购买观看完整视频|购买观看", - "options": { - "is_360": false, - "without_vip": false - }, - "guide_attention": [], - "jump_card": [], - "operation_card": [], - "online_switch": { - "enable_gray_dash_playback": "500", - "new_broadcast": "1", - "realtime_dm": "1", - "subtitle_submit_switch": "1" - }, - "fawkes": { - "config_version": 30787, - "ff_version": 21289 - }, - "show_switch": { - "long_progress": false - }, - "bgm_info": null, - "toast_block": false, - "is_upower_exclusive": false, - "is_upower_play": false, - "is_ugc_pay_preview": false, - "elec_high_level": { - "privilege_type": 0, - "title": "", - "sub_title": "", - "show_button": false, - "button_text": "", - "jump_url": "", - "intro": "", - "new": false - }, - "disable_show_up_info": false - } -} -``` - -
- -## 播放反馈 - -> https://app.bilibili.com/x/resource/laser2 - -*请求方式: POST* - -注: 该接口不传 Cookie - -**URL参数:** - -|参数名|类型|内容|必要性|备注| -|-|-|-|-|-| -|mid|num|当前用户 mid|不必要|未登录为空| -|buvid|str|BUVID (APP) 或 buvid3 (Web)|必要|可为任意非空字符串| -|app_key|str|APP 密钥|必要|Web: web_player
可为任意非空字符串| -|url|str|日志 URL|非必要|从 [上传接口](../creativecenter/upload.md#上传接口) 得到的 upos 协议 URL| -|task_type|num|任务类型|非必要|300: 播放卡顿
301: 进度条君无法调戏
354: 校园网无法访问
303: 弹幕无法显示
553: 跳过首尾时间有误
304: 出现浮窗广告
305: 无限小电视
302: 音画不同步
306: 黑屏
307: 其他| - -**JSON回复:** - -|字段|类型|内容|备注| -|-|-|-|-| -|code|num|返回值|0: 成功
-400: 请求错误| -|message|str|错误信息|默认为 0| -|ttl|num|1|| -|data|obj|数据本体| | - -`data` 对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|task_id|num|任务 ID?|| - -**示例:** - -播放反馈无限小电视, 不登录, 不传文件, buvid 为 `chenrui-in-icu` - -```shell -curl -X POST "https://app.bilibili.com/x/resource/laser2" \ ---data-urlencode "buvid=chenrui-in-icu" \ ---data-urlencode "app_key=web_player" \ ---data-urlencode "task_type=305" -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "task_id": 850448532 - } -} -``` - -
diff --git a/docs/video/recommend.md b/docs/video/recommend.md deleted file mode 100644 index 42704c4..0000000 --- a/docs/video/recommend.md +++ /dev/null @@ -1,2680 +0,0 @@ -# 视频推荐 - -## 获取单视频推荐列表(web端) - -> https://api.bilibili.com/x/web-interface/archive/related - -*请求方式:GET* - -最多获取40条推荐视频 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------|-----|--------|--------|---------------| -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-------|------|----------------------| -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | 推荐列表 | | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -|----|-----|-----------|----| -| 0 | obj | 推荐视频1 | | -| n | obj | 推荐视频(n+1) | | -| …… | obj | …… | …… | -| 39 | obj | 推荐视频40 | | - -`data`数组中的对象: - -基本同「[获取视频详细信息(web端)](info.md#获取视频详细信息(web端))」中的data对象,已知没有分P信息 - -**示例:** - -查询视频`av7`/`BV1xx411c7m9`的推荐视频列表 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/related' \ ---data-urlencode 'aid=7' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/related' \ ---data-urlencode 'bvid=BV1xx411c7m9' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "aid": 21322566, - "videos": 1, - "tid": 124, - "tname": "趣味科普人文", - "copyright": 1, - "pic": "http://i2.hdslb.com/bfs/archive/37f383ac35d386af1fc578108ad643e5952ff66a.jpg", - "title": "bilibili上市宣传视频", - "pubdate": 1522205992, - "ctime": 1522205994, - "desc": "今天晚上9点30分(北京时间),bilibili将在美国纳斯达克(NASDAQ)证券交易所挂牌上市。", - "state": 0, - "attribute": 16768, - "duration": 155, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 1, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 208259, - "name": "陈睿", - "face": "http://i2.hdslb.com/bfs/face/8920e6741fc2808cce5b81bc27abdbda291655d3.png" - }, - "stat": { - "aid": 21322566, - "view": 2129084, - "danmaku": 51108, - "reply": 18119, - "favorite": 46524, - "coin": 85223, - "share": 16669, - "now_rank": 0, - "his_rank": 1, - "like": 95621, - "dislike": 0 - }, - "dynamic": "今天晚上9点30分(北京时间),bilibili将在美国纳斯达克(NASDAQ)证券交易所挂牌上市。", - "cid": 35063529, - "dimension": { - "width": 1920, - "height": 1080, - "rotate": 0 - }, - "bvid": "" - }, - { - "aid": 271, - "videos": 1, - "tid": 53, - "tname": "", - "copyright": 1, - "pic": "http://i1.hdslb.com/bfs/archive/a5980672f3d03e8292148748a63de99cd45679d3.jpg", - "title": "弹幕测试专用", - "pubdate": 1249886475, - "ctime": 1497344798, - "desc": "给职人发射弹幕定位用.", - "state": 0, - "attribute": 32768, - "duration": 4558, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 2, - "name": "碧诗", - "face": "http://i1.hdslb.com/bfs/face/3e60b20604b6fdc7d081eb6a1ec72aa47c5a3964.jpg" - }, - "stat": { - "aid": 271, - "view": 2532266, - "danmaku": 699214, - "reply": 10224, - "favorite": 34927, - "coin": 9712, - "share": 3586, - "now_rank": 0, - "his_rank": 182, - "like": 27257, - "dislike": 0 - }, - "dynamic": "", - "cid": 3659795, - "dimension": { - "width": 0, - "height": 0, - "rotate": 0 - }, - "bvid": "" - }, - { - "aid": 106, - "videos": 1, - "tid": 26, - "tname": "音MAD", - "copyright": 2, - "pic": "http://i2.hdslb.com/bfs/archive/34d8fdf08d1fe28c229dec2fd122815a1d012908.jpg", - "title": "最终鬼畜蓝蓝路", - "pubdate": 1350316631, - "ctime": 1497348932, - "desc": "sm2057168 把这个音mad的图腾和支柱从UP的怒火中搬出来重新立好,这是我所能做的最后的事情了。", - "state": 0, - "attribute": 32768, - "duration": 318, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 0, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 8839, - "name": "TSA", - "face": "http://i0.hdslb.com/bfs/face/0ef5daf622bf4789034b3c15147a45e11c48c9b3.jpg" - }, - "stat": { - "aid": 106, - "view": 7607070, - "danmaku": 212896, - "reply": 41521, - "favorite": 200705, - "coin": 51673, - "share": 38049, - "now_rank": 0, - "his_rank": 22, - "like": 148550, - "dislike": 0 - }, - "dynamic": "", - "cid": 3635863, - "dimension": { - "width": 0, - "height": 0, - "rotate": 0 - }, - "bvid": "" - }, - { - "aid": 50025934, - "videos": 1, - "tid": 122, - "tname": "野生技术协会", - "copyright": 1, - "pic": "http://i0.hdslb.com/bfs/archive/af534399612085dbd916381b3377b18c765fab2d.png", - "title": "B站又一位Lv9的up诞生了", - "pubdate": 1555829289, - "ctime": 1555829289, - "desc": "要不关注一下?", - "state": 0, - "attribute": 16512, - "duration": 45, - "rights": { - "bp": 0, - "elec": 0, - "download": 0, - "movie": 0, - "pay": 0, - "hd5": 0, - "no_reprint": 1, - "autoplay": 1, - "ugc_pay": 0, - "is_cooperation": 0, - "ugc_pay_preview": 0, - "no_background": 0 - }, - "owner": { - "mid": 174161216, - "name": "血色红茶Xenomprph", - "face": "http://i1.hdslb.com/bfs/face/5a5ececb9b7a688751024c60063ba5853bed7e1e.jpg" - }, - "stat": { - "aid": 50025934, - "view": 159595, - "danmaku": 62, - "reply": 153, - "favorite": 301, - "coin": 1059, - "share": 55, - "now_rank": 0, - "his_rank": 0, - "like": 1219, - "dislike": 0 - }, - "dynamic": "", - "cid": 87577929, - "dimension": { - "width": 2560, - "height": 1440, - "rotate": 0 - }, - "bvid": "" - } - … - … - … - … - ] -} -``` - -
- -## 获取首页视频推荐列表(web端) - -> https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -最多获取30条推荐视频,直播及推荐边栏 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------------|-----|--------------|-----|--------------------------------| -| fresh_type | num | 相关性 | 非必要 | 默认为 4
值越大推荐内容越相关 | -| ps | num | 单页返回的记录条数 | 非必要 | 默认为 12, 留空即最大值为 30 | -| fresh_idx | num | 当前翻页号 | 非必要 | 以 1 开始 | -| fresh_idx_1h | num | 当前翻页号(一小时前?) | 非必要 | 以 1 开始, 默认与 fresh_idx 内容相同 | -| brush | num | 刷子? | 非必要 | 以 1 开始, 默认与 fresh_idx 内容相同 | -| fetch_row | num | 本次抓取的最后一行行号 | 非必要 | 1 递归加上本次抓取总行数 | -| web_location | num | 网页位置 | 非必要 | 主页为 1430650 | -| y_num | num | 普通列数 | 非必要 | 一行中视频,直播及广告数 | -| last_y_num | num | 总列数 | 非必要 | 普通列数 + 边栏列数 | -| feed_version | str | V8 | 非必要 | 作用尚不明确 | -| homepage_ver | num | 1 | 非必要 | 首页版本 | -| screen | str | 浏览器视口大小 | 非必要 | 水平在前垂直在后以减号分割 | -| seo_info | str | 空 | 非必要 | 作用尚不明确 | -| last_showlist | str | 上次抓取的视频av号列表 | 非必要 | av与数字间用下划线分隔, 若视频UP主已关注则中间再插入n | -| uniq_id | str | ??? | 非必要 | 作用尚不明确 | -| w_rid | str | WBI 签名 | 非必要 | 见[WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 时间戳 | 非必要 | 见[WBI 签名](../misc/sign/wbi.md) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|----------------------| -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------------------|-------|-------|--------------------| -| business_card | null | | | -| floor_info | null | | | -| item | array | 推荐列表 | | -| mid | num | 用户mid | 未登录为0 | -| preload_expose_pct | num | 0.5 | 用于预加载? | -| preload_floor_expose_pct | num | 0.5 | 用于预加载? | -| side_bar_column | array | 边栏列表? | 可参考字段 item 及对应功能文档 | -| user_feature | null | | | - -`data`对象中`item`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------------|------|---------------|----------------------------------------------| -| av_feature | null | | | -| business_info | obj | 商业推广信息 | 无为null
对于推广内容,视频信息会在这个dict的"archive"属性下 | -| bvid | str | 视频bvid | | -| cid | num | 稿件cid | | -| dislike_switch | num | 1 | 显示不感兴趣开关? | -| dislike_switch_pc | num | 0 | 显示不感兴趣开关(PC)? | -| duraion | num | 视频时长 | | -| enable_vt | num | 0 | 作用尚不明确 | -| goto | num | 目标类型 | av: 视频
ogv: 边栏
live: 直播 | -| duraion | num | 视频时长 | | -| id | num | 视频aid / 直播间id | | -| is_followed | num | 已关注 | 0: 未关注
1: 已关注 | -| is_stock | num | 0 | 作用尚不明确 | -| ogv_info | null | | | -| owner | obj | UP主 | | -| pic | str | 封面 | | -| pic_4_3 | str | 封面(4:3) | | -| pos | num | 0 | 位置? | -| pubdate | num | 发布时间 | | -| rcmd_reason | obj | 推荐理由 | 直播等为null | -| room_info | obj | 直播间信息 | 普通视频等为null, 参见[直播](../live) | -| show_info | num | 展示信息 | 1: 普通视频
0: 直播 | -| stat | obj | 视频状态信息 | 直播等为null, 参见[视频基本信息](info.md) | -| title | str | 标题 | | -| track_id | str | 跟踪标识? | | -| uri | str | 目标页 URI | | -| vt_display | str | 空 | 作用尚不明确 | - -`item`数组中的对象中的`owner`对象: - -| 字段 | 类型 | 内容 | 备注 | -|------|-----|--------|----| -| face | str | 头像URL | | -| mid | num | UP主mid | | -| name | str | UP昵称 | | - -`item`数组中的对象中的`rcmd_reason`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|------|-------------------------------| -| reason_type | num | 原因类型 | 0: 无
1: 已关注
3: 高点赞量 | -| content | str | 原因描述 | 当 reason_type 为 3 时存在 | - -**示例:** - -获取新版web端首页推荐视频列表 - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd' \ ---data-urlencode 'fresh_type=4' \ ---data-urlencode 'ps=12' \ ---data-urlencode 'fresh_idx=5' \ ---data-urlencode 'fresh_idx_1h=5' \ ---data-urlencode 'fetch_row=16' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "item": [ - { - "id": 1354614895, - "bvid": "BV1Dz42117GZ", - "cid": 1548835687, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1Dz42117GZ", - "pic": "http://i1.hdslb.com/bfs/archive/b47154987b4c0f40a39779c09a9d485176d1238f.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/archive/b47154987b4c0f40a39779c09a9d485176d1238f.jpg", - "title": "做数学题总是抄错 | 看错 | 算错 怎么破?决定高考分数的这个非智力因素不容忽视", - "duration": 882, - "pubdate": 1715946937, - "owner": { - "mid": 374484802, - "name": "数学阮禾老师", - "face": "https://i1.hdslb.com/bfs/face/4df57e4b48b04206bce7572831688741580ca0e1.jpg" - }, - "stat": { - "view": 48250, - "like": 2959, - "danmaku": 433, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1255924089, - "bvid": "BV1DJ4m1u7Mp", - "cid": 1600833978, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1DJ4m1u7Mp", - "pic": "http://i0.hdslb.com/bfs/archive/5068d860e8bbc37679ece933aa8e6d8428cfb5c1.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-07-01-1145021255924089_1612_gener.jpg", - "title": "人类这种生物,看到按钮就会按下去。", - "duration": 326, - "pubdate": 1719805500, - "owner": { - "mid": 5616993, - "name": "马夫鱼33", - "face": "https://i0.hdslb.com/bfs/face/4c2af23046147e91ce5a4af3375464fdcf1956e6.jpg" - }, - "stat": { - "view": 667067, - "like": 28529, - "danmaku": 483, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "content": "2万点赞", - "reason_type": 3 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1306020278, - "bvid": "BV1rM4m117Ry", - "cid": 1608959606, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1rM4m117Ry", - "pic": "http://i0.hdslb.com/bfs/archive/49f62c70f17d0afe00e5e620dd366c68149c780e.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/archive/49f62c70f17d0afe00e5e620dd366c68149c780e.jpg", - "title": "Axios 前后端对接教程|HTTP", - "duration": 352, - "pubdate": 1720440325, - "owner": { - "mid": 260736087, - "name": "三分钟实验室", - "face": "https://i0.hdslb.com/bfs/face/6172aa089ed0b26ffffb72018422eb4280d4da41.jpg" - }, - "stat": { - "view": 7527, - "like": 365, - "danmaku": 1, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1755972439, - "bvid": "BV1g4421D7qn", - "cid": 1597039275, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1g4421D7qn", - "pic": "http://i2.hdslb.com/bfs/archive/35ee2ffaab4206d17893a3f48cdf512b4f028fdc.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-26-21354756381755972439_16_12_5326_crop.jpg", - "title": "《我爱发明》里那些抽象发明 歹徒兴奋床!", - "duration": 659, - "pubdate": 1719408945, - "owner": { - "mid": 348989367, - "name": "沫子瞪片", - "face": "https://i0.hdslb.com/bfs/face/a2131d38a2ea73f16ff25e61dbeb40377233f552.jpg" - }, - "stat": { - "view": 1540767, - "like": 65409, - "danmaku": 5383, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1055953358, - "bvid": "BV1jH4y1w7A6", - "cid": 1598484848, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1jH4y1w7A6", - "pic": "http://i1.hdslb.com/bfs/archive/accdb655b4f2bef665e6fdedb4de28de2feda078.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-28-12560692491055953358_16_12_2438_crop.jpg", - "title": "为什么一个数的5次方个位数是自己!", - "duration": 327, - "pubdate": 1719550565, - "owner": { - "mid": 483522694, - "name": "火星课堂", - "face": "https://i1.hdslb.com/bfs/face/fe751f0d7062c8e8adcef501390d48330fac0514.jpg" - }, - "stat": { - "view": 244673, - "like": 5406, - "danmaku": 210, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": { - "id": 0, - "contract_id": "", - "res_id": 1055953358, - "asg_id": 0, - "pos_num": 0, - "name": "", - "pic": "", - "litpic": "", - "url": "", - "style": 0, - "agency": "", - "label": "", - "intro": "", - "creative_type": 0, - "request_id": "1721098961752q172a25a216a162q1363", - "src_id": 5637, - "area": 0, - "is_ad_loc": true, - "ad_cb": "", - "title": "", - "server_type": 0, - "cm_mark": 0, - "stime": 0, - "mid": "", - "activity_type": 0, - "epid": 0, - "sub_title": "", - "ad_desc": "", - "adver_name": "", - "null_frame": false, - "pic_main_color": "", - "card_type": 0, - "business_mark": null, - "inline": { - "inline_use_same": 0, - "inline_type": 0, - "inline_url": "", - "inline_barrage_switch": 0 - }, - "operater": "", - "jump_target": 0, - "show_urls": null, - "click_urls": null - }, - "is_stock": 1, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1763571437, - "bvid": "", - "cid": 0, - "goto": "live", - "uri": "https://live.bilibili.com/1763571437", - "pic": "http://i0.hdslb.com/bfs/live/new_room_cover/f1787ef2ce4a2a031fb4a6a63b62d15493268d71.jpg", - "pic_4_3": "", - "title": "【新V】今天不要再把自己笨哭了", - "duration": 0, - "pubdate": 0, - "owner": { - "mid": 3546712666802274, - "name": "伊柒璇儿_鹤熙冠", - "face": "https://i0.hdslb.com/bfs/face/3e0ff3d7d53b9ac1a2d90ea563e22d3f70ad28cc.jpg" - }, - "stat": null, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": null, - "show_info": 0, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": { - "room_id": 1763571437, - "uid": 3546712666802274, - "live_status": 1, - "show": { - "short_id": 0, - "title": "【新V】今天不要再把自己笨哭了", - "cover": "http://i0.hdslb.com/bfs/live/new_room_cover/f1787ef2ce4a2a031fb4a6a63b62d15493268d71.jpg", - "keyframe": "http://i0.hdslb.com/bfs/live-key-frame/keyframe07161101001763571437k9l40v.jpg", - "popularity_count": 8539, - "tag_list": null, - "live_start_time": 0, - "live_id": 0, - "hidden_online": false - }, - "area": { - "area_id": 0, - "area_name": "虚拟日常", - "parent_area_id": 9, - "parent_area_name": "虚拟主播", - "old_area_id": 0, - "old_area_name": "", - "old_area_tag": "", - "area_pk_status": 0, - "is_video_room": false - }, - "watched_show": { - "switch": true, - "num": 168, - "text_small": "168", - "text_large": "168人看过", - "icon": "https://i0.hdslb.com/bfs/live/a725a9e61242ef44d764ac911691a7ce07f36c1d.png", - "icon_location": "", - "icon_web": "https://i0.hdslb.com/bfs/live/8d9d0f33ef8bf6f308742752d13dd0df731df19c.png" - } - }, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1855792572, - "bvid": "BV16s421T7CU", - "cid": 1587596195, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV16s421T7CU", - "pic": "http://i2.hdslb.com/bfs/archive/1b9d9799260a075b094212bf79e3d7ccb9e04087.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-19-14044883851855792572_16_12_7260_crop.jpg", - "title": "压缩蚊件.zip", - "duration": 66, - "pubdate": 1718777086, - "owner": { - "mid": 173947574, - "name": "好奇五先生", - "face": "https://i2.hdslb.com/bfs/face/1c69fff12a2d0d50e71931cef0486ab919a818a2.jpg" - }, - "stat": { - "view": 951633, - "like": 22930, - "danmaku": 932, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1405866842, - "bvid": "BV11r421F7E8", - "cid": 1589772517, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV11r421F7E8", - "pic": "http://i2.hdslb.com/bfs/archive/50b1bb8d227d17a3b6195e80128ab295d152d3be.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-20-2148551405866842_1612_gener.jpg", - "title": "【音游推荐】暑期音游推荐,不同基础都可入坑", - "duration": 311, - "pubdate": 1718891332, - "owner": { - "mid": 592146708, - "name": "Qc天水", - "face": "https://i0.hdslb.com/bfs/face/2998a9e762aa07559b2acf54234f07979c959ffe.jpg" - }, - "stat": { - "view": 278997, - "like": 6698, - "danmaku": 303, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1055540151, - "bvid": "BV1in4y197U4", - "cid": 1582190043, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1in4y197U4", - "pic": "http://i2.hdslb.com/bfs/archive/9a366971fadd6e4dfd1813c42b180c8779038627.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-15-18004087071055540151_16_12_7856_crop.jpg", - "title": "我把裁判罚下场了", - "duration": 217, - "pubdate": 1718445600, - "owner": { - "mid": 475304452, - "name": "生姜蛋包饭", - "face": "https://i1.hdslb.com/bfs/face/40feee36c71f7f53931854fc54c88d530360b1a7.jpg" - }, - "stat": { - "view": 678085, - "like": 62171, - "danmaku": 832, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "content": "6万点赞", - "reason_type": 3 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1505823466, - "bvid": "BV1vS421d7No", - "cid": 1596567774, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1vS421d7No", - "pic": "http://i2.hdslb.com/bfs/archive/b2b19b067cdbf7dd93be5fc01009e72c20572184.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-26-1241021505823466_1612_gener.jpg", - "title": "AI 视频:两小儿辩日", - "duration": 138, - "pubdate": 1719376858, - "owner": { - "mid": 589397373, - "name": "宝玉xp", - "face": "https://i0.hdslb.com/bfs/face/c2c29f6e1bb9b0860241f0df4d2cdea8242ab5d2.jpg" - }, - "stat": { - "view": 1216188, - "like": 54839, - "danmaku": 194, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1055744039, - "bvid": "BV1Zn4y1Q7zj", - "cid": 1575814128, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1Zn4y1Q7zj", - "pic": "http://i0.hdslb.com/bfs/archive/5288cf0830e49de414084c4168b11033b08f8507.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-06-09-17404720501055744039_16_12_294_crop.jpg", - "title": "【诺子】重新“看见”世界是一种什么样的感觉?", - "duration": 579, - "pubdate": 1717926045, - "owner": { - "mid": 10276136, - "name": "诺子喵呜", - "face": "https://i2.hdslb.com/bfs/face/7e6846ed5619b945c888b8f8db5000469f6353ff.jpg" - }, - "stat": { - "view": 1016467, - "like": 97886, - "danmaku": 979, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - }, - { - "id": 1706215690, - "bvid": "BV1tT421k7By", - "cid": 1611364587, - "goto": "av", - "uri": "https://www.bilibili.com/video/BV1tT421k7By", - "pic": "http://i1.hdslb.com/bfs/archive/cd3308109e8726fe4147dd25ed7ca0dbeeda1dc1.jpg", - "pic_4_3": "http://i0.hdslb.com/bfs/aistory/2024-07-11-00194836761706215690_16_12_3934_crop.jpg", - "title": "谷歌翻译20遍《河中石兽》泌尿系统", - "duration": 145, - "pubdate": 1720628387, - "owner": { - "mid": 1030835113, - "name": "象哥嘎", - "face": "https://i1.hdslb.com/bfs/face/aa0ae89fa72dab7b8bc082433769b1768f51c3dc.jpg" - }, - "stat": { - "view": 78600, - "like": 3437, - "danmaku": 328, - "vt": 0 - }, - "av_feature": null, - "is_followed": 0, - "rcmd_reason": { - "reason_type": 0 - }, - "show_info": 1, - "track_id": "web_pegasus_4.router-web-pegasus-1554782-5c89895477-smhn8.1721098961744.133", - "pos": 0, - "room_info": null, - "ogv_info": null, - "business_info": null, - "is_stock": 0, - "enable_vt": 0, - "vt_display": "", - "dislike_switch": 1, - "dislike_switch_pc": 0 - } - ], - "side_bar_column": [ - { - "id": 25502, - "goto": "comic", - "track_id": "", - "pos": 1, - "card_type": "漫画", - "card_type_en": "comic", - "cover": "http://i0.hdslb.com/bfs/manga-static/5e410bf6f73ff87f87b543e4b918de5f024652e8.jpg", - "url": "https://manga.bilibili.com/detail/mc25502", - "title": "头文字D", - "sub_title": "", - "duration": 0, - "stats": null, - "room_info": null, - "styles": [ - "游戏竞技" - ], - "comic": { - "comic_id": 25502, - "title": "头文字D", - "horizontal_cover": "http://i0.hdslb.com/bfs/manga-static/5e410bf6f73ff87f87b543e4b918de5f024652e8.jpg", - "square_cover": "http://i0.hdslb.com/bfs/manga-static/da660f6274730af82d557f21a6247d4f6b1e300b.jpg", - "vertical_cover": "http://i0.hdslb.com/bfs/manga-static/64df8b860d2bf6bf2edd0426b4aefbff25b51386.jpg", - "is_finish": 1, - "status": 0, - "last_ord": 724, - "total": 724, - "release_time": "", - "last_short_title": "番外05", - "discount_type": 0, - "recommendation": "秋名山下坡最快的AE86神话!", - "last_read_ep_id": 0, - "latest_ep_short_title": "", - "style": [ - "游戏竞技" - ], - "author_name": [ - "重野秀一 ", - "讲谈社" - ], - "allow_wait_free": false, - "type": 0, - "rank": null, - "operate_cover": "", - "rookie_type": 0 - }, - "producer": null, - "source": "", - "av_feature": null, - "is_rec": 0, - "is_finish": 0, - "is_started": 0, - "is_play": 0, - "enable_vt": 0, - "vt_display": "" - }, - { - "id": 47800, - "goto": "ogv", - "track_id": "", - "pos": 2, - "card_type": "番剧", - "card_type_en": "bangumi", - "cover": "https://i0.hdslb.com/bfs/bangumi/image/1c61f75b571fffb8c5a2bd0396b49ce3529776f4.png", - "url": "https://www.bilibili.com/bangumi/play/ss47800", - "title": "铁甲小宝 重制版 中文配音", - "sub_title": "童年经典回归!", - "duration": 1382000, - "stats": { - "follow": 116644, - "view": 10864687, - "danmaku": 42428, - "reply": 11448, - "coin": 18904, - "series_follow": 209046, - "series_view": 17474247, - "likes": 61376, - "favorite": 116644 - }, - "room_info": null, - "new_ep": { - "id": 824212, - "index_show": "更新至第30话", - "cover": "http://i0.hdslb.com/bfs/archive/e185c054588945a1de6648ff7fb5001852df39f4.png", - "title": "30", - "long_title": "巨大机器来袭!!", - "pub_time": "2024-07-15 18:00:01", - "duration": 1382000, - "day_of_week": 1 - }, - "styles": [ - "日常", - "热血", - "搞笑", - "原创", - "特摄" - ], - "comic": null, - "producer": [ - { - "mid": 928123, - "name": "哔哩哔哩番剧", - "type": 3, - "is_contribute": 1 - } - ], - "source": "", - "av_feature": null, - "is_rec": 0, - "is_finish": 0, - "is_started": 1, - "is_play": 1, - "horizontal_cover_16_9": "https://i0.hdslb.com/bfs/bangumi/image/ec5065dc0e88417abd4792d5caa96dacc99d1d51.png", - "horizontal_cover_16_10": "https://i0.hdslb.com/bfs/bangumi/image/5cc132e336cc72e6521bba928d8a0e50bd5a6d34.png", - "enable_vt": 0, - "vt_display": "" - }, - { - "id": 48020, - "goto": "ogv", - "track_id": "", - "pos": 3, - "card_type": "国创", - "card_type_en": "guochuang", - "cover": "https://i0.hdslb.com/bfs/bangumi/image/fcb176fcbf5a66fd122fa99f9fdf2cabf22468bb.png", - "url": "https://www.bilibili.com/bangumi/play/ss48020", - "title": "不白吃古诗词漫游记 第二季", - "sub_title": "古诗词这动人的浪漫", - "duration": 179000, - "stats": { - "follow": 2173495, - "view": 325366, - "danmaku": 110, - "reply": 208, - "coin": 443, - "series_follow": 2208624, - "series_view": 3322752487, - "likes": 8794, - "favorite": 2173495 - }, - "room_info": null, - "new_ep": { - "id": 830238, - "index_show": "更新至第7话", - "cover": "http://i0.hdslb.com/bfs/archive/6db74bc8ab2670181562314a24abe525cebb7c76.jpg", - "title": "7", - "long_title": "王维当个官怎么还郁闷了?", - "pub_time": "2024-07-15 19:00:00", - "duration": 179000, - "day_of_week": 1 - }, - "styles": [ - "少儿", - "历史", - "原创", - "古风" - ], - "comic": null, - "producer": [], - "source": "", - "av_feature": null, - "is_rec": 0, - "is_finish": 0, - "is_started": 1, - "is_play": 1, - "horizontal_cover_16_9": "https://i0.hdslb.com/bfs/bangumi/image/f19013ddd7f87b0e03df10feccc4a61a3a43774a.png", - "horizontal_cover_16_10": "https://i0.hdslb.com/bfs/bangumi/image/966553b199829aae7e47882edbe053463ee85276.png", - "enable_vt": 0, - "vt_display": "" - } - ], - "business_card": null, - "floor_info": null, - "user_feature": null, - "preload_expose_pct": 0.5, - "preload_floor_expose_pct": 0.5, - "mid": 645769214 - } -} -``` - -
- -## 根据点击视频获取的短视频播放列表 - -> https://app.bilibili.com/x/v2/feed/index/story - -*请求方式:GET* - -在APP端点击主页视频后发出的请求 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------------|------|-------------------------|----------------|------------------------------------------| -| aid | num | 点击视频的aid | 非必要 | 所点击视频的aid,会影响到后续视频内容 | -| display_id | num | 视频列表页数 | 非必要 | 从1开始,第1页会得到比其他页多aid处所填视频 | -| access_key | str | APP登录Token | APP方式必要 | | -| ad_extra | str | 额外广告? | 非必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| auto_play | num | 自动播放 | 非必要 | 可为0 | -| build | num | 版本 | APP方式必要 | 可为`8130300` | -| bvid | str | 视频的bv号 | 非必要 | 可为空,如果没有会导致返回不正常 | -| c_locale | str | 语言 | 非必要 | zh_CN | -| channel | num | 频道 | 非必要 | | -| cid | num | 目标频道id | 非必要 | | -| contain | bool | 未知 | 非必要 | 可为false | -| creative_id | num | 未知 | 非必要 | 默认为 `0` | -| device_name | str | 设备名称 | 非必要 | 随意字符串都行 | -| disable_rcmd | num | 未知 | 非必要 | 默认为 `1` | -| epid | num | 未知 | 非必要 | 默认为 `0` | -| feed_status | num | 未知 | 非必要 | 默认为 `0` | -| fnval | num | 视频流类型 | 非必要 | | -| fnver | num | 请求时提供的fnver | 非必要 | 可为 0 | -| force_host | num | 源url类型 | 非必要 | 0:无限制 1:使用http 2:使用https | -| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | -| from | num | 未知 | 非必要 | 可为 `7` | -| from_spmid | str | 未知 | 非必要 | tm.recommend.0.0 | -| goto | str | 未知 | 非必要 | | -| mobi_app | str | 平台标识 | 非必要 | 可为 `web`、`android` 等 | -| network | str | 网络 | 非必要 | 可为 `wifi` | -| ogv_style | num | 未知 | 非必要 | 默认为 `0` | -| platform | str | 平台 | 非必要 | 可为`web`或`android` | -| player_net | num | 未知 | 非必要 | 默认为 `1` | -| pull | num | 未知 | 非必要 | 默认为 `1` | -| pn | num | 似乎不是页码 | 非必要 | 默认为 `32` | -| request_from | num | 未知 | 非必要 | 默认为 `0` | -| s_locale | str | 语言 | 非必要 | zh_CN | -| spmid | str | 未知 | 非必要 | main.ugc-video-detail-vertical.0.0 | -| statistics | str | 位置 | 非必要 | 可为{"appId":1,"platform":3,"version":"8.13.0","abtest":""} | -| story_param | str | 未知 | 非必要 | | -| trackid | str | 路径id?未知 | 非必要 | | -| ts | num | 秒级时间戳 | 非必要 | | -| video_mode | num | 视频模式?未知 | 非必要 | 可为 `2`,应该是可以逆向出来的 | -| voice_balance | num | 未知 | 非必要 | 默认为 `1` | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为 0 | -| ttl | num | 1 | | -| data | obj | 视频信息 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | ---------------------------- | -| config | obj | 配置 | | -| items | array | 视频信息 | | - -`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------ | ---- | -| 0 | obj | 视频信息1 | | -| n | obj | 视频信息(n+1) | | -| …… | obj | …… | …… | - -`items`数组元素: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ----- | ----------------------- | ------------------------ | -| bvid | str | 视频bv号 | | -| card_goto | str | 卡片跳转 | | -| copyright | num | 版权 | | -| cover | str | 封面url | | -| desc | str | 视频描述 | | -| dimension | num | 包括视频尺寸、旋转角度 | | -| dislike_reasons_v2 | obj | 不喜欢原因v2的各种显示 | | -| dislike_reasons_v3 | obj | 不喜欢原因v3的各种显示 | | -| duration | num | 视频时长 | | -| ff_cover | str | 短视频封面原图 | | -| goto | str | 应该是跳转去向类型 | 此处为vertical_av | -| owner | obj | 拥有者,也就是up信息 | | -| param | str | 参数,实际为视频aid | | -| player_args | obj | 播放器参数 | | -| pubdate | num | 发布时间秒级时间戳 | | -| report_flow_data | str | 报告流数据 | 是个伪装成obj的str | -| req_user | ? | 未知 | 空的 | -| rights | obj | 未知 | | -| share_bottom_button | obj | 分享下方按钮 | | -| share_guide | obj | 未知 | | -| short_link | str | 视频短链接 | | -| show_report | obj | 显示举报 | | -| stat | obj | 视频信息 | | -| sub_title | str | 子标题 | 但显示的是描述播放量的文字 | -| submission_entrance | obj | 提交入口 | icon的uri | -| three_point_button | obj | 三点按钮要显示的内容 | 里面有两个array | -| thumb_up_animation | str | 未知 | | -| title | str | 视频标题 | | -| top_search_bar | obj | 搜索栏 | 内含一个跳转的uri | -| track_id | str | 路由track | | -| uri | str | uri | | -| view_content | str | 用于显示的文本形式播放量 | | -| vip | obj | vip相关的信息 | | - -`owner`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ----- | ----------------------- | ------------------------ | -| attention | num | 未知 | 包含一个mid的int字段 | -| avatar | obj | 一些显示设置 | | -| face | str | 头像url | | -| fans | num | 粉丝量 | | -| like_num | num | 获赞数 | | -| mid | num | up主的mid | | -| name | str | up主的昵称 | | -| official_verify | obj | 官方认证 | type=-1为无认证,没有其他字段;type=0为黄闪电同时role=1,type=1为蓝闪电同时role大于1,且type不为-1时有字段title为称号 | -| relation | num | 关系?未知 | | -| sub_avatar | obj | 子形象 | 包含一个mid的int字段 | -| upower | obj | 充电相关 | 包含一个button_uri字段类型为str,是充电跳转链接 | - -`player_args`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ----- | ----------------------- | ------------------------ | -| aid | num | 视频作者的aid | | -| cid | num | 所属频道的cid | | -| type | str | 内容类型 | 视频一般都是av | - -`player_args`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------- | ----- | ------------------------ | ------------------------ | -| aid | num | 视频作者的aid | | -| coin | num | 视频硬币数 | | -| danmaku | num | 视频弹幕数 | | -| favorite | num | 视频收藏数 | | -| follow | num | 未知 | 很多都是0 | -| like | num | 视频点赞数 | | -| reply | num | 视频评论与回复总数 | | -| share | num | 视频分享数 | | -| view | num | 视频播放 | | - -**示例:** - -(1)模拟点击aid=113350747029965的视频并获取短视频推荐列表 - -```python -import json -import requests - -mobile_headers = { - "User-Agent": "xxx", - "env": "prod", - "session_id": "xxx", # 在实际使用中,session_id需要及时更新,否则将导致响应列表有问题 - "APP-KEY": "android64", - 'Buvid': "xxx" -} - -story_url = "https://app.bilibili.com/x/v2/feed/index/story" - -story_params = { - "aid": 113350747029965, - "display_id": 1, - "appkey": "1d8b6e7d45233436", - "build": "8130300", - "bvid": "", - "mobi_app": "android", - "statistics": "{\"appId\":1,\"platform\":3,\"version\":\"8.13.0\",\"abtest\":\"\"}" -} - -response = requests.get(story_url, params=story_params, headers=mobile_headers) - -print(json.dumps(response.json(), indent=4)) -``` - -返回值内容过长,暂不予展示 - -(2)随机的短视频推荐 - -> https://app.bilibili.com/x/v2/feed/index/story - -浏览器直接输入 - -返回值内容过长,暂不予展示 - -## 获取短视频模式视频列表 - -> https://app.bilibili.com/x/v2/feed/index - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -有大量不明意义的参数 备注仅供参考 - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|---------------|------|------------|-----|--------------------------------------| -| fnval | num | 视频流格式标识 | 非必要 | 默认为272 | -| fnver | num | 视频流版本标识 | 非必要 | 恒为1 | -| force_host | num | 源url类型 | 非必要 | 0:无限制 1:使用http 2:使用https | -| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | -| guidance | num | 0 | 非必要 | | -| https_url_req | num | 0 | 非必要 | | -| inline_danmu | num | 2 | 非必要 | | -| inline_sound | num | 1 | 非必要 | | -| interest_id | num | 0 | 非必要 | | -| login_event | num | 登录状态 | 非必要 | 0为登录 1为未登录 | -| mobi_app | num | android | 非必要 | 设备类型 | -| network | num | wifi | 非必要 | 网络类型 | -| open_event | num | | 非必要 | | -| platform | num | android | 非必要 | 设备类型 | -| pull | boll | false | 非必要 | | -| qn | num | 32 | 非必要 | 似乎是画质 | -| recsys_mode | num | 0 | 非必要 | | -| s_locale | str | zh_CN | 非必要 | 语言 | -| video_mode | num | 1 | 非必要 | | -| accessKey | str | | 非必要 | 登录成功后返回的accessToken,添加此参数会返回个性化内容和横幅 | -| voice_balance | num | 音量均衡? | 非必要 | 默认为1 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------| -| code | num | 返回值 | 0:成功 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------|-------|-----------|------| -| config | obj | 一些界面相关的内容 | 此处省略 | -| items | array | 视频列表 | | - -`data`中的`items`数组的对象: - -以下为视频类型 - -| 字段 | 类型 | 内容 | 备注 | -|----------------------------------|------|------------------|--------------------------------| -| can_play | num | 1 | 字面意思 | -| card_goto | str | av | 横幅时为banner | -| card_type | str | 卡片类型 | 视频为small_cover_v2,横幅为banner_v8 | -| cover | str | 封面url | | -| cover_left_1_content_description | str | 播放量 | 8.9万观看 | -| cover_left_2_content_description | str | 弹幕数 | 250弹幕 | -| cover_left_text_1 | str | 播放量 | 8.9万 | -| cover_left_text_2 | str | 弹幕数 | 250 | -| cover_right_content_description | str | 视频长度 | 1分钟20秒 | -| cover_right_text | str | 视频长度 | 1:20 | -| desc_button | obj | up主信息 | | -| param | str | 视频aid | | -| player_args | obj | 视频信息 | | -| talk_back | str | | | -| title | str | 标题 | | -| uri | str | 跳转链接 | | -| goto_icon | obj | 视频卡片左下角图标 | 视频为普通视频时出现 | -| rcmd_reason_style | obj | 左下角的'竖屏'or'2千点赞' | 视频为热门时出现 | -| banner_item | list | 横幅列表 | 登录后使用accessKey出现 包含横幅信息列表 | - -`desc_button`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------|-----|------|----| -| event | str | | | -| text | str | up名称 | | -| type | num | 1 | | -| uri | str | 跳转链接 | | - -`player_args`对象: - -| 字段 | 类型 | 内容 | 备注 | -|----------|-----|-------|----| -| aid | num | 视频aid | | -| cid | num | 视频cid | | -| duration | num | 视频长度 | 秒数 | -| type | str | | | - -`goto_icon`对象 : - -| 字段 | 类型 | 内容 | 备注 | -|----------------|-----|-----------|----| -| icon_url | str | 图标链接 | | -| icon_night_url | str | 应该跟上面那个一样 | | -| icon_width | num | 16 | 宽度 | -| icon_height | num | 16 | 高度 | - -`rcmd_reason_style`对象 : - -| 字段 | 类型 | 内容 | 备注 | -|--------------------|-----|------------|---------| -| text | str | 1万点赞 \| 竖屏 | 文字信息 | -| text_color | str | #FF6633 | 字体颜色 | -| bg_color | str | #FFF1ED | 文本的背景颜色 | -| border_color | str | #FFF1ED | | -| text_color_night | str | #BF5330 | | -| bg_color_night | str | #3D2D29 | | -| border_color_night | str | #3D2D29 | | - -`banner_item`横幅列表内对象(内容尚未完全解读): - -为动态时 (列表索引通常为1) - -```json - { - "type": "static", - "resource_id": 4336, - "id": 1674508, - "index": 1, - "static_banner": { - "id": 1674508, - "title": "火凤燎原第二季完结!新的战神,来了!", - "image": "http://i0.hdslb.com/bfs/banner/b1fc0b68f727c2d4ea57bee154f531c3b7f13fca.png", - "hash": "a6cee3b5b1c05227159f734f68289ba5", - "uri": "https://www.bilibili.com/bangumi/play/ep1365959?goto=static_banner", - "request_id": "1745482994326q172a27a87a21q3087", - "src_id": 4337, - "is_ad_loc": true, - "client_ip": "182.89.224.34", - "server_type": 0, - "resource_id": 4336, - "index": 1, - "cm_mark": 0 - } -} -``` - -为广告时 index(列表索引通常为2) - -```json -{ - "type": "ad", - "resource_id": 4336, - "id": 0, - "index": 2, - "ad_banner": { - "id": 0, - "title": "今日全球首发,千件外观福利免费领", - "image": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/bbd7cc4e6a74508e9ccee467541cc06a.jpg", - "hash": "46cbecfe04e047692acfd4a149e81ebd", - "uri": "https://qrsj.biligame.com/gcxz/h5/?sourceFrom=777&sourceType=adPut", - "request_id": "1745482994326q172a27a87a21q3087", - "creative_id": 1017846649959747584, - "src_id": 4338, - "is_ad": true, - "is_ad_loc": true, - "ad_cb": "CAAQABiAoLC1qsSHkA4gACgAMKm4TDjyIUIfMTc0NTQ4Mjk5NDMyNnExNzJhMjdhODdhMjFxMzA4N0iWpZO35jJSBuafs+W3nloG5bm/6KW/YgbkuK3lm71oAXAAeICAgICAGoABAIgBpYgEkgENMTgyLjg5LjIyNC4zNJoBj0BjcGNfcXVvdGE6Y29uc3RhbnQsZWNvbV9mb3JjZV9yZWNhbGw6YmFzZV8wNjI4XzIwLGJyYW5kX3NwbGFzaF9saXN0X2J5X3RpbWU6YnJhbmRfc3BsYXNoX2xpc3RfYnlfdGltZV80MF90dW5uZWwsdWVzX2VycWk6MTcsamtfY2FydDpqazEsZmVlZHNQcmltYXJ5TW9kZWxDb25mOmJzbDIsY29tbWVudENvbXBvbmVudEFudG91UmF0aW86YmFzZSxTbWFsbEJ1ZGdldFJhdGlvOmRlZmF1bHQsc2VhcmNoX2Fkc19jcmVhdGl2ZTpsbG1fZXhwMSxkYWlodW9fYm9vc3RfZXhwOmJvb3N0X2V4cCxzZWFyY2hfYWRzX3JlbGV2YW5jZTp0b3BfYmxhY2tsaXN0X2NhbGksc3BsYXNoX2lubmVyX291dGVyX2V4cDpiYXNlLGNjZF9leHBfZGVtbzpjY2RfYmFzZSxmcmVxUm91dGluZzpiYXNlLHZpZGVvX3RlbXBsYXRlX3N1cHBvcnQ6ZXhwMyxpYWFfb25seV9lY3BtOjAwLHRlc3RfbW9kZWxfbmFtZTpiYXNlXzExLGZseV9qdW1wX2NvbW1lbnQ6ZXhwMyxsb2dnaW5nX2FkaW5mb19saXN0OmJhc2UsdXNlTmV3WWVsbG93Q2FydFBhbm5lbDpleHAyLGhpZ2hfcXVhbGl0eV9hdmlkX3R1cm5fYmFjazpiYXNlLG5ld19kaXJlY3RfYWRtaXNzaW9uX3YyOm9wZW5fc2hvdXRhb193dWR1YW4sdHJhZGVfcmVjYWxsOmRlZmF1bHQsb3R0X2VjcG1fdGhyZDpiYXNlLGVuYWJsZV9hbHRfZGF2aW5jaTpkZWZhdWx0LGlubmVyX291dGVyX2JpZF9leHA6bmV3X3JhbmtmcmFtZV8wNDAyLG9mZmxpbmVfbWlkX2ZlYV92MjpleHAzLGRjdnJfd29ybGRfMjAyNVEyOmJhc2UxLHVuZGVyZnJhbWVfcHVsbF91cDpleHAxLGVuYWJsZV9pbmR1c3RyeV92Ml9maWx0ZXI6YmFzZSxuRmVkQmFjazE6bG9vc2UsRHBhMlJ0YVBpY2tQcm9kdWN0OnNoYXJlZF8zMCxmaWx0ZXJfY2xlYW46YmFzZSxhY2NvdW50RnJlcUNvbmY6YmFzZSxtaW5pZ2FtZV9iaWRfZXhwOmV4cF8wMzA3LHN0b3J5X2RhaWh1b19zdHlsZTpleHAsbm9fYWdlX2dlbmRlcl9leHA6YWdlMCxvdHRjb25maWc6ZXhwXzE1LE1peGVyRUNvbW1lcmNlOmVuYWJsZSxzc3BEaXJlY3REaXNwYXRjaEFkVm9FeHA6ZXhwXzIscmlza3lfYWRfb3B0OmhpZGRlbl9jb3N0XzAsc0ZCcnU6MyxCaXpNaXhlclJvdXRlcjpiaXpfbWl4ZXJfcGcsMjUzOTkxOmJhc2UsdHNtdjJfdHJhZGU6YmFzZSxmbHlfZGVxOm9yZGVyX2xpdmUsdHNtXzE6ZWR1dGFnX3JlY2FsbF8wMjA2LHJldHJpZXZlX2xvZzpvcGVuLGdkX21vZGVsOmV4cDEsY3BhX3NlYXJjaDpjcGFfdjIsdHNtdjJfc3dpbmdmbHlfb3RoZXJzY2VuZTpiYXNlLGFkeF9yZXF1ZXN0X29wdGltaXphdGlvbl90ZXN0OmRlZmF1bHQsc3RfdnZfbW9kZWw6YmFzZSxicnVzaF9kdXA6ZGVmYXVsdCxzdG9yeV9saXZlX3Z2OmRlZixpbmxpbmVfemVyb19jYXJkX2luZGV4OmV4cCxyZXFfbG9nX3JhdGlvOmJhc2UsZHBhVW5kZXJmcmFtZU5ld1N0eWxlOmV4cDIsZHluYW1pY1RpbWVvdXRNaW5zOjI0MCxtb2RlbF9jYWxpOmV4cDEsZmx5X2NwY19jYWxpX25ldzpvcmRlcl9hY2NfZXhwLGVuYWJsZVNtYXJ0Q292ZXJVcmw6YmFzZV9hYV8wMTE1LG1pbmlfZ2FtZV9sb25nX3RpbWVfZmxpcF9leHA6ZXhwX2dyb3VwLHV2X2FhOmRlZmF1bHQsYWNjb3VudF9ibGFjazpiYXNlLGFzQ29tbWVudENoZWNrRGlmZlJhdGlvRXhwOmV4cDIsY3RyX21vZGVsOmV4cF8wMSxic0R1cEFkOm9wZW4sb3JkZXJfbGF4aW46bGF4aW5fYmFzZV92Ml8xLHByb2dDcmVhRmVlZEN0cjpkaXN0X2x0cix1bmlvbl9mbHlfY3BjOmV4cDAxMjQsQ3VzdG9tQ3JlYXRpdmVTZWxlY3RFeHA6a3Vhbmd4aWFfMDQwMixuZXdCc0ZpbHRlckxvZzpvcGVuLHNlYXJjaF9xdWlja19wbGFjZW1lbnQ6ZXhwMSxib29zdF9leHA6ZXhwMyx0c212Ml9tb2RlbF9yZWNhbGw6YmFzZSxjY2RfdWVzY29yZTpjY2RfYmFzZSxkQWR4MTpvcGVuLGRhbGFvX2NhcmRfb25seV90b3A6ZXhwLGNhc3NpbmlFeHA6c21hbGxfYnVkZ2V0X2Nsb3NlLHNwbGFzaF90d2lzdF9hbmdsZV9leHA6YmFzZSx0c212Ml9vdGhlcnM6YmFzZSxzcGxhc2hNaW5JbnRlcnZhbEV4cDpiYXNlXzFoLGR5bmFtaWNfaW5kZXg6YmFzZSxyZWNhbGxfbGltaXRfcmF0aW86YmFzZSxmbHlfY3BhOmZseV92MyxnYW9uZW5nX2FidGVzdDpiYXNlLHBFTjpQUixzZWFyY2hfY3RyX21vZGVsOmV4cF95LGxpdmVfY2FyZF90YWdfbW92ZTpleHAxXzAzMTgsYmVzdENyZWF0aXZlOmVjcG0yLHN0b3J5X3N0eWxlX3NlbGVjdF9jb25mOmJhc2UyMDI1MDIyNyxjbG9zZV9zcmNfZWZmOmV4cF8wNzI1X25vX3J1bGUsMTA3MjpiYXNlLHNvZnRfYWRfZXhwOjA2LGZseV9saWtlX3RoOmNsb3NlLG1peGVyX3N0b3J5X2FkX3dlaWdodDo2LGFpZ2NfYW50b3U6TFJfYmFzZV8yMDI1MDMxNCxqZzpleHAyLHBkY3ZyX3RocmVzaG9sZDpleHAxLGRjdnJfcmV0ZW50aW9uX25ldzpjb21ib19iYXNlLHBlZ2FzdXNfbWl4ZXI6MDEsZHBhMjpiYXNlLHVuZGVyX2ZyYW1lX2VjcG1fZXhwOmJhc2UsSW5kdXN0cnlFeGNsdWRlSW5mb0NvbmZfdjI6YmFzZSxlbmFibGVfdXNlcl9mZWF0dXJlX2J1Y2tldDpiYXNlbGluZSxlY29tX3JlY2FsbDpMSFVDX0IsZW5hYmxlVGFnTW92ZVVwOmV4cDRfbW92ZV90YWdfZGlzbGlrZWFkaixhZF9icmFuZF9nZF9lbmFibGVfZGlmZjpiYXNlLGZkX3BjdHI6YmFzZV8xLDI1NzM4OmJhc2UscHJvZ0NyZWFEaWN0VmVyOmRlZmF1bHQsc2VhcmNoX3BhcmFsbGVsX3JlcV9yZWRpczpleHAxLHByb2dyYW1DcmVhdGl2ZTpkZWZhdWx0LGRwczpkZWZhdWx0LHBhZF9pbm5lcl9hZGxvYWQ6YmFzZV8yMF8wLHVuZGVyZnJhbWVfcHVsbF91cF9uZXc6YmFzZV9hYWEsY29hcnNlRXhwbG9yZUZhY3RvckNvbmY6ZGVmYXVsdCxmbHlfc3RvcnlfeWVsbG93Y2FyX3N0eWxlOnlvdXh1YW5fYmFzZV9rZmMsZmx5X2NwYV9wYzpleHAxMCxEcGFTdnJQcmVzc3VyZTpiYXNlLGNwYTpiYXNlLGJvb3N0X2JzOmJhc2UsZmx5Q2FyZFF1YWxpdHk6ZXhwNCxhbGw6Y3BjX2Nyb3dkX3RhcmdldCxmbHlfY3BhX2JvdHRvbTpjbG9zZSxSVEFfRElWSURFX0VYUF9UQUdfODkyOnJ0YV9kaXZpZGVfZXhwXzg5Ml81LEluZHVzdHJ5THRyQ29hcnNlQ29uZjpnYW1lbGl2ZSxlZGdlX3JlcmFuazpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR182NTc6cnRhX2RpdmlkZV9leHBfNjU3XzQsaGVhcnRfYm94OmV4cCwyMzUzMTpub3JtYWwscHVwX25hdGl2ZV9hZDpkZWZhdWx0LG90dF9lZHVjYXRpb25fYW50b3U6ZXhwLGg1X3Y6Y29tcGFyZSx1c2VMdWFTY3JpcHQ6YmFzZSxjb2Fyc2VfZGFpaHVvOmJhc2UsZmxvd1J1bGU6b3BlbkZsb3dSdWxlQ2hlY2tTd2l0Y2gsc3Rvcnlfc3R5bGVfc2VsZWN0aW9uX2NvbmY6YmFzZTIwMjQxMTI5LG5ld192aWRlb191cF9taWRfZmlsdGVyOmJhc2UsZmx5X2NvYXJzZTpjb25zdGFudCxkZWxldGVGcmVxQ29kZTpiYXNlMyxob25nZ3VvX25vdF9zaG93X2luX2NoYXJnaW5nX3BhZ2U6YmFzZSxEcGFDcmVhdGl2ZVN0cmF0ZWd5RXhwZXJpbWVudDpzZWFyY2hfbWVyZ2VfaW1hZ2VfZXhwLHNzcF9yZXBsYXlfYXM6YmFzZSxiZnNfc2RwYV9kaXZlcnNpZnk6cmVtYWluLHNlYXJjaF9zdWJjYXJkX3N0eWxlOmZvcm1fYnV0dG9uLGJzLXg6YnMsd2hpdGVfYm94OmNsb3NlLGR1YW5qdV9hcnB1OmFkZF9ub3ZlbF8wMzI3LE1vZGVsRmVhdHVyZXNIaXZlTG9nOmNsb3NlLGZseV9zdXBfZmFjdG9yczpleHAsY2x0cmNvbmY6YnNsMyxkYXZpbmNpX3JlcV9sb2c6ZGVmYXVsdCxmbHdfbGlrZV9lbmdhZ2U6YmFzZSxzdG9yeV9jdXN0b21pemVfZGFubXU6YmFzZSxhZHhQbGF5UGFnZVJhc2lvOmV4cDAsZHBhMlByb21vdGVQcm9kdWN0TWF0ZXJpYWw6YmFzZSxsaXZlX21vZGVsOmxpdmVfYmFzZV8wNDA4LHVzZUFpR2NUaXRsZTpiYXNlLHBlZ2FzdXNfYWRsb2FkXzM6MTQsbGFuY2VyX25hdHVyZTpleHAsc3RvcnlfZGFubXVfY29uZjpkYW5tdV9udW1fMzgsdHNtdjJfdG9rZW5fc2RwYTpiYXNlLDI0aF9yb2lfYXJwdV9uZXc6c3RhbGxfYmFzZV92MyxzcGxhc2hfaGFyZF9maWx0ZXJzOmV4cCxnYW1lX2VjcG1fcm9pX2ZhY3Rvcl9zd2l0Y2g6ZXhwX291dGVyLGJ1cGNwY19nc3A6ZGVmYXVsdCxuRmVkQmFjazpsb29zZSxVbml0RGV0YWlsSW5mbzpjbG9zZSzogIHkuInov57lub/lkYrlsY/olL06YmFzZSxnZF9mb3JjZV9zZWxlY3Q6ZXhwMixjb2xkX2Jvb3RfY2xlYXJfZnJlcTpiYXNlLGdhbWVfb3Blbl9pbnRlcmVzdF9vcmllbnRhdGlvbjpleHBfb3Blbl9ib3RoLGNsb3NlX3BlcnNvbmFsX3JlY29tbWVuZF8yMDI1OmV4cF9vcGVuX2FsbF8wMjI4LFJUQV9ESVZJREVfRVhQX1RBR183MzE6cnRhX2RpdmlkZV9leHBfNzMxXzMsbm9fYWRfc2V0OmJhc2UsUlRBX0RJVklERV9FWFBfVEFHXzg1NTpydGFfZGl2aWRlX2V4cF84NTVfNyxhY2NvdW50X2V4cGxvcmVfc2hvd19saW1pdDpkZWZhdWx0LGZseV9nb29kc19jb21tZW50X3VybDpibHVlbGlua19yZXBsYWNlXzA1LG9yZGVyX2xhcmdlOmRlbGF5MSxlY3BtX3RocmVzaG9sZF9sYXllcjowOCxyZWNhbGxfdW5pdF9saW1pdDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR182NDA6cnRhX2RpdmlkZV9leHBfNjQwXzE2LGRhaWh1b1doaXRlQ29uZjp3aGl0ZV8yNDEyMDJfNSxSVEFfRElWSURFX0VYUF9UQUdfODgzOnJ0YV9kaXZpZGVfZXhwXzg4M181LGVuYWJsZUlubGluZUV4cDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR184ODg6cnRhX2RpdmlkZV9leHBfODg4XzIsaWFhX3VuaXRfZWE6ZXhwMSxTbWFsbEJ1ZGdldFRvbGVyYXRlOmV4cF83MixhdXRvX2FkX2Fzc2lzdDpiYXNlLG1peGVyX2JyYW5kX29wdDpiYXNlLGxheWVyZWRfYmlkZGluZzpiYXNlMDkyMixzdG9yeVllbGxvd0NhcnROZXc6ZXhwX2Jhc2UyXzAyMTMseHN0X2NodWRpYW46YmFzZSxkdWFuanVfbW9kZWw6ZGVmYXVsdCxnZF9waWQ6ZXhwX3JlYWQsY3BjMV9leHRlbmRlZDpxdW90YV8xMCxicnVzaF9pbm5lcjpiYXNlLHN0b3J5X3N0eWxlX3NlbGVjdDpyYW5kLGVuYWJsZV9wbGF5cGFnZV9pbmxpbmVfd3hfanVtcDpleHBfMDQwOSxkY3ZyZl8yMDI1UTE6cmV2ZXJzZSxmcmVTOmJhc2UsYWR2dl9waWRfZml4OmJhc2UsQ3JlYXRpdmVRdWFsaXR5OmF1dG8sSW5kdXN0cnlCb29zdDpnYW1lbGl2ZSxmbHlfbTppY2ViZXJnX2Jhc2UsZWNwbV9jcm93ZHNfZmlsdGVyOnRlc3QsZ2Rfc2NoZV9yYXRpbzpiYXNlLHRlc3RfbWl4ZXJfY2NkOmJhc2Usa3Vha2VfbW9iaWxlX2FudG91X3BjOmFudG91X3BjLG5ld192aWRlb19ib29zdDpkZWZhdWx0LHVuZGVyZnJhbWVfdWVzY29yZTpiYXNlLEVBX2V4cDpjbG9zZV9lYV8xMjExLGFuY2hvckFwcERvd25sb2FkU3R5bGVFeHA6YmFzZSwyMzI0NDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR183MDM6cnRhX2RpdmlkZV9leHBfNzAzXzMsZHVhbmp1X21vZGVsX2N0cjpkZWZhdWx0LGNvbG9yX21hc2s6YmFzZSxwdl9hYTpleHBfMSxwY19jbGllbnRfbm9fYWQ6bm9fYWRfYmFzZSxwcm9nQ3JlYVQ6djEuMCxuZWdhdGl2ZV9zdHJhdGVneV90ZXN0OmJhc2UsZW5hYmxlTmF0aXZlRmVlZHNUb1N0b3J5OmV4cF9oYXJkLGx0dl9pbnNfbG9nOmJhc2UxMCxmbHlfYnVfdW5kZXJmcmFtZTpiYXNlLHNwcmluZ2Zlc3RpdmFsX3N0YWJpbGl0eV9pbmR1c3RyeTpiYXNlLGdpZl9leHA6YmFzZSxjYXNlX2ludmVyc3RpZ2F0ZTpiYXNlLHByZXJhbmtfc2RwYTp4c2RqXzAxMTcscmVzZXJ2ZV9wcmljZTpnc3BfYWxsLHBheV83ZF9udW06ZXhwX2dhbWVfMSx0aW1lRnJlcTpkZWZhdWx0LGZyZXFDaGVja0R1cGxpY2F0ZTpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR183MjQ6cnRhX2RpdmlkZV9leHBfNzI0XzMsc3RvcnlGbHlNb2RlbENvbmY6YWRkX2VhX2V4cCxBcHBDb2V4aXN0RmlsdGVyOmNsb3NlLHVzdWFsX2FyZWFzOmJhc2UsYXBwU3RvcmVQcmlvcml0eVhpYW9ndW9BY2NvdW50SWRzOmJhc2UsbWFiaWRfZW5hYmxlOmJhc2VfMDEwOCxSVEFfRElWSURFX0VYUF9UQUdfODM2OnJ0YV9kaXZpZGVfZXhwXzgzNl8xMCxzb2Z0X2FkOjEyLHN0b3J5X3BsYXkzc190b3VjaF9yYXRpbzpyYXRpb18xMDAsZHVhbmp1X3JldGFyZ2V0OmJhc2UsUlRBX0RJVklERV9FWFBfVEFHXzEwMzc6cnRhX2RpdmlkZV9leHBfMTAzN181LGNhdGVnb3J5X3YzOmJhc2UsaWFhM19vdXRfdXBfYWRzOmV4cF9pYWFfb3V0X3VwLHByb2dDcmVhUmFuZG9tXzE6YmFzZV9tb2RlbDAzMTksZmx5X3lzYW50b3U6YmFzZV8wODIxLGZseV9jdHJfaW5saW5lX3RhcmdldDpjbG9zZSx0ZW1wbGF0ZV9maXg6YmFzZSxicmFuZER5bmFtaWNDYXJkSW5kZXhFeHA6ZXhwLGlubGluZUVjcG06ZGVmYXVsdCxmb3JjZUV4cG9zdXJlLWNhc3Npbmk6ZGFpaHVvX29wZW5fMjMxMTAxLHNwbGFzaF9uZXdfc3R5bGVfZmlsdGVyOmRlZmF1bHQsc2VhcmNoX3RyaXRvbjpiYXNlLGN2cl9mOmluZHVzdHJ5X29wdF9leHAsaW5uZXJfb3ZlcmxvYWRfY3RybDpkZWZhdWx0LHVnX3VuaXRfbGltaXQ6ZXhwLGNsZWFuX3Nsb3Q1MHA6ZXhwLG1lcmdlX2ZpbHRlcjplbmFibGVfc3luY19wcmltYXJ5X2ZpbHRlcixoeV9hcnB1X3JvdXRlX3NwbGl0OnN0YWxsX29yX3VuZGVsZXRlZF9mZWFzX2V4cCwxNTA2OmJhc2UsZ2RGZWVkc0VuYWJsZUJydXNoOmJhc2UsaW5saW5lX2Zsb3dfbm9fYWQ6YmFzZSxlbmFibGVfbGFuY2VyX3JlY29yZF9kbXNfZmVhdHVyZTowNDE0X3Rlc3QsdW5kZXJmcmFtZV9tYXJrX3N3dGljaDpleHAxXzA0MDksQWlFeHBQbGF5UGFnZTpiYXNlXzAsMjRoX3JvaV9hcnB1OmJhc2UzLG9wZW5QcmV2aWV3OmV4cDIsZ3NwX2V4cDpzZWFyY2hfZGVmYXVsdCxydW5uaW5nX29jcGM6YmFzZSxmbHlfcmFua19jb25mX21lcmdlOmJhc2UsbHRyQXBwTG9nOmNscyxzZWFyY2hfYWRzX3F1ZXJ5X3Jld3JpdGU6Y29tYmluZV9leHAxLHJhbmtfZGl2XzE6ZGVmYXVsdCx1bmRlcmZyYW1lX2Rvd25sb2FkX2FkYnV0dG9uOmJhc2UsQnNPZmZsaW5lTG9jYWxDcGFDb25maWdOZXc6ZGVmYXVsdCx1cFNwYWNlQ2hlY2tEaWZmUmF0aW9FeHA6ZXhwX21icyxzcGxhc2hfaW50ZXJmYWNlX2Rvd25ncmFkZTpiYXNlLGZvcmJpZGRlbl9kaXJlY3RfanVtcDpiYXNlLG1pbmlnYW1lX2JvbnVzX2V4cDpyZW1haW4sZW5hYmxlQXBwc3RvcmVEaXJlY3Q6ZXhwXzEsZnJlcV9pbmZvX3JvdXRpbmc6c2hqZF9zeWNwYl9mcmVxX3Rhc2tfY2x1c3Rlcl8xLHNlYXJjaF9hZHNfbWluX2JpZDpkZWZhdWx0LG9wZW5OZXdHZFByZXZpZXc6ZXhwLGRpc2FibGVfaWxsZWdhbF9vbmVfanVtcDpiYXNlLGNvYXJzZV9xdW90YV9jb250cm9sOmJhc2VfMDMyNCxmbHlfZHluYW1pY0FudG91OmJhc2UsQWlFeHBTdG9yeTpiYXNlLGRwYTJSZWNhbGw6Y2hvb3NlX3Byb2R1Y3RzX2Jhc2VfNTAsc2VhcmNoX25ld190YXJnZXRpbmc6YmFzZSxlbmFibGVfbW9kZWxfZGV0YWlsX3RyYWNrZXI6YmFzZSxEcGEyQ1ZSVGhyZXNob2xkOmpkX2N2cl8yMDAsY3RyX3RfZXhwOnQxLjAscGNTZWFyY2g6ZXhwLGVjb21fbWFpbl9zZWFyY2g65a+554Wn57uELGNvYXJzZTpjb2Fyc2VfY3ZyX25ld2NvbnYsZnJlcV9taWdyYXRlOmV4cF9lbmdpbmVfd2l0aF9zdHJpY3RfYnJ1c2g1LHN3aXRjaEJzUGdSZXFSYXRpbzpjbG9zZSxzZWFyY2hfcmVhbHRpbWVfdHJpZ2dlcjpjb25zdGFudCxBaUV4cEZlZWRzOmJhc2UsbWJzX3JlZmFjdG9yOmV4cDIsdWVzX3NlYXJjaDpkZWZhdWx0LHVuZGVyZnJhbWVfbXVsdGlfYWRzOmJhc2UsYWlnY19hbnRvdV9pbWFnZTpiYXNlXzAzMjYsbWl4ZXJfZnVzaW9uX2RpbWVuc2lvbjpnMixyb2xsb3V0X2xpc3R3aXNlX2Jpem1peGVyX2J1Z19maXg6YmFzZSx1c2VCc0ZpbmRhOmZpbmRhX3gsZmx5X3B1cF9lY3BtOmNvbnN0YW50LGZseV9jdHJfaW5saW5lOm1vZGVsLHRlc3RfcGVnYXN1c19wb3M6YmFzZSx0ZXN0X3N0b3J5X3BhY2s6ZXhwIDIsc3RvcnlfYWRsb2FkXzM6MTQsc2RwYV9kaXZlcnNpZnk6Y29uc3RhbnQyLG1pbmlfZ2FtZV9zY2VuZTpiYXNlLGN0cl9kaWx1Y19lbWJfbGF5ZXI6ZXhwcl9lbWJfZGlsdWMscm9pX2J4aWFveW91X25ldzpkZWZhdWx0LEluZHVzdHJ5Tm9UYXJnZXRGaWx0ZXJMYXllcjpleHAsY3JlYXRpdmVfYXZpZF90YWIzOmV4cF8wNTI3LHN0eWxlX2FiaWxpdHlfb2ZmbGluZTpiYXNlLHVuZGVyZnJhbWVfYnJhbmRfaGlnaDpiYXNlLGNyb3dkX2VjcGM6b3Blbl92Mix0c21fdjJfbGF5ZXI6YmFzZSxtaXhlcl9saXN0d2lzZV9wZWdhc3VzOmc1LHVzZUFzUGc6bWFpbl8yNDEyMjcsc3BsaXRfYnVja2V0OmJ1Y2tldF8zLGdsb2JhbF9yZXZlcnNlOmJhc2UscGxhdGZvcm06ZGVmYXVsdKABALIBICjf18utGMJMWQj0kF8utyJl8gRyHD1TIq1K6aKZR3vRugFCaHR0cHM6Ly9xcnNqLmJpbGlnYW1lLmNvbS9nY3h6L2g1Lz9zb3VyY2VGcm9tPTc3NyZzb3VyY2VUeXBlPWFkUHV0wgEA0gEA2AHQAeABAOgBAPABAIACAogCALgCAMACANACANgCAOoCAPACrIYl+AIAiAMGkgMAqAMAsAMAuAMAwgMAyAMX0gOWAXsiMTYiOiIxMjE1NDYwXzAiLCIxNyI6IjQzMzYiLCIxIjoiMTAxNzg0NjY0OTk1OTc0NzU4NCIsIjIiOiIxMjUyMzkzIiwiMyI6IjEyNTIzOTMiLCI2IjoiMTI1MjM5M18wIiwiMTIiOiI0MzM4IiwiMTMiOiIxMjE1NDYwIiwiMTQiOiI4ODciLCIxNSI6IjEzNjkifeADAOgDAPADAPoDBW90aGVyggQJbnVsbDpudWxsmAQAoAQAqgQECAAQBLAEAOIEwwE1Ni57InBzSWQiOjUyMTE4LCJ2MiI6IkFXVXMyZTBidEhmWTVCSzJ0LUQ0U3lNRGJtN2Z1SGIyYmlIREhsTnBjQlB1U2dVRzdLaW80dUkyNXlSdFJXQU5WUnRMbll1OVpxOElrdkVYZURfUmlER25BeTE0UV9CMlAtSzJmQ3pzMWZLQmY5WjZPUSJ9OzYzLnsicHNJZCI6NTIwNjYsInYyIjoiUWcifTs3MC57InBzSWQiOjUwMDQxLCJ2MiI6IktBIn2gBQDIBQPSBQA=", - "client_ip": "182.89.224.34", - "server_type": 1, - "resource_id": 4336, - "index": 2, - "cm_mark": 1, - "extra": { - "use_ad_web_v2": false, - "show_urls": [ - "" - ], - "click_urls": [], - "download_whitelist": [], - "card": { - "card_type": 0, - "title": "今日全球首发,千件外观福利免费领", - "covers": [ - { - "url": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/bbd7cc4e6a74508e9ccee467541cc06a.jpg", - "loop": 0, - "image_height": 0, - "image_width": 0, - "gif_tag_show": false, - "jump_url": "", - "title": "", - "desc": "" - } - ], - "jump_url": "https://qrsj.biligame.com/gcxz/h5/?sourceFrom=777&sourceType=adPut", - "desc": "", - "callup_url": "", - "long_desc": "", - "ad_tag": "", - "extra_desc": "", - "universal_app": "", - "duration": "", - "adver": { - "adver_id": 1252393, - "adver_type": 3 - }, - "extreme_team_status": false, - "support_transition": false, - "under_player_interaction_style": 0, - "referral_pop_active_time": 10000, - "grade_denominator": 0, - "star_level": 0, - "live_booking_population_threshold": 0, - "ori_mark_hidden": 0, - "use_multi_cover": false, - "custom_feedback_panels": [], - "yellow_cart_pannel_pullup": 0, - "yellow_cart_pannel_version": 0, - "goods_item_id": 0, - "story_interaction_style": 0, - "videos": [], - "download_area": 0, - "goods_pannel_show": 0, - "goods_panel_show": 0, - "show_pop_window": 0, - "search_show_adbutton": 0, - "jump_interaction_style": 0, - "live_page_type": 0, - "ad_tag_style": { - "type": 4, - "text": "", - "text_color": "", - "bg_border_color": "", - "bg_color": "", - "border_color": "", - "img_url": "https://i0.hdslb.com/bfs/sycp/mng/202408/34463051f8d45a6d3c20f8aff31aad9b.png", - "img_height": 48, - "img_width": 72 - }, - "feedback_panel": { - "panel_type_text": "广告", - "feedback_panel_detail": [], - "toast": "将减少相似广告推荐", - "close_rec_tips": "操作成功", - "open_rec_tips": "将减少展示此类广告" - }, - "fold_time": 0, - "live_room_popularity": 0, - "live_tag_show": false, - "quality_infos": [], - "dynamic_text": "今日全球首发,千件外观福利免费领", - "choose_button_list": [], - "grade_level": 0, - "anim_in_enable": 0, - "underframe_card_style": 0, - "playpage_card_style": 0, - "live_auto_play": false, - "original_style_level": 0, - "live_card_show": false, - "enable_tag_move_up": 0, - "item_source": 0, - "closed_loop_item": 0, - "desc_type": 0, - "comment_use_game_page": 0, - "story_takeoff_interaction_style": 0 - }, - "report_time": 2000, - "sales_type": 31, - "special_industry": false, - "preload_landingpage": 0, - "enable_share": true, - "share_info": { - "title": "今日全球首发,千件外观福利免费领", - "subtitle": "", - "image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/3eba2979cb9525f14633a39c9f2ec2ab.jpg" - }, - "upzone_entrance_type": 0, - "upzone_entrance_report_id": 0, - "click_area": 0, - "shop_id": 0, - "up_mid": 0, - "track_id": "pbaes.DXUvRhr8IAhiFZ60KoOBStL0Na80m-kKS6CwFKDBtlzOwGJZu7il0VbEU3j2A_dZ96EXDGonAHs9Qx-5X2XbovyGP-xL4lyr_c_3rDZs4q3frmVjEGhu2VPOE5MRHF3AdryKsZiIGCl_f6ZD0y-cNQ==", - "enable_store_direct_launch": 0, - "enable_double_jump": false, - "from_track_id": "all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "store_callup_card": false, - "enable_h5_alert": false, - "special_industry_style": 0, - "macro_replace_priority": 1, - "feedback_panel_style": 0, - "ad_content_type": 0, - "enable_h5_pre_load": 0, - "hot_activity_id": 0, - "middle_show_urls": [], - "middle_click_urls": [], - "product_id": 0, - "landingpage_download_style": 2, - "download_url_type": 0, - "enable_auto_callup": 0, - "top_live_stay_time_seconds": 0, - "vipshop_fast_framework": 0, - "lottery_id": 0, - "enable_openapk_dialog": false, - "user_cancel_jump_type": 0, - "comment_toast_open": 0, - "comment_biz_type": 0, - "app_exp_params": "{\"pegasus_live_inline_background_fill\":0,\"story_live_goods_card_style\":{\"first_type\":1,\"second_type\":2,\"delay_time\":3000}}" - } - } -} -``` - -为普通视频时 则对应最开始的视频类型 也就是 - -```json -{ - "card_type": "small_cover_v2", - "card_goto": "av", - "goto": "av", - "param": "114375012651120", - "cover": "http://i1.hdslb.com/bfs/archive/05ec862caac777f9d7d06175becf0413b9c653ee.jpg", - "title": "「小白」红米Turbo 4 Pro 性能体验:首台8sGen4量产机表现如何?", - "uri": "bilibili://video/114375012651120?cid=29550644277&player_height=1890&player_preload=%7B%22expire_time%22%3A1745486594%2C%22cid%22%3A29550644277%2C%22quality%22%3A32%2C%22file_info%22%3A%7B%2216%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A2121663%2C%22timelength%22%3A230900%7D%5D%7D%2C%2232%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A3606019%2C%22timelength%22%3A230900%7D%5D%7D%2C%2264%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A6733527%2C%22timelength%22%3A230900%7D%5D%7D%2C%2280%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A10362311%2C%22timelength%22%3A230900%7D%5D%7D%7D%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22dash%22%3A%7B%22video%22%3A%5B%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F123.184.35.33%3A8000%2Fv1%2Fresource%2F29550644277-1-100047.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D125426%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D158098%5Cu0026tag%3D%5Cu0026traceid%3DtrANPsmzTXNczh_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Cnbs%252Coi%252Cplatform%252Ctrid%252Cmid%252Cdeadline%252Cuipk%252Cgen%252Cos%252Cog%5Cu0026upsig%3Df6ea272dedd17383c1a7c43a39471036%22%2C%22bandwidth%22%3A124895%2C%22codecid%22%3A7%2C%22size%22%3A3606019%2C%22frame_rate%22%3A%2224.991%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026uipk%3D5%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026upsig%3Df6ea272dedd17383c1a7c43a39471036%5Cu0026uparams%3De%2Ctag%2Cnbs%2Coi%2Cplatform%2Ctrid%2Cmid%2Cdeadline%2Cuipk%2Cgen%2Cos%2Cog%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D125426%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026orderid%3D0%2C3%22%2C%22http%3A%2F%2Fupos-sz-estgoss.bilivideo.com%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dupos%5Cu0026og%3Dcos%5Cu0026trid%3D56fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026upsig%3D464e03491d78d3249012e6c9affbb768%5Cu0026uparams%3De%2Ctag%2Cgen%2Cos%2Cog%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Coi%2Cuipk%2Cplatform%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D125426%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026orderid%3D1%2C3%22%5D%2C%22audio_id%22%3A30216%7D%2C%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F59.47.230.23%3A8000%2Fv1%2Fresource%2F29550644277-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D131973%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D2d5ae2%5Cu0026tag%3D%5Cu0026traceid%3DtrQICyqgrXBqnY_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cnbs%252Coi%252Cuipk%252Cmid%252Cdeadline%252Cog%252Cplatform%252Ctrid%252Ctag%252Cgen%252Cos%5Cu0026upsig%3D855d6f99090897394e531af9d9cc6dc8%22%2C%22bandwidth%22%3A131411%2C%22codecid%22%3A12%2C%22size%22%3A3794237%2C%22frame_rate%22%3A%2224.991%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2F122.191.18.170%3A8000%2Fv1%2Fresource%2F29550644277-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D131973%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dcoso1bv%5Cu0026platform%3Dandroid%5Cu0026sign%3D2d5ae2%5Cu0026tag%3D%5Cu0026traceid%3DtrxqpZsZboLcyN_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Cplatform%252Ctag%252Cos%252Cog%252Cnbs%252Coi%252Ctrid%252Cmid%252Cdeadline%252Cgen%5Cu0026upsig%3D42f974aacd3f2a9a6ba659f11e469614%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30033.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026og%3Dcos%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026upsig%3D855d6f99090897394e531af9d9cc6dc8%5Cu0026uparams%3De%2Cnbs%2Coi%2Cuipk%2Cmid%2Cdeadline%2Cog%2Cplatform%2Ctrid%2Ctag%2Cgen%2Cos%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D131973%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026orderid%3D0%2C3%22%5D%2C%22audio_id%22%3A30216%7D%5D%2C%22audio%22%3A%5B%7B%22id%22%3A30216%2C%22base_url%22%3A%22http%3A%2F%2F121.31.234.218%3A8000%2Fv1%2Fresource%2F29550644277-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43505%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3Db0263a%5Cu0026tag%3D%5Cu0026traceid%3DtrDHNJjmfaaueG_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Ctrid%252Cmid%252Cdeadline%252Cnbs%252Cgen%252Coi%252Cuipk%252Ctag%252Cos%252Cog%5Cu0026upsig%3De92887e43514a81bad4594c670c509d1%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250775%2C%22backup_url%22%3A%5B%22http%3A%2F%2F211.141.225.131%3A8000%2Fv1%2Fresource%2F29550644277-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43505%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3D08hbv%5Cu0026platform%3Dandroid%5Cu0026sign%3Db0263a%5Cu0026tag%3D%5Cu0026traceid%3DtrnTeKCShifUBc_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cgen%252Cog%252Cdeadline%252Ctag%252Cnbs%252Cplatform%252Ctrid%252Cos%252Cmid%252Coi%252Cuipk%5Cu0026upsig%3D313f602e2d41ebe9637a95fc20bceb93%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30216.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026gen%3Dplayurlv3%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026tag%3D%5Cu0026os%3Dmcdn%5Cu0026og%3Dhw%5Cu0026upsig%3De92887e43514a81bad4594c670c509d1%5Cu0026uparams%3De%2Cplatform%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Cgen%2Coi%2Cuipk%2Ctag%2Cos%2Cog%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43505%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30280%2C%22base_url%22%3A%22http%3A%2F%2F211.97.94.165%3A8000%2Fv1%2Fresource%2F29550644277-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D3f3ed4%5Cu0026tag%3D%5Cu0026traceid%3DtrQHmKzoFdDeCw_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Ctag%252Cnbs%252Cgen%252Cos%252Cog%252Coi%252Cplatform%252Ctrid%252Cmid%252Cdeadline%5Cu0026upsig%3D808cd1429841f75b1ccd7ccdc5de7bc3%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250767%2C%22backup_url%22%3A%5B%22http%3A%2F%2F123.184.35.19%3A8000%2Fv1%2Fresource%2F29550644277-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dupos%5Cu0026platform%3Dandroid%5Cu0026sign%3D3f3ed4%5Cu0026tag%3D%5Cu0026traceid%3DtrtSntUkmmkWVz_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Ctag%252Cnbs%252Cog%252Ctrid%252Cmid%252Cdeadline%252Coi%252Cuipk%252Cgen%252Cos%5Cu0026upsig%3D070e2e2176dd7e2d87777b20161c8d1f%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30280.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026uipk%3D5%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026upsig%3D808cd1429841f75b1ccd7ccdc5de7bc3%5Cu0026uparams%3De%2Cuipk%2Ctag%2Cnbs%2Cgen%2Cos%2Cog%2Coi%2Cplatform%2Ctrid%2Cmid%2Cdeadline%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43504%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30232%2C%22base_url%22%3A%22http%3A%2F%2F125.106.124.64%3A8000%2Fv1%2Fresource%2F29550644277-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D3ad163%5Cu0026tag%3D%5Cu0026traceid%3DtrsSvqSMaoCcOa_1_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Cuipk%252Cgen%252Cos%252Cog%252Ctrid%252Cmid%252Cdeadline%252Cnbs%252Coi%252Cplatform%5Cu0026upsig%3D219bdbd1641753ddc8555f788bc21711%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250767%2C%22backup_url%22%3A%5B%22http%3A%2F%2F220.200.12.159%3A5889%2Fv1%2Fresource%2F29550644277-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3D08hbv%5Cu0026platform%3Dandroid%5Cu0026sign%3D3ad163%5Cu0026tag%3D%5Cu0026traceid%3DtrQVqwCtxAuTKK_2_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Coi%252Ctrid%252Cdeadline%252Cgen%252Cos%252Cnbs%252Cuipk%252Cplatform%252Cmid%252Cog%5Cu0026upsig%3Dc45e0be8a46a1b1456b066fc447dcf4a%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30232.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026uipk%3D5%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dhw%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026upsig%3D219bdbd1641753ddc8555f788bc21711%5Cu0026uparams%3De%2Ctag%2Cuipk%2Cgen%2Cos%2Cog%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Coi%2Cplatform%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43504%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%5D%7D%2C%22fnval%22%3A272%2C%22accept_formats%22%3A%5B%7B%22quality%22%3A116%2C%22format%22%3A%22flv_p60%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P60%22%2C%22new_description%22%3A%221080P%2060%E5%B8%A7%22%2C%22display_desc%22%3A%221080P%22%2C%22superscript%22%3A%2260%E5%B8%A7%22%2C%22need_vip%22%3Atrue%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A80%2C%22format%22%3A%22flv%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P%22%2C%22new_description%22%3A%221080P%20%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%221080P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A64%2C%22format%22%3A%22flv720%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%20720P%22%2C%22new_description%22%3A%22720P%20%E5%87%86%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%22720P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A32%2C%22format%22%3A%22flv480%22%2C%22description%22%3A%22%E6%B8%85%E6%99%B0%20480P%22%2C%22new_description%22%3A%22480P%20%E6%A0%87%E6%B8%85%22%2C%22display_desc%22%3A%22480P%22%7D%2C%7B%22quality%22%3A16%2C%22format%22%3A%22mp4%22%2C%22description%22%3A%22%E6%B5%81%E7%95%85%20360P%22%2C%22new_description%22%3A%22360P%20%E6%B5%81%E7%95%85%22%2C%22display_desc%22%3A%22360P%22%7D%5D%2C%22volume%22%3A%7B%22measured_i%22%3A-18.2%2C%22measured_lra%22%3A5.9%2C%22measured_tp%22%3A-1.3%2C%22measured_threshold%22%3A-28.3%2C%22target_offset%22%3A0.5%2C%22target_i%22%3A-14%2C%22target_tp%22%3A-1%2C%22multi_scene_args%22%3A%7B%22high_dynamic_target_i%22%3A%22-24%22%2C%22normal_target_i%22%3A%22-14%22%2C%22undersized_target_i%22%3A%22-28%22%7D%7D%2C%22union_player%22%3A%7B%22biz_type%22%3A1%2C%22dimension%22%3A%7B%22width%22%3A4096%2C%22height%22%3A1890%7D%2C%22aid%22%3A114375012651120%7D%2C%22auto_qn_ctl%22%3A%7B%22login_half%22%3A32%2C%22nologin_half%22%3A32%2C%22login_full%22%3A80%2C%22nologin_full%22%3A32%2C%22mobile_login_full%22%3A80%2C%22mobile_nologin_full%22%3A32%7D%2C%22qn_exp%22%3A%7B%22qn_exp_1%22%3Atrue%7D%7D&player_rotate=0&player_width=4096&report_flow_data=%7B%22flow_card_type%22%3A%22av%22%2C%22flow_source%22%3A%22click_u2i%24ann_dssm_u2i_28d%24dssm_u2u%22%7D&trackid=all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007" - ... -} -``` - -**示例:** - -获取短视频模式视频列表 - -```shell -curl -G 'https://app.bilibili.com/x/v2/feed/index' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "items": [ - { - "card_type": "small_cover_v2", - "card_goto": "av", - "goto": "av", - "param": "411978753", - "cover": "http://i2.hdslb.com/bfs/archive/a1bda1e57e6812ca8822a8839fc4a1d3539255a8.jpg", - "title": "帕 鲁 现 状", - "uri": "bilibili://video/411978753?cid=1423365216\u0026player_height=1920\u0026player_preload=%7B%22cid%22%3A1423365216%2C%22expire_time%22%3A1706633200%2C%22file_info%22%3A%7B%2216%22%3A%5B%7B%22timelength%22%3A79970%2C%22filesize%22%3A3782665%7D%5D%2C%2264%22%3A%5B%7B%22timelength%22%3A79900%2C%22filesize%22%3A9552030%7D%5D%7D%2C%22support_quality%22%3Anull%2C%22support_formats%22%3Anull%2C%22support_description%22%3Anull%2C%22quality%22%3A16%2C%22url%22%3A%22http%3A%2F%2Fcn-gdst-cm-01-12.bilivideo.com%2Fupgcxcode%2F16%2F52%2F1423365216%2F1423365216-1-16.mp4%3Fe%3Dig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_%5Cu0026uipk%3D5%5Cu0026nbs%3D1%5Cu0026deadline%3D1706636800%5Cu0026gen%3Dplayurlv2%5Cu0026os%3Dbcache%5Cu0026oi%3D0%5Cu0026trid%3D00000ccc07d4b7a34140a25493d51003bd95U%5Cu0026mid%3D0%5Cu0026platform%3D%5Cu0026upsig%3D2bf8e99202a181300981ab6ba9d2305d%5Cu0026uparams%3De%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform%5Cu0026cdnid%3D6876%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026orderid%3D0%2C3%5Cu0026buvid%3D%5Cu0026build%3D0%5Cu0026f%3DU_0_0%5Cu0026bw%3D47881%5Cu0026logo%3D80000000%22%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22fnver%22%3A0%2C%22fnval%22%3A0%7D\u0026player_rotate=0\u0026player_width=1080\u0026report_flow_data=%7B%22flow_card_type%22%3A%22av%22%7D", - "three_point": { - "dislike_reasons": [ - { - "id": 4, - "name": "UP主:锤子game", - "toast": "将减少相似内容推荐" - }, - { - "id": 2, - "name": "分区:网络游戏", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:搞笑", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "不感兴趣", - "toast": "将减少相似内容推荐" - } - ], - "feedbacks": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "watch_later": 1 - }, - "args": { - "up_id": 495695169, - "up_name": "锤子game", - "rid": 65, - "rname": "网络游戏", - "tid": 1833, - "tname": "搞笑", - "aid": 411978753 - }, - "player_args": { - "aid": 411978753, - "cid": 1423365216, - "type": "av", - "duration": 80 - }, - "idx": 1706629610, - "three_point_v2": [ - { - "title": "添加至稍后再看", - "type": "watch_later", - "icon": "https://i0.hdslb.com/bfs/activity-plat/static/ce06d65bc0a8d8aa2a463747ce2a4752/NyPAqcn0QF.png" - }, - { - "title": "反馈", - "subtitle": "(选择后将优化首页此类内容)", - "reasons": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "type": "feedback" - }, - { - "title": "不感兴趣", - "subtitle": "(选择后将减少相似内容推荐)", - "reasons": [ - { - "id": 4, - "name": "UP主:锤子game", - "toast": "将减少相似内容推荐" - }, - { - "id": 2, - "name": "分区:网络游戏", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:搞笑", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "不感兴趣", - "toast": "将减少相似内容推荐" - } - ], - "type": "dislike" - } - ], - "talk_back": "视频,帕 鲁 现 状,32.5万观看,257弹幕,时长1分钟20秒,UP主锤子game,", - "report_flow_data": "{\"flow_card_type\":\"av\"}", - "cover_left_text_1": "32.5万", - "cover_left_icon_1": 1, - "cover_left_1_content_description": "32.5万观看", - "cover_left_text_2": "257", - "cover_left_icon_2": 3, - "cover_left_2_content_description": "257弹幕", - "cover_right_text": "1:20", - "cover_right_content_description": "1分钟20秒", - "desc_button": { - "text": "锤子game", - "uri": "bilibili://space/495695169", - "event": "nickname", - "type": 1 - }, - "official_icon": 16, - "can_play": 1, - "goto_icon": { - "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/077GOeHOfO.png", - "icon_night_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/ldbCXtkoK2.png", - "icon_width": 16, - "icon_height": 16 - } - }, - { - "card_type": "small_cover_v2", - "card_goto": "av", - "goto": "av", - "param": "836990443", - "cover": "http://i1.hdslb.com/bfs/archive/d16a125d6ec1c68cc9e0815bc28dcb62a1df9932.jpg", - "title": "【Phigros自制/崩坏:星穹铁道】欢迎来到匹诺康尼! 不眠之夜 IN Lv.13", - "uri": "bilibili://video/836990443?cid=1422516399\u0026player_height=1080\u0026player_preload=%7B%22cid%22%3A1422516399%2C%22expire_time%22%3A1706633200%2C%22file_info%22%3A%7B%2216%22%3A%5B%7B%22timelength%22%3A102818%2C%22filesize%22%3A4441802%7D%5D%2C%2264%22%3A%5B%7B%22timelength%22%3A102748%2C%22filesize%22%3A12468618%7D%5D%7D%2C%22support_quality%22%3Anull%2C%22support_formats%22%3Anull%2C%22support_description%22%3Anull%2C%22quality%22%3A16%2C%22url%22%3A%22http%3A%2F%2Fupos-sz-mirrorali.bilivideo.com%2Fupgcxcode%2F99%2F63%2F1422516399%2F1422516399-1-16.mp4%3Fe%3Dig8euxZM2rNcNbRVhwdVhwdlhWdVhwdVhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_%5Cu0026uipk%3D5%5Cu0026nbs%3D1%5Cu0026deadline%3D1706636800%5Cu0026gen%3Dplayurlv2%5Cu0026os%3Dalibv%5Cu0026oi%3D0%5Cu0026trid%3D0ccc07d4b7a34140a25493d51003bd95U%5Cu0026mid%3D0%5Cu0026platform%3D%5Cu0026upsig%3D06ea793aa573018646c0096adf0dcb9e%5Cu0026uparams%3De%2Cuipk%2Cnbs%2Cdeadline%2Cgen%2Cos%2Coi%2Ctrid%2Cmid%2Cplatform%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026orderid%3D0%2C3%5Cu0026buvid%3D%5Cu0026build%3D0%5Cu0026f%3DU_0_0%5Cu0026bw%3D43547%5Cu0026logo%3D80000000%22%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22fnver%22%3A0%2C%22fnval%22%3A0%7D\u0026player_rotate=0\u0026player_width=1920\u0026report_flow_data=%7B%22flow_card_type%22%3A%22av%22%7D", - "three_point": { - "dislike_reasons": [ - { - "id": 4, - "name": "UP主:早期陈总", - "toast": "将减少相似内容推荐" - }, - { - "id": 2, - "name": "分区:音游", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:音乐游戏", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "不感兴趣", - "toast": "将减少相似内容推荐" - } - ], - "feedbacks": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "watch_later": 1 - }, - "args": { - "up_id": 1515475415, - "up_name": "早期陈总", - "rid": 136, - "rname": "音游", - "tid": 10174, - "tname": "音乐游戏", - "aid": 836990443 - }, - "player_args": { - "aid": 836990443, - "cid": 1422516399, - "type": "av", - "duration": 103 - }, - "idx": 1706629609, - "three_point_v2": [ - { - "title": "添加至稍后再看", - "type": "watch_later", - "icon": "https://i0.hdslb.com/bfs/activity-plat/static/ce06d65bc0a8d8aa2a463747ce2a4752/NyPAqcn0QF.png" - }, - { - "title": "反馈", - "subtitle": "(选择后将优化首页此类内容)", - "reasons": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "type": "feedback" - }, - { - "title": "不感兴趣", - "subtitle": "(选择后将减少相似内容推荐)", - "reasons": [ - { - "id": 4, - "name": "UP主:早期陈总", - "toast": "将减少相似内容推荐" - }, - { - "id": 2, - "name": "分区:音游", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:音乐游戏", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "不感兴趣", - "toast": "将减少相似内容推荐" - } - ], - "type": "dislike" - } - ], - "talk_back": "视频,【Phigros自制/崩坏:星穹铁道】欢迎来到匹诺康尼! 不眠之夜 IN Lv.13,22.8万观看,797弹幕,时长1分钟43秒,UP主早期陈总,", - "report_flow_data": "{\"flow_card_type\":\"av\"}", - "cover_left_text_1": "22.8万", - "cover_left_icon_1": 1, - "cover_left_1_content_description": "22.8万观看", - "cover_left_text_2": "797", - "cover_left_icon_2": 3, - "cover_left_2_content_description": "797弹幕", - "cover_right_text": "1:43", - "cover_right_content_description": "1分钟43秒", - "desc_button": { - "text": "早期陈总", - "uri": "bilibili://space/1515475415", - "event": "nickname", - "type": 1 - }, - "can_play": 1, - "goto_icon": { - "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/077GOeHOfO.png", - "icon_night_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/ldbCXtkoK2.png", - "icon_width": 16, - "icon_height": 16 - } - } - ], - "config": { - "column": 2, - "autoplay_card": 2, - "feed_clean_abtest": 0, - "home_transfer_test": 0, - "auto_refresh_time": 1200, - "show_inline_danmaku": 1, - "toast": {}, - "is_back_to_homepage": true, - "enable_rcmd_guide": true, - "inline_sound": 2, - "auto_refresh_time_by_appear": 1200, - "auto_refresh_time_by_active": 1200, - "visible_area": 80, - "card_density_exp": 1, - "story_mode_v2_guide_exp": 6 - }, - "interest_choose": null - } -} -``` - -
- -
-查看登录后的响应示例(精简 包含横幅 热门视频 普通视频): - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "items": [ - { - "card_type": "banner_v8", - "card_goto": "banner", - "args": {}, - "idx": 1745482992, - "track_id": "all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "hash": "4708571670781279769", - "banner_item": [ - { - "type": "static", - "resource_id": 4336, - "id": 1674508, - "index": 1, - "static_banner": { - "id": 1674508, - "title": "火凤燎原第二季完结!新的战神,来了!", - "image": "http://i0.hdslb.com/bfs/banner/b1fc0b68f727c2d4ea57bee154f531c3b7f13fca.png", - "hash": "a6cee3b5b1c05227159f734f68289ba5", - "uri": "https://www.bilibili.com/bangumi/play/ep1365959?goto=static_banner", - "request_id": "1745482994326q172a27a87a21q3087", - "src_id": 4337, - "is_ad_loc": true, - "client_ip": "182.89.224.34", - "server_type": 0, - "resource_id": 4336, - "index": 1, - "cm_mark": 0 - } - }, - { - "type": "ad", - "resource_id": 4336, - "id": 0, - "index": 2, - "ad_banner": { - "id": 0, - "title": "今日全球首发,千件外观福利免费领", - "image": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/bbd7cc4e6a74508e9ccee467541cc06a.jpg", - "hash": "46cbecfe04e047692acfd4a149e81ebd", - "uri": "https://qrsj.biligame.com/gcxz/h5/?sourceFrom=777&sourceType=adPut", - "request_id": "1745482994326q172a27a87a21q3087", - "creative_id": 1017846649959747584, - "src_id": 4338, - "is_ad": true, - "is_ad_loc": true, - "ad_cb": "CAAQABiAoLC1qsSHkA4gACgAMKm4TDjyIUIfMTc0NTQ4Mjk5NDMyNnExNzJhMjdhODdhMjFxMzA4N0iWpZO35jJSBuafs+W3nloG5bm/6KW/YgbkuK3lm71oAXAAeICAgICAGoABAIgBpYgEkgENMTgyLjg5LjIyNC4zNJoBj0BjcGNfcXVvdGE6Y29uc3RhbnQsZWNvbV9mb3JjZV9yZWNhbGw6YmFzZV8wNjI4XzIwLGJyYW5kX3NwbGFzaF9saXN0X2J5X3RpbWU6YnJhbmRfc3BsYXNoX2xpc3RfYnlfdGltZV80MF90dW5uZWwsdWVzX2VycWk6MTcsamtfY2FydDpqazEsZmVlZHNQcmltYXJ5TW9kZWxDb25mOmJzbDIsY29tbWVudENvbXBvbmVudEFudG91UmF0aW86YmFzZSxTbWFsbEJ1ZGdldFJhdGlvOmRlZmF1bHQsc2VhcmNoX2Fkc19jcmVhdGl2ZTpsbG1fZXhwMSxkYWlodW9fYm9vc3RfZXhwOmJvb3N0X2V4cCxzZWFyY2hfYWRzX3JlbGV2YW5jZTp0b3BfYmxhY2tsaXN0X2NhbGksc3BsYXNoX2lubmVyX291dGVyX2V4cDpiYXNlLGNjZF9leHBfZGVtbzpjY2RfYmFzZSxmcmVxUm91dGluZzpiYXNlLHZpZGVvX3RlbXBsYXRlX3N1cHBvcnQ6ZXhwMyxpYWFfb25seV9lY3BtOjAwLHRlc3RfbW9kZWxfbmFtZTpiYXNlXzExLGZseV9qdW1wX2NvbW1lbnQ6ZXhwMyxsb2dnaW5nX2FkaW5mb19saXN0OmJhc2UsdXNlTmV3WWVsbG93Q2FydFBhbm5lbDpleHAyLGhpZ2hfcXVhbGl0eV9hdmlkX3R1cm5fYmFjazpiYXNlLG5ld19kaXJlY3RfYWRtaXNzaW9uX3YyOm9wZW5fc2hvdXRhb193dWR1YW4sdHJhZGVfcmVjYWxsOmRlZmF1bHQsb3R0X2VjcG1fdGhyZDpiYXNlLGVuYWJsZV9hbHRfZGF2aW5jaTpkZWZhdWx0LGlubmVyX291dGVyX2JpZF9leHA6bmV3X3JhbmtmcmFtZV8wNDAyLG9mZmxpbmVfbWlkX2ZlYV92MjpleHAzLGRjdnJfd29ybGRfMjAyNVEyOmJhc2UxLHVuZGVyZnJhbWVfcHVsbF91cDpleHAxLGVuYWJsZV9pbmR1c3RyeV92Ml9maWx0ZXI6YmFzZSxuRmVkQmFjazE6bG9vc2UsRHBhMlJ0YVBpY2tQcm9kdWN0OnNoYXJlZF8zMCxmaWx0ZXJfY2xlYW46YmFzZSxhY2NvdW50RnJlcUNvbmY6YmFzZSxtaW5pZ2FtZV9iaWRfZXhwOmV4cF8wMzA3LHN0b3J5X2RhaWh1b19zdHlsZTpleHAsbm9fYWdlX2dlbmRlcl9leHA6YWdlMCxvdHRjb25maWc6ZXhwXzE1LE1peGVyRUNvbW1lcmNlOmVuYWJsZSxzc3BEaXJlY3REaXNwYXRjaEFkVm9FeHA6ZXhwXzIscmlza3lfYWRfb3B0OmhpZGRlbl9jb3N0XzAsc0ZCcnU6MyxCaXpNaXhlclJvdXRlcjpiaXpfbWl4ZXJfcGcsMjUzOTkxOmJhc2UsdHNtdjJfdHJhZGU6YmFzZSxmbHlfZGVxOm9yZGVyX2xpdmUsdHNtXzE6ZWR1dGFnX3JlY2FsbF8wMjA2LHJldHJpZXZlX2xvZzpvcGVuLGdkX21vZGVsOmV4cDEsY3BhX3NlYXJjaDpjcGFfdjIsdHNtdjJfc3dpbmdmbHlfb3RoZXJzY2VuZTpiYXNlLGFkeF9yZXF1ZXN0X29wdGltaXphdGlvbl90ZXN0OmRlZmF1bHQsc3RfdnZfbW9kZWw6YmFzZSxicnVzaF9kdXA6ZGVmYXVsdCxzdG9yeV9saXZlX3Z2OmRlZixpbmxpbmVfemVyb19jYXJkX2luZGV4OmV4cCxyZXFfbG9nX3JhdGlvOmJhc2UsZHBhVW5kZXJmcmFtZU5ld1N0eWxlOmV4cDIsZHluYW1pY1RpbWVvdXRNaW5zOjI0MCxtb2RlbF9jYWxpOmV4cDEsZmx5X2NwY19jYWxpX25ldzpvcmRlcl9hY2NfZXhwLGVuYWJsZVNtYXJ0Q292ZXJVcmw6YmFzZV9hYV8wMTE1LG1pbmlfZ2FtZV9sb25nX3RpbWVfZmxpcF9leHA6ZXhwX2dyb3VwLHV2X2FhOmRlZmF1bHQsYWNjb3VudF9ibGFjazpiYXNlLGFzQ29tbWVudENoZWNrRGlmZlJhdGlvRXhwOmV4cDIsY3RyX21vZGVsOmV4cF8wMSxic0R1cEFkOm9wZW4sb3JkZXJfbGF4aW46bGF4aW5fYmFzZV92Ml8xLHByb2dDcmVhRmVlZEN0cjpkaXN0X2x0cix1bmlvbl9mbHlfY3BjOmV4cDAxMjQsQ3VzdG9tQ3JlYXRpdmVTZWxlY3RFeHA6a3Vhbmd4aWFfMDQwMixuZXdCc0ZpbHRlckxvZzpvcGVuLHNlYXJjaF9xdWlja19wbGFjZW1lbnQ6ZXhwMSxib29zdF9leHA6ZXhwMyx0c212Ml9tb2RlbF9yZWNhbGw6YmFzZSxjY2RfdWVzY29yZTpjY2RfYmFzZSxkQWR4MTpvcGVuLGRhbGFvX2NhcmRfb25seV90b3A6ZXhwLGNhc3NpbmlFeHA6c21hbGxfYnVkZ2V0X2Nsb3NlLHNwbGFzaF90d2lzdF9hbmdsZV9leHA6YmFzZSx0c212Ml9vdGhlcnM6YmFzZSxzcGxhc2hNaW5JbnRlcnZhbEV4cDpiYXNlXzFoLGR5bmFtaWNfaW5kZXg6YmFzZSxyZWNhbGxfbGltaXRfcmF0aW86YmFzZSxmbHlfY3BhOmZseV92MyxnYW9uZW5nX2FidGVzdDpiYXNlLHBFTjpQUixzZWFyY2hfY3RyX21vZGVsOmV4cF95LGxpdmVfY2FyZF90YWdfbW92ZTpleHAxXzAzMTgsYmVzdENyZWF0aXZlOmVjcG0yLHN0b3J5X3N0eWxlX3NlbGVjdF9jb25mOmJhc2UyMDI1MDIyNyxjbG9zZV9zcmNfZWZmOmV4cF8wNzI1X25vX3J1bGUsMTA3MjpiYXNlLHNvZnRfYWRfZXhwOjA2LGZseV9saWtlX3RoOmNsb3NlLG1peGVyX3N0b3J5X2FkX3dlaWdodDo2LGFpZ2NfYW50b3U6TFJfYmFzZV8yMDI1MDMxNCxqZzpleHAyLHBkY3ZyX3RocmVzaG9sZDpleHAxLGRjdnJfcmV0ZW50aW9uX25ldzpjb21ib19iYXNlLHBlZ2FzdXNfbWl4ZXI6MDEsZHBhMjpiYXNlLHVuZGVyX2ZyYW1lX2VjcG1fZXhwOmJhc2UsSW5kdXN0cnlFeGNsdWRlSW5mb0NvbmZfdjI6YmFzZSxlbmFibGVfdXNlcl9mZWF0dXJlX2J1Y2tldDpiYXNlbGluZSxlY29tX3JlY2FsbDpMSFVDX0IsZW5hYmxlVGFnTW92ZVVwOmV4cDRfbW92ZV90YWdfZGlzbGlrZWFkaixhZF9icmFuZF9nZF9lbmFibGVfZGlmZjpiYXNlLGZkX3BjdHI6YmFzZV8xLDI1NzM4OmJhc2UscHJvZ0NyZWFEaWN0VmVyOmRlZmF1bHQsc2VhcmNoX3BhcmFsbGVsX3JlcV9yZWRpczpleHAxLHByb2dyYW1DcmVhdGl2ZTpkZWZhdWx0LGRwczpkZWZhdWx0LHBhZF9pbm5lcl9hZGxvYWQ6YmFzZV8yMF8wLHVuZGVyZnJhbWVfcHVsbF91cF9uZXc6YmFzZV9hYWEsY29hcnNlRXhwbG9yZUZhY3RvckNvbmY6ZGVmYXVsdCxmbHlfc3RvcnlfeWVsbG93Y2FyX3N0eWxlOnlvdXh1YW5fYmFzZV9rZmMsZmx5X2NwYV9wYzpleHAxMCxEcGFTdnJQcmVzc3VyZTpiYXNlLGNwYTpiYXNlLGJvb3N0X2JzOmJhc2UsZmx5Q2FyZFF1YWxpdHk6ZXhwNCxhbGw6Y3BjX2Nyb3dkX3RhcmdldCxmbHlfY3BhX2JvdHRvbTpjbG9zZSxSVEFfRElWSURFX0VYUF9UQUdfODkyOnJ0YV9kaXZpZGVfZXhwXzg5Ml81LEluZHVzdHJ5THRyQ29hcnNlQ29uZjpnYW1lbGl2ZSxlZGdlX3JlcmFuazpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR182NTc6cnRhX2RpdmlkZV9leHBfNjU3XzQsaGVhcnRfYm94OmV4cCwyMzUzMTpub3JtYWwscHVwX25hdGl2ZV9hZDpkZWZhdWx0LG90dF9lZHVjYXRpb25fYW50b3U6ZXhwLGg1X3Y6Y29tcGFyZSx1c2VMdWFTY3JpcHQ6YmFzZSxjb2Fyc2VfZGFpaHVvOmJhc2UsZmxvd1J1bGU6b3BlbkZsb3dSdWxlQ2hlY2tTd2l0Y2gsc3Rvcnlfc3R5bGVfc2VsZWN0aW9uX2NvbmY6YmFzZTIwMjQxMTI5LG5ld192aWRlb191cF9taWRfZmlsdGVyOmJhc2UsZmx5X2NvYXJzZTpjb25zdGFudCxkZWxldGVGcmVxQ29kZTpiYXNlMyxob25nZ3VvX25vdF9zaG93X2luX2NoYXJnaW5nX3BhZ2U6YmFzZSxEcGFDcmVhdGl2ZVN0cmF0ZWd5RXhwZXJpbWVudDpzZWFyY2hfbWVyZ2VfaW1hZ2VfZXhwLHNzcF9yZXBsYXlfYXM6YmFzZSxiZnNfc2RwYV9kaXZlcnNpZnk6cmVtYWluLHNlYXJjaF9zdWJjYXJkX3N0eWxlOmZvcm1fYnV0dG9uLGJzLXg6YnMsd2hpdGVfYm94OmNsb3NlLGR1YW5qdV9hcnB1OmFkZF9ub3ZlbF8wMzI3LE1vZGVsRmVhdHVyZXNIaXZlTG9nOmNsb3NlLGZseV9zdXBfZmFjdG9yczpleHAsY2x0cmNvbmY6YnNsMyxkYXZpbmNpX3JlcV9sb2c6ZGVmYXVsdCxmbHdfbGlrZV9lbmdhZ2U6YmFzZSxzdG9yeV9jdXN0b21pemVfZGFubXU6YmFzZSxhZHhQbGF5UGFnZVJhc2lvOmV4cDAsZHBhMlByb21vdGVQcm9kdWN0TWF0ZXJpYWw6YmFzZSxsaXZlX21vZGVsOmxpdmVfYmFzZV8wNDA4LHVzZUFpR2NUaXRsZTpiYXNlLHBlZ2FzdXNfYWRsb2FkXzM6MTQsbGFuY2VyX25hdHVyZTpleHAsc3RvcnlfZGFubXVfY29uZjpkYW5tdV9udW1fMzgsdHNtdjJfdG9rZW5fc2RwYTpiYXNlLDI0aF9yb2lfYXJwdV9uZXc6c3RhbGxfYmFzZV92MyxzcGxhc2hfaGFyZF9maWx0ZXJzOmV4cCxnYW1lX2VjcG1fcm9pX2ZhY3Rvcl9zd2l0Y2g6ZXhwX291dGVyLGJ1cGNwY19nc3A6ZGVmYXVsdCxuRmVkQmFjazpsb29zZSxVbml0RGV0YWlsSW5mbzpjbG9zZSzogIHkuInov57lub/lkYrlsY/olL06YmFzZSxnZF9mb3JjZV9zZWxlY3Q6ZXhwMixjb2xkX2Jvb3RfY2xlYXJfZnJlcTpiYXNlLGdhbWVfb3Blbl9pbnRlcmVzdF9vcmllbnRhdGlvbjpleHBfb3Blbl9ib3RoLGNsb3NlX3BlcnNvbmFsX3JlY29tbWVuZF8yMDI1OmV4cF9vcGVuX2FsbF8wMjI4LFJUQV9ESVZJREVfRVhQX1RBR183MzE6cnRhX2RpdmlkZV9leHBfNzMxXzMsbm9fYWRfc2V0OmJhc2UsUlRBX0RJVklERV9FWFBfVEFHXzg1NTpydGFfZGl2aWRlX2V4cF84NTVfNyxhY2NvdW50X2V4cGxvcmVfc2hvd19saW1pdDpkZWZhdWx0LGZseV9nb29kc19jb21tZW50X3VybDpibHVlbGlua19yZXBsYWNlXzA1LG9yZGVyX2xhcmdlOmRlbGF5MSxlY3BtX3RocmVzaG9sZF9sYXllcjowOCxyZWNhbGxfdW5pdF9saW1pdDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR182NDA6cnRhX2RpdmlkZV9leHBfNjQwXzE2LGRhaWh1b1doaXRlQ29uZjp3aGl0ZV8yNDEyMDJfNSxSVEFfRElWSURFX0VYUF9UQUdfODgzOnJ0YV9kaXZpZGVfZXhwXzg4M181LGVuYWJsZUlubGluZUV4cDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR184ODg6cnRhX2RpdmlkZV9leHBfODg4XzIsaWFhX3VuaXRfZWE6ZXhwMSxTbWFsbEJ1ZGdldFRvbGVyYXRlOmV4cF83MixhdXRvX2FkX2Fzc2lzdDpiYXNlLG1peGVyX2JyYW5kX29wdDpiYXNlLGxheWVyZWRfYmlkZGluZzpiYXNlMDkyMixzdG9yeVllbGxvd0NhcnROZXc6ZXhwX2Jhc2UyXzAyMTMseHN0X2NodWRpYW46YmFzZSxkdWFuanVfbW9kZWw6ZGVmYXVsdCxnZF9waWQ6ZXhwX3JlYWQsY3BjMV9leHRlbmRlZDpxdW90YV8xMCxicnVzaF9pbm5lcjpiYXNlLHN0b3J5X3N0eWxlX3NlbGVjdDpyYW5kLGVuYWJsZV9wbGF5cGFnZV9pbmxpbmVfd3hfanVtcDpleHBfMDQwOSxkY3ZyZl8yMDI1UTE6cmV2ZXJzZSxmcmVTOmJhc2UsYWR2dl9waWRfZml4OmJhc2UsQ3JlYXRpdmVRdWFsaXR5OmF1dG8sSW5kdXN0cnlCb29zdDpnYW1lbGl2ZSxmbHlfbTppY2ViZXJnX2Jhc2UsZWNwbV9jcm93ZHNfZmlsdGVyOnRlc3QsZ2Rfc2NoZV9yYXRpbzpiYXNlLHRlc3RfbWl4ZXJfY2NkOmJhc2Usa3Vha2VfbW9iaWxlX2FudG91X3BjOmFudG91X3BjLG5ld192aWRlb19ib29zdDpkZWZhdWx0LHVuZGVyZnJhbWVfdWVzY29yZTpiYXNlLEVBX2V4cDpjbG9zZV9lYV8xMjExLGFuY2hvckFwcERvd25sb2FkU3R5bGVFeHA6YmFzZSwyMzI0NDpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR183MDM6cnRhX2RpdmlkZV9leHBfNzAzXzMsZHVhbmp1X21vZGVsX2N0cjpkZWZhdWx0LGNvbG9yX21hc2s6YmFzZSxwdl9hYTpleHBfMSxwY19jbGllbnRfbm9fYWQ6bm9fYWRfYmFzZSxwcm9nQ3JlYVQ6djEuMCxuZWdhdGl2ZV9zdHJhdGVneV90ZXN0OmJhc2UsZW5hYmxlTmF0aXZlRmVlZHNUb1N0b3J5OmV4cF9oYXJkLGx0dl9pbnNfbG9nOmJhc2UxMCxmbHlfYnVfdW5kZXJmcmFtZTpiYXNlLHNwcmluZ2Zlc3RpdmFsX3N0YWJpbGl0eV9pbmR1c3RyeTpiYXNlLGdpZl9leHA6YmFzZSxjYXNlX2ludmVyc3RpZ2F0ZTpiYXNlLHByZXJhbmtfc2RwYTp4c2RqXzAxMTcscmVzZXJ2ZV9wcmljZTpnc3BfYWxsLHBheV83ZF9udW06ZXhwX2dhbWVfMSx0aW1lRnJlcTpkZWZhdWx0LGZyZXFDaGVja0R1cGxpY2F0ZTpiYXNlLFJUQV9ESVZJREVfRVhQX1RBR183MjQ6cnRhX2RpdmlkZV9leHBfNzI0XzMsc3RvcnlGbHlNb2RlbENvbmY6YWRkX2VhX2V4cCxBcHBDb2V4aXN0RmlsdGVyOmNsb3NlLHVzdWFsX2FyZWFzOmJhc2UsYXBwU3RvcmVQcmlvcml0eVhpYW9ndW9BY2NvdW50SWRzOmJhc2UsbWFiaWRfZW5hYmxlOmJhc2VfMDEwOCxSVEFfRElWSURFX0VYUF9UQUdfODM2OnJ0YV9kaXZpZGVfZXhwXzgzNl8xMCxzb2Z0X2FkOjEyLHN0b3J5X3BsYXkzc190b3VjaF9yYXRpbzpyYXRpb18xMDAsZHVhbmp1X3JldGFyZ2V0OmJhc2UsUlRBX0RJVklERV9FWFBfVEFHXzEwMzc6cnRhX2RpdmlkZV9leHBfMTAzN181LGNhdGVnb3J5X3YzOmJhc2UsaWFhM19vdXRfdXBfYWRzOmV4cF9pYWFfb3V0X3VwLHByb2dDcmVhUmFuZG9tXzE6YmFzZV9tb2RlbDAzMTksZmx5X3lzYW50b3U6YmFzZV8wODIxLGZseV9jdHJfaW5saW5lX3RhcmdldDpjbG9zZSx0ZW1wbGF0ZV9maXg6YmFzZSxicmFuZER5bmFtaWNDYXJkSW5kZXhFeHA6ZXhwLGlubGluZUVjcG06ZGVmYXVsdCxmb3JjZUV4cG9zdXJlLWNhc3Npbmk6ZGFpaHVvX29wZW5fMjMxMTAxLHNwbGFzaF9uZXdfc3R5bGVfZmlsdGVyOmRlZmF1bHQsc2VhcmNoX3RyaXRvbjpiYXNlLGN2cl9mOmluZHVzdHJ5X29wdF9leHAsaW5uZXJfb3ZlcmxvYWRfY3RybDpkZWZhdWx0LHVnX3VuaXRfbGltaXQ6ZXhwLGNsZWFuX3Nsb3Q1MHA6ZXhwLG1lcmdlX2ZpbHRlcjplbmFibGVfc3luY19wcmltYXJ5X2ZpbHRlcixoeV9hcnB1X3JvdXRlX3NwbGl0OnN0YWxsX29yX3VuZGVsZXRlZF9mZWFzX2V4cCwxNTA2OmJhc2UsZ2RGZWVkc0VuYWJsZUJydXNoOmJhc2UsaW5saW5lX2Zsb3dfbm9fYWQ6YmFzZSxlbmFibGVfbGFuY2VyX3JlY29yZF9kbXNfZmVhdHVyZTowNDE0X3Rlc3QsdW5kZXJmcmFtZV9tYXJrX3N3dGljaDpleHAxXzA0MDksQWlFeHBQbGF5UGFnZTpiYXNlXzAsMjRoX3JvaV9hcnB1OmJhc2UzLG9wZW5QcmV2aWV3OmV4cDIsZ3NwX2V4cDpzZWFyY2hfZGVmYXVsdCxydW5uaW5nX29jcGM6YmFzZSxmbHlfcmFua19jb25mX21lcmdlOmJhc2UsbHRyQXBwTG9nOmNscyxzZWFyY2hfYWRzX3F1ZXJ5X3Jld3JpdGU6Y29tYmluZV9leHAxLHJhbmtfZGl2XzE6ZGVmYXVsdCx1bmRlcmZyYW1lX2Rvd25sb2FkX2FkYnV0dG9uOmJhc2UsQnNPZmZsaW5lTG9jYWxDcGFDb25maWdOZXc6ZGVmYXVsdCx1cFNwYWNlQ2hlY2tEaWZmUmF0aW9FeHA6ZXhwX21icyxzcGxhc2hfaW50ZXJmYWNlX2Rvd25ncmFkZTpiYXNlLGZvcmJpZGRlbl9kaXJlY3RfanVtcDpiYXNlLG1pbmlnYW1lX2JvbnVzX2V4cDpyZW1haW4sZW5hYmxlQXBwc3RvcmVEaXJlY3Q6ZXhwXzEsZnJlcV9pbmZvX3JvdXRpbmc6c2hqZF9zeWNwYl9mcmVxX3Rhc2tfY2x1c3Rlcl8xLHNlYXJjaF9hZHNfbWluX2JpZDpkZWZhdWx0LG9wZW5OZXdHZFByZXZpZXc6ZXhwLGRpc2FibGVfaWxsZWdhbF9vbmVfanVtcDpiYXNlLGNvYXJzZV9xdW90YV9jb250cm9sOmJhc2VfMDMyNCxmbHlfZHluYW1pY0FudG91OmJhc2UsQWlFeHBTdG9yeTpiYXNlLGRwYTJSZWNhbGw6Y2hvb3NlX3Byb2R1Y3RzX2Jhc2VfNTAsc2VhcmNoX25ld190YXJnZXRpbmc6YmFzZSxlbmFibGVfbW9kZWxfZGV0YWlsX3RyYWNrZXI6YmFzZSxEcGEyQ1ZSVGhyZXNob2xkOmpkX2N2cl8yMDAsY3RyX3RfZXhwOnQxLjAscGNTZWFyY2g6ZXhwLGVjb21fbWFpbl9zZWFyY2g65a+554Wn57uELGNvYXJzZTpjb2Fyc2VfY3ZyX25ld2NvbnYsZnJlcV9taWdyYXRlOmV4cF9lbmdpbmVfd2l0aF9zdHJpY3RfYnJ1c2g1LHN3aXRjaEJzUGdSZXFSYXRpbzpjbG9zZSxzZWFyY2hfcmVhbHRpbWVfdHJpZ2dlcjpjb25zdGFudCxBaUV4cEZlZWRzOmJhc2UsbWJzX3JlZmFjdG9yOmV4cDIsdWVzX3NlYXJjaDpkZWZhdWx0LHVuZGVyZnJhbWVfbXVsdGlfYWRzOmJhc2UsYWlnY19hbnRvdV9pbWFnZTpiYXNlXzAzMjYsbWl4ZXJfZnVzaW9uX2RpbWVuc2lvbjpnMixyb2xsb3V0X2xpc3R3aXNlX2Jpem1peGVyX2J1Z19maXg6YmFzZSx1c2VCc0ZpbmRhOmZpbmRhX3gsZmx5X3B1cF9lY3BtOmNvbnN0YW50LGZseV9jdHJfaW5saW5lOm1vZGVsLHRlc3RfcGVnYXN1c19wb3M6YmFzZSx0ZXN0X3N0b3J5X3BhY2s6ZXhwIDIsc3RvcnlfYWRsb2FkXzM6MTQsc2RwYV9kaXZlcnNpZnk6Y29uc3RhbnQyLG1pbmlfZ2FtZV9zY2VuZTpiYXNlLGN0cl9kaWx1Y19lbWJfbGF5ZXI6ZXhwcl9lbWJfZGlsdWMscm9pX2J4aWFveW91X25ldzpkZWZhdWx0LEluZHVzdHJ5Tm9UYXJnZXRGaWx0ZXJMYXllcjpleHAsY3JlYXRpdmVfYXZpZF90YWIzOmV4cF8wNTI3LHN0eWxlX2FiaWxpdHlfb2ZmbGluZTpiYXNlLHVuZGVyZnJhbWVfYnJhbmRfaGlnaDpiYXNlLGNyb3dkX2VjcGM6b3Blbl92Mix0c21fdjJfbGF5ZXI6YmFzZSxtaXhlcl9saXN0d2lzZV9wZWdhc3VzOmc1LHVzZUFzUGc6bWFpbl8yNDEyMjcsc3BsaXRfYnVja2V0OmJ1Y2tldF8zLGdsb2JhbF9yZXZlcnNlOmJhc2UscGxhdGZvcm06ZGVmYXVsdKABALIBICjf18utGMJMWQj0kF8utyJl8gRyHD1TIq1K6aKZR3vRugFCaHR0cHM6Ly9xcnNqLmJpbGlnYW1lLmNvbS9nY3h6L2g1Lz9zb3VyY2VGcm9tPTc3NyZzb3VyY2VUeXBlPWFkUHV0wgEA0gEA2AHQAeABAOgBAPABAIACAogCALgCAMACANACANgCAOoCAPACrIYl+AIAiAMGkgMAqAMAsAMAuAMAwgMAyAMX0gOWAXsiMTYiOiIxMjE1NDYwXzAiLCIxNyI6IjQzMzYiLCIxIjoiMTAxNzg0NjY0OTk1OTc0NzU4NCIsIjIiOiIxMjUyMzkzIiwiMyI6IjEyNTIzOTMiLCI2IjoiMTI1MjM5M18wIiwiMTIiOiI0MzM4IiwiMTMiOiIxMjE1NDYwIiwiMTQiOiI4ODciLCIxNSI6IjEzNjkifeADAOgDAPADAPoDBW90aGVyggQJbnVsbDpudWxsmAQAoAQAqgQECAAQBLAEAOIEwwE1Ni57InBzSWQiOjUyMTE4LCJ2MiI6IkFXVXMyZTBidEhmWTVCSzJ0LUQ0U3lNRGJtN2Z1SGIyYmlIREhsTnBjQlB1U2dVRzdLaW80dUkyNXlSdFJXQU5WUnRMbll1OVpxOElrdkVYZURfUmlER25BeTE0UV9CMlAtSzJmQ3pzMWZLQmY5WjZPUSJ9OzYzLnsicHNJZCI6NTIwNjYsInYyIjoiUWcifTs3MC57InBzSWQiOjUwMDQxLCJ2MiI6IktBIn2gBQDIBQPSBQA=", - "client_ip": "182.89.224.34", - "server_type": 1, - "resource_id": 4336, - "index": 2, - "cm_mark": 1, - "extra": { - "use_ad_web_v2": false, - "show_urls": [ - "" - ], - "click_urls": [], - "download_whitelist": [], - "card": { - "card_type": 0, - "title": "今日全球首发,千件外观福利免费领", - "covers": [ - { - "url": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/bbd7cc4e6a74508e9ccee467541cc06a.jpg", - "loop": 0, - "image_height": 0, - "image_width": 0, - "gif_tag_show": false, - "jump_url": "", - "title": "", - "desc": "" - } - ], - "jump_url": "https://qrsj.biligame.com/gcxz/h5/?sourceFrom=777&sourceType=adPut", - "desc": "", - "callup_url": "", - "long_desc": "", - "ad_tag": "", - "extra_desc": "", - "universal_app": "", - "duration": "", - "adver": { - "adver_id": 1252393, - "adver_type": 3 - }, - "extreme_team_status": false, - "support_transition": false, - "under_player_interaction_style": 0, - "referral_pop_active_time": 10000, - "grade_denominator": 0, - "star_level": 0, - "live_booking_population_threshold": 0, - "ori_mark_hidden": 0, - "use_multi_cover": false, - "custom_feedback_panels": [], - "yellow_cart_pannel_pullup": 0, - "yellow_cart_pannel_version": 0, - "goods_item_id": 0, - "story_interaction_style": 0, - "videos": [], - "download_area": 0, - "goods_pannel_show": 0, - "goods_panel_show": 0, - "show_pop_window": 0, - "search_show_adbutton": 0, - "jump_interaction_style": 0, - "live_page_type": 0, - "ad_tag_style": { - "type": 4, - "text": "", - "text_color": "", - "bg_border_color": "", - "bg_color": "", - "border_color": "", - "img_url": "https://i0.hdslb.com/bfs/sycp/mng/202408/34463051f8d45a6d3c20f8aff31aad9b.png", - "img_height": 48, - "img_width": 72 - }, - "feedback_panel": { - "panel_type_text": "广告", - "feedback_panel_detail": [], - "toast": "将减少相似广告推荐", - "close_rec_tips": "操作成功", - "open_rec_tips": "将减少展示此类广告" - }, - "fold_time": 0, - "live_room_popularity": 0, - "live_tag_show": false, - "quality_infos": [], - "dynamic_text": "今日全球首发,千件外观福利免费领", - "choose_button_list": [], - "grade_level": 0, - "anim_in_enable": 0, - "underframe_card_style": 0, - "playpage_card_style": 0, - "live_auto_play": false, - "original_style_level": 0, - "live_card_show": false, - "enable_tag_move_up": 0, - "item_source": 0, - "closed_loop_item": 0, - "desc_type": 0, - "comment_use_game_page": 0, - "story_takeoff_interaction_style": 0 - }, - "report_time": 2000, - "sales_type": 31, - "special_industry": false, - "preload_landingpage": 0, - "enable_share": true, - "share_info": { - "title": "今日全球首发,千件外观福利免费领", - "subtitle": "", - "image_url": "https://i0.hdslb.com/bfs/sycp/creative_img/202504/3eba2979cb9525f14633a39c9f2ec2ab.jpg" - }, - "upzone_entrance_type": 0, - "upzone_entrance_report_id": 0, - "click_area": 0, - "shop_id": 0, - "up_mid": 0, - "track_id": "pbaes.DXUvRhr8IAhiFZ60KoOBStL0Na80m-kKS6CwFKDBtlzOwGJZu7il0VbEU3j2A_dZ96EXDGonAHs9Qx-5X2XbovyGP-xL4lyr_c_3rDZs4q3frmVjEGhu2VPOE5MRHF3AdryKsZiIGCl_f6ZD0y-cNQ==", - "enable_store_direct_launch": 0, - "enable_double_jump": false, - "from_track_id": "all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "store_callup_card": false, - "enable_h5_alert": false, - "special_industry_style": 0, - "macro_replace_priority": 1, - "feedback_panel_style": 0, - "ad_content_type": 0, - "enable_h5_pre_load": 0, - "hot_activity_id": 0, - "middle_show_urls": [], - "middle_click_urls": [], - "product_id": 0, - "landingpage_download_style": 2, - "download_url_type": 0, - "enable_auto_callup": 0, - "top_live_stay_time_seconds": 0, - "vipshop_fast_framework": 0, - "lottery_id": 0, - "enable_openapk_dialog": false, - "user_cancel_jump_type": 0, - "comment_toast_open": 0, - "comment_biz_type": 0, - "app_exp_params": "{\"pegasus_live_inline_background_fill\":0,\"story_live_goods_card_style\":{\"first_type\":1,\"second_type\":2,\"delay_time\":3000}}" - } - } - }, - { - "card_type": "small_cover_v2", - "card_goto": "av", - "goto": "av", - "param": "114375012651120", - "cover": "http://i1.hdslb.com/bfs/archive/05ec862caac777f9d7d06175becf0413b9c653ee.jpg", - "title": "「小白」红米Turbo 4 Pro 性能体验:首台8sGen4量产机表现如何?", - "uri": "bilibili://video/114375012651120?cid=29550644277&player_height=1890&player_preload=%7B%22expire_time%22%3A1745486594%2C%22cid%22%3A29550644277%2C%22quality%22%3A32%2C%22file_info%22%3A%7B%2216%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A2121663%2C%22timelength%22%3A230900%7D%5D%7D%2C%2232%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A3606019%2C%22timelength%22%3A230900%7D%5D%7D%2C%2264%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A6733527%2C%22timelength%22%3A230900%7D%5D%7D%2C%2280%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A10362311%2C%22timelength%22%3A230900%7D%5D%7D%7D%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22dash%22%3A%7B%22video%22%3A%5B%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F123.184.35.33%3A8000%2Fv1%2Fresource%2F29550644277-1-100047.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D125426%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D158098%5Cu0026tag%3D%5Cu0026traceid%3DtrANPsmzTXNczh_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Cnbs%252Coi%252Cplatform%252Ctrid%252Cmid%252Cdeadline%252Cuipk%252Cgen%252Cos%252Cog%5Cu0026upsig%3Df6ea272dedd17383c1a7c43a39471036%22%2C%22bandwidth%22%3A124895%2C%22codecid%22%3A7%2C%22size%22%3A3606019%2C%22frame_rate%22%3A%2224.991%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026uipk%3D5%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026upsig%3Df6ea272dedd17383c1a7c43a39471036%5Cu0026uparams%3De%2Ctag%2Cnbs%2Coi%2Cplatform%2Ctrid%2Cmid%2Cdeadline%2Cuipk%2Cgen%2Cos%2Cog%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D125426%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026orderid%3D0%2C3%22%2C%22http%3A%2F%2Fupos-sz-estgoss.bilivideo.com%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dupos%5Cu0026og%3Dcos%5Cu0026trid%3D56fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026upsig%3D464e03491d78d3249012e6c9affbb768%5Cu0026uparams%3De%2Ctag%2Cgen%2Cos%2Cog%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Coi%2Cuipk%2Cplatform%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D125426%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026orderid%3D1%2C3%22%5D%2C%22audio_id%22%3A30216%7D%2C%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F59.47.230.23%3A8000%2Fv1%2Fresource%2F29550644277-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D131973%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D2d5ae2%5Cu0026tag%3D%5Cu0026traceid%3DtrQICyqgrXBqnY_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cnbs%252Coi%252Cuipk%252Cmid%252Cdeadline%252Cog%252Cplatform%252Ctrid%252Ctag%252Cgen%252Cos%5Cu0026upsig%3D855d6f99090897394e531af9d9cc6dc8%22%2C%22bandwidth%22%3A131411%2C%22codecid%22%3A12%2C%22size%22%3A3794237%2C%22frame_rate%22%3A%2224.991%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2F122.191.18.170%3A8000%2Fv1%2Fresource%2F29550644277-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D131973%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dcoso1bv%5Cu0026platform%3Dandroid%5Cu0026sign%3D2d5ae2%5Cu0026tag%3D%5Cu0026traceid%3DtrxqpZsZboLcyN_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Cplatform%252Ctag%252Cos%252Cog%252Cnbs%252Coi%252Ctrid%252Cmid%252Cdeadline%252Cgen%5Cu0026upsig%3D42f974aacd3f2a9a6ba659f11e469614%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30033.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026og%3Dcos%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026upsig%3D855d6f99090897394e531af9d9cc6dc8%5Cu0026uparams%3De%2Cnbs%2Coi%2Cuipk%2Cmid%2Cdeadline%2Cog%2Cplatform%2Ctrid%2Ctag%2Cgen%2Cos%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D131973%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026orderid%3D0%2C3%22%5D%2C%22audio_id%22%3A30216%7D%5D%2C%22audio%22%3A%5B%7B%22id%22%3A30216%2C%22base_url%22%3A%22http%3A%2F%2F121.31.234.218%3A8000%2Fv1%2Fresource%2F29550644277-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43505%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3Db0263a%5Cu0026tag%3D%5Cu0026traceid%3DtrDHNJjmfaaueG_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Ctrid%252Cmid%252Cdeadline%252Cnbs%252Cgen%252Coi%252Cuipk%252Ctag%252Cos%252Cog%5Cu0026upsig%3De92887e43514a81bad4594c670c509d1%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250775%2C%22backup_url%22%3A%5B%22http%3A%2F%2F211.141.225.131%3A8000%2Fv1%2Fresource%2F29550644277-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43505%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3D08hbv%5Cu0026platform%3Dandroid%5Cu0026sign%3Db0263a%5Cu0026tag%3D%5Cu0026traceid%3DtrnTeKCShifUBc_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cgen%252Cog%252Cdeadline%252Ctag%252Cnbs%252Cplatform%252Ctrid%252Cos%252Cmid%252Coi%252Cuipk%5Cu0026upsig%3D313f602e2d41ebe9637a95fc20bceb93%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30216.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026gen%3Dplayurlv3%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026tag%3D%5Cu0026os%3Dmcdn%5Cu0026og%3Dhw%5Cu0026upsig%3De92887e43514a81bad4594c670c509d1%5Cu0026uparams%3De%2Cplatform%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Cgen%2Coi%2Cuipk%2Ctag%2Cos%2Cog%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43505%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30280%2C%22base_url%22%3A%22http%3A%2F%2F211.97.94.165%3A8000%2Fv1%2Fresource%2F29550644277-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D3f3ed4%5Cu0026tag%3D%5Cu0026traceid%3DtrQHmKzoFdDeCw_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Ctag%252Cnbs%252Cgen%252Cos%252Cog%252Coi%252Cplatform%252Ctrid%252Cmid%252Cdeadline%5Cu0026upsig%3D808cd1429841f75b1ccd7ccdc5de7bc3%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250767%2C%22backup_url%22%3A%5B%22http%3A%2F%2F123.184.35.19%3A8000%2Fv1%2Fresource%2F29550644277-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dupos%5Cu0026platform%3Dandroid%5Cu0026sign%3D3f3ed4%5Cu0026tag%3D%5Cu0026traceid%3DtrtSntUkmmkWVz_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Ctag%252Cnbs%252Cog%252Ctrid%252Cmid%252Cdeadline%252Coi%252Cuipk%252Cgen%252Cos%5Cu0026upsig%3D070e2e2176dd7e2d87777b20161c8d1f%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30280.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026uipk%3D5%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026upsig%3D808cd1429841f75b1ccd7ccdc5de7bc3%5Cu0026uparams%3De%2Cuipk%2Ctag%2Cnbs%2Cgen%2Cos%2Cog%2Coi%2Cplatform%2Ctrid%2Cmid%2Cdeadline%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43504%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30232%2C%22base_url%22%3A%22http%3A%2F%2F125.106.124.64%3A8000%2Fv1%2Fresource%2F29550644277-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50007224%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D3ad163%5Cu0026tag%3D%5Cu0026traceid%3DtrsSvqSMaoCcOa_1_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Cuipk%252Cgen%252Cos%252Cog%252Ctrid%252Cmid%252Cdeadline%252Cnbs%252Coi%252Cplatform%5Cu0026upsig%3D219bdbd1641753ddc8555f788bc21711%22%2C%22bandwidth%22%3A43292%2C%22size%22%3A1250767%2C%22backup_url%22%3A%5B%22http%3A%2F%2F220.200.12.159%3A5889%2Fv1%2Fresource%2F29550644277-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D43504%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3D08hbv%5Cu0026platform%3Dandroid%5Cu0026sign%3D3ad163%5Cu0026tag%3D%5Cu0026traceid%3DtrQVqwCtxAuTKK_2_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctag%252Coi%252Ctrid%252Cdeadline%252Cgen%252Cos%252Cnbs%252Cuipk%252Cplatform%252Cmid%252Cog%5Cu0026upsig%3Dc45e0be8a46a1b1456b066fc447dcf4a%22%2C%22http%3A%2F%2F211.141.224.92%3A4480%2Fupgcxcode%2F77%2F42%2F29550644277%2F29550644277-1-30232.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026tag%3D%5Cu0026uipk%3D5%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dhw%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026platform%3Dandroid%5Cu0026upsig%3D219bdbd1641753ddc8555f788bc21711%5Cu0026uparams%3De%2Ctag%2Cuipk%2Cgen%2Cos%2Cog%2Ctrid%2Cmid%2Cdeadline%2Cnbs%2Coi%2Cplatform%5Cu0026mcdnid%3D50007224%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D43504%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%5D%7D%2C%22fnval%22%3A272%2C%22accept_formats%22%3A%5B%7B%22quality%22%3A116%2C%22format%22%3A%22flv_p60%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P60%22%2C%22new_description%22%3A%221080P%2060%E5%B8%A7%22%2C%22display_desc%22%3A%221080P%22%2C%22superscript%22%3A%2260%E5%B8%A7%22%2C%22need_vip%22%3Atrue%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A80%2C%22format%22%3A%22flv%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P%22%2C%22new_description%22%3A%221080P%20%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%221080P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A64%2C%22format%22%3A%22flv720%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%20720P%22%2C%22new_description%22%3A%22720P%20%E5%87%86%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%22720P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A32%2C%22format%22%3A%22flv480%22%2C%22description%22%3A%22%E6%B8%85%E6%99%B0%20480P%22%2C%22new_description%22%3A%22480P%20%E6%A0%87%E6%B8%85%22%2C%22display_desc%22%3A%22480P%22%7D%2C%7B%22quality%22%3A16%2C%22format%22%3A%22mp4%22%2C%22description%22%3A%22%E6%B5%81%E7%95%85%20360P%22%2C%22new_description%22%3A%22360P%20%E6%B5%81%E7%95%85%22%2C%22display_desc%22%3A%22360P%22%7D%5D%2C%22volume%22%3A%7B%22measured_i%22%3A-18.2%2C%22measured_lra%22%3A5.9%2C%22measured_tp%22%3A-1.3%2C%22measured_threshold%22%3A-28.3%2C%22target_offset%22%3A0.5%2C%22target_i%22%3A-14%2C%22target_tp%22%3A-1%2C%22multi_scene_args%22%3A%7B%22high_dynamic_target_i%22%3A%22-24%22%2C%22normal_target_i%22%3A%22-14%22%2C%22undersized_target_i%22%3A%22-28%22%7D%7D%2C%22union_player%22%3A%7B%22biz_type%22%3A1%2C%22dimension%22%3A%7B%22width%22%3A4096%2C%22height%22%3A1890%7D%2C%22aid%22%3A114375012651120%7D%2C%22auto_qn_ctl%22%3A%7B%22login_half%22%3A32%2C%22nologin_half%22%3A32%2C%22login_full%22%3A80%2C%22nologin_full%22%3A32%2C%22mobile_login_full%22%3A80%2C%22mobile_nologin_full%22%3A32%7D%2C%22qn_exp%22%3A%7B%22qn_exp_1%22%3Atrue%7D%7D&player_rotate=0&player_width=4096&report_flow_data=%7B%22flow_card_type%22%3A%22av%22%2C%22flow_source%22%3A%22click_u2i%24ann_dssm_u2i_28d%24dssm_u2u%22%7D&trackid=all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "three_point": { - "dislike_reasons": [ - { - "id": 4, - "name": "UP主:小白测评", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:骁龙8s Gen4", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "这个内容", - "toast": "将减少相似内容推荐" - } - ], - "feedbacks": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "watch_later": 1 - }, - "args": { - "up_id": 8969156, - "up_name": "小白测评", - "tid": 74460002, - "tname": "骁龙8s Gen4", - "aid": 114375012651120 - }, - "player_args": { - "aid": 114375012651120, - "cid": 29550644277, - "type": "av", - "duration": 231 - }, - "idx": 1745482990, - "three_point_v2": [ - { - "title": "添加至稍后再看", - "type": "watch_later", - "icon": "https://i0.hdslb.com/bfs/activity-plat/static/20240103/0977767b2e79d8ad0a36a731068a83d7/8VhmmUeWnO.png", - "icon_night": "https://i0.hdslb.com/bfs/activity-plat/static/20240103/0977767b2e79d8ad0a36a731068a83d7/eIyDu5U7GA.png" - }, - { - "title": "反馈", - "subtitle": "(选择后将优化首页此类内容)", - "reasons": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "type": "feedback" - }, - { - "title": "我不想看", - "subtitle": "(选择后将减少相似内容推荐)", - "reasons": [ - { - "id": 4, - "name": "UP主:小白测评", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:骁龙8s Gen4", - "toast": "将减少相似内容推荐", - "extend": "{\"tid\":\"74460002\"}" - }, - { - "id": 3, - "name": "频道:科技猎手2025·1.0计划", - "toast": "将减少相似内容推荐", - "extend": "{\"tid\":\"74338017\"}" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "这个内容", - "toast": "将减少相似内容推荐" - } - ], - "type": "dislike" - } - ], - "track_id": "all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "talk_back": "视频,「小白」红米Turbo 4 Pro 性能体验:首台8sGen4量产机表现如何?,39.5万观看,1654弹幕,时长3分钟51秒,UP主小白测评,", - "report_flow_data": "{\"flow_card_type\":\"av\",\"flow_source\":\"click_u2i$ann_dssm_u2i_28d$dssm_u2u\"}", - "three_point_v": "v2", - "cover_left_text_1": "39.5万", - "cover_left_icon_1": 1, - "cover_left_1_content_description": "39.5万观看", - "cover_left_text_2": "1654", - "cover_left_icon_2": 3, - "cover_left_2_content_description": "1654弹幕", - "cover_right_text": "3:51", - "cover_right_content_description": "3分钟51秒", - "desc_button": { - "text": "小白测评", - "uri": "bilibili://space/8969156", - "event": "nickname", - "type": 1 - }, - "official_icon": 16, - "can_play": 1, - "goto_icon": { - "icon_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/077GOeHOfO.png", - "icon_night_url": "https://i0.hdslb.com/bfs/activity-plat/static/20230227/0977767b2e79d8ad0a36a731068a83d7/ldbCXtkoK2.png", - "icon_width": 16, - "icon_height": 16 - }, - "cover_info_priority": 123 - }, - { - "type": "static", - "resource_id": 4336, - "id": 1674583, - "index": 3, - "static_banner": { - "id": 1674583, - "title": "神舟二十号载人飞船今日发射", - "image": "http://i0.hdslb.com/bfs/banner/3d3f17726926194173a2db2a68ff51fbe1081458.jpg", - "hash": "e39cbd594c34ac3a0ec12a45dd6db0b5", - "uri": "https://live.bilibili.com/21686237", - "request_id": "1745482994326q172a27a87a21q3087", - "src_id": 4339, - "is_ad_loc": true, - "client_ip": "182.89.224.34", - "server_type": 0, - "resource_id": 4336, - "index": 3, - "cm_mark": 0 - } - } - ] - }, - { - "card_type": "small_cover_v2", - "card_goto": "av", - "goto": "av", - "param": "114369442680801", - "cover": "http://i1.hdslb.com/bfs/archive/13d3bace40c362db92d5752aef3ebce24bbcbea3.jpg", - "title": "【仿】《明日方舟》六周年庆典活动宣传PV", - "uri": "bilibili://video/114369442680801?cid=29516958739&player_height=1080&player_preload=%7B%22expire_time%22%3A1745486594%2C%22cid%22%3A29516958739%2C%22quality%22%3A32%2C%22file_info%22%3A%7B%2216%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A8427938%2C%22timelength%22%3A239258%7D%5D%7D%2C%2232%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A14979728%2C%22timelength%22%3A239238%7D%5D%7D%2C%2264%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A28834092%2C%22timelength%22%3A239238%7D%5D%7D%2C%2280%22%3A%7B%22infos%22%3A%5B%7B%22filesize%22%3A48620682%2C%22timelength%22%3A239238%7D%5D%7D%7D%2C%22video_codecid%22%3A7%2C%22video_project%22%3Atrue%2C%22dash%22%3A%7B%22video%22%3A%5B%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F118.184.254.3%3A4480%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026gen%3Dplayurlv3%5Cu0026tag%3D%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026upsig%3D83d78984e6c66cf9fb8f44e16af524dc%5Cu0026uparams%3De%2Cnbs%2Coi%2Cuipk%2Cplatform%2Cgen%2Ctag%2Ctrid%2Cmid%2Cdeadline%2Cos%2Cog%5Cu0026mcdnid%3D50021694%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D501413%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%2C%22bandwidth%22%3A500862%2C%22codecid%22%3A7%2C%22size%22%3A14979728%2C%22frame_rate%22%3A%2229.966%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2Fupos-sz-estgoss.bilivideo.com%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026trid%3D56fb961696ed4d6bb208acb9ce431b1U%5Cu0026os%3Dupos%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026mid%3D479396940%5Cu0026deadline%3D1745490194%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026nbs%3D1%5Cu0026upsig%3D4a9372dc47ff187acaddd4b1bb7ff762%5Cu0026uparams%3De%2Ctrid%2Cos%2Cog%2Coi%2Cuipk%2Cplatform%2Cmid%2Cdeadline%2Ctag%2Cgen%2Cnbs%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D501413%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026orderid%3D1%2C3%22%2C%22http%3A%2F%2Fupos-sz-estgoss.bilivideo.com%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-100047.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026deadline%3D1745490194%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dupos%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026trid%3D56fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026og%3Dcos%5Cu0026upsig%3Df4d94d26f589bd25736ae575f46117cb%5Cu0026uparams%3De%2Cdeadline%2Cgen%2Cos%2Coi%2Cuipk%2Cplatform%2Ctrid%2Cmid%2Ctag%2Cnbs%2Cog%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D501413%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D2%2C3%22%5D%2C%22audio_id%22%3A30216%7D%2C%7B%22id%22%3A32%2C%22base_url%22%3A%22http%3A%2F%2F123.184.30.75%3A8000%2Fv1%2Fresource%2F29516958739-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D261105%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50021694%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3D6c5944%5Cu0026tag%3D%5Cu0026traceid%3DtrrIoIfTKBmhJG_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cnbs%252Cgen%252Cos%252Cog%252Cplatform%252Ctrid%252Cmid%252Ctag%252Coi%252Cuipk%252Cdeadline%5Cu0026upsig%3D20c184de73caf9072d6615826d43a023%22%2C%22bandwidth%22%3A260788%2C%22codecid%22%3A12%2C%22size%22%3A7800527%2C%22frame_rate%22%3A%2229.966%22%2C%22backup_url%22%3A%5B%22http%3A%2F%2F123.184.30.71%3A8000%2Fv1%2Fresource%2F29516958739-1-30033.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D261105%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dcoso1bv%5Cu0026platform%3Dandroid%5Cu0026sign%3D6c5944%5Cu0026tag%3D%5Cu0026traceid%3DtrKFqEZMFxtfGx_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Cnbs%252Ctrid%252Cmid%252Cdeadline%252Ctag%252Coi%252Cuipk%252Cgen%252Cos%252Cog%5Cu0026upsig%3D026e2862050e3c63ac42d8c153b140bd%22%2C%22http%3A%2F%2F118.184.254.3%3A4480%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-30033.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026nbs%3D1%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026og%3Dcos%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026tag%3D%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026deadline%3D1745490194%5Cu0026upsig%3D20c184de73caf9072d6615826d43a023%5Cu0026uparams%3De%2Cnbs%2Cgen%2Cos%2Cog%2Cplatform%2Ctrid%2Cmid%2Ctag%2Coi%2Cuipk%2Cdeadline%5Cu0026mcdnid%3D50021694%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D261105%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026orderid%3D0%2C3%22%5D%2C%22audio_id%22%3A30216%7D%5D%2C%22audio%22%3A%5B%7B%22id%22%3A30216%2C%22base_url%22%3A%22http%3A%2F%2F183.229.247.224%3A6809%2Fv1%2Fresource%2F29516958739-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D57268%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50021694%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3Dc6f08b%5Cu0026tag%3D%5Cu0026traceid%3DtrOVFXiUwisFJo_1_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctrid%252Cdeadline%252Ctag%252Cos%252Cog%252Cnbs%252Coi%252Cuipk%252Cplatform%252Cmid%252Cgen%5Cu0026upsig%3D65fa2495f72b1652c93ae3e8ed18f2f6%22%2C%22bandwidth%22%3A57154%2C%22size%22%3A1710889%2C%22backup_url%22%3A%5B%22http%3A%2F%2F123.138.84.79%3A8000%2Fv1%2Fresource%2F29516958739-1-30216.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D57268%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3D08hbv%5Cu0026platform%3Dandroid%5Cu0026sign%3Dc6f08b%5Cu0026tag%3D%5Cu0026traceid%3DtrZvPCHsGisbaS_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cnbs%252Coi%252Cplatform%252Cmid%252Cgen%252Cos%252Cog%252Cdeadline%252Ctag%252Cuipk%252Ctrid%5Cu0026upsig%3Dc6eeb5169558ca73c36ff87b7925515c%22%2C%22http%3A%2F%2F118.184.254.3%3A4480%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-30216.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026deadline%3D1745490194%5Cu0026tag%3D%5Cu0026os%3Dmcdn%5Cu0026og%3Dhw%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026uipk%3D5%5Cu0026platform%3Dandroid%5Cu0026mid%3D479396940%5Cu0026gen%3Dplayurlv3%5Cu0026upsig%3D65fa2495f72b1652c93ae3e8ed18f2f6%5Cu0026uparams%3De%2Ctrid%2Cdeadline%2Ctag%2Cos%2Cog%2Cnbs%2Coi%2Cuipk%2Cplatform%2Cmid%2Cgen%5Cu0026mcdnid%3D50021694%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D57268%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30280%2C%22base_url%22%3A%22http%3A%2F%2F125.74.62.233%3A8000%2Fv1%2Fresource%2F29516958739-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D201462%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50021694%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3Db1164b%5Cu0026tag%3D%5Cu0026traceid%3DtrkxYWIjABzQnP_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Ctrid%252Cmid%252Cnbs%252Cog%252Coi%252Cdeadline%252Ctag%252Cgen%252Cos%252Cplatform%5Cu0026upsig%3D5f5a3ee9562beef98824c40a28a6cf00%22%2C%22bandwidth%22%3A201184%2C%22size%22%3A6018701%2C%22backup_url%22%3A%5B%22http%3A%2F%2F118.182.248.130%3A8000%2Fv1%2Fresource%2F29516958739-1-30280.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D201462%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dcoso1bv%5Cu0026platform%3Dandroid%5Cu0026sign%3Db1164b%5Cu0026tag%3D%5Cu0026traceid%3DtrLzIEoLxgCnJA_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Ctrid%252Cog%252Cnbs%252Coi%252Cuipk%252Cdeadline%252Cgen%252Cos%252Ctag%252Cplatform%252Cmid%5Cu0026upsig%3D67dde445db5a37fb52a4bcf508e81318%22%2C%22http%3A%2F%2F118.184.254.3%3A4480%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-30280.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026uipk%3D5%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026og%3Dcos%5Cu0026oi%3D3059343394%5Cu0026deadline%3D1745490194%5Cu0026tag%3D%5Cu0026gen%3Dplayurlv3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026upsig%3D5f5a3ee9562beef98824c40a28a6cf00%5Cu0026uparams%3De%2Cuipk%2Ctrid%2Cmid%2Cnbs%2Cog%2Coi%2Cdeadline%2Ctag%2Cgen%2Cos%2Cplatform%5Cu0026mcdnid%3D50021694%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D201462%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026f%3DU_0_0%5Cu0026orderid%3D0%2C3%22%5D%7D%2C%7B%22id%22%3A30232%2C%22base_url%22%3A%22http%3A%2F%2F218.200.4.197%3A6768%2Fv1%2Fresource%2F29516958739-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D107268%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mcdnid%3D50021694%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D0%252C3%5Cu0026os%3Dmcdn%5Cu0026platform%3Dandroid%5Cu0026sign%3Df944bf%5Cu0026tag%3D%5Cu0026traceid%3DtrxuDVFEVzmgrz_1_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cuipk%252Cgen%252Cplatform%252Ctrid%252Cmid%252Ctag%252Cnbs%252Coi%252Cog%252Cdeadline%252Cos%5Cu0026upsig%3Db3eef15ee3382742abc7374c9113a398%22%2C%22bandwidth%22%3A107097%2C%22size%22%3A3204643%2C%22backup_url%22%3A%5B%22http%3A%2F%2F123.184.35.27%3A8000%2Fv1%2Fresource%2F29516958739-1-30232.m4s%3Fagrr%3D1%5Cu0026build%3D8410300%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026bvc%3Dvod%5Cu0026bw%3D107268%5Cu0026deadline%3D1745490194%5Cu0026dl%3D0%5Cu0026e%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026f%3DU_0_0%5Cu0026gen%3Dplayurlv3%5Cu0026mid%3D479396940%5Cu0026nbs%3D1%5Cu0026nettype%3D0%5Cu0026og%3Dhw%5Cu0026oi%3D3059343394%5Cu0026orderid%3D1%252C3%5Cu0026os%3Dcoso1bv%5Cu0026platform%3Dandroid%5Cu0026sign%3Df944bf%5Cu0026tag%3D%5Cu0026traceid%3DtrEEpUqSymBxaq_0_U_a%5Cu0026uipk%3D5%5Cu0026uparams%3De%252Cplatform%252Cmid%252Cdeadline%252Ctag%252Coi%252Ctrid%252Cnbs%252Cuipk%252Cgen%252Cos%252Cog%5Cu0026upsig%3D3727194e76cf963df693733c2427f660%22%2C%22http%3A%2F%2F118.184.254.3%3A4480%2Fupgcxcode%2F39%2F87%2F29516958739%2F29516958739-1-30232.m4s%3Fe%3Dig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEuENvNC8aNEVEtEvE9IMvXBvE2ENvNCImNEVEIj0Y2J_aug859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859IB_%5Cu0026uipk%3D5%5Cu0026gen%3Dplayurlv3%5Cu0026platform%3Dandroid%5Cu0026trid%3D000056fb961696ed4d6bb208acb9ce431b1U%5Cu0026mid%3D479396940%5Cu0026tag%3D%5Cu0026nbs%3D1%5Cu0026oi%3D3059343394%5Cu0026og%3Dhw%5Cu0026deadline%3D1745490194%5Cu0026os%3Dmcdn%5Cu0026upsig%3Db3eef15ee3382742abc7374c9113a398%5Cu0026uparams%3De%2Cuipk%2Cgen%2Cplatform%2Ctrid%2Cmid%2Ctag%2Cnbs%2Coi%2Cog%2Cdeadline%2Cos%5Cu0026mcdnid%3D50021694%5Cu0026bvc%3Dvod%5Cu0026nettype%3D0%5Cu0026bw%3D107268%5Cu0026f%3DU_0_0%5Cu0026agrr%3D1%5Cu0026buvid%3DXY6CBD464C1BC5767CE40A77F12B89222B6E7%5Cu0026build%3D8410300%5Cu0026dl%3D0%5Cu0026orderid%3D0%2C3%22%5D%7D%5D%7D%2C%22fnval%22%3A272%2C%22accept_formats%22%3A%5B%7B%22quality%22%3A112%2C%22format%22%3A%22hdflv2%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P%2B%22%2C%22new_description%22%3A%221080P%20%E9%AB%98%E7%A0%81%E7%8E%87%22%2C%22display_desc%22%3A%221080P%22%2C%22superscript%22%3A%22%E9%AB%98%E7%A0%81%E7%8E%87%22%2C%22need_vip%22%3Atrue%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A80%2C%22format%22%3A%22flv%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%201080P%22%2C%22new_description%22%3A%221080P%20%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%221080P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A64%2C%22format%22%3A%22flv720%22%2C%22description%22%3A%22%E9%AB%98%E6%B8%85%20720P%22%2C%22new_description%22%3A%22720P%20%E5%87%86%E9%AB%98%E6%B8%85%22%2C%22display_desc%22%3A%22720P%22%2C%22need_login%22%3Atrue%7D%2C%7B%22quality%22%3A32%2C%22format%22%3A%22flv480%22%2C%22description%22%3A%22%E6%B8%85%E6%99%B0%20480P%22%2C%22new_description%22%3A%22480P%20%E6%A0%87%E6%B8%85%22%2C%22display_desc%22%3A%22480P%22%7D%2C%7B%22quality%22%3A16%2C%22format%22%3A%22mp4%22%2C%22description%22%3A%22%E6%B5%81%E7%95%85%20360P%22%2C%22new_description%22%3A%22360P%20%E6%B5%81%E7%95%85%22%2C%22display_desc%22%3A%22360P%22%7D%5D%2C%22volume%22%3A%7B%22measured_i%22%3A-10.8%2C%22measured_lra%22%3A8.6%2C%22measured_tp%22%3A3.5%2C%22measured_threshold%22%3A-21%2C%22target_offset%22%3A-1.1%2C%22target_i%22%3A-14%2C%22target_tp%22%3A-1%2C%22multi_scene_args%22%3A%7B%22high_dynamic_target_i%22%3A%22-24%22%2C%22normal_target_i%22%3A%22-14%22%2C%22undersized_target_i%22%3A%22-28%22%7D%7D%2C%22union_player%22%3A%7B%22biz_type%22%3A1%2C%22dimension%22%3A%7B%22width%22%3A1920%2C%22height%22%3A1080%7D%2C%22aid%22%3A114369442680801%7D%2C%22auto_qn_ctl%22%3A%7B%22login_half%22%3A32%2C%22nologin_half%22%3A32%2C%22login_full%22%3A80%2C%22nologin_full%22%3A32%2C%22mobile_login_full%22%3A80%2C%22mobile_nologin_full%22%3A32%7D%2C%22qn_exp%22%3A%7B%22qn_exp_1%22%3Atrue%7D%7D&player_rotate=0&player_width=1920&report_flow_data=%7B%22flow_card_type%22%3A%22av%22%2C%22flow_source%22%3A%22dssm_u2u%22%7D&trackid=all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "three_point": { - "dislike_reasons": [ - { - "id": 4, - "name": "UP主:罗德岛蜜饼工坊", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:明日方舟UP主应援计划 – 离解复合", - "toast": "将减少相似内容推荐" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "这个内容", - "toast": "将减少相似内容推荐" - } - ], - "feedbacks": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "watch_later": 1 - }, - "args": { - "up_id": 8412516, - "up_name": "罗德岛蜜饼工坊", - "tid": 74654031, - "tname": "明日方舟UP主应援计划 – 离解复合", - "aid": 114369442680801 - }, - "player_args": { - "aid": 114369442680801, - "cid": 29516958739, - "type": "av", - "duration": 240 - }, - "idx": 1745482982, - "three_point_v2": [ - { - "title": "添加至稍后再看", - "type": "watch_later", - "icon": "https://i0.hdslb.com/bfs/activity-plat/static/20240103/0977767b2e79d8ad0a36a731068a83d7/8VhmmUeWnO.png", - "icon_night": "https://i0.hdslb.com/bfs/activity-plat/static/20240103/0977767b2e79d8ad0a36a731068a83d7/eIyDu5U7GA.png" - }, - { - "title": "反馈", - "subtitle": "(选择后将优化首页此类内容)", - "reasons": [ - { - "id": 1, - "name": "恐怖血腥", - "toast": "将优化首页此类内容" - }, - { - "id": 2, - "name": "色情低俗", - "toast": "将优化首页此类内容" - }, - { - "id": 3, - "name": "封面恶心", - "toast": "将优化首页此类内容" - }, - { - "id": 4, - "name": "标题党/封面党", - "toast": "将优化首页此类内容" - } - ], - "type": "feedback" - }, - { - "title": "我不想看", - "subtitle": "(选择后将减少相似内容推荐)", - "reasons": [ - { - "id": 4, - "name": "UP主:罗德岛蜜饼工坊", - "toast": "将减少相似内容推荐" - }, - { - "id": 3, - "name": "频道:明日方舟UP主应援计划 – 离解复合", - "toast": "将减少相似内容推荐", - "extend": "{\"tid\":\"74654031\"}" - }, - { - "id": 3, - "name": "频道:泰拉探索协会", - "toast": "将减少相似内容推荐", - "extend": "{\"tid\":\"22177849\"}" - }, - { - "id": 12, - "name": "此类内容过多", - "toast": "将减少相似内容推荐" - }, - { - "id": 13, - "name": "推荐过", - "toast": "将减少相似内容推荐" - }, - { - "id": 1, - "name": "这个内容", - "toast": "将减少相似内容推荐" - } - ], - "type": "dislike" - } - ], - "track_id": "all_49.router-pegasus-2021478-7d7955f987-td5kj.1745482993998.1007", - "talk_back": "视频,【仿】《明日方舟》六周年庆典活动宣传PV,45.4万观看,1074弹幕,时长4分钟00秒,UP主罗德岛蜜饼工坊,3万点赞,", - "report_flow_data": "{\"flow_card_type\":\"av\",\"flow_source\":\"dssm_u2u\"}", - "three_point_v": "v2", - "cover_left_text_1": "45.4万", - "cover_left_icon_1": 1, - "cover_left_1_content_description": "45.4万观看", - "cover_left_text_2": "1074", - "cover_left_icon_2": 3, - "cover_left_2_content_description": "1074弹幕", - "cover_right_text": "4:00", - "cover_right_content_description": "4分钟00秒", - "rcmd_reason": "3万点赞", - "official_icon": 16, - "can_play": 1, - "rcmd_reason_style": { - "text": "3万点赞", - "text_color": "#FF6633", - "bg_color": "#FFF1ED", - "border_color": "#FFF1ED", - "text_color_night": "#BF5330", - "bg_color_night": "#3D2D29", - "border_color_night": "#3D2D29", - "bg_style": 1 - }, - "cover_info_priority": 123 - } - ], - "config": { - "column": 2, - "autoplay_card": 11, - "feed_clean_abtest": 0, - "home_transfer_test": 0, - "auto_refresh_time": 1200, - "show_inline_danmaku": 1, - "toast": {}, - "single_autoplay_flag": 1, - "is_back_to_homepage": true, - "enable_rcmd_guide": true, - "auto_refresh_time_by_appear": 1800, - "auto_refresh_time_by_active": 1800, - "trigger_loadmore_left_line_num": -1, - "history_cache_size": 10, - "visible_area": 80, - "card_density_exp": 1, - "small_cover_wh_ratio": 1.333333, - "video_mode": 1, - "space_enlarge_exp": 1, - "auto_refresh_time_by_behavior": 5, - "story_mode_v2_guide_exp": 6, - "auto_refresh_by_behavior": 1, - "three_point_style": 1, - "exposure_duration_start_ratio": 0.800000011920929, - "exposure_duration_end_ratio": 0.800000011920929, - "exposure_duration_min_ms": 1, - "rcmd_label_mng_entrance": 1 - }, - "interest_choose": null - } -} -``` - -
\ No newline at end of file diff --git a/docs/video/report.md b/docs/video/report.md deleted file mode 100644 index ef141bc..0000000 --- a/docs/video/report.md +++ /dev/null @@ -1,246 +0,0 @@ -# 视频观看数据上报 - -## 上报观看进度(双端) - -> 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方式: - -```shell -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方式: - -```shell -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' -``` - - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -## 上报视频播放心跳(web端) - -> https://api.bilibili.com/x/click-interface/web/heartbeat - -*请求方式:POST* - -认证方式:仅可Cookie(SESSDATA) - -默认间隔15秒一次, 亦可记录播放历史 - -该接口较为复杂, 且参数计算方法均为推测, 实际过程不明, 可能含有错误, 若要正式使用可以把已播放的持续时间全都设为相同值 - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------------------------- | ---- | ------------------------------ | ------ | ------- | -| w_start_ts | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | UNIX 秒级时间戳 | -| w_mid | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | | -| w_aid | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | | -| w_dt | num | 2 | 非必要 | | -| w_realtime | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | -| w_playedtime | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | -| w_real_played_time | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | -| w_video_duration | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | -| w_last_play_progress_time | num | 参见请求正文同名无`w_`前缀参数 | 非必要 | 单位 秒 | -| web_location | num | 网页位置 | 非必要 | 视频详情页播放器: 1315873 | -| w_rid | num | WBI 签名 | 非必要 | 参见[WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 非必要 | 参见[WBI 签名](../misc/sign/wbi.md) | - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ----------------------- | ---- | ---------------------------------- | ------------ | ----------------------------------------------------------- | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个(网页端请求默认仅使用aid) | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 视频cid | 非必要 | 用于识别分P | -| epid | num | 番剧epid | 非必要 | | -| sid | num | 番剧ssid | 非必要 | | -| mid | num | 当前用户mid | 非必要 | | -| played_time | num | 视频播放进度 | 非必要 | 单位 秒
播放完成为 -1 | -| realtime | num | 本轮页面会话真实播放时间 | 非必要 | 单位 秒 | -| real_played_time | num | 本轮页面会话真实视频播放持续时间 | 非必要 | 单位 秒 | -| refer_url | str | 与请求头 Referer 字段相同 | 非必要 | | -| quality | num | 视频清晰度 | 非必要 | 参见[qn视频清晰度标识](videostream_url.md#qn视频清晰度标识) | -| video_duration | num | 视频时长 | 非必要 | 单位 秒 | -| last_play_progress_time | num | play_time 与 本轮页面会话开始时 played_time 之和 | 非必要 | 单位 秒 | -| max_play_progress_time | num | 本轮页面会话所有最大 last_play_progress_time 与 本轮页面会话开始时 played_time 之和 | 非必要 | 单位 秒 | -| start_ts | num | 开始播放时刻 | 非必要 | 时间戳 | -| type | num | 视频类型 | 非必要 | 3:投稿视频
4:剧集
10:课程 | -| sub_type | num | 剧集副类型 | 非必要 | 0: 普通投稿视频
1:番剧
2:电影
3:纪录片
4:国创
5:电视剧
7:综艺 | -| dt | num | 2 | 非必要 | | -| outer | num | 0 | 非必要 | | -| spmid | str | 333.788.0.0 | 非必要 | 作用尚不明确 | -| from_spmid | str | 播放来源? | 非必要 | 也可为空, 如: `444.41.list.card_archive.click` `333.999.0.0` | -| session | str | 会话信息? | 非必要 | 一串无分隔小写 UUID | -| extra | obj | 额外信息, 如播放器版本 | 非必要 | 如: `{"player_version":"4.8.36"}` | -| play_type | num | 播放动作 | 非必要 | 0:播放中
1:开始播放
2:暂停
3:继续播放
4: 结束播放 | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 非必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -上报一次视频`av2`/`BV1xx411c7mD`的心跳数据 - -```shell -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' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -## 开始观看视频 (web端) - -> https://api.bilibili.com/x/click-interface/click/web/h5 - -*请求方式: POST* - -认证方式: Cookie (SESSDATA) - -该接口亦被用于计算播放量, 播放量更新不是实时的
-该接口使用似乎存在 200 播放限制, **请勿滥用!** - -**URL参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| w_aid | num | 稿件 aid | 不必要 | | -| w_part | num | 视频分 P 编号 | 不必要 | | -| w_ftime | num | 点击时间戳? | 不必要 | UNIX 秒级时间戳 | -| w_stime | num | 开始播放时间戳? | 不必要 | UNIX 秒级时间戳 | -| w_type | num | 视频类型 | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | -| web_location | num | 网页位置? | 不必要 | 1315873 | -| w_rid | num | WBI 签名 | 不必要 | 参见[WBI 签名](../misc/sign/wbi.md) | -| wts | num | UNIX 秒级时间戳 | 不必要 | 参见[WBI 签名](../misc/sign/wbi.md) | - -**正文参数 (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端)](#上报视频播放心跳web端) | -| sub_type | num | 视频子类型 | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | -| referer_url | str | 与请求头 Referer 字段相同 | 不必要 | | -| outer | num | 0 | 不必要 | | -| spmid | str | 333.788.0.0 | 不必要 | 作用尚不明确 | -| from_spmid | str | 播放来源? | 不必要 | 见[上报视频播放心跳(web端)](#上报视频播放心跳web端) | -| session | str | 会话信息? | 不必要 | 一串无分隔小写 UUID | -| csrf | str | CSRF Token (即 Cookie 中 bili_jct) | 不必要 | | - -**JSON回复:** - -根对象: - -|字段|类型|内容|备注| -|-|-|-|-| -|code|num|返回值|0:成功
-400:请求错误| -|message|str|错误信息|默认为 `0`| -|ttl|num|1|| - -**示例:** - -```shell -curl 'https://api.bilibili.com/x/click-interface/click/web/h5' \ ---data-urlencode 'aid=2' \ -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/video/snapshot.md b/docs/video/snapshot.md deleted file mode 100644 index 3bc1bb0..0000000 --- a/docs/video/snapshot.md +++ /dev/null @@ -1,319 +0,0 @@ -# 视频快照 - -快照的截取时间根据视频画面变化程度决定,各视频不相同 - -截取时间表的时间根据视频画面变化程度决定,各每个视频不相同 - -截取时间表的时间和快照一一对应,并按照从左到右 从上到下的顺序排布 - -## 获取视频快照(web端) -> https://api.bilibili.com/x/player/videoshot - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------ | ------------ | ----------------------------------- | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 分P cid | 非必要 | 默认为1P | -| index | num | json数组截取时间表 | 非必要 | 1:需要
0:不需要
默认为0 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------ | -| code | num | 返回值 | 0:成功
40001:请求错误
40003:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------------- | --------- | -| pvdata | str | bin格式截取时间表url | | -| img_x_len | num | 每行图片数 | 一般为10 | -| img_y_len | num | 每列图片数 | 一般为10 | -| img_x_size | num | 每张图片长 | 一般为160 | -| img_y_size | num | 每张图片宽 | 一般为90 | -| image | array | 图片拼版 | | -| index | array | json数组格式截取时间表 | 无为空 | - -`data`中的`image`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------------------------- | -| 0 | str | 图片拼版1 url | | -| n | str | 图片拼版(n+1) url | 第一张拼版占满时延续第二张 | -| …… | str | …… | …… | - -`data`中的`index`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | --------------- | -| 0 | num | 恒为0 | | -| 1 | num | 图片1 截取时间 | 视频0秒截取时间 | -| n | num | 图片n 截取时间 | 单位为秒 | -| …… | num | …… | 单位为秒 | - -**示例:** - -获取视频`av26273789`/`BV1os411H7wm`的快照 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/videoshot' \ ---data-urlencode 'aid=26273789' \ ---data-urlencode 'index=1' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/videoshot' \ ---data-urlencode 'bvid=BV1os411H7wm' \ ---data-urlencode 'index=1' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "pvdata": "//i0.hdslb.com/bfs/videoshot/49075258.bin", - "img_x_len": 10, - "img_y_len": 10, - "img_x_size": 160, - "img_y_size": 90, - "image": ["//i0.hdslb.com/bfs/videoshot/49075258.jpg", "//i0.hdslb.com/bfs/videoshot/49075258-1.jpg"], - "index": [0, 0, 8, 14, 19, 25, 34, 40, 46, 56, 63, 70, 80, 87, 93, 100, 109, 117, 124, 133, 142, 148, 156, 164, 171, 179, 184, 192, 198, 206, 214, 223, 232, 239, 246, 254, 261, 269, 275, 283, 289, 299, 305, 310, 315, 322, 330, 339, 348, 358, 364, 371, 376, 382, 391, 404, 413, 421, 426, 434, 441, 452, 458, 463, 473, 479, 491, 497, 504, 514, 521, 528, 533, 540, 546, 552, 558, 567, 575, 586, 591, 602, 609, 615, 623, 629, 639, 647, 653, 658, 664, 670, 675, 684, 691, 698, 713, 724, 729, 737, 743, 754, 762, 772, 779, 784, 797, 803, 810, 817, 825, 834, 845, 851, 857, 867, 878, 888, 896, 903, 909, 914, 919, 928, 935, 944, 958, 970, 977, 988, 996, 1004, 1011, 1018, 1026, 1035, 1041, 1048, 1055, 1063, 1073, 1079, 1086, 1095, 1106, 1111, 1124, 1135, 1147, 1153, 1159, 1165, 1171, 1184, 1198, 1209, 1215, 1221, 1228, 1236, 1242, 1253, 1258, 1269, 1276, 1284, 1289, 1300, 1306, 1315, 1321, 1328, 1340, 1347, 1354, 1361, 1366, 1371, 1383, 1390, 1396, 1403, 1415] - } -} -``` - -
- -## 获取视频快照(APP端) - -> https://app.bilibili.com/x/v2/view/video/shot - -*请求方式:GET* - -鉴权方式:appkey - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------- | ----------- | ---- | -| aid | num | 稿件avid | 必要 | | -| appkey | str | APP密钥 | APP方式必要 | | -| cid | num | 分P cid | 必要 | | -| ts | num | 当前时间戳 | APP方式必要 | | -| sign | str | APP签名 | APP方式必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
10008:稿件的缩略图不存在 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | -------------------- | --------- | -| pvdata | str | bin格式截取时间表url | | -| img_x_len | num | 每行图片数 | 一般为10 | -| img_y_len | num | 每列图片数 | 一般为10 | -| img_x_size | num | 每张图片长 | 一般为160 | -| img_y_size | num | 每张图片宽 | 一般为90 | -| image | array | 图片拼版 | | - -`data`中的`image`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------------------------- | -| 0 | str | 图片拼版1 url | | -| n | str | 图片拼版(n+1) url | 第一张拼版占满时延续第二张 | -| …… | str | …… | …… | - -示例: - -获取视频`av26273789`(`cid=49075258`)的快照 - -```shell -curl -G 'https://app.bilibili.com/x/v2/view/video/shot' \ ---data-urlencode 'appkey=1d8b6e7d45233436' \ ---data-urlencode 'aid=26273789' \ ---data-urlencode 'cid=49075258' \ ---data-urlencode 'ts=0' \ ---data-urlencode 'sign=06c0a4f2ede21984313552bd9439db18' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "pvdata": "https://i0.hdslb.com/bfs/videoshot/49075258.bin", - "img_x_len": 10, - "img_y_len": 10, - "img_x_size": 160, - "img_y_size": 90, - "image": [ - "https://i0.hdslb.com/bfs/videoshot/49075258.jpg", - "https://i0.hdslb.com/bfs/videoshot/49075258-1.jpg" - ] - } -} -``` - -
- -## 获取视频快照(web端)(用于封面预览) - -> https://api.bilibili.com/pvideo - -*请求方式:GET* - -内容与「获取视频快照1」加参数index=1相同,但url带有转义,仅限第1P - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| aid | num | 稿件avid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------------------------- | -| code | num | 返回值 | 0:成功
40001:请求错误
-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ----- | ---------------------- | --------- | -| pvdata | str | bin格式截取时间表url | | -| img_x_len | num | 每行图片数 | 一般为10 | -| img_y_len | num | 每列图片数 | 一般为10 | -| img_x_size | num | 每张图片长 | 一般为160 | -| img_y_size | num | 每张图片宽 | 一般为90 | -| image | array | 图片拼版 | | -| index | array | json数组格式截取时间表 | 无为空 | - -`data`中的`image`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | -------------------------- | -| 0 | str | 图片拼版1 url | | -| n | str | 图片拼版(n+1) url | 第一张拼版占满时延续第二张 | -| …… | str | …… | …… | - -`data`中的`index`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | --------------- | -| 0 | num | 恒为0 | | -| 1 | num | 图片1 截取时间 | 视频0秒截取时间 | -| n | num | 图片n 截取时间 | 单位为秒 | -| …… | num | …… | 单位为秒 | - -**示例:** - -获取视频`av26273789`的快照 - -```shell -curl -G 'https://api.bilibili.com/pvideo' \ ---data-urlencode 'aid=26273789' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "pvdata": "\/\/i0.hdslb.com\/bfs\/videoshot\/49075258.bin", - "img_x_len": 10, - "img_y_len": 10, - "img_x_size": 160, - "img_y_size": 90, - "image": ["\/\/i0.hdslb.com\/bfs\/videoshot\/49075258.jpg", "\/\/i0.hdslb.com\/bfs\/videoshot\/49075258-1.jpg"], - "index": [0, 0, 8, 14, 19, 25, 34, 40, 46, 56, 63, 70, 80, 87, 93, 100, 109, 117, 124, 133, 142, 148, 156, 164, 171, 179, 184, 192, 198, 206, 214, 223, 232, 239, 246, 254, 261, 269, 275, 283, 289, 299, 305, 310, 315, 322, 330, 339, 348, 358, 364, 371, 376, 382, 391, 404, 413, 421, 426, 434, 441, 452, 458, 463, 473, 479, 491, 497, 504, 514, 521, 528, 533, 540, 546, 552, 558, 567, 575, 586, 591, 602, 609, 615, 623, 629, 639, 647, 653, 658, 664, 670, 675, 684, 691, 698, 713, 724, 729, 737, 743, 754, 762, 772, 779, 784, 797, 803, 810, 817, 825, 834, 845, 851, 857, 867, 878, 888, 896, 903, 909, 914, 919, 928, 935, 944, 958, 970, 977, 988, 996, 1004, 1011, 1018, 1026, 1035, 1041, 1048, 1055, 1063, 1073, 1079, 1086, 1095, 1106, 1111, 1124, 1135, 1147, 1153, 1159, 1165, 1171, 1184, 1198, 1209, 1215, 1221, 1228, 1236, 1242, 1253, 1258, 1269, 1276, 1284, 1289, 1300, 1306, 1315, 1321, 1328, 1340, 1347, 1354, 1361, 1366, 1371, 1383, 1390, 1396, 1403, 1415] - } -} -``` - -
- -## 图片拼版 - -以160x90像素为一张,横向10张,纵向10张,从左到右从上到下进行裁剪 - -图1为0s,图2为8s,图3为14s,以此类推…… - -示例拼版图片url:http://i0.hdslb.com/bfs/videoshot/49075258.jpg - - - -## bin格式截取时间表 - -bin的内容为uint16数组(2Byte对齐),与json数组一一对应 - -第0项恒为0,从第1项开始作为截取图片的时间(秒) - -示例bin格式截取时间表:http://i0.hdslb.com/bfs/videoshot/49075258.bin - -hex内容如下: - -``` -00000000 00 00 00 00 00 08 00 0e 00 13 00 19 00 22 00 28 |.............".(| -00000010 00 2e 00 38 00 3f 00 46 00 50 00 57 00 5d 00 64 |...8.?.F.P.W.].d| -00000020 00 6d 00 75 00 7c 00 85 00 8e 00 94 00 9c 00 a4 |.m.u.|..........| -00000030 00 ab 00 b3 00 b8 00 c0 00 c6 00 ce 00 d6 00 df |................| -00000040 00 e8 00 ef 00 f6 00 fe 01 05 01 0d 01 13 01 1b |................| -00000050 01 21 01 2b 01 31 01 36 01 3b 01 42 01 4a 01 53 |.!.+.1.6.;.B.J.S| -00000060 01 5c 01 66 01 6c 01 73 01 78 01 7e 01 87 01 94 |.\.f.l.s.x.~....| -00000070 01 9d 01 a5 01 aa 01 b2 01 b9 01 c4 01 ca 01 cf |................| -00000080 01 d9 01 df 01 eb 01 f1 01 f8 02 02 02 09 02 10 |................| -00000090 02 15 02 1c 02 22 02 28 02 2e 02 37 02 3f 02 4a |.....".(...7.?.J| -000000a0 02 4f 02 5a 02 61 02 67 02 6f 02 75 02 7f 02 87 |.O.Z.a.g.o.u....| -000000b0 02 8d 02 92 02 98 02 9e 02 a3 02 ac 02 b3 02 ba |................| -000000c0 02 c9 02 d4 02 d9 02 e1 02 e7 02 f2 02 fa 03 04 |................| -000000d0 03 0b 03 10 03 1d 03 23 03 2a 03 31 03 39 03 42 |.......#.*.1.9.B| -000000e0 03 4d 03 53 03 59 03 63 03 6e 03 78 03 80 03 87 |.M.S.Y.c.n.x....| -000000f0 03 8d 03 92 03 97 03 a0 03 a7 03 b0 03 be 03 ca |................| -00000100 03 d1 03 dc 03 e4 03 ec 03 f3 03 fa 04 02 04 0b |................| -00000110 04 11 04 18 04 1f 04 27 04 31 04 37 04 3e 04 47 |.......'.1.7.>.G| -00000120 04 52 04 57 04 64 04 6f 04 7b 04 81 04 87 04 8d |.R.W.d.o.{......| -00000130 04 93 04 a0 04 ae 04 b9 04 bf 04 c5 04 cc 04 d4 |................| -00000140 04 da 04 e5 04 ea 04 f5 04 fc 05 04 05 09 05 14 |................| -00000150 05 1a 05 23 05 29 05 30 05 3c 05 43 05 4a 05 51 |...#.).0.<.C.J.Q| -00000160 05 56 05 5b 05 67 05 6e 05 74 05 7b 05 87 |.V.[.g.n.t.{..| -``` diff --git a/docs/video/status_number.md b/docs/video/status_number.md deleted file mode 100644 index 89dc0bc..0000000 --- a/docs/video/status_number.md +++ /dev/null @@ -1,210 +0,0 @@ -# 视频状态数 - -本页接口均已失效 - -## 视频状态数(仅avid) - -
-该接口已弃用 (HTTP 403) - -> https://api.bilibili.com/archive_stat/stat - -*请求方式:GET* - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------ | ---- | -| aid | num | 稿件avid | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ----------------------------------------------- | -| code | num | 返回值 | 0:成功
40001:请求错误
40003:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------------------------ | ------------------------------ | -------------------- | -| aid | num | 稿件avid | | -| view | 正常:num
屏蔽:str | 正常:播放次数
屏蔽:"--" | | -| danmaku | num | 弹幕条数 | | -| reply | num | 评论条数 | | -| favorite | num | 收藏人数 | | -| coin | num | 投币枚数 | | -| share | num | 分享次数 | | -| now_rank | num | 0 | 作用尚不明确 | -| his_rank | num | 历史最高排行 | | -| like | num | 获赞次数 | | -| dislike | num | 0 | 作用尚不明确 | -| no_reprint | num | 禁止转载标志 | 0:无
1:禁止 | -| copyright | num | 版权标志 | 1:自制
2:转载 | - -**示例:** - -查询视频`av91572143`的状态数 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/archive_stat/stat' \ ---data-urlencode 'aid=91572143' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 91572143, - "view": 2236510, - "danmaku": 37856, - "reply": 5723, - "favorite": 131317, - "coin": 143389, - "share": 44598, - "now_rank": 0, - "his_rank": 4, - "like": 264314, - "dislike": 0, - "no_reprint": 1, - "copyright": 1 - } -} -``` - -
- -
- -## 视频状态数(bvid/avid) - -
-该接口已失效 (HTTP 404) - -> https://api.bilibili.com/x/web-interface/archive/stat - -*请求方式:GET* - -此接口请求头中UA值存在`python`字串,会返回-412错误 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ------------------------------------------------------------ | -| code | num | 返回值 | 0:成功
-400:请求错误
-412:请求被拦截
40003:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 信息本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------------------------ | ------------------------------ | -------------------- | -| aid | num | 稿件avid | | -| bvid | str | 稿件bvid | | -| view | 正常:num
屏蔽:str | 正常:播放次数
屏蔽:"--" | | -| danmaku | num | 弹幕条数 | | -| reply | num | 评论条数 | | -| favorite | num | 收藏人数 | | -| coin | num | 投币枚数 | | -| share | num | 分享次数 | | -| now_rank | num | 0 | 作用尚不明确 | -| his_rank | num | 历史最高排行 | | -| like | num | 获赞次数 | | -| dislike | num | 0 | 作用尚不明确 | -| no_reprint | num | 禁止转载标志 | 0:无
1:禁止 | -| copyright | num | 版权标志 | 1:自制
2:转载 | -| argue_msg | str | 警告信息 | 默认为空 | -| evaluation | str | 视频评分 | 默认为空 | - -**示例:** - -查询视频`av2271112`/`BV1es411D7sW`的状态数 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ ---data-urlencode 'aid=2271112' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ ---data-urlencode 'bvid=BV1es411D7sW' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "aid": 2271112, - "bvid": "BV1es411D7sW", - "view": 26408224, - "danmaku": 161919, - "reply": 52825, - "favorite": 892560, - "coin": 599649, - "share": 240573, - "like": 628592, - "now_rank": 0, - "his_rank": 4, - "no_reprint": 0, - "copyright": 1, - "argue_msg": "", - "evaluation": "" - } -} -``` - -
- -当UA为`2333python2333`时,则无法访问此接口: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/archive/stat' \ ---data-urlencode 'aid=2271112' \ --A '2333python2333' -``` - -
-查看响应示例: - -```json -{ - "code":-412, - "message":"请求被拦截", - "ttl":1, - "data":null -} -``` - -
- -
diff --git a/docs/video/summary.md b/docs/video/summary.md deleted file mode 100644 index 55d9fb1..0000000 --- a/docs/video/summary.md +++ /dev/null @@ -1,287 +0,0 @@ -# 视频AI总结 - - - -## 获取AI总结内容 - -> https://api.bilibili.com/x/web-interface/view/conclusion/get - -*请求方式: GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|--------|-----|--------|-----|----------------------------------| -| aid | num | 稿件 avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 视频 cid | 必要 | | -| up_mid | num | UP主 mid | 可选 | | -| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|--------------------------| -| code | num | 返回值 | 0: 成功
-101: 账号未登录
-400:请求错误
-403: 访问权限不足 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | obj | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|------|----------------------| -| code | num | 返回值 | -1: 不支持AI摘要(敏感内容等)或其他因素导致请求异常
0: 有摘要
1:无摘要(未识别到语音) | -| model_result | obj | 摘要内容 | | -| stid | str | 摘要 id | 如`code=1`且该字段为`0`时,则未进行 AI 总结,即添加总结队列
如`code=1`且该字段为空时未识别到语音 | -| status | num | (?) | | -| like_num | num | 点赞数 | 默认为`0` | -| dislike_num | num | 点踩数 | 默认为`0` | - -`data`中的`model_result`对象: - -| 字段 | 类型 | 内容 | 备注 | -|-------------|-----|----------|------------------------------------------| -| result_type | num | 数据类型 | 0: 没有摘要
1:仅存着摘要总结
2:存着摘要以及提纲 | -| summary | str | 视频摘要 | 通常为一段概括整个视频内容的文本 | -| outline | 有数据时:array
无数据时:空数组 | 分段提纲 | 通常为视频中叙述的各部分及其要点 | -| subtitle | 有数据时:array
无数据时:空数组 | AI字幕 | 由AI识别生成的字幕列表,自动翻译英文,固定返回中文字幕 | - -`model_result`对象中的`outline`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|---------|-----| -| 0 | obj | 总结分段1 | | -| n | obj | 总结分段(n+1) | | -| …… | obj | …… | …… | - -`outline`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|--------------|-----|------|----| -| title | str | 分段标题 | 段落内容的概括 | -| part_outline | array | 分段要点 | 当前分段中多个提到的细节 | -| timestamp | num | 分段起始时间 | 单位为秒 | - -`outline`数组中的对象中的`part_outline`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|---------|-----| -| 0 | obj | 分段要点1 | | -| n | obj | 分段要点(n+1) | | -| …… | obj | …… | …… | - -`part_outline`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------|-----|-------|----| -| timestamp | num | 要点起始时间 | 单位为秒 | -| content | str | 小结内容 | 其中一个分段的要点 | - -`model_result`对象中`subtitle`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|----------|-----| -| 0 | obj | 字幕列表1 | 若有结果,该数组长度仅为1 | - -`subtitle`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----|-----|---------|-----| -| part_subtitle | array | 字幕分段 | 当前分段中的字幕信息 | -| timestamp | num | 字幕识别起始时间 | 单位为秒 | -| title | str | 字幕标题 | 固定为空字符串 | - -`subtitle`数组中的对象中的`part_subtitle`数组: - -| 项 | 类型 | 内容 | 备注 | -|-----|-----|---------|-----| -| 0 | obj | 字幕分段1 | | -| n | obj | 字幕分段n | | -| …… | obj | …… | …… | - -`part_subtitle`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -|-----------|-----|-------|----| -| content | str | 字幕内容 | 其中一个分段的字幕内容 | -| start_timestamp | num | 分段开始时间 | 单位为秒 | -| end_timestamp | num | 分段结束时间 | 单位为秒 | - -**示例:** - -得到视频`BV1L94y1H7CV`(`cid=1335073288`)的摘要 - -```bash -curl -G 'https://api.bilibili.com/x/web-interface/view/conclusion/get' \ - --data-urlencode 'bvid=BV1L94y1H7CV' \ - --data-urlencode 'cid=1335073288' \ - --data-urlencode 'up_mid=297242063' \ - --data-urlencode 'wts=1701546363' \ - --data-urlencode 'w_rid=1073871926b3ccd99bd790f0162af634' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "code": 0, - "model_result": { - "result_type": 2, - "summary": "在网上阅读时遇到错别字和语言梗的烦恼,以及正确使用语言的重要性。作者认为,我们每个人都应该有包容心,不掉渣,不纠正别人的错误,同时也需要明辨是非,规范使用语言。视频还提到了一些常见的语言梗和错误用法,呼吁大家不要过分使用网络词汇,而应该注重语言的艺术性和深度。最后,作者欢迎大家关注他的微信公众号。", - "outline": [ - { - "title": "现代人使用中文时面临的困境,包括错别字、用法不正确等问题,并呼吁大家规范使用中文。", - "part_outline": [ - { - "timestamp": 1, - "content": "网友评论有错别字,勉强能看懂,但难受。" - }, - { - "timestamp": 39, - "content": "重来一次,明辨是非。" - }, - { - "timestamp": 167, - "content": "粉墨登场是贬义词,形容坏人打扮好老登场。" - } - ], - "timestamp": 1 - }, - { - "title": "网络词汇的过度使用导致语言生硬,以及对流行语言梗的短暂使用感到厌倦。", - "part_outline": [ - { - "timestamp": 241, - "content": "网络词汇过分使用会误导别人,使规范词汇生硬" - }, - { - "timestamp": 270, - "content": "以前的语言梗有深度,现在的流行梗很短命" - }, - { - "timestamp": 338, - "content": "巨星之间需要化学反应的过程,前几场发挥欠佳" - } - ], - "timestamp": 241 - } - ], - "subtitle": [ - { - "part_subtitle": [ - { - "content": "有时候上网啊", - "start_timestamp": 0, - "end_timestamp": 1 - }, - { - "content": "看网友的评论内容", - "start_timestamp": 1, - "end_timestamp": 3 - }, - { - "content": "一句话好几个错别字", - "start_timestamp": 3, - "end_timestamp": 5 - }, - // ... - { - "content": "黄一刀有毒", - "start_timestamp": 352, - "end_timestamp": 355 - } - ], - "timestamp": 1, - "title": "" - } - ], - }, - "stid": "5117037934391059183", - "status": 0, - "like_num": 6, - "dislike_num": 2 - } -} -``` - -
- -## 点赞&点踩摘要 - -> https://api.bilibili.com/x/web-interface/view/conclusion/set - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|-------|-----|--------|-----|----------------------------------| -| w_rid | str | Wbi 签名 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | -| wts | num | 当前时间戳 | 必要 | 详见 [Wbi 签名](../misc/sign/wbi.md) | - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -|------------|-----|----------------------|-----|-----------------------------| -| aid | num | 稿件 avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 稿件 cid | 必要 | | -| up_mid | num | UP主 mid | 非必要 | | -| stid | num | 摘要 id | 必要 | | -| like_state | num | 执行操作 | 必要 | 1: 点赞
2: 取消点赞
3: 点踩
4: 取消点踩 | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -|---------|-----|------|------------------------------------------| -| code | num | 返回值 | 0: 成功
-400: 请求错误
65002:origin id 错误
65004:取消赞失败 未点赞过
65005:取消踩失败 未点踩过
65006: 已赞过
65007:已踩过 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -为视频`BV1L94y1H7CV`(`cid=1335073288`)的摘要点赞 - -```shell -curl 'https://api.bilibili.com/x/web-interface/view/conclusion/set?w_rid=edb471fc926646ef3889a80488166b66&wts=1700358953' \ - --data-urlencode 'bvid=BV1L94y1H7CV' \ - --data-urlencode 'cid=1335073288' \ - --data-urlencode 'up_mid=297242063' \ - --data-urlencode 'stid=5117037934391059183' \ - --data-urlencode '&like_state=1' \ - --data-urlencode 'csrf=xxx' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/video/tags.md b/docs/video/tags.md deleted file mode 100644 index 2ee6fde..0000000 --- a/docs/video/tags.md +++ /dev/null @@ -1,434 +0,0 @@ -# 视频TAG - -## 获取视频TAG信息(新) - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------------ | -------------------------------- | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | -| cid | num | 分P cid | 非必要 | 提供此参数可返回对应分P的BGM信息 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | TAG列表 | 无TAG为空 | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 第1个TAG | | -| n | obj | 第(n+1)个TAG | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------- | ---- | ---------- | ------------------------------------------------------------ | -| tag_id | num | tag_id | 当`tag_type`不为`bgm`时有效 | -| tag_name | str | TAG名称 | | -| music_id | str | 背景音乐id | 当`tag_type`为`bgm`时有效,以`MA`开头 | -| tag_type | str | TAG类型 | `old_channel`:普通标签
`topic`:话题
`bgm`:背景音乐 | -| jump_url | str | 跳转url | 当`tag_type`为`topic`或`bgm`时有效 | - -**示例:** - -查询视频`av89772773`/`BV1M741177Kg`的TAG - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view/detail/tag' \ ---data-urlencode 'aid=89772773' \ ---data-urlencode 'cid=153322313' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/web-interface/view/detail/tag' \ ---data-urlencode 'bvid=BV1M741177Kg' \ ---data-urlencode 'cid=153322313' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [ - { - "tag_id": 0, - "tag_name": "发现《Other Side》", - "music_id": "MA456128506519140428", - "tag_type": "bgm", - "jump_url": "https://music.bilibili.com/h5/music-detail?music_id=MA456128506519140428&cid=153322313&aid=89772773&na_close_hide=1" - }, - { - "tag_id": 12620189, - "tag_name": "异度侵入", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 707, - "tag_name": "ED", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 1394, - "tag_name": "动漫", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 13289329, - "tag_name": "异度侵入ed原图", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - }, - { - "tag_id": 7520816, - "tag_name": "bilibili新星计划", - "music_id": "", - "tag_type": "old_channel", - "jump_url": "" - } - ] -} -``` - -
- -## 获取视频TAG信息(旧) - -> - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | -------- | ------------ | ------------------ | -| aid | num | 稿件avid | 必要(可选) | avid与bvid任选一个 | -| bvid | str | 稿件bvid | 必要(可选) | avid与bvid任选一个 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----- | -------- | --------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | array | TAG列表 | 无TAG为空 | - -`data`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | -------------- | ---- | -| 0 | obj | 第1个TAG | | -| n | obj | 第(n+1)个TAG | | -| …… | obj | …… | …… | - -`data`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ---- | -------------- | ------------------------------------------------------------ | -| tag_id | num | tag_id | | -| tag_name | str | TAG名称 | | -| cover | str | TAG图片url | | -| head_cover | str | TAG页面头图url | | -| content | str | TAG介绍 | | -| short_content | str | TAG简介 | | -| type | num | ??? | | -| state | num | 0 | | -| ctime | num | 创建时间 | 秒级时间戳 | -| count | obj | 状态数 | | -| is_atten | num | 是否关注 | 0:未关注
1:已关注
需要登录(Cookie)
未登录为0 | -| likes | num | 0 | 作用尚不明确 | -| hates | num | 0 | 作用尚不明确 | -| attribute | num | 0 | 作用尚不明确 | -| liked | num | 是否已经点赞 | 0:未点赞
1:已点赞
需要登录(Cookie)
未登录为0 | -| hated | num | 是否已经点踩 | 0:未点踩
1:已点踩
需要登录(Cookie)
未登录为0 | -| extra_attr | num | ? ? ? | | - -`data`数组中的对象中的`count`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ----- | ---- | ------------- | ------------ | -| view | num | 0 | 作用尚不明确 | -| use | num | 视频添加TAG数 | | -| atten | num | TAG关注 | | - -**示例:** - -查询视频`av89772773`/`BV1M741177Kg`的TAG - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/tag/archive/tags' \ ---data-urlencode 'aid=89772773' \ --b 'SESSDATA=xxx' -``` - -bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/tag/archive/tags' \ ---data-urlencode 'bvid=BV1M741177Kg' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": [{ - "tag_id": 12620189, - "tag_name": "异度侵入", - "cover": "", - "head_cover": "", - "content": "", - "short_content": "", - "type": 1, - "state": 0, - "ctime": 1576235749, - "count": { - "view": 0, - "use": 6392, - "atten": 8938 - }, - "is_atten": 1, - "likes": 1, - "hates": 0, - "attribute": 0, - "liked": 0, - "hated": 0 - }, { - "tag_id": 7520816, - "tag_name": "bilibili新星计划", - "cover": "", - "head_cover": "", - "content": "", - "short_content": "", - "type": 4, - "state": 0, - "ctime": 1529717850, - "count": { - "view": 0, - "use": 1967314, - "atten": 65082 - }, - "is_atten": 0, - "likes": 0, - "hates": 0, - "attribute": 0, - "liked": 0, - "hated": 0 - }, { - "tag_id": 707, - "tag_name": "ED", - "cover": "", - "head_cover": "", - "content": "", - "short_content": "", - "type": 3, - "state": 0, - "ctime": 1436866637, - "count": { - "view": 0, - "use": 62646, - "atten": 75642 - }, - "is_atten": 1, - "likes": 0, - "hates": 0, - "attribute": 0, - "liked": 0, - "hated": 0 - }, { - "tag_id": 1394, - "tag_name": "动漫", - "cover": "http://i0.hdslb.com/bfs/tag/d08c5fe17ceb793e7ce95d9c67392743b33b46d0.jpg", - "head_cover": "", - "content": " “动漫”是动画和漫画的合称与缩写。在其他语言相当少用。随着现代传媒技术的发展,动画(animation或anime)和漫画(comics,manga;特别是故事性漫画)之间联系日趋紧密,两者常被合而为“动漫”。\n  由于漫画本身的发展形成了现代故事漫画的表现形式,将影视艺术融入漫画之中,使得漫画与动画更容易结合,影视艺术独特的地方在于它能通过镜头的推拉摇移和片段剪辑的蒙太奇技巧来表达想法和感受。漫画正是吸收了影视艺术的这两个特点。当讲述的故事越发复杂、人物越发丰富的时候,传统单线式叙事的方法就越行不通,蒙太奇的介入就成为一种需要了;当漫画家在传统表现手段中无法找到更合适的抒发感情的方法的时候,当读者需要作品有更强的冲击力和表现力的时候,各种镜头的灵活运用就成为一种必需了。一部现代故事漫画往往集远、中、近、特四种镜头于一身,漫画家往往能熟练地运用镜头的移动和各种蒙太奇剪接,对故事特定部分的情绪和氛围进行渲染。这就是现代故事漫画容易和动画结合的一个原因,因为它天生就像动画的分镜头剧本,读者在看漫画时如同在看一部电影。正是有着这样的相似性所以如今将动画和漫画合称为“动漫”。", - "short_content": "", - "type": 3, - "state": 0, - "ctime": 1436866637, - "count": { - "view": 0, - "use": 1134143, - "atten": 113030 - }, - "is_atten": 0, - "likes": 0, - "hates": 0, - "attribute": 0, - "liked": 0, - "hated": 0 - }, { - "tag_id": 13289329, - "tag_name": "异度侵入ed原图", - "cover": "", - "head_cover": "", - "content": "", - "short_content": "", - "type": 1, - "state": 0, - "ctime": 1581948411, - "count": { - "view": 0, - "use": 3, - "atten": 0 - }, - "is_atten": 0, - "likes": 0, - "hates": 0, - "attribute": 0, - "liked": 0, - "hated": 0 - }] -} -``` - -
- -## 点赞&取消点赞视频TAG - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -重复请求为取消 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| aid | num | 稿件avid | 必要 | | -| tag_id | num | tag_id | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -为视频`av89772773`的TAG`12620189`点赞 - -```shell -curl 'https://api.bilibili.com/x/tag/archive/like2' \ ---data-urlencode 'aid=89772773' \ ---data-urlencode 'tag_id=12620189' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
- -## 点踩&取消点踩视频TAG - -> - -*请求方式:POST* - -认证方式:Cookie(SESSDATA) - -重复请求为取消 - -**正文参数( application/x-www-form-urlencoded ):** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ------------------------ | ------ | ---- | -| aid | num | 稿件avid | 必要 | | -| tag_id | num | tag_id | 必要 | | -| csrf | str | CSRF Token(位于cookie) | 必要 | | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ---- | -------- | ---------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | - -**示例:** - -为视频`av89772773`的TAG`7520816`点踩 - -```shell -curl 'https://pi.bilibili.com/x/tag/archive/hate2' \ ---data-urlencode 'aid=89772773' \ ---data-urlencode 'tag_id=7520816' \ ---data-urlencode 'csrf=xxx' \ --b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1 -} -``` - -
diff --git a/docs/video/video_zone.md b/docs/video/video_zone.md deleted file mode 100644 index 14fe503..0000000 --- a/docs/video/video_zone.md +++ /dev/null @@ -1,336 +0,0 @@ -# 视频分区一览 - -用于判断视频所在的分区,或推荐分区视频等…… - -亦可用于更深♂入了解B站的分区 - -本文档中的内容适用于 `tid`、`tname` 等字段,关于 `tid_v2`、`tname_v2` 等字段请参阅 “[视频分区一览 (v2)](./video_zone_v2.md)” 文档 - -## 动画 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|-----------------------|------------|-----|------------------------------------------------------------------|--------------------------------------------------------------------| -| 动画(主分区) | douga | 1 | | [/v/douga](https://www.bilibili.com/v/douga) | -| MAD·AMV | mad | 24 | 具有一定制作程度的动画或静画的二次创作视频 | [/v/douga/mad](https://www.bilibili.com/v/douga/mad) | -| MMD·3D | mmd | 25 | 使用MMD(MikuMikuDance)和其他3D建模类软件制作的视频 | [/v/douga/mmd](https://www.bilibili.com/v/douga/mmd) | -| 同人·手书
(~~原短片·手书~~) | handdrawn | 47 | 追求个人特色和创意表达的手书(绘)、以及同人作品展示、宣传为主的内容 | [/v/douga/handdrawn](https://www.bilibili.com/v/douga/handdrawn) | -| 配音 | voice | 257 | 使用ACGN相关画面或台本素材进行人工配音创作的内容 | [/v/douga/voice](https://www.bilibili.com/v/douga/voice) | -| 手办·模玩 | garage_kit | 210 | 手办模玩的测评、改造或其他衍生内容 | [/v/douga/garage_kit](https://www.bilibili.com/v/douga/garage_kit) | -| 特摄 | tokusatsu | 86 | 特摄相关衍生视频 | [/v/douga/tokusatsu](https://www.bilibili.com/v/douga/tokusatsu) | -| 动漫杂谈 | acgntalks | 253 | 以谈话形式对ACGN文化圈进行的鉴赏、吐槽、评点、解说、推荐、科普等内容 | [/v/douga/acgntalks](https://www.bilibili.com/v/douga/acgntalks) | -| 综合 | other | 27 | 以动画及动画相关内容为素材,包括但不仅限于音频替换、恶搞改编、排行榜等内容 | [/v/douga/other](https://www.bilibili.com/v/douga/other) | - -## 番剧 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|-------------|-----|---------------------------|----------------------------------------------------------------------| -| 番剧(主分区) | anime | 13 | | [/anime](https://www.bilibili.com/anime) | -| 资讯 | information | 51 | 动画番剧相关资讯视频 | [/v/anime/information](https://www.bilibili.com/v/anime/information) | -| 官方延伸 | offical | 152 | 动画番剧为主题的宣传节目、采访视频,及声优相关视频 | [/v/anime/offical](https://www.bilibili.com/v/anime/offical) | -| 完结动画 | finish | 32 | 已完结的动画番剧合集 | [/v/anime/finish](https://www.bilibili.com/v/anime/finish) | -| 连载动画 | serial | 33 | 当季连载的动画番剧 | [/v/anime/serial](https://www.bilibili.com/v/anime/serial) | - -## 国创 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|-------------|-----|------------|------------------------------------------------------------------------------| -| 国创(主分区) | guochuang | 167 | | [/guochuang](https://www.bilibili.com/guochuang) | -| 国产动画 | chinese | 153 | 我国出品的PGC动画 | [/v/guochuang/chinese](https://www.bilibili.com/v/guochuang/chinese) | -| 国产原创相关 | original | 168 | | [/v/guochuang/original](https://www.bilibili.com/v/guochuang/original) | -| 布袋戏 | puppetry | 169 | | [/v/guochuang/puppetry](https://www.bilibili.com/v/guochuang/puppetry) | -| 资讯 | information | 170 | | [/v/guochuang/information](https://www.bilibili.com/v/guochuang/information) | -| 动态漫·广播剧 | motioncomic | 195 | | [/v/guochuang/motioncomic](https://www.bilibili.com/v/guochuang/motioncomic) | - -## 音乐 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------------|----------------|---------|----------------------------------------------------------|--------------------------------------------------------------------| -| 音乐(主分区) | music | 3 | | [/v/music](https://www.bilibili.com/v/music) | -| 原创音乐 | original | 28 | 原创歌曲及纯音乐,包括改编、重编曲及remix | [/v/music/original](https://www.bilibili.com/v/music/original) | -| 音乐现场 | live | 29 | 音乐表演的实况视频,包括官方的综艺节目、音乐剧、音乐节、演唱会、打歌舞台现场等,以及个人演出/街头表演现场等 | [/v/music/live](https://www.bilibili.com/v/music/live) | -| 翻唱 | cover | 31 | 对曲目的人声再演绎视频 | [/v/music/cover](https://www.bilibili.com/v/music/cover) | -| 演奏 | perform | 59 | 乐器和非传统乐器器材的演奏作品 | [/v/music/perform](https://www.bilibili.com/v/music/perform) | -| 乐评盘点 | commentary | 243 | 音乐类新闻、盘点、点评、reaction、榜单、采访、幕后故事、唱片开箱等 | [/v/music/commentary](https://www.bilibili.com/v/music/commentary) | -| VOCALOID·UTAU | vocaloid | 30 | 以VOCALOID等歌声合成引擎为基础,运用各类音源进行的创作 | [/v/music/vocaloid](https://www.bilibili.com/v/music/vocaloid) | -| MV | mv | 193 | 为音乐作品配合拍摄或制作的音乐录影带(Music Video),以及自制拍摄、剪辑、翻拍MV | [/v/music/mv](https://www.bilibili.com/v/music/mv) | -| 音乐粉丝饭拍 | fan_videos | 266 | 在音乐演出现场由粉丝团体或个人拍摄的非官方记录视频,包括但不限于粉丝自制饭拍、直拍、Vlog以及衍生的内容混剪等 | [/v/music/fan_videos](https://www.bilibili.com/v/music/fan_videos) | -| AI音乐 | ai_music | 265 | 以AI合成技术为基础,运用各类工具进行的AI作编曲、AI作词、AI语音、AI变声、AI翻唱、AI MV等创作 | [/v/music/ai_music](https://www.bilibili.com/v/music/ai_music) | -| 电台 | radio | 267 | 音乐分享、播单、白噪音、有声读物等以听为主的播放内容 | [/v/music/radio](https://www.bilibili.com/v/music/radio) | -| 音乐教学 | tutorial | 244 | 以音乐教学为目的的内容 | [/v/music/tutorial](https://www.bilibili.com/v/music/tutorial) | -| 音乐综合 | other | 130 | 所有无法被收纳到其他音乐二级分区的音乐类视频 | [/v/music/other](https://www.bilibili.com/v/music/other) | -| ~~电音~~(已下线) | ~~electronic~~ | ~~194~~ | ~~以电子合成器、音乐软体等产生的电子声响制作的音乐~~ | ~~/v/music/electronic~~ | - -## 舞蹈 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|-------------------------|----------|-----|--------------------------------------|----------------------------------------------------------------| -| 舞蹈(主分区) | dance | 129 | | [/v/dance](https://www.bilibili.com/v/dance) | -| 宅舞 | otaku | 20 | 与ACG相关的翻跳、原创舞蹈 | [/v/dance/otaku](https://www.bilibili.com/v/dance/otaku) | -| 街舞 | hiphop | 198 | 收录街舞相关内容,包括赛事现场、舞室作品、个人翻跳、FREESTYLE等 | [/v/dance/hiphop](https://www.bilibili.com/v/dance/hiphop) | -| 明星舞蹈 | star | 199 | 国内外明星发布的官方舞蹈及其翻跳内容 | [/v/dance/star](https://www.bilibili.com/v/dance/star) | -| 国风舞蹈 | china | 200 | 收录国风向舞蹈内容,包括中国舞、民族民间舞、汉唐舞、国风爵士等 | [/v/dance/china](https://www.bilibili.com/v/dance/china) | -| 颜值·网红舞
(~~原手势·网红舞~~) | gestures | 255 | 手势舞及网红流行舞蹈、短视频舞蹈等相关视频 | [/v/dance/gestures](https://www.bilibili.com/v/dance/gestures) | -| 舞蹈综合 | three_d | 154 | 收录无法定义到其他舞蹈子分区的舞蹈视频 | [/v/dance/three_d](https://www.bilibili.com/v/dance/three_d) | -| 舞蹈教程 | demo | 156 | 镜面慢速,动作分解,基础教程等具有教学意义的舞蹈视频 | [/v/dance/demo](https://www.bilibili.com/v/dance/demo) | - -## 游戏 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|-------------|-----|---------------------------------------------------------------|--------------------------------------------------------------------| -| 游戏(主分区) | game | 4 | | [/v/game](https://www.bilibili.com/v/game) | -| 单机游戏 | stand_alone | 17 | 以所有平台(PC、主机、移动端)的单机或联机游戏为主的视频内容,包括游戏预告、CG、实况解说及相关的评测、杂谈与视频剪辑等 | [/v/game/stand_alone](https://www.bilibili.com/v/game/stand_alone) | -| 电子竞技 | esports | 171 | 具有高对抗性的电子竞技游戏项目,其相关的赛事、实况、攻略、解说、短剧等视频。 | [/v/game/esports](https://www.bilibili.com/v/game/esports) | -| 手机游戏 | mobile | 172 | 以手机及平板设备为主要平台的游戏,其相关的实况、攻略、解说、短剧、演示等视频。 | [/v/game/mobile](https://www.bilibili.com/v/game/mobile) | -| 网络游戏 | online | 65 | 由网络运营商运营的多人在线游戏,以及电子竞技的相关游戏内容。包括赛事、攻略、实况、解说等相关视频 | [/v/game/online](https://www.bilibili.com/v/game/online) | -| 桌游棋牌 | board | 173 | 桌游、棋牌、卡牌对战等及其相关电子版游戏的实况、攻略、解说、演示等视频。 | [/v/game/board](https://www.bilibili.com/v/game/board) | -| GMV | gmv | 121 | 由游戏素材制作的MV视频。以游戏内容或CG为主制作的,具有一定创作程度的MV类型的视频 | [/v/game/gmv](https://www.bilibili.com/v/game/gmv) | -| 音游 | music | 136 | 各个平台上,通过配合音乐与节奏而进行的音乐类游戏视频 | [/v/game/music](https://www.bilibili.com/v/game/music) | -| Mugen | mugen | 19 | 以Mugen引擎为平台制作、或与Mugen相关的游戏视频 | [/v/game/mugen](https://www.bilibili.com/v/game/mugen) | - -## 知识 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|-----------------------------|-------------------|--------|-----------------------------|----------------------------------------------------------------------------------------| -| 知识(主分区) | knowledge | 36 | | [/v/knowledge](https://www.bilibili.com/v/knowledge) | -| 科学科普 | science | 201 | 回答你的十万个为什么 | [/v/knowledge/science](https://www.bilibili.com/v/knowledge/science) | -| 社科·法律·心理(~~原社科人文、原趣味科普人文~~) | social_science | 124 | 基于社会科学、法学、心理学展开或个人观点输出的知识视频 | [/v/knowledge/social_science](https://www.bilibili.com/v/knowledge/social_science) | -| 人文历史 | humanity_history | 228 | 看看古今人物,聊聊历史过往,品品文学典籍 | [/v/knowledge/humanity_history](https://www.bilibili.com/v/knowledge/humanity_history) | -| 财经商业 | business | 207 | 说金融市场,谈宏观经济,一起畅聊商业故事 | [/v/knowledge/finance](https://www.bilibili.com/v/knowledge/finance) | -| 校园学习 | campus | 208 | 老师很有趣,学生也有才,我们一起搞学习 | [/v/knowledge/campus](https://www.bilibili.com/v/knowledge/campus) | -| 职业职场 | career | 209 | 职业分享、升级指南,一起成为最有料的职场人 | [/v/knowledge/career](https://www.bilibili.com/v/knowledge/career) | -| 设计·创意 | design | 229 | 天马行空,创意设计,都在这里 | [/v/knowledge/design](https://www.bilibili.com/v/knowledge/design) | -| 野生技术协会 | skill | 122 | 技能党集合,是时候展示真正的技术了 | [/v/knowledge/skill](https://www.bilibili.com/v/knowledge/skill) | -| ~~演讲·公开课~~(已下线) | ~~speech_course~~ | ~~39~~ | ~~涨知识的好地方,给爱学习的你~~ | ~~/v/technology/speech_course~~ | -| ~~星海~~(已下线) | ~~military~~ | ~~96~~ | ~~军事类内容的圣地~~ | ~~/v/technology/military~~ | -| ~~机械~~(已下线) | ~~mechanical~~ | ~~98~~ | ~~机械设备展示或制作视频~~ | ~~/v/technology/mechanical~~ | - -## 科技 - -新:旧: - -~~原数码分区~~ - -| 名称 | 代号 | tid | 简介 | url路由 | -|----------------------|---------------------|---------|----------------------------------|------------------------------------------------------------------------| -| 科技(主分区) | tech | 188 | | [/v/tech](https://www.bilibili.com/v/tech) | -| 数码(~~原手机平板~~) | digital | 95 | 科技数码产品大全,一起来做发烧友 | [/v/tech/digital](https://www.bilibili.com/v/tech/digital) | -| 软件应用 | application | 230 | 超全软件应用指南 | [/v/tech/application](https://www.bilibili.com/v/tech/application) | -| 计算机技术 | computer_tech | 231 | 研究分析、教学演示、经验分享......有关计算机技术的都在这里 | [/v/tech/computer_tech](https://www.bilibili.com/v/tech/computer_tech) | -| 科工机械 (~~原工业·工程·机械~~) | industry | 232 | 从小芯片到大工程,一起见证科工力量 | [/v/tech/industry](https://www.bilibili.com/v/tech/industry) | -| 极客DIY | diy | 233 | 炫酷技能,极客文化,硬核技巧,准备好你的惊讶 | [/v/tech/diy](https://www.bilibili.com/v/tech/diy) | -| ~~电脑装机~~(已下线) | ~~pc~~ | ~~189~~ | ~~电脑、笔记本、装机配件、外设和软件教程等相关视频~~ | ~~/v/digital/pc~~ | -| ~~摄影摄像~~(已下线) | ~~photography~~ | ~~190~~ | ~~摄影摄像器材、拍摄剪辑技巧、拍摄作品分享等相关视频~~ | ~~/v/digital/photography~~ | -| ~~影音智能~~(已下线) | ~~intelligence_av~~ | ~~191~~ | ~~影音设备、智能产品等相关视频~~ | ~~/v/digital/intelligence_av~~ | - -## 运动 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|---------------|-----|--------------------------------------------------------|----------------------------------------------------------------------------| -| 运动(主分区) | sports | 234 | | [/v/sports](https://www.bilibili.com/v/sports) | -| 篮球 | basketball | 235 | 与篮球相关的视频,包括但不限于篮球赛事、教学、评述、剪辑、剧情等相关内容 | [/v/sports/basketball](https://www.bilibili.com/v/sports/basketball) | -| 足球 | football | 249 | 与足球相关的视频,包括但不限于足球赛事、教学、评述、剪辑、剧情等相关内容 | [/v/sports/football](https://www.bilibili.com/v/sports/football) | -| 健身 | aerobics | 164 | 与健身相关的视频,包括但不限于瑜伽、CrossFit、健美、力量举、普拉提、街健等相关内容 | [/v/sports/aerobics](https://www.bilibili.com/v/sports/aerobics) | -| 竞技体育 | athletic | 236 | 与竞技体育相关的视频,包括但不限于乒乓、羽毛球、排球、赛车等竞技项目的赛事、评述、剪辑、剧情等相关内容 | [/v/sports/culture](https://www.bilibili.com/v/sports/culture) | -| 运动文化 | culture | 237 | 与运动文化相关的视频,包络但不限于球鞋、球衣、球星卡等运动衍生品的分享、解读,体育产业的分析、科普等相关内容 | [/v/sports/culture](https://www.bilibili.com/v/sports/culture) | -| 运动综合 | comprehensive | 238 | 与运动综合相关的视频,包括但不限于钓鱼、骑行、滑板等日常运动分享、教学、Vlog等相关内容 | [/v/sports/comprehensive](https://www.bilibili.com/v/sports/comprehensive) | - -## 汽车 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------------|------------------|---------|---------------------------------------------------------------|----------------------------------------------------------------------------| -| 汽车(主分区) | car | 223 | | [/v/car](https://www.bilibili.com/v/car) | -| 汽车知识科普 | knowledge | 258 | 关于汽车技术与文化的硬核科普,以及生活中学车、用车、养车的相关知识 | [/v/car/knowledge](https://www.bilibili.com/v/car/knowledge) | -| 购车攻略 | strategy | 227 | 丰富详实的购车建议和新车体验 | [/v/car/strategy](https://www.bilibili.com/v/car/strategy) | -| 新能源车 | newenergyvehicle | 247 | 新能源汽车相关内容,包括电动汽车、混合动力汽车等车型种类,包含不限于新车资讯、试驾体验、专业评测、技术解读、知识科普等内容 | [/v/car/newenergyvehicle](https://www.bilibili.com/v/car/newenergyvehicle) | -| 赛车 | racing | 245 | F1等汽车运动相关 | [/v/car/racing](https://www.bilibili.com/v/car/racing) | -| 改装玩车 | modifiedvehicle | 246 | 汽车文化及改装车相关内容,包括改装车、老车修复介绍、汽车聚会分享等内容 | [/v/car/modifiedvehicle](https://www.bilibili.com/v/car/modifiedvehicle) | -| 摩托车 | motorcycle | 240 | 骑士们集合啦 | [/v/car/motorcycle](https://www.bilibili.com/v/car/motorcycle) | -| 房车 | touringcar | 248 | 房车及营地相关内容,包括不限于产品介绍、驾驶体验、房车生活和房车旅行等内容 | [/v/car/touringcar](https://www.bilibili.com/v/car/touringcar) | -| 汽车生活 | life | 176 | 分享汽车及出行相关的生活体验类视频 | [/v/car/life](https://www.bilibili.com/v/car/life) | -| ~~汽车文化~~(已下线) | ~~culture~~ | ~~224~~ | ~~车迷的精神圣地,包括汽车赛事、品牌历史、汽车改装、经典车型和汽车模型等~~ | ~~/v/car/culture~~ | -| ~~汽车极客~~(已下线) | ~~geek~~ | ~~225~~ | ~~汽车硬核达人聚集地,包括DIY造车、专业评测和技术知识分享~~ | ~~/v/car/geek~~ | -| ~~智能出行~~(已下线) | ~~smart~~ | ~~226~~ | ~~探索新能源汽车和未来智能出行的前沿阵地~~ | ~~/v/car/smart~~ | - -## 生活 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|--------------|----------------|---------|-----------------------------------|----------------------------------------------------------------| -| 生活(主分区) | life | 160 | | [/v/life](https://www.bilibili.com/v/life) | -| 搞笑 | funny | 138 | 各种沙雕有趣的搞笑剪辑,挑战,表演,配音等视频 | [/v/life/funny](https://www.bilibili.com/v/life/funny) | -| 亲子 | parenting | 254 | 分享亲子、萌娃、母婴、育儿相关的视频 | [/v/life/parenting](https://www.bilibili.com/v/life/parenting) | -| 出行 | travel | 250 | 为达到观光游览、休闲娱乐为目的的远途旅行、中近途户外生活、本地探店 | [/v/life/travel](https://www.bilibili.com/v/life/travel) | -| 三农 | rurallife | 251 | 分享美好农村生活 | [/v/life/rurallife](https://www.bilibili.com/v/life/rurallife) | -| 家居房产 | home | 239 | 与买房、装修、居家生活相关的分享 | [/v/life/home](https://www.bilibili.com/v/life/home) | -| 手工 | handmake | 161 | 手工制品的制作过程或成品展示、教程、测评类视频 | [/v/life/handmake](https://www.bilibili.com/v/life/handmake) | -| 绘画 | painting | 162 | 绘画过程或绘画教程,以及绘画相关的所有视频 | [/v/life/painting](https://www.bilibili.com/v/life/painting) | -| 日常 | daily | 21 | 记录日常生活,分享生活故事 | [/v/life/daily](https://www.bilibili.com/v/life/daily) | -| ~~美食圈~~(重定向) | ~~food~~ | ~~76~~ | ~~美食鉴赏&料理制作教程~~ | ~~/v/life/food~~ | -| ~~动物圈~~(重定向) | ~~animal~~ | ~~75~~ | ~~萌萌的动物都在这里哦~~ | ~~/v/life/animal~~ | -| ~~运动~~(重定向) | ~~sports~~ | ~~163~~ | ~~运动相关的记录、教程、装备评测和精彩瞬间剪辑视频~~ | ~~/v/life/sports~~ | -| ~~汽车~~(重定向) | ~~automobile~~ | ~~176~~ | ~~专业汽车资讯,分享车生活~~ | ~~/v/life/automobile~~ | -| ~~其他~~(已下线) | ~~other~~ | ~~174~~ | ~~对于分区归属不明的视频进行归纳整合的特定分区~~ | ~~/v/life/other~~ | - -## 美食 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|------------------------|-------------|-----|------------------|--------------------------------------------------------------------| -| 美食(主分区) | food | 211 | | [/v/food](https://www.bilibili.com/v/food) | -| 美食制作(~~原[生活]->[美食圈]~~) | make | 76 | 学做人间美味,展示精湛厨艺 | [/v/food/make](https://www.bilibili.com/v/food/make) | -| 美食侦探 | detective | 212 | 寻找美味餐厅,发现街头美食 | [/v/food/detective](https://www.bilibili.com/v/food/detective) | -| 美食测评 | measurement | 213 | 吃货世界,品尝世间美味 | [/v/food/measurement](https://www.bilibili.com/v/food/measurement) | -| 田园美食 | rural | 214 | 品味乡野美食,寻找山与海的味道 | [/v/food/rural](https://www.bilibili.com/v/food/rural) | -| 美食记录 | record | 215 | 记录一日三餐,给生活添一点幸福感 | [/v/food/record](https://www.bilibili.com/v/food/record) | - -## 动物圈 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|----------|------------------|-----|-------------------------------------------|----------------------------------------------------------------------------------| -| 动物圈(主分区) | animal | 217 | | [/v/animal](https://www.bilibili.com/v/animal) | -| 喵星人 | cat | 218 | 喵喵喵喵喵 | [/v/animal/cat](https://www.bilibili.com/v/animal/cat) | -| 汪星人 | dog | 219 | 汪汪汪汪汪 | [/v/animal/dog](https://www.bilibili.com/v/animal/dog) | -| 小宠异宠 | reptiles | 222 | 奇妙宠物大赏 | [/v/animal/reptiles](https://www.bilibili.com/v/animal/reptiles) | -| 野生动物 | wild_animal | 221 | 内有“猛兽”出没 | [/v/animal/wild_animal](https://www.bilibili.com/v/animal/wild_animal) | -| 动物二创 | second_edition | 220 | 解说、配音、剪辑、混剪 | [/v/animal/second_edition](https://www.bilibili.com/v/animal/second_edition) | -| 动物综合 | animal_composite | 75 | 收录除上述子分区外,其余动物相关视频以及非动物主体或多个动物主体的动物相关延伸内容 | [/v/animal/animal_composite](https://www.bilibili.com/v/animal/animal_composite) | - -## 鬼畜 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|------------|-----------------|-----|-----------------------------------------|----------------------------------------------------------------------------------| -| 鬼畜(主分区) | kichiku | 119 | | [/v/kichiku](https://www.bilibili.com/v/kichiku) | -| 鬼畜调教 | guide | 22 | 使用素材在音频、画面上做一定处理,达到与BGM一定的同步感 | [/v/kichiku/guide](https://www.bilibili.com/v/kichiku/guide) | -| 音MAD | mad | 26 | 使用素材音频进行一定的二次创作来达到还原原曲的非商业性质稿件 | [/v/kichiku/mad/v/kichiku/mad](https://www.bilibili.com/v/kichiku/mad) | -| 人力VOCALOID | manual_vocaloid | 126 | 将人物或者角色的无伴奏素材进行人工调音,使其就像VOCALOID一样歌唱的技术 | [/v/kichiku/manual_vocaloid](https://www.bilibili.com/v/kichiku/manual_vocaloid) | -| 鬼畜剧场 | theatre | 216 | 使用素材进行人工剪辑编排的有剧情的作品 | [/v/kichiku/theatre](https://www.bilibili.com/v/kichiku/theatre) | -| 教程演示 | course | 127 | 鬼畜相关的教程演示 | [/v/kichiku/course](https://www.bilibili.com/v/kichiku/course) | - -## 时尚 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|--------------|--------------|---------|---------------------------------------------|--------------------------------------------------------------------| -| 时尚(主分区) | fashion | 155 | | [/v/fashion](https://www.bilibili.com/v/fashion) | -| 美妆护肤 | makeup | 157 | 彩妆护肤、美甲美发、仿妆、医美相关内容分享或产品测评 | [/v/fashion/makeup](https://www.bilibili.com/v/fashion/makeup) | -| 仿妆cos | cos | 252 | 对二次元、三次元人物角色进行模仿、还原、展示、演绎的内容 | [/v/fashion/cos](https://www.bilibili.com/v/fashion/cos) | -| 穿搭 | clothing | 158 | 穿搭风格、穿搭技巧的展示分享,涵盖衣服、鞋靴、箱包配件、配饰(帽子、钟表、珠宝首饰)等 | [/v/fashion/clothing](https://www.bilibili.com/v/fashion/clothing) | -| 时尚潮流 | catwalk | 159 | 时尚街拍、时装周、时尚大片,时尚品牌、潮流等行业相关记录及知识科普 | [/v/fashion/catwalk](https://www.bilibili.com/v/fashion/catwalk) | -| ~~健身~~(重定向) | ~~aerobics~~ | ~~164~~ | ~~器械、有氧、拉伸运动等,以达到强身健体、减肥瘦身、形体塑造目的~~ | ~~/v/fashion/aerobics~~ | -| ~~风尚标~~(已下线) | ~~trends~~ | ~~192~~ | ~~时尚明星专访、街拍、时尚购物相关知识科普~~ | ~~/v/fashion/trends~~ | - -## 资讯 - -**注:该分区无排名功能** - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|-------------|-----|------------------------|----------------------------------------------------------------------------| -| 资讯(主分区) | information | 202 | | [/v/information](https://www.bilibili.com/v/information) | -| 热点 | hotspot | 203 | 全民关注的时政热门资讯 | [/v/information/hotspot](https://www.bilibili.com/v/information/hotspot) | -| 环球 | global | 204 | 全球范围内发生的具有重大影响力的事件动态 | [/v/information/global](https://www.bilibili.com/v/information/global) | -| 社会 | social | 205 | 日常生活的社会事件、社会问题、社会风貌的报道 | [/v/information/social](https://www.bilibili.com/v/information/social) | -| 综合 | multiple | 206 | 除上述领域外其它垂直领域的综合资讯 | [/v/information/multiple](https://www.bilibili.com/v/information/multiple) | - -## 广告 - - - -**该分区已下线** - -| 名称 | 代号 | tid | 简介 | url路由 | -|-------------|--------|---------|-----|--------------| -| ~~广告(主分区)~~ | ~~ad~~ | ~~165~~ | | ~~/v/ad~~ | -| ~~广告~~(已下线) | ~~ad~~ | ~~166~~ | | ~~/v/ad/ad~~ | - -## 娱乐 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|-----------------------|--------------------|---------|------------------------------------------|--------------------------------------------------------------------------------| -| 娱乐(主分区) | ent | 5 | | [/v/ent](https://www.bilibili.com/v/ent) | -| 娱乐杂谈 | talker | 241 | 娱乐人物解读、娱乐热点点评、娱乐行业分析 | [/v/ent/talker](https://www.bilibili.com/v/ent/talker) | -| CP安利 | cp_recommendation | 262 | 以安利各类娱乐名人、角色CP之间默契于火花为主题的混剪、解说,观点表达类视频 | [/v/ent/cp_recommendation](https://www.bilibili.com/v/ent/cp_recommendation) | -| 颜值安利 | beauty | 263 | 以各类娱乐名人、角色的颜值、气质魅力为核心的混剪视频 | [/v/ent/beauty](https://www.bilibili.com/v/ent/beauty) | -| 娱乐粉丝创作
(~~原粉丝创作~~) | fans | 242 | 粉丝向创作视频 | [/v/ent/fans](https://www.bilibili.com/v/ent/fans) | -| 娱乐资讯 | entertainment_news | 264 | 具备趣味价值的文化娱乐新闻与动态报道,如名人动态,作品发布,舞台演出,趣闻盘点等 | [/v/ent/entertainment_news](https://www.bilibili.com/v/ent/entertainment_news) | -| 明星综合 | celebrity | 137 | 娱乐圈动态、明星资讯相关 | [/v/ent/celebrity](https://www.bilibili.com/v/ent/celebrity) | -| 综艺 | variety | 71 | 所有综艺相关,全部一手掌握! | [/v/ent/variety](https://www.bilibili.com/v/ent/variety) | -| ~~Korea相关~~(已下线) | ~~korea~~ | ~~131~~ | ~~Korea相关音乐、舞蹈、综艺等视频~~ | ~~/v/ent/korea~~ | - -## 影视 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|---------------|-----|-------------------------------|----------------------------------------------------------------------------------| -| 影视(主分区) | cinephile | 181 | | [/v/cinephile](https://www.bilibili.com/v/cinephile) | -| 影视杂谈 | cinecism | 182 | 影视评论、解说、吐槽、科普等 | [/v/cinephile/cinecism](https://www.bilibili.com/v/cinephile/cinecism) | -| 影视剪辑 | montage | 183 | 对影视素材进行剪辑再创作的视频 | [/v/cinephile/montage](https://www.bilibili.com/v/cinephile/montage) | -| 影视整活 | mashup | 260 | 使用影视素材制造的有趣、有梗的创意混剪、配音、特效玩梗视频 | [/v/cinephile/mashup](https://www.bilibili.com/v/cinephile/mashup) | -| AI影像 | ai_imaging | 259 | 分享AI制作的影像作品、创作历程、技术风向 | [/v/cinephile/ai_imaging](https://www.bilibili.com/v/cinephile/ai_imaging) | -| 预告·资讯 | trailer_info | 184 | 影视类相关资讯,预告,花絮等视频 | [/v/cinephile/trailer_info](https://www.bilibili.com/v/cinephile/trailer_info) | -| 小剧场 | shortplay | 85 | 有场景、有剧情的演绎类内容 | [/v/cinephile/shortplay](https://www.bilibili.com/v/cinephile/shortplay) | -| 短片 | shortfilm | 256 | 各种类型的短片 | [/v/cinephile/shortfilm](https://www.bilibili.com/v/cinephile/shortfilm) | -| 影视综合 | comprehensive | 261 | 一切无法被收纳其他影视二级分区的影视相关内容 | [/v/cinephile/comprehensive](https://www.bilibili.com/v/cinephile/comprehensive) | - -## 纪录片 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|----------|-------------|-----|----|----------------------------------------------------------------------------| -| 纪录片(主分区) | documentary | 177 | | [/documentary](https://www.bilibili.com/documentary) | -| 人文·历史 | history | 37 | | [/v/documentary/history](https://www.bilibili.com/v/documentary/history) | -| 科学·探索·自然 | science | 178 | | [/v/documentary/science](https://www.bilibili.com/v/documentary/science) | -| 军事 | military | 179 | | [/v/documentary/military](https://www.bilibili.com/v/documentary/military) | -| 社会·美食·旅行 | travel | 180 | | [/v/documentary/travel](https://www.bilibili.com/v/documentary/travel) | - -## 电影 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|---------|---------|-----|-----|--------------------------------------------------------------| -| 电影(主分区) | movie | 23 | | [/movie](https://www.bilibili.com/movie) | -| 华语电影 | chinese | 147 | | [/v/movie/chinese](https://www.bilibili.com/v/movie/chinese) | -| 欧美电影 | west | 145 | | [/v/movie/west](https://www.bilibili.com/v/movie/west) | -| 日本电影 | japan | 146 | | [/v/movie/japan](https://www.bilibili.com/v/movie/japan) | -| 其他国家 | movie | 83 | | [/v/movie/movie](https://www.bilibili.com/v/movie/movie) | - -## 电视剧 - - - -| 名称 | 代号 | tid | 简介 | url路由 | -|----------|----------|-----|-----|----------------------------------------------------------| -| 电视剧(主分区) | tv | 11 | | [/tv](https://www.bilibili.com/tv) | -| 国产剧 | mainland | 185 | | [/v/tv/mainland](https://www.bilibili.com/v/tv/mainland) | -| 海外剧 | overseas | 187 | | [/v/tv/overseas](https://www.bilibili.com/v/tv/overseas) | diff --git a/docs/video/video_zone_v2.md b/docs/video/video_zone_v2.md deleted file mode 100644 index 247c122..0000000 --- a/docs/video/video_zone_v2.md +++ /dev/null @@ -1,458 +0,0 @@ -# 视频分区一览 (v2) - -本文档中的内容适用于 `tid_v2`(部分接口写为 `tidv2`)、`tname_v2`(部分接口写为 `tnamev2`)等字段,关于 `tid`、`tname` 等字段请参阅 “[视频分区一览](./video_zone.md)” 文档 - -目前 B 站尚未启用子分区 - -## 动画 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ----------- | ---- | --------- | ---------------------------------------------- | -| 动画 (主分区) | douga | 1005 | 7 | [/c/douga/](https://www.bilibili.com/c/douga/) | -| 同人动画 | fan_anime | 2037 | | | -| 模玩周边 | garage_kit | 2038 | | | -| cosplay | cosplay | 2039 | | | -| 二次元线下 | offline | 2040 | | | -| 动漫剪辑 | editing | 2041 | | | -| 动漫评论 | commentary | 2042 | | | -| 动漫速读 | quick_view | 2043 | | | -| 动漫配音 | voice | 2044 | | | -| 动漫资讯 | information | 2045 | | | -| 网文解读 | interpret | 2046 | | | -| 虚拟up主 | vup | 2047 | | | -| 特摄 | tokusatsu | 2048 | | | -| 布袋戏 | puppetry | 2049 | | | -| 漫画·动态漫 | comic | 2050 | | | -| 广播剧 | motion | 2051 | | | -| 动漫reaction | reaction | 2052 | | | -| 动漫教学 | tutorial | 2053 | | | -| 二次元其他 | other | 2054 | | | - -## 游戏 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| -------------- | ----------- | ---- | --------- | -------------------------------------------- | -| 游戏 (主分区) | game | 1008 | 8 | [/c/game/](https://www.bilibili.com/c/game/) | -| 单人RPG游戏 | rpg | 2064 | | | -| MMORPG游戏 | mmorpg | 2065 | | | -| 单机主机类游戏 | stand_alone | 2066 | | | -| SLG游戏 | slg | 2067 | | | -| 回合制策略游戏 | tbs | 2068 | | | -| 即时策略游戏 | rts | 2069 | | | -| MOBA游戏 | moba | 2070 | | | -| 射击游戏 | stg | 2071 | | | -| 体育竞速游戏 | spg | 2072 | | | -| 动作竞技游戏 | act | 2073 | | | -| 音游舞游 | msc | 2074 | | | -| 模拟经营游戏 | sim | 2075 | | | -| 女性向游戏 | otome | 2076 | | | -| 休闲/小游戏 | puz | 2077 | | | -| 沙盒类 | sandbox | 2078 | | | -| 其他游戏 | other | 2079 | | | - -## 鬼畜 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | --------------- | ---- | --------- | -------------------------------------------------- | -| 鬼畜 (主分区) | kichiku | 1007 | 9 | [/c/kichiku/](https://www.bilibili.com/c/kichiku/) | -| 鬼畜调教 | guide | 2059 | | | -| 鬼畜剧场 | theatre | 2060 | | | -| 人力VOCALOID | manual_vocaloid | 2061 | | | -| 音MAD | mad | 2062 | | | -| 鬼畜综合 | other | 2063 | | | - -## 音乐 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ---------- | ---- | --------- | ---------------------------------------------- | -| 音乐 (主分区) | music | 1003 | 10 | [/c/music/](https://www.bilibili.com/c/music/) | -| 原创音乐 | original | 2016 | | | -| MV | mv | 2017 | | | -| 音乐现场 | live | 2018 | | | -| 乐迷饭拍 | fan_videos | 2019 | | | -| 翻唱 | cover | 2020 | | | -| 演奏 | perform | 2021 | | | -| VOCALOID | vocaloid | 2022 | | | -| AI音乐 | ai_music | 2023 | | | -| 电台·歌单 | radio | 2024 | | | -| 音乐教学 | tutorial | 2025 | | | -| 乐评盘点 | commentary | 2026 | | | -| 音乐综合 | other | 2027 | | | - -## 舞蹈 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | -------- | ---- | --------- | ---------------------------------------------- | -| 舞蹈 (主分区) | dance | 1004 | 11 | [/c/dance/](https://www.bilibili.com/c/dance/) | -| 宅舞 | otaku | 2028 | | | -| 街舞 | hiphop | 2029 | | | -| 颜值·网红舞 | gestures | 2030 | | | -| 明星舞蹈 | star | 2031 | | | -| 国风舞蹈 | china | 2032 | | | -| 舞蹈教学 | tutorial | 2033 | | | -| 芭蕾舞 | ballet | 2034 | | | -| wota艺 | wota | 2035 | | | -| 舞蹈综合 | other | 2036 | | | - -## 影视 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ----------- | ---- | --------- | ------------------------------------------------------ | -| 影视 (主分区) | cinephile | 1001 | 12 | [/c/cinephile/](https://www.bilibili.com/c/cinephile/) | -| 影视解读 | commentary | 2001 | | | -| 影视剪辑 | montage | 2002 | | | -| 影视资讯 | information | 2003 | | | -| 影视正片搬运 | porterage | 2004 | | | -| 短剧短片 | shortfilm | 2005 | | | -| AI影视 | ai | 2006 | | | -| 影视reaction | reaction | 2007 | | | -| 影视综合 | other | 2008 | | | - -## 娱乐 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ----------- | ---- | --------- | ------------------------------------------ | -| 娱乐 (主分区) | ent | 1002 | 13 | [/c/ent/](https://www.bilibili.com/c/ent/) | -| 娱乐评论 | commentary | 2009 | | | -| 明星剪辑 | montage | 2010 | | | -| 娱乐饭拍&现场 | fans_video | 2011 | | | -| 娱乐资讯 | information | 2012 | | | -| 娱乐reaction | reaction | 2013 | | | -| 娱乐综艺正片 | variety | 2014 | | | -| 娱乐综合 | other | 2015 | | | - -## 知识 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| -------------- | ------------------ | ---- | --------- | ------------------------------------------------------ | -| 知识 (主分区) | knowledge | 1010 | 14 | [/c/knowledge/](https://www.bilibili.com/c/knowledge/) | -| 应试教育 | exam | 2084 | | | -| 非应试语言学习 | lang_skill | 2085 | | | -| 大学专业知识 | campus | 2086 | | | -| 商业财经 | business | 2087 | | | -| 社会观察 | social_observation | 2088 | | | -| 时政解读 | politics | 2089 | | | -| 人文历史 | humanity_history | 2090 | | | -| 设计艺术 | design | 2091 | | | -| 心理杂谈 | psychology | 2092 | | | -| 职场发展 | career | 2093 | | | -| 科学科普 | science | 2094 | | | -| 其他知识杂谈 | other | 2095 | | | - -## 科技数码 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ----------- | ---- | --------- | -------------------------------------------- | -| 科技数码 (主分区) | tech | 1012 | 15 | [/c/tech/](https://www.bilibili.com/c/tech/) | -| 电脑 | computer | 2099 | | | -| 手机 | phone | 2100 | | | -| 平板电脑 | pad | 2101 | | | -| 摄影摄像 | photography | 2102 | | | -| 工程机械 | machine | 2103 | | | -| 自制发明/设备 | create | 2104 | | | -| 科技数码综合 | other | 2105 | | | - -## 资讯 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ----------- | ---- | --------- | ---------------------------------------------------------- | -| 资讯 (主分区) | information | 1009 | 16 | [/c/information/](https://www.bilibili.com/c/information/) | -| 时政资讯 | politics | 2080 | | | -| 海外资讯 | overseas | 2081 | | | -| 社会资讯 | social | 2082 | | | -| 综合资讯 | other | 2083 | | | - -## 美食 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ---------- | ---- | --------- | -------------------------------------------- | -| 美食 (主分区) | food | 1020 | 17 | [/c/food/](https://www.bilibili.com/c/food/) | -| 美食制作 | make | 2149 | | | -| 美食探店 | detective | 2150 | | | -| 美食测评 | commentary | 2151 | | | -| 美食记录 | record | 2152 | | | -| 美食综合 | other | 2153 | | | - -## 小剧场 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| --------------- | ---------- | ---- | --------- | ------------------------------------------------------ | -| 小剧场 (主分区) | shortplay | 1021 | 18 | [/c/shortplay/](https://www.bilibili.com/c/shortplay/) | -| 剧情演绎 | plot | 2154 | | | -| 语言类小剧场 | lang | 2155 | | | -| UP主小综艺 | up_variety | 2156 | | | -| 街头采访 | interview | 2157 | | | - -## 汽车 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ---------- | ---- | --------- | ---------------------------------------- | -| 汽车 (主分区) | car | 1013 | 19 | [/c/car](https://www.bilibili.com/c/car) | -| 汽车测评 | commentary | 2106 | | | -| 汽车文化 | culture | 2107 | | | -| 汽车生活 | life | 2108 | | | -| 汽车技术 | tech | 2109 | | | -| 汽车综合 | other | 2110 | | | - -## 时尚美妆 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ----------- | ---- | --------- | -------------------------------------------------- | -| 时尚美妆 (主分区) | fashion | 1014 | 20 | [/c/fashion/](https://www.bilibili.com/c/fashion/) | -| 美妆 | makeup | 2111 | | | -| 护肤 | skincare | 2112 | | | -| 仿装cos | cos | 2113 | | | -| 鞋服穿搭 | outfits | 2114 | | | -| 箱包配饰 | accessories | 2115 | | | -| 珠宝首饰 | jewelry | 2116 | | | -| 三坑 | trick | 2117 | | | -| 时尚解读 | commentary | 2118 | | | -| 时尚综合 | other | 2119 | | | - -## 体育运动 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ----------- | ---- | --------- | ------------------------------------------------ | -| 体育运动 (主分区) | sports | 1018 | 21 | [/c/sports/](https://www.bilibili.com/c/sports/) | -| 潮流运动 | trend | 2133 | | | -| 足球 | football | 2134 | | | -| 篮球 | basketball | 2135 | | | -| 跑步 | running | 2136 | | | -| 武术 | kungfu | 2137 | | | -| 格斗 | fighting | 2138 | | | -| 羽毛球 | badminton | 2139 | | | -| 体育资讯 | information | 2140 | | | -| 体育赛事 | match | 2141 | | | -| 体育综合 | other | 2142 | | | - -## 动物 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| --------------------- | -------- | ---- | --------- | ------------------------------------------------ | -| 动物 (主分区) | animal | 1024 | 22 | [/c/animal/](https://www.bilibili.com/c/animal/) | -| 猫 | cat | 2167 | | | -| 狗 | dog | 2168 | | | -| 小宠异宠 | reptiles | 2169 | | | -| 野生动物·动物解说科普 | science | 2170 | | | -| 动物综合·二创 | other | 2171 | | | - -## vlog - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ------- | ---- | --------- | -------------------------------------------- | -| vlog (主分区) | vlog | 1029 | 23 | [/c/vlog/](https://www.bilibili.com/c/vlog/) | -| 中外生活vlog | life | 2194 | | | -| 学生vlog | student | 2195 | | | -| 职业vlog | career | 2196 | | | -| 其他vlog | other | 2197 | | | - -## 绘画 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | -------- | ---- | --------- | ---------------------------------------------------- | -| 绘画 (主分区) | painting | 1006 | 24 | [/c/painting/](https://www.bilibili.com/c/painting/) | -| 二次元绘画 | acg | 2055 | | | -| 非二次元绘画 | none_acg | 2056 | | | -| 绘画学习 | tutorial | 2057 | | | -| 绘画综合 | other | 2058 | | | - -## 人工智能 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ----------- | ---- | --------- | ---------------------------------------- | -| 人工智能 (主分区) | ai | 1011 | 25 | [/c/ai/](https://www.bilibili.com/c/ai/) | -| AI学习 | tutorial | 2096 | | | -| AI资讯 | information | 2097 | | | -| AI杂谈 | other | 2098 | | | - -## 家装房产 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ---------- | ---- | --------- | -------------------------------------------- | -| 家装房产 (主分区) | home | 1015 | 26 | [/c/home/](https://www.bilibili.com/c/home/) | -| 买房租房 | trade | 2120 | | | -| 家庭装修 | renovation | 2121 | | | -| 家居展示 | furniture | 2122 | | | -| 家用电器 | appliances | 2123 | | | - -## 户外潮流 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | -------- | ---- | --------- | ---------------------------------------------------- | -| 户外潮流 (主分区) | outdoors | 1016 | 27 | [/c/outdoors/](https://www.bilibili.com/c/outdoors/) | -| 露营 | camping | 2124 | | | -| 徒步 | hiking | 2125 | | | -| 户外探秘 | explore | 2126 | | | -| 户外综合 | other | 2127 | | | - -## 健身 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | -------- | ---- | --------- | ------------------------------------------ | -| 健身 (主分区) | gym | 1017 | 28 | [/c/gym/](https://www.bilibili.com/c/gym/) | -| 健身科普 | science | 2128 | | | -| 健身跟练教学 | tutorial | 2129 | | | -| 健身记录 | record | 2130 | | | -| 健身身材展示 | figure | 2131 | | | -| 健身综合 | other | 2132 | | | - -## 手工 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ----------- | ---- | --------- | ---------------------------------------------------- | -| 手工 (主分区) | handmake | 1019 | 29 | [/c/handmake/](https://www.bilibili.com/c/handmake/) | -| 文具手帐 | handbook | 2143 | | | -| 轻手作 | light | 2144 | | | -| 传统手工艺 | traditional | 2145 | | | -| 解压手工 | relief | 2146 | | | -| DIY玩具 | diy | 2147 | | | -| 其他手工 | other | 2148 | | | - -## 旅游出行 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | --------- | ---- | --------- | ------------------------------------------------ | -| 旅游出行 (主分区) | travel | 1022 | 30 | [/c/travel/](https://www.bilibili.com/c/travel/) | -| 旅游记录 | record | 2158 | | | -| 旅游攻略 | strategy | 2159 | | | -| 城市出行 | city | 2160 | | | -| 公共交通 | transport | 2161 | | | - -## 三农 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | -------- | ---- | --------- | ---------------------------------------------- | -| 三农 (主分区) | rural | 1023 | 31 | [/c/rural/](https://www.bilibili.com/c/rural/) | -| 农村种植 | planting | 2162 | | | -| 赶海捕鱼 | fishing | 2163 | | | -| 打野采摘 | harvest | 2164 | | | -| 农业技术 | tech | 2165 | | | -| 农村生活 | life | 2166 | | | - -## 亲子 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ------------- | ---- | --------- | ------------------------------------------------------ | -| 亲子 (主分区) | parenting | 1025 | 32 | [/c/parenting/](https://www.bilibili.com/c/parenting/) | -| 孕产护理 | pregnant_care | 2172 | | | -| 婴幼护理 | infant_care | 2173 | | | -| 儿童才艺 | talent | 2174 | | | -| 萌娃 | cute | 2175 | | | -| 亲子互动 | interaction | 2176 | | | -| 亲子教育 | education | 2177 | | | -| 亲子综合 | other | 2178 | | | - -## 健康 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ---------- | ---- | --------- | ------------------------------------------------ | -| 健康 (主分区) | health | 1026 | 33 | [/c/health/](https://www.bilibili.com/c/health/) | -| 健康科普 | science | 2179 | | | -| 养生 | regimen | 2180 | | | -| 两性知识 | sexes | 2181 | | | -| 心理健康 | psychology | 2182 | | | -| 助眠视频·ASMR | asmr | 2183 | | | -| 医疗保健综合 | other | 2184 | | | - -## 情感 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ------------- | ------------- | ---- | --------- | -------------------------------------------------- | -| 情感 (主分区) | emotion | 1027 | 34 | [/c/emotion/](https://www.bilibili.com/c/emotion/) | -| 家庭关系 | family | 2185 | | | -| 恋爱关系 | romantic | 2186 | | | -| 人际关系 | interpersonal | 2187 | | | -| 自我成长 | growth | 2188 | | | - -## 生活兴趣 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | ----------------- | ---- | --------- | ---------------------------------------------------- | -| 生活兴趣 (主分区) | life_joy | 1030 | 35 | [/c/life_joy/](https://www.bilibili.com/c/life_joy/) | -| 休闲玩乐 | leisure | 2198 | | | -| 线下演出 | on_site | 2199 | | | -| 文玩文创 | artistic_products | 2200 | | | -| 潮玩玩具 | trendy_toys | 2201 | | | -| 兴趣综合 | other | 2202 | | | - -## 生活经验 - - - -| 名称 | 代号 | tid | channelId | url 路由 | -| ----------------- | --------------- | ---- | --------- | ------------------------------------------------------------------ | -| 生活经验 (主分区) | life_experience | 1031 | 36 | [/c/life_experience/](https://www.bilibili.com/c/life_experience/) | -| 生活技能 | skills | 2203 | | | -| 办事流程 | procedures | 2204 | | | -| 婚嫁 | marriage | 2205 | | | - -## 神秘学 (未公开) - -该分区未出现在 B 站前端的界面中,也无图标 - -| 名称 | 代号 | tid | channelId | url 路由 | -| --------------- | ----------- | ---- | --------- | ------------------------------------------------------ | -| 神秘学 (主分区) | mysticism | 1028 | 44 | [/c/mysticism/](https://www.bilibili.com/c/mysticism/) | -| 塔罗占卜 | tarot | 2189 | | | -| 星座占星 | horoscope | 2190 | | | -| 传统玄学 | metaphysics | 2191 | | | -| 疗愈成长 | healing | 2192 | | | -| 其他神秘学 | other | 2193 | | | diff --git a/docs/video/videostream_url.md b/docs/video/videostream_url.md deleted file mode 100644 index d808d71..0000000 --- a/docs/video/videostream_url.md +++ /dev/null @@ -1,1951 +0,0 @@ -# 视频流URL - - - -视频为 DASH 或 MP4 流媒体,需调用取流 API 传参视频 id 获取 - -## qn视频清晰度标识 - -注:该值在 DASH 格式下无效,因为 DASH 格式会取到所有分辨率的流地址 - -又注: B站对于新的视频更新了播放设置, 较高分辨率均采用 DASH, 较低分辨率与老视频还保留了 MP4, 这导致较新视频无法获取 MP4 格式的高分辨率视频, 参见 [#606](https://github.com/SocialSisterYi/bilibili-API-collect/issues/606) 或 [cv949156](https://www.bilibili.com/read/cv949156/) - -| 值 | 含义 | 备注 | -| ---- | -------------- | ------------------------------------------------------------ | -| 6 | 240P 极速 | 仅 MP4 格式支持
仅`platform=html5`时有效 | -| 16 | 360P 流畅 | | -| 32 | 480P 清晰 | | -| 64 | 720P 高清 | WEB 端默认值
~~B站前端需要登录才能选择,但是直接发送请求可以不登录就拿到 720P 的取流地址~~
**无 720P 时则为 720P60** | -| 74 | 720P60 高帧率 | 登录认证 | -| 80 | 1080P 高清 | TV 端与 APP 端默认值
登录认证 | -| 100 | 智能修复 | 人工智能增强画质
大会员认证 -| 112 | 1080P+ 高码率 | 大会员认证 | -| 116 | 1080P60 高帧率 | 大会员认证 | -| 120 | 4K 超清 | 需要`fnval&128=128`且`fourk=1`
大会员认证 | -| 125 | HDR 真彩色 | 仅支持 DASH 格式
需要`fnval&64=64`
大会员认证 | -| 126 | 杜比视界 | 仅支持 DASH 格式
需要`fnval&512=512`
大会员认证 | -| 127 | 8K 超高清 | 仅支持 DASH 格式
需要`fnval&1024=1024`
大会员认证 | -| 129 | HDR Vivid | 大会员认证 | - -例如:请求 1080P+ 的视频,则`qn=112` - -## fnver视频流版本标识 - -目前该值恒为 0,即`fnver=0` - -## fnval视频流格式标识 - -该代码为二进制属性位,如需组合功能需要使用`OR`运算结合一下数值 - -目前 FLV 格式已下线,应避免使用`fnval=0` - -| 值 | 含义 | 备注 | -| ---- | ------------------ | ------------------------------------------------------------ | -| ~~0~~ | ~~FLV 格式~~ | FLV 格式已下线
~~仅 H.264 编码
部分老视频存在分段现象
与 MP4、DASH 格式互斥~~ | -| 1 | MP4 格式 | 仅 H.264 编码
与 ~~FLV~~、DASH 格式互斥 | -| 16 | DASH 格式 | 与 MP4、~~FLV~~ 格式互斥 | -| 64 | 是否需求 HDR 视频 | 需求 DASH 格式
仅 H.265 编码
需要`qn=125`
大会员认证 | -| 128 | 是否需求 4K 分辨率 | 该值与`fourk`字段协同作用
需要`qn=120`
大会员认证 | -| 256 | 是否需求杜比音频 | 需求 DASH 格式
大会员认证 | -| 512 | 是否需求杜比视界 | 需求 DASH 格式
大会员认证 | -| 1024 | 是否需求 8K 分辨率 | 需求 DASH 格式
需要`qn=127`
大会员认证 | -| 2048 | 是否需求 AV1 编码 | 需求 DASH 格式 | -| 4048 | 所有可用 DASH 视频流 | 即一次性返回所有可用 DASH 格式视频流 | -| 16384 | 是否需要 HDR Vivid | 需要`qn=129`
大会员认证
仅 APP 接口可用 | - -例如:请求 DASH 格式,且需要 HDR 的视频流,则`fnval=16|64=80` - -## 视频编码代码 - -| 值 | 含义 | 备注 | -| ---- | ---------- | ---------------- | -| 7 | AVC 编码 | 8K 视频不支持该格式 | -| 12 | HEVC 编码 | | -| 13 | AV1 编码 | | - -## 视频伴音音质代码 - -| 值 | 含义 | -| ----- | ---- | -| 30216 | 64K | -| 30232 | 132K | -| 30280 | 192K | -| 30250 | 杜比全景声 | -| 30251 | Hi-Res无损 | - -## 获取视频流地址_web端 - -> https://api.bilibili.com/x/player/wbi/playurl - -> ~~https://api.bilibili.com/x/player/playurl~~ (旧链接) - -*请求方式:GET* - -认证方式:Cookie(SESSDATA) - -鉴权方式:[Wbi 签名](../misc/sign/wbi.md) - ---- - -关于视频流会员鉴权: - -- 获取 720P 及以上清晰度视频时需要登录(Cookie) - -- 获取高帧率(1080P60)/ 高码率(1080P+)/ HDR / 杜比视界 视频时需要有大会员的账号登录(Cookie) - -- 获取会员专属视频时需要登录(Cookie) - -- 部分特殊视频(如平台宣传片、活动视频等)不需要大会员账号认证 - ---- - -获取 url 有效时间为 120min,超时失效需要重新获取 - -~~部分视频会有分段,需要特别注意~~(FLV 格式已下线,不可能出现分段 - -若视频有分P,仅为单P视频的 url,换P则需传参对应 CID 重新获取 - -**url参数:** - -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ------ | ---- | ---------------- | ------------ | ------------------------------------------------------------ | -| avid | num | 稿件 avid | 必要(可选) | avid 与 bvid 任选一个 | -| bvid | str | 稿件 bvid | 必要(可选) | avid 与 bvid 任选一个 | -| cid | num | 视频 cid | 必要 | | -| gaia_source | str | view-card
pre-load | 必要(非必要) | 有Cookie(SESSDATA)时无需此参数
暂未找到两个内容值区别 | -| isGaiaAvoided| bool| true/false| 非必要|未知作用 | -| qn | num | 视频清晰度选择 | 非必要 | 未登录默认 32(480P),登录后默认 64(720P)
含义见 [上表](#qn视频清晰度标识)
**DASH 格式时无效** | -| fnval | num | 视频流格式标识 | 非必要 | 默认值为`1`(MP4 格式)
含义见 [上表](#fnval视频流格式标识) | -| fnver | num | 0 | 非必要 | | -| fourk | num | 是否允许 4K 视频 | 非必要 | 画质最高 1080P:0(默认)
画质最高 4K:1 | -| session | str | | 非必要 | 从视频播放页的 HTML 中设置 window.\_\_playinfo\_\_ 处获取,或者通过 buvid3 + 当前UNIX毫秒级时间戳 经过md5获取 | -| otype | str | | 非必要 | 固定为`json` | -| type | str | | 非必要 | 目前为空 | -| platform | str | | 非必要 | pc:web播放(默认值,视频流存在 referer鉴权)
html5:移动端 HTML5 播放(仅支持 MP4 格式,无 referer 鉴权可以直接使用`video`标签播放) | -| high_quality | num | 是否高画质 | 非必要 | platform=html5时,此值为1可使画质为1080p | -| try_look | num | 未登录高画质 | 非必要 | 为 `1` 时可以不登录拉到 `64` 和 `80` 清晰度 | -| cur_language | str | 使用AI原声翻译 | 非必要 | 可以填写`en`、`ja`等参数。
不填写时,默认拉取原音频。填写后,音频链接替换为指定的AI语音 | - -**json回复:** - -根对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------- | ----------------------------- | -------- | ---------------------------------------------- | -| code | num | 返回值 | 0:成功
-400:请求错误
-404:无视频 | -| message | str | 错误信息 | 默认为0 | -| ttl | num | 1 | | -| data | 有效时:obj
无效时:null | 数据本体 | | - -`data`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------ | ----- | ----------------------------------------------- | ----------------------------------------------- | -| v_voucher | str | (?) | 需要参数`gaia_source` | -| from | str | `local`? | | -| result | str | `suee`? | | -| message | str | 空? | | -| quality | num | 清晰度标识 | 含义见 [上表](#qn视频清晰度标识) | -| format | str | 视频格式 | `mp4`/`flv` | -| timelength | num | 视频长度 | 单位为毫秒
不同分辨率 / 格式可能有略微差异 | -| accept_format | str | 支持的全部格式 | 每项用`,`分隔 | -| accept_description | array | 支持的清晰度列表(文字说明) | | -| accept_quality | array | 支持的清晰度列表(代码) | 含义见 [上表](#qn视频清晰度标识) | -| video_codecid | num | 默认选择视频流的编码id | 含义见 [上表](#视频编码代码) | -| seek_param | str | `start`? | | -| seek_type | str | `offset`(DASH / FLV)?
`second`(MP4)? | | -| durl | array | 视频分段流信息 | **注:仅 FLV / MP4 格式存在此字段** | -| dash | obj | DASH 流信息 | **注:仅 DASH 格式存在此字段** | -| support_formats | array | 支持格式的详细信息 | | -| high_format | null | (?) | | -| last_play_time | num | 上次播放进度 | 毫秒值 | -| last_play_cid | num | 上次播放分P的 cid | | -| cur_language | str | 当前的AI原声翻译语言 | `en`、`ja`等,未使用AI原声翻译时,此项为空字符串 | -| language | obj | 视频的AI原声翻译信息 | 视频不支持时,不存在此字段 | - -`data`中的`accept_description`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 分辨率名称1 | | -| n | str | 分辨率名称(n+1) | | -| …… | str | …… | | - -`data`中的`accept_quality`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | -------------------------------- | -| 0 | num | 分辨率代码1 | 含义见 [上表](#qn视频清晰度标识) | -| n | num | 分辨率代码(n+1) | | -| …… | num | …… | | - -`data`中的`support_formats`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | obj | 播放格式详细信息1 | | -| n | obj | 播放格式详细信息(n+1) | | -| …… | obj | …… | | - -`support_formats`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------ | ------------ | ---------------------------------- | -| quality | num | 视频清晰度代码 | 含义见 [上表](#qn视频清晰度标识) | -| format | str | 视频格式 | | -| new_description | str | 格式描述 | | -| display_desc | str | 格式描述 | | -| superscript | str | (?) | | -| codecs | array | 可用编码格式列表 | | - -`support_formats`中的`codecs`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | --------------- | ---- | -| 0 | str | 例:av01.0.13M.08.0.110.01.01.01.0 | 使用AV1编码 | -| 1 | str | 例子:avc1.640034 | 使用AVC编码 | -| 2 | str | 例子:hev1.1.6.L153.90 | 使用HEVC编码 | - -`data`中的`language`对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------- | ------- | -------------------------- | ---- | -| support | boolean | 视频是否支持AI原声? | | -| items | array | 支持的原声翻译列表 | | -| open_toast | str | 启用AI原声翻译时的提示? | | -| close_toast | str | 关闭AI原声翻译时的提示? | | -| default_title | str | (?) | | -| bubble | obj | (?) | | - -`language`中的`items`数组: - -| 项 | 类型 | 内容 | 备注 | -| --- | ---- | ---------------- | ---- | -| 0 | obj | AI原声信息1 | | -| n | obj | AI原声信息(n+1) | | -| ... | obj | ... | | - -`items`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ------------------------ | ------- | ------------------- | ----------------------- | -| lang | str | AI原声翻译的语言值 | 可用于cur_language参数 | -| title | str | 语言显示文本 | 如:`English` | -| subtitle_lang | str | (?) | | -| video_detext | boolean | (?) | | -| video_mouth_shape_change | boolean | (?) | | -| production_type | num | 产品类型? | | - -由于 MP4 / ~~FLV~~ 与 DASH 格式的返回结构不同,以下内容需要分类讨论`durl`与`dash`字段的内容 - - ---- - -### FLV/MP4格式 - -`data`中的`durl`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ----------------- | ------------------------- | -| 0 | obj | 视频分段 1 信息 | **目前由于 FLV 格式已经下线,不会存在分段现象,故无需关心** | -| n | obj | 视频分段 (n+1) 信息 | | -| …… | obj | …… | | - -`durl`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| ---------- | ------ | ------------ | ---------------------------------- | -| order | num | 视频分段序号 | 某些视频会分为多个片段(从1顺序增长) | -| length | num | 视频长度 | 单位为毫秒 | -| size | num | 视频大小 | 单位为 Byte | -| ahead | str | (?) | | -| vhead | str | (?) | | -| url | str | 默认流 URL | **注意 unicode 转义符**
有效时间为120min | -| backup_url | array | 备用视频流 | | - -`durl`数组中的对象中的`backup_url`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | --------------------------------------------- | -| 0 | str | 备用流 URL 1 | **注意 unicode 转义符**
有效时间为120min | -| n | str | 备用流 URL (n+1) | | -| …… | str | …… | | - -**示例:** - -**视频无分段时:** - -获取视频`av99999999`/`BV1y7411Q7Eq`中的 1P(cid=`171776208`)的视频流 URL,清晰度为 1080P+,使用 FLV 方式获取 - -avid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/playurl' \ - --data-urlencode 'avid=99999999' \ - --data-urlencode 'cid=171776208' \ - --data-urlencode 'qn=112' \ - --data-urlencode 'fnval=0' \ - --data-urlencode 'fnver=0' \ - --data-urlencode 'fourk=1' \ - -b 'SESSDATA=xxx' -``` - - bvid方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/playurl' \ - --data-urlencode 'bvid=BV1y7411Q7Eq' \ - --data-urlencode 'cid=171776208' \ - --data-urlencode 'qn=112' \ - --data-urlencode 'fnval=0' \ - --data-urlencode 'fnver=0' \ - --data-urlencode 'fourk=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "from": "local", - "result": "suee", - "message": "", - "quality": 64, - "format": "flv720", - "timelength": 283801, - "accept_format": "hdflv2,flv,flv720,flv480,mp4", - "accept_description": [ - "高清 1080P+", - "高清 1080P", - "高清 720P", - "清晰 480P", - "流畅 360P" - ], - "accept_quality": [ - 112, - 80, - 64, - 32, - 16 - ], - "video_codecid": 7, - "seek_param": "start", - "seek_type": "offset", - "durl": [ - { - "order": 1, - "length": 283801, - "size": 70486426, - "ahead": "", - "vhead": "", - "url": "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=a4d5f1713e1ba313041d034a958c2414&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=0,3&agrr=1&bw=249068&logo=80000000", - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=a4d5f1713e1ba313041d034a958c2414&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=1,3&agrr=1&bw=249068&logo=40000000", - "https://upos-sz-mirrorcosb.bilivideo.com/upgcxcode/08/62/171776208/171776208_nb2-1-64.flv?e=ig8euxZM2rNcNbNMnwdVhwdlhbK3hwdVhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1662808778&gen=playurlv2&os=cosbbv&oi=3719461929&trid=31dc1934e77141bfbdf5ae88aca0b29fu&mid=0&platform=pc&upsig=7b8a6924948864944815ec0748cc108f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&bvc=vod&nettype=0&orderid=2,3&agrr=1&bw=249068&logo=40000000" - ] - } - ], - "support_formats": [ - { - "quality": 112, - "format": "hdflv2", - "new_description": "1080P 高码率", - "display_desc": "1080P", - "superscript": "高码率", - "codecs": null - }, - { - "quality": 80, - "format": "flv", - "new_description": "1080P 高清", - "display_desc": "1080P", - "superscript": "", - "codecs": null - }, - { - "quality": 64, - "format": "flv720", - "new_description": "720P 高清", - "display_desc": "720P", - "superscript": "", - "codecs": null - }, - { - "quality": 32, - "format": "flv480", - "new_description": "480P 清晰", - "display_desc": "480P", - "superscript": "", - "codecs": null - }, - { - "quality": 16, - "format": "mp4", - "new_description": "360P 流畅", - "display_desc": "360P", - "superscript": "", - "codecs": null - } - ], - "high_format": null, - "last_play_time": 0, - "last_play_cid": 0 - } -} -``` - -
- -**视频有分段时:** - -以下内容无参考价值,仅做历史保存 - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "from": "local", - "result": "suee", - "message": "", - "quality": 16, - "format": "flv360", - "timelength": 1437918, - "accept_format": "flv,flv720,flv480,flv360", - "accept_description": [ - "高清 1080P", - "高清 720P", - "清晰 480P", - "流畅 360P" - ], - "accept_quality": [ - 80, - 64, - 32, - 16 - ], - "video_codecid": 7, - "seek_param": "start", - "seek_type": "offset", - "durl": [ - { - "order": 1, - "length": 364417, - "size": 23018310, - "ahead": "", - "vhead": "", - "url": "http://upos-sz-mirrorhw.bilivideo.com/upgcxcode/98/24/872498/872498-1-15.flv?e=ig8euxZM2rNcNbRB7zUVhoM17WuBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=hwbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=f99db2dc9b8c65c245515b29b9ca8b16&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", - "backup_url": [ - "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-1-15.flv?e=ig8euxZM2rNcNbRB7zUVhoM17WuBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=74d0d62697364346f88d9c39430ce23c&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" - ] - }, - { - "order": 2, - "length": 364395, - "size": 23694756, - "ahead": "", - "vhead": "", - "url": "http://upos-sz-mirrorcos.bilivideo.com/upgcxcode/98/24/872498/872498-2-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=cosbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=308c87c55f3325bdaac2a3e8632948ee&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", - "backup_url": [ - "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-2-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=eb8f043e0f36f82ab9c62fd002143438&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" - ] - }, - { - "order": 3, - "length": 352333, - "size": 22835734, - "ahead": "", - "vhead": "", - "url": "http://upos-sz-mirrorhw.bilivideo.com/upgcxcode/98/24/872498/872498-3-15.flv?e=ig8euxZM2rNcNbRjhwdVhoM17bdVhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=hwbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=2685b7649f4bb6eb90f986f125432d78&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", - "backup_url": [ - "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-3-15.flv?e=ig8euxZM2rNcNbRjhwdVhoM17bdVhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=922543bfb26184f901187bf9c39c69b2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" - ] - }, - { - "order": 4, - "length": 356773, - "size": 23466279, - "ahead": "", - "vhead": "", - "url": "http://upos-sz-mirrorkodo.bilivideo.com/upgcxcode/98/24/872498/872498-4-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=kodobv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=9d29707faf012797ef2b6de21523fcf2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=80000000", - "backup_url": [ - "http://upos-sz-mirrorks3c.bilivideo.com/upgcxcode/98/24/872498/872498-4-15.flv?e=ig8euxZM2rNcNbRjhbUVhoM17bNBhwdEto8g5X10ugNcXBlqNxHxNEVE5XREto8KqJZHUa6m5J0SqE85tZvEuENvNo8g2ENvNo8i8o859r1qXg8xNEVE5XREto8GuFGv2U7SuxI72X6fTr859r1qXg8gNEVE5XREto8z5JZC2X2gkX5L5F1eTX1jkXlsTXHeux_f2o859IB_&uipk=5&nbs=1&deadline=1589874109&gen=playurl&os=ks3cbv&oi=1965551630&trid=ceac015d41e04a7b90ec972db710524fu&platform=pc&upsig=9ad4524d31c8d9695ae07b400b73ed29&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mid=293793435&logo=40000000" - ] - } - ] - } -} -``` - -
- ---- - -### DASH格式 - -`data`中的`dash`对象: - -| 字段 | 类型 | 内容 | 备注 | -| --------------- | ----- | ---------- | ------------ | -| duration | num | 视频长度 | 秒值 | -| minBufferTime | num | 1.5? | | -| min_buffer_time | num | 1.5? | | -| video | array | 视频流信息 | | -| audio | array | 伴音流信息 | 当视频没有音轨时,此项为 null | -| dolby | obj | 杜比全景声伴音信息 | | -| flac | obj | 无损音轨伴音信息 | 当视频没有无损音轨时,此项为 null | - -`dash`中的`video`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------------- | ---- | -| 0 | obj | 视频码流 1 | 同一清晰度可拥有 H.264 / H.265 / AV1 多种码流
**HDR 仅支持 H.265** | -| n | obj | 视频码流(n+1) | | -| …… | obj | …… | | - -`dash`中的`audio`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------- | ---- | -| 0 | obj | 清晰度1 | | -| n | obj | 清晰度(n+1) | | -| …… | obj | …… | | - -`video`及`audio`数组中的对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ----- | --------------------- | ----------------------------------------------- | -| id | num | 音视频清晰度代码 | 参考上表
[qn视频清晰度标识](#qn视频清晰度标识)
[视频伴音音质代码](#视频伴音音质代码) | -| baseUrl | str | 默认流 URL | **注意 unicode 转义符**
有效时间为 120min | -| base_url | str | **同上** | | -| backupUrl | array | 备用流 URL | | -| backup_url | array | **同上** | | -| bandwidth | num | 所需最低带宽 | 单位为 Byte | -| mimeType | str | 格式 mimetype 类型 | | -| mime_type | str | **同上** | | -| codecs | str | 编码/音频类型 | eg:`avc1.640032` | -| width | num | 视频宽度 | 单位为像素
**仅视频流存在该字段** | -| height | num | 视频高度 | 单位为像素
**仅视频流存在该字段** | -| frameRate | str | 视频帧率 | **仅视频流存在该字段** | -| frame_rate | str | **同上** | | -| sar | str | Sample Aspect Ratio(单个像素的宽高比) | 音频流该值恒为空 | -| startWithSap | num | Stream Access Point(流媒体访问位点) | 音频流该值恒为空 | -| start_with_sap | num | **同上** | | -| SegmentBase | obj | 见下表 | url 对应 m4s 文件中,头部的位置
音频流该值恒为空 | -| segment_base | obj | **同上** | | -| codecid | num | 码流编码标识代码 | 含义见 [上表](#视频编码代码)
音频流该值恒为`0` | - -`video`数组中的对象中的`backup_url`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ---------------- | --------------------------------------------- | -| 0 | str | 备用流 URL 1 | **注意 unicode 转义符**
有效时间为120min | -| n | str | 备用流 URL (n+1) | | -| …… | str | …… | | - -`video`数组中的对象中的`SegmentBase`对象: - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | ---------------------------- | ------------------------------------------------------------ | -| initialization | str | `${init_first}-${init_last}` | eg:`0-821`
ftyp (file type) box 加上 moov box 在 m4s 文件中的范围(单位为 bytes)
如 0-821 表示开头 820 个字节 | -| index_range | str | `${sidx_first}-${sidx_last}` | eg:`822-1309`
sidx (segment index) box 在 m4s 文件中的范围(单位为 bytes)
sidx 的核心是一个数组,记录了各关键帧的时间戳及其在文件中的位置,
其作用是索引 (拖进度条) | - -> 常规 MP4 文件的索引信息放在 moov box 中,其中包含每一帧 (不止是关键帧) 的一些信息。在 DASH 方式下,关键帧信息移到了 sidx box 里,其他的则分散到了各个 moof (movie fragment) box 中。 - -对这里的文件结构感兴趣的,可以参考标准文档 [ISO/IEC 14496-12](https://www.iso.org/standard/83102.html),如果不想那么深入的话可以百度「[MP4 文件结构](https://baike.baidu.com/item/mp4/9218018)」 - -`dash`中的`dolby`对象: - -此项为”杜比视界“视频独有 - -| 字段 | 类型 | 内容 | 备注 | -| -------------- | ---- | --------------------------------------------- | ------------------------------------------------------------ | -| type | num | 杜比音效类型 | 1:普通杜比音效
2:全景杜比音效 | -| audio | array | 杜比伴音流列表 | | - -`dolby`对象中的`audio`数组: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------------ | ----------------------------------------------- | -| 0 | obj | 杜比伴音流信息 | 同上文 DASH 流中`video`及`audio`数组中的对象 | - -`dash`中的`flac`对象: - -| 项 | 类型 | 内容 | 备注 | -| ---- | ---- | ------------------------ | ----------------------------------------------- | -| display | bool | 是否在播放器显示切换Hi-Res无损音轨按钮 | | -| audio | obj | 音频流信息 | 同上文 DASH 流中`video`及`audio`数组中的对象 | - -**示例:** - -获取视频`av969628065`/`BV1rp4y1e745`中的 1P(cid=`244954665`)的视频流 URL,使用 DASH 方式获取 - -avid 方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/playurl' \ - --data-urlencode 'avid=969628065' \ - --data-urlencode 'cid=244954665' \ - --data-urlencode 'fnval=4048' \ # 4048 为所有 dash 选项或运算的结果 - --data-urlencode 'fnver=0' \ - --data-urlencode 'fourk=1' \ - -b 'SESSDATA=xxx' -``` - - bvid 方式: - -```shell -curl -G 'https://api.bilibili.com/x/player/playurl' \ - --data-urlencode 'bvid=BV1rp4y1e745' \ - --data-urlencode 'cid=244954665' \ - --data-urlencode 'fnval=4048' \ - --data-urlencode 'fnver=0' \ - --data-urlencode 'fourk=1' \ - -b 'SESSDATA=xxx' -``` - -
-查看响应示例: - -```json -{ - "code": 0, - "message": "0", - "ttl": 1, - "data": { - "from": "local", - "result": "suee", - "message": "", - "quality": 64, - "format": "flv720", - "timelength": 346495, - "accept_format": "hdflv2,hdflv2,flv_p60,flv,flv720,flv480,mp4", - "accept_description": [ - "真彩 HDR", - "超清 4K", - "高清 1080P60", - "高清 1080P", - "高清 720P", - "清晰 480P", - "流畅 360P" - ], - "accept_quality": [ - 125, - 120, - 116, - 80, - 64, - 32, - 16 - ], - "video_codecid": 7, - "seek_param": "start", - "seek_type": "offset", - "dash": { - "duration": 347, - "minBufferTime": 1.5, - "min_buffer_time": 1.5, - "video": [ - { - "id": 80, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=71821c3a1f0d596b8a0f79861695de67\u0026uparams=e,og,oi,tag,nbs,gen,uipk,os,platform,trid,mid,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=71821c3a1f0d596b8a0f79861695de67\u0026uparams=e,og,oi,tag,nbs,gen,uipk,os,platform,trid,mid,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026uipk=5\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=585675af7dc762a4d21572f939196248\u0026uparams=e,platform,trid,oi,mid,uipk,gen,os,og,deadline,tag,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026gen=playurlv3\u0026platform=pc\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026os=08cbv\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=9fc6a3e3e0eaf3847c5c0f1c32047c09\u0026uparams=e,oi,nbs,uipk,gen,platform,mid,deadline,tag,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026uipk=5\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=585675af7dc762a4d21572f939196248\u0026uparams=e,platform,trid,oi,mid,uipk,gen,os,og,deadline,tag,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100113.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026gen=playurlv3\u0026platform=pc\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026os=08cbv\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=9fc6a3e3e0eaf3847c5c0f1c32047c09\u0026uparams=e,oi,nbs,uipk,gen,platform,mid,deadline,tag,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=773719\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 772828, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L150.90", - "width": 1920, - "height": 960, - "frameRate": "30.303", - "frame_rate": "30.303", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1159", - "indexRange": "1160-2019" - }, - "segment_base": { - "initialization": "0-1159", - "index_range": "1160-2019" - }, - "codecid": 12 - }, - { - "id": 80, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1745411269\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026upsig=134e6b8516a05db7ef97a18b68b94cb5\u0026uparams=e,platform,deadline,uipk,og,gen,os,trid,oi,mid,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1745411269\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026upsig=134e6b8516a05db7ef97a18b68b94cb5\u0026uparams=e,platform,deadline,uipk,og,gen,os,trid,oi,mid,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026nbs=1\u0026mid=59442895\u0026tag=\u0026upsig=d3f4bbcd7c490effdfdf0b9f8375f9a2\u0026uparams=e,platform,trid,oi,gen,os,og,deadline,uipk,nbs,mid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026og=cos\u0026oi=3028829496\u0026deadline=1745411269\u0026upsig=584b3a331daefde16b118f612d43c1c6\u0026uparams=e,platform,gen,os,mid,tag,nbs,uipk,trid,og,oi,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026nbs=1\u0026mid=59442895\u0026tag=\u0026upsig=d3f4bbcd7c490effdfdf0b9f8375f9a2\u0026uparams=e,platform,trid,oi,gen,os,og,deadline,uipk,nbs,mid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026og=cos\u0026oi=3028829496\u0026deadline=1745411269\u0026upsig=584b3a331daefde16b118f612d43c1c6\u0026uparams=e,platform,gen,os,mid,tag,nbs,uipk,trid,og,oi,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1918964\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 1916748, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640032", - "width": 1920, - "height": 960, - "frameRate": "29.412", - "frame_rate": "29.412", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-994", - "indexRange": "995-1854" - }, - "segment_base": { - "initialization": "0-994", - "index_range": "995-1854" - }, - "codecid": 7 - }, - { - "id": 64, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026upsig=fcba1f000ead402f2ab2748df6e8d127\u0026uparams=e,deadline,gen,os,og,nbs,uipk,platform,trid,oi,mid,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026upsig=fcba1f000ead402f2ab2748df6e8d127\u0026uparams=e,deadline,gen,os,og,nbs,uipk,platform,trid,oi,mid,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026deadline=1745411269\u0026tag=\u0026og=cos\u0026oi=3028829496\u0026os=cosbv\u0026upsig=9ab39b34d214780c30147af36a862d89\u0026uparams=e,nbs,uipk,platform,trid,mid,gen,deadline,tag,og,oi,os\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=bea70709fec064c8f384ee24eb5ccd1a\u0026uparams=e,oi,nbs,uipk,tag,gen,os,og,platform,trid,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026deadline=1745411269\u0026tag=\u0026og=cos\u0026oi=3028829496\u0026os=cosbv\u0026upsig=9ab39b34d214780c30147af36a862d89\u0026uparams=e,nbs,uipk,platform,trid,mid,gen,deadline,tag,og,oi,os\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026upsig=bea70709fec064c8f384ee24eb5ccd1a\u0026uparams=e,oi,nbs,uipk,tag,gen,os,og,platform,trid,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=1238263\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 1236894, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 1280, - "height": 640, - "frameRate": "58.824", - "frame_rate": "58.824", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1060", - "indexRange": "1061-1920" - }, - "segment_base": { - "initialization": "0-1060", - "index_range": "1061-1920" - }, - "codecid": 12 - }, - { - "id": 64, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026nbs=1\u0026uipk=5\u0026os=mcdn\u0026og=hw\u0026upsig=0b3aae3388cb52b436e591615c048007\u0026uparams=e,oi,mid,deadline,tag,gen,platform,trid,nbs,uipk,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026nbs=1\u0026uipk=5\u0026os=mcdn\u0026og=hw\u0026upsig=0b3aae3388cb52b436e591615c048007\u0026uparams=e,oi,mid,deadline,tag,gen,platform,trid,nbs,uipk,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=08cbv\u0026og=hw\u0026upsig=9dc7c021d5094eab92053fc58e84a48d\u0026uparams=e,mid,deadline,tag,nbs,gen,uipk,platform,trid,oi,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026og=hw\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=d2a75ae893a23a5d90630725d57efe72\u0026uparams=e,trid,mid,deadline,tag,og,oi,nbs,uipk,platform,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=08cbv\u0026og=hw\u0026upsig=9dc7c021d5094eab92053fc58e84a48d\u0026uparams=e,mid,deadline,tag,nbs,gen,uipk,platform,trid,oi,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30074.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026og=hw\u0026oi=3028829496\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=d2a75ae893a23a5d90630725d57efe72\u0026uparams=e,trid,mid,deadline,tag,og,oi,nbs,uipk,platform,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=1224265\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "bandwidth": 1222911, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640020", - "width": 1280, - "height": 640, - "frameRate": "62.500", - "frame_rate": "62.500", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-994", - "indexRange": "995-1854" - }, - "segment_base": { - "initialization": "0-994", - "index_range": "995-1854" - }, - "codecid": 7 - }, - { - "id": 32, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=68bd74999864b4a96ac0dbb730b53612\u0026uparams=e,oi,uipk,og,gen,os,platform,trid,mid,deadline,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026uipk=5\u0026og=cos\u0026gen=playurlv3\u0026os=mcdn\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026upsig=68bd74999864b4a96ac0dbb730b53612\u0026uparams=e,oi,uipk,og,gen,os,platform,trid,mid,deadline,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026os=cosbv\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026upsig=25c03095d15e721ca7a7e80f9e831319\u0026uparams=e,deadline,tag,gen,uipk,platform,trid,os,og,oi,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026upsig=c879e409a7bf7995c12ae5e22cb82b97\u0026uparams=e,uipk,os,trid,oi,nbs,platform,gen,og,mid,deadline,tag\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026os=cosbv\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026upsig=25c03095d15e721ca7a7e80f9e831319\u0026uparams=e,deadline,tag,gen,uipk,platform,trid,os,og,oi,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100110.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026mid=59442895\u0026deadline=1745411269\u0026tag=\u0026upsig=c879e409a7bf7995c12ae5e22cb82b97\u0026uparams=e,uipk,os,trid,oi,nbs,platform,gen,og,mid,deadline,tag\u0026bvc=vod\u0026nettype=0\u0026bw=246761\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "bandwidth": 246476, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 854, - "height": 426, - "frameRate": "30.303", - "frame_rate": "30.303", - "sar": "426:427", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1163", - "indexRange": "1164-2023" - }, - "segment_base": { - "initialization": "0-1163", - "index_range": "1164-2023" - }, - "codecid": 12 - }, - { - "id": 32, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026os=mcdn\u0026og=cos\u0026tag=\u0026platform=pc\u0026oi=3028829496\u0026gen=playurlv3\u0026upsig=99b3ff6929d865dafbbdf21301c3889b\u0026uparams=e,deadline,nbs,uipk,trid,mid,os,og,tag,platform,oi,gen\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026os=mcdn\u0026og=cos\u0026tag=\u0026platform=pc\u0026oi=3028829496\u0026gen=playurlv3\u0026upsig=99b3ff6929d865dafbbdf21301c3889b\u0026uparams=e,deadline,nbs,uipk,trid,mid,os,og,tag,platform,oi,gen\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026os=cosbv\u0026og=cos\u0026upsig=2e6bf8c0c1fc96618294d917f21192e7\u0026uparams=e,uipk,trid,deadline,gen,nbs,platform,oi,mid,tag,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026nbs=1\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026upsig=cc07c04afd6ac07b10f46241ef4c5fbc\u0026uparams=e,platform,mid,gen,tag,nbs,trid,oi,os,og,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026os=cosbv\u0026og=cos\u0026upsig=2e6bf8c0c1fc96618294d917f21192e7\u0026uparams=e,uipk,trid,deadline,gen,nbs,platform,oi,mid,tag,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026nbs=1\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=cosbv\u0026og=cos\u0026deadline=1745411269\u0026uipk=5\u0026upsig=cc07c04afd6ac07b10f46241ef4c5fbc\u0026uparams=e,platform,mid,gen,tag,nbs,trid,oi,os,og,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=629530\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=2,3" - ], - "bandwidth": 628803, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.64001F", - "width": 854, - "height": 426, - "frameRate": "29.412", - "frame_rate": "29.412", - "sar": "426:427", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-999", - "indexRange": "1000-1859" - }, - "segment_base": { - "initialization": "0-999", - "index_range": "1000-1859" - }, - "codecid": 7 - }, - { - "id": 16, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026os=mcdn\u0026tag=\u0026nbs=1\u0026upsig=cdb471486fa3908a2790ba9ef0fd0a44\u0026uparams=e,og,oi,deadline,uipk,platform,trid,mid,gen,os,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026gen=playurlv3\u0026os=mcdn\u0026tag=\u0026nbs=1\u0026upsig=cdb471486fa3908a2790ba9ef0fd0a44\u0026uparams=e,og,oi,deadline,uipk,platform,trid,mid,gen,os,tag,nbs\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026tag=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026oi=3028829496\u0026upsig=340b5f721a89f6dd90ae6153225cf808\u0026uparams=e,tag,trid,mid,deadline,nbs,uipk,platform,gen,os,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026os=08cbv\u0026platform=pc\u0026deadline=1745411269\u0026gen=playurlv3\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=e6c5646fd0e0d9cbb16296d2c8d8649f\u0026uparams=e,oi,mid,tag,nbs,uipk,os,platform,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026tag=\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026oi=3028829496\u0026upsig=340b5f721a89f6dd90ae6153225cf808\u0026uparams=e,tag,trid,mid,deadline,nbs,uipk,platform,gen,os,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_f9-1-100109.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026uipk=5\u0026os=08cbv\u0026platform=pc\u0026deadline=1745411269\u0026gen=playurlv3\u0026og=hw\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026upsig=e6c5646fd0e0d9cbb16296d2c8d8649f\u0026uparams=e,oi,mid,tag,nbs,uipk,os,platform,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=168083\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 167889, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 640, - "height": 320, - "frameRate": "30.303", - "frame_rate": "30.303", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1157", - "indexRange": "1158-2017" - }, - "segment_base": { - "initialization": "0-1157", - "index_range": "1158-2017" - }, - "codecid": 12 - }, - { - "id": 16, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026os=mcdn\u0026og=hw\u0026tag=\u0026upsig=93d8e429ac6dcf654df688457f138820\u0026uparams=e,oi,mid,deadline,nbs,uipk,platform,gen,trid,os,og,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026os=mcdn\u0026og=hw\u0026tag=\u0026upsig=93d8e429ac6dcf654df688457f138820\u0026uparams=e,oi,mid,deadline,nbs,uipk,platform,gen,trid,os,og,tag\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026tag=\u0026upsig=87f32943e6cfcb2957f0b90e9be210f3\u0026uparams=e,mid,deadline,nbs,gen,os,og,uipk,platform,trid,oi,tag\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026og=hw\u0026tag=\u0026nbs=1\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=0de6ac37eecd7261cc83e9e55f438747\u0026uparams=e,uipk,platform,trid,oi,mid,og,tag,nbs,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=59442895\u0026deadline=1745411269\u0026nbs=1\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026tag=\u0026upsig=87f32943e6cfcb2957f0b90e9be210f3\u0026uparams=e,mid,deadline,nbs,gen,os,og,uipk,platform,trid,oi,tag\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026og=hw\u0026tag=\u0026nbs=1\u0026deadline=1745411269\u0026gen=playurlv3\u0026os=08cbv\u0026upsig=0de6ac37eecd7261cc83e9e55f438747\u0026uparams=e,uipk,platform,trid,oi,mid,og,tag,nbs,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=353034\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 352627, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.64001E", - "width": 640, - "height": 320, - "frameRate": "29.412", - "frame_rate": "29.412", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1002", - "indexRange": "1003-1862" - }, - "segment_base": { - "initialization": "0-1002", - "index_range": "1003-1862" - }, - "codecid": 7 - } - ], - "audio": [ - { - "id": 30232, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=59442895\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026upsig=c9f074f7fc113d3d06b928f74a1427d4\u0026uparams=e,deadline,tag,nbs,uipk,platform,mid,trid,oi,gen,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=59442895\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026gen=playurlv3\u0026os=mcdn\u0026og=cos\u0026upsig=c9f074f7fc113d3d06b928f74a1427d4\u0026uparams=e,deadline,tag,nbs,uipk,platform,mid,trid,oi,gen,os,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026os=upos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026tag=\u0026upsig=d563b613434d1b8d4c2acc1717a82dfa\u0026uparams=e,deadline,uipk,platform,gen,og,oi,mid,nbs,os,trid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026gen=playurlv3\u0026tag=\u0026platform=pc\u0026os=upos\u0026og=cos\u0026upsig=0d401aeaea4a51b01605e5155ccf2e34\u0026uparams=e,nbs,uipk,trid,oi,mid,deadline,gen,tag,platform,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026gen=playurlv3\u0026og=cos\u0026oi=3028829496\u0026mid=59442895\u0026nbs=1\u0026os=upos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026tag=\u0026upsig=d563b613434d1b8d4c2acc1717a82dfa\u0026uparams=e,deadline,uipk,platform,gen,og,oi,mid,nbs,os,trid,tag\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026deadline=1745411269\u0026gen=playurlv3\u0026tag=\u0026platform=pc\u0026os=upos\u0026og=cos\u0026upsig=0d401aeaea4a51b01605e5155ccf2e34\u0026uparams=e,nbs,uipk,trid,oi,mid,deadline,gen,tag,platform,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=76527\u0026dl=0\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026orderid=2,3" - ], - "bandwidth": 76436, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.2", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-933", - "indexRange": "934-1805" - }, - "segment_base": { - "initialization": "0-933", - "index_range": "934-1805" - }, - "codecid": 0 - }, - { - "id": 30280, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026os=mcdn\u0026og=cos\u0026deadline=1745411269\u0026upsig=3d3484b4a91783d0d7277e073d947fad\u0026uparams=e,nbs,uipk,platform,trid,oi,mid,gen,tag,os,og,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026mid=59442895\u0026gen=playurlv3\u0026tag=\u0026os=mcdn\u0026og=cos\u0026deadline=1745411269\u0026upsig=3d3484b4a91783d0d7277e073d947fad\u0026uparams=e,nbs,uipk,platform,trid,oi,mid,gen,tag,os,og,deadline\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026platform=pc\u0026mid=59442895\u0026nbs=1\u0026uipk=5\u0026upsig=f7cc870e2a4925c24e46ad9425cf39a8\u0026uparams=e,og,trid,oi,deadline,tag,gen,os,platform,mid,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026upsig=d380844ae7ac21f8484650ba59a15d97\u0026uparams=e,og,mid,tag,nbs,platform,gen,os,trid,oi,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026tag=\u0026gen=playurlv3\u0026os=cosbv\u0026platform=pc\u0026mid=59442895\u0026nbs=1\u0026uipk=5\u0026upsig=f7cc870e2a4925c24e46ad9425cf39a8\u0026uparams=e,og,trid,oi,deadline,tag,gen,os,platform,mid,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026platform=pc\u0026gen=playurlv3\u0026os=cosbv\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026upsig=d380844ae7ac21f8484650ba59a15d97\u0026uparams=e,og,mid,tag,nbs,platform,gen,os,trid,oi,deadline,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=155073\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=2,3" - ], - "bandwidth": 154889, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.2", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-933", - "indexRange": "934-1805" - }, - "segment_base": { - "initialization": "0-933", - "index_range": "934-1805" - }, - "codecid": 0 - }, - { - "id": 30216, - "baseUrl": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=mcdn\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026mid=59442895\u0026gen=playurlv3\u0026og=cos\u0026upsig=77babed89168a38118c16f99396e3fb6\u0026uparams=e,platform,trid,oi,os,deadline,tag,nbs,uipk,mid,gen,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://xy113x200x108x47xy.mcdn.bilivideo.cn:4483/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=0000cc6424a6fb564074a7704d5b300496eu\u0026oi=3028829496\u0026os=mcdn\u0026deadline=1745411269\u0026tag=\u0026nbs=1\u0026uipk=5\u0026mid=59442895\u0026gen=playurlv3\u0026og=cos\u0026upsig=77babed89168a38118c16f99396e3fb6\u0026uparams=e,platform,trid,oi,os,deadline,tag,nbs,uipk,mid,gen,og\u0026mcdnid=50017754\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026upsig=d76799fe0f76dea02c775c8667fc3f82\u0026uparams=e,gen,os,og,trid,mid,tag,nbs,oi,deadline,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026gen=playurlv3\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026upsig=5cb2a5242aa474a5a0ba70e16b3d04f6\u0026uparams=e,os,nbs,uipk,platform,oi,mid,tag,gen,og,trid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026mid=59442895\u0026tag=\u0026nbs=1\u0026oi=3028829496\u0026deadline=1745411269\u0026uipk=5\u0026platform=pc\u0026upsig=d76799fe0f76dea02c775c8667fc3f82\u0026uparams=e,gen,os,og,trid,mid,tag,nbs,oi,deadline,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/65/46/244954665/244954665_nb3-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026oi=3028829496\u0026mid=59442895\u0026tag=\u0026gen=playurlv3\u0026og=cos\u0026trid=cc6424a6fb564074a7704d5b300496eu\u0026deadline=1745411269\u0026upsig=5cb2a5242aa474a5a0ba70e16b3d04f6\u0026uparams=e,os,nbs,uipk,platform,oi,mid,tag,gen,og,trid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=31750\u0026f=u_0_0\u0026agrr=1\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 31705, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.5", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-943", - "indexRange": "944-1815" - }, - "segment_base": { - "initialization": "0-943", - "index_range": "944-1815" - }, - "codecid": 0 - } - ], - "dolby": { - "type": 0, - "audio": null - }, - "flac": null - }, - "support_formats": [ - { - "quality": 125, - "format": "hdflv2", - "new_description": "HDR 真彩", - "display_desc": "HDR", - "superscript": "", - "codecs": [ - "hev1.2.4.L156.90" - ] - }, - { - "quality": 120, - "format": "hdflv2", - "new_description": "4K 超清", - "display_desc": "4K", - "superscript": "", - "codecs": [ - "avc1.640034", - "hev1.1.6.L156.90" - ] - }, - { - "quality": 116, - "format": "flv_p60", - "new_description": "1080P 60帧", - "display_desc": "1080P", - "superscript": "60帧", - "codecs": [ - "avc1.640032", - "hev1.1.6.L150.90" - ] - }, - { - "quality": 80, - "format": "flv", - "new_description": "1080P 高清", - "display_desc": "1080P", - "superscript": "", - "codecs": [ - "avc1.640032", - "hev1.1.6.L150.90" - ] - }, - { - "quality": 64, - "format": "flv720", - "new_description": "720P 高清", - "display_desc": "720P", - "superscript": "", - "codecs": [ - "avc1.640020", - "hev1.1.6.L120.90" - ] - }, - { - "quality": 32, - "format": "flv480", - "new_description": "480P 清晰", - "display_desc": "480P", - "superscript": "", - "codecs": [ - "avc1.64001F", - "hev1.1.6.L120.90" - ] - }, - { - "quality": 16, - "format": "mp4", - "new_description": "360P 流畅", - "display_desc": "360P", - "superscript": "", - "codecs": [ - "avc1.64001E", - "hev1.1.6.L120.90" - ] - } - ], - "high_format": null, - "last_play_time": 0, - "last_play_cid": 0, - "view_info": null, - "play_conf": { - "is_new_description": false - }, - "cur_language": "" - } -} -``` - -
- -获取视频`av115871406101538`/`BV1pR6UB3ENW`中的 1P(cid=`35306865840`)使用英文AI原声配音的视频流 URL,使用 DASH 方式获取 - -请求示例: - -```shell -curl -G 'https://api.bilibili.com/x/player/playurl' \ - --data-urlencode 'avid=115871406101538' \ - --data-urlencode 'bvid=BV1pR6UB3ENW' \ - --data-urlencode 'cid=35306865840' \ - --data-urlencode 'fnval=4048' \ - --data-urlencode 'fnver=0' \ - --data-urlencode 'fourk=1' \ - --data-urlencode 'cur_language=en' \ - -b 'SESSDATA=xxx' -``` - -
-查看相应示例: - -```json -{ - "code": 0, - "message": "OK", - "ttl": 1, - "data": { - "from": "local", - "result": "suee", - "message": "", - "quality": 64, - "format": "flv720", - "timelength": 173100, - "accept_format": "hdflv2,flv,flv720,flv480,mp4", - "accept_description": [ - "高清 1080P+", - "高清 1080P", - "高清 720P", - "清晰 480P", - "流畅 360P" - ], - "accept_quality": [ - 112, - 80, - 64, - 32, - 16 - ], - "video_codecid": 7, - "seek_param": "start", - "seek_type": "offset", - "dash": { - "duration": 174, - "minBufferTime": 1.5, - "min_buffer_time": 1.5, - "video": [ - { - "id": 112, - "baseUrl": "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026os=bcache\u0026upsig=10c7088d7924086772708970dd475753\u0026uparams=e,platform,deadline,oi,trid,gen,og,nbs,uipk,mid,os\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026os=bcache\u0026upsig=10c7088d7924086772708970dd475753\u0026uparams=e,platform,deadline,oi,trid,gen,og,nbs,uipk,mid,os\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026os=cosbv\u0026og=hw\u0026upsig=e25487dea1f18e2176ffd47f78e21dcc\u0026uparams=e,uipk,platform,deadline,trid,nbs,mid,oi,gen,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026nbs=1\u0026platform=pc\u0026os=cosbv\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=35315a9f898f3fbdc8820e1b36c2d670\u0026uparams=e,og,nbs,platform,os,oi,trid,uipk,mid,deadline,gen\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026os=cosbv\u0026og=hw\u0026upsig=e25487dea1f18e2176ffd47f78e21dcc\u0026uparams=e,uipk,platform,deadline,trid,nbs,mid,oi,gen,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=hw\u0026nbs=1\u0026platform=pc\u0026os=cosbv\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=35315a9f898f3fbdc8820e1b36c2d670\u0026uparams=e,og,nbs,platform,os,oi,trid,uipk,mid,deadline,gen\u0026bvc=vod\u0026nettype=0\u0026bw=1974380\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "bandwidth": 1973175, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640033", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-947", - "indexRange": "948-1399" - }, - "segment_base": { - "initialization": "0-947", - "index_range": "948-1399" - }, - "codecid": 7 - }, - { - "id": 112, - "baseUrl": "https://xy60x163x166x213xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30102.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=1249475\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=b18765\u0026traceid=trdtUXpzcYtlvQ_0_e_N\u0026uipk=5\u0026uparams=e%2Coi%2Ctrid%2Cuipk%2Cplatform%2Cmid%2Cos%2Cog%2Cnbs%2Cdeadline%2Cgen\u0026upsig=a936808f3c612338e01ea479490f27ef", - "base_url": "https://xy60x163x166x213xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30102.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=1249475\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=b18765\u0026traceid=trdtUXpzcYtlvQ_0_e_N\u0026uipk=5\u0026uparams=e%2Coi%2Ctrid%2Cuipk%2Cplatform%2Cmid%2Cos%2Cog%2Cnbs%2Cdeadline%2Cgen\u0026upsig=a936808f3c612338e01ea479490f27ef", - "backupUrl": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30102.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026os=bcache\u0026og=cos\u0026nbs=1\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=a936808f3c612338e01ea479490f27ef\u0026uparams=e,oi,trid,uipk,platform,mid,os,og,nbs,deadline,gen\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=1249475\u0026lrs=42\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=0,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30102.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026oi=605423425\u0026nbs=1\u0026gen=playurlv3\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026os=cosbv\u0026upsig=4340534fb442c116e39cdd86f92e52b9\u0026uparams=e,og,oi,nbs,gen,trid,uipk,platform,mid,deadline,os\u0026bvc=vod\u0026nettype=0\u0026bw=1249475\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30102.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026os=bcache\u0026og=cos\u0026nbs=1\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=a936808f3c612338e01ea479490f27ef\u0026uparams=e,oi,trid,uipk,platform,mid,os,og,nbs,deadline,gen\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=1249475\u0026lrs=42\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=0,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30102.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026og=cos\u0026oi=605423425\u0026nbs=1\u0026gen=playurlv3\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026os=cosbv\u0026upsig=4340534fb442c116e39cdd86f92e52b9\u0026uparams=e,og,oi,nbs,gen,trid,uipk,platform,mid,deadline,os\u0026bvc=vod\u0026nettype=0\u0026bw=1249475\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "bandwidth": 1248689, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L150.90", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1108", - "indexRange": "1109-1560" - }, - "segment_base": { - "initialization": "0-1108", - "index_range": "1109-1560" - }, - "codecid": 12 - }, - { - "id": 112, - "baseUrl": "https://xy60x163x162x27xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100027.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=1018351\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=fcd44e\u0026traceid=trWWkCQiOPSqwK_0_e_N\u0026uipk=5\u0026uparams=e%2Cnbs%2Cuipk%2Ctrid%2Cos%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen%2Cog\u0026upsig=b957000962f2d3f2e47fb8028ba32243", - "base_url": "https://xy60x163x162x27xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100027.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=1018351\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=fcd44e\u0026traceid=trWWkCQiOPSqwK_0_e_N\u0026uipk=5\u0026uparams=e%2Cnbs%2Cuipk%2Ctrid%2Cos%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen%2Cog\u0026upsig=b957000962f2d3f2e47fb8028ba32243", - "backupUrl": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100027.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026og=ali\u0026upsig=b957000962f2d3f2e47fb8028ba32243\u0026uparams=e,nbs,uipk,trid,os,platform,mid,deadline,oi,gen,og\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=1018351\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100027.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=estgoss\u0026og=ali\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026gen=playurlv3\u0026oi=605423425\u0026uipk=5\u0026platform=pc\u0026upsig=b57ff8f1fa6786700e0b1dfbeea110f5\u0026uparams=e,os,og,deadline,trid,nbs,mid,gen,oi,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=1018351\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100027.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026og=ali\u0026upsig=b957000962f2d3f2e47fb8028ba32243\u0026uparams=e,nbs,uipk,trid,os,platform,mid,deadline,oi,gen,og\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=1018351\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100027.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=estgoss\u0026og=ali\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026gen=playurlv3\u0026oi=605423425\u0026uipk=5\u0026platform=pc\u0026upsig=b57ff8f1fa6786700e0b1dfbeea110f5\u0026uparams=e,os,og,deadline,trid,nbs,mid,gen,oi,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=1018351\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "bandwidth": 1017695, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "av01.0.00M.10.0.110.01.01.01.0", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1010", - "indexRange": "1011-1462" - }, - "segment_base": { - "initialization": "0-1010", - "index_range": "1011-1462" - }, - "codecid": 13 - }, - { - "id": 80, - "baseUrl": "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026mid=38331014\u0026os=bcache\u0026og=hw\u0026uipk=5\u0026upsig=374297c208206f6a1fce3e540d87a385\u0026uparams=e,platform,deadline,oi,trid,gen,nbs,mid,os,og,uipk\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026mid=38331014\u0026os=bcache\u0026og=hw\u0026uipk=5\u0026upsig=374297c208206f6a1fce3e540d87a385\u0026uparams=e,platform,deadline,oi,trid,gen,nbs,mid,os,og,uipk\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorzos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026os=zosbv\u0026og=hw\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026upsig=c9ba6df1df78621fffba26716c5e87ff\u0026uparams=e,deadline,trid,gen,os,og,platform,mid,oi,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirrorzos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026gen=playurlv3\u0026os=zosbv\u0026mid=38331014\u0026deadline=1768921888\u0026nbs=1\u0026og=hw\u0026upsig=5390019aa2418cfc08085bc992b04b18\u0026uparams=e,platform,oi,trid,uipk,gen,os,mid,deadline,nbs,og\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorzos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026os=zosbv\u0026og=hw\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026upsig=c9ba6df1df78621fffba26716c5e87ff\u0026uparams=e,deadline,trid,gen,os,og,platform,mid,oi,nbs,uipk\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirrorzos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30080.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026gen=playurlv3\u0026os=zosbv\u0026mid=38331014\u0026deadline=1768921888\u0026nbs=1\u0026og=hw\u0026upsig=5390019aa2418cfc08085bc992b04b18\u0026uparams=e,platform,oi,trid,uipk,gen,os,mid,deadline,nbs,og\u0026bvc=vod\u0026nettype=0\u0026bw=1282889\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=2,3" - ], - "bandwidth": 1282083, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640033", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-947", - "indexRange": "948-1399" - }, - "segment_base": { - "initialization": "0-947", - "index_range": "948-1399" - }, - "codecid": 7 - }, - { - "id": 80, - "baseUrl": "https://xy115x231x44x139xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30077.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=647865\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=hw\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=598634\u0026traceid=trVvyEMqEnCxMO_0_e_N\u0026uipk=5\u0026uparams=e%2Cnbs%2Coi%2Ctrid%2Cos%2Cuipk%2Cplatform%2Cmid%2Cdeadline%2Cgen%2Cog\u0026upsig=5edd114e5a0ae886fec8fa2e82a47e2e", - "base_url": "https://xy115x231x44x139xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30077.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=647865\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=hw\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=598634\u0026traceid=trVvyEMqEnCxMO_0_e_N\u0026uipk=5\u0026uparams=e%2Cnbs%2Coi%2Ctrid%2Cos%2Cuipk%2Cplatform%2Cmid%2Cdeadline%2Cgen%2Cog\u0026upsig=5edd114e5a0ae886fec8fa2e82a47e2e", - "backupUrl": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30077.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026upsig=5edd114e5a0ae886fec8fa2e82a47e2e\u0026uparams=e,nbs,oi,trid,os,uipk,platform,mid,deadline,gen,og\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=647865\u0026lrs=42\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=0,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30077.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026og=hw\u0026nbs=1\u0026uipk=5\u0026oi=605423425\u0026gen=playurlv3\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=5b3e14c8e8c9775d77a9c4ed906af794\u0026uparams=e,os,og,nbs,uipk,oi,gen,platform,mid,deadline,trid\u0026bvc=vod\u0026nettype=0\u0026bw=647865\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30077.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026upsig=5edd114e5a0ae886fec8fa2e82a47e2e\u0026uparams=e,nbs,oi,trid,os,uipk,platform,mid,deadline,gen,og\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=647865\u0026lrs=42\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=0,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30077.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026og=hw\u0026nbs=1\u0026uipk=5\u0026oi=605423425\u0026gen=playurlv3\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=5b3e14c8e8c9775d77a9c4ed906af794\u0026uparams=e,os,og,nbs,uipk,oi,gen,platform,mid,deadline,trid\u0026bvc=vod\u0026nettype=0\u0026bw=647865\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3" - ], - "bandwidth": 647422, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L150.90", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1108", - "indexRange": "1109-1560" - }, - "segment_base": { - "initialization": "0-1108", - "index_range": "1109-1560" - }, - "codecid": 12 - }, - { - "id": 80, - "baseUrl": "https://xy60x163x166x209xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100026.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=517936\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=f7d612\u0026traceid=trwIKbxttngxnj_0_e_N\u0026uipk=5\u0026uparams=e%2Cuipk%2Cmid%2Coi%2Cgen%2Cnbs%2Cplatform%2Cdeadline%2Ctrid%2Cos%2Cog\u0026upsig=803da73a35b39b2513c4ef8ed01fe686", - "base_url": "https://xy60x163x166x209xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100026.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=517936\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=f7d612\u0026traceid=trwIKbxttngxnj_0_e_N\u0026uipk=5\u0026uparams=e%2Cuipk%2Cmid%2Coi%2Cgen%2Cnbs%2Cplatform%2Cdeadline%2Ctrid%2Cos%2Cog\u0026upsig=803da73a35b39b2513c4ef8ed01fe686", - "backupUrl": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100026.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026og=cos\u0026upsig=803da73a35b39b2513c4ef8ed01fe686\u0026uparams=e,uipk,mid,oi,gen,nbs,platform,deadline,trid,os,og\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=517936\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100026.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026mid=38331014\u0026oi=605423425\u0026os=cosbv\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=2ce2b39750969fc9e8f03691cd572c2e\u0026uparams=e,gen,mid,oi,os,og,nbs,uipk,platform,deadline,trid\u0026bvc=vod\u0026nettype=0\u0026bw=517936\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100026.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026nbs=1\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026og=cos\u0026upsig=803da73a35b39b2513c4ef8ed01fe686\u0026uparams=e,uipk,mid,oi,gen,nbs,platform,deadline,trid,os,og\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=517936\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100026.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026mid=38331014\u0026oi=605423425\u0026os=cosbv\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=2ce2b39750969fc9e8f03691cd572c2e\u0026uparams=e,gen,mid,oi,os,og,nbs,uipk,platform,deadline,trid\u0026bvc=vod\u0026nettype=0\u0026bw=517936\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "bandwidth": 517569, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "av01.0.00M.10.0.110.01.01.01.0", - "width": 1920, - "height": 1080, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1010", - "indexRange": "1011-1462" - }, - "segment_base": { - "initialization": "0-1010", - "index_range": "1011-1462" - }, - "codecid": 13 - }, - { - "id": 64, - "baseUrl": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026deadline=1768921888\u0026upsig=43e5c50e0e538112a14dd05323ac50ee\u0026uparams=e,gen,og,nbs,uipk,platform,mid,oi,trid,os,deadline\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026os=bcache\u0026deadline=1768921888\u0026upsig=43e5c50e0e538112a14dd05323ac50ee\u0026uparams=e,gen,og,nbs,uipk,platform,mid,oi,trid,os,deadline\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026deadline=1768921888\u0026os=cosbv\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026gen=playurlv3\u0026og=cos\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=3ca661cdda109d65c246178f8e20896e\u0026uparams=e,uipk,deadline,os,nbs,platform,mid,gen,og,oi,trid\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=2ba66dedf2e1dfcc33a1bdb97e0aa49b\u0026uparams=e,os,oi,nbs,uipk,platform,mid,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026deadline=1768921888\u0026os=cosbv\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026gen=playurlv3\u0026og=cos\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=3ca661cdda109d65c246178f8e20896e\u0026uparams=e,uipk,deadline,os,nbs,platform,mid,gen,og,oi,trid\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30064.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=2ba66dedf2e1dfcc33a1bdb97e0aa49b\u0026uparams=e,os,oi,nbs,uipk,platform,mid,deadline,gen,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=518391\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=2,3" - ], - "bandwidth": 518027, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640033", - "width": 1280, - "height": 720, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-945", - "indexRange": "946-1397" - }, - "segment_base": { - "initialization": "0-945", - "index_range": "946-1397" - }, - "codecid": 7 - }, - { - "id": 64, - "baseUrl": "https://xy60x163x166x210xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30066.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=298292\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=hw\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=5f63a8\u0026traceid=trxmPMoVQLDXJM_0_e_N\u0026uipk=5\u0026uparams=e%2Cos%2Cnbs%2Cog%2Ctrid%2Cuipk%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen\u0026upsig=4557aa74f373b297e0a6a04b5038ed0a", - "base_url": "https://xy60x163x166x210xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30066.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=298292\u0026cdnid=88802\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=hw\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=5f63a8\u0026traceid=trxmPMoVQLDXJM_0_e_N\u0026uipk=5\u0026uparams=e%2Cos%2Cnbs%2Cog%2Ctrid%2Cuipk%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen\u0026upsig=4557aa74f373b297e0a6a04b5038ed0a", - "backupUrl": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30066.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=bcache\u0026nbs=1\u0026og=hw\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026upsig=4557aa74f373b297e0a6a04b5038ed0a\u0026uparams=e,os,nbs,og,trid,uipk,platform,mid,deadline,oi,gen\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=298292\u0026lrs=42\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=0,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30066.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026os=08cbv\u0026oi=605423425\u0026upsig=eda15c18ff3427591234a8cfcf0a4a88\u0026uparams=e,trid,uipk,deadline,gen,og,nbs,platform,mid,os,oi\u0026bvc=vod\u0026nettype=0\u0026bw=298292\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30066.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=bcache\u0026nbs=1\u0026og=hw\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026upsig=4557aa74f373b297e0a6a04b5038ed0a\u0026uparams=e,os,nbs,og,trid,uipk,platform,mid,deadline,oi,gen\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=298292\u0026lrs=42\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=0,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30066.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026os=08cbv\u0026oi=605423425\u0026upsig=eda15c18ff3427591234a8cfcf0a4a88\u0026uparams=e,trid,uipk,deadline,gen,og,nbs,platform,mid,os,oi\u0026bvc=vod\u0026nettype=0\u0026bw=298292\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=1,3" - ], - "bandwidth": 298050, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 1280, - "height": 720, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1107", - "indexRange": "1108-1559" - }, - "segment_base": { - "initialization": "0-1107", - "index_range": "1108-1559" - }, - "codecid": 12 - }, - { - "id": 64, - "baseUrl": "https://xy60x188x71x66xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100024.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=251176\u0026cdnid=88805\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=df86d8\u0026traceid=trJKelwVBuuosq_0_e_N\u0026uipk=5\u0026uparams=e%2Cplatform%2Cdeadline%2Ctrid%2Cgen%2Cnbs%2Cuipk%2Cmid%2Coi%2Cos%2Cog\u0026upsig=c62f2453cb175f09c7087b48492a0890", - "base_url": "https://xy60x188x71x66xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100024.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=251176\u0026cdnid=88805\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=df86d8\u0026traceid=trJKelwVBuuosq_0_e_N\u0026uipk=5\u0026uparams=e%2Cplatform%2Cdeadline%2Ctrid%2Cgen%2Cnbs%2Cuipk%2Cmid%2Coi%2Cos%2Cog\u0026upsig=c62f2453cb175f09c7087b48492a0890", - "backupUrl": [ - "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100024.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026oi=605423425\u0026os=bcache\u0026og=ali\u0026upsig=c62f2453cb175f09c7087b48492a0890\u0026uparams=e,platform,deadline,trid,gen,nbs,uipk,mid,oi,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=251176\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100024.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026og=ali\u0026mid=38331014\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026os=estgoss\u0026upsig=fcb46de4b4593935875c7abd5ccc37ac\u0026uparams=e,nbs,uipk,platform,deadline,og,mid,oi,trid,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=251176\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100024.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026oi=605423425\u0026os=bcache\u0026og=ali\u0026upsig=c62f2453cb175f09c7087b48492a0890\u0026uparams=e,platform,deadline,trid,gen,nbs,uipk,mid,oi,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=251176\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100024.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026og=ali\u0026mid=38331014\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026os=estgoss\u0026upsig=fcb46de4b4593935875c7abd5ccc37ac\u0026uparams=e,nbs,uipk,platform,deadline,og,mid,oi,trid,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=251176\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3" - ], - "bandwidth": 250963, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "av01.0.00M.10.0.110.01.01.01.0", - "width": 1280, - "height": 720, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1010", - "indexRange": "1011-1462" - }, - "segment_base": { - "initialization": "0-1010", - "index_range": "1011-1462" - }, - "codecid": 13 - }, - { - "id": 32, - "baseUrl": "https://xy115x231x44x139xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30032.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=262520\u0026cdnid=88805\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=fd840d\u0026traceid=trxsurzRqeJgoi_0_e_N\u0026uipk=5\u0026uparams=e%2Ctrid%2Cgen%2Cog%2Cuipk%2Cmid%2Cdeadline%2Cos%2Cnbs%2Cplatform%2Coi\u0026upsig=de3812cc9f42e8cb4f652ae93ad03c7d", - "base_url": "https://xy115x231x44x139xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-30032.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=262520\u0026cdnid=88805\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=cos\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=fd840d\u0026traceid=trxsurzRqeJgoi_0_e_N\u0026uipk=5\u0026uparams=e%2Ctrid%2Cgen%2Cog%2Cuipk%2Cmid%2Cdeadline%2Cos%2Cnbs%2Cplatform%2Coi\u0026upsig=de3812cc9f42e8cb4f652ae93ad03c7d", - "backupUrl": [ - "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=cos\u0026uipk=5\u0026mid=38331014\u0026deadline=1768921888\u0026os=bcache\u0026nbs=1\u0026platform=pc\u0026oi=605423425\u0026upsig=de3812cc9f42e8cb4f652ae93ad03c7d\u0026uparams=e,trid,gen,og,uipk,mid,deadline,os,nbs,platform,oi\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=262520\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=estgoss\u0026uipk=5\u0026platform=pc\u0026og=cos\u0026upsig=38ca77338127572828ddb3aaf81c967c\u0026uparams=e,oi,trid,nbs,mid,deadline,gen,os,uipk,platform,og\u0026bvc=vod\u0026nettype=0\u0026bw=262520\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=cos\u0026uipk=5\u0026mid=38331014\u0026deadline=1768921888\u0026os=bcache\u0026nbs=1\u0026platform=pc\u0026oi=605423425\u0026upsig=de3812cc9f42e8cb4f652ae93ad03c7d\u0026uparams=e,trid,gen,og,uipk,mid,deadline,os,nbs,platform,oi\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=262520\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30032.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=estgoss\u0026uipk=5\u0026platform=pc\u0026og=cos\u0026upsig=38ca77338127572828ddb3aaf81c967c\u0026uparams=e,oi,trid,nbs,mid,deadline,gen,os,uipk,platform,og\u0026bvc=vod\u0026nettype=0\u0026bw=262520\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3" - ], - "bandwidth": 262304, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640033", - "width": 852, - "height": 480, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "640:639", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-950", - "indexRange": "951-1402" - }, - "segment_base": { - "initialization": "0-950", - "index_range": "951-1402" - }, - "codecid": 7 - }, - { - "id": 32, - "baseUrl": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=bcache\u0026oi=605423425\u0026mid=38331014\u0026og=ali\u0026upsig=13a4c3d43c0c34bf5105bab7d8f1e66c\u0026uparams=e,trid,nbs,uipk,platform,deadline,gen,os,oi,mid,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=bcache\u0026oi=605423425\u0026mid=38331014\u0026og=ali\u0026upsig=13a4c3d43c0c34bf5105bab7d8f1e66c\u0026uparams=e,trid,nbs,uipk,platform,deadline,gen,os,oi,mid,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=estgoss\u0026og=ali\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026upsig=7ab9c18be58382ad92b015e60b1d81d1\u0026uparams=e,oi,trid,mid,deadline,gen,os,og,nbs,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026oi=605423425\u0026mid=38331014\u0026os=estgoss\u0026og=ali\u0026upsig=a3db99b9a34d473e111d9462d705b848\u0026uparams=e,trid,nbs,uipk,platform,deadline,gen,oi,mid,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=estgoss\u0026og=ali\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026upsig=7ab9c18be58382ad92b015e60b1d81d1\u0026uparams=e,oi,trid,mid,deadline,gen,os,og,nbs,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=1,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30033.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026oi=605423425\u0026mid=38331014\u0026os=estgoss\u0026og=ali\u0026upsig=a3db99b9a34d473e111d9462d705b848\u0026uparams=e,trid,nbs,uipk,platform,deadline,gen,oi,mid,os,og\u0026bvc=vod\u0026nettype=0\u0026bw=177469\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "bandwidth": 177295, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 852, - "height": 480, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "640:639", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1112", - "indexRange": "1113-1564" - }, - "segment_base": { - "initialization": "0-1112", - "index_range": "1113-1564" - }, - "codecid": 12 - }, - { - "id": 32, - "baseUrl": "https://xy218x60x39x73xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100023.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=150725\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=7bb757\u0026traceid=trnydvRtRCjubG_0_e_N\u0026uipk=5\u0026uparams=e%2Cos%2Cog%2Cnbs%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen%2Cuipk%2Ctrid\u0026upsig=dd02a985b8ddc3b4a71cbb2587940f33", - "base_url": "https://xy218x60x39x73xy.mcdn.bilivideo.cn:8082/v1/resource/35306865840-1-100023.m4s?agrr=0\u0026build=0\u0026buvid=\u0026bvc=vod\u0026bw=150725\u0026cdnid=88801\u0026deadline=1768921888\u0026dl=0\u0026e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M%3D\u0026f=u_0_0\u0026gen=playurlv3\u0026lrs=42\u0026mid=38331014\u0026nbs=1\u0026nettype=0\u0026og=ali\u0026oi=605423425\u0026orderid=0%2C3\u0026os=bcache\u0026platform=pc\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026sign=7bb757\u0026traceid=trnydvRtRCjubG_0_e_N\u0026uipk=5\u0026uparams=e%2Cos%2Cog%2Cnbs%2Cplatform%2Cmid%2Cdeadline%2Coi%2Cgen%2Cuipk%2Ctrid\u0026upsig=dd02a985b8ddc3b4a71cbb2587940f33", - "backupUrl": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=bcache\u0026og=ali\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026uipk=5\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026upsig=dd02a985b8ddc3b4a71cbb2587940f33\u0026uparams=e,os,og,nbs,platform,mid,deadline,oi,gen,uipk,trid\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=150725\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=estgoss\u0026og=ali\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026upsig=b9bb2f0770330407ae725c1c340f1afc\u0026uparams=e,gen,os,og,oi,trid,nbs,uipk,platform,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=150725\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=1,3" - ], - "backup_url": [ - "https://cn-hbyc-ct-01-01.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=bcache\u0026og=ali\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026uipk=5\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026upsig=dd02a985b8ddc3b4a71cbb2587940f33\u0026uparams=e,os,og,nbs,platform,mid,deadline,oi,gen,uipk,trid\u0026cdnid=88801\u0026bvc=vod\u0026nettype=0\u0026bw=150725\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "https://upos-sz-estgoss.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026os=estgoss\u0026og=ali\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026upsig=b9bb2f0770330407ae725c1c340f1afc\u0026uparams=e,gen,os,og,oi,trid,nbs,uipk,platform,mid,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=150725\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=1,3" - ], - "bandwidth": 150571, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "av01.0.00M.10.0.110.01.01.01.0", - "width": 852, - "height": 480, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "640:639", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1010", - "indexRange": "1011-1462" - }, - "segment_base": { - "initialization": "0-1010", - "index_range": "1011-1462" - }, - "codecid": 13 - }, - { - "id": 16, - "baseUrl": "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026os=bcache\u0026upsig=fa94c40e060692230803ac1c6663332a\u0026uparams=e,uipk,platform,deadline,trid,gen,og,nbs,mid,oi,os\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026lrs=42\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-02.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=hw\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026os=bcache\u0026upsig=fa94c40e060692230803ac1c6663332a\u0026uparams=e,uipk,platform,deadline,trid,gen,og,nbs,mid,oi,os\u0026cdnid=88802\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026lrs=42\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026og=hw\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026upsig=907903b6cf872d695824c7c90d5a8215\u0026uparams=e,os,og,platform,deadline,oi,nbs,uipk,mid,trid,gen\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026oi=605423425\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=50d4bf9786979cdbed40d0f0a55bbe60\u0026uparams=e,uipk,oi,nbs,platform,mid,deadline,gen,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026og=hw\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026upsig=907903b6cf872d695824c7c90d5a8215\u0026uparams=e,os,og,platform,deadline,oi,nbs,uipk,mid,trid,gen\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026orderid=1,3", - "https://upos-sz-mirror08c.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30011.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026uipk=5\u0026oi=605423425\u0026nbs=1\u0026platform=pc\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=08cbv\u0026og=hw\u0026trid=e20dd754d5964994878fd44815ac690u\u0026upsig=50d4bf9786979cdbed40d0f0a55bbe60\u0026uparams=e,uipk,oi,nbs,platform,mid,deadline,gen,os,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=123644\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=2,3" - ], - "bandwidth": 123502, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "hev1.1.6.L120.90", - "width": 640, - "height": 360, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1108", - "indexRange": "1109-1560" - }, - "segment_base": { - "initialization": "0-1108", - "index_range": "1109-1560" - }, - "codecid": 12 - }, - { - "id": 16, - "baseUrl": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026os=bcache\u0026og=cos\u0026upsig=97252202334105cf4efc0af956642565\u0026uparams=e,nbs,uipk,deadline,trid,platform,mid,oi,gen,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026platform=pc\u0026mid=38331014\u0026oi=605423425\u0026gen=playurlv3\u0026os=bcache\u0026og=cos\u0026upsig=97252202334105cf4efc0af956642565\u0026uparams=e,nbs,uipk,deadline,trid,platform,mid,oi,gen,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026lrs=42\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=cos\u0026platform=pc\u0026upsig=6e6496389af268a0e3ef31c904316024\u0026uparams=e,mid,os,nbs,uipk,deadline,oi,trid,gen,og,platform\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=cosbv\u0026nbs=1\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026og=cos\u0026uipk=5\u0026platform=pc\u0026upsig=e7c6a3eb7904090ee54f538e8a5be530\u0026uparams=e,mid,deadline,gen,os,nbs,oi,trid,og,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026os=cosbv\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026og=cos\u0026platform=pc\u0026upsig=6e6496389af268a0e3ef31c904316024\u0026uparams=e,mid,os,nbs,uipk,deadline,oi,trid,gen,og,platform\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-30016.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=cosbv\u0026nbs=1\u0026oi=605423425\u0026trid=e20dd754d5964994878fd44815ac690u\u0026og=cos\u0026uipk=5\u0026platform=pc\u0026upsig=e7c6a3eb7904090ee54f538e8a5be530\u0026uparams=e,mid,deadline,gen,os,nbs,oi,trid,og,uipk,platform\u0026bvc=vod\u0026nettype=0\u0026bw=170409\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026orderid=2,3" - ], - "bandwidth": 170245, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "avc1.640033", - "width": 640, - "height": 360, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-954", - "indexRange": "955-1406" - }, - "segment_base": { - "initialization": "0-954", - "index_range": "955-1406" - }, - "codecid": 7 - }, - { - "id": 16, - "baseUrl": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026os=bcache\u0026og=cos\u0026upsig=0b2259ac082418fa252561d2212a7a1f\u0026uparams=e,mid,trid,gen,nbs,uipk,platform,deadline,oi,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://cn-hbyc-ct-01-05.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026trid=0000e20dd754d5964994878fd44815ac690u\u0026gen=playurlv3\u0026nbs=1\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026os=bcache\u0026og=cos\u0026upsig=0b2259ac082418fa252561d2212a7a1f\u0026uparams=e,mid,trid,gen,nbs,uipk,platform,deadline,oi,os,og\u0026cdnid=88805\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026lrs=42\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026buvid=\u0026build=0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026og=cos\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=b520fb3213cc68b776d6c80ad6c725ae\u0026uparams=e,os,og,trid,nbs,mid,oi,uipk,platform,deadline,gen\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026upsig=45869a9e7b2887d4a2db7891498543ed\u0026uparams=e,trid,platform,deadline,oi,gen,os,og,nbs,uipk,mid\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=cosbv\u0026og=cos\u0026trid=e20dd754d5964994878fd44815ac690u\u0026nbs=1\u0026mid=38331014\u0026oi=605423425\u0026uipk=5\u0026platform=pc\u0026deadline=1768921888\u0026gen=playurlv3\u0026upsig=b520fb3213cc68b776d6c80ad6c725ae\u0026uparams=e,os,og,trid,nbs,mid,oi,uipk,platform,deadline,gen\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorcos.bilivideo.com/upgcxcode/40/58/35306865840/35306865840-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=e20dd754d5964994878fd44815ac690u\u0026platform=pc\u0026deadline=1768921888\u0026oi=605423425\u0026gen=playurlv3\u0026os=cosbv\u0026og=cos\u0026nbs=1\u0026uipk=5\u0026mid=38331014\u0026upsig=45869a9e7b2887d4a2db7891498543ed\u0026uparams=e,trid,platform,deadline,oi,gen,os,og,nbs,uipk,mid\u0026bvc=vod\u0026nettype=0\u0026bw=105933\u0026buvid=\u0026build=0\u0026dl=0\u0026f=u_0_0\u0026qn_dyeid=bd71451926ffa1a0002987df696f7f00\u0026agrr=0\u0026orderid=2,3" - ], - "bandwidth": 105804, - "mimeType": "video/mp4", - "mime_type": "video/mp4", - "codecs": "av01.0.00M.10.0.110.01.01.01.0", - "width": 640, - "height": 360, - "frameRate": "30.000", - "frame_rate": "30.000", - "sar": "1:1", - "startWithSap": 1, - "start_with_sap": 1, - "SegmentBase": { - "Initialization": "0-1010", - "indexRange": "1011-1462" - }, - "segment_base": { - "initialization": "0-1010", - "index_range": "1011-1462" - }, - "codecid": 13 - } - ], - "audio": [ - { - "id": 30216, - "baseUrl": "https://upos-sz-mirrorzos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=38331014\u0026nbs=1\u0026deadline=1768921888\u0026os=zosbv\u0026og=hw\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026oi=605423425\u0026gen=playurlv3\u0026upsig=61c3da9028e753debb845ff14bfdfc5a\u0026uparams=e,platform,mid,nbs,deadline,os,og,trid,uipk,oi,gen\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026agrr=0\u0026orderid=0,3", - "base_url": "https://upos-sz-mirrorzos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026mid=38331014\u0026nbs=1\u0026deadline=1768921888\u0026os=zosbv\u0026og=hw\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026oi=605423425\u0026gen=playurlv3\u0026upsig=61c3da9028e753debb845ff14bfdfc5a\u0026uparams=e,platform,mid,nbs,deadline,os,og,trid,uipk,oi,gen\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026agrr=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorzos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026oi=605423425\u0026platform=pc\u0026nbs=1\u0026os=zosbv\u0026og=hw\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026uipk=5\u0026deadline=1768921888\u0026upsig=8ec954270bab827008a6567cfd4aa73a\u0026uparams=e,gen,oi,platform,nbs,os,og,trid,mid,uipk,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026dl=0\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026orderid=1,3", - "https://upos-sz-mirror14b.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=14bbv\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026mid=38331014\u0026nbs=1\u0026upsig=c79070c6fa0d721fc75836ec64a18995\u0026uparams=e,os,oi,platform,trid,uipk,deadline,gen,og,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorzos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026gen=playurlv3\u0026oi=605423425\u0026platform=pc\u0026nbs=1\u0026os=zosbv\u0026og=hw\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026uipk=5\u0026deadline=1768921888\u0026upsig=8ec954270bab827008a6567cfd4aa73a\u0026uparams=e,gen,oi,platform,nbs,os,og,trid,mid,uipk,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026dl=0\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026orderid=1,3", - "https://upos-sz-mirror14b.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30216.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=14bbv\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=hw\u0026mid=38331014\u0026nbs=1\u0026upsig=c79070c6fa0d721fc75836ec64a18995\u0026uparams=e,os,oi,platform,trid,uipk,deadline,gen,og,mid,nbs\u0026bvc=vod\u0026nettype=0\u0026bw=65723\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026orderid=2,3" - ], - "bandwidth": 65625, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.2", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-821", - "indexRange": "822-1273" - }, - "segment_base": { - "initialization": "0-821", - "index_range": "822-1273" - }, - "codecid": 0 - }, - { - "id": 30232, - "baseUrl": "https://upos-sz-estghw.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026deadline=1768921888\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026gen=playurlv3\u0026os=estghw\u0026uipk=5\u0026og=hw\u0026upsig=211824fb8890123667f7aa37e286efea\u0026uparams=e,nbs,deadline,oi,platform,trid,mid,gen,os,uipk,og\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=0,3", - "base_url": "https://upos-sz-estghw.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026deadline=1768921888\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026gen=playurlv3\u0026os=estghw\u0026uipk=5\u0026og=hw\u0026upsig=211824fb8890123667f7aa37e286efea\u0026uparams=e,nbs,deadline,oi,platform,trid,mid,gen,os,uipk,og\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirror08c.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026nbs=1\u0026gen=playurlv3\u0026og=hw\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026uipk=5\u0026deadline=1768921888\u0026upsig=647abf350d884239d06e172a7125667d\u0026uparams=e,os,nbs,gen,og,oi,platform,trid,mid,uipk,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorhwb.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026nbs=1\u0026uipk=5\u0026og=hw\u0026oi=605423425\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=hwbbv\u0026upsig=b34a257648941adb939b72f9e4d62eaf\u0026uparams=e,platform,trid,mid,nbs,uipk,og,oi,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirror08c.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026os=08cbv\u0026nbs=1\u0026gen=playurlv3\u0026og=hw\u0026oi=605423425\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026uipk=5\u0026deadline=1768921888\u0026upsig=647abf350d884239d06e172a7125667d\u0026uparams=e,os,nbs,gen,og,oi,platform,trid,mid,uipk,deadline\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026f=N_0_0\u0026dl=0\u0026iptv=\u0026agrr=0\u0026orderid=1,3", - "https://upos-sz-mirrorhwb.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30232.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026platform=pc\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026nbs=1\u0026uipk=5\u0026og=hw\u0026oi=605423425\u0026deadline=1768921888\u0026gen=playurlv3\u0026os=hwbbv\u0026upsig=b34a257648941adb939b72f9e4d62eaf\u0026uparams=e,platform,trid,mid,nbs,uipk,og,oi,deadline,gen,os\u0026bvc=vod\u0026nettype=0\u0026bw=84945\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 84835, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.2", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-821", - "indexRange": "822-1273" - }, - "segment_base": { - "initialization": "0-821", - "index_range": "822-1273" - }, - "codecid": 0 - }, - { - "id": 30280, - "baseUrl": "https://upos-sz-estgcos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026os=estgcos\u0026platform=pc\u0026mid=38331014\u0026nbs=1\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026oi=605423425\u0026upsig=cc453cbbfbd3ac754f34bca5ee177365\u0026uparams=e,trid,uipk,os,platform,mid,nbs,deadline,gen,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026dl=0\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026orderid=0,3", - "base_url": "https://upos-sz-estgcos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026uipk=5\u0026os=estgcos\u0026platform=pc\u0026mid=38331014\u0026nbs=1\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026oi=605423425\u0026upsig=cc453cbbfbd3ac754f34bca5ee177365\u0026uparams=e,trid,uipk,os,platform,mid,nbs,deadline,gen,og,oi\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026dl=0\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026orderid=0,3", - "backupUrl": [ - "https://upos-sz-mirrorcos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026os=cosbv\u0026oi=605423425\u0026platform=pc\u0026upsig=29dedc9eeb4ce9ac312e522b938191db\u0026uparams=e,nbs,uipk,deadline,gen,og,trid,mid,os,oi,platform\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcosb.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026gen=playurlv3\u0026os=cosbbv\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026oi=605423425\u0026platform=pc\u0026og=cos\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026upsig=18818c6927fdab510b78de98435c4718\u0026uparams=e,mid,gen,os,nbs,uipk,deadline,oi,platform,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=2,3" - ], - "backup_url": [ - "https://upos-sz-mirrorcos.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026gen=playurlv3\u0026og=cos\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026mid=38331014\u0026os=cosbv\u0026oi=605423425\u0026platform=pc\u0026upsig=29dedc9eeb4ce9ac312e522b938191db\u0026uparams=e,nbs,uipk,deadline,gen,og,trid,mid,os,oi,platform\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=1,3", - "https://upos-sz-mirrorcosb.bilivideo.com/neoxcode/bb/9w/_000031h2ibmcia0ym2o1hkbfu8e9wbb-1-30280.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=\u0026mid=38331014\u0026gen=playurlv3\u0026os=cosbbv\u0026nbs=1\u0026uipk=5\u0026deadline=1768921888\u0026oi=605423425\u0026platform=pc\u0026og=cos\u0026trid=9543b281ee9c4f23b7eb20e6520c75bN\u0026upsig=18818c6927fdab510b78de98435c4718\u0026uparams=e,mid,gen,os,nbs,uipk,deadline,oi,platform,og,trid\u0026bvc=vod\u0026nettype=0\u0026bw=137816\u0026iptv=\u0026agrr=0\u0026f=N_0_0\u0026dl=0\u0026orderid=2,3" - ], - "bandwidth": 137674, - "mimeType": "audio/mp4", - "mime_type": "audio/mp4", - "codecs": "mp4a.40.2", - "width": 0, - "height": 0, - "frameRate": "", - "frame_rate": "", - "sar": "", - "startWithSap": 0, - "start_with_sap": 0, - "SegmentBase": { - "Initialization": "0-821", - "indexRange": "822-1273" - }, - "segment_base": { - "initialization": "0-821", - "index_range": "822-1273" - }, - "codecid": 0 - } - ], - "dolby": { - "type": 0, - "audio": null - }, - "flac": null - }, - "support_formats": [ - { - "quality": 112, - "format": "hdflv2", - "new_description": "1080P 高码率", - "display_desc": "1080P", - "superscript": "高码率", - "codecs": [ - "av01.0.00M.10.0.110.01.01.01.0", - "avc1.640033", - "hev1.1.6.L150.90" - ], - "can_watch_qn_reason": 3, - "limit_watch_reason": 0, - "report": { - "EXT_VIP_REPORT_PARAMS": "" - } - }, - { - "quality": 80, - "format": "flv", - "new_description": "1080P 高清", - "display_desc": "1080P", - "superscript": "", - "codecs": [ - "av01.0.00M.10.0.110.01.01.01.0", - "avc1.640033", - "hev1.1.6.L150.90" - ], - "can_watch_qn_reason": 0, - "limit_watch_reason": 0, - "report": {} - }, - { - "quality": 64, - "format": "flv720", - "new_description": "720P 准高清", - "display_desc": "720P", - "superscript": "", - "codecs": [ - "av01.0.00M.10.0.110.01.01.01.0", - "avc1.640033", - "hev1.1.6.L120.90" - ], - "can_watch_qn_reason": 0, - "limit_watch_reason": 0, - "report": {} - }, - { - "quality": 32, - "format": "flv480", - "new_description": "480P 标清", - "display_desc": "480P", - "superscript": "", - "codecs": [ - "av01.0.00M.10.0.110.01.01.01.0", - "avc1.640033", - "hev1.1.6.L120.90" - ], - "can_watch_qn_reason": 0, - "limit_watch_reason": 0, - "report": {} - }, - { - "quality": 16, - "format": "mp4", - "new_description": "360P 流畅", - "display_desc": "360P", - "superscript": "", - "codecs": [ - "av01.0.00M.10.0.110.01.01.01.0", - "avc1.640033", - "hev1.1.6.L120.90" - ], - "can_watch_qn_reason": 0, - "limit_watch_reason": 0, - "report": {} - } - ], - "high_format": null, - "last_play_time": 5000, - "last_play_cid": 35306865840, - "view_info": null, - "play_conf": { - "is_new_description": false - }, - "cur_language": "en", - "language": { - "support": true, - "items": [ - { - "lang": "en", - "title": "English", - "subtitle_lang": "", - "video_detext": false, - "video_mouth_shape_change": false, - "production_type": 2 - }, - { - "lang": "ja", - "title": "日本語", - "subtitle_lang": "", - "video_detext": false, - "video_mouth_shape_change": false, - "production_type": 2 - } - ], - "open_toast": "原声翻译开启中,请稍候", - "close_toast": "原声翻译关闭中,请稍候", - "default_title": "翻译", - "list_title": "AI原声翻译(Beta)", - "bubble": { - "title": "试试AI原声翻译", - "type": 2 - } - }, - "cur_production_type": 2, - "auto_qn_resp": { - "dyeid": "bd71451926ffa1a0002987df696f7f00" - } - } -} -``` - -
- -## 视频取流说明 - -关于拉流: - -1. MP4 / ~~FLV~~ 格式仅需拉视频流,DASH 格式需同时拉视频与伴音流 -2. 如 DASH 格式需要杜比或无损的伴音,需要取对应`dolby`或`flac`字段中的流 -3. **注意 Unicode 转义符** - -~~关于分段:~~ - -~~FLV 格式可能产生分段情况,将`$.data.durl[1-n].url`或`$.data.durl[1-n].backup_url[0]`中的内容作为 URL 进行 GET 请求进行分段播放,如需下载需要合并~~(FLV 格式已下线,不会存在分段现象) - -关于鉴权: - -1. WEB 端取流需要验证防盗链,即`referer`为 `.bilibili.com`域名下且 UA 不能为空 -2. APP 端也需要验证防盗链,即 UA 需要含有`Mozilla/5.0 BiliDroid/*.*.* (bbcallen@gmail.com)`(*为版本) -3. 如`referer`或 UA 错误的情况会被判定为盗链,返回`403 Forbidden`故无法取流 -4. 若传`platform=html5`参数取流,则不会进行防盗链验证,即可通过 HTML 标签`