Social
Библиотека для обращения к API социальных сетей со стороны сервера. Содержит методы API и средства определения текущей социальной сети.
Данная библиотека была создана в рамках проекта SocialFrame - Шаблон для IFrame приложений на базе Sinatra (Padrino). Но библиотеку можно также использовать и для Rails-приложений и других.
Библиотека решает следующие задачи:
- Определение типа соцсети до создания сессии и авторизации по средствам Rack::Builder
- Осуществление общих запросов к API соцсети
- Генерирует уникальный пользовательский UID и уникальный SESSION_ID для сессии на основе SID соцсети
Поддержка социальных сетей:
- vk.com
- odnoklassniki.ru
Поддерживаемые методы API:
- Получает профиль пользователя
- Получить список друзей для пользователя
- Получить профили друзей
- Работа с балансом пользователя (только для vk.com)
Установка
gem install social
Для Gemfile
gem 'social'
Концепция API
- Интерфейс API социальной сети представлена одним объектом (синглтоном), чтобы иметь легкий доступ к этому API из разных мест без необходимости каждый раз конструировать объект.
- Интерфейс API социальной сети разделен на блоки которые представленны соответствующими цепочками вызова, например api.user.get_info
- Конфигурация API социальной сети должна каходится в файле (с учетом различных окруженйи), но также должна быть возможность переопределить ее простым объектом
Использование
Получение профиля пользователя (get user profile)
Social::Network(:ok).user.get_info(uid)
или
Social::Network::Vk.user.get_info(uid)
или отправка нотификации
Social::Network(social_type).notification.send(:message => msg, :uids => [ ... ])
Обращение к текущей социальной сети осуществляется после Глобального определения этого типа (см. ниже). При этом возможны следующие вызовы.
Social::Network.current.user.get_info(uid)
Инциализация по запросу (и по SocialPrefix)
Глобальное определение типа социальной сети
Social::Env.init(params[:social_type])
Определение соцсети с помощью SocialPrefix
SocialPrefix позволяет определять социальную сеть по строке запроса т.е.
- без использования субдоменов
- без определения соц.сети по параметрам запроса (что также поддерживается)
- без добавления доп.роутов в приложение
Также пользоволяет решить проблему с показам аватаров пользователей в Одноклассниках, для которых в REFERRAL должно быть слово "odnoklassniki" или "odkl".
config.ru
builder = Social::Builder::produce(Example::Application)
run builder
При этом в параметры запроса добавляется ключ social_env со следующим содержанием
request.params['social_env'] = {
'prefix' => <SOCIAL_PREFIX>,
'type' => <SOCIAL_TYPE_NAME>,
'id' => <SOCIAL_TYPE_ID>
}
Например, при запросе /odkl/*
params[:social_env][:id] # => 1
params[:social_env][:prefix] # => 'odkl'
params[:social_env][:type] # => :ok
Для SinglePage приложения: Предпологается, что первый GET запрос приходит на URL из SocialPrefix, а последующие запросы идут уже без без SocialPrefix и тип соцсети берется из сессии и передается в метод Social::Env.init(<SOCIAL_TYPE>).
Для "Многостраничного" приложения: Предпологается, что все запросы все запросы осуществляются с помощью SocialPrefix
Определение соцсети с помощью SocialParam
Помимо SocialPrefix определение соцсети можно осуществлять с помощью параметров запроса - SocialParam, если нет поддержки SocialPrefix. Например если запрос содержит параметры viewer_id и sid, то можно сказать что это соцсеть ВКонтакт.
Этот способ также предпологает использование Rack::Builder.
Глобальная инициализация окружения для SocialPrefix и SocialPrams
Осуществляет вызовом метода Social::Env.init_by_params, например
before_filter ->{ Social::Env.init_by_params(params) }
Определение конфигурации
Определение конфигурации задает данные для обращения к соц.сети. К этим данным относятся, например, секретный ключ, публичный ключ, ID приложения.
По-умолчанию конфигурация загружается из конфигурационного файла (см. далее), но также конфигурацию можно задать первым вызовом #Network этого хеша, например
Social::Network(:ok, config_hash)
Или определить с помощью у объекта
Social::Network::Ok.instance.params = { config: config_hash }
Social::Network::Ok.instance.reload_config
или
Social::Network(:ok).params = { config: config_hash }
Social::Network(:ok).reload_config
Определение конфигурации через конфигурационный файл
Конфигурационный файл должен иметь имя "social.yml"
При использовании Rails конфигурационный файл должн находится в папаке
APP_ROOT/config
Также путь к папке с конфигурационным файлом может быть определен в переменной окружения "SOCIAL_CONFIG_PATH".
Конфигурационный файл может иметь следующее содержание
ok:
development:
api_server: 'http://api.odnoklassniki.ru/'
application_key: 'APPLICATION_KEY'
secret_key: 'SECRET_KEY'
production:
test:
vk:
development:
key: "KEY"
app_id: 123
production:
test:
Название окружение для чтения конфига задается через переменные окружения "APP_ENV", "RACK_ENV", "RAILS_ENV". По-умолчанию окружение "development".
TODO
- Тесты с использованием VCR
- Поддержка Mail.ru
- Поддержка Facebook
- Больше поддерживаемых "общих" методов API