前回、出品一覧レポートの作成をリクエストするソースを公開したが、今回はそのレポートをダウンロードするために必要なリクエストIDを取得する方法について。
で、本題に入る前に。
前回、書き忘れていたのだが、ここで公開しているAIMS関連のスクリプトをレンタルサーバ等、第3者からアクセス可能な環境に置くのはNG。
最悪の場合、勝手に返金、出品、削除、価格の変更をされる、ということがありえます。
パスワードを暗号化していてもNG。
試す場合は必ずローカル環境で。
また、基本的にスクリプト言語の学習が目的なので、例えば「Perlで書かれたマケプレ用在庫管理システム」のようなものを公開する予定は今のところないっす。
で、本題。
リクエストIDを取得するために必要なのは、前回同様 Cookie、認証情報、取得したいレポートの種類と取得するレポートステイタスの数。
Cookieは前回使用したもの。
認証情報(Authorization)も前回と同じく、Eメールアドレスとパスワードを':'で連結しBase64エンコードしたもの。
取得したいレポートの種類(ReportName)は、ここでは出品一覧レポートなので、「OrderListings」になる。
レポートの数には取得したいレポートステイタスの数(NumberOfReports)を設定する。 デフォルト(設定しない場合)は10
のようだ。
これらをヘッダーに含める。
あとは、
https://vendornet.amazon.co.jp/exec/panama/seller-admin/manual-reports/get-report-status
にリクエストを投げるだけ。
正常であれば、以下のような書式で結果が返ってくる。
<Reports> <Report> reportstarttime=11-03-2006:16-01-55 reportendtime=11-03-2006:16-01-55 reportid=nnnnnnnn </Report> </Report>.....</Report> </Report>.....</Report> </Report>.....</Report> </Reports>
ReportはNumberOfReportsで指定した数だけ返ってくる。
reportstarttimeとreportendtimeは出品一覧レポートの場合は同じ値である。ちなみに形式は、月-日-年:時-分-秒のようだ。
reportidは実際にレポートをダウンロードするときに必要になる。
実際の運用では、これらの値をDB等で管理することになるだろう。
返ってきた結果をもう少し見易くするために、XML::Simpleをつかってごにょごにょ。
XML::Simpleは使わず、正規表現のみのほうがいいような気もするが。
実行結果はこんな感じ。
データはダミー。
start: 2006-11-03 16:01:55 end: 2006-11-03 16:01:55 id: nnnnnnnn start: 2006-11-02 14:35:30 end: 2006-11-02 14:35:30 id: nnnnnnnn start: 2006-11-01 07:33:26 end: 2006-11-01 07:33:26 id: nnnnnnnn
サンプルソースは以下のとおり。
*このままでは動かないので必要な箇所は編集が必要。
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Headers;
use LWP::UserAgent;
use MIME::Base64;
use XML::Simple;
# リクエストを投げるURL
my $url = "https://vendornet.amazon.co.jp/exec/panama/seller-admin/manual-reports/get-report-status";
# 認証情報。自分のEメールアドレスとパスワードに変更する。
my $auth = MIME::Base64::encode('test@example.com:password');
# レポートの種類 OrderListings=出品一覧
my $report_name = "OrderListings";
# 取得するレポートステイタス数。
my $num = "3";
# Cookie
my $session_id = "session-id=nnn-nnnnnnn-nnnnnnn;";
my $session_id_time = "session-id-time=nnnnnnnnnn;";
my $ubid_main = "ubid-main=nnn-nnnnnnn-nnnnnnn";
my $ua = LWP::UserAgent->new;
my $header = HTTP::Headers->new(
Authorization=>"Basic $auth",
ReportName=>$report_name,
NumberOfReports=>$num,
Cookie=>"$session_id $session_id_time $ubid_main"
);
my $req = HTTP::Request->new(POST=>$url, $header);
my $res = $ua->request($req);
if ($res->code eq '202') {
my $xs = XML::Simple->new;
my $ref = $xs->XMLin($res->content, FORCE_ARRAY=>['Report']);
foreach my $r (@{$ref->{Report}}) {
my ($start, $end, $id) = split(' ', $r);
(undef, $start) = split('=', $start);
(undef, $end) = split('=', $end);
(undef, $id) = split('=', $id);
$start = &format($start);
$end = &format($end);
print "start: $start\n";
print "end: $end\n";
print "id: $id\n\n";
}
}
else {
print $res->code, "\n";
}
sub format {
my $val = shift;
my ($date, $time) = split(':', $val);
my ($mon, $day, $year) = split('-', $date);
my $mydate = "$year-$mon-$day";
$time =~ s/-/:/g;
return "$mydate $time";
}
正規表現、まじめに勉強したほうがよさそうだ。
以前、これ

詳説 正規表現 第2版
の第1版を持っていたのだけど、第2版が出たので売ったのだが、結局買ってねーや。
原書ではすでに第3版が出ているので、第2版の日本語訳版を買うか第3版の訳が出るまで待つか迷うところ。

Mastering Regular Expressions (Mastering)









