Статьи

Ruby Social Gems: Twitter

В предыдущей части этой серии мы рассмотрели гем 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’

view raw
gemfile.rb
hosted with ❤ by GitHub

А потом беги
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

view raw
index.rb
hosted with ❤ by GitHub

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

view raw
get_client.rb
hosted with ❤ by GitHub

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’

view raw
routes.rb
hosted with ❤ by GitHub

Взгляды

Мы должны сделать несколько изменений перед запуском сервера.

Измените 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» classbtn btn-primary btn-larg«>Connect to Twitter</a>

view raw
index.html.erb
hosted with ❤ by GitHub

модели

Мы должны остановиться здесь и взглянуть на 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

view raw
change_user.sh
hosted with ❤ by GitHub

Перейдите в /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

view raw
user.rb
hosted with ❤ by GitHub

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

view raw
example2.rb
hosted with ❤ by GitHub

Давайте соберем все вместе и создадим простое представление для отображения сохраненных данных.
Создайте новый файл twitter_profile.html.erb по path/to/project/app/views/twitter/

<div classrow«>
<div classspan4«>
<div classthumbnail«>
<img src<%= current_user.profile_image_url %>» stylefloat: left;margin: 5px;«>
<h3><%= current_user.name %></h3>
<h4><%= current_user.location %></h4>
<br>
<p><%= current_user.description %></p>
</div>
</div>
</div>
<div classrow» stylemargin-top: 16px;«>
<div classspan5«>
<h1>User Timeline</h1>
<table classtable table-striped«>
<tr>
<th>Text</th>
</tr>
<% @user_timeline.each do |t| %>
<tr>
<th><%= t.text %></th>
</tr>
<% end %>
</table>
</div>
<div classspan5«>
<h1>Home Timeline</h1>
<table classtable 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. Если вы хотите предложить следующий драгоценный камень для освещения, сделайте это в комментариях. Спасибо за прочтение!