FacebookのTest Users APIをPerlで叩く

Facebookアプリで色々試す際に、自分のアカウントを使うと何かと不都合が起きるかも、というときに使える TestUser作成APIがある。
本家ドキュメント: Graph API Reference Test User /test-user - グラフAPI - 参考資料 - 開発者向けFacebook
解説記事いろいろ:
http://www.madin.jp/diary/?date=20110508
今日の出来事 : Facebookアプリテストユーザー作成方法
今日の出来事 : Facebookアプリテストユーザー作成方法〜実践編
フェイスブックの新 API でフェイスブックアプリのテストを自動化しよう。 - IT戦記


もちろんcurlとかで叩いても良いのだけど、試しにPerlからAPIを叩いたりしてみた。

ユーザ作成

Facebook開発者 - 開発者向けFacebookでアプリケーションを作成し、そのApp IDとApp Secretを下記のようにconfig.plに保存して、

return +{
    app_id => '***********',
    secret => '********************',
};

同じディレクトリで下記のようなスクリプトを書いて実行してみる。

#!/usr/bin/env perl
use strict;
use warnings;

use Furl;
use JSON::XS 'decode_json';
use URI;

my $furl = Furl->new;
my $uri  = URI->new('https://graph.facebook.com');
my $config = do 'config.pl';

# app access token
my $access_token = do {
    my $uri = $uri->clone;
    $uri->path('oauth/access_token');
    $uri->query_form(
        client_id     => $config->{app_id},
        client_secret => $config->{secret},
        grant_type    => 'client_credentials',
    );
    my $res = $furl->get($uri);
    die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;

    (split /=/, $res->content)[1];
};
# create user
my $user = do {
    my $uri = $uri->clone;
    $uri->path("$$config{app_id}/accounts/test-users");
    $uri->query_form(
        installed    => 'true',
        permissions  => join(',', qw/offline_access read_stream publish_stream/),
        method       => 'post',
        access_token => $access_token,
    );
    my $res = $furl->get($uri);
    die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;

    decode_json($res->content);
};

use Data::Dumper;
print Dumper $user;

実行するとこんなのが出てくる。

$ perl testuser.pl
$VAR1 = {
          'email' => 'pwyehrr_qinman@tfbnw.net',
          'password' => '224794716',
          'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=**********&n=**********',
          'access_token' => '**********|2.AQAPHTSS0NKd2J1n.3600.1309186800.0-**********|Mp4seeGZ9NAq5W0kkhD-soM0GFE',
          'id' => '**********'
        };

ダミーのユーザアカウントが作られ、その情報が返ってくる。login_urlにブラウザからアクセスすると、パスワード入力なくそのユーザとしてログインできる。

もう一回実行するとまた別のユーザが作られてその情報が返ってくる。

ユーザ取得

作成したユーザたちは以下のようにまとめてAPIから情報を取得できる。

#!/usr/bin/env perl
use strict;
use warnings;

use Furl;
use JSON::XS 'decode_json';
use URI;

my $furl = Furl->new;
my $config = do 'config.pl';
my $uri = URI->new('https://graph.facebook.com');

my $access_token = do {
    # 前述と同じなので省略
};
my $data = do {
    my $uri = $uri->clone;
    $uri->path("$$config{app_id}/accounts/test-users");
    $uri->query_form(
        access_token => $access_token,
    );
    my $res = $furl->get($uri);
    die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;
    decode_json($res->content);
};

use Data::Dumper;
print Dumper $data;
$ perl testusers.pl
$VAR1 = {
          'data' => [
                      {
                        'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=**********&n=**********',
                        'access_token' => '******************************',
                        'id' => '**********'
                      },
                      {
                        'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=**********&n=**********',
                        'access_token' => '******************************',
                        'id' => '**********'
                      },
                      {
                        'login_url' => 'https://www.facebook.com/platform/test_account_login.php?user_id=**********&n=**********',
                        'access_token' => '******************************',
                        'id' => '*********'
                      },
                    ]
        };

これらのアカウントを使って色々テストできる。

ユーザ同士の友達関係

これも専用のAPIがある。全員友達同士にしてみる。

#!/usr/bin/env perl
use strict;
use warnings;

use Furl;
use JSON::XS 'decode_json';
use URI;

my $furl = Furl->new;
my $config = do 'config.pl';
my $uri = URI->new('https://graph.facebook.com');

my $access_token = do {
    # 前述と同じなので省略
};

my $users = do {
    my $uri = $uri->clone;
    $uri->path("$$config{app_id}/accounts/test-users");
    $uri->query_form(
        access_token => $access_token,
    );
    my $res = $furl->get($uri);
    die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;
    decode_json($res->content)->{data};
};

for my $user (@{ $users }) {
    my @others = grep { $_->{id} != $user->{id} } @$users;
    for my $other (@others) {
        my $uri = $uri->clone;
        $uri->path("$$user{id}/friends/$$other{id}");
        $uri->query_form(
            method => 'post',
            access_token => $user->{access_token},
        );
        my $res = $furl->get($uri);
        die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;
        print "${$user}{id} -> ${$other}{id} done.\n";
    }
}


友達ふえた!

APIを叩いてみる

Facebook::GraphをつかってWallへの書き込みを試してみる。

#!/usr/bin/env perl
use strict;
use warnings;

use utf8;
use Facebook::Graph;
use Furl;
use JSON::XS 'decode_json';
use URI;

my $furl = Furl->new;
my $config = do 'config.pl';
my $uri = URI->new('https://graph.facebook.com');

my $access_token = do {
    # 前述と同じなので省略
};

my $users = do {
    # 前述と同じなので省略
};

for my $i (0 .. $#$users) {
    my $fb = Facebook::Graph->new( access_token => $users->[0]{access_token} );
    my $message = ('ほげほげ', 'ふがふが', 'ぴよぴよ')[$i % scalar(@$users)];

    my $post = $fb->add_post->set_message($message);
    $post = $post->to($users->[$i]{id}) if ($i > 0);
    my $res = $post->publish;

    printf "%s\n", $res->as_string;
}


できたっぽい。

ユーザ削除

要らなくなったテストユーザは最後に削除しておこう。

#!/usr/bin/env perl
use strict;
use warnings;

use Furl;
use JSON::XS 'decode_json';
use URI;

my $furl = Furl->new;
my $config = do 'config.pl';
my $uri = URI->new('https://graph.facebook.com');

my $access_token = do {
    # 前述と同じなので省略
};
my $users = do {
    # 前述と同じなので省略
};

for my $user (@$users) {
    $uri->path("$$user{id}");
    $uri->query_form(
        method => 'delete',
        access_token => $access_token,
    );
    my $res = $furl->get($uri);

    die sprintf '%d: %s', $res->code, $res->content unless $res->is_success;
    printf "%s\n", $res->content;
}

これでキレイさっぱりテストユーザたちが消える。