def get_episodes(season_id: int) -> dict: Data = requests.get( f'https://api.bilibili.com/pgc/web/season/section?season_id={season_id}', ) JsonDATA = json.loads(Data.text) EpisodeDict = { 'aid': 'aid', 'title': 'long_title', 'episode_id': 'id', 'short_title': 'title' } MainEpisodes = [] for MainEpisode in JsonDATA['result']['main_section']['episodes']: MainEpisodes.append(extractor(data=MainEpisode, dicts=EpisodeDict)) OtherEpisodes = [] # 其它剧集的分支列表 for OtherEpisode in JsonDATA['result']['section']: Episodes = [] # 剧集分支的具体剧集列表 for range_var3 in OtherEpisode['episodes']: Episodes.append(extractor(data=range_var3, dicts=EpisodeDict)) OtherEpisodes.append(Episodes) return { 'response_code': Data.status_code, 'return_code': JsonDATA['code'], 'main_episodes': MainEpisodes, 'other_episodes': OtherEpisodes }
def get_relate_video(tag_id: int, page: int = 1, page_size: int = 10) -> dict: Data = requests.get( f'https://api.bilibili.com/x/web-interface/tag/top?pn={page}&ps={page_size}&tid={tag_id}' ) if Data.text == '': return { 'response_code': Data.status_code, 'return_code': '-1', 'videos': [] } JsonData = json.loads(Data.text) VideoInfoDict = { 'aid': 'aid', 'bvid': 'bvid', 'title': 'title', 'tname': 'tname', 'copyright': 'copyright', 'upload_time': 'pubdate', 'introduction': 'desc' } VideoDataDict = { 'view': 'view', 'danmaku': 'danmaku', 'like': 'like', 'dislike': 'dislike', 'reply': 'reply', 'coin': 'coin', 'collect': 'favorite', 'share': 'share' } VideoList = [] for Video in JsonData['data']: VideoList.append({ **extractor(data=Video, dicts=VideoInfoDict), **extractor(data=Video['stat'], dicts=VideoDataDict) }) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], 'videos': VideoList }
def get_recommends(season_id: int) -> dict: Data = requests.get( f'https://api.bilibili.com/pgc/web/recommend/related/recommend?season_id={season_id}' ) JsonData = json.loads(Data.text) ReturnData = {'original': [], 'recommend': []} # 获取原作漫画 OriginalDict = { 'message1': 'desc1', 'message2': 'desc2', 'item_id': 'item_id', 'status': 'label', 'title': 'title', 'tname': 'tname', 'url': 'url' } for originals in JsonData['result']['relates']: original = extractor(data=originals, dicts=OriginalDict) original['messages'] = [original['message1'], original['message2']] del original['message1'], original['message2'] ReturnData['original'].append(original) # 获取推荐番剧 RecommendDict = { 'title': 'title', 'season_id': 'season_id', 'new_ep': ['new_ep', 'id'], 'num': ['new_ep', 'index'], 'score': ['rating', 'score'], 'score_count': ['rating', 'count'], 'danmaku': ['stat', 'danmaku'], 'follow': ['stat', 'follow'], 'view': ['stat', 'view'] } for recommend in JsonData['result']['season']: ReturnData['recommend'].append( extractor(data=recommend, dicts=RecommendDict)) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], **ReturnData }
def get_replies(self, sort, pn) -> dict: num = bv2av('BV' + self.num) if self.code == 'bvid' else self.num Data = requests.get( f'http://api.bilibili.com/x/v2/reply?pn={pn}&type=1&sort={sort}&oid={num}' ) JsonData = json.loads(Data.text) all_page = int(JsonData['data']['page']['count']) all_page = all_page / 20 if all_page / 20 == int( all_page / 20) else int(all_page / 20) + 1 ReplyList = [] ReplyDict = { 'name': ['member', 'uname'], 'level': ['member', 'level_info', 'current_level'], 'sex': ['member', 'sex'], 'official': ['member', 'official_verify', 'desc'], 'like': 'like', 'reply': 'rcount', 'upload_time': 'ctime', 'content': ['content', 'message'], 'up_like': ['up_action', 'like'], 'up_reply': ['up_action', 'reply'] } for Replies in JsonData['data']['replies']: ReplyList.append({ **extractor(data=Replies, dicts=ReplyDict), 'replies': [] }) if Replies['replies']: for ChildReplies in Replies['replies']: ReplyList[len(ReplyList) - 1]['replies'].append({ **extractor(data=ChildReplies, dicts=ReplyDict), 'replies': [] }) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], 'replies': ReplyList, 'all_page': all_page }
def user_top_video(self): """返回用户的置顶视频""" Data = requests.get(f'https://api.bilibili.com/x/space/top/arc?vmid={self.user_uid}', headers = self.headers) JsonData = json.loads(Data.text) if Data.status_code != 200 or JsonData['code'] != 0: # 判断是否有置顶视频 return {'response_code': Data.status_code, 'return_code': JsonData['code']} TopVideoDict = {'aid': 'aid', 'bvid': 'bvid', 'tname': 'tname', 'copyright': 'copyright', 'title': 'title', 'upload_time': 'ctime', 'introduction': 'desc', 'view': 'view', 'danmaku': 'danmaku', 'reply': 'reply', 'like': 'like', 'dislike': 'dislike', 'coin': 'coin', 'collect': 'favorite', 'share': 'share'} ReturnData = extractor(data = {**JsonData['data'], **JsonData['data']['stat']}, dicts = TopVideoDict) ReturnData['upload_time'] = int(ReturnData['upload_time']) return {'response_code': Data.status_code, 'return_code': JsonData['code'], **ReturnData}
def get_default_search_word() -> dict: Data = requests.get( 'https://api.bilibili.com/x/web-interface/search/default') JsonData = json.loads(Data.text) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], **extractor(data=JsonData['data'], dicts={ 'name': 'show_name', 'url': 'url' }) }
def user_info(self): """Return user`s basic info""" # 请求用户基础信息 Data = requests.get(f'https://api.bilibili.com/x/space/acc/info?mid={self.user_uid}', headers = self.headers) # 获取请求资源码 response_code = Data.status_code Data = json.loads(Data.text) # 获取网站返回码 return_code = Data['code'] if response_code != 200 or return_code != 0: # 如果返回码错误,则返回空数据 return {'response_code': response_code, 'return_code': return_code} InfoDict = {'name': 'name', 'sex': 'sex', 'sign': 'sign', 'level': 'level', 'birthday': 'birthday', 'fans_badge': 'fans_badge', 'official': ['official', 'title'], 'vip': ['vip', 'status']} return {'response_code': response_code, 'return_code': return_code, **extractor(Data['data'], dicts = InfoDict)}
def get_bangumi_data(season_id: int) -> dict: Data = requests.get( f'https://api.bilibili.com/pgc/web/season/stat?season_id={season_id}' ) JsonData = json.loads(Data.text) DataDict = { 'view': 'views', 'coin': 'coins', 'danmaku': 'danmakus', 'follower': 'series_follow' } return { 'response_code': Data.status_code, 'return_code': JsonData['code'], **extractor(data=JsonData['result'], dicts=DataDict) }
def user_video(self, pn): """Return user`s video list""" Data = requests.get(f'http://space.bilibili.com/ajax/member/getSubmitVideos?mid={self.user_uid}&page={pn}', headers = self.headers) JsonData = json.loads(Data.text) VideoList = [] Page = JsonData['data']['pages'] VideoDict = {'title': 'title', 'reply': 'comment', 'view': 'play', 'upload_time': 'created', 'danmaku': 'video_review', 'introduction': 'description', 'length': 'length', 'collect': 'favorites', 'aid': 'aid'} for Video in JsonData['data']['vlist']: video = extractor(data = Video, dicts = VideoDict) video['bvid'] = av2bv(video['aid']) VideoList.append(video) return {'response_code': Data.status_code, 'return_code': 0 if JsonData['status'] else -1, 'pages': Page, 'data': VideoList}
def video_info(self) -> dict: """Return video info""" if self.return_code != 0 or self.response_code != 200: return { 'response_code': self.response_code, 'return_code': self.return_code } VideoInfoDict = {'upload_time': 'pubdate', 'owner': ['owner', 'name']} VideoInfoList = ['aid', 'bvid', 'title', 'tname', 'copyright'] Data = extractor(data=self.MainData['data'], dicts=VideoInfoDict, copy_list=VideoInfoList) return { 'response_code': self.response_code, 'return_code': self.return_code, **Data }
def get_replies(media_id: int, reply_type: str = 'short', sort: 'int, str' = 0, cursor: int = None, page_size: int = 20): """ 获取番剧的长/短评\n :param media_id: 番剧的media_id :param reply_type: 获取的评论类型(short为短评,long为长评)(short) :param sort: 评论的排序(1为最新,0为默认)(0) :param cursor: 用于连续请求评论的标识符,可由此方法的返回值得到(None) :param page_size: 一次请求返回的评论数量(20) """ Url = f'https://api.bilibili.com/pgc/review/{reply_type}/list?media_id={media_id}&ps={page_size}&sort={sort}' \ + (f'&cursor={cursor}' if cursor is not None else '') Data = requests.get(Url) JsonData = json.loads(Data.text) ReplyList = [] ShortReplyDict = { 'name': ['author', 'uname'], 'uid': 'mid', 'vip_status': ['vip', 'vipStatus'], 'content': 'content', 'upload_time': 'mtime', 'progress': 'progress', 'score': 'score', 'like': ['stat', 'likes'] } LongReplyDict = { **ShortReplyDict, 'reply': ['stat', 'reply'], 'url': 'url' } for replies in JsonData['data']['list']: ReplyList.append( extractor(data=replies, dicts=ShortReplyDict if reply_type == 'short' else LongReplyDict)) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], 'total': JsonData['data']['total'], 'cursor': JsonData['data']['next'], 'replies': ReplyList }
def video_part(self) -> dict: if self.return_code != 0 or self.response_code != 200: return { 'response_code': self.response_code, 'return_code': self.return_code } PartDict = {'name': 'part', 'cid': 'cid', 'length': 'duration'} PartList = [] for Index in self.MainData['data']['pages']: Part = extractor(Index, PartDict) Part['length'] = TickToMinute(Part['length']) PartList.append(Part) return { 'response_code': self.response_code, 'return_code': self.return_code, 'part': PartList }
def get_bangumi_info(media_id: int) -> dict: Data = requests.get( f'https://api.bilibili.com/pgc/review/user?media_id={media_id}') JsonData = json.loads(Data.text) InfoDict = { 'title': 'title', 'season_id': 'season_id', 'new_ep': ['new_ep', 'id'], 'num': ['new_ep', 'index'], 'score': ['rating', 'score'], 'score_count': ['rating', 'count'], 'area': ['areas', 0, 'name'] } return { 'response_code': Data.status_code, 'return_code': JsonData['code'], **extractor(data=JsonData['result']['media'], dicts=InfoDict) }
def get_status(season_id: int) -> dict: Data = requests.get( f'https://api.bilibili.com/pgc/view/web/season/user/status?season_id={season_id}' ) JsonData = json.loads(Data.text) StatusDict = { 'area_limit': 'area_limit', 'is_baned': 'ban_area_show', 'title': ['dialog', 'title'], 'aid': ['paster', 'aid'], 'cid': ['paster', 'cid'], 'length': ['paster', 'duration'], 'url': ['paster', 'url'] } return { 'response_code': Data.status_code, 'return_code': JsonData['code'], **extractor(data=JsonData['result'], dicts=StatusDict) }
def get_tags(self) -> dict: Data = requests.get( f'https://api.bilibili.com/x/web-interface/view/detail/tag?{self.code}={self.num}' ) JsonData = json.loads(Data.text) TagList = [] TagDict = { 'upload_time': 'ctime', 'dislike': 'hates', 'like': 'likes', 'content': 'short_content', 'follower': 'subscribed_count', 'tag_id': 'tag_id', 'name': 'tag_name', 'type': 'tag_type' } for tags in JsonData['data']: TagList.append(extractor(data=tags, dicts=TagDict)) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], 'tag_list': TagList }
def video_data(self) -> dict: """Return video data""" if self.return_code != 0 or self.response_code != 200: return { 'response_code': self.response_code, 'return_code': self.return_code } VideoDataDict = { 'view': 'view', 'danmaku': 'danmaku', 'like': 'like', 'dislike': 'dislike', 'reply': 'reply', 'coin': 'coin', 'collect': 'favorite', 'share': 'share' } return { 'response_code': self.response_code, 'return_code': self.return_code, **extractor(data=self.MainData['data']['stat'], dicts=VideoDataDict) }
def get_questions(self, edge_id: int = None) -> dict: num = 'BV' + self.num if self.code == 'bvid' else self.num Url = f'https://api.bilibili.com/x/stein/edgeinfo_v2?{self.code}={num}&graph_version=303884' +\ (f'&edge_id={edge_id}' if edge_id else '') Data = requests.get(Url) JsonData = json.loads(Data.text) QuestionList = [] QuestionDict = { 'cid': 'cid', 'edge_id': 'id', 'is_default': 'is_default', 'content': 'option' } for Questions in JsonData['data']['edges']['questions']: ChoiceList = [] for Choices in Questions['choices']: ChoiceList.append(extractor(data=Choices, dicts=QuestionDict)) QuestionList.append(ChoiceList) return { 'response_code': Data.status_code, 'return_code': JsonData['code'], 'question_list': QuestionList }
def user_follows(self): Data = requests.get(f'https://api.bilibili.com/x/relation/stat?vmid={self.user_uid}') JsonData = json.loads(Data.text) FollowCopyList = ['black', 'follower', 'following'] return {'response_code': Data.status_code, 'return_code': JsonData['code'], **extractor(data = JsonData['data'], copy_list = FollowCopyList)}