Exemple #1
0
 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("不支持的参数")
Exemple #2
0
 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
Exemple #3
0
 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
Exemple #4
0
 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
Exemple #5
0
 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 []
Exemple #6
0
    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]}#'
Exemple #7
0
 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"])
Exemple #8
0
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('本账户操作全部完成')
Exemple #9
0
 def av2bv(aid: int):
     "B站av号转bv号"
     return BiliWebApi.webStat(aid)["data"]["bvid"]
Exemple #10
0
 def bv2av(bvid: str):
     '''B站bv号转av号'''
     return BiliWebApi.webView(bvid)["data"]["aid"]
Exemple #11
0
        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