Подскажите тогда, пожалуйста. Не получается авторизоваться внутри gem'а Vkontakte_api. Создал приложение внутри ВК (Standalone-приложение). Получил ID приложения и Защищенный ключ. А вот дальше — плохо, не получается что-то.
VkontakteApi.configure do |config|
config.app_id = ''
config.app_secret = ''
end
# показать ссылку для авторизации
puts VkontakteApi.authorization_url
# взять код из ссылки выше (после авторизации)
code = gets
vk = VkontakteApi.authorize code: code
puts vk.user_id
вылетает с ошибкой: "error":"invalid_grant","error_description":"Code is invalid or expired."
Общая задача у меня простая: от определённого пользователя создать >100 сообществ (групп). Я могу их создать «вручную» через Selenium, но там есть засада в виде CAPTCHA после 2-3 групп подряд. Решил через API, там лимиты побольше вроде.
VkontakteApi.authorization_url
, получил ссылку, перешёл по ней, взял code, потом вставил его inline в код и запустил его. Сработало. Вывело user_id мой. Но! Повторный запуск уже не работает. Та же ошибка: "error":"invalid_grant","error_description":"Code is invalid or expired."
Фух. Вроде разобрался в итоге. Поправьте, пожалуйста, если я сильно не прав.
Сначала (однократно) мы делаем:
VkontakteApi.configure do |config|
config.app_id = ''
config.app_secret = ''
end
# просим перейти по ссылке и вернуть code
puts VkontakteApi.authorization_url scope: [:groups]
# берём code из ссылки выше
code = gets
# убираем перенос строки
code.gsub! /\n/, ''
# получаем token
token = VkontakteApi.authorize(code: code).token
Потом, при каждом запуске приложения:
VkontakteApi.configure do |config|
config.app_id = ''
config.app_secret = ''
end
# длинный токен с прошлого раза
vk = VkontakteApi::Client.new token
# наши действия
vk.groups.create title: 'foo'
И, соответственно, если токен устарел, то повторяем первый шаг ещё раз.
`def add
@vk_track = VkTrack.find(params[:id])
begin
if params[:captcha] && params[:captcha_sid]
@id = @vk.audio.add(audio_id: @vk_track.vk_id, owner_id: @vk_track.owner_id, captcha_sid: params[:captcha_sid], captcha_key: params[:captcha])
else
@id = @vk.audio.add(audio_id: @vk_track.vk_id, owner_id: @vk_track.owner_id)
end
respond_to do |format|
format.html {}
format.js {}
format.json { render json: @vk_track }
end
rescue VkontakteApi::Error => @e
if @e.error_code == 14
respond_to do |format|
format.js { render 'captcha' }
end
else
raise
end
end
end`
@add_audio = AddAudio.new(@vk_track)
@add_audio.call(params[:captcha], params[:captcha_sid]) # в случае без капчи тут придут два nil
if @add_audio.success?
respond_to do |format|
format.html {}
format.js {}
format.json { render json: @vk_track }
end
elsif @add_audio.captcha?
respond_to do |format|
format.js { render 'captcha' }
end
else
# другая ошибка (не капча)
end
scope
при генерации урла авторизации
VkontakteApi.authorization_url(type: :client, scope: [:wall])
scope: [:offline, :wall]