最近ハマっているFriendFeedに今まではてなブックマークにクリップしたストックをコピーするPerlコードを書いてみました。問題なくコピーできましたので、そのスキームとコードを紹介しています。後々のフローをカットするという目的でFriendFeedへブックマークをコピーしておくといいですよ。
ここずっとFriendFeedにはまっています。毎日いろんな発見があって、いい刺激もらっていますw。そんなFriendFeedの魅力の一つに便利なSearch機能(FriendFeed - Advanced search)があります。今、自分のネットウオッチのスタイルがFriendFeedメインになっているということもあり、自分の関心ある話題についての記事クリップ(ブックマーク)もFriendFeedへ保存、検索して読み直しというフローにしています。
以前クリップした記事も便利なSearch機能で簡単に呼び出せるといったことから、今まではてなブックマークにクリップしていた記事をFriendFeedへコピーしようかと思い、Perlの勉強も兼ねて、コード書いてみました。問題なくうまくコピーできましたのでそのスキームとコードを紹介しておきます。コード間違いなどありましたら、ご指摘いただけると嬉しいです。
スキーム
はてなブックマークフィードAPIを使って、自分のブックマークフィードのRSSからストックしてある記事とURL、クリップした日付、タグを取り出します。はてなブックマークフィード仕様とは - はてなキーワード
そして、取り出したデータをCPANモジュールNet::FriendFeed - search.cpan.orgを使って、FriendFeedのアカウントへポストするといったフローになります。Net::FriendFeedの使い方はDoc見てもらえればわかると思います。(自分はエラー出力をどうやるのかわからないです。)他にFriendFeed API Doc http://friendfeed.com/api/documentation を読む必要があります。
グループを作成
FriendFeedでは自分で自由にグループを作成することができます。(プライベート・パブリック・認証タイプ。公開タイプについては自由に)
グループを作成して、そのアカウント(ニックネーム)にはてなブックマークのストックをコピーしていきます。(自分は後々の検索結果表示のことも考えて、プライベートにしました。)
グループへのポストは、PUBLISHING FUNCTIONS::Net::FriendFeed - search.cpan.org
publish_link($title, $link, $comment, [@images, [$imgN, $linkN]], $room, $via)を使って、$roomに自分の作成したグループのニックネームの値を渡すことでグループのアカウントへポストできるようになります。$titleはタイトル、$linkにURL、$commentは、ポストに対してコメントを入れることができますので、そのコメントにブックマークした日付とタグをハッシュタグにしてコメントつけてポストします。これで後々、読み直したときに他の関連クリップ一覧を簡単に表示できるようになります。
ついでにクリップした情報を読み直したときに、重要と思われるパラグラフ・フレーズをコピーして、再度コメントポストしておくことで再び読み直す時にページへ遷移する手間を省けくことができ、次回検索対象にも含まれます。後々のフローをカットすることができる思います。(これが今回の目的でもあります)
PerlコードでXMLの処理については、こちらのRSS(XML::Feed) - モダンなPerl入門 - モダンなPerl入門を参考に、あとはplaggerのFeedParserなどもちょっとみたりと。
(※モダンPerl入門、目次が更新されていませんが、いろいろと参考になるエントリーがありますよ。site:http://perl-users.jp/modules - Google 検索)
コード
ちょっと疑問点などありましたので、コードのなかに書いちゃっていたりしますw。
hateB2FriendFeed.pl gist: 182911 - GitHub
#!/usr/bin/perl
use strict;
use warnings;
use Net::FriendFeed;
use URI;
use XML::Feed;
use Encode;
use DateTime::Format::W3CDTF;
use Time::HiRes qw(sleep);
use Config::Pit;
use Data::Dumper;
my $config = pit_get("room_friendfeed.com", require => {
"username" => "coolniikou",
"password" => "your remotekey on friendfeed.com API" # https://friendfeed.com/account/api
});
my $room = 'nickname of room on FriendFeed';
my $hb_username = 'hatenaBookmark username';
my $root_api = 'http://b.hatena.ne.jp/'.$hb_username.'/rss?of=';
my $count = '0';
while ( $count < 110 ){ #maxの値は自分のストック数/20で
my $url = $root_api.20*$count;
my $feed = XML::Feed->parse( URI->new( $url ));
#warn Dumper($feed),"\n";
for my $item ( $feed->entries ){
my @comment;
my $title = $item->title;
my $link = $item->link;
my $date = DateTime::Format::W3CDTF->parse_datetime(
$item->{entry}->{dc}->{date});
push @comment, $date->strftime('%Y/%m/%d %H:%M:%S');
my $subject = $item->{entry}->{dc}->{subject};
if ( defined $subject ){ #この場合、definedなのかexistsなのかが疑問
if ( ref( $subject ) eq "ARRAY" ){
foreach my $tag ( @{ $subject } ){
$tag = "#".$tag;
push @comment,$tag;
}
} else {
my $tag = "#".$item->{entry}->{dc}->{subject};
push @comment, $tag;
}
}
my $comment = join(" ",@comment);
ffpost($title, $link, $comment, $room);
# warn $comment,"\n";
}
$count++;
}
sub ffpost{
my($title, $link, $comment, $room) = @_;
my @images;
my ($imgN, $linkN) = '';
use Net::FriendFeed;
my $ftf_anon = Net::FriendFeed->new;
my $ftf = Net::FriendFeed->new( {
login => $config->{username},
remotekey => $config->{password}
} );
#$ftf->publish_message($txt);
$ftf->publish_link($title, $link, $comment,[@images ,[$imgN,$linkN]], $room, 'Net::FriendFeed'); #実際、エラー処理でeval{}など使ったりするのかも疑問
sleep(15);
}
API アクセス制限
※APIアクセス制限で800ポストぐらいまでしかできませんでした。一度にコピーすることは無理みたいです。何日かに分けてコピーするといいですね。参照:Rate LimitingFriendFeed API - Application Guidelines
Errors
FriendFeed returns appropriate HTTP status codes for API requests. In addition to the HTTP status code, FriendFeed includes error information in the response body. Error responses have a single property,
errorCode, a program-readable string describing the error, e.g.:
{"errorCode":"body-required"}Some of the most common error codes include:
feed-not-found- Unrecognized feed id/usernameARG-required- The HTTP argumentARGis required for this request, e.g.,"body-required"limit-exceeded- Request limit exceededforbidden- User does not have access to entry, group or other entity specified in the requestunauthorized- The request requires authentication
FriendFeed API Documentationより引用:
参考リンク
- FriendFeed API Documentation
- http://friendfeed.com/api/documentation
- FriendFeed - リモートキー
- https://friendfeed.com/account/api
- Net::FriendFeed - search.cpan.org
- http://search.cpan.org/~kappa/Net-FriendFeed-0.91/lib/Net/FriendFeed.pm
FriendFeed Bot
作成してからちょっと時間が経っていますが、Net::FriendFeedを使ってBotも作ったりしていますw。Twitter Botと同じ機能ですが、Twitter グルメ情報返信ポットask go!go! (askgo) on Twitterの同じ内容でFriendFeed版もあります。Twitter 翻訳Bottranslate (asklang) on TwitterのFriendFeed版もあります。FriendFeed版はコメントにポストするといった形になります。詳細は、”@asklang help” ”@askgo help” でポストしてみてください。
FriendFeed版だと、メールで投稿でき、コメント受取るとメールでコメント内容の返信を受けれるようになります。Google,Amazon,ニワンゴなどが提供しているメール検索サービスと同じタイプで返信内容を受取ることができるというわけになります。参照:メールで FriendFeed、FriendFeed - 通知オプション




コメントする