タイトルにあります通り、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