From a21b12eac149e34dc910480e078a3c59d779bacd Mon Sep 17 00:00:00 2001
From: shengrihui <1120058252@qq.com>
Date: Fri, 24 Jan 2025 12:10:30 +0800
Subject: [PATCH 1/5] =?UTF-8?q?1.=E6=9B=B4=E6=96=B0=E4=B8=8E=20space.bilib?=
=?UTF-8?q?ili.com=20=E6=9C=89=E5=85=B3=E7=9A=84=20URLs=EF=BC=8CUpdate=20U?=
=?UTF-8?q?RLs=20related=20to=20space.bilibili.com=202.=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E9=83=A8=E5=88=86=20APIs,Update=20some=20APIs=203.=E6=A0=BC?=
=?UTF-8?q?=E5=BC=8F=E5=8C=96=EF=BC=8Cformatting=20file?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/you_get/extractors/bilibili.py | 388 +++++++++++++++++++----------
1 file changed, 257 insertions(+), 131 deletions(-)
diff --git a/src/you_get/extractors/bilibili.py b/src/you_get/extractors/bilibili.py
index ea67f92fcf..f5586acd87 100644
--- a/src/you_get/extractors/bilibili.py
+++ b/src/you_get/extractors/bilibili.py
@@ -1,11 +1,14 @@
#!/usr/bin/env python
+import hashlib
+import math
+import sys
+import urllib
+from collections import defaultdict
+from itertools import count
from ..common import *
from ..extractor import VideoExtractor
-import hashlib
-import math
-
class Bilibili(VideoExtractor):
name = "Bilibili"
@@ -62,8 +65,10 @@ def height_to_quality(height, qn):
@staticmethod
def bilibili_headers(referer=None, cookie=None):
# a reasonable UA
- ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
- headers = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': ua}
+ # ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
+ # headers = {'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.5', 'User-Agent': ua}
+ ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
+ headers = {'User-Agent': ua}
if referer is not None:
headers.update({'Referer': referer})
if cookie is not None:
@@ -72,7 +77,8 @@ def bilibili_headers(referer=None, cookie=None):
@staticmethod
def bilibili_api(avid, cid, qn=0):
- return 'https://api.bilibili.com/x/player/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&fnver=0&fnval=4048&fourk=1' % (avid, cid, qn)
+ return 'https://api.bilibili.com/x/player/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&fnver=0&fnval=4048&fourk=1' % (
+ avid, cid, qn)
@staticmethod
def bilibili_audio_api(sid):
@@ -92,7 +98,8 @@ def bilibili_audio_menu_song_api(sid, ps=100):
@staticmethod
def bilibili_bangumi_api(avid, cid, ep_id, qn=0, fnval=16):
- return 'https://api.bilibili.com/pgc/player/web/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&ep_id=%s&fnver=0&fnval=%s' % (avid, cid, qn, ep_id, fnval)
+ return 'https://api.bilibili.com/pgc/player/web/playurl?avid=%s&cid=%s&qn=%s&type=&otype=json&ep_id=%s&fnver=0&fnval=%s' % (
+ avid, cid, qn, ep_id, fnval)
@staticmethod
def bilibili_interface_api(cid, qn=0):
@@ -102,7 +109,6 @@ def bilibili_interface_api(cid, qn=0):
chksum = hashlib.md5(bytes(params + sec, 'utf8')).hexdigest()
return 'https://api.bilibili.com/x/player/wbi/v2?%s&sign=%s' % (params, chksum)
-
@staticmethod
def bilibili_live_api(cid):
return 'https://api.live.bilibili.com/room/v1/Room/playUrl?cid=%s&quality=0&platform=web' % cid
@@ -115,25 +121,59 @@ def bilibili_live_room_info_api(room_id):
def bilibili_live_room_init_api(room_id):
return 'https://api.live.bilibili.com/room/v1/Room/room_init?id=%s' % room_id
+ # @staticmethod
+ # def bilibili_space_channel_api(mid, cid, pn=1, ps=100):
+ # return 'https://api.bilibili.com/x/space/channel/video?mid=%s&cid=%s&pn=%s&ps=%s&order=0&jsonp=jsonp' % (mid, cid, pn, ps)
@staticmethod
- def bilibili_space_channel_api(mid, cid, pn=1, ps=100):
- return 'https://api.bilibili.com/x/space/channel/video?mid=%s&cid=%s&pn=%s&ps=%s&order=0&jsonp=jsonp' % (mid, cid, pn, ps)
+ # 合集列表
+ def bilibili_space_seasons_series_list_api(mid, page_size=20, page_num=1):
+ return f"https://api.bilibili.com/x/polymer/web-space/seasons_series_list?mid={mid}&page_size={page_size}&page_num={page_num}&web_location=333.1387"
+ # @staticmethod
+ # def bilibili_space_collection_api(mid, cid, pn=1, ps=30):
+ # return 'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=%s&season_id=%s&sort_reverse=false&page_num=%s&page_size=%s' % (mid, cid, pn, ps)
@staticmethod
- def bilibili_space_collection_api(mid, cid, pn=1, ps=30):
- return 'https://api.bilibili.com/x/polymer/space/seasons_archives_list?mid=%s&season_id=%s&sort_reverse=false&page_num=%s&page_size=%s' % (mid, cid, pn, ps)
+ # 合集详情
+ def bilibili_space_seasons_archives_list_api(mid, season_id, page_num=1, page_size=30):
+ return f"https://api.bilibili.com/x/polymer/web-space/seasons_archives_list?mid={mid}&season_id={season_id}&sort_reverse=false&page_size={page_size}&page_num={page_num}&web_location=333.1387"
@staticmethod
+ # 视频列表详情
def bilibili_series_archives_api(mid, sid, pn=1, ps=100):
- return 'https://api.bilibili.com/x/series/archives?mid=%s&series_id=%s&pn=%s&ps=%s&only_normal=true&sort=asc&jsonp=jsonp' % (mid, sid, pn, ps)
+ return 'https://api.bilibili.com/x/series/archives?mid=%s&series_id=%s&pn=%s&ps=%s&only_normal=true&sort=asc&jsonp=jsonp' % (
+ mid, sid, pn, ps)
@staticmethod
def bilibili_space_favlist_api(fid, pn=1, ps=20):
- return 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&pn=%s&ps=%s&order=mtime&type=0&tid=0&jsonp=jsonp' % (fid, pn, ps)
+ return 'https://api.bilibili.com/x/v3/fav/resource/list?media_id=%s&pn=%s&ps=%s&order=mtime&type=0&tid=0&jsonp=jsonp' % (
+ fid, pn, ps)
@staticmethod
- def bilibili_space_video_api(mid, pn=1, ps=50):
- return "https://api.bilibili.com/x/space/arc/search?mid=%s&pn=%s&ps=%s&tid=0&keyword=&order=pubdate&jsonp=jsonp" % (mid, pn, ps)
+ # up 所有视频
+ def bilibili_space_video_api(mid, w_wedid=None, pn=1, ps=50):
+ paras = {
+ "pn": str(pn),
+ "ps": str(ps),
+ # "tid": "0",
+ # "special_type": "",
+ # "order": "pubdate",
+ "mid": mid,
+ # "index": "0",
+ # "keyword": "",
+ # "order_avoided": "true",
+ # "platform": "web",
+ # "web_location": "333.1387",
+ "dm_img_list": "[]",
+ "dm_img_str": "V2ViR0wgMS4wIChPcGVuR0wgRVMgMi4wIENocm9taXVtKQ",
+ "dm_cover_img_str": "QU5HTEUgKE5WSURJQSwgTlZJRElBIEdlRm9yY2UgR1RYIDE2NTAgKDB4MDAwMDFGOTkpIERpcmVjdDNEMTEgdnNfNV8wIHBzXzVfMCwgRDNEMTEpR29vZ2xlIEluYy4gKE5WSURJQS",
+ # "dm_img_inter": '{"ds":[{"t":1,"c":"","p":[],"s":[]}],"wh":[],"of":[]}',
+ # "w_webid": w_wedid,
+ }
+ w_rid, wts = Bilibili.get_w_rid(**paras)
+ paras.update({"w_rid": w_rid, "wts": wts})
+ paras_list = [f"{k}={v}" for k, v in paras.items()]
+ paras_str = "&".join(paras_list)
+ return f"https://api.bilibili.com/x/space/wbi/arc/search?{paras_str}"
@staticmethod
def bilibili_vc_api(video_id):
@@ -144,12 +184,39 @@ def bilibili_h_api(doc_id):
return 'https://api.vc.bilibili.com/link_draw/v1/doc/detail?doc_id=%s' % doc_id
@staticmethod
- def url_size(url, faker=False, headers={},err_value=0):
+ def url_size(url, faker=False, headers={}, err_value=0):
try:
- return url_size(url,faker,headers)
+ return url_size(url, faker, headers)
except:
return err_value
+ @staticmethod
+ def get_w_webid(html_content):
+ innerText = r1(r'