2016年4月22日 星期五

Published 凌晨3:18 by with 0 comment

Rails User 建立-3 (手機抓取FB資料, html抓取FB資料)- 我在ALPHACamp 61天

-概述-

手機取得的資料跟 web得到的有些不一樣

大頭照(手機: picture, Web: image)

手機
 user.fb_pic = auth.info.picture.data.url
web
 user.fb_pic = auth.info.image
性別(gender)

手機:
 user.gender = auth.info.gender
web:
 user.gender = auth.extra.raw_info.gender

再來就是取得的方式也不一樣

手機:  RestClint
Web: Devise+Omiauth

以下是作法:

-手機 API抓取FB資料 - 
(使用RestClient)



目前可以抓取的資料有 :

名子(name),性別(gender), 信箱(email),大頭照(picture)


1. app/model/user.rb 之中新增我們要抓得值: email, name, gender, picture


res = RestClient.get "https://graph.facebook.com/v2.4/me",  { :params => { :fields => "email,name,gender,picture.type(large)", :access_token => access_token } }

2. 在app/controllers/api_v1/auth_controller.rb 新增

def signup
success = false
#POST /api/v1/signup

....

 elsif params[:access_token]

   fb_data = User.get_fb_data( params[:access_token] )

     if fb_data
       auth_hash = OmniAuth::AuthHash.new({
         uid: fb_data["id"],
         info: {

           email: fb_data["email"],
           gender: fb_data["gender"],
           name: fb_data["name"],
           picture: fb_data["picture"]

         },
         credentials: {
           token: params[:access_token]
         }
       })

....

end
=> 透過這方法我們會得到 auth的 hash, 接下來要讀出裡面得值



我們可以在這邊利用 byebug 來看我們剛剛在auth得到什麼東西



大頭照會包在info.pirture.data.url裡面


3. app/model/user.rb  我們新增一個專屬於的 self.from_omniauth_api(auth) 
 (因為與html取得方式格式不一樣, 所以我們拆開來寫)
   <這邊沒有遵照 don't repeat yourself >

def self.from_omniauth_api(auth)
 # Case 1: Find existing user by facebook uid
 user = User.find_by_fb_uid( auth.uid )
 if user
    user.fb_token = auth.credentials.token
    user.save!
   return user
 end

 # Case 2: Find existing user by email
 existing_user = User.find_by_email( auth.info.email )
 if existing_user
   existing_user.fb_uid = auth.uid
   existing_user.fb_token = auth.credentials.token
   existing_user.save!
   return existing_user
 end

 # Case 3: Create new password
 user = User.new
 user.fb_pic = auth.info.picture.data.url
 user.fb_uid = auth.uid
 user.fb_token = auth.credentials.token
 user.email = auth.info.email
 user.password = Devise.friendly_token[0,20]
 user.fb_raw_data = auth
 user.gender = auth.info.gender
 user.username = auth.info.name

 user.save!
 return user
end

4. 再到app/controllers/api_v1/auth_controller.rb 得singup裡面修改

def singup
.
.
   user = User.from_omniauth_api(auth_hash)
. 
.
end




- html抓取FB資料 -
 (使用 Devise +omiauth)



跟FB 抓資料概念一樣, 要先設定我們要抓哪些資料

1. config/initializers/devise.rb

fb_config = Rails.application.config_for(:facebook)
  config.omniauth :facebook, fb_config["facebook"]["app_id"], fb_config["facebook"]["secret"], :scope => 'public_profile,email', :info_fields => 'name,gender,email', :image_size => 'large'
我們已經在上方第二步驟新增app/controllers/api_v1/auth_controller.rb

但是這邊大頭照所在的位置是不一樣的, 從API方式來的是picture

但是從html來的是image

但由於這邊picture是預設值, 所以我們不用在 auth_controller裡面

我們也可以用 byebug來確認我們得到的auth



=> 這次 gender 藏在 raw_info裡面


2. 在app/model/user.rb  的 self.from_omniauth(auth) 取出裡面的值 

 # Case 3: Create new password
 user = User.new
 user.fb_uid = auth.uid
 user.fb_token = auth.credentials.token
 user.email = auth.info.email
 user.password = Devise.friendly_token[0,20]
 user.fb_raw_data = auth
 user.gender = auth.extra.raw_info.gender
 user.username = auth.info.name
 user.fb_pic = auth.info.image
 user.save!
 return user


      edit

0 意見:

張貼留言