コード例 #1
0
ファイル: user.py プロジェクト: k471559444/bili2.0
 def __init__(self, id, dict_user, task_ctrl, dict_bili):
     self.id = id
     self.name = dict_user['username']
     self.password = dict_user['password']
     self.task_ctrl = task_ctrl
     self.status = UserStatus(self)
     self._bililive_session = None
     self._login_session = None
     self._other_session = None
     # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
     self.dict_bili = copy.deepcopy(dict_bili)
     self.app_params = f'actionKey={dict_bili["actionKey"]}&appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&platform={dict_bili["platform"]}'
     self.update_login_data(dict_user)
     self.list_delay = []
コード例 #2
0
ファイル: user.py プロジェクト: zsnmwy/bili2.0
 def __init__(self, id, dict_user, task_ctrl, dict_bili, dyn_lottery_friends):
     self.id = id
     self.name = dict_user['username']
     self.password = dict_user['password']
     self.alias = dict_user.get('alias', self.name)
     self.task_ctrl = task_ctrl
     self.status = UserStatus(self)
     self._bililive_session = None
     self._login_session = None
     self._other_session = None
     # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
     self.dict_bili = copy.deepcopy(dict_bili)
     self.app_params = f'actionKey={dict_bili["actionKey"]}&appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&platform={dict_bili["platform"]}'
     self.update_login_data(dict_user)
     self.list_delay = []
     self.repost_del_lock = asyncio.Lock()  # 在follow与unfollow过程中必须保证安全(repost和del整个过程加锁)
     self.dyn_lottery_friends = dyn_lottery_friends  # list (uid, name)
コード例 #3
0
 def __init__(self, dict_user: dict, task_ctrl: dict, dict_bili: dict):
     self.id = next(self._ids)
     self.name = dict_user['username']
     self.password = dict_user['password']
     self.alias = dict_user.get('alias', self.name)
     self.task_ctrl = task_ctrl
     self.status = UserStatus()
     self._bililive_session = None
     self._login_session = None
     self._other_session = None
     # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
     self.dict_bili = copy.deepcopy(dict_bili)
     self.app_params = f'actionKey={dict_bili["actionKey"]}&' \
         f'appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&' \
         f'device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&' \
         f'platform={dict_bili["platform"]}'
     self.update_login_data(dict_user)
     self.list_delay = []
     self.repost_del_lock = asyncio.Lock()  # 在follow与unfollow过程中必须保证安全(repost和del整个过程加锁)
     dyn_lottery_friends = [(str(uid), name) for uid, name in task_ctrl['dyn_lottery_friends'].items()]
     self.dyn_lottery_friends = dyn_lottery_friends  # list (uid, name)
     self.storm_lock = asyncio.Semaphore(1)  # 用于控制同时进行的风暴数目(注意是单个用户的)
     self.recording_tasks = {}
コード例 #4
0
ファイル: user.py プロジェクト: zsnmwy/bili2.0
class User:
    def __init__(self, id, dict_user, task_ctrl, dict_bili, dyn_lottery_friends):
        self.id = id
        self.name = dict_user['username']
        self.password = dict_user['password']
        self.alias = dict_user.get('alias', self.name)
        self.task_ctrl = task_ctrl
        self.status = UserStatus(self)
        self._bililive_session = None
        self._login_session = None
        self._other_session = None
        # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
        self.dict_bili = copy.deepcopy(dict_bili)
        self.app_params = f'actionKey={dict_bili["actionKey"]}&appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&platform={dict_bili["platform"]}'
        self.update_login_data(dict_user)
        self.list_delay = []
        self.repost_del_lock = asyncio.Lock()  # 在follow与unfollow过程中必须保证安全(repost和del整个过程加锁)
        self.dyn_lottery_friends = dyn_lottery_friends  # list (uid, name)
        
    def update_login_data(self, login_data):
        for i, value in login_data.items():
            self.dict_bili[i] = value
            if i == 'cookie':
                self.dict_bili['pcheaders']['cookie'] = value
                self.dict_bili['appheaders']['cookie'] = value
        conf_loader.write_user(login_data, self.id)
        
    def is_online(self):
        return self.dict_bili['pcheaders']['cookie'] and self.dict_bili['appheaders']['cookie']
        
    @property
    def bililive_session(self):
        if self._bililive_session is None:
            self._bililive_session = WebSession()
        return self._bililive_session
        
    @property
    def login_session(self):
        if self._login_session is None:
            self._login_session = WebSession()
            # print('测试session')
        return self._login_session
        
    @property
    def other_session(self):
        if self._other_session is None:
            self._other_session = WebSession()
        return self._other_session
        
    def info(self, list_msg, tag_time=False, with_userid=True):
        if with_userid:
            list_msg[0] += f'(用户id:{self.id} 名字:{self.alias})'
        printer.info(list_msg, tag_time)
        
    def warn(self, msg):
        printer.warn(f'{msg}, 用户id:{self.id} 名字:{self.alias}')
        
    def calc_sign(self, str):
        str = f'{str}{self.dict_bili["app_secret"]}'
        hash = hashlib.md5()
        hash.update(str.encode('utf-8'))
        sign = hash.hexdigest()
        return sign
        
    async def get_statistic(self):
        self.status.print_status()
        bili_statistics.print_statistics(self.id)
        
    # 保证在线
    async def req_s(self, func, *args):
        while True:
            # print('网络请求', func, args)
            rsp = await func(*args)
            # print('请求结果', func, rsp)
            # if random.randint(0, 7) in (3, 4) or rsp == 3:
            #     rsp = 3
            is_online = self.status.check_log_status()
            if not is_online:
                future = asyncio.Future()
                self.list_delay.append(future)
                await future
            # 未登陆且未处理
            if rsp == 3 and is_online:
                self.info([f'判定出现了登陆失败,且未处理'], True)
                self.status.logout()
                # login
                await LoginTask.handle_login_status(self)
                # await asyncio.sleep(10)
                print(self.list_delay)
                self.info([f'已经登陆了'], True)
                self.status.login()
                for future in self.list_delay:
                    future.set_result(True)
                del self.list_delay[:]
            # 未登陆,但已处理
            elif not is_online:
                self.info([f'判定出现了登陆失败,已经处理'], True)
            else:
                return rsp
        
    async def accept(self, func, *args):
        code, sleeptime = self.status.check_status(func)
        if not code:
            return await func(self, *args)
        if code == 2:
            return None
        if code == 1:
            return (-1, (sleeptime, sleeptime+30), self.id, *args),
        
    def sleep(self):
        self.status.sleep()
        
    def wakeup(self):
        self.status.wakeup()
              
    def fall_in_jail(self):
        self.status.go_to_jail()
        self.info([f'抽奖脚本检测{self.id}为小黑屋'], True)
        
    def out_of_jail(self):
        self.status.out_of_jail()
        
    def print_state(self):
        return self.state.print_state()
コード例 #5
0
class User:
    def __init__(self, id, dict_user, task_ctrl, dict_bili):
        self.id = id
        self.name = dict_user['username']
        self.password = dict_user['password']
        self.alias = dict_user.get('alias', self.name)
        self.task_ctrl = task_ctrl
        self.status = UserStatus(self)
        self._bililive_session = None
        self._login_session = None
        self._other_session = None
        # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
        self.dict_bili = copy.deepcopy(dict_bili)
        self.app_params = f'actionKey={dict_bili["actionKey"]}&appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&platform={dict_bili["platform"]}'
        self.update_login_data(dict_user)
        self.list_delay = []
        self.repost_del_lock = asyncio.Lock(
        )  # 在follow与unfollow过程中必须保证安全(repost和del整个过程加锁)
        dyn_lottery_friends = [
            (str(uid), name)
            for uid, name in task_ctrl['dyn_lottery_friends'].items()
        ]
        self.dyn_lottery_friends = dyn_lottery_friends  # list (uid, name)
        self.storm_lock = asyncio.Semaphore(1)  # 用于控制同时进行的风暴数目(注意是单个用户的)

    def update_login_data(self, login_data):
        for i, value in login_data.items():
            self.dict_bili[i] = value
            if i == 'cookie':
                self.dict_bili['pcheaders']['cookie'] = value
                self.dict_bili['appheaders']['cookie'] = value
        conf_loader.write_user(login_data, self.id)

    def is_online(self):
        return self.dict_bili['pcheaders']['cookie'] and self.dict_bili[
            'appheaders']['cookie']

    @property
    def bililive_session(self):
        if self._bililive_session is None:
            self._bililive_session = WebSession()
        return self._bililive_session

    @property
    def login_session(self):
        if self._login_session is None:
            self._login_session = WebSession()
            # print('测试session')
        return self._login_session

    @property
    def other_session(self):
        if self._other_session is None:
            self._other_session = WebSession()
        return self._other_session

    def infos(self, list_objects, with_userid=True, **kwargs):
        if with_userid:
            printer.infos(list_objects,
                          **kwargs,
                          extra_info=f'用户id:{self.id} 名字:{self.alias}')
        else:
            printer.infos(list_objects, **kwargs)

    def info(self, *objects, with_userid=True, **kwargs):
        if with_userid:
            printer.info(*objects,
                         **kwargs,
                         extra_info=f'用户id:{self.id} 名字:{self.alias}')
        else:
            printer.info(*objects, **kwargs)

    def warn(self, *objects, **kwargs):
        printer.warn(*objects,
                     **kwargs,
                     extra_info=f'用户id:{self.id} 名字:{self.alias}')

    def calc_sign(self, str):
        str = f'{str}{self.dict_bili["app_secret"]}'
        hash = hashlib.md5()
        hash.update(str.encode('utf-8'))
        sign = hash.hexdigest()
        return sign

    async def get_statistic(self):
        self.status.print_status()
        bili_statistics.print_statistics(self.id)

    # 保证在线
    async def req_s(self, func, *args):
        while True:
            try:
                rsp = await func(*args)
                return rsp  # 如果正常,不用管是否登陆了(不少api不需要cookie),直接return
            except exceptions.LogoutError:
                is_online_status = self.status.check_log_status()
                # 未登陆且未处理
                if is_online_status:
                    self.info([f'判定出现了登陆失败,且未处理'], True)
                    self.status.logout()
                    # login
                    await LoginTask.handle_login_status(self)
                    print(self.list_delay)
                    self.info([f'已经登陆了'], True)
                    self.status.login()
                    for future in self.list_delay:
                        future.set_result(True)
                    del self.list_delay[:]
                # 未登陆,但已处理
                else:
                    future = asyncio.Future()
                    self.list_delay.append(future)
                    await future
                    self.info([f'判定出现了登陆失败,已经处理'], True)

    async def accept(self, func, *args):
        code, sleeptime = self.status.check_status(func)
        if not code:
            return await func(self, *args)
        if code == 2:
            return None
        if code == 1:
            return (-1, (sleeptime, sleeptime + 30), self.id, *args),

    def sleep(self):
        self.status.sleep()

    def wakeup(self):
        self.status.wakeup()

    def fall_in_jail(self):
        self.status.go_to_jail()
        self.info([f'抽奖脚本检测{self.id}为小黑屋'], True)

    def out_of_jail(self):
        self.status.out_of_jail()

    def print_state(self):
        return self.state.print_state()
コード例 #6
0
class User:
    _ids = count(0)

    def __init__(self, dict_user: dict, task_ctrl: dict, dict_bili: dict):
        self.id = next(self._ids)
        self.name = dict_user['username']
        self.password = dict_user['password']
        self.alias = dict_user.get('alias', self.name)
        self.task_ctrl = task_ctrl
        self.status = UserStatus()
        self._bililive_session = None
        self._login_session = None
        self._other_session = None
        # 每个user里面都分享了同一个dict,必须要隔离,否则更新cookie这些的时候会互相覆盖
        self.dict_bili = copy.deepcopy(dict_bili)
        self.app_params = f'actionKey={dict_bili["actionKey"]}&' \
            f'appkey={dict_bili["appkey"]}&build={dict_bili["build"]}&' \
            f'device={dict_bili["device"]}&mobi_app={dict_bili["mobi_app"]}&' \
            f'platform={dict_bili["platform"]}'
        self.update_login_data(dict_user)
        self.list_delay = []
        self.repost_del_lock = asyncio.Lock()  # 在follow与unfollow过程中必须保证安全(repost和del整个过程加锁)
        dyn_lottery_friends = [(str(uid), name) for uid, name in task_ctrl['dyn_lottery_friends'].items()]
        self.dyn_lottery_friends = dyn_lottery_friends  # list (uid, name)
        self.storm_lock = asyncio.Semaphore(1)  # 用于控制同时进行的风暴数目(注意是单个用户的)
        self.recording_tasks = {}

    def update_login_data(self, login_data):
        for i, value in login_data.items():
            self.dict_bili[i] = value
            if i == 'cookie':
                self.dict_bili['pcheaders']['cookie'] = value
                self.dict_bili['appheaders']['cookie'] = value
        conf_loader.write_user(login_data, self.id)

    def is_online(self):
        return self.dict_bili['pcheaders']['cookie'] and self.dict_bili['appheaders']['cookie']

    @property
    def bililive_session(self):
        if self._bililive_session is None:
            self._bililive_session = WebSession()
        return self._bililive_session

    @property
    def login_session(self):
        if self._login_session is None:
            self._login_session = WebSession()
            # print('测试session')
        return self._login_session

    @property
    def other_session(self):
        if self._other_session is None:
            self._other_session = WebSession()
        return self._other_session

    def infos(
            self,
            list_objects,
            with_userid=True,
            **kwargs):
        if with_userid:
            printer.infos(
                list_objects,
                **kwargs,
                extra_info=f'用户id:{self.id} 名字:{self.alias}')
        else:
            printer.infos(list_objects, **kwargs)

    def info(
            self,
            *objects,
            with_userid=True,
            **kwargs):
        if with_userid:
            printer.info(
                *objects,
                **kwargs,
                extra_info=f'用户id:{self.id} 名字:{self.alias}')
        else:
            printer.info(*objects, **kwargs)

    def warn(self, *objects, **kwargs):
        printer.warn(
            *objects,
            **kwargs,
            extra_info=f'用户id:{self.id} 名字:{self.alias}')

    def calc_sign(self, text):
        text = f'{text}{self.dict_bili["app_secret"]}'
        return hashlib.md5(text.encode('utf-8')).hexdigest()

    # 保证在线
    async def req_s(self, func, *args):
        while True:
            try:
                rsp = await func(*args)
                return rsp  # 如果正常,不用管是否登陆了(不少api不需要cookie),直接return
            except exceptions.LogoutError:
                is_online_status = self.status.check_log_status()
                # 未登陆且未处理
                if is_online_status:
                    self.info([f'判定出现了登陆失败,且未处理'], True)
                    self.status.logout()
                    # login
                    await LoginTask.handle_login_status(self)
                    print(self.list_delay)
                    self.info([f'已经登陆了'], True)
                    self.status.login()
                    for future in self.list_delay:
                        future.set_result(True)
                    del self.list_delay[:]
                # 未登陆,但已处理
                else:
                    future = asyncio.Future()
                    self.list_delay.append(future)
                    await future
                    self.info([f'判定出现了登陆失败,已经处理'], True)

    async def exec_func(self, func: Callable, *args, **kwargs):
        if self.status.check_status(func):
            return await func(self, *args, **kwargs)
        return None

    def fall_in_jail(self):
        self.status.go_to_jail()
        self.info(f'用户进入小黑屋')

    def out_of_jail(self):
        self.status.out_of_jail()
        self.info(f'抽奖脚本尝试性设置用户已出小黑屋(如果实际没出还会再判定进去)')

    def print_status(self):
        self.info('当前用户的RECORDING_TAKS:', self.recording_tasks)
        status = [i for i in self.status.get_status()]
        self.info('当前用户的状态:', *status)