def fdelete(query): for uid in query: if uid not in targets: myprint(uid, 'отсутствует в списке целей!', error=True) else: targets.remove(uid) print(uid, 'успешно удален из списка целей.')
def get_friends(uid, target, lvl=1): global finded_friends lfriends = methods.friends(uid) if not lfriends: return False founded_in_this_list = False #если нашли нового друга if target in lfriends and uid not in get_friends.founded: founded_in_this_list = True get_friends.founded.append(uid) myprint('{} ({})'.format(methods.names(uid), uid)) #если в данном списке найдена цель, можно нырнуть на два уровня глубже if lvl <= varlist['depth'] \ or (founded_in_this_list and lvl <= varlist['depth']+2): #если цель была найдена, рассматриваем по максимуму людей из этого списка limit = varlist['max_users'] if founded_in_this_list else varlist[ 'min_users'] for i, friend in enumerate(lfriends): #снижает число зацикливаний if friend not in get_friends.founded: if i >= limit: break rez = get_friends(friend, target, lvl + 1) #если было попадание в подсписке, рассматриваем по максимуму людей из этого списка if rez: limit = varlist['max_users'] return founded_in_this_list
def fdelete(query): global vectors for uid in query: if uid in vectors: vectors.pop(uid) print(uid, 'успешно удален из списка векторов.') else: myprint('Вектор не найден!', error=True)
def fstart(): if not payload: myprint('Не выбрана нагрузка!', error=True) return try: payload.start() except KeyboardInterrupt: myprint('Payload has stoped!', error=True)
def fget(queries): for query in queries: query = int(query) #Если цель есть в списке векторов if query in vectors: target.vectors[query] = (query, 1) print('Для {0} ({1}) получен вектор I уровня: {0} ({1}).'.format( methods.names(query), query)) continue #выбрать первый вектор из списка для выполнения запросов к api uid = utokens[0][1] vk = vectors[uid] #есть ли в списке друзей выбранного вектора цель? friends = methods.friends(uid, vk) if not friends: myprint('Не удалось получить список друзей для', uid, error=True) elif query in friends: target.vectors[query] = (uid, 2) print('Для {} ({}) получен вектор II уровня: {} ({}).'.format( methods.names(query), query, methods.names(uid), uid)) continue #есть ли в списке друзей цели какой-нибудь вектор? friends = methods.friends(query, vk) if not friends: myprint('Не удалось получить список друзей для', query, error=True) else: rez = friends & set(vectors) if len(rez): rez = rez.pop() target.vectors[query] = (rez, 2) print('Для {} ({}) получен вектор II уровня: {} ({}).'.format( methods.names(query), query, methods.names(rez), rez)) continue #Есть ли общие друзья у какого-нибудь вектора и цели? b = False if friends: for vid, obj in vectors.items(): friends2 = methods.friends(vid, obj) if friends2: rez = friends & friends2 if len(rez): target.vectors[query] = (vid, 3) print( 'Для {} ({}) получен вектор III уровня: {} ({}).'. format(methods.names(query), query, methods.names(vid), vid)) b = True break if b: continue #Выбрать случайный вектор target.vectors[query] = (uid, 4) print('Для {} получен вектор IV уровня: {}.'.format(query, uid))
def fadd(query): for uid in query: uid = int(uid) if uid in targets: myprint(uid, 'уже добавлен в список целей!', error=True) else: targets.add(uid) print('{} ({}) успешно добавлен в список целей.'.format( methods.names(uid), uid))
def fmain(query): query = ' '.join(query) if query in helplist: f = open('help/' + query) print('+', '-' * 80, '+', sep='') for i in f: print('|{:80}|'.format(i[:-1])) print('+', '-' * 80, '+', sep='') else: myprint('help for', query, 'not found!', error=True)
def fuse(query): global payload query = query[0] if query not in payloadlist: myprint('Нагрузка не найдена!', error=True) return payload = importlib.import_module('payloads.' + query) print('Нагрузка успешно подключена') print(payload.__doc__) fshow()
def print_rez(data, i): if len(data): myprint(i, 'рукопожатие(я):') for ids in data: if varlist['names']: d = [ '{} ({})'.format(methods.names(uid), uid) for uid in ids ] else: d = [str(uid) for uid in ids] myprint(' -> '.join(d))
def start(): from __main__ import myprint, vk_request from target import targets, vectors from vector import vectors as vectors_info import methods def get_friends(uid, target, lvl=1): global finded_friends lfriends = methods.friends(uid) if not lfriends: return False founded_in_this_list = False #если нашли нового друга if target in lfriends and uid not in get_friends.founded: founded_in_this_list = True get_friends.founded.append(uid) myprint('{} ({})'.format(methods.names(uid), uid)) #если в данном списке найдена цель, можно нырнуть на два уровня глубже if lvl <= varlist['depth'] \ or (founded_in_this_list and lvl <= varlist['depth']+2): #если цель была найдена, рассматриваем по максимуму людей из этого списка limit = varlist['max_users'] if founded_in_this_list else varlist[ 'min_users'] for i, friend in enumerate(lfriends): #снижает число зацикливаний if friend not in get_friends.founded: if i >= limit: break rez = get_friends(friend, target, lvl + 1) #если было попадание в подсписке, рассматриваем по максимуму людей из этого списка if rez: limit = varlist['max_users'] return founded_in_this_list for target_id in targets: vector_id, lvl = vectors[target_id] lfriends = methods.friends(target_id) get_friends.founded = [] if lfriends: get_friends.founded = list(lfriends) print('Visible:') for uid in lfriends: myprint('{} ({})'.format(methods.names(uid), uid)) print('\nHidden:') if lfriends and len(lfriends) > 5: for uid in lfriends: get_friends(uid, target_id) else: get_friends(vector_id, target_id)
def my_iter(vector_obj, target_id): if not varlist['links']: #сообщества юзера groups = vk_request(vector_obj, 'groups.get', {'user_id': target_id, 'count': 1000}) if not groups: myprint(' Невозможно получить список групп!', error=True) return for group in groups['items']: yield '-'+(group.replace('-', '')) else: #список ссылок for group in varlist['links']: if group: yield group
def fshow(): if not payload: myprint('Не выбрана нагрузка!', error=True) return if 'varlist' not in payload.__dir__(): print('Нагрузка не содержит переменных!') return kw = max([len(str(i)) for i in payload.varlist.keys()]) vw = max([len(str(i)) for i in payload.varlist.values()]) print('┌', '─' * kw, '┬', '─' * vw, '┐', sep='') for k, v in payload.varlist.items(): print(('│{:' + str(kw) + '}│{:' + str(vw) + '}│{}').format( k, v, payload.descr[k])) print('└', '─' * kw, '┴', '─' * vw, '┘', sep='')
def finfo(query=False): if query: query = query[0] if query not in payloadlist: myprint('Нагрузка не найдена!', error=True) return module = importlib.import_module('payloads.' + query) print('-' * 80) print(module.__doc__) print('-' * 80) else: print('-' * 80) print(payload.__doc__) print('-' * 80) fshow()
def fset(var, *vals): if not payload: myprint('Не выбрана нагрузка!', error=True) return if var not in payload.varlist: myprint('Переменная не найдена!', error=True) return if len(vals) == 1: if vals[0].isdigit(): payload.varlist[var] = int(vals[0]) else: payload.varlist[var] = vals[0] else: payload.varlist[var] = vals print('Переменная', var, 'успешно установлена.')
def names(uid, vk=False): if not vk: try: vk = get_vk(uid) except IndexError: myprint('Прежде всего необходимо добавить векторы!') return '' if int(uid) > 0: rez = vk_request(vk, 'users.get', {'user_ids': uid}) if rez: return rez[0]['first_name']+' '+rez[0]['last_name'] else: return '' else: rez = vk_request(vk, 'groups.getById', {'group_ids': str(uid)[1:]}) if rez: return rez[0]['name'] else: return ''
def start(): from target import targets, vectors from vector import vectors as vectors_info import methods junk = ('http://', 'https://', 'vk.com/', 'group', 'id', '/') if varlist['links']: for i, link in enumerate(varlist['links']): for j in junk: link = link.replace(j, '') if link.replace('-', '').isdigit(): varlist['links'][i] = link else: myprint('Неверный формат:', varlist['links'][i], error=True) varlist['links'][i] = False for target_id in targets: vector_id, lvl = vectors[target_id] vector_obj = vectors_info[vector_id] myprint('{} ({})'.format(methods.names(target_id), target_id)) if lvl == 1: rez = vk_request(vector_obj, 'fave.getPosts', {'count': 100}) if rez: for post in rez['items']: print_post(post) else: for group in my_iter(vector_obj, target_id); print(' Анализ', group) posts = vk_request(vector_obj, 'wall.get', {'owner_id': group, 'count': 100}) if not posts: continue for post in posts['items']: like = vk_request(vector_obj, 'likes.isLiked', { 'user_id': target_id, 'owner_id': -1*int(group), 'item_id': post['id'], 'type': 'post'}) if like and like['liked']: print_post(post)
def fadd(query): global vectors global utokens if not query: print('https://oauth.vk.com/authorize?client_id=' + APP_KEY + \ '&scope=4667422&display=page&v=5.44&response_type=token') else: for token in query: token = token[token.find('access_token=') + 13:] uid = int(token[token.rfind('=') + 1:]) token = token[:token.find('&')] if uid in vectors: myprint('Токен уже есть в списке!', error=True) else: try: vk = API(access_token=token) except Exception as e: myprint(e, error=True) else: utokens.append((token, uid)) name = methods.names(uid, vk) vectors[uid] = vk myprint('Вектор добавлен: {} ({})'.format(name, uid))
def download(name, link): myprint('Download', name + '...') g.setup(log_file=varlist['dir'] + name, timeout=False) g.go(link) g.setup(log_file=False, timeout=14997)
def get_video(name, link): for i in (1, 2, 3): try: g.go(link) except Exception as e: myprint(e, error=True) sleep(i) else: break else: myprint('Не удалось получить видео!', error=True) return if link.startswith('https://vk.com/'): flink = False page = g.response.body.decode('utf-8') vk_rex = r'https\:\/\/[a-z0-9\-]+\.vk[a-z0-9\/\-\.]+\.{}' for i in ('720\.mp4', '480\.mp4', '360\.mp4', 'vk.flv'): try: flink = re.search(vk_rex.format(i), page).group() except Exception as e: myprint(e, error=True) else: break else: myprint('Не удалось найти ссылку для загрузки видео с vk!', error=True) return download(name, flink) elif link.startswith('https://coub.com/'): page = g.response.body.decode('utf-8') try: page = page[page.find('"html5":{"video":'):page. find(',"iphone":{"url"')] page = page[page.find('"url":"') + 7:] video = page[:page.find('"')] page = page[page.find('"audio"'):] page = page[page.find('"url":"') + 7:] audio = page[:page.find('"')] except Exception as e: myprint('Ошибка при парсинге страницы coub!', error=True) myprint(e, error=True) return download(name + '.mp4', video) download(name + '.mp3', audio) elif link.startswith('https://www.youtube.com/'): try: g.go('http://keepvid.com/?url=' + quote(link)) page = g.response.body.decode('utf-8') except Exception as e: myprint('Ошибка при переходе на keepvid.com!', error=True) myprint(e, error=True) return page = page[page.find('id="info"'):] for size in ('720p', '480p', '360p'): if size in page: page = page[:page.find(size)] page = page[page.rfind('http'):] link = page[:page.find('"')] break else: myprint( 'Не удалось найти ссылку для загрузки видео с youtube!', error=True) return download(name, link) else: myprint('Невозможно скачать видео! Неподдерживаемый тип.', error=True) myprint(link)
def start(): from __main__ import myprint, vk_request from target import targets, vectors from vector import vectors as vectors_info import methods from time import sleep import re from grab import Grab g = Grab() def download(name, link): myprint('Download', name + '...') g.setup(log_file=varlist['dir'] + name, timeout=False) g.go(link) g.setup(log_file=False, timeout=14997) def get_photo(attach): size = False for allowed_size in photo_sizes: if 'photo_' + allowed_size in attach: size = allowed_size break if size: download( str(attach['owner_id']) + '_' + str(attach['id']) + '.jpg', attach['photo_' + size]) from urllib.parse import quote def get_video(name, link): for i in (1, 2, 3): try: g.go(link) except Exception as e: myprint(e, error=True) sleep(i) else: break else: myprint('Не удалось получить видео!', error=True) return if link.startswith('https://vk.com/'): flink = False page = g.response.body.decode('utf-8') vk_rex = r'https\:\/\/[a-z0-9\-]+\.vk[a-z0-9\/\-\.]+\.{}' for i in ('720\.mp4', '480\.mp4', '360\.mp4', 'vk.flv'): try: flink = re.search(vk_rex.format(i), page).group() except Exception as e: myprint(e, error=True) else: break else: myprint('Не удалось найти ссылку для загрузки видео с vk!', error=True) return download(name, flink) elif link.startswith('https://coub.com/'): page = g.response.body.decode('utf-8') try: page = page[page.find('"html5":{"video":'):page. find(',"iphone":{"url"')] page = page[page.find('"url":"') + 7:] video = page[:page.find('"')] page = page[page.find('"audio"'):] page = page[page.find('"url":"') + 7:] audio = page[:page.find('"')] except Exception as e: myprint('Ошибка при парсинге страницы coub!', error=True) myprint(e, error=True) return download(name + '.mp4', video) download(name + '.mp3', audio) elif link.startswith('https://www.youtube.com/'): try: g.go('http://keepvid.com/?url=' + quote(link)) page = g.response.body.decode('utf-8') except Exception as e: myprint('Ошибка при переходе на keepvid.com!', error=True) myprint(e, error=True) return page = page[page.find('id="info"'):] for size in ('720p', '480p', '360p'): if size in page: page = page[:page.find(size)] page = page[page.rfind('http'):] link = page[:page.find('"')] break else: myprint( 'Не удалось найти ссылку для загрузки видео с youtube!', error=True) return download(name, link) else: myprint('Невозможно скачать видео! Неподдерживаемый тип.', error=True) myprint(link) from boilerpipe.extract import Extractor def get_link(name, link): try: g.go(link) except Exception as e: myprint('Ошибка при переходе по ссылке!', error=True) myprint(e, error=True) return try: g.response.detect_charset() rez = g.response.body.decode(g.response.charset) except Exception as e: myprint('Ошибка при декодировании страницы!', error=True) myprint(e, error=True) return try: extractor = Extractor(extractor='ArticleExtractor', html=rez) text = extractor.getText() except Exception as e: myprint('Ошибка при извлечении текста!', error=True) myprint(e, error=True) return open(varlist['dir'] + name + '.html', 'w').write(rez) open(varlist['dir'] + name + '.txt', 'w').write(text) photo_sizes = ('1280', '807', '604') if not varlist['links']: myprint('Не заданы ссылки для скачивания', error=True) return if varlist['dir'][-1] != '/': varlist['dir'] = varlist['dir'] + '/' if type(varlist['links']) is str: varlist['links'] = [varlist['links']] links = [] for link in varlist['links']: if '/wall' not in link or '_' not in link: myprint('Неверный формат ссылки:', link, error=True) continue link = link[link.find('wall') + 4:] links.append(link) posts = vk_request(methods.get_vk(), 'wall.getById', {'posts': ','.join(links)}) if posts: #for post in posts['items']: for post in posts: if len(post['text']) > 5: myprint('\n' + (post['text'].replace('\n', '')) + '\n') open( '{}description.{}_{}.txt'.format(varlist['dir'], post['owner_id'], post['id']), 'w').write(post['text']) if 'attachments' not in post: myprint('Нет прикреплений!', error=True) continue for attach in post['attachments']: #if attach['type'] in attach and len(attach.keys()) == 2: attach[attach['type']]['type'] = attach['type'] attach = attach[attach['type']] if attach['type'] == 'photo': get_photo(attach) elif attach['type'] == 'posted_photo': download( str(attach['owner_id']) + '_' + str(attach['id']) + '.jpg', attach['photo_604']) elif attach['type'] == 'video': video = vk_request( methods.get_vk(), 'video.get', { 'videos': str(attach['owner_id']) + '_' + str(attach['id']) }) if video and 'player' in video['items'][0]: get_video(attach['title'], video['items'][0]['player']) else: myprint('Видео', attach['title'], 'недоступно для скачивания...', error=True) elif attach['type'] == 'audio': download( attach['artist'] + ' - ' + attach['title'] + '.mp3', attach['url']) elif attach['type'] == 'doc': download(attach['title'] + '.' + attach['ext'], attach['url']) elif attach['type'] == 'link': myprint('Сохранение', attach['title'] + '...') get_link(attach['title'], attach['url']) elif attach['type'] == 'note': open(varlist['dir'] + attach['title'] + '.txt', 'w').write(attach['text']) elif attach['type'] == 'page': get_link(attach['view_url'], attach['url']) elif attach['type'] == 'album': photos = vk_request(methods.get_vk(), 'photos.get', {'album_id': attach['id']}) if photos: for photo in photos['items']: get_photo(photo) else: myprint('Неподдерживаемый тип:', attach['type'], error=True)
def print_post(post): post['text'] = post['text'].replace('\n', ' ') if len(post['text']) > 78: post['text'] = post['text'][:77]+'…' myprint(' ', post['text']) myprint(' https://vk.com/wall', post['owner_id'],'_', post['id'], sep='')
def start(): from __main__ import myprint, vk_request from target import targets, vectors from vector import vectors as vectors_info import methods from time import gmtime, strftime for target_id in targets: vector_id, lvl = vectors[target_id] vector_obj = vectors_info[vector_id] if lvl == 1: myprint('Цель', target_id, 'не может быть атакована! Необходим вектор I уровня.') else: rez = vk_request(vector_obj, 'messages.search', {'q': varlist['query'], 'count': varlist['count']}) if not rez: myprint('Сообщение не найдено!') else: rez = rez['items'] for info in rez: myprint() myprint('{} ({}):'.format(methods.names(info['user_id']), info['user_id'])) myprint(info['body']) myprint(strftime('[%d.%m.%Y %H:%M]', gmtime(info['date'])))
def get_link(name, link): try: g.go(link) except Exception as e: myprint('Ошибка при переходе по ссылке!', error=True) myprint(e, error=True) return try: g.response.detect_charset() rez = g.response.body.decode(g.response.charset) except Exception as e: myprint('Ошибка при декодировании страницы!', error=True) myprint(e, error=True) return try: extractor = Extractor(extractor='ArticleExtractor', html=rez) text = extractor.getText() except Exception as e: myprint('Ошибка при извлечении текста!', error=True) myprint(e, error=True) return open(varlist['dir'] + name + '.html', 'w').write(rez) open(varlist['dir'] + name + '.txt', 'w').write(text)
def start(): from __main__ import myprint, vk_request from target import targets, vectors from vector import vectors as vectors_info import methods junk = ('http://', 'https://', 'vk.com/', 'group', 'id', '/') if type(varlist['links']) is str: varlist['links'] = varlist['links'].strip() elif type(varlist['links']) is tuple: varlist['links'] = list(varlist['links']) if varlist['links']: if not type(varlist['links']) is list: varlist['links'] = [varlist['links']] for i, link in enumerate(varlist['links']): for j in junk: link = link.replace(j, '') if link.replace('-', '').isdigit(): varlist['links'][i] = link else: myprint('Неверный формат:', varlist['links'][i], error=True) varlist['links'][i] = False groups = False if varlist['links']: groups = varlist['links'] else: #сообщества юзера groups = set() for target_id in targets: vector_id, lvl = vectors[target_id] vector_obj = vectors_info[vector_id] this_groups = vk_request(vector_obj, 'groups.get', { 'user_id': target_id, 'count': 1000 }) if this_groups: this_groups = [ -1 * int(group) for group in this_groups['items'] ] groups.update(set(this_groups)) if not groups: myprint(' Невозможно получить список групп!', error=True) return for group in groups: myprint('\n\n{} ({})'.format(methods.names(group), group)) posts = vk_request(methods.get_vk(), 'wall.get', { 'owner_id': group, 'count': 100 }) if not posts: continue for post in posts['items']: if post['from_id'] in targets: if len(post['text']) > 78: post['text'] = post['text'][:77] + '…' myprint('\n {} ({})'.format(methods.names(post['from_id']), post['from_id'])) myprint(' ', post['text']) myprint(' https://vk.com/wall-', group, '_', post['id'], sep='') comments = vk_request(methods.get_vk(), 'wall.getComments', { 'owner_id': group, 'post_id': post['id'], 'count': 100 }) if not comments: continue for comment in comments['items']: if comment['from_id'] in targets: if len(comment['text']) > 78: comment['text'] = comment['text'][:77] + '…' myprint('\n {} ({})'.format( methods.names(comment['from_id']), comment['from_id'])) myprint(' ', comment['text']) myprint(' https://vk.com/wall', group, '_', post['id'], '?reply=', comment['id'], sep='')