def set(self, url: str): ''' 解析视频 url str: BV,av,ep,ss号以及包含这些号的网址 ''' import re self.__type = 0 find = re.findall('(BV|av|ep|ss)([0-9 a-z A-Z]*)', url) if len(find): if find[0][0] == 'BV': self.__bvid = f'BV{find[0][1]}' self.__title = BiliWebApi.webView(self.__bvid)["data"]["title"] self.__type = 1 elif find[0][0] == 'av': self.__bvid = self.av2bv(find[0][1]) self.__title = BiliWebApi.webView(self.__bvid)["data"]["title"] self.__type = 1 elif find[0][0] == 'ep' or find[0][0] == 'ss': data = BiliWebApi.epPlayList(find[0][0] + find[0][1]) self.__title = data["mediaInfo"]["title"] self.__eplist = [[ f'{x["titleFormat"]} {x["longTitle"]}', x["bvid"], x["cid"] ] for x in data["epList"]] self.__type = 2 else: raise Exception("不支持的参数")
def __init__(self, cookieData, tilte="", content="", aid=0, category=0, list_id=0, tid=4, original=1, image_urls="", origin_image_urls=""): "创建一个B站专栏草稿" self.DoNotDel = False #在本类销毁时删除未提交文章,如果想保留请设置为True BiliWebApi.__init__(self, cookieData) self.__tilte = tilte self.__content = content self.__category = category self.__list_id = list_id self.__tid = tid self.__original = original self.__image_urls = image_urls self.__origin_image_urls = origin_image_urls self.__issubmit = False if (aid == 0): ret = self.createArticle(tilte, content, aid, category, list_id, tid, original, image_urls, origin_image_urls) self.__aid = ret["data"]["aid"] else: self.__aid = aid
def getDownloadList(self, ep_id: int): "获取漫画章节下载列表" data = BiliWebApi.mangaImageIndex(self, ep_id)["data"]["images"] url_list = [x["path"] for x in data] data = BiliWebApi.mangaImageToken(self, url_list)["data"] url_list = [f'{x["url"]}?token={x["token"]}' for x in data] return url_list
def __init__(self, comic_id=0, cookieData=None): if cookieData: BiliWebApi.__init__(self, cookieData) else: import requests session = requests.session() session.headers.update({ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36", "Referer": "https://www.bilibili.com/", 'Connection': 'keep-alive' }) self._BiliWebApi__session = session if comic_id: self.__manga_detail = BiliWebApi.mangaDetail(self, comic_id)["data"] self.__comic_id = self.__manga_detail["id"] self.__manga_detail["ep_list"].sort(key=lambda elem: elem["ord"]) else: self.__manga_detail = None
def all(self): '''取得当前所有视频(分P)''' if self.__type == 1: list = BiliWebApi.playList(self.__bvid)["data"] return [ self.__videos(x["part"], self.__bvid, x["cid"]) for x in list ] elif self.__type == 2: return [self.__videos(x[0], x[1], x[2]) for x in self.__eplist] else: return []
def __init__(self, cookieData, title="", desc="", dtime=0, tag=[], copyright=2, tid=174, source="", cover="", desc_format_id=0, subtitle={ "open": 0, "lan": "" }): "创建一个B站视频上传类" #简介 BiliWebApi.__init__(self, cookieData) self.__data = { "copyright": copyright, "videos": [], "source": source, "tid": tid, #分区,174为生活,其他分区 "cover": cover, #封面图片,可由recovers方法得到视频的帧截图 "title": title, "tag": "", "desc_format_id": desc_format_id, "desc": desc, "dynamic": "", "subtitle": subtitle } if dtime and dtime - int(time.time()) > 14400: self.__data["dtime"] = dtime for i in range(len(tag)): if (i == len(tag) - 1): self.__data["tag"] += tag[i] else: self.__data["dynamic"] += f'{tag[i]},' self.__data["tag"] += f'#{tag[i]}#'
def setComicId(comic_id: int): "设置当前漫画id" self.__manga_detail = BiliWebApi.mangaDetail(self, comic_id)["data"] self.__comic_id = self.__manga_detail["id"] self.__manga_detail["ep_list"].sort(key=lambda elem: elem["ord"])
def bili_exp(cookieData, pm): "B站直播签到,投币分享获取经验,模拟观看一个视频" try: biliapi = BiliWebApi(cookieData) except Exception as e: logging.info( f'登录验证id为{cookieData["DedeUserID"]}的账户失败,原因为({str(e)}),跳过此账户后续所有操作' ) pm.addMsg(f'id为:{cookieData["DedeUserID"]} 的账户登录失败') return pm.addMsg(f'目前账户为:({biliapi.getUserName()})') logging.info(f'登录账户 ({biliapi.getUserName()}) 成功') rdata = { "直播签到": False, "投币数量": 0, "视频观看": False, "视频分享": False, "脚本执行前经验": 0, "脚本执行前硬币": 0, } try: if biliapi.vipPrivilegeReceive(1)["code"] == 0: rdata["领取大会员B币"] = True if biliapi.vipPrivilegeReceive(2)["code"] == 0: rdata["领取会员购优惠券"] = True except: pass try: xliveInfo = biliapi.xliveSign() logging.info(f'bilibili直播签到信息:{str(xliveInfo)}') rdata["直播签到"] = (xliveInfo["code"] == 0) except Exception as e: logging.warning(f'直播签到异常,原因为{str(e)}') try: room_id = biliapi.xliveGetRecommendList()["data"]["list"][6]["roomid"] uid = biliapi.xliveGetRoomInfo(room_id)["data"]["room_info"]["uid"] now_time = int(time.time()) bagList = biliapi.xliveGiftBagList()["data"]["list"] for x in bagList: if x["expire_at"] - now_time < 172800: #礼物到期时间小于2天 ret = biliapi.xliveBagSend(room_id, uid, x["bag_id"], x["gift_id"], x["gift_num"]) if ret["code"] == 0: logging.info( f'{ret["data"]["send_tips"]} {ret["data"]["gift_name"]} 数量{ret["data"]["gift_num"]}' ) except Exception as e: logging.warning(f'直播送出即将过期礼物异常,原因为{str(e)}') try: reward = biliapi.getReward() logging.info(f'经验脚本开始前经验信息 :{str(reward)}') except Exception as e: logging.warning(f'获取账户经验信息异常,原因为{str(e)},跳过此账户后续所有操作') pm.addMsg(str(rdata)) return rdata["脚本执行前经验"] = reward["level_info"]["current_exp"] try: coin_num = biliapi.getCoin() except Exception as e: logging.warning(f'获取账户剩余硬币数异常,原因为{str(e)}') coin_num = 0 rdata["脚本执行前硬币"] = coin_num coin_exp_num = (50 - reward["coins_av"]) // 10 toubi_num = coin_exp_num if coin_num > coin_exp_num else coin_num try: datas = biliapi.getRegions() except Exception as e: logging.warning(f'获取B站分区视频信息异常,原因为{str(e)},跳过此账户后续所有操作') pm.addMsg(str(rdata)) return if (toubi_num > 0): for i in range(toubi_num): try: info = biliapi.coin(datas[i]["aid"], 1, 1) logging.info(f'投币信息 :{str(info)}') if (info["code"] == 0): rdata["投币数量"] += 1 except Exception as e: logging.warning(f'投币异常,原因为{str(e)}') try: info = biliapi.report(datas[5]["aid"], datas[5]["cid"], 300) logging.info(f'模拟视频观看进度上报:{str(info)}') rdata["视频观看"] = (info["code"] == 0) except Exception as e: logging.warning(f'模拟视频观看异常,原因为{str(e)}') try: info = biliapi.share(datas[5]["aid"]) logging.info(f'分享视频结果:{str(info)}') rdata["视频分享"] = (info["code"] == 0) except Exception as e: logging.warning(f'分享视频异常,原因为{str(e)}') pm.addMsg(str(rdata)) logging.info('本账户操作全部完成')
def av2bv(aid: int): "B站av号转bv号" return BiliWebApi.webStat(aid)["data"]["bvid"]
def bv2av(bvid: str): '''B站bv号转av号''' return BiliWebApi.webView(bvid)["data"]["aid"]
def allStream(self, cookieData: dict = None, reverse_proxy='', force_use_proxy=False): ''' 获取所有视频流 cookieData dict :包含"SESSDATA"值的字典,模拟用户登录 reverse_proxy str :B站接口代理地址 force_use_proxy bool :强制使用代理地址(默认请求失败才尝试代理地址) ''' biliapi = BiliWebApi(cookieData) if force_use_proxy: RP = reverse_proxy data = biliapi.playerUrl(cid=self.__cid, bvid=self.__bvid, reverse_proxy=RP) if data["code"] != 0: raise Exception(f'解析失败,请尝试使用会员账号(错误信息:{data["message"]})') else: RP = '' data = biliapi.playerUrl(cid=self.__cid, bvid=self.__bvid, reverse_proxy=RP) if data["code"] != 0: if reverse_proxy == '': raise Exception( f'解析失败,请尝试使用代理或会员账号(错误信息:{data["message"]})') else: RP = reverse_proxy data = biliapi.playerUrl(cid=self.__cid, bvid=self.__bvid, reverse_proxy=RP) if data["code"] != 0: print(self.__bvid, self.__cid) raise Exception( f'解析失败,请尝试更换代理地区或使用会员账号(错误信息:{data["message"]})' ) accept_quality = data["data"]["accept_quality"] accept_description = data["data"]["accept_description"] ret = [] for ii in range(len(accept_quality)): data = biliapi.playerUrl(cid=self.__cid, bvid=self.__bvid, qn=accept_quality[ii], reverse_proxy=RP)["data"] if data["quality"] != accept_quality[ii]: continue if 'flv' in data["format"]: ret.append( self.__videostream( f'{self.__title}.flv', data["durl"][0]["url"].replace('http:', 'https:'), accept_description[ii], data["durl"][0]["size"])) else: ret.append( self.__videostream( f'{self.__title}.mp4', data["durl"][0]["url"].replace('http:', 'https:'), accept_description[ii], data["durl"][0]["size"])) return ret