Facebookアプリなどのテストユーザを自動的に生成するための部分的サンプルコード

Facebookアプリを作ろうとしていると、自分のアカウントだけではテストしきれない場合が出てくる。フレンドに「ここちょっと見て、こうしたりああしたりして」というわけにもいかないわけで、このあたりは開発におけるジレンマであったりするだろう。と、言うほど私はFacebookアプリの開発には携わっていない。いやむしろこれから何かしら必要になってくるので知っておきたいのが、Facebookが用意している「テストユーザの作成と利用」である。

Googleで「Facebook テストユーザー」などと入れて検索すると、山のように情報が出てくるはずだ。その中でやはりしっかり書かれているのは本家の情報である。ただし英語だが。
英語はどうも……という方は、翻訳されたサイトなどを検索して参考にするのもよいが、その場合は最新版に更新されていない可能性があるので、覚悟して使おう。本家サイトを見ないことで、いくら実装しても期待通りの結果が得られないなどの場合もありうる。実際Facebookの仕様もいくつか変わっていて、古い記述のサイトと本家の最新版とを簡単に見比べただけでも、以下の違いが見つかった。

・テストユーザの最大個数は、かつてはFacebookアプリ1つにつき500ユーザが限界だったらしいが、現在は2000ユーザに拡張されている。
・アカウント作成に必要なアクセストークンは、かつてはAPPIDかAPP SECRET(シークレットトークン)のいずれかの指定であったが、現在は別途APP ACCESS TOKENというものを取得する必要がある。

他にもあるかもしれない。注意すべきである。そして上記の違いも、2013年3月24日現在であることを記憶されたい。

で、世の中に種々様々あって同じようなことが書かれているサイトと同じことを書いてもあまり意味はないので、ここでは私が実際にテストユーザの作成と管理をするために書いたPHPスクリプトについて書いてみたい。
なおこのテストユーザの自動生成についても、探せばウェブアプリで提供してくれているサイトもいくつもある。多くはソースコードは公開していないだろうが、Facebook開発者サイトの仕様に従ってコードを書いていけば、それほど難しいものではない。

なお私の場合、テストユーザを作った上で、既存のテストユーザすべてとフレンド申請・承認のフェーズを踏ませてフレンドがいる状態のテストユーザの作成を考えていたので、その部分のコードについても少し解説してみたい。

テストユーザーを作ると言っても、単にFacebook APIを叩けばいいだけなので、複雑なことは何もない。
解説しているサイトにも、特にコードを書かずともcurlやwgetなど、場合によっては通常のブラウザでテストユーザを作っている人もいるだろう。実際、それでも作れるわけで、何もコードを書いてゴニョゴニョしなくてもいいといえば、いい。

ただプログラムで自動処理すれば、単にクリックでユーザ作成を流せるので手間は省ける。一度プログラムを書いてしまえばあとは好きなだけ作ったり消したりすればいい、というだけだ(ただし2000ユーザまでしか作れないようだ)。

なおPHPコードは特にセキュアを念頭に書いているわけではないので、実際に使う場合には他のコードとのすり合わせも含めてセキュアになるよう注意する必要があるだろう。

まず、FacebookアプリのID(APPID)を用意する。このIDを使って、Facebookアプリとテストユーザを結びつける。
一応Facebook APIでは、作ったテストユーザを別のアプリにも割り当てる方法はあるようだが、ここでは特に解説しない。というか、やり方が分かれば特に問題なくできるだろう。

[php]
$appid = あなたのFacebookアプリのAPPID;
$secret = あなたのFacebookアプリのシークレットトークン;
$url = "https://graph.facebook.com/oauth/access_token?client_id=$appid&client_secret=$secret&
grant_type=client_credentials";
list($query, $app_access_token) = explode("=", @file_get_contents($url));
[/php]

1、2行目は自分のFacebookアプリに合わせてチューンする。自動作成サイトの場合、この2つを入力する欄がある。自前専用なら、ここはハードコーディングで問題はない。
3行目はGraph APIにアクセスしてFacebookアプリのアクセストークンを取得するためのURLだ。このGraph APIにアクセスすると、以下の形式で1行データがやってくる。file_get_contents()で返された文字列をexplode()を使って=で区切って$app_access_tokenに抽出している。以降、テストユーザ作成や削除にはこのIDを使う。

[text]
access_token=Facebookアプリのアクセストークン
[/text]

さて実際にここからテストユーザの作成となるわけだが、ちょっとだけ私の場合は工夫をしている。
というのも、新しく作成したユーザと既存のユーザとの間でフレンド申請・承認作業をさせたいわけだが、

新規ユーザ作成→全ユーザ情報取得→フレンド申請・承認作業

とやってしまうと、すでに既存ユーザ間で結ばれたフレンド関係を無視してフレンド関係性作業を実施してしまい、無駄である。数が増えればおそらく接続エラーになるだろう。
ということで、これを以下のように処理順を変えて、新規ユーザと既存ユーザとの間だけで処理が進むようにしている。

全ユーザ(既存ユーザ)情報取得→新規ユーザ作成→フレンド申請・承認作業

つまり、新規ユーザが全ユーザに含まれないよう予めユーザリストを作成しておき、そのあとに新規ユーザを作成してフレンド作業に入る、というわけだ。

ということで、以下ではまず全ユーザリストの作成をしている。

[php]
$all_count = 0;
$url = "https://graph.facebook.com/$appid/accounts/test-users?access_token=$app_access_token";
$jarr = @json_decode(file_get_contents($url), true);
foreach ($jarr["data"] as $a) {
foreach ($a as $k => $v)
${"all_".$k}[$all_count] = $v;
$all_delete[$all_count] = "https://graph.facebook.com/".$all_id[$all_count]."?method=delete&access_token=".$all_access_token[$all_count];
$all_count++;
}
[/php]

1行目はアカウント数カウンタ。count()を使えば配列数はすぐ取得できるし、配列添字もわざわざカウント値を指定せずともPHPなら「$var[] = “xxx”;」のようにすればよい。
ただしここでは、リスト取得と同時にテストユーザ削除用URLも作っているので、カウント値を指定している
2行目はアカウント取得用URL。
3行目でURLを呼び出している。出力はJSON形式でシリアライズされた配列がやってくるので、json_decode()と第2引数をtrueに設定して、PHPの連想配列に保存している。JSONのデータ構造は本家サイトでも説明されているが、

[text]
{
"data" [
{
"id": "1231….",
"access_token":"1223134…" ,
"login_url":"https://www.facebook.com/platform/test_account.."
}
{
"id": "1231….",
"access_token":"1223134…" ,
"login_url":"https://www.facebook.com/platform/test_account.."
}
]
}
[/text]

のようなレスポンスだ。1ユーザごとに3つのデータが得られる。ちなみにこれを$jarr配列変数で受けているが、これは以下のような3次元配列を扱うことになる。

[text]
$jarr[‘data’][0][‘id’]
$jarr[‘data’][0][‘access_token’]
$jarr[‘data’][0][‘login_url’]
$jarr[‘data’][1][‘id’]
$jarr[‘data’][1][‘access_token’]
$jarr[‘data’][1][‘login_url’]
        :
        :
[/text]

4~9行目で取得したテストユーザのデータを、要素別にそれぞれ配列に保存している。
4行目のforeach文は$jarr[‘data’]が持っている個別のユーザの配列([0], [1], [2]….)を$aに順番に取り出している。
5行目もforeach文だが、4行目で取り出した$a配列はさらに連想配列を擁しているので([‘id’], [‘access_token’], [‘login_url’])、キーと値の2種類をそれぞれ$kと$vに取り出している。
6行目は可変変数として、それぞれの値を種類別に保存している。つまり、ユーザごとに取得したIDやアクセストークンを、IDの配列、アクセストークンの配列などに入れなおす作業をしている。

「${“all_”.$k}[$all_count]」は、連想配列のキー($k)を格納する配列の名前の一部として使い、$all_countを添字とした配列であることを意味している。
たとえば$jarr[‘data’][0]という配列の場合、6行目のループでは以下のような意味になる。$jarr[‘data’][0][‘…’]の値は、実際には6行目では$vに保存されているので、$vを右辺に指定している。

[text]
$all_id[$all_count] = $jarr[‘data’][0][‘id’];
$all_access_token[$all_count] = $jarr[‘data’][0][‘access_token’];
$all_login_url[$all_count] = $jarr[‘data’][0][‘login_url’];
[/text]

7行目は削除用のURLを合わせて作っている。削除の指定はアクセストークンと「method=delete」をクエリー文字列に指定していればよい。
8行目はカウンターを1つ進めている。

そして、ようやくテストユーザの新規作成に入る。

[php]
for ($i = 0; $i < $count; $i++) {
$username[$i] = "TESTUSER" + $i;
$name = urlencode($username[$i]);
$url = "https://graph.facebook.com/$appid/accounts/test-users?installed=true&name=$name&locale=ja_JP&permissions=read_stream&method=post&access_token=$app_access_token";
$jarr = @json_decode(file_get_contents($url), true);
if (!empty($jarr))
foreach ($jarr as $k => $v)
${$k}[$i] = $v;
}
[/php]

1行目は$count変数で指定された数だけ処理を繰り返す。つまり、$count個の新規テストユーザを作る。GETやPOSTでパラメータをもらうか、ハードコーディングで指定するかは実装次第だろう。
2行目はテストユーザの名前を付けている。これは適当な文字列を指定していればよいだろ。
3行目は念のためURLエンコードを掛けている。これが必要かどうかはちょっと正直分からない。
4行目でURLを指定し、5行目でAPIにアクセスしている。例によってJSONでレスポンスがあるので連想配列に詰めなおすようにしている。
6行目で、配列変数が空でなければ…というお粗末な処理をかましている。実際には空じゃなくてもJSONでエラーレスポンスがあることもあるので、これを処理するように実装するほうが望ましい。
7行目では、先ほどの全テストユーザ取得のときのようにforeach文を使って展開しているが、今回は1ユーザ分だけのデータなので、JSONレスポンスは以下のような形になっているため、foreachは1回だけ使えばいい。

[text]
{
"id": "1234…",
"access_token":"1234567…" ,
"login_url":"https://www.facebook.com/platform/test_account…"
"email": "example…@tfbnw.net",
"password": "1234…"
}
[/text]

これで$id[]、$access_token[]、$login_url[]、$email[]、$password[]という5つの配列が作成される。

ここまでで、既存テストユーザの一覧と新規テストユーザの一覧がそれぞれ作成できた。
いよいよ、それぞれをフレンドで結びつける作業である。

[text]
for ($i = 0; $i < count($id); $i++) {
$id_a = $id[$i];
$at_a = $access_token[$i];
for ($j = 0; $j < $all_count; $j++) {
$id_b = $all_id[$j];
$at_b = $all_access_token[$j];

$url = "https://graph.facebook.com/$id_a/friends/$id_b?access_token=$at_a&method=post";
@file_get_contents($url);

$url = "https://graph.facebook.com/$id_b/friends/$id_a?access_token=$at_b&method=post";
@file_get_contents($url);
}
}
[/text]

1行目のfor文は、新規作成テストユーザの数だけループする。$count数だけ回しても同じことではあるが、一応取得したデータ数でループを設定している。
2、3行目はそれぞれ新規ユーザのIDとアクセストークンを変数に保存している。これから、すべての既存ユーザとフレンド関係を成立させる。
4行目のfor文は、既存のテストユーザ数だけループする。このループ中で、新規ユーザとのフレンド関係を成立させる処理を書く。
6、7行目は既存テストユーザのIDとアクセストークンを取得する。
9、10行目で$id_aのユーザ(新規ユーザ)から$id_bのユーザ(既存ユーザ)にフレンド申請が発行されれる。
12、13行目は逆に$id_bのユーザから$id_aのユーザにフレンド承認を発行するという処理になる。
なおここでもエラー処理はしていないが、10、13行目のfile_get_contents()では成否によってtrue/falseのいずれかがレスポンスされるので、本来であればしっかりチェックするべきであろう。

基本的な処理は、こんな感じである。
ところで実際にテストユーザを使うにはどうするかというと、ユーザ情報のレスポンス中にある「login_url」というのがあるので、これにそのままアクセスするとそのユーザでログインして利用することができるという仕組みだ。

当然だが、配列の中身はそのままHTML中で出力できるので、表形式で出力してワンクリックで削除やアクセスができるようにするとか、CSV形式で吐き出すなどの処理を適宜加えれば使いやすくなるだろう。

Facebook Perfect Guide Book 2013年改訂版これ1冊で完全理解facebook改訂版 (日経BPパソコンベストムック)Facebookバカ  友達を365日たのしませる男の活用術フェイスブックが危ない (文春新書)Facebookのトラブルをキッチリ解決する本

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください