Beispiel #1
0
def fdelete(query):
	for uid in query:
		if uid not in targets:
			myprint(uid, 'отсутствует в списке целей!', error=True)
		else:
			targets.remove(uid)
			print(uid, 'успешно удален из списка целей.')
Beispiel #2
0
    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
Beispiel #3
0
def fdelete(query):
    global vectors
    for uid in query:
        if uid in vectors:
            vectors.pop(uid)
            print(uid, 'успешно удален из списка векторов.')
        else:
            myprint('Вектор не найден!', error=True)
Beispiel #4
0
def fstart():
    if not payload:
        myprint('Не выбрана нагрузка!', error=True)
        return
    try:
        payload.start()
    except KeyboardInterrupt:
        myprint('Payload has stoped!', error=True)
Beispiel #5
0
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))
Beispiel #6
0
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))
Beispiel #7
0
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)
Beispiel #8
0
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))
Beispiel #10
0
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)
Beispiel #11
0
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
Beispiel #12
0
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='')
Beispiel #13
0
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()
Beispiel #14
0
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, 'успешно установлена.')
Beispiel #15
0
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 ''
Beispiel #16
0
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)
Beispiel #17
0
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))
Beispiel #18
0
 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)
Beispiel #19
0
    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)
Beispiel #20
0
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)
Beispiel #21
0
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='')
Beispiel #22
0
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'])))
Beispiel #23
0
 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)
Beispiel #24
0
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='')