Это третья часть моей серии о Ruby Social Media Gems. Сегодня я сосредоточен на драгоценных камнях Facebook.
Коала Gem
Коала — это драгоценный камень, который взаимодействует с различными API-интерфейсами Facebook (Graph API, REST API, обновления в реальном времени, тестовые пользователи и проверка OAuth). Я знаю, что есть много связанных с Facebook драгоценных камней, но Koala — это камень, который я выбрал для этой статьи. ,
Демо-приложение
Приложение, которое мы собираемся создать с использованием камня Koala, такое же, как и в предыдущих статьях. Мы добавим все пользовательские данные из Facebook в наше приложение rails, чтобы мы могли отображать их в любом формате, который нам нравится.
Начиная с приложения:
Вы можете скачать полный исходный код формы github здесь
Создайте новое приложение rails:
rails new rsg_facebook_gem
Добавьте path/to/project/Gemfile
, bootstrap, меньше драгоценных камней в path/to/project/Gemfile
gem 'devise' gem 'koala' gem "less-rails" gem 'twitter-bootstrap-rails'
А потом беги
bundle install
Мы собираемся использовать начальную загрузку для компонента пользовательского интерфейса.
Инициализация
Прежде чем начать, нам нужно выполнить несколько команд для инициализации проекта.
Создание пользовательской модели и стиля Bootstrap
Следующие команды находятся на странице github проекта devise и проекта начальной загрузки Twitter.
Чтобы установить устройство
rails generate devise:install
Создать пользовательскую модель
rails generate devise user
rake db:migrate
Чтобы настроить представления
rails generate devise:views
Чтобы установить загрузчик
rails g bootstrap:install
Чтобы установить макет начальной загрузки
rails g bootstrap:layout application fixed
Удалить индексный файл из
path/to/project/public/index.html
Структура приложения
Контроллеры
Нам нужно будет только создать один контроллер, который будет обрабатывать подключение к Facebook. Этот контроллер извлекает данные из API и передает их нашим моделям.
rails g controller facebook
Добавьте следующую строку в начало FacebookController
before_filter :authenticate_user!
Создайте приложение на сайте разработчиков Facebook и установите для «URL сайта» значение «http: // localhost: 3000», а для «Доменов приложения» — «localhost». Если у вас возникли проблемы с настройкой обратного вызова, вы можете найти решение по этой ссылке .
Для изучения Graph API существует веб-интерфейс, который называется Graph API Explorer . Вы можете изменить права доступа с помощью кнопки «Получить токен» справа и добавить любое количество разрешений к своему токену доступа.
Вы будете использовать этот токен доступа непосредственно в своем приложении rails для тестирования своей учетной записи.
Я должен отметить здесь, что вы можете найти проблему с ssl. Самый простой способ обойти эту проблему — запустить следующую строку в консоли. Для нашего приложения мы добавили эту строку в файл инициализатора в /path/to/project/config/initializers/openssl.rb
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Подробнее об этой проблеме можно узнать по этой ссылке .
Теперь мы можем добавить несколько вспомогательных методов для обработки запросов аутентификации и API.
Коала обеспечивает аутентификацию только с двумя строками кода.
Facebook устанавливает приложение с некоторыми разрешениями по умолчанию, которые могут не соответствовать цели вашего приложения. Чтобы добавить дополнительные разрешения, перейдите на вкладку «Разрешения» на панели инструментов приложения. Более подробную информацию о разрешениях можно найти в документации на Facebook .
index
* Сначала мы проверяем, есть ли у нас объект facebook_oauth_setting
котором хранится access_token. Если это так, нам не нужно каждый раз перенаправлять пользователя, чтобы получить access_token. Ток доступа хранится в сеансе.
* При первом входе в систему мы создаем объект OAuth с ключами приложения и обратным вызовом, а затем перенаправляем пользователя в Facebook, чтобы получить разрешение.
def index unless current_user.facebook_oauth_setting @oauth = Koala::Facebook::OAuth.new("app_id", "app_secret", "http://#{request.host}:#{request.port}/callback") session["oauth_obj"] = @oauth redirect_to @oauth.url_for_oauth_code else redirect_to "/facebook_profile" end end
callback
* Если объект facebook_oauth_setting
равен nil, мы используем параметр «code», который Facebook отправил обратно, чтобы получить access_token.
* Создайте новый объект FacebookOauthSetting для этого пользователя и перенаправьте его на действие facebook_profile
def callback unless current_user.facebook_oauth_setting @oauth = session["oauth_obj"] FacebookOauthSetting.create({:access_token => @oauth.get_access_token(params[:code]), :user_id => current_user.id}) redirect_to "/facebook_profile" else redirect_to "/" end end
facebook_profile
* Если объект facebook_oauth_setting
существует, используйте сохраненный access_token для создания объекта API.
* Получить информацию о профиле пользователя, изображение, канал и друзей. и установить их в переменные экземпляра для отображения в представлениях, вы можете сохранить их в моделях, если хотите.
def facebook_profile if current_user.facebook_oauth_setting @graph = Koala::Facebook::API.new(current_user.facebook_oauth_setting.access_token) @profile = @graph.get_object("me") @picture = @graph.get_picture("me") @feed = @graph.get_connections("me","feed") @friends = @graph.get_connections("me", "friends") else redirect_to "/" end end
Маршруты
Добавьте следующее в path/to/project/config/routes.rb
match "/callback" => "facebook#callback" match "/facebook_profile" => "facebook#facebook_profile" root :to => 'facebook#index'
Взгляды
Мы должны сделать несколько изменений перед запуском сервера.
Измените path/to/project/app/views/layouts/application.html.erb
представления макета path/to/project/app/views/layouts/application.html.erb
как показано здесь:
<body> <div class="navbar navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </a> <a class="brand" href="#">RsgFacebookGem</a> <div class="container nav-collapse"> </div><!--/.nav-collapse --> </div> </div> </div> <div class="container" style="margin-top: 72px;"> <div class="row"> <div class="span9"> <%= yield %> </div> </div><!--/row--> <footer> <p>&copy; Company 2012</p> </footer> </div> <!-- /container --> <!-- Javascripts ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <%= javascript_include_tag "application" %> </body>
модели
Коала охватывает, как я уже говорил, следующие API-интерфейсы Facebook: Graph API, REST API, обновления в реальном времени, тестирование пользователей и проверку OAuth. Для обзора стоит прочитать вики- страницу Koala на github , а также ссылку на API Facebook.
Мы сосредоточились на Graph API, который является основным способом получения данных в социальной сети Facebook. Для получения дополнительной информации о Graph API, вот подробное руководство, которое также охватывает Graph API Explorer.
пользователь
Перейдите в /path/to/project/app/models/user.rb
и добавьте отношение has_one
к нашему объекту OAuth:
has_one :facebook_oauth_setting
FacebookOauthSetting
Эта модель будет хранить два значения для каждого пользователя: access_token
и user_id
. Эти значения используются позже для доступа к учетной записи Facebook без запроса разрешения каждый раз.
Выполните следующие команды, чтобы создать вышеуказанную модель:
rails g model facebook_oauth_setting access_token:string user_id:integer rake db:migrate
Добавьте связь между моделью пользователя и моделью настройки oauth в Facebook:
path/to/project/app/models/facebook_oauth_setting.rb
belongs_to :user
Facebook Graph API Explorer
Я хотел бы в последний раз подчеркнуть важность Graph API Explorer и его полезность.
Вики Koala на github очень хорошо освещает эту часть API со множеством примеров и документации.
Вот пара таких примеров:
# to get a specific user # http://graph.facebook.com/koppel @graph.get_object("koppel") # => {"name"=>"Alex Koppel", "id"=>"2905623", "last_name"=>"Koppel", "link"=>"http://www.facebook.com/koppel", "first_name"=>"Alex"} # to get a page's feed # http://graph.facebook.com/contextoptional/feed @graph.get_connections("contextoptional", "feed") # => array_of_stream stories # to get any user profile picture # http://graph.facebook.com/koppel/picture @graph.get_picture("koppel") # => "http://profile.ak.fbcdn.net/v224/784/109/q2905623_7065.jpg" # http://graph.facebook.com/search?q=koala @graph.search("koala") # => {"data"=> [{"from"=>{"name"=>"Amy", ...}, "id"=>...., # "message"=>"My apartment is infested with koala bears...."}]} @graph.put_wall_post("hey, i'm learning koala") # => {"id"=>"2905623_123183957698327"} # navigating feeds @result = @graph.get_connections('me', 'feed') # get the next page from the feed and so on @next_page = @result.next_page
Давайте соберем все вместе и создадим простое представление для отображения сохраненных данных.
Создайте новый файл facebook_profile.html.erb
по path/to/project/app/views/twitter/
<div class="row"> <div class="span4"> <div class="thumbnail"> <img src="<%= @picture %>" style="float: left;margin: 5px;"> <h4><%= @profile["name"] %></h4> <h4><%= @profile["location"]["name"] %></h4> <p>Work @<%= @profile["work"][0]["employer"]["name"] %> as <%= @profile["work"][0]["position"]["name"] %></p> </div> </div> </div> <div class="row" style="margin-top: 16px;width: 1000px;"> <div class="span5"> <h1>Feeds</h1> <table class="table table-striped"> <tr> <th>Story</th> <th>Story tags</th> </tr> <% @feed.each do |f| %> <tr> <td><%= f["story"] %></td> <td><%= f["story_tags"]["19"][0]["name"] %></td> </tr> <% end %> <% feed_next_page = @feed.next_page %> <% feed_next_page.each do |f| %> <tr> <td><%= f["story"] %></td> <td><%= f["story_tags"]["19"][0]["name"] if f["story_tags"]["19"] %></td> </tr> <% end %> <% feed_next_page = @feed.next_page %> <% feed_next_page.each do |f| %> <tr> <td><%= f["story"] %></td> <td><%= f["story_tags"]["19"][0]["name"] if f["story_tags"]["19"] %></td> </tr> <% end %> </table> </div> <div class="span5"> <h1>Friends</h1> <table class="table table-striped"> <tr> <th>Name</th> </tr> <% @friends.each do |f| %> <tr> <td><a href="http://facebook.com/<%= f["id"] %>"><%= f["name"] %></a></td> </tr> <% end %> </table> </div> </div>
Завершение
Я надеюсь, что это руководство было полезным и хорошим введением в использование гемов Koala и API Facebook. Если вы хотите предложить следующий драгоценный камень для освещения, сделайте это в комментариях. Спасибо за прочтение!