「Open Graphに触れる 2:ユーザ認証と権限の認可」ではAuthダイアログを用いたユーザ認証と権限認可について紹介しました。今回は、そこで許可された権限を用いて、ユーザ自身のウォールにステータス投稿や画像投稿を行う方法を紹介します。
テストユーザを作成する
Facebookは実名で1個だけアカウントを作るよう強制しているため、アプリのテスト用にサブアカウントを作成することができません。かと言って自分自身のウォールを利用して投稿を試していたりすると、連投し過ぎてスパム認定されてしまうこともあります。そのため、アプリからユーザのウォールに投稿したり、その投稿が友だちからどう見えるかを試すには、アプリ専用のテストユーザの作成と、テストユーザ同士の友だち関係の作成が必要となります。アプリ専用のテストユーザであれば、試しに連投してしまってもスパム認定されることもありません。詳細や利用上の制限などは、Test Usersドキュメントの和訳をご覧ください。
ここでは大まかな流れとして、以下の2種類の方法を紹介します。
管理画面から作成する
まず、「Open Graphに触れる 2:ユーザ認証と権限の認可」で作成したアプリの管理画面に行きます。「設定を編集」を選択します。左に設定メニュー一覧が現れるので「権限」を選択します。
User & Friend PermissionsやExtended Permissionsといった入力欄が現れます。要求する権限(パーミッション)の種類によってこの項目を使い分けるのですが、今回はユーザ自身のウォールへの投稿のため、User & Friend Permissionsの欄にpublish_actionsと入力して保存します。アプリ管理画面からテストユーザを作成する場合、作成されるユーザは、ここに入力した権限を許可した状態で作成されます。
なお、権限の種類と区分の詳細は、Permissionドキュメントの和訳をご覧ください。
保存したら、左ナビゲーションにある「開発者の役割」ページを選択します。下の方にある「テストユーザー」の項目の「作成」をクリックします。
作成用のダイアログが開き、作成するテストユーザの数、権限を認可した状態で作成するか、リアルタイムフィードを有効にするか、18際未満かなどの選択肢が表示されます。ここでは「Number to Create」に2を入力し、Authorize this Appをチェックします。これで、権限を認可した状態(Authダイアログを完了した状態)のユーザを2人作成できます。
「作成」をクリックするとテストユーザが作成され、以下のキャプチャのようにユーザが追加されます。
右にある「変更」をクリックするとテストユーザの一覧が現れるので、両方のアカウントをチェックして「Make Friends」をクリックします。
これで、テストユーザ2人と、それらテストユーザ同士の友だち関係を作成できました。
もう一度「開発者の役割」ページに戻って、「切り替える」を選択すると、作成したテストユーザでのログイン状態に切り替わります。
この状態で友だち一覧を見れば、もう一方のテストユーザが友だちになっていることが分かります。
APIで作成する
テストユーザをGraph APIを使用して作成することも可能です。この場合、まずはアプリ管理用のアクセストークンを取得し、そのトークンを用いてアプリ専用のテストユーザを作成することになります。アプリ管理画面から作成する方が手軽な反面、Graph APIを通じて作成する方が細かにカスタマイズできます。例えば、どの権限を許可した状態のユーザを作るか細かく指定できるため、Authダイアログで要求する権限のうち一部だけを許可したユーザを作成するなどが可能です。アプリのアクセストークンを取得する
アプリ設定画面のアプリIDとシークレットキーを見つつ、以下の要領で取得できます。
curl -X GET \返される値は以下の通りです。
'https://graph.facebook.com/oauth/access_token?client_id=1234567890&client_secret=XXXXXXXXXXXXXXXXXXX&grant_type=client_credentials'
access_token=1234567890|ku1NaUQ_XXXXXDDEEEEEEEEこの値がアプリ用のアクセストークンとなります。
Graph APIでのテストユーザ作成
取得したアクセストークンを用いてユーザを作成します。エンドポイントは /APP_ID/accounts/test-users となります。このとき、installedはアプリを認可済か否か、permissionsは認可するパーミッションを指します。今回の場合、アプリを利用中のユーザなのでinstalled=true、ウォール投稿を試したいのでpublish_actions=publish_actionsを指定します。curl -X POST \返り値は以下の形式です。
-F 'installed=true' \
-F 'permissions=publish_actions' \
-F 'access_token=1234567890|ku1NaUQ_XXXXXDDEEEEEEEE' \
https://graph.facebook.com/1234567890/accounts/test-users
{ここで返されたemailとpasswordを用いて、facebook.comのログイン画面からテストユーザとしてログインすることもできますし、login_urlをブラウザのアドレスバーに直接入力してログインすることもできます。
"id":"10000111111111",
"access_token":"YYYYYYYYYYYYYYYYYYY",
"login_url":"https://www.facebook.com/platform/test_account_login.php?user_id=10000111111111&n=JgDChysa",
"email":"khsmpyd_baowitz_22222222\u0040tfbnw.net",
"password":"516144431"
}
この手順を2回繰り返すことで、テストユーザを2人作成します。
Graph APIでテストユーザ同士を友だちにする
テストユーザ同士であれば、APIで友だち申請とその承諾ができます。形式は以下の通りです。curl -X POST \これで、USER1からUSER2に対して友だち申請を送ることができます。その後、USER1とUSER2を入れ替えてもう一度実行することで、申請は承諾されて友だち関係が成り立ちます。
-F 'access_token=USER1_ACCESS_TOKEN' \
https://graph.facebook.com/USER1_ID/friends/USER2_ID
実際には以下のようになります。申請も承諾も、成功した場合の返り値はtrueです。
curl -X POST \
-F 'access_token=YYYYYYYYYYYYYYYYYYY' \
https://graph.facebook.com/10000111111111/friends/10000111111112
curl -X POST \
-F 'access_token=ZZZZZZZZZZZZZZZZZZZ' \
https://graph.facebook.com/10000111111112/friends/10000111111111
Facebook::OpenGraphを使う
拙作のFacebook::OpenGraphは、既存のFacebook::Graphよりも手軽に新機能(最近だとfield extensionやbatch requests)や仕様変更(各Open Graphオブジェクトの型変更など)を試せるようにしたいという考えから作ったものです。新機能や仕様変更の試しやすさに重点を置いているため、それに欠かせないテストユーザ作成の機能も実装されています。以下のように、create_test_usersメソッドに対して各テストユーザの設定を配列で渡します。内部的にはバッチリクエストという機能を使っているので、複数テストユーザの作成であっても1度のHTTPリクエストで済ませることができます。
#!/usr/bin/env perl
use warnings;
use strict;
use lib 'lib';
use Facebook::OpenGraph;
use Data::Dumper;
my $fb = Facebook::OpenGraph->new(+{
app_id => 111111111111111, # アプリケーションID
secret => 'aaaaaaaaaaaaaaaaaaaaaaaa', # アプリのシークレットキー
});
$fb->set_app_token; # アプリのアクセストークンを取得、セット
my $res = $fb->create_test_users([
+{ # ユーザ1の設定
installed => 'true', # アプリを認可した状態
permissions => [qw/publish_actions/], # 認可したパーミッションはpublish_actionsのみ
locale => 'en_US', # ガイジン
},
+{ # ユーザ2の設定
installed => 'true', # アプリを認可した状態
permissions => [qw/publish_actions email read_stream/], # 認可したパーミッションは3つ
locale => 'ja_JP', # ちょんまげ
}
]);
warn Dumper $res;
__END__
返り値は以下のようになります。これで、2つのテストユーザが作成されました。$VAR1 = [ {
# ユーザ1
'email' => 'szmlpoe_shepardsen_1234123@tfbnw.net', 'password' => '1234566', 'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=
10000509494567
&n=Sg6K0r1zDhvG4hw', 'access_token' => 'AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh', 'id' => '10000509494567' }, {
'email' => 'uvjffnp_qinberg_1234123412@tfbnw.net', 'password' => '432532452', 'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=
# ユーザ2
10000508033123
&n=tvVBoHap3xqIxvN', 'access_token' => 'AAAD8v8zXn9oBADFSDFcavklajdraDFDSDF', 'id' => '10000508033123' } ];
その後は、それぞれのユーザIDとアクセストークンから友だち関係を設定します。
$fb->{access_token} = 'AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh'; # ユーザ1のトークン
my $res1 = $fb->post(
sprintf('/%s/friends/%s', 10000509494567, 10000508033123), # ユーザ1からユーザ2に友だち申請
);
warn Dumper $res1;
# $VAR1 = {
# 'success' => 'true'
# };
$fb->{access_token} = 'AAAD8v8zXn9oBADFSDFcavklajdraDFDSDF'; # ユーザ2のトークン
my $res2 = $fb->post(
sprintf('/%s/friends/%s', 10000508033123, 10000509494567), # ユーザ2がユーザ1の友だち申請を承諾
);
warn Dumper $res2;
# $VAR1 = {
# 'success' => 'true'
# };
これで友だち関係の作成まで完了です。
与えられたパーミッションを確認する
ユーザがアプリに対して認可したパーミッション一覧を取得する方法は以下の2つです。ユーザのアクセストークンで/me/permissionsにアクセス、もしくはアプリのアクセストークンで/USER_ID/permissionsにアクセスすることになります。
ユーザのアクセストークンは有効期限が定められているのに対し、アプリのアクセストークンには有効期限がないことを考えると、アプリのトークンを用いる場合の方が楽かもしれません。
curl -X GET \
'https://graph.facebook.com/me/permissions?access_token=USER_ACCESS_TOKEN'
curl -X GET \返り値は以下のようなJSONです。
'https://graph.facebook.com/USER_ID/permissions?access_token=APP_ACCESS_TOKEN'
{ "data": [ { "installed": 1, "publish_actions": 1 } ], "paging": { "next": "https://graph.facebook.com/Facebook Platformが提供する全部のパーミッションを許可しても5000件を越えることはないので、pagingは無視して問題ありません。 installedはアプリを認可しているか否か、他のpublish_actions:1などは、パーミッション名と認可済か否かを示します。このサン プルの場合、publish_actionsが認可されているので、このユーザの代理としてウォール投稿できることが分かります。10000509494567
/permissions?access_token=AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh
&limit=5000&offset=5000" } }
本番環境では、ユーザ自身がfacebook.com上の管理画面から認可を取り消してしまうこともあるので、ログイン時や、設定画面で機能のOn/Off切り替え時などに適宜チェックしましょう。
ウォール投稿する
方法
アプリからのウォール投稿で最も一般的なのは、リンク付きの投稿でしょう。その場合、投稿方法は以下のようになります。ここでは、先ほど作成したユーザ1のアクセストークンを用いています。messageは投稿時の文言、linkは投稿するURLです。
curl -X POST \返り値は作成されたウォール投稿のオブジェクトIDとなります。
-F 'access_token=AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh' \
-F 'message=要チェック' \
-F 'link=http://facebook-docs.oklahome.net' \
https://graph.facebook.com/me/feed
{"id":"10000509494567_131408663691711"} # USER_ID _ 投稿IDテストユーザ作成時に発行されたログインURL、もしくはメールアドレス+パスワードを利用してログインすれば、そのユーザのウォールに対して投稿されていることが分かります。
また、このテストユーザと友だち登録したユーザでログインすれば、ニュースフィードに投稿が流れてくるのを確認できます。
ユーザ1の作成はlocale=ja_JPを指定したので日本語インターフェイスになっているのに対し、ユーザ2の作成ではlocale=en_USだったために英語インターフェイスになっています。
Facebook::OpenGraphを使う
#!/usr/bin/env perl use warnings; use strict; use lib 'lib'; use Facebook::OpenGraph; use Data::Dumper; my $fb = Facebook::OpenGraph->new(+{ app_id =>
111111111111111
, # アプリケーションID secret => 'aaaaaaaaaaaaaaaaaaaaaa', # アプリのシークレットキー }); # ウォール投稿はアプリのアクセストークンでも可能 # 有効期限のチェックが不要なので、アプリのトークンをセットして使っている $fb->set_app_token; my $res = $fb->publish( '/
10000509494567
/feed', # /me/feedの代わりにユーザIDを指定。 +{ link => 'http://facebook-docs.oklahome.net/', message => '要チェック', } ); warn Dumper $res; # $VAR1 = { # 'id' => '
_201079000035929' # }; __END__
10000509494567
画像を投稿する
方法
画像投稿の際のエンドポイントは /USER_ID/photos となります。今回の場合はユーザのアクセストークンが必須となり、アプリのトークンで投稿しようとすると、以下のようなエラーが返されます。
{"error":{"message":"A user access token is required to request this resource.","type":"OAuthException","code":102}}sourceにはファイルのパス、messageにはウォール投稿時と同様に投稿時の文言を指定します。
curl -X POST \
-F 'source=@/path/to/file.png' \
-F 'access_token=AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh' \
-F 'message=Facebook メッセンジャー!' \
https://graph.facebook.com/me/photos
返り値は以下のようになります。
{"id":"104219756424742","post_id":"10000509494567_104219509758100"}テストユーザのタイムラインを開くと、画像が投稿されているのが分かります。
この際、特に投稿先のアルバムを指定していないため、アプリ名+Photosという名前のアルバムが作成され、そこに画像は投稿されます。
Facebook::OpenGraphを使う
Facebook::OpenGraphの場合、sourceパラメータが指定されていれば、画像もしくは動画の投稿と判断してcontent-typeを適切に変更します。また、動画の投稿( /OBJECT_ID/videos )であれば、自動的に投稿先ドメインをgraph-video.facebook.comへ置き換えます。my $fb = Facebook::OpenGraph->new(+{
access_token => 'AAAD8v8zXn9oBAKASdfasfAFSdeSDFDgrehtrsh', # ユーザのアクセストークン
});
my $response = $fb->publish(
'/me/photos',
+{
source => './t/resource/sample.png', # ファイルのパス
message => 'Facebook メッセンジャー!' # 投稿メッセージ
}
);
まとめ
今回は、「Open Graphに触れる 2:ユーザ認証と権限の認可」で取得した権限を使って、ユーザ自身のウォールに投稿したり、画像を投稿する方法を紹介しました。その過程で、テストユーザの作成方法や、与えられた権限の確認方法なども紹介しましたが、これらはFacebookアプリを開発する上でとても重要なものです。テストユーザの利用は、アプリをスパムアカウント認定されないためにも重要ですし、面倒くさがって自分の本アカウントを使っているうちに誤投稿するのを防げます。また、与えられた権限の確認は、必要な権限を与えられていない場合は「FBに投稿」のボタンを隠すなど、ユーザの混乱をなくす上でも重要ですので、これらの機能も是非活用してみてください。