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}")
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)
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))