class Subtitle(Service): def __init__(self): super(Subtitle, self).__init__() self.url = "https://app.bilibili.com/bilibili.community.service.dm.v1.DM/DmView" self.config = Config() def get_headers(self): headers = { "env": "prod", "app-key": "android", "user-agent": self.config.get_user_agent(), "x-bili-metadata-bin": self.config.get_metadata_bin(), "authorization": f"identify_v1 {self.config.auth}", "x-bili-device-bin": self.config.get_device_bin(), "x-bili-network-bin": self.config.get_network_bin(), "x-bili-restriction-bin": "", "x-bili-locale-bin": self.config.get_locale_bin(), "x-bili-fawkes-req-bin": self.config.get_fawkesreq_bin(), "content-type": "application/grpc", "accept-encoding": "gzip", "cookie": "bfe_id=; sid=" } return headers def parse_payload(self, payload: bytes): # 用于测试解析抓包的payload msg = DmViewReq() msg.ParseFromString(self.slice_message(payload)) return MessageToDict(msg) def parse_reply(self, resp: bytes): try: import json import pathlib from response.dmviewreply_pb2 import DmViewReply except Exception as e: return reply = DmViewReply() reply.ParseFromString(resp) path = pathlib.Path("subtitle_resp.json") # MessageToJson直接就是字符串了 但是中文会乱码 还是手动转一下 text = json.dumps(MessageToDict(reply), ensure_ascii=False, indent=4) path.write_text(text, encoding="utf-8") def get_payload(self, pid: int, oid: int, stype: int = 1): msg = DmViewReq() msg.pid = pid msg.oid = oid msg.type = stype print(MessageToDict(msg)) # 可以输出检查一下 return self.add_payload_header(msg.SerializeToString(), compressed=False) def request(self, pid: int, oid: int, stype: int = 1): headers = self.get_headers() payload = self.get_payload(pid, oid, stype) # print([hex(_)[2:].zfill(2).upper() for _ in list(payload)]) try: r = requests.post(self.url, data=payload, headers=headers, timeout=5) except Exception as e: print(f"error --> {e}") return resp = self.slice_message(r.content) self.parse_reply(resp) return resp
class Video(Service): def __init__(self): super(Video, self).__init__() self.url = "https://grpc.biliapi.net/bilibili.pgc.gateway.player.v1.PlayURL/PlayView" self.config = Config() def get_headers(self): headers = { "user-agent": self.config.get_user_agent(), "content-type": "application/grpc", "te": "trailers", "x-bili-fawkes-req-bin": self.config.get_fawkesreq_bin(), "x-bili-metadata-bin": self.config.get_metadata_bin(), "authorization": f"identify_v1 {self.config.auth}", "x-bili-device-bin": self.config.get_device_bin(), "x-bili-network-bin": self.config.get_network_bin(), "x-bili-restriction-bin": "", "x-bili-locale-bin": self.config.get_locale_bin(), "grpc-encoding": "gzip", "grpc-accept-encoding": "identity,gzip", "grpc-timeout": "17985446u" # u指微秒 -> us } return headers def get_payload(self, epid: int, cid: int, qn: int = 112, **kwargs): # 为0或者False 不做操作 msg = PlayViewReq() msg.epId = epid msg.cid = cid msg.qn = qn # msg.fnver = kwargs["fnver"] if kwargs.get("fnver") else 0 msg.fnval = kwargs["fnval"] if kwargs.get("fnval") else 16 # msg.download = kwargs["download"] if kwargs.get("download") else 0 # msg.forceHost = kwargs["forceHost"] if kwargs.get("forceHost") else 0 msg.fourk = kwargs["fourk"] if kwargs.get("fourk") else True msg.spmid = kwargs["spmid"] if kwargs.get( "spmid") else "pgc.pgc-video-detail.0.0" msg.fromSpmid = kwargs["fromSpmid"] if kwargs.get( "fromSpmid") else "search.search-result.0.0" # msg.teenagersMode = kwargs["teenagersMode"] if kwargs.get("teenagersMode") else 0 msg.preferCodecType = kwargs["preferCodecType"] if kwargs.get( "preferCodecType") else 2 msg.isPreview = kwargs["isPreview"] if kwargs.get( "isPreview") else False # type: bool # msg.roomId = kwargs["roomId"] if kwargs.get("roomId") else 0 # print(MessageToDict(msg)) # 可以输出检查一下 return self.add_payload_header(self.gzip_compress_proto_message(msg)) def parse_reply(self, resp: bytes): try: import json import pathlib from response.playviewreply_pb2 import PlayViewReply except Exception as e: return reply = PlayViewReply() reply.ParseFromString(resp) path = pathlib.Path("video_resp.json") # MessageToJson直接就是字符串了 但是中文会乱码 还是手动转一下 text = json.dumps(MessageToDict(reply), ensure_ascii=False, indent=4) path.write_text(text, encoding="utf-8") def parse_payload(self, payload: bytes): # 用于测试解析抓包的payload payload = self.slice_message(payload) msg = PlayViewReq() msg.ParseFromString(payload) return MessageToDict(msg) def request(self, epid: int, cid: int, qn: int = 112): headers = self.get_headers() payload = self.get_payload(epid, cid, qn) try: r = requests.post(self.url, data=payload, headers=headers, timeout=5) except Exception as e: print(f"error --> {e}") return # print(r.content) resp = self.slice_message(r.content) self.parse_reply(resp) return resp