Содержание
Авторизация в VK для людей / Хабр
Что случилось?
Здравствуй, дорогой читатель. Если тебе хотя бы однажды доводилось работать с API Вконтакте и при этом писать все на python
, вероятно, авторизация приложения заставила тебя сделать несколько приседаний, после которых ног либо не чувствуешь и падаешь в обморок, либо вкачиваешь квадрицепс и все же пробиваешь API, как Ван Дамм.
По какой-то причине этот, казалось бы, самый непримечательный этап поначалу отнимает огромное количество сил и времени. Моя задача: помочь читателям Хабра избежать травм ног.
Далее я предлагаю рассмотреть небольшую библиотеку, позволяющую в одну строчку авторизовать свое приложение для конкретного пользователя и получить access_token
. В конце статьи представлена ссылка на github-репозиторий этой библиотеки с quickstart’ом в README
-файле.
Задача
Хотим небольшой модуль, который позволяет провести авторизацию красиво, универсально и максимально надежно, а использовать который очень просто.
Стоит сказать, что данное решение является усовершенствованием и обобщением варианта, предложенного в этой статье.
Итак, используем python3.5
, библиотеку для html запросов requests и getpass
для скрытого ввода пароля.
Наша задача: несколько раз обратиться по верному адресу, каждый раз парсить <form>
, отправлять ответ и наконец получить желанный access_token
.
Реализация
Начнем с создания класса. При инициализации будем требовать список «разрешений», к которым приложение хочет получить доступ, id этого приложения и версию API VK. Плюсом добавим несколько необязательных параметров, значение каждого из которых прояснится далее.
Метод __init__
class VKAuth(object): def __init__(self, permissions, app_id, api_v, email=None, pswd=None, two_factor_auth=False, security_code=None, auto_access=True): """ Args: permissions: list of Strings with permissions to get from API app_id: (String) vk app id that one can get from vk. com api_v: (String) vk API version """ self.session = requests.Session() self.form_parser = FormParser() self.user_id = None self.access_token = None self.response = None self.permissions = permissions self.api_v = api_v self.app_id = app_id self.two_factor_auth= two_factor_auth self.security_code = security_code self.email = email self.pswd = pswd self.auto_access = auto_access if security_code != None and two_factor_auth == False: raise RuntimeError('Security code provided for non-two-factor authorization')
Как было сказано в уже упомянутой статье, нам необходимо искусно ворочать cookie и redirect’ы. Все это за нас делает библиотека requests
с объектом класса Session. Заведем и себе такой в поле self.session
. Для парсинга html документа используется стандартный класс HTMLParser
из модуля html. parser
. Для парсера тоже написан класс (FormParser
), разбирать который большого смысла нет, так как он почти полностью повторяет таковой из упомянутой статьи. Существенное отличие лишь в том, что использованный здесь позволяет изящно отклонить авторизацию приложения на последнем шаге, если вы вдруг передумали.
Поля user_id
и access_token
будут заполнены после успешной авторизации, response
хранит в себе результат последнего html запроса.
Пользователю библиотеки предоставим один-единственный метод – authorize
, который совершает 3 шага:
- запрос на авторизацию приложения
- авторизация пользователя
2.1 введение кода-ключа в случае двух-факторной авторизации - подтверждение разрешения на использование
permissions
Пройдемся по каждому шагу.
Шаг 1. Запрос на авторизацию приложения
Аккуратно составляем url запроса (про параметры можно прочитать здесь), отправляем запрос и парсим полученный html.
Метод authorize для Шага 1
def authorize(self): api_auth_url = 'https://oauth.vk.com/authorize' app_id = self.app_id permissions = self.permissions redirect_uri = 'https://oauth.vk.com/blank.html' display = 'wap' api_version = self.api_v auth_url_template = '{0}?client_id={1}&scope={2}&redirect_uri={3}&display={4}&v={5}&response_type=token' auth_url = auth_url_template.format(api_auth_url, app_id, ','.join(permissions), redirect_uri, display, api_version) self.response = self.session.get(auth_url) # look for <form> element in response html and parse it if not self._parse_form(): raise RuntimeError('No <form> element found. Please, check url address')
Шаг 2. Авторизация пользователя
Реализованы методы _log_in()
и _two_fact_auth()
для [не]успешной авторизации пользователя в вк, если он не авторизован (а он точно не авторизован). Оба метода используют ранее определенные поля email
, pswd
, two_factor_auth
и security_code
. Если какое-то из полей не было подано аргументом при инициализации объекта класса VKAuth
, их попросят ввести в консоли, а случае неудачи попросят ввести заново. Двух-факторная авторизация опциональна и по умолчанию отключена, и наш модуль уведомляет пользователя о ее присутствии ошибкой.
Метод authorize для Шага 2 (продолжение Шага 1)
#look for <form> element in response html and parse it if not self._parse_form(): raise RuntimeError('No <form> element found. Please, check url address') else: # try to log in with email and password (stored or expected to be entered) while not self._log_in(): pass; # handling two-factor authentication # expecting a security code to enter here if self. two_factor_auth: self._two_fact_auth()
Метод _log_in для Шага 2
def _log_in(self): if self.email == None: self.email = '' while self.email.strip() == '': self.email = input('Enter an email to log in: ') if self.pswd == None: self.pswd = '' while self.pswd.strip() == '': self.pswd = getpass.getpass('Enter the password: ') self._submit_form({'email': self.email, 'pass': self.pswd}) if not self._parse_form(): raise RuntimeError('No <form> element found. Please, check url address') # if wrong email or password if 'pass' in self.form_parser.params: print('Wrong email or password') self.email = None self.pswd = None return False elif 'code' in self.form_parser.params and not self.two_factor_auth: raise RuntimeError('Two-factor authentication expected from VK. \nChange `two_factor_auth` to `True` and provide a security code.') else: return True
Метод _two_fact_auth для Шага 2
def _two_fact_auth(self): prefix = 'https://m.vk.com' if prefix not in self.form_parser.url: self.form_parser.url = prefix + self.form_parser.url if self.security_code == None: self.security_code = input('Enter security code for two-factor authentication: ') self._submit_form({'code': self.security_code}) if not self._parse_form(): raise RuntimeError('No <form> element found. Please, check url address')
Шаг 3. Подтверждение
permissions
и получение access_token
Самое сложное позади. Теперь дело за малым. Используем наше усовершенствование парсера формы, чтоб найти в только что поступившем к нам html документе кнопку с надписью «Allow» и вытащить из нее url подтверждения авторизации. Рядом находится кнопка с отказом – сохраним и ее url. Поле auto_access
по умолчанию находится в состоянии True
, так что это подтверждение ни чуть не должно осложнить нам жизнь.
Наконец, сохраним полученные access_token
и user_id
из url, который был передан после подтверждения авторизации.
Теперь можно весело пользоваться VK API.
http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492
Метод authorize для Шага 3
# allow vk to use this app and access self.permissions self._allow_access() # now get access_token and user_id self._get_params()
Метод _allow_access для Шага 3
def _allow_access(self): parser = self.form_parser if 'submit_allow_access' in parser.params and 'grant_access' in parser. url: if not self.auto_access: answer = '' msg = 'Application needs access to the following details in your profile:\n' + \ str(self.permissions) + '\n' + \ 'Allow it to use them? (yes or no)' attempts = 5 while answer not in ['yes', 'no'] and attempts > 0: answer = input(msg).lower().strip() attempts-=1 if answer == 'no' or attempts == 0: self.form_parser.url = self.form_parser.denial_url print('Access denied') self._submit_form({})
Метод _get_params для Шага 3
def _get_params(self): try: params = self.response.url.split('#')[1].split('&') self.access_token = params[0].split('=')[1] self.user_id = params[2].split('=')[1] except IndexError(e): print(e) print('Coudln\'t fetch token')
github: VKAuth
Оставляйте комментарии и отзывы здесь и на github. Удачи на полях сражений, и берегите ноги.
С помощью аккаунта в социальной сети «ВКонтакте» можно авторизоваться на hh.ru без регистрации и ввода пароля. Для этого достаточно нажать на логотип данной соцсети при входе на сайт. Шаг 1. Выберите нужный способ авторизации:
Шаг 2. В открывшемся окне выполните одно из двух действий: — введите логин и пароль к вашему профилю во «ВКонтакте», если вы в данный момент не залогинены в этой соцсети; — либо разрешите приложению доступ к вашей информации, если вы уже залогинены во «ВКонтакте». Обратите внимание! Вы не сообщаете сайту hh.ru свой логин и пароль от аккаунта во «ВКонтакте». Авторизация происходит при помощи протокола OAuth. Этот способ авторизации совершенно безопасен для данных вашего профиля в соцсети (см. «Вопросы и ответы»).
Шаг 3. Для завершения авторизации введите адрес вашей электронной почты (как отмечалось выше, HeadHunter не получает ваш пароль и логин во «ВКонтакте» — поэтому почту нужно ввести еще раз).
Шаг 4а. Если на hh.ru уже существует учетная запись с подобным адресом, то вы получите об этом уведомление. Введите пароль к своему кабинету на hh.ru, чтобы связать эти две учетные записи и в дальнейшем без проблем авторизовываться с помощью аккаунта во «ВКонтакте». Вы авторизованы! И ваша учетная запись синхронизирована с учетной записью «ВКонтакте». Теперь вы будете входить на hh.ru нажатием одной кнопки «Войти через ВКонтакте».
Шаг 4б. Если у вас раньше не было регистрации на hh.ru, то при заходе через «ВКонтакте» у вас есть возможность импортировать данные о своем образовании, дате рождения и городе прямо из профиля. Теперь вы не только авторизованы на hh. ru, но у вас даже есть заготовка под резюме: все основные пункты уже заполнены!
Полностью безопасно! Вы вводите свои авторизационные данные на сайте vk.com. HeadHunter не имеет к ним доступа. Аккаунт используется только для входа на сайт. Никакие данные о вашей деятельности на сайте hh.ru или данные из ваших резюме не будут отражаться на вашем профиле. Нет, не будет. Сайт позволит лишь синхронизировать учетные записи и импортировать деловую информацию: образование, дату рождения, пол, место проживания. Если же вы хотите, чтобы работодатель мог посмотреть ваш профиль во «ВКонтакте», нужно специально оставить ссылку на него в контактных данных на сайте hh.ru. Во-первых, благодаря авторизации через «ВКонтакте», вам не нужно каждый раз вспоминать пароль к hh.ru. Во-вторых, авторизация через «ВКонтакте» гораздо быстрее: достаточно один раз подтвердить подлинность своей учетной записи в соцсети и отметить галочкой поле «запомнить меня на этом компьютере» — теперь вы сможете всегда авторизовываться на hh. ru в один клик. В-третьих, для новых пользователей это отличая экономия времени при создании резюме: при синхронизации аккаунтов импортируются деловые данные из учетной записи «ВКонтакте»: образование, дата рождения, пол, место проживания. После импорта резюме уже практически готово к публикации: молодым специалистам останется ввести только телефон, а опытным специалистам и менеджерам нужно будет добавить желаемую должность и опыт работы. HeadHunter неизвестен ваш пароль от социальной сети. Если вы забыли этот пароль, попробуйте восстановить его на сайте vk.com. Сейчас это можно сделать, обратившись в службу технической поддержки. А в скором времени вы сможете сделать это самостоятельно в настройках. С помощью аккаунта соцсети может авторизоваться только соискатель. Для работодателей такой возможности в ближайшее время не предусматривается. Мы планируем сделать возможность авторизации и через другие популярные соцсети. На всех, кроме rabota.by. |
|
Android официальный клиент ВКонтакте. Как авторизоваться
спросил
Изменено
2 года, 1 месяц назад
Просмотрено
1к раз
У меня на устройстве установлено официальное приложение от ВКонтакте.
И авторизировался там.
Я пытаюсь написать свое приложение, которое использует API ВКонтакте, но мне нужна авторизация.
Есть ли способ получить авторизованный статус пользователя из официального приложения с отправкой Intent с каким-либо действием?
- андроид
- андроид-намерение
- вк
2
Теперь это возможно!
Пожалуйста, просмотрите этот учебник
http://vk. com/dev/android_sdk
Также можно авторизоваться через webview
Авторизация в Вконтакте — это OAuth-авторизация. Таким образом, следующие шаги одинаковы для всех сервисов, использующих OAuth: Facebook, Instagram и т. д.
- Создать заявку на vk.com:
http://vk.com/editapp?act=create - Получить его ID.
- В вашей учетной записи откройте веб-просмотр с URL-адресом входа
https://oauth.vk.com/authorize?client_id=APP_ID&scope=SETTINGS&redirect_uri=REDIRECT_URI&display=DISPLAY&response_type=token
APP_ID — это идентификатор вашего приложения. Вы найдете его в ВКонтакте -> Приложения -> Настройки -> Приложения, которыми я управляю (внизу) -> Управление
Этот URL для входа покажет стандартный диалог авторизации ВКонтакте. Там пользователь введет свой логин и пароль.
После этого пользователь будет перенаправлен на ваш Redirect-Uri. Итак, вам нужно подготовить Redirect_Uri — это страница, которая будет открыта после успешного входа в систему.
К этому URL будет присоединен access_token. Access_token — единственный параметр, который необходимо сохранить после авторизации. В следующих запросах вам просто нужно будет предоставить access_token.
О других параметрах вы можете прочитать на сайте ВКонтакте:
http://vk.com/developers.php?oid=-17680044&p=Authorizing_Client_Applications
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
python 2.
7 — Ошибка API авторизации ВК: u'{«error»:»invalid_request»,»error_description»:»Ошибка безопасности»}’
Пытаюсь авторизоваться из своего djano-приложения на vk.com. Я использую запросы и авторизацию клиента. Пытаюсь авторизоваться таким способом и получаю ошибку:
{"ошибка":"invalid_request","error_description":"Ошибка безопасности"}
Интернет предлагает перелогиниться в ВК в браузере, но решения для авторизации по коду нет.
Мой код:
класс VkApiSingleton(объект):
версия_api = '5.95'
def __init__(я,
app_id=config.APP_ID,
логин=config.ACCOUNT_LOGIN,
pswd=config.ACCOUNT_PASSWORD,
разрешения = 'видео, офлайн, группы'
):
# type: (int, str, str, str) -> Нет
self.app_id = app_id
self.app_user_login = логин
self.app_user_pass = пароль
self.access_token = Нет
self.user_id = Нет
self.session = запросы. Session()
self.form_parser = FormParser()
self.permissions = разрешения
def __new__(cls, *args, **kwargs):
если не hasattr(cls, 'экземпляр'):
cls.instance = super(VkApiSingleton, cls).__new__(cls, *args, **kwargs)
вернуть cls.instance
@свойство
защита get_session (я):
вернуть self.session
def _parse_form (я, ответ):
# тип: (requests.models.Response) -> Нет
self.form_parser = FormParser()
пытаться:
self.form_parser.feed (ул (ответ. содержание))
кроме исключения как ошибки:
регистратор.исключение(
'Ошибка проверки HTML-формы',
extra={'Тело ошибки': str(err)}
)
def _submit_form(я, **kwargs):
# type: (dict) -> request.models.Response
если self.form_parser.method == 'опубликовать':
полезная нагрузка = copy.deepcopy(self.form_parser.params)
если kwargs.get('is_login', False):
полезная нагрузка. обновление({
'электронная почта': self.app_user_login,
«пройти»: self.app_user_pass
})
с self.get_session в качестве сеанса:
пытаться:
вернуть session.post (self.form_parser.url, данные = полезная нагрузка)
кроме исключения как ошибки:
регистратор.исключение(
'Ошибка отправки формы авторизации',
extra={'Тело ошибки': str(err)}
)
поднять VkApiError('Ошибка отправки формы авторизации: %s' % str(err))
защита _log_in(я):
# тип: () -> запросы.модели.Ответ
ответ = self._submit_form(is_login=True)
self._parse_form(ответ)
если response.status_code != 200:
поднять VkApiError('Ошибка аутентификации: невозможно проанализировать HTML-форму')
если «пройти» в response.text:
регистратор.ошибка(
'Не верный логин или пароль'
)
поднять VkApiError('Неверный логин или пароль')
вернуть ответ
def _submit_permissions(self, url=None):
# тип: () -> запросы. модели.Ответ
если «submit_allow_access» в self.form_parser.params и «grant_access» в self.form_parser.url:
вернуть self._submit_form(token_url=url)
еще:
логгер.предупреждение(
«Не удается отправить разрешения для приложения»
)
def _get_token (я, ответ):
# тип: (requests.models.Response) -> Нет
пытаться:
params = response.url.split('#')[1].split('&')
self.access_token = параметры [0].split('=')[1]
self.user_id = params[2].split('=')[1]
кроме IndexError как ошибка:
регистратор.ошибка(
'Не могу получить access_token',
extra={'Тело ошибки': str(err)}
)
деф авторизация(я):
auth_url = 'https://oauth.vk.com/authorize?revoke=1'
redirect_uri = 'https://oauth.vk.com/blank.html'
дисплей = 'wap'
request_params = {
'client_id': self.app_id,
'область': self.