日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

FacebookもRSSとTwitterで使ってみる

以前、mixiの更新情報のRSS化( mixiからRSSを作るんだ )、Twitterの投稿のmixiボイスへの反映( Twitterからmixiボイスへ )に取り組んでいた。

これでそれなりにmixiを使ったコミュニケーションが成り立つようになった。

じゃあ、同じようなことをアカウント作って半ば寝かし状態のFacebookにも適用できないかなと格闘してた。


しかしFacebookのAPIというのは複雑だ。

Facebookの使い方もいろいろで、Facebook上でWebサービスを展開するものからデスクトップアプリまで想定される。

そんなわけでいろいろな種類のAPIがあるらしく、データを拾ってきたり投稿したりするのにいいAPIがわからん。

調べた結果、Graph APIが使いやすそうなので、これを例によってPerlから Facebook::Graph を導入して使うことにした。


まずApp登録をしないといけない。

しかしそれに先立ち、携帯電話番号かクレジットカード情報を登録しておく必要がある。

日本の携帯電話番号は登録できないっぽいし、クレジットカード番号を登録しておいた。登録したところで基本無料のはず。

とりあえずこれでApp登録ができるようになった。

Facebook Apps Dashboard

ここでCreate New Appsする。AppNameには適当な名前を入れればよいが、FacebookやFBに類する文字列が入ってはいけない。

打ち込んだらContinueすればAppが登録できるので、次に設定する。

ここで"Website with Facebook Login"をクリックして、適当なURLを入れる。別に http://localhost/ でもいい。

このURLを登録する意味は何なのかというと、この後、Webでユーザーが認証するのだが、認証後に指定したURLに飛ばされる。

その指定したURLはAppのWebサイトじゃないといけないようなので、適当に決めておく。以下 localhost を指定したことを想定して書く。


さて、ここで発行されたApp IDとApp Secretを使って認証を行うプログラムを書いた。

use Facebook::Graph;

my $fb = Facebook::Graph->new(
  app_id   => 'xxxx',
  secret   => 'xxxxxxxx',
  postback => 'http://localhost/',
);
my $uri = $fb->authorize->extend_permissions(qw(read_stream publish_stream))->uri_as_string;
print $uri,"\n";

これで得られたURLにアクセスすればいいわけだが、実はこのURLはわざわざプログラムを書かなくても規則的に生成できる。

https://graph.facebook.com/oauth/authorize?redirect_uri=http%3A%2F%2Flocalhost%2F&client_id=(App ID)&scope=read_stream%2Cpublish_stream&display=page

太字部分を必要に応じて書き換えればいい。

extend_permissionでいろいろ指定しているが、これはそれぞれAppに与える権限についてのもの。

read_streamはトップページの更新情報を見るのに、publish_streamは投稿に必要な権限で今回は必要。

アクセスして認証を行うとlocalhostに飛ばされる。このときリダイレクト先のURLを見ると、
http://localhost/?code=AQB0...J_9s#_=_ のようになっているが、このcode= から #までの間をコピーしておく。

これが認証結果で、これを使ってログインする。


では実際の投稿・RSS化のプログラムをPerlで書いた。

まずログイン部分を。

use warnings;

use utf8;
use XML::RSS;
use Facebook::Graph;

my $fb = Facebook::Graph->new(
  app_id   => 'xxxx',
  secret   => 'xxxxxxxx',
);
$fb->request_access_token('AQB0....J_9s');

さっきの認証結果を request_access_token に与えればOK。

ここまで来れば投稿は簡単で、

$fb->add_post->set_message($echo)->publish;

とちゃんと権限さえもらっておけば1行でできる。mixiボイスへの投稿と一緒にやるように足しておいた。

次にRSS化だが、

sub esc{
  my $m=pop;
  $m =~ s/&/&amp;/g; $m=~s/</&lt;/g; $m=~ s/>/&gt;/g; $m=~ s/\"/&quot;/g; $m=~ s/\'/&#39;/g;
  $m =~ s/\n/<br>/g;
  return $m;
}

my $frss= new XML::RSS('version' => '1.0');
$frss->channel('title'=>'Facebook RSS',link=>'https://www.facebook.com/','description'=>'');
$frss->add_module('prefix' => 'content','uri'=>'http://purl.org/rss/1.0/modules/content/');

my $home = $fb->fetch('me/home');
for(@{$home->{'data'}}){
  my $title = $_->{'story'} || $_->{'message'} || $_->{'caption'};
  my $body = '';
  my $desc = '';
  $body.='<img src="'.$_->{'picture'}.'"><br>' if($_->{'picture'});
  $body.=esc($_->{'caption'}).'<br>' if($_->{'caption'});
  if($_->{'description'}){
    my $d=$_->{'description'};
    $desc =$d;
    $body .= esc($d);
  }
  if($_->{'message'}){
    my $m=$_->{'message'};
    $desc = $m;
    $body.=esc($m);
  }
  $frss->add_item('title'      => '['.$_->{'type'}.'] '.$title ,
                 'link'       => $_->{'actions'}->[0]->{'link'}||($_->{'link'}.'#'.$_->{'id'}) ,
                 'description'=> $desc ,
                 'dc' => { 'creator' => $_->{'from'}->{'name'},
                           'date'=> $_->{'created_time'} },
                 'content' => {'encoded' => $body },
                );
}
$frss->save('fbrss.xml');

fetch('me/home')で更新情報が取ってこれる。

Graph APIで他に取ってこれるものは Graph API (Facebook Developers) を見ればわかる。

あとは得られたデータに即してRSS化している。


mixiのときに比べるとサンプルがわかりにくくて難儀したが、

Graph APIを使ってやるんだということがわかれば、わりにすんなり作れたかなという印象ではある。

あ、そうそう。これだけだと自分の投稿がLikeされたとかそういうのはわからないけど、こちらはもとよりRSSがある。

FacebookのYour notificationsのところにRSSのリンクがあるので、これを使えばLikeされたとかわかる。

そういうわけだから自分で作ったRSSで人の更新を見て、Twitterで投稿できて、NotificationsのRSSで自分の更新への反応が分かると。

うまいことできたんじゃないかなと思っている。


Author : Hidemaro
Date : 2012/06/09(Sat) 23:57
コンピュータ・インターネット | Comment | trackback (0)

Tools