楽天アフィリエイトの確定レポートを自動取得してタブ区切りテキストに出すスクリプト

なんのためのスクリプトかという話はここでは書かない。とりあえず過去記事にリンクしておく。

windows用のActive Perl5.8.8で動作確認済み。 もちろんLinuxなんかでも動くだろう。

なお、SSL(https)なページを経由しなければならないので、 Crypt::SSLeay(Net::SSLeay)などのモジュールも必要。 これはActivePerlの標準のPPMでは入ってない/うまく取得できないはず。 ここなどにある解説を参考にしながらいれる。

#!/usr/local/bin/perl -w
#
# 使い方: rakuaffl_get.pl ユーザーID 開始日付(YYYY-MM-DD) 取得したい週数 結果を格納するファイル名
# 例1 perl rakuaffl_get.pl hogehoge@example.com 2007-01-31 4 hogehoge.txt
# 結果は日付どおりに並んでないのはご愛嬌。
#
# タブ区切りテキストなのでそのままエクセルに
# コピペ可能なのであとは日付ソートやオートフィルタ等
# 好きに加工、分析する。
# リクエスト間隔を3秒とっているので、件数が多かったり
# 取得したい週数が多かったりするとそれなりに時間がかかります。
#
# Shift_JISな環境を想定しているので、それ以外の場合は
# jcode呼んで->sjisとかやっているところを->eucとかにするとよいかも。

use strict;
use Term::ReadKey;
use Date::Simple;
use WWW::Mechanize;
use HTML::TableContentParser;
use HTML::Strip;
use Jcode;

my $userid = $ARGV[0];
my $date = Date::Simple->new($ARGV[1]);
my $week = $ARGV[2];
if ($week > 30) {
    print "一度に取得できる最大週数は30週です\n";
    exit(0);
}
my $file = $ARGV[3];

# パスワード
ReadMode('noecho');
print "input password: ";
my $password = ReadLine(0);
chomp $password;

# ログイン
my $mech = WWW::Mechanize->new();
my $start = "http://affiliate.rakuten.co.jp/";
$mech->agent_alias('Windows IE 6');
$mech->get($start);
$mech->form_name("LoginForm");
$mech->field(u => $userid);
$mech->field(p => $password);
$mech->submit();
if (jcode($mech->content())->sjis =~ /入力に誤りがあります/) {
    print "IDかパスワードが違うみたい\n";
    exit(0);
}else {
    print "\n";
}

# 全データを取得してファイルに格納
open(FILE, ">$file") || die "ファイルが作成できません\n";
foreach (my $i=0; $i<$week; $i++) {
    foreach my $data (&getdata($date->year, $date->month, $date->day)) {
        print FILE join("\t", @{$data}), "\n";
    }
    $date -= 7;
}
close(FILE);

# 指定した日付を基点に過去1週間のデータをすべて取得する。
sub getdata {
    my ($end_year, $end_mon, $end_mday) = @_;
    my $url  = "https://partner.afl.rakuten.co.jp/af/a_report.cgi?";
       $url .= "Command=disp&SubCommand=result&page=1&limit=100&span=1week";
       $url .= "&end_year=$end_year&end_mon=$end_mon&end_mday=$end_mday";
       $url .= "&status=1";
    my @result = ();
    my $flag = 1;
    while ($flag) {
        sleep(3);
        $mech->get($url);
        my $content = $mech->content();
        my $parser = HTML::TableContentParser->new();
        my $strip = HTML::Strip->new();
        if (jcode($content)->sjis !~ /指定された条件に該当する成果はありませんでした/) {
            my @tables = $parser->parse($content);
            shift(@{$tables[0][22]{"rows"}}); # 最初の行は見出し
            foreach my $row (@{$tables[0][22]{"rows"}}) {
                my @data = ();
                for my $cell (@{$row->{cells}}) {
                    my $d = $strip->parse($cell->{"data"}); # 余計なfontタグ等除去
                    $d =~ s/\s//g; # 余計な空白除去
                    push(@data, $d);
                }
                push(@result, [@data])
            }
        }
        if ($mech->find_link(text_regex => qr/次の100件/i)) {
            $url = $mech->find_link(text_regex => qr/次の100件/i)->url();
        } else {
            $flag = 0;
        }
    }
    return @result;
}

__END__

それPlaggerでできるよというツッコミが多数予測されるが(笑)あえて使わなかった理由はWWW::Mechanizeその他のCPANモジュールの使い方を忘れかけてたのを頭に入れなおしたかったから。本当はPHPかJavaでやりたかったのだが、この種の話はやはりperlとCPANに分がある。実質80行程度でできた。

トラックバックURL

このエントリーのトラックバックURL:
http://www.ywcafe.net/mt/mt-tb.cgi/713

コメントする

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)


画像の中に見える文字を入力してください。