[Facebook API] 取得Facebook page long-lived access token
工作上有遇到必須使用Page Access token取得粉絲團的資訊
特別整理一下
根據Facebook Developer上的文件
上面是前端使用JS-SDK去取得User Access Token,並將Token回傳到Server端
成功取得後使用自己寫的function get_long_lived_page_access_token照上述步驟取得Page Access Token
PHP Code:
附上自己寫的不好的library
Facebook 的 Graph API真的是蠻好上手的,難怪都沒人要寫中文的文件
不過還是記錄一下! 本篇使用CodeIgniter做為PHP Framework
特別整理一下
根據Facebook Developer上的文件
- 使用登入的Dialog去讓Page的擁有者去登入/同意使用你的APP(要要求manage_pages的權限)
- Page擁有者同意後會取得User Access Token
- 使用User Access Token跟Graph API的GET /{user-id}/accounts取得short-lived access token
- 使用short-lived access token從server上去取得long-lived access token (Page Access token)
(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = "//connect.facebook.net/en_US/sdk.js"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); $(document).ready(function(){ $("#fb_login_btn").bind("click",function(){ FB_Login(); }); }); // 初始化FB物件 initialize fb object window.fbAsyncInit = function() { FB.init({ appId : $("#FBAPP_ID").val(), xfbml : true, cookie : true, status : true, version : 'v2.1' }); }; function FB_Login() { FB.login(function(response) { console.log("response = "+response); if (response.authResponse){ accessToken = response.authResponse.accessToken; $.ajax({ url:"/fb_photo/get_user_access_token", data:'&accessToken='+accessToken, type : "POST", dataType:'text', error:function(xhr, ajaxOptions, thrownError){ alert(xhr.status); alert(thrownError); }, success:function(response){ console.log(response); if (response!='fail'){ top.location = '/fb_photo/get_long_lived_page_access_token/'+response; }else{ alert(response); } }}); }else{ console.log('User cancelled login or did not fully authorize.'); } },{scope: 'email,manage_pages'}); }
上面是前端使用JS-SDK去取得User Access Token,並將Token回傳到Server端
成功取得後使用自己寫的function get_long_lived_page_access_token照上述步驟取得Page Access Token
PHP Code:
/*利用user_access_token取的Access token,並寫入檔案*/ public function get_long_lived_page_access_token($user_access_token){ //設定user_access_token $this->graph_fb->set_user_access_token($user_access_token); $user_info = $this->graph_fb->get_me(); //取得使用者的fb_id $fb_id = ''; if(!empty($user_info)){ $fb_id = $user_info->id; } //get account access tokens and page ids $account_access_token = array(); $page_id = array(); if($fb_id != ''){ $account_info = $this->graph_fb->get_accounts_info($fb_id); if(!empty($account_info)){ foreach($account_info->data as $info){ $account_access_token["$info->id"] = $info->access_token; $page_id[] = $info->id; } } } //get long-lived token and write long-lived token to file $fp = fopen(DOCROOT.'/facebook_page_token.txt','w'); $long_lived_token_array = array(); if(!empty($account_access_token)){ foreach($account_access_token as $id => $token){ $temp = explode('=',$this->graph_fb->get_long_lived_token($token)); $long_lived_token_array["$id"]=$temp[1]; fwrite($fp,"$id,$temp[1]"); } } fclose($fp); }
附上自己寫的不好的library
class Graph_fb { ######## 定義instance variable private $app_access_token; private $user_access_token; private $page_name; private $app_id; private $app_secret; public function __construct($config){ $this->app_access_token = $config['access_token']; $this->page_name = $config['page_name']; $this->app_id = $config['app_id']; $this->app_secret = $config['app_secret']; } /* 取得 fb app access token */ public function get_app_access_token(){ return (!empty($this->app_access_token))?$this->app_access_token:'Access has not been set!'; } /* 設定 fb app access token */ public function set_app_access_token($new_access_token=''){ $this->app_access_token = $new_access_token; } /* 取得粉絲團的英文名稱 */ public function get_page_name(){ return (!empty($this->page_name))?$this->page_name:'Page_name has not been set!'; } /* 設定粉絲團的英文名稱 */ public function set_page_name($new_page_name=''){ $this->page_name = $new_page_name; } /* 取得user access token */ public function get_user_access_token(){ return $this->user_access_token; } /* 設定user access token */ public function set_user_access_token($new_user_token = ''){ $this->user_access_token = $new_user_token; } /* 取得粉絲團相關資訊 */ public function get_page_info($identifier=''){ try{ $url='https://graph.facebook.com/'.$identifier; //echo $url; $page_info=file_get_contents($url); return $page_info; }catch(Exception $e){ return "error:".$e; } } /* 取得粉絲頁ID */ public function get_facebook_page_id(){ $page = json_decode(self::get_page_info($this->page_name)); return $page->id; } /* 取得粉絲頁所有相簿資訊 (page_id = 粉絲頁id) */ public function get_page_album_by_graph($page_id){ try{ $url='https://graph.facebook.com/'.$page_id.'/albums'; $page_info=file_get_contents($url); return json_decode($page_info); }catch (Exception $e){ return "error:".$e; } } /* 取得粉絲頁單一相簿內的所有照片 (fields = 要查詢的欄位,用逗號隔開) */ public function get_photo_in_album_by_graph($album_id,$fields=''){ try{ if($fields==''){ $fields = 'id,images,link,name,from,picture,height,source,album'; } $url='https://graph.facebook.com/'.$album_id.'/photos?fields='.$fields.'&access_token='.$this->user_access_token; $photo_info=file_get_contents($url); return json_decode($photo_info); }catch (Exception $e){ return "error:".$e; } } /* 根據粉絲團自己所上傳的照片相關資訊 */ public function get_photo_uploaded_by_graph($page_id){ try{ $url='https://graph.facebook.com/'.$page_id.'/photos/uploaded'; $page_info=file_get_contents($url); return json_decode($page_info); }catch (Exception $e){ return "error:".$e; } } /* 抓取此FB ID的大頭照 */ public function get_avatar($fb_id,$type="large"){ switch ($type){ case "large": case "small": return file_get_contents("https://graph.facebook.com/".$fb_id."/picture?type=".$type); break; default: return file_get_contents("https://graph.facebook.com/".$fb_id."/picture?type=large"); break; } } /*取得帳戶中的資訊與Access token(用來管理粉絲團)*/ public function get_accounts_info($fb_id){ $url = 'https://graph.facebook.com/'.$fb_id.'/accounts?access_token='.$this->user_access_token; $account_info = file_get_contents($url); return json_decode($account_info); } /*取得使用者的資訊*/ public function get_me(){ $url = 'https://graph.facebook.com/me?access_token='.$this->user_access_token; $me = file_get_contents($url); return json_decode($me); } /*取得常時間存活的token*/ public function get_long_lived_token($short_lived_token){ $url = 'https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&'. 'client_id='.$this->app_id.'&client_secret='.$this->app_secret.'&fb_exchange_token='.$short_lived_token; $long_lived_token = file_get_contents($url); return $long_lived_token; } }
Facebook 的 Graph API真的是蠻好上手的,難怪都沒人要寫中文的文件
不過還是記錄一下! 本篇使用CodeIgniter做為PHP Framework
Facebook 改版了,新版可以參考這篇:
回覆刪除http://goodjack.blogspot.tw/2017/08/how-to-get-facebook-permanent-page-access-token.html
感謝你 :D 這篇已經很久了 你寫的很淺顯易懂 感謝!
刪除