たれみみマンデー

Ruby(Rails)でTwitterOauth認証の許可をすっ飛ばす。

タイトルにあります通り、Ruby(Rails)でTwitterOauth認証の許可をすっ飛ばすプログラムかきました。Oautu認証は認証画面でいったん外部にとばされるため、サイトコンテンツの世界観が崩れることを阻止する目的でかきました。だれかのためになれば幸いですが、よろしくなかったら即削除します。連絡下さい。

 

尚便宜上コンシューマーキーなどを出してますが、環境変数等に隠して下さい。

自動化するためGemにMechanizeをつかってます。Gemfileに追加して下さい。。

gem 'twitter'
gem 'mechanize'
gem 'oauth'

 

以下ContorollerとModelです。

indexアクションにとばしたら全てが動きます。


class
SessionsController < ApplicationController require 'pp' CONSUMER_KEY = "*******" CONSUMER_SECRET = "********" CALLBACK_URL="http://127.0.0.1:3000/auth/twitter/callback" def index redirect end def redirect consumer @@oauth_token = @@request_token.token mechanize end def mechanize agent = Mechanize.new agent.user_agent_alias = 'Mac Safari 4' page = agent.get("https://api.twitter.com/oauth/authorize?oauth_token=#{@@oauth_token}") form = page.forms[0] form["session[username_or_email]"] = "*****" #POSTでEmailかIDを受け取って入れて下さい form["session[password]"] = "******" #POSTでpasswordを受け取って入れて下さい next_page = form.submit elements = next_page.search("a") e = elements[6][:href] if e.match("oauth_verifier=") reg = e.match("oauth_verifier=") oauth_verifier = reg.post_match end @access_token = @@request_token.get_access_token(:oauth_verifier => oauth_verifier) @@token = @access_token.token @@token_s = @access_token.secret @@user_id = @access_token.params[:user_id] @@screen_name = @access_token.params[:screen_name] create end def create # user = User.from_omniauth(env["omniauth.auth"]) auth = { :token => @@token, :token_s => @@token_s, :user_id => @@user_id, :screen_name => @@screen_name } user = User.find_by_uid(@@user_id) || User.create_with_omniauth(auth) session[:user_id] = user.id twitter_json redirect_to root_path, :notice => 'ログインしました' end
#twitter_jsonはd3.js用の読み込みファイルなので無視してもらってかまいません
def twitter_json user = User.find_by(uid: @@user_id ) twitter_client(user) friends = @client.friends friends_json = [] links_json = [] friends.each do |friend| friend_json = { "id" => friend.screen_name, "image_url" => "#{friend.profile_image_url}" } friends_json << friend_json link_json = { "source" => user.screen_name, "target" => friend.screen_name } links_json << link_json end complete_json = { "node" => friends_json , "links" => links_json } File.open("public/#{@@user_id}.json","w") do |f| f.write(complete_json.to_json) end end def destroy session[:user_id] = nil redirect_to root_path, :notice => 'ログアウトしました' end def oauth_failure redirect_to root_path, :notice => 'ログイン処理が中断されました' end private def consumer consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, { :site => "https://api.twitter.com", :scheme => :header }) @@request_token = consumer.get_request_token(:oauth_callback => CALLBACK_URL) end def twitter_client(user) @client = Twitter::REST::Client.new do |config| config.consumer_key = CONSUMER_KEY config.consumer_secret = CONSUMER_SECRET config.access_token = user.token config.access_token_secret = user.token_s end end end
class User < ActiveRecord::Base
def self.create_with_omniauth(auth)
     create! do |user|
       user.uid = auth[:user_id]
       unless auth.blank?
         user.screen_name = auth[:screen_name] 
       end  
      user.token = auth[:token]
      user.token_s = auth[:token_s]
      user.save!
     end
   end
end

 カラムはこんな感じ。以下migrateファイル

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :uid
      t.string :token
      t.string :token_s
      t.string :name
      t.string :screen_name
      t.string :image
      t.string :friends

      t.timestamps null: false
    end
  end
end

自己責任でお願いします。

質問も受けてます。気軽にメンションください。

 

たれみみ

@taremimi_7