В предыдущей части этой серии мы рассмотрели гем LinkedIn и создали простое приложение, которое покрывало запросы аутентификации и API. Мы собираемся создать аналогичное приложение с жемчужиной Twitter для тех же целей.
Драгоценный камень Twitter, в отличие от гема LinkedIn, не обеспечивает аутентификацию. Поэтому для аутентификации нам понадобится гем oauth-ruby .
Демо-приложение
Приложение, которое мы собираемся создать с помощью самоцвета Twitter, будет таким же, как и то, что мы создали в LinkedIn. Мы получим все пользовательские данные из Twitter в наших моделях приложений rails, чтобы мы могли отображать их в любом формате.
Начиная с приложения:
Вы можете скачать полный исходный код формы github здесь
Создайте новое приложение rails:
rails new rsg_twitter_gem
Добавьте в твиттер, oauth, devise, самоцветы начальной загрузки path/to/project/Gemfile
gem ‘oauth’ | |
gem ‘devise’ | |
gem ‘twitter’ | |
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
Структура приложения
Контроллеры
Нам потребуется только создать один контроллер, который будет обрабатывать соединение с Twitter. Контроллер будет извлекать данные из API и передавать их нашим моделям.
rails g controller twitter
Добавьте следующую строку в начало TwitterController
before_filter :authenticate_user! |
Создайте приложение на сайте разработчика Twitter
Вы должны указать домен в URL обратного вызова при создании приложения в Twitter. Например, вы должны установить домен как http://0.0.0.0:3000
для разработки. После развертывания вы должны изменить его на свое доменное имя.
Теперь мы можем добавить несколько вспомогательных методов для обработки запросов аутентификации и API.
Аутентификация с помощью OAuth gem действительно проста. Давайте пройдемся по действиям аутентификации.
generate_twitter_oauth_url
* Укажите URL-адрес oauth_callback
, на который пользователь будет перенаправлен после того, как пользователь авторизует приложение.
* Создайте потребительский объект с вашим потребительским ключом и секретом.
* Сохраните объект @request_token
для дальнейшего использования и перенаправьте пользователя на URL авторизации. Не забудьте передать URL обратного вызова.
def generate_twitter_oauth_url | |
oauth_callback = «http://#{request.host}:#{request.port}/oauth_account» | |
@consumer = OAuth::Consumer.new(«your-consumer-key»,«your-consumer-secret», :site => «https://api.twitter.com») | |
@request_token = @consumer.get_request_token(:oauth_callback => oauth_callback) | |
session[:request_token] = @request_token | |
redirect_to @request_token.authorize_url(:oauth_callback => oauth_callback) | |
end |
oauth_account
* Объект TwitterOauthSetting
используется для хранения токена доступа и секрета. Мы рассмотрим эту модель более подробно позже.
* Поиск, чтобы увидеть, если текущий пользователь уже аутентифицировал приложение.
* Снова получите @access_token
и получите объект @access_token
с параметром :oauth_verifier
отправленным обратно из Twitter.
* Создайте TwitterOauthSetting
для хранения Access token
Access token secret
и Access token secret
.
* Вызовите update_user_account
чтобы обновить объект пользователя с информацией его учетной записи в Twitter.
def oauth_account | |
if TwitterOauthSetting.find_by_user_id(current_user.id).nil? | |
@request_token = session[:request_token] | |
@access_token = @request_token.get_access_token(:oauth_verifier => params[«oauth_verifier»]) | |
TwitterOauthSetting.create(atoken: @access_token.token, asecret: @access_token.secret, user_id: current_user.id) | |
update_user_account() | |
end | |
redirect_to «/twitter_profile» | |
end |
index
Это корневое действие, которое проверяет, есть ли у этого пользователя объект настройки oauth в твиттере или нет. Если true, перенаправьте на действие twitter_profile.
def index | |
unless TwitterOauthSetting.find_by_user_id(current_user.id).nil? | |
redirect_to «/twitter_profile» | |
end | |
end |
get_client
Конфигурация для этого драгоценного камня может быть сделана двумя различными способами. Первый способ — глобальная настройка для одного пользователя. Другой способ, который мы собираемся использовать, — это настроить каждого клиента со своим токеном и секретом, возвращая объект client для использования.
def get_client | |
Twitter.configure do |config| | |
config.consumer_key = «rfoURDvnXa4eKoypFRmJVA» | |
config.consumer_secret = «u6Vm5CDHmiOfT7UmJRS7tRJeITQrKXKs7M97in46PGo» | |
end | |
Twitter::Client.new( | |
:oauth_token => TwitterOauthSetting.find_by_user_id(current_user.id).atoken, | |
:oauth_token_secret => TwitterOauthSetting.find_by_user_id(current_user.id).asecret | |
) | |
end |
twitter_profile
Это действие отображает информацию о пользователе, его временную шкалу и домашнюю временную шкалу.
def twitter_profile | |
@user_timeline = get_client.user_timeline | |
@home_timeline = get_client.home_timeline | |
end |
update_user_account
Обновление профиля пользователя с помощью его учетной записи в Twitter. Мы добавим эти поля в модель пользователя позже.
def update_user_account | |
user_twitter_profile = get_client.user | |
current_user.update_attributes({ | |
name: user_twitter_profile.name, | |
screen_name: user_twitter_profile.screen_name, | |
url: user_twitter_profile.url, | |
profile_image_url: user_twitter_profile.profile_image_url, | |
location: user_twitter_profile.location, | |
description: user_twitter_profile.description | |
}) | |
end |
Маршруты
Добавьте следующее в path/to/project/config/routes.rb
resources :twitter | |
match ‘/twitter_profile’ => «twitter#twitter_profile» | |
match ‘/oauth_account’ => «twitter#oauth_account» | |
match ‘/twitter_oauth_url’ => ‘twitter#generate_twitter_oauth_url’ |
Взгляды
Мы должны сделать несколько изменений перед запуском сервера.
Измените path/to/project/app/views/layouts/application.html.erb
представления макета path/to/project/app/views/layouts/application.html.erb
, удалив строки 65-74
. Замените строки 50-52
следующим:
<% if current_user %> | |
<li><%= link_to current_user.email, «/users/edit» %></li> | |
<li><%= link_to «Sign out», «/users/sign_out», :method => «DELETE» %></li> | |
<% end %> |
Измените представление индекса [path / to / project / app / views / twitter / index.html.erb] следующим образом:
<h1>Twitter Application</h1> | |
<a href=»/twitter_oauth_url» class=»btn btn-primary btn-larg«>Connect to Twitter</a> |
модели
Мы должны остановиться здесь и взглянуть на API Twitter и то, что мы собираемся здесь осветить. Кроме того, нам нужно знать спецификацию моделей, создаваемых в нашем приложении.
Twitter предоставляет разработчику полевое руководство по объектам платформы Twitter . Есть четыре основных объекта, с которыми вы будете иметь дело: твиты, пользователи, сущности, места. Мы собираемся сосредоточиться на объекте Tweet.
Так Твиттер определяет твит от руководства
Также известный как Обновление статуса, твиты являются основной атомной единицей всего, что есть в Твиттере. Пользователи создают твиты. Твиты могут быть встроены, отправлены ответы, добавлены в избранное, не добавлены в избранное, ретвитнуты, не переписаны и удалены. Ретвит содержит встроенный объект Tweet в атрибуте «retweeted_status».
На странице Tweets вы найдете Field Guide , в котором перечислены поля объекта Tweet и связанных объектов.
Вот несколько выбранных полей:
- Координаты
- Представляет географическое местоположение этого твита, сообщаемое пользователем или клиентским приложением. Внутренний массив координат отформатирован как geoJSON (сначала долгота, затем широта).
- объект
- Только поверхности в методах, поддерживающих параметр include_my_retweet, если установлено значение true. Детализирует идентификатор твита собственного ретвита пользователя (если он существует) этого твита.
- логический
- Указывает, был ли этот твит одобрен аутентифицирующим пользователем.
- Int
- Количество повторений этого твита. Это поле больше не ограничено 99 и не станет строкой для «100+»
- строка
- Фактический UTF-8 текст обновления статуса. Смотрите твиттер-текст для деталей о том, что в настоящее время считается действительными символами.
- пользователей
- Пользователь, который разместил этот твит. Перспективные атрибуты, встроенные в этот объект, ненадежны.
пользователь
Теперь мы можем добавить несколько полей в модель пользователя из его / ее учетной записи Twitter. Выполните следующую команду, чтобы обновить модель пользователя.
rails g migration AddFieldsToUserModel |
Перейдите в /path/to/project/db/migrate/20121112110442_add_fields_to_user_model.rb
, добавьте следующее и запустите rake db:migrate
:
def change | |
add_column :users, :name, :string | |
add_column :users, :screen_name, :string | |
add_column :users, :url, :string | |
add_column :users, :profile_image_url, :string | |
add_column :users, :location, :string | |
add_column :users, :description, :string | |
end |
Перейдите в /path/to/project/app/models/user.rb
и измените строку 9 следующим образом:
attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :screen_name, :url, :profile_image_url, :location, :description |
TwitterOauthSetting
Это важная модель, которая будет хранить два значения для каждого пользователя. Эти значения используются позже для доступа к своей учетной записи без запроса разрешения каждый раз.
Выполните следующую команду, чтобы создать указанную модель:
rails g model twitter_oauth_setting atoken:string asecret:string user_id:integer
rake db:migrate
Добавьте связь между моделью пользователя и моделью настройки Twitter в oauth :
path/to/project/app/models/twitter_oauth_setting.rb
belongs_to :user |
Запросы Twitter API
На Github есть несколько примеров репозитория gem, например:
# Applications that make requests on behalf of a single Twitter user can pass global configuration options as a block to the Twitter.configure method. | |
Twitter.configure do |config| | |
config.consumer_key = YOUR_CONSUMER_KEY | |
config.consumer_secret = YOUR_CONSUMER_SECRET | |
config.oauth_token = YOUR_OAUTH_TOKEN | |
config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET | |
end | |
# After configuration, requests can be made like so: | |
Twitter.update(«I’m tweeting with @gem!») | |
# Follow a user | |
Twitter.follow(«ahmdrefat») | |
# Fetch a user | |
Twitter.user(«ahmdrefat») | |
# User timeline | |
Twitter.user_timeline(«ahmdrefat») | |
# Search | |
Twitter.search(«to:ahmdrefat ruby on rails», :count => 5, :result_type => «recent»).results.map do |status| | |
«#{status.from_user}: #{status.text}« | |
end |
Давайте соберем все вместе и создадим простое представление для отображения сохраненных данных.
Создайте новый файл twitter_profile.html.erb
по path/to/project/app/views/twitter/
<div class=»row«> | |
<div class=»span4«> | |
<div class=»thumbnail«> | |
<img src=»<%= current_user.profile_image_url %>» style=»float: left;margin: 5px;«> | |
<h3><%= current_user.name %></h3> | |
<h4><%= current_user.location %></h4> | |
<br> | |
<p><%= current_user.description %></p> | |
</div> | |
</div> | |
</div> | |
<div class=»row» style=»margin-top: 16px;«> | |
<div class=»span5«> | |
<h1>User Timeline</h1> | |
<table class=»table table-striped«> | |
<tr> | |
<th>Text</th> | |
</tr> | |
<% @user_timeline.each do |t| %> | |
<tr> | |
<th><%= t.text %></th> | |
</tr> | |
<% end %> | |
</table> | |
</div> | |
<div class=»span5«> | |
<h1>Home Timeline</h1> | |
<table class=»table table-striped«> | |
<tr> | |
<th>User Name</th> | |
<th>Profile Image</th> | |
<th>Text</th> | |
</tr> | |
<% @home_timeline.each do |t| %> | |
<tr> | |
<th><%= t.user.name %></th> | |
<th><img src=»<%= t.user.profile_image_url %>» /></th> | |
<th><%= t.text %></th> | |
</tr> | |
<% end %> | |
</table> | |
</div> | |
</div> |
Завершение
Что ж, я надеюсь, что это руководство было полезным и хорошим введением в использование драгоценного камня Twitter и API. Если вы хотите предложить следующий драгоценный камень для освещения, сделайте это в комментариях. Спасибо за прочтение!