-概述-
手機取得的資料跟 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 >
<這邊沒有遵照 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裡面
但是這邊大頭照所在的位置是不一樣的, 從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
0 意見:
張貼留言