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自身が保持している値をそれぞれ割り当てています。そしてルーティングを追加して、SchedulesController
のtweet
アクションを実行すると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で何かを運用させたことはありません。
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の経験があると想定していません
しかし、それを最大限活用するためには、いくつかの必要条件がインストールされている必要があります:
RailsはRubyプログラミング言語で実行されている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にページを追加したり、@documentcloud
にtweetを送る
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:
はじめに
このガイドはRailsをカバーしています(getting up and running with が分からん)
このガイドを読んだ後、あなたは様々な真実を知ることになるでしょう