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