prawn-cake / vk-requests

vk.com requests for humans. API library for vk.com
MIT License
158 stars 22 forks source link

Использование с access_token #32

Closed setazer closed 6 years ago

setazer commented 6 years ago

По всей видимости эту либу нельзя использовать передавая напрямую "вечный" пользовательский access token (сгенерированный с правом offline) В либе vk это реализуется строчками

session = vk.Session(access_token=VK_TOKEN)
api = vk.API(session, v='5.73')

Здесь же я сделать чего-то подобное не могу. api = vk_requests.create_api(access_token=VK_TOKEN, v=5.73) выдаёт ошибку ругаясь на неожиданный аргумент access_token api = vk_requests.create_api(service_token=VK_TOKEN, v=5.73) в свою очередь ругается уже на переданный аргумент версии и очевидно ожидает только сервисный токен.

Проблема в логине в ВК по логину/паролю каждый раз в том, что ВК через какое-то время начинает ограничивать доступ к API логинящемуся юзеру на срок до 8 часов. Лично столкнулся с этим где-то через полгода использования логина/пароля для каждого запроса. Поэтому целесообразнее один раз сгенерировать токен с правом offline и использовать его везде.

prawn-cake commented 6 years ago

@setazer api версия передается параметром api_version, т.е api = vk_requests.create_api(service_token=VK_TOKEN, api_version="5.73") должно работать как ожидается.

В целом интерфейс vk и vk-requests разный, чтобы не допускать ошибок используй IDE которая позволяет делать инспекцию вызываемых методов.

setazer commented 6 years ago

Да, в таком случае всё работает, с версией апи сам недоглядел, но остаётся сбивающее с толку название параметра service_token, потому что в ВК "сервисный ключ доступа" это отдельный токен с урезанным функционалом про который и упоминается в описании библиотеки. Из-за этого кажется что пользовательский токен полученный через Implicit flow использовать в этом параметре нельзя.

prawn-cake commented 6 years ago

@setazer можешь дать ссылку на официальную документацию про "вечный" пользовательский access token (сгенерированный с правом offline)?

Service token - описан тут и библиотека недвусмысленно поддерживает именно его, тк vk мигрирует досту к API методам с использованием этого токена.

Ты верно заметил что с точки зрения api вызовов существует только параметр access_token, куда можно подставить любой валидный токен. Но с точки зрения user интерфейса и документации они разные.

setazer commented 6 years ago

А пожалуйста. Здесь описан способ получения токена. Вся фишка в параметре scope, значения для которого описаны тут. И там как раз есть значение:

offline (+65536) | Доступ к API в любое время (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 — токен бессрочный). Не применяется в Open API.

Самое странное - я сейчас не могу найти мою переписку с поддержкой ВК, в которой мне и обозначили что вместо логина каждый раз нужно просто получить один раз токен со скоупом оффлайн и пользовать его.

P.S.: Нашёл. Тут моё общение с саппортом ВК из-за того что у меня питоноскрипт прекращал каждый день на полдня что-либо делать, потому что не мог получить новый токен. Некстати только что почитал ещё раз про сервисный ключ доступа, похоже придётся использовать его вместо уже пользовательского ключа. Обновления совсем недавние, я даже не знал про них.

P.P.S.: Сервисный токен всё ещё не даёт постить на стену, что мне лично собственно и нужно.

prawn-cake commented 6 years ago

Ага, понял. Т.е ты получаешь токен на клиенте и прокидываешь его на бэкенд для запросов от имени пользователя. В этом случае использования service_token будет единственной опцией.

VK довольно давно (год назад или около того) перевел часть API на service tokens, но не все, поэтому надо смотреть документацию.

Как action point, я добавлю апдейт в README для подобных твоему кейсов. Спасибо за report.