TwitterのRSSからはてなダイアリーに投稿してしまうPla!

毎度おなじみ,Plaggerですが,今回はとりあえずできた程度のモジュール. TwitterのRSSを取得して,はてなダイアリーの見出しとして投稿してしまいます. こうすることで,はてダのキーワードと検索が使えるので何かと便利かも. 言及したキーワード一覧なんかは,自分がよくどんなことをしゃべってるのか 見ることができておもしろいと思います.というわけでできあがりのはてダは こちら.

riywoのつぶやき riywoのつぶやき

Plagger::Plugin::Publish::Twitter2HatenaDiary

本当は,FilterとPublishに分離すべきものなのですが,デフォルトの Publish::HatenaDiaryだとテンプレート使ってるのでちょっと嫌な感じです. なので,テンプレート使わずにそのまま投稿するだけの Publish::HatenaDiarySimpleを作ればいいのですが,面倒だったので 一緒にFilterの役目もくっつけてしまいました.余力があればあとでちゃんと 分離したいと思います.

要点は,はてダへの投稿に関してはPublish::HatenaDiaryのマルパクリですが, どうやらtitleというものを見出しにしてくれるようなので,ここに以下の フォーマットでTwitterのポストを書き込みます.

[http://twitter.com/riywo/statuses/*********:title=12:32] てすとてすとー

これははてダ記法で,投稿時間にステータスへのリンクを貼ってくれます. ただ,問題だったのが投稿時間です.Twitterの設定でGMT+9:00を指定しているのに なぜか反映されていません.英語にしてるからかな?ともかくそれが 嫌なので,DateTimeモジュールなどを使いながら,ソースの中で無理矢理+9:00して しまっています.この辺も要変更ですが,自分用なのでまぁ動けばいいやw

あと,TwitterのRSSだと改行の含まれるポストがそのまま流れてくるので, 改行を消してやらないといけません.これは以前作ったFilter::TwitterQuoteでも 起こりうるので,そっちも修正しました.正規表現べんりー.

あとはいつも通りこれをcronで回してやれば終わり.やたー! ソースはいつも通りgithubに上げていますので,git使う人はそちらからどうぞ.

lib/Plagger/Plugin/Publish/Twitter2HatenaDiary.pm

package Plagger::Plugin::Publish::Twitter2HatenaDiary;
use strict;
use base qw( Plagger::Plugin );

use Encode;
use WWW::HatenaDiary;

use DateTime;
use DateTime::Format::HTTP;
use DateTime::TimeZone;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'plugin.init' => \&initialize,
        'publish.init' => \&publish_init,
        'publish.entry' => \&publish_entry,
        'publish.finalize' => \&publish_finalize,
    );
}

sub initialize {
    my($self, $context) = @_;
    my $config = {
        username => $self->conf->{username},
        password => $self->conf->{password},
        group => $self->conf->{group},
        mech_opt => {
            agent => Plagger::UserAgent->new,
        },
    };
    $self->{diary} = WWW::HatenaDiary->new($config);
}

sub publish_init {
    my($self, $context, $args) = @_;
    local $@;
    eval { $self->{diary}->login };
    if ($@) {
        $context->log(error => $@);
        delete $self->{diary};
    }
}

sub publish_entry {
    my($self, $context, $args) = @_;
    return unless $self->{diary};

    my $entry_title = $args->{entry}->title_text;
    $entry_title =~ s/\r|\n//g;
    $entry_title =~ s/^.+?: //o;
# $entry_title =~ /^(.+?): (.+)$/o;
    my $post = $entry_title;

    my $date = $args->{entry}->date;
    my $zone = DateTime::TimeZone->new( name => 'GMT' );
    my $dt = DateTime::Format::HTTP->parse_datetime($date, $zone);
    $dt->set_time_zone('Asia/Tokyo');
    my $hh = sprintf("%02d", $dt->hour);
    my $mm = sprintf("%02d", $dt->minute);

    my $time = $hh . ":" . $mm;
    my $link = $args->{entry}->link;

    my $title = "[" . $link . ":title=" . $time . "] " . $post;
    $context->log(debug => "$title \n");

# my $body = $self->templatize('template.tt', $args);
    my $uri = $self->{diary}->create({
        title => encode_utf8( $title ),
# title => encode_utf8( $args->{entry}->title_text ),
# body => encode_utf8( $args->{entry}->body_text ),
    });
    $context->log(debug => "Post entry success: $uri");

    my $sleeping_time = $self->conf->{interval} || 3;
    $context->log(info => "sleep $sleeping_time.");
    sleep( $sleeping_time );
}

sub publish_finalize {
    my($self, $context, $args) = @_;
    return unless $self->{diary};
    $self->{diary}->{login}->logout;
}

1;

twitter2hateda.yaml

include:
  - /home/user/yaml/base.yaml

plugins:
  - module: Subscription::Config
    config:
      feed:
        - http://twitter.com/statuses/user_timeline/riywo.rss

  - module: Filter::Reverse

  - module: Filter::Rule
    rule:
      module: Deduped
      path: /home/user/cache/plagger-twitter2hateda.db

  - module: Publish::Twitter2HatenaDiary
    config:
      username: hatena-id
      password: **********

ふと気づいたCustomFeed::Twitterの問題点

あと途中で一度CustomFeed::Twitterを入力につかおうと思ったのですが, Fav用に作っていたので,IDが取れていなかった部分を修正.しかし, WEBでの表示は実はポストを省略されたりしているので,ちょっとまずいですねー. この辺はCustomFeed::Twitterの中でポストのURLにアクセスして 全文取得しないといけません.EntryFullTextとか使ってもいいのかもしれません. 最近はTwitterも安定してるのでRSSでもいいんですけどねー.Filter::Ruleの 重複を調べるモジュールの挙動を調べないとSubscription::ConfigとCustomFeedが 共存できないな.この辺は要調査.

PerlもPlaggerもすげーよ!

いやー,それはともかく,Perl簡単だわー.例えば時刻取り扱いたいと思ったら 「cpan 時刻」とかで検索すればわさわさ出てくる.はてダのAPIもCPANがあるから 僕は何もしなくてもできる.便利すぎる.Plaggerも適当にいい感じでRSSを 処理してくれるので,勘でアクセスするとちゃんとデータ入ってたりするし.

PlaggerとCPANがある以上,Perl以外をバリバリやる気はしないなー.ただ Catalystはドキュメント不足な気がしたので,フレームワークならRuby on Railsかな. RoRとPerlを連携とかするのは,無駄なことかしらw?