Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
Alex
@JWo1F
Воу
Салют
Vsevolod Romashov
@7even
Привет
Aleksey Kurepin
@foxweb
хелоу
Vsevolod Romashov
@7even
@foxweb за консультацией пришел?)
Roman Storm
@rstormsf
а в чем разница между этим и https://github.com/zinenko/vk-ruby ?
Vsevolod Romashov
@7even
не слежу за развитием vk-ruby, но когда однажды мне понадобилось работать с API вконтакта, возможностей этого гема не хватило - так и появился vkontakte_api
Roman Storm
@rstormsf
ok
TIT
@tit
Всем привет. Есть живые?
Vsevolod Romashov
@7even
привет, есть время от времени
TIT
@tit

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

Vsevolod Romashov
@7even
может, в code какой-нибудь лишний пробел или перенос строки попадает?
ну то есть код, работающий с вконтактом, верный и должен работать
TIT
@tit
О! Сделал по-другому немного. Сначала выполнил VkontakteApi.authorization_url, получил ссылку, перешёл по ней, взял code, потом вставил его inline в код и запустил его. Сработало. Вывело user_id мой. Но! Повторный запуск уже не работает. Та же ошибка: "error":"invalid_grant","error_description":"Code is invalid or expired."
Vsevolod Romashov
@7even
этот код срабатывает только один раз, потом нужно получать новый
TIT
@tit
Т. к. КАЖДЫЙ запуск приложения должен подтверждаться переходом в браузере по ссылке и забором нового code?
Vsevolod Romashov
@7even
нет, можно сохранить полученный токен и в следующие разы создавать объект так:
vk = VkontakteApi::Client.new(token)
но у токена есть определенное время жизни, кажется сутки по умолчанию
TIT
@tit

Фух. Вроде разобрался в итоге. Поправьте, пожалуйста, если я сильно не прав.

Сначала (однократно) мы делаем:

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'

И, соответственно, если токен устарел, то повторяем первый шаг ещё раз.

Vsevolod Romashov
@7even
да, все так
TIT
@tit
Моё вам огромное спасибо. Голова чуть не лопнула от этих token'ов.
Vsevolod Romashov
@7even
:)
TIT
@tit
Пришла вторая беда — Captcha в API, но она показывается, если больше 2-3 запросов в секунду идёт. Это обойти просто (реже отправлять запрос на создание группы). Но в целом, ужасно же API сделано в ВК, или нет?
Vsevolod Romashov
@7even
ну можно было бы и получше, да
Sanches
@maksportnyagin
7even, доброго времени суток. В ruby я совсем новичек. Сейчас делаю "синхронизатор" музыки из spotify в vk. Возникла проблема с капчей. Как правильно ее обработать? Сейчас я первым делом в контролере проверяю есть ли params[:captcha], если нет то делаю запрос на добавление песни к себе на страницу, далее идет rescue, и если ошибка 14 то делаю рэндер js файла который выдает модальное окно с капчей и формой. Форма отправляется опять таки ajax в тот-же контроллер. Теперь у нас условие params[:captcha] срабатывает и мы отправляем запрос на добавление уже с капчей. Правильно ли так или условие можно куда-то убрать?
Sanches
@maksportnyagin
@vk_track = VkTrack.find(params[:id])

`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`

вот таким макаром сейчас срабатывает капча. Вроде все работает, но мне кажется что можно сделать все красивее. Так ли это?
Vsevolod Romashov
@7even
добрый день. в целом логика правильная, насколько я понимаю. есть смысл завернуть ее в сервисный объект, внутри него ловить ошибку 14, а в контроллере тогда уже будет что-то вроде этого:
@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
Vladimir Deepsystm
@deepsystm
Добрый день, спасибо за джем -- хорошая работа, хороший вклад в сообщество
Vsevolod Romashov
@7even
Спасибо
Ilya Menshikov
@unkmas
Добрый день! @7even спасибо за гем - он прекрасен :) Есть один вопрос - Oj включен по умолчанию, т.к. в других гемах есть ошибки при парсинге. Собственно вопрос: не помните ли, на каких запросах возникали такие проблемы? Хочу попробовать использовать этот гем под Jruby
Vsevolod Romashov
@7even
@unkmas добрый день. Буквально 10 минут назад смерджил пулл-реквест, добавляющий поддержку JRuby - Oj теперь используется только для платформы MRI. Новой версии пока нет, планирую выпустить на днях, как будет время.
Ilya Menshikov
@unkmas
@7even круто, спасибо!
Julian Nacci
@JulianNacci
Priviet, I am not speaking russian sorry guys. I am new to VK API and try to understand its mechanic by digging in documentation. Currently developing a RoR + React app using soundcloud to stream music, I recently got interested by VK audio API. I created an app through VK dev interface, and try to make query with audio requests / methodes (using an app id and secret) but no wrapper gem.
What I have understood so far is that it is not possible to make any request without an user account id / pwd... (it is possible on Soundcloud for ex), is it right ?