Перед вами исходный код гема, который может помочь вашему приложению на Ruby-On-Rails легко и просто интегрироваться с API всем известной социальной сети ВКонтакте. Думаю, на просторах Github можно найти не один десяток таких гемов. Вряд ли этот чем-то принципиально лучше остальных. Предполагаю, что он может даже и хуже оказаться, ведь я не искал аналоги, не анализировал доступные варианты, вообще ничего не изучал. Просто однажды мне понадобилось работать с VK API и, попутно решив разобраться с процессом создания своих гемов, я начал писать вот этот самый код.
Светлое и безоблачное будущее. Я использую этот код для своего проекта #shopinvk и не собираюсь отказываться от созданного своими руками гема в пользу какого-либо другого. Так что проект будет постепенно, упрямо и очень скурпулезно развиваться по мере роста потребностей #shopinvk.
Из того, что гем накапливает функциональность строго исходя из нужд #shopinvk, следует простой факт: сейчас реализованы далеко не все вызовы API, а только те, которые мне тем или иным образом успели пригодиться: работа с фотографиями, альбомами, пользователями.
Добавляем в Gemfile эту строчку:
gem 'vkontakte', :git => 'git://github.com/kimrgrey/vkontakte.git'
Выполняем вот эту команду:
bundle install
И добавляем в папку config/initializers файлик vkontakte.rb с каким-то таким содержимым:
Vkontakte.configure do |config|
config.client_id = '' # тут идентификатор вашего приложения
config.client_secret = '' # тут секретный токен вашего приложения
endОба параметра берутся из настроек приложения в VK.
Чтобы работать с VK API вам потребуется токен, подтверждающий ваши права на те или иные действия в рамках аккаунта пользователя. Для его получения можно использовать что-то вроде этого контроллера:
class AccountsController < ApplicationController
def show
@account = Account.find(params[:id])
respond_to do |format|
format.html
end
end
def authorize
@account = Account.find(params[:id])
redirect_to Vkontakte::Application.authorize_url([:photos, :offline], callback_account_url(@account))
end
def callback
@account = Account.find(params[:id])
if params[:code]
Vkontakte::Application.request_access_token(params[:code], callback_account_url(@account)) do |token, uid|
@account.update_attributes(:token => token, :uid => uid)
end
end
redirect_to account_url(@account)
end
endПредполагается какой-то такой сценарий:
- У вас есть страничка, отображающая статус аккаунта;
- На этой страничке размещается ссылка на действие authorize;
- При выполнении authorize приложение перенаправляет бразуер на страницу авторизации VK;
- В данном случае мы получаем доступ к фотографиям и действиям с аккаунтом в оффлайне;
- После успешной авторизации VK возвращает параметр code на указанный для обратной связи URL;
- Далее code используется для получения токена при выполнении второго запроса к API;
- Полученный токен запоминается для дальнейших операций.
Не помешает добавить обработку неудачных исходов выполнения тех или иных телодвижений, но для примера, думаю, достаточно.
Подробное описание всех доступных методов вы можете найти на официальном сайте VK API. При работе с гемом нужно просто заменить именование при помощи camelCase на именование через нижние подчеркивания. То есть, например, если в документации описан метод photos.getAlbums, то у гема будет метод photos_get_albums. Поскольку в некоторых случаях имена получаются довольно стремными, я создавал алиасы. Скажем, можно смело писать photo_albums вместо photos_get_albums.
Учитывайте при разработке, что если вдруг что-то пойдет не так, то вы скорее всего получите исключение класса Vkontakte::MethodCallError.
Если продолжать приведенный выше пример, то примерно так будет выглядеть большая часть обращений к API:
class Account
def reload_avatar
fields = [:fist_name, :last_name, :photo_big].join(",")
result = vkontakte.users(:fields => fields).
update_attributes(:avatar_url => result.first["photo_big"])
end
def create_photo(title, description, url)
result = vkontakte.create_photo_album(:title => title, :description => description, :url => url)
result.first["pid"]
end
def vkontakte
@vk ||= Vkontakte::Application.new(uid, token)
end
end============================
В большинстве случаев все довольно просто:
- Форкаете проект на Github;
- В своей копии добавляете к классу Vkontakte::Application еще один вызов api_method по аналогии с уже существующими;
- Проверяете, что все работает;
- Profit.