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