2007年3月26日月曜日

Plagger で遊んでたら週末が終わっていた [plagger]

前から試そう,試そうと思っていた話題の Plagger を導入してみました.mixi のマイミクの方とかはこれから足あとがつきまくると思いますが,気にしないで下さい.

Plagger をご存知無い方は,この辺りでも.
一足早く「Plagger」の便利さを実感してみよう - @IT
plagger - otsune FreeStyleWiki

要は,「いろいろな」データを入力して,加工して,「いろいろな」ものに出力するフレームワーク.「いろいろな」というところがポイントで,誰かが MacBook を勝手に持ち出したら携帯にメールする とか,Google で「はらへった」と検索してピザを注文する なんて人まで.

Plagger については,既にネット上にインストール方法や設定方法がたくさんあるので,わざわざここで書くことはないんだけど,ひとまず自分の備忘録を兼ねて書いておきます.


- RSS を整理
まずは RSS の整理から.
私は RSS リーダーに Google Reader を使っているが,Bloglines のフィードリストをアップデートしようとして「Google Reader で OPML をエクスポート → Bloglines でインポート」すると,変な名前のフォルダとか勝手にできて上手くいかなかった.

結論としては,livedoor Reader を踏み台にして,「Google Reader で OPML をエクスポート → livedoor Reader でインポート → エクスポート → それを Bloglines でインポート」すると,OK だった.

…って後から考えれば,livedoor Reader にエクスポートした時点で,Subscription::LivedoorReader を使えば十分だったのだが.


- さくらインターネットのレンタルサーバーを契約
Plagger を導入するのは自宅の環境でも良かったのだが,常時稼働環境が望ましいことと,2週間の無料お試し期間があるということで,さくらのレンタルサーバーで試してみる.
SAKURA Internetのレンタルサーバ
SAKURA Internet : レンタルサーバ 概要
さくらのレンタルサーバ非公式FAQ

とりあえずお約束で,vim をコンパイルして $HOME 以下にインストールしたり,"chsh -s /usr/local/bin/zsh" したりと設定に小一時間.


- CPAN の設定
ポイントは,root 権限が無いレンタルサーバーなので,$HOME 以下にインストールすることだが,otsune さんの記事 が非常に参考になった.というかほぼこの通りにしただけだが,一応やったことは以下の通り.

$ mkdir -p ~/local
$ echo no | cpan
$ vim ~/.cpan/CPAN/MyConfig.pm



MyConfig.pm の内容を以下に書き変える (mbuildpl_argの項目は存在しないので追加する).

'make_install_arg' => qq[SITEPREFIX=$ENV{HOME}/local],
'makepl_arg' => qq[INSTALLDIRS=site LIB=$ENV{HOME}/local/lib/perl5 PREFIX=$ENV{HOME}/local],
'mbuildpl_arg' => qq[./Build --install_base $ENV{HOME}/local],
'urllist' => [q[ftp://ftp.cpan.jp/], q[ftp://ftp.kddilabs.jp/CPAN/]],



必要な環境変数を追加する.
前述の通り,私はシェルを zsh に変更したが,さくらインターネットのサーバーは FreeBSD でデフォルトは csh なので,以下では .cshrc を変更する例を紹介しておく.

$ echo 'setenv PATH $HOME/local/bin:$PATH' >> ~/.cshrc
$ echo 'setenv PERL5LIB $HOME/local/lib/perl5:$HOME/local/lib/perl5/site_perl' >> ~/.cshrc

$ echo 'setenv PKG_DBDIR $HOME/local/var/db/pkg' >> ~/.cshrc
$ echo 'setenv PORT_DBDIR $HOME/local/var/db/pkg' >> ~/.cshrc
$ echo 'setenv INSTALL_AS_USER' >> ~/.cshrc
$ echo 'setenv LD_LIBRARY_PATH $HOME/local/lib' >> ~/.cshrc

$ source ~/.cshrc

$ mkdir -p ~/local/var/db/pkg



CPAN を最新に更新.

$ cpan -i Bundle::CPAN
$ cpan


質問には全てEnter で.
最後に

cpan> o conf commit


を忘れないように.


- Plagger のインストール
ネット上には,Template,DateTime::TimeZone,DateTime::Format::Mail,Encode::Detect あたりでつまづくとの記事が多く見られたが,今日時点の環境ではどれも問題無かった.というわけで素直に,

cpan> install Plagger


するだけ.ここも質問は全て Enter でデフォルト値を受け入れる.

後から必要になったモジュールは,

cpan> install WWW::Mixi
cpan> install URI::Find
cpan> install WWW::Mechanize
cpan> install Image::Info


のあたり.

assets はどこか適当な場所にコピーしておく (後から yaml の global で読み込む).

cp -r ~/.cpan/build/Plagger-0.7.17/assets ~/plagger




- Plagger の設定
yaml はインデント構造を保持することと,最終行に改行を入れておくことに注意.

メール配信は,Gmail の smtp を使っていたのだが,遊びすぎて

Data failed: 550 5.4.5 Daily sending quota exceeded. v50smxxxxxxxxx

とか怒られてしまったので,さくらインターネットの smtp を使っている.さくらの smtp は POP before SMTP なので,POP のアカウントも記述しておくことに注意.

base.yaml:
全てから読み込む共通設定.
最初はメール送信部分やレシピ定義などをしていたが,結局 global だけになったのであまり意味がない.

global:
  plugin_path:
    - /home/<username>/local/lib/perl5/Plagger/Plugin
  assets_path:  /home/<username>/plagger/assets
  timezone:     Asia/Tokyo
  log:
#   level: debug
    level: info
  cache:
    base:  /home/<username>/plagger

define_recipes:



bloglines.yaml:
Bloglines のフィードを Gmail へ.
Bloglines や del.icio.us へのリンクを追加したり,はてブ数や page rank を表示させたり,全文配信しないフィードの全文取得をしたり,余計な広告を除去したり…などなど.メール配信は Bloglines のフォルダ別にアドレスを分けて,後で Gmail でフィルタできるようにしている.

include:
  - /home/<username>/plagger/.yaml/base.yaml

plugins:
  - module: Subscription::Bloglines
    config:
      username:   XXX
      password:   base64::XXX
      mark_read:  1
      fetch_meta: 1

  - module: Widget::Simple
    config:
      widget: bloglines
  - module: Widget::Simple
    config:
      widget: delicious
  - module: Widget::Simple
    config:
      widget: hatena_bookmark_users
# - module: Widget::Simple
#   config:
#     widget: livedoor_clip_users
# - module: Widget::Simple
#   config:
#     widget: delicious_bookmark_users
  - module: Widget::Simple
    config:
      widget: google_pagerank

# - module: Filter::BreakEntriesToFeeds
  - module: Filter::EntryFullText
  - module: Filter::ImageInfo
  - module: Filter::ResolveRelativeLink
  - module: Filter::StripRSSAd
  - module: Filter::TTP
  - module: Filter::TruePermalink

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('alpha')
    config:
      mailto:   XXX+plagger_bloglines_alpha@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('ce')
    config:
      mailto:   XXX+plagger_bloglines_ce@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('music')
    config:
      mailto:   XXX+plagger_bloglines_music@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('peace-pipe')
    config:
      mailto:   XXX+plagger_bloglines_peace-pipe@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('personal')
    config:
      mailto:   XXX+plagger_bloglines_personal@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

  - module: Publish::Gmail
    rule:
      expression: $args->{feed}->has_tag('topics')
    config:
      mailto:   XXX+plagger_bloglines_topics@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX

# - module: Publish::Gmail
#   config:
#     mailto:   XXX+plagger_bloglines_ALL@gmail.com
#     mailfrom: noreply@plagger.com
#     mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
#       via:      smtp
#       host:     <domain>.sakura.ne.jp
#       username: XXX@<domain>.sakura.ne.jp
#       password: base64::XXX
#     pop3:
#       host:     <domain>.sakura.ne.jp
#       username: XXX@<domain>.sakura.ne.jp
#       password: base64::XXX



mixi.yaml:
mixi の日記を Gmail で読む.メッセージとかも取得できるようだが,ひとまず日記だけ.

include:
  - /home/<username>/plagger/.yaml/base.yaml

plugins:
  - module: CustomFeed::Mixi
    config:
      email:               XXX
      password:            base64::XXX
      fetch_body:          1
      fetch_body_internal: 1.5
      fetch_items:         10
      show_icon:           1
      feed_type:
        - FriendDiary
#       - RecentComment
#       - Message

  - module: Filter::Rule
    rule:
      module: Fresh
      mtime:
        path:       /home/<username>/plagger/.tmp/mixi
        autoupdate: 1

  - module: Publish::Gmail
    rule:
      - module: Rating
        rate:   '>= 0'
    config:
      mailto:   XXX+plagger_mixi@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX



amazon.yaml:
Amazon アソシエイトレポートを Gmail で読む.

include:
  - /home/<username>/plagger/.yaml/base.yaml

plugins:
  - module: CustomFeed::AmazonAssociateReportJP
    config:
      email:    XXX
      password: base64::XXX

  - module: Publish::Gmail
    config:
      mailto:   XXX+plagger_amazon@gmail.com
      mailfrom: noreply@plagger.com
      mailroute:
#       via:      smtp_tls
#       host:     smtp.gmail.com:587
#       username: XXX@gmail.com
#       password: base64::XXX
        via:      smtp
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX
      pop3:
        host:     <domain>.sakura.ne.jp
        username: XXX@<domain>.sakura.ne.jp
        password: base64::XXX



…と,ひとまず.定番の使い方だけ.

あとは crontab -e して,

PERL5LIB=/home/<username>/local/lib/perl5:/home/<username>/local/lib/perl5/site_perl

0  * * * * /usr/bin/perl /home/<username>/local/bin/plagger -c /home/<username>/plagger/.yaml/bloglines.yaml > /dev/null 2>&1
30 5 * * * /usr/bin/perl /home/<username>/local/bin/plagger -c /home/<username>/plagger/.yaml/mixi.yaml      > /dev/null 2>&1
30 6 * * * /usr/bin/perl /home/<username>/local/bin/plagger -c /home/<username>/plagger/.yaml/amazon.yaml    > /dev/null 2>&1


とか適当に.


これからレンタルサーバーの無料お試し期間の2週間,遊び倒してみます.

非常にたくさんの情報を残してくれた先駆者の方々に感謝.


2 コメント:

Olsen さんのコメント...

このブログに匿名で投稿することはできません。

NiklausMklsn さんのコメント...
このコメントは投稿者によって削除されました。