ゆーすけべー日記の記事の影響か、自分のまわりで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は充実しているようなので色々やってみると面白いかも!