示例#1
0
 async def upload_chunk():
     while True:
         chunks_data = file.read(chunk_size)
         if not chunks_data:
             return
         params['chunk'] += 1
         params['size'] = len(chunks_data)
         params['partNumber'] = params['chunk'] + 1
         params['start'] = params['chunk'] * chunk_size
         params['end'] = params['start'] + params['size']
         clone = params.copy()
         for i in range(10):
             try:
                 await afunc(session, chunks_data, clone)
                 break
             except (asyncio.TimeoutError, aiohttp.ClientError) as e:
                 logger.error(
                     f"retry chunk{clone['chunk']} >> {i + 1}. {e}")
示例#2
0
    def submit(self, submit_api=None):
        if not self.video.title:
            self.video.title = self.video.videos[0]["title"]
        self.__session.get('https://member.bilibili.com/x/geetest/pre/add',
                           timeout=5)

        if submit_api is None:
            myinfo = self.__session.get(
                'https://member.bilibili.com/x/web/archive/pre?lang=cn',
                timeout=15).json()['data']['myinfo']
            total_info = self.__session.get(
                'https://member.bilibili.com/x/web/index/stat',
                timeout=15).json()
            if total_info.get('data') is None:
                logger.error(total_info)
            myinfo['total_info'] = total_info.get('data')
            if myinfo['level'] > 3 and myinfo[
                    'total_info'] and myinfo['total_info']['total_fans'] > 100:
                user_weight = 2
            else:
                user_weight = 1
            logger.info(f'用户权重: {user_weight}')
            submit_api = 'web' if user_weight == 2 else 'client'
        ret = None
        if submit_api == 'web':
            ret = self.submit_web()
            if ret["code"] == 21138:
                logger.info(f'改用客户端接口提交{ret}')
                submit_api = 'client'
        if submit_api == 'client':
            ret = self.submit_client()
        if not ret:
            raise Exception(f'不存在的选项:{submit_api}')
        if ret["code"] == 0:
            return ret
        else:
            raise Exception(ret)
示例#3
0
 def upload_file(self, filepath: str, lines='AUTO', tasks=3):
     if not self._auto_os:
         self._auto_os = self.probe()
         if lines == 'kodo':
             self._auto_os = {
                 "os": "kodo",
                 "query": "bucket=bvcupcdnkodobm&probe_version=20200810",
                 "probe_url": "//up-na0.qbox.me/crossdomain.xml"
             }
         if lines == 'bda2':
             self._auto_os = {
                 "os": "upos",
                 "query": "upcdn=bda2&probe_version=20200810",
                 "probe_url": "//upos-sz-upcdnbda2.bilivideo.com/OK"
             }
         if lines == 'ws':
             self._auto_os = {
                 "os": "upos",
                 "query": "upcdn=ws&probe_version=20200810",
                 "probe_url": "//upos-sz-upcdnws.bilivideo.com/OK"
             }
         if lines == 'qn':
             self._auto_os = {
                 "os": "upos",
                 "query": "upcdn=qn&probe_version=20200810",
                 "probe_url": "//upos-sz-upcdnqn.bilivideo.com/OK"
             }
         logger.info(
             f"线路选择 => {self._auto_os['os']}: {self._auto_os['query']}. time: {self._auto_os.get('cost')}"
         )
     if self._auto_os['os'] == 'upos':
         upload = self.upos
     elif self._auto_os['os'] == 'kodo':
         upload = self.kodo
     elif self._auto_os['os'] == "gcs":
         raise NotImplementedError('gcs')
     elif self._auto_os['os'] == "bos":
         raise NotImplementedError('bos')
     else:
         logger.error(f"NoSearch:{self._auto_os['os']}")
         raise NotImplementedError(self._auto_os['os'])
     total_size = os.path.getsize(filepath)
     with open(filepath, 'rb') as f:
         query = {
             'name': f.name,
             'size': int(total_size),
             'r': self._auto_os['os'],
             'profile': 'ugcupos/bup'
             if 'upos' == self._auto_os['os'] else "ugcupos/bupfetch",
             'ssl': 0,
             'version': '2.8.12',
             'build': 2081200,
         }
         self.__session.headers.update({
             'authority':
             'member.bilibili.com',
             'sec-ch-ua':
             '"Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"',
             'sec-ch-ua-mobile':
             '?0',
             'user-agent':
             'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
             'accept':
             '*/*',
             'sec-fetch-site':
             'same-origin',
             'sec-fetch-mode':
             'cors',
             'sec-fetch-dest':
             'empty',
             'referer':
             'https://member.bilibili.com/video/upload.html',
             'accept-language':
             'zh-CN,zh;q=0.9',
             'cookie':
             f'buvid3={self.buvid3}; SESSDATA={self.sessdata}; bili_jct={self.csrf}'
         })
         res = self.__session.get(
             f"https://member.bilibili.com/preupload?{self._auto_os['query']}",
             params=query,
             timeout=5)
         if res.status_code != 200:
             raise Exception(res)
         else:
             print(res)
         return asyncio.run(upload(f, total_size, res.json(), tasks=tasks))