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?

riywo

Software Engineer, DevOps, DBA, Solutions Architect, NFL, working for AWS. All posts are my own, not endorsed by any org.