Tutorial
この記事の読了時間:約6分20秒
仕様がコロコロ変わる割にドキュメントが間に合ってないと評判の Facebook API 周りですが、先日どうしてもイジらざるを得なくなり、最新版SDK v5を使って自動投稿機能を実装した時の猟奇的紆余曲折。
そもそも公式のgithub SDK for PHP のページすらv4って書いておきながら中身はv5だし。
読めない英文を頼りに辿り着いた軌跡の果て、言葉を持たない血液はただ静かに憤怒の火を宿すのでした。
、、、などと意味不明な供述をしており(r
あ、ちなみに今回の方法はComposerなど使わず、漢一貫直接ダウンロード&アップロードでいきます。
なので、なにはともあれFacebook SDK v5 for PHPをダウンロードしませう。
これを解凍して、中の「src」フォルダ以下をテキトーなディレクトリにアップ。じゃー仮に /settings/ の中に src フォルダごと入れましょーかね。
次に、facebook for developersに行って、使うアプリの「App ID」「App Secret」をGETしときましょ。
まだアプリ登録してないずら!って場合は、この記事やこの記事のように先人の知恵を借りつつ、事前にやっときましょう。
上記を参考に「Access Token Tool」に行って、使うアプリの Extend Access Token(期間の長いアクセストークン)を取りましょう。別にフツーの寿命のトークンでもいいけど。
なお、アクセストークン取るときのパーミッションに manage_pages を含めると、Extend Access Token が有効期限無制限のトークンとして取れるので、今回はページに使うしこれで行く。
ひとまずこれで下準備の第一弾はOK。
え、第一弾?
いくら上記のように「そのページのauthorとして」トークンを作っても、実際にページに投稿するにはページ用のトークンが別途必要になります。
これだからFBはめんどくせー。。。
なので続いては、テストページを作って一回SDKからログインして、ページに投稿するためのトークンを取得します。
下記をコピってIDやらsecretやらautoload.phpのパスを適宜修正してサーバにアップしてみんちょ!
<?php session_start(); // 用意したアプリのApp ID define('MY_APP_ID', 'xxxxxxxx'); // 用意したアプリのApp Secret define('MY_APP_SECRET', 'xxxxxxxxxxxxxxxx'); // autoload.phpの場所(パス)を記載 require_once __DIR__ . '/Facebook/autoload.php'; $fb = new Facebook\Facebook(array('app_id' => MY_APP_ID, 'app_secret' => MY_APP_SECRET, 'default_graph_version' => 'v2.5')); $helper = $fb->getRedirectLoginHelper(); if(isset($_GET['code'])){ try { $access_token = $helper->getAccessToken(); } catch(Facebook\Exceptions\FacebookResponseException $e) { echo 'Graph returned an error: ' . $e->getMessage(); exit; } catch(Facebook\Exceptions\FacebookSDKException $e) { echo 'Facebook SDK returned an error: ' . $e->getMessage(); exit; } if (isset($access_token)) { var_dump($fb->get('/me/accounts', $access_token)); } } else { $this_url = (empty($_SERVER['HTTPS'])?'http://':'https://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; $permissions = array('manage_pages', 'publish_pages'); $login_url = $helper->getLoginUrl($this_url, $permissions); echo '<a href="' . $login_url . '">Log in with Facebook!</a>'; }
と、設定間違ってなければ制作アプリたちの名前(name)やページID(id)やページ投稿用トークン(access_token)が表示されますので、使うアプリの「access_token」の文字列をコピー!こぴー!
これで準備万端!ページに投稿できるように!
<?php define('MY_APP_ID', 'xxxxxxxx'); define('MY_APP_SECRET', 'xxxxxxxxxxxxxxxx'); define('MY_APP_TOKEN', 'xxxxxxxxxxxxxxxxxxxxxxxx'); require_once __DIR__ . '/Facebook/autoload.php'; $fb = new Facebook\Facebook(array('app_id' => MY_APP_ID, 'app_secret' => MY_APP_SECRET, 'default_graph_version' => 'v2.5')); $post_data = array( 'name' => 'リンク名', 'link' => 'リンク先URL', 'picture' => '画像URL', 'caption' => '説明文', 'description' => '詳細文', 'message' => '投稿メッセージ本文', ); try{ $fb->post('/me/feed', $post_data, MY_APP_TOKEN); } catch(FacebookApiException $e) { echo 'API returned an error: ' . $e->getMessage(); exit; }
でっきたっかなーー☆
コレに比べてTwitterのわかりやすさよ。。
関連する記事
同じカテゴリーの記事
smkn より:
2017/07/24 10:10 AM
>kan 様
ご覧頂きありがとーございます!
ざっくり概要のみのご説明となりますが、$fb->get(‘/me/accounts’, $access_token) で取得したデータにオブジェクトで各ページのデータが入ってるとして、それまずを変数に入れといて、各オブジェクトをループで回しながら name=ページ名 value=トークン って感じのselectboxを生成します。
何かが選択されたらそれを受け取ってテキトーな変数に入れて、define(‘MY_APP_TOKEN’, ‘xxxxxxxxxxxxxxxxxxxxxxxx’) の代わりに使えばイケるんじゃないかと。
がんばってくださいねー!!!
kan より:
2017/07/24 12:13 PM
早速の返信有難うございます。
PHPを只今勉強中の初心者です。データを受け取ってfoeachやfor文でループを回す部分については、お教え頂いたもので理解できました。有難うございます。
しかし、Facebook APIコールから帰ってくるデータ(json形式)の扱いがあまり理解できなく困っております。APIから帰ってくる[“body”:protected]=>の中から「access_token」や「id」を取得する場合はどのような処理が必要でしょうか。
あまりにも稚拙なご質問で大変申し訳ございません。自分でfacebook API関連のサイトを調べて見ましたがよくわからなくご質問させて頂きました。
宜しければ、ご教示頂ければと思います。
何度もご質問して申し訳ございません。
宜しくお願い致します。
kan より:
2017/07/24 2:32 PM
取得したデータをgetDecodedBody()でデコードすることで無事に希望する動きを実現できました。
ご迷惑をお掛け致しました。
smkn より:
2017/07/24 2:37 PM
>kan様
おめでとーございます!
Facebookは仕様がコロコロ変わるので、突然接続できなくなったり謎のエラー吐いてくたばったりしますが、負けずに頑張っていきましょー!!
kuny より:
2017/07/30 3:43 PM
ページのアクセストークンの取得方法がわからなかったので、助かりました。
ありがとうございます。
smkn より:
2017/07/31 10:19 AM
>kuny 様
お役に立ててなによりですー!
今後とも、何卒ごひいきに♪
kan より:
2017/07/24 9:54 AM
「Facebook SDK v5 for PHPを使ってFacebookページに自動投稿する方法」を参考にさせて頂き、自サイトに実装させて頂きました。
ご質問があるのですが、$fb->get(‘/me/accounts’, $access_token)で取得したデータに複数の管理facebookページがある場合に、selectbox等で選択させてどのfacebookページに投稿させるか判別させたいと考えております。
私自身が知識がないため、取得したデータの取り扱いがいまいちわからない状況です。
お手数ではございますが、ご教授頂けないでしょうか。
宜しくお願い致します。