Как авторизоваться в вк через python
Перейти к содержимому

Как авторизоваться в вк через python

  • автор:

Авторизация вк

В ответе получаю код данной html страницы, в которой видно, что авторизация не прошла, выяснилось, что в данные запроса нужно еще отправлять ip_h, ip_a, которые меняются при каждой сессии (как я понял).

ip_h и ip_a можно достать из html кода страницы vk.com

Собственно проблема в том, что я не знаю, как извлечь данные из этого html кода и подставить их в данные запроса на login.vk.com, а, возможно, это делается совсем иначе, прощу помощи.
(VK Api не использую, тк нужно авторизоваться через вк на другом сайте)

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Авторизация и сессии. Помогите подправить код. Что бы авторизация проводилась один раз.
Помогите подправить код. Что бы авторизация проводилась один раз, записывалась в сессию каждый раз.

Авторизация
Здравствуйте. Мне нужна помощь. Вот уже неделю такая ситуация происходит. Я каждый день.

Авторизация в vk
Доброго времени суток участникам форума. Кому не сложно может подсказать код на С# для авторизации.

Авторизация
Необходимо сделать авторизацию при входе в программу. Я её сделал но при авторизации например Васи.

Авторизация
<?php $login = $_POST; $password = $_POST; if (isset($_POST))

Эксперт Python

1354 / 651 / 207
Регистрация: 23.03.2014
Сообщений: 3,057

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import vk_api import random from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType # из лонг пулла импортируем нужные нам библиотеки. token = "ваш токен" vk = vk_api.VkApi(token=token) # авторизация vk._auth_token() # в вк longpoll = VkBotLongPoll(vk, 'ваш айди группы') # подключение longpoll print("Бот запущен") # Пишем в консоль чтобы понять запущен ли бот. while True: # бесконечный цикл for event in longpoll.listen(): # прослушиваем все сообщения # Если пришло новое сообщение if event.type == VkBotEventType.MESSAGE_NEW: # преобразуем текст сообщения в переменную mess = event.obj['text'] peer_id = event.obj['peer_id'] if mess == "Привет!": # если текст сообщения = Привет!, отправляем сообщение. vk.method("messages.send", { "peer_id": peer_id, "message": "Прииивееетт!!", "random_id": random.randint(1, 2147483647)}) # в строке выше из вк апи мы получаем метод отправки сообщения, а после указываем все нужные данные, такие как айди чата (лс/беседа), содержание отправленного ботом сообщения и рандомное айди для сообщения (а вообще я хз что это, никогда не обращал внимания). # Вообщем-то все. Бот готов

Авторизация в VK для людей

Здравствуй, дорогой читатель. Если тебе хотя бы однажды доводилось работать с API Вконтакте и при этом писать все на python , вероятно, авторизация приложения заставила тебя сделать несколько приседаний, после которых ног либо не чувствуешь и падаешь в обморок, либо вкачиваешь квадрицепс и все же пробиваешь API, как Ван Дамм.

По какой-то причине этот, казалось бы, самый непримечательный этап поначалу отнимает огромное количество сил и времени. Моя задача: помочь читателям Хабра избежать травм ног.

Далее я предлагаю рассмотреть небольшую библиотеку, позволяющую в одну строчку авторизовать свое приложение для конкретного пользователя и получить access_token . В конце статьи представлена ссылка на github-репозиторий этой библиотеки с quickstart’ом в README -файле.

Задача

Хотим небольшой модуль, который позволяет провести авторизацию красиво, универсально и максимально надежно, а использовать который очень просто.
Стоит сказать, что данное решение является усовершенствованием и обобщением варианта, предложенного в этой статье.

Итак, используем python3.5 , библиотеку для html запросов requests и getpass для скрытого ввода пароля.

Наша задача: несколько раз обратиться по верному адресу, каждый раз парсить , отправлять ответ и наконец получить желанный 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 шага:

  1. запрос на авторизацию приложения
  2. авторизация пользователя
    2.1 введение кода-ключа в случае двух-факторной авторизации
  3. подтверждение разрешения на использование 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 = '?client_id=&scope=&redirect_uri=&display=&v=&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 element in response html and parse it if not self._parse_form(): raise RuntimeError('No 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 element in response html and parse it if not self._parse_form(): raise RuntimeError('No 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() if not self._parse_form(): raise RuntimeError('No 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() if not self._parse_form(): raise RuntimeError('No element found. Please, check url address')

Шаг 3. Подтверждение permissions и получение access_token

Самое сложное позади. Теперь дело за малым. Используем наше усовершенствование парсера формы, чтоб найти в только что поступившем к нам html документе кнопку с надписью «Allow» и вытащить из нее url подтверждения авторизации. Рядом находится кнопка с отказом – сохраним и ее url. Поле auto_access по умолчанию находится в состоянии True , так что это подтверждение ни чуть не должно осложнить нам жизнь.

Наконец, сохраним полученные access_token и user_id из url, который был передан после подтверждения авторизации.

Теперь можно весело пользоваться VK API.

Метод 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. Удачи на полях сражений, и берегите ноги.

Python. VK. Авторизация

Пытаюсь авторизоваться ВК как пользователь (не как сообщество). Пробовал с помощью библиотеки vk_api:

vk_session = vk_api.VkApi(login, password) vk_session.auth() 

выдаёт ошибку: vk_api.exceptions.AuthError: Unknown error. Please send bugreport to [email protected] Хотя раньше работало. Вроде как этот метод авторизации устарел. Дальше пробовал авторизоваться с помощью requests — не работало и спомощью библиотеки VK — тоже не получилось. Может кто знает актуальный способ авторизации ВК?

H Работа с VK API на Python 3.x в черновиках Из песочницы

В последнее время мне часто приходится сталкиваться с API Вконтакте, благо для работы с ней есть замечательная библиотека, доступная для установки через PyPl с наименованием там vk. Но у неё есть один относительный недостаток: она не может получить за вас токен доступа к api (acess_token), без этого токена (набор символов, который Вконтакте выдает пользователю, если разрешает приложению доступ к его странице) работать с API нельзя. Проблемы, связанные с VK API, авторизацией и получением прав на python 3.x, а также небольшая инструкция и мини-FAQ по работе с VK API вы найдёте ниже.

Про токен

Получить токен можно разными путями, наиболее удобный и практичный описан в публикации «Пишем модуль для авторизации в VK API», но и он несовершенен, так как его можно использовать для Python 2.x, а мы люди прогрессивные и хотим 3.x, не так ли? Не буду томить, вот мой порт этого модуля под Python 3.x (никакие сторонние модули не нужны):

  • это закинуть по пути python/Lib/site-packages/;
  • а это исходник, если кому-то нужно;
import vk,vk_auth_port_by_bulates1 vkapi = vk.API(app_id,login,password) vkapi.access_token=vk_auth_port_by_bulates1.auth(login,password,app_id,'wall') vkapi.wall.post(message="Test from python 3.4") 
  1. Login — ваш логин вконтакте, строка, например, e-mail или телефон;
  2. Password — ваш пароль от вконтакте, строка, например, ‘qwerty123’;
  3. App_id — идентификатор вашего приложения, как получить — читаем дальше;
  4. «wall» — запрос на управления стенкой VK, дальше объясню более подробно.
Про идентификатор приложения (app_id)

Получается он очень просто, заходите сюда и создаёте собственное Standalone приложение, название значения не имеет. Далее жмёте редактировать приложение, заходите во вкладку настройки и видите строку ID приложения. То, что напротив неё, и есть app_id, посылаем его в виде строки.

Про права

Необходимые нам права указаны в официальной документации VK здесь. Выбираете нужный метод и там сверху написано жирным шрифтом, какие права нужно иметь, выписываем все необходимые нам права и посылаем их в виде строки с разделителем ‘+’, например, ‘wall+friends+groups’.

Про использование методов API

Теперь наконец-то приступим к написанию первого самостоятельного приложения.
Для начала предлагаю написать простенький скрипт для скачивания фото на компьютер с использованием API.

import vk,vk_auth_port_by_bulates1,urllib.request vkapi = vk.API(app_id,login,password) vkapi.access_token=vk_auth_port_by_bulates1.auth(login,password,app_id,'photos') albums=[x['id'] for x in vkapi.photos.getAlbums(owner_id=yid)['items']] for album in albums: photos=vkapi.photos.get(owner_id=yid,album_id=album)['items'] for photo in photos: link=photo[sorted([x for x in photo.keys() if 'photo' in x],key=lambda x: int(x.split('_')[1]))[-1]] urllib.request.urlretrieve(link,link.split('/')[-1]) 
  1. Импорт необходимых модулей, urllib — для скачивания файлов;
  2. Создаём экземпляр класса VK API;
  3. Получаем токен и добавляем его VK API
  4. Получаем список альбомов (функция getAlbums возвращает словарь, с которым уже можно работать без сторонних модулей) и достаём из них id;
  5. Начинаем цикл по id альбомов;
  6. Получаем список всех фотографий (вот в таком виде);
  7. Начинаем цикл по фотографиям;
  8. Получаем ссылку на фото в максимальном доступном разрешении (если кто знает способ получить её проще, отпишите пожалуйста, в комменты);
  9. Скачиваем фото.

В данном случае yid — идентификатор того, чьи альбомы скачиваем, например ваш, разумеется у вас должен быть доступ к этим фото

Короче чем тут, не так ли? Правда, здесь без выбора альбома, но это неважно, главное, что через API быстрее, короче и удобнее.

Мини FAQ
  • -Откуда брать список методов?
    — Из официальной документации, вызываются просто: vkapi.то что написано в документации, например vkapi.photos.Get();
  • — Какие аргументы для методов?
    — Всё там же в документации, передавать в виде имя=значение, например owner_id=’124214′;
  • — Как узнать какие нужны права?
    — В информации о методе в документации VK сверху есть строка, в которой жирным шрифтом выделено, какие права нужны; если надо несколько, то посылаем их строкой с разделителем ‘+’, например, ‘photos+wall’. Порядок значения не имеет;
  • — Все ли методы реализованы?
    — Да, все;
  • Если неправильный логин/пароль вернёт ли ошибку auth()?
    — Да, «Excpected sucess here»;
  • — Насчёт кодировки…
    — В основном возвращается строка utf-8.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *