Facebook APIを叩いてみる

ゆーすけべー日記の記事の影響か、自分のまわりでFacebookやり始める人が増えてきました。
なんか面白いことできないかなーと手始めにFacebook APIを使って全裸bot的な何かを作ってみようかと思ってやってみました。


サードパーティアプリの作り方、使い方などはここを参照。
Facebook Developer Documentation - 開発者向けFacebook


PerlのモジュールはWWW::Facebook::APIってのがあったのだけど使い方がよくわからなかったのでFacebook::Graphってのをつかってみました。
http://search.cpan.org/~rizen/Facebook-Graph-0.0705/lib/Facebook/Graph.pm


まずはアプリの登録からですね。
このへんからゴニョゴニョと入力してアプリを登録します。
Application IDとかApplication Secretとかが発行されます。
Site URLには"http://localhost:5000/"とかを書いておいて、

#!/usr/bin/env perl
use strict;
use warnings;
use Plack::Request;
use Facebook::Graph;

my $fb = Facebook::Graph->new(
    postback => 'http://localhost:5000/',
    app_id   => '******************',
    secret   => '******************',
);
my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);

    if (my $code = $req->param('code')) {
        $fb->request_access_token($code);
        return [ 200, [], [$fb->access_token] ],
    }
    else {
        my $res = $req->new_response;
        $res->redirect(
            $fb->authorize->extend_permissions('publish_stream')->uri_as_string
        );
        return $res->finalize;
    }
};

てな具合のpsgiファイルを書いて、plackupします。localhost:5000にアクセスすると認証ページにリダイレクトされ、認証すると戻ってきて取得したaccess_tokenを表示します。こんなかんじでaccess_tokenをゲット。


このaccess_tokenを使って、APIを叩いてfriendsな人たちの情報を取得したりmessageをPOSTしたりできるようです。

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

use Facebook::Graph;
use List::Util 'shuffle';
use Zenrizer;
use utf8;

my $token = '************************************************';
my $fb = Facebook::Graph->new(access_token => $token);

my $zenrizer = Zenrizer->new;
for my $data (shuffle @{ $fb->fetch('me/home')->{data} }) {
    my $text = $zenrizer->zenrize($data->{message});
    next unless $zenrizer->zenrized($text);

    $fb->add_post->set_message("$data->{from}{name}が全裸で言った: $text")->publish;
    last;
}

たとえばこんなテキストを全裸に改変するものを用意しておいて、上記のようなスクリプトを実行すると、friendsの発言を拾って全裸にして再POSTする、全裸botのようなことができるみたいです。


APIからpublishする際は、認証する時点でextend_permissions('publish_stream')をつけておかないと取得したaccess_tokenをつかってpublishしようとしても拒否されてしまったりするので注意。このへんは以下を参照。
リファレンス - Facebookログイン - 参考資料 - 開発者向けFacebook


まだまだあんまり試してないけど、それなりにAPIは充実しているようなので色々やってみると面白いかも!