Как все начиналось...


2 февраля я наткнулся на интересную статью: закрытие api для сообщений. Первая моя мысль была: «блин, как теперь взламывать людей-то а?». Но потом я призадумался: наверное мой бот на лонгполе перестанет работать, и вообще, не круто это…

Но 15-го февраля api всё еще работал, и я подумал, что вк опять наобещало и не выполнило (например как его переход в публичную компанию).

Но 20-го февраля при получения токена через библиотеку vk_api на python стала выскакивать ошибка, что приложение не имеет доступа к сообщениям.

И тут я задумался…

Вырубать моих чат-ботов на лонгполе очень не хотелось и я стал искать обходные пути.

Как быть?


Самый простой способ — подчиниться, и отключить бота, но я же тот еще хацкер)

Во-первых, оказалось, что токены полученные ДО закрытия api еще имеют доступ к сообщениям.

Во-вторых, использовать апи отсюда: то есть авторизовываться вк с куки и посылать post-запросы сюда примерно с такими параметрами:

Параметры
act: a_run_method
al: 1
hash: хеш, полученный из страницы
method: messages.getConversations
param_count: 20
param_extended: 0
param_filter: all
param_offset: 0
param_v: 5.92


Код получения сообщений на python:

Код
import requests,lxml.html,re,json
class invalid_password(Exception):
    def __init__(self, value):self.value = value
    def __str__(self):return repr(self.value)
class not_valid_method(Exception):
    def __init__(self, value):self.value = value
    def __str__(self):return repr(self.value)

class messages(object):
    def __init__(this,login,password):
        this.login = login
        this.password = password
        this.hashes = {}
        this.auth()
    def auth(this):
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language':'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
            'Accept-Encoding':'gzip, deflate',
            'Connection':'keep-alive',
            'DNT':'1'}
        this.session = requests.session()
        data = this.session.get('https://vk.com/', headers=headers)
        page = lxml.html.fromstring(data.content)
        form = page.forms[0]
        form.fields['email'] = this.login
        form.fields['pass'] = this.password
        response = this.session.post(form.action, data=form.form_values())
        if "onLoginDone" not in response.text: raise invalid_password("Неправильный пароль!")
        return
    def method(this,method,v=5.87,**params):
        if method not in this.hashes:
            this._get_hash(method)
        data = {'act': 'a_run_method','al': 1,
                'hash': this.hashes[method],
                'method': method,
                'param_v':v}
        for i in params:
            data["param_"+i] = params[i]
        answer = this.session.post('https://vk.com/dev',data=data)
        return json.loads(re.findall("<!>(\{.+)",answer.text)[-1])
    def _get_hash(this,method):
        html = this.session.get('https://vk.com/dev/'+method)
        hash_0 = re.findall('onclick="Dev.methodRun\(\'(.+?)\', this\);',html.text)
        if len(hash_0)==0:
            raise not_valid_method("method is not valid")
        this.hashes[method] = hash_0[0]


Пример использования:

a = messages('login','password')
messages_user = a.method("messages.getConversations",count=1)

P.S. Кому интересно, вот мои боты:

1) бот для скачивания музыки из ВК
2) бот определяющий id любого стикера ВК

P.P.S. Автор этой статьи не несет никакой ответственности за весь написанный текст выше: статья выше создана ТОЛЬКО с позновательными целями.

Комментарии (8)


  1. nanshakov
    31.03.2019 21:37

    А нельзя просто получить токен на is официального приложения и все ?


    1. nanshakov
      31.03.2019 21:37

      id


      1. ffs
        01.04.2019 12:30

        На всякий случай, в течение 30 минут доступно редактирование сообщения.


  1. CHolfield
    31.03.2019 22:27

    Из глубины гиппокампа медленно появилось слово «scriptkiddy», потом «да не, poc же вон самописный»


  1. Taraflex
    31.03.2019 22:49

    Под nodejs есть такая штука github.com/negezor/vk-io
    Умеет притворятся оф. приложениями для доступа практически к любому api
    github.com/negezor/vk-io/blob/master/docs/ru/api-reference/auth.md#android


  1. KanuTaH
    01.04.2019 00:39

    Там же вроде для сообществ эти методы не закрыты, с ключом сообщества все по-прежнему работает. Не проще перенести бота в группу, и не городить огород?


    1. SuperHackerVk Автор
      01.04.2019 13:10

      у сообществ меньше привилегий — например они не могут приглашать пользователей в чат, и др. Конечно можно, но это надо очень много кода переписывать — а зачем?


  1. Soniclev
    02.04.2019 00:52

    Если пользователь поменял пароль, то все access_token-ы, полученные ранее, перестают работать. Доступ к сообщениям можно получить, мимикрируя под официальное приложение.