vk_api python , 2fa создание ответа что бы подделаться под приложение Android
товарищи, требуется помощь с созданием запроса для двухфакторной аутентификации, в ответ на авторизацию приходит такой ответ:
{'error': 'need_validation', 'error_description': 'open redirect_uri in browser [5]. Also you can use 2fa_supported param', 'validation_type': '2fa_app', 'validation_sid': '2fa_...', 'phone_mask': '+7 *** *** ** **', 'redirect_uri': 'https://m.vk.com/login?act=authcheck&api_hash=...}
при получении данных с ссылки приходит страница с полем для ввода кода, часть страницы, которая приходит и (как я понял отвечает за ввод кода):
<h3 class="slim_header">Проверка безопасности</h3>
<div class="form_item">
<div class="fi_row">Пожалуйста, введите <b>код</b> из личного сообщения от Администрации или из приложения для генерации кодов, чтобы подтвердить, что вы владелец страницы.</div>
<form method="post" action="/login?act=authcheck_code&hash=1631990925_f80ca8734d14ad7645" novalidate>
<dl class="fi_row">
<dt class="fi_label">Код подтверждения:</dt>
<dd>
<div class="iwrap"><input type="tel" name="code" class="textfield" autocomplete="one-time-code" autocorrect="off" autocapitalize="off" /></div>
<div class="fi_subrow"> <label class="option_row " onclick="">
<input type="checkbox" class="checkbox" name="remember" value="1" checked="checked" />
<span class="option_label" >Запомнить браузер</label>
</label></div>
</dd>
</dl>
если сделать всё вручную на странице, то перенаправляет на ссылку с токеном и секретом, но через программу у меня так и не получилось получить заветные токен и секрет, т.к при любом сделанном мной запросе отправляет обратно на эту же страницу, но с другим хэшем , пример с моим говно-кодом и(как мне кажется, просто неверным запросом), делал как это реализовано в самом vk_api:
code = input('Put your 2fa code here: ')
savesession = 1
auth_hash = ''
print(auth_hash)
values = {
'al': '1',
'code': code,
'hash': auth_hash,
'remember': int(savesession),
}
response = session.post(
url,
values
)
input(response.text)
data = json.loads(response.text.lstrip('<!--'))
status = data['payload'][0]
if status == '4': # OK
path = json.loads(data['payload'][1][0])
return token,secret
Ответы (1 шт):
Не самым простым , но так называемым решением 'В лоб' оказалось применение selenium и работа со страницами, если кто-то таки найдёт более изящное решение, просим. пример рабочей программы:
- проверяем ответ, если пришёл такой, как мне:
if answer['error'] == 'need_validation':
print('Вк собака отправляет на двухфакторку погодь чутка, прожка старается не отвалится')
response = this.session.get(answer['redirect_uri'])
this.token , this.secret = fa_handler(answer['redirect_uri'])
- Сама функция обработки:
def fa_handler(url):
option = webdriver.FirefoxOptions()
#Почему headless = False , спросите вы, дело в том, что может ещё отправить на капчу и как вернуть видимость если такое произошло я способа не нашёл
option.headless = False
browser = webdriver.Firefox(options = option)
browser.get(url)
codexpath = '/html/body/div[2]/div[2]/div[2]/div/div[3]/div/div[2]/div/form/dl/dd/div[1]/input'
buttonxpath = '/html/body/div[2]/div[2]/div[2]/div/div[3]/div/div[2]/div/form/div[1]/input'
code = str(input('2fa code here: '))
browser.find_element_by_xpath(codexpath).send_keys(code)
browser.find_element_by_xpath(buttonxpath).click()
link = browser.current_url
if link.find('access_token=') != -1:
token = link[link.find('access_token=')+len('access_token='):link.find('&user_id=')]
secret = link[link.find('&secret=')+len('&secret='):]
else:
print('Аахахаха вводи капчу, stupid robot')
link = captcha_handler(browser)
token = link[link.find('access_token=')+len('access_token='):link.find('&user_id=')]
secret = link[link.find('&secret=')+len('&secret='):]
return token , secret
- Обработка капчи, потом можно будет просто в приложение выгружать картинку капчи или автоматизировать это:
def captcha_handler(browser):
print('Это тестовая функция - работай ручками')
codexpath = '/html/body/div[2]/div[2]/div[2]/div/div[3]/div/div/div/div/div/form/div[2]/div/input'
buttonxpath = '/html/body/div[2]/div[2]/div[2]/div/div[3]/div/div/div/div/div/form/div[3]/input'
# xpath на картинку капчи /html/body/div[2]/div[2]/div[2]/div/div[3]/div/div/div/div/div/form/div[1]/img
code = str(input('captcha code here: '))
browser.find_element_by_xpath(codexpath).send_keys(code)
browser.find_element_by_xpath(buttonxpath).click()
link = browser.current_url
input(link)
return link