Статьи

Ruby Social Gems: Facebook

Это третья часть моей серии о Ruby Social Media Gems. Сегодня я сосредоточен на драгоценных камнях Facebook.

Коала Gem

fb_logo
Коала — это драгоценный камень, который взаимодействует с различными 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>&amp;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/
facebook_profile

 <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. Если вы хотите предложить следующий драгоценный камень для освещения, сделайте это в комментариях. Спасибо за прочтение!