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'