本を読む

読書やコンピュータなどに関するメモ

WWW::Mixi::Scraperに勝手に外部から追加機能を注入してみる

 ふと、mixiのリニューアルで一番困っているのは専用ブラウザー系の人ではないかと思った。ためしにbackup_mixiを見てみたところ、まだ対応していないようだ。

 PerlのWWW::Mixi::Scraperモジュールだったらさっくり書けるんじゃないかと思って、使いかたを調べてみた。すると、WWW::Mixi::Scraperでは、日記一覧で次のページへのリンクを取得する方法が用意されていないらしい。

それ用のプラグインを作る?
WWW::Mixi::Scraperではプラグインのモジュール名とCGIのコマンド名が一対一で対応していて、同じコマンドに複数のプラグインを割り当てられないらしい
ListDiaryプラグインを改造?
いまの仕様はエントリのリストを返すようになっているので、その仕様を変更するとほかに影響が大
コピペして新しいスクリプトにする?
メンテが面倒そう

 というわけで、不精して、ListDiaryプラグインのsrcape()を動的に上書きして追加機能を注入する方法を考えてみた。Rubyで既成クラスを動的に変更するような感じのやりかた。

 WWW::Mixi::Scraperのプラグインは、Module::Pluggable::Fastを使って動的に読み込まれている。それを次のようにしてみた。

  • ListDiaryのscrape()を再定義するコードをテキストで用意
  • ListDiaryをuseでコンパイル時に読み込む
  • 元のscrape()のコードリファレンスを変数に保存
  • 再定義するコードをeval()で実行

 どう見ても場当たりですry

 ちなみに、これを試したらbackup_mixiはどうでもよくなって終了。

#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mixi::Scraper;

use WWW::Mixi::Scraper::Plugin::ListDiary;
my $scrape_list_diary = \&WWW::Mixi::Scraper::Plugin::ListDiary::scrape;

eval <<'__OVERRIDE__';
package WWW::Mixi::Scraper::Plugin::ListDiary;
no warnings 'redefine';

sub scrape_nextpage {
    my ($self, $html) = @_;

    my $scraper = scraper {
        process 'div.pageList03>ul>li>a',
            'subject' => 'TEXT',
            'link' => '@href';
        result qw( subject link );
    };

    return $self->post_process($scraper->scrape(\$html));
}

sub scrape {
    my ($self, $html) = @_;

    my $list = $scrape_list_diary->($self, $html);
    my $nextpage = $self->scrape_nextpage($html);

    return {
        list => $list,
        nextpage => $nextpage,
    };
}

1;
__OVERRIDE__

my $mixi = WWW::Mixi::Scraper->new(
    email => 'sample@exaple.jp', password => 'xxxxxxxx',
);

my $diary_list = $mixi->list_diary->parse;

use YAML;
print Dump($diary_list);

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/304-9bc95a1e

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad