RailsでTwitterログインしてつぶやく(つぶやく編)

昨日の続きです

概要

twitter というgemを使って、つぶやく部分の実装をしていきます

Twitter API v1.1 requires you to authenticate via OAuth, so you'll need to register your application with Twitter.

この記事を書くまで気づきませんでしたが、アプリケーションをTwitterに登録して、OAuth経由での認証しておくことが必要みたいですね。そうでないとPOSTができない(つまりつぶやけない?)っぽいです。

つぶやき機能実装のためには、consumer key/secret のペア(アプリをtwitterに登録した時に取得する値)と、OAuth access token/secretのペア(OAuth認証時に取得する値)が必要なようです。

その値を渡して以下のようにオブジェクトを生成して、updateメソッドを実行してやればそれだけでつぶやいてくれます。他にもフォロワー一覧を出力したり、タイムラインを取得できるようです。

client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "YOUR_CONSUMER_KEY"
  config.consumer_secret     = "YOUR_CONSUMER_SECRET"
  config.access_token        = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_ACCESS_SECRET"
end

client.update("I'm tweeting with @gem!")

実装

実際にRailsアプリで以下のように実装したら無事にtwitter上でつぶやくことができました。もっとスマートなやり方がある気がしてしょうがないですがとりあえずよしとします。

User#twitter_clientメソッドでオブジェクトを生成します。consumer key/secret は.envファイルのものを、access token/token_secretはuser自身が保持している値をそれぞれ割り当てています。そしてルーティングを追加して、SchedulesControllertweetアクションを実行するとparams[:text]の値をtwitter上でつぶやいてくれます。

# app/models/user.rb
def twitter_client
  @twitter_client ||= Twitter::REST::Client.new(
    consumer_key:        ENV['API_KEY'],
    consumer_secret:     ENV['API_SECRET'],
    access_token:        token,
    access_token_secret: secret
  )
end

# config/routes.rb
resources :schedules do
  post 'tweet', on: :collection
end

# app/views/schedules/_modal.html.haml
= button_to 'Tweet', { action: :tweet, params: { text: 'hoge' } }

# app/controllers/schedules_controller.rb
def tweet
  current_user.twitter_client.update(params[:text])
  redirect_to schedules_path, notice: 'Tweeted!'
end

RailsでTwitterログインしてつぶやいてみる

タイトルのことをやってみたくて調べたり作ったりしたので書きます

ログイン編

導入

omniauth-twitter というgemを使いました

omniauthとはなんぞやというと

OmniAuth is a library that standardizes multi-provider authentication for web applications.

webアプリケーションで様々なプロバイダ(twitterとかgithubとか)を使って認証するライブラリです。みたいな感じだと思います

準備のためにGemfile、configに設定を記述します。"API_KEY", "API_SECRET"https://apps.twitter.com/ から取得できる値に置き換える必要があります。 値を取得する際に、登録フォームにアプリケーション情報を入力します。項目の1つに「Callback URL」という任意の入力フォームがあるのですが、これにもなんらかの値を入力してやらないと認証チェックの時に弾かれてしまうようです。また、"API_KEY", "API_SECRET" は多分他人から見られるとよろしくないので、 dotenv など使ってgit管理下から外してやったほうが良いと思います。

# Gemfile
gem 'omniauth-twitter'

# config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, "API_KEY", "API_SECRET"
end

ユーザ認証

/auth/twitterにリダイレクトさせてやると、omniauthが認証に必要な作業を行ってくれるようです。認証の処理が終わった後/auth/:provider/callback宛に認証情報を持ったhashを渡します(という認識で合っているのかな?)。routes.rbの記述により、認証のコールバックがSessionControllerのcreateアクションに割り当てられます。認証が成功したらブラウザ上に情報が表示されると思います。

# 任意のview
= link_to "Sign in with Twitter", "/auth/twitter"

# config/routes.rb
get '/auth/:provider/callback', to: 'sessions#create'

# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  def create
    render text: request.env['omniauth.auth']
  end
end

それでは、実際に取得した情報をUserとして登録してみます。ネットで見つけた情報をなぞっただけなので適切な方法かは分からないのですが、認証後得られたhash値を見て:provider:uidが既存のUserと一致する場合はそのユーザでログインして、一致しない時はhash値を元にユーザを作成してログインします。最低限:provider:uidだけ保存しておけばログインできると思いますが、今回は画面上にユーザ名と画像を表示したかったので[:info][:name][:info][:image]を、またアプリ上からつぶやきたかったため、それに必要となるauth[:credentials][:token]auth[:credentials][:secret]の情報も保存しました。これでユーザ登録とログイン機能が実装できました。

# app/controllers/sessions_controller.rb
class SessionsController < ApplicationController
  def create
    user = User.find_by(provider: auth[:provider], uid: auth[:uid]) || User.create_from_auth!(auth)
    session[:user_id] = user.id
    redirect_to '/', notice: 'sign in!'
  end

  private

  def auth
    request.env['omniauth.auth']
  end
end
# app/models/user.rb
class User < ActiveRecord::Base
  def self.create_from_auth!(auth)
    create! do |user|
      user.provider = auth[:provider]
      user.uid = auth[:uid]
      user.name = auth[:info][:name]
      user.image = auth[:info][:image]
      user.token = auth[:credentials][:token]
      user.secret = auth[:credentials][:secret]
    end
  end
end

次回は「アプリ上からつぶやく編」を書くかもしれません

参考

AWS触ってみた

初めてネット対戦でマリカやったりして、俺の中でWiiUが熱い!(ちなみにスプラトゥーンは持ってません)

バーチャルコンソールファイアーエムブレム烈火の剣を買おうかどうしようか迷っています


業務でパイセンに教えて頂きつつAWSを触る機会があったので、やったことや教えて頂いたアドバイスをざっくり書いてます。どういうふうに設定するかとかいう細かいことは書いてません!

ちなみに今までの私とAWSの関係は以下の書籍やブログを軽くなぞったことがある程度で、実際に業務などでAWSで何かを運用させたことはありません。

www.amazon.co.jp

iti.hatenablog.jp

AWSインスタンスをたてる

EC2

  • マシンイメージはAmazon Linuxは避けたほうが良いかもしれないとアドバイスいただいた。理由はAWS以外で使うことがなくハマった時に情報が少なかったりするため。それ以外だったらなんでもいいんじゃね?という感じだったので今回はubuntuを選択した。
  • セキュリティグループでSSHとHTTP、HTTPSでアクセスできるように設定しておく。
  • 固定IPアドレスを設定した。再起動してもIPが変わらないようにするため。

RDS

  • DB用のインスタンスみたいな感じ。EC2上にDBをインストールする運用も可能だが、バックアップを自動でとってくれたり色々便利らしい。
  • バックアップの期間はデフォルトで7日となっていたが、長期休暇の時など「休暇前のバックアップが消えてしまっていた!」という事態になりかねないため長めに設定しておくほうが無難とのこと。30日にした。根拠はない。

railsアプリを動かしてみる

  • まずローカルのターミナルからEC2にたてたインスタンスにアクセスする。-i秘密鍵のパスを指定する。(秘密鍵はEC2インスタンスを作るときにダウンロードしたもの。)
    • $ ssh ubuntu@xx.xx.xx.xx -i ~/Downloads/oooooootsuka.pem
  • rubyやら入れてRailsが動く環境を作って、適当にアプリを作り$ rails sを走らせてアクセスできることを確認(※セキュリティグループに3000番ポートを許可する必要あり
  • インストールに時間がかかるからといってターミナルを放置プレイすると、インストール中と見せかけて実は接続が切れていた。ということがあるので注意する

その他

  • 秘密鍵のファイル名のoの数が多すぎて打ち間違えそうになるので~/.ssh/configに設定する。これで$ ssh hogeでアクセスできる。
$ less ~/.ssh/config
Host hoge
  Hostname xx.xx.xx.xx
  IdentityFile ~/Downloads/oooooootsuka.pem
  User ubuntu

Backbone翻訳

Downloads & Dependencies (Right-click, and use "Save As")

  • Development Version (1.1.2) 60kb, Full source, tons of comments
  • Production Version (1.1.2) 6.5kb, Packed and gzipped (Source Map)
  • Edge Version (master) Unreleased, use at your own risk

Backbone's only hard dependency is Underscore.js ( >= 1.5.0). For RESTful persistence, history support via Backbone.Router and DOM manipulation with Backbone.View, include jQuery, and json2.js for older Internet Explorer support. (Mimics of the Underscore and jQuery APIs, such as Lo-Dash and Zepto, will also tend to work, with varying degrees of compatibility.)

ダウンロードと依存関係

  • 開発バージョン(1.1.2)60KB、フルソース、大量のコメント
  • 本番バージョン(1.1.2)6.5KB、圧縮されている
  • エッジバージョン(master)、未リリースバージョン、リスクを覚悟の上利用下さい

Backbone.jsは唯一Underscore.js ( >= 1.5.0)に依存しています。 RESTfulの持続のためにBackbone.Routerを使った履歴支援、そしてjQueryを含むBackbone.ViewによるDOM操作、そして古いIEのためのjson2.js(Lo-DashやZeptoのようなUnderscoreやjQueryAPIの模倣もまた正しく働く傾向にある、互換性の差はあれど)

RailsGuides翻訳

1 Guide Assumptions

This guide is designed for beginners who want to get started with a Rails application from scratch.
It does not assume that you have any prior experience with Rails.
However, to get the most out of it, you need to have some prerequisites installed:

  • The Ruby language version 1.9.3 or newer.
  • The RubyGems packaging system, which is installed with Ruby versions 1.9 and later. To learn more about RubyGems, please read the RubyGems Guides.
  • A working installation of the SQLite3 Database.

Rails is a web application framework running on the Ruby programming language.
If you have no prior experience with Ruby, you will find a very steep learning curve diving straight into Rails.
There are several curated lists of online resources for learning Ruby:

  • Official Ruby Programming Language website
  • reSRC's List of Free Programming Books

Be aware that some resources, while still excellent, cover versions of Ruby as old as 1.6, and commonly 1.8, and will not include some syntax that you will see in day-to-day development with Rails.

1.前提条件

このガイドは最初からからRailsアプリケーションを始めたい人向けです
あなたがRailsの経験があると想定していません
しかし、それを最大限活用するためには、いくつかの必要条件がインストールされている必要があります:

  • Ruby:1.9.3以降
  • RubyGem:1.9以降(RubyGemについて学びたかったらRubyGems Guidesを読んで下さい)
  • SQLite3データベース

RailsRubyプログラミング言語で実行されているWebアプリケーションフレームワークです
Rubyの経験がない場合、Railsの学習は難易度が高いと分かるでしょう
Rubyを学ぶためのいくつかの精選されたオンラインリソースのいくつかのリストです

  • 公式サイト
  • 無料のreSRCのプログラミング本リスト

いくつかのリソースには注意が必要です、Rubyの1.6や一般的な1.8では日々開発されているRailsのいくつかの構文が含まれていません。

Backbone翻訳

BACKBONE.JS

Backbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.

The project is hosted on GitHub, and the annotated source code is available, as well as an online test suite, an example application, a list of tutorials and a long list of real-world projects that use Backbone.
Backbone is available for use under the MIT software license.

You can report bugs and discuss features on the GitHub issues page, on Freenode IRC in the #documentcloud channel, post questions to the Google Group, add pages to the wiki or send tweets to @documentcloud.

Backbone is an open-source component of DocumentCloud.

Backbone.jsはkey-value bindingのmodelとカスタムイベント、加算(?)機能のリッチなAPIをもつcollection、宣言的なイベントハンドリングを持つview、既存のRESTfulなJSONインターフェースのAPIに接続できる、が提供するwebアプリケーションの構造を与える

このプロジェクトはGithubにホストしている、そして注釈された(?)ソースコードが利用できる、オンラインのテストスイートも利用できる、アプリケーションの例、チュートリアルのリスト、Backboneを使っている世界中のプロジェクトのリスト
Backboneはマサチューセッツ工科大学のソフトウェアライセンスの元利用できる

Github issue でバグレポートや機能の議論ができる、#documentcloudチャンネルの Freenode IRC 上、GoogleGroupで質問を投げる、wikiにページを追加したり、@documentcloudtweetを送る

BackboneはDocumentCloudのオープンソースコンポーネントです

RailsGuides翻訳

Ruby on Rails Guides (v4.2.0)

These are the new guides for Rails 4.2 based on v4.2.0.
These guides are designed to make you immediately productive with Rails, and to help you understand how all of the pieces fit together.

The guides for earlier releases: Rails 4.1.8, Rails 4.0.12, Rails 3.2.21 and Rails 2.3.11.

RubyonRailsガイド(バージョン4.2)

これはRailsバージョン4.2に基づいた新たなガイドです
このガイドはrailsの理解を助け、すぐにソフトウェアを作れるようにするでしょう

これは以前のリリースのためのガイドです(各バージョンに対してリンクがつらつらと並んでいます)

Getting Started with Rails

This guide covers getting up and running with Ruby on Rails.
After reading this guide, you will know:

  • How to install Rails, create a new Rails application, and connect your application to a database.
  • The general layout of a Rails application.
  • The basic principles of MVC (Model, View, Controller) and RESTful design.
  • How to quickly generate the starting pieces of a Rails application.

はじめに

このガイドはRailsをカバーしています(getting up and running with が分からん)
このガイドを読んだ後、あなたは様々な真実を知ることになるでしょう

  • Railsのインストール方法、Railsアプリケーションの作り方、DBとアプリを繋ぐ方法
  • Railsアプリケーションの一般的なレイアウト
  • MVCとRESTfulの基本的な原理
  • Railsアプリケーションを素早く生成する方法