def get_online_friends(user_id: int, bot: APIBot) -> List[int]: """ Getting user id, returns list ids of online friends :param user_id: int :param bot: APIBot :return: List[int] """ req = bot.request(method='friends.get', params={ 'user_id': user_id }) if req.get('error'): logger.error("No valid ids") return [] responses = req.get("response") friends = responses.get("items") if not friends: logger.warning(f"No friends for {user_id}") return [] return get_online(friends, bot)
def get_online(users_ids: List[Any], bot: APIBot) -> List[int]: """ Getting list of ids, returns list of online ids :param users_ids: List[str] :param bot: APIBot :return: List[int] """ req = bot.request(method='users.get', params={ 'user_ids': users_ids, 'fields': ['online'] }) if req.get('error'): logger.error("No valid ids") return [] online_list = [] responses = req.get("response") for response in responses: if response.get("online") == 1: online_list.append(response.get("id")) return online_list
def preparing(users_ids: List[int], bot: APIBot): """ Preparing module Checking profiles (users_ids) for vulnerability to attacks :return: """ _return = [] for user_id in users_ids: data = bot.request(method='friends.get', params={ 'user_id': user_id, 'count': settings.max_friends, }) if data.get('error'): logger.error( f"for id '{user_id}' failed\n{data.get('error').get('error_msg')}" ) if data.get('error').get('error_msg') == 30: _return.append(User(uid=user_id, is_closed=True, friends=[])) continue friends = data.get('response').get('items') _return.append( User(uid=user_id, is_closed=False, friends=friends, candidates=friends)) return _return
def executescript(self, script: str): """ Sent executescript request to db :param script: SQLite script, for example: script = 'INSERT INTO table1 VALUES (1,2,3)' :return: """ with sqlite3.connect(self.path) as conn: self.cursor = conn.cursor() try: self.cursor.executescript(script) conn.commit() except Exception as error: logger.error(error)
def executemany(self, script: str, params: Iterable): """ Sent executemany request to db :param script: SQLite script with placeholders, for example: script = 'INSERT INTO table1 VALUES (?,?,?)' :param params: Values for placeholders, for example: params = [ (1, 'text1', 0.1), (2, 'text2', 0.2) ] """ with sqlite3.connect(self.path) as conn: self.cursor = conn.cursor() try: self.cursor.executemany(script, params) conn.commit() except Exception as error: logger.error(error)
def scrap_friends(friends_ids: [str], bot: APIBot): data = bot.request(method='users.get', params={ 'user_ids': friends_ids, 'fields': ['sex', 'photo_max_orig', 'online_mobile'] }) if data.get('error'): logger.error(data.get('error').get('error_msg')) return if data.get('response'): for user_data in data.get('response'): user_data['is_closed'] = str(user_data['is_closed']) dbc.save_user_data(user_data=user_data)
def main(users_ids: [str], bot: APIBot): """ Running main module process """ status = Status(module_name='onliner') status.restarting() data = bot.request(method='users.get', params={ 'user_ids': users_ids, 'fields': ['sex', 'online', 'photo_max_orig', 'online_mobile'] }) time_data = datetime.datetime.now().astimezone().replace(microsecond=0).isoformat() if data.get('error'): status.failed() logger.error(data.get('error').get('error_msg')) return if data.get('response'): status.processing() for user_data in data.get('response'): # For each target id # Adding data to main dict friends_online = friends.get_online_friends(user_id=user_data['id'], bot=bot) user_data['time'] = time_data user_data['is_closed'] = str(user_data['is_closed']) user_data['friends_online'] = friends_online # Saving data dbc.save_user_data(user_data=user_data) dbc.save_user_online(user_data=user_data) logger.info(f"[{user_data.get('id')}] {user_data.get('first_name')} {user_data.get('last_name')} - " f"{'Online' if user_data.get('online') == 1 else 'Offline'}") # Running friends scrapping process = Process(target=scrap_friends, args=(friends_online, bot)) # running module process.start() status.success() else: status.failed() logger.error(f"No answer for {users_ids}...")