Amazonアソシエイトのレポート作成とダウンロードを自動化する

Amazonのアフィリエイトプログラムを使っている方ならわかってもらえると思いますが、Amazonアソシエイトページのレポート画面ってすっっっっっごく使いづらいですよね。

ページが重いのは良いんです。
Webページだけでは成果レポートが100件までしか表示できないとか、
Webページだけでは商品ごとの成約日がわからないとか、
そういうデータはCSVに全部入っている、ということでギリギリ許せます。

でも、[メンバー紹介イベント報酬]の有無、[売上レポート]の有無、ダウンロードフォーマットの種類(XLSX/CSV/XML)あたりの設定を記憶してくれず、毎回選択しなければならない上に[レポート作成]ボタンを押下してからしばらく待たされた後にようやくダウンロードできるようになるって、さすがにひどいと思うの。

まぁ月に1回眺めるくらいの使用を想定されているのかも知れませんが、Amazonだけでも週に100商品以上売れるようになると商品の取捨選択のために毎日チェックするようになるんですよね。

少なくともうちは毎日チェックしてサイトごとに売れ筋商品の入れ替えをしています。

というわけで、Amazonアソシエイトのレポート作成とダウンロードを自動化するスクリプトを作ってみました。

Amazonアソシエイトページを自動操作するJScript

はい、ドン!

/*
 * IEを起動し、Amazonアソシエイトのレポート作成ボタンをクリックする
 */

var id = '[AmazonアソシエイトのID]';
var pw = '[Amazonアソシエイトのパスワード]';

//レポートページを開く
amazon_associate(id, pw);

/***********************************************
 * レポートの取得
 *
 ***********************************************/
function amazon_associate(id, pw, filename)
{
	//IE起動
	var ie = WScript.CreateObject('InternetExplorer.Application');
	ie.Visible = true;
	//Amazonアフィリエイトのレポートページを開く
	ie.Navigate('https://affiliate.amazon.co.jp/home/reports');
	waitIE(ie);

	//ログインする
	waitId(ie, 'ap_email'); //IEのロード待ちだけでは失敗することがあるので特定のID出現まで待つ
	ie.document.getElementById('ap_email').value = id;
	ie.document.getElementById('ap_password').value = pw;
	ie.document.getElementById('signInSubmit').click();
	waitIE(ie);

	//(一応)レポートのロードを待つ
	waitAmazonReport(ie);

	//[レポートをダウンロードする]をクリック
	ie.document.getElementById('ac-report-download-launcher').click();
	WScript.Sleep(1000); //←これがないと失敗するがイケてないので修正したい

	//[メンバー紹介イベント報酬]と[売上レポート]のチェックを外す (なぜかcheckedプロパティでは正常に動作しない)
	if (ie.document.getElementsByName('programBounty')[0].checked) {
		ie.document.getElementsByName('programBounty')[0].click();
	}
	if (ie.document.getElementsByName('programCommissionsEarning')[0].checked) {
		ie.document.getElementsByName('programCommissionsEarning')[0].click();
	}
	//フォーマットで[CSV]を選択する (なぜかcheckedプロパティでは正常に動作しない)
	ie.document.getElementsByName('reportDownloadExportFormat')[1].click();

	//[レポート作成]をクリックする
	ie.document.getElementById('ac-reports-download-generate-announce').click();
	//[準備中]が消えるまで待ち、zipのURLを取得する
	var zip_url = waitReport(ie);

	//ZIPをダウンロード
	ie.Navigate(zip_url);

//	保存確認のダイアログが出てしまうのでやむなくここまで
//	waitIE(ie);
}
/***********************************************
 * 特定のIDが出現するまで待つ
 *
 ***********************************************/
function waitId(ie, id)
{
	for (var i = 0; i < 100; i++) {
		if (ie.document.getElementById(id)) {
			return;
		}
		WScript.Sleep(1000);
	}
}
/***********************************************
 * Amazonレポートページ開いた直後のロードを待つ
 *
 ***********************************************/
function waitAmazonReport(ie)
{
	for (var i = 0; i < 100; i++) {
		WScript.Sleep(1000);
		var html = ie.document.body.innerHTML;
		if (html.indexOf("asin=") > 0) {
			return;
		}
	}
}
/***********************************************
 * [レポート作成]押下後の「準備中」が出て消えるまで待つ
 *
 ***********************************************/
function waitReport(ie)
{
	//準備中の表示が出るまで待つ
	for (var i = 0; i < 100; i++) {
		var html = ie.document.getElementsByClassName('ac-report-download-tbl-content')[0].innerHTML;
		if (html.indexOf("準備中") != -1) {
			break;
		}
		WScript.Sleep(1000);
	}
	//準備中の表示が消えるまで待つ
	for (var i = 0; i < 100; i++) {
		var html = ie.document.getElementsByClassName('ac-report-download-tbl-content')[0].innerHTML;
		if (html.indexOf("準備中") == -1) {
			var e = ie.document.getElementsByClassName('ac-report-download-tbl-content')[0].getElementsByTagName("a")[0];
			return (e.href);
		}
		WScript.Sleep(1000);
	}
	return '';
}
/***********************************************
 * IEのロードを待つ
 *
 ***********************************************/
function waitIE(ie)
{
	while((ie.Busy) || (ie.readystate != 4)) {
		WScript.Sleep(1000);
	}
}

■使い方(準備編)

  1. 上述のスクリプトをメモ帳に貼り付けてidとpwにログイン情報を記述
  2. 拡張子.js(amazon.jsとか)で保存

■使い方(実践編)

  1. amazon.jsをダブルクリックしてIEが勝手に動くのを眺める
  2. 最後にレポートを保存するか聞かれるので[保存]ボタンを押す

言い訳とか

Amazonアソシエイトのページって無駄にAjax系の技術が使われていて、従来式のGET/POSTぐりぐりいじるタイプでは画面遷移すらまともに出来ません。

そのため、最初はPHPで作ろうとして、あえなく断念しました。

ブラウザの自動操作も本当はChromeでやりたかったのですが、Seleniumって環境構築が面倒くさそうだなぁ…ということで、IE11をCreateObjectして操作するという太古の技術を使いました。

要するにWindows Scripting Hostっていうやつですね。これの素晴らしいところは余計なソフトや開発環境を入れる必要が一切なく、スクリプトをダブルクリックするだけで良いという点。

Web系の業務システムや、サイト運営をしている開発者のひとりとして、IEはこの世から消えてなくなってほしいと思う反面、このブラウザ自動操作のらくちんさ加減は素晴らしいので、このためだけに残ってほしいという気持ちもあります。

尚、なぜVBScriptではなくJScriptで書いたのかはよくわかりません。

最近JavaScriptを書く機会が多かったので、VBScriptよりはJScriptのほうが読みやすいかなぁ、とか、なんかそんな理由だった気がします。

スクリプトのコメント欄にちょこまか言い訳を書いていますが、まだちょっと納得できてないところはあります。動くからまぁいいかって感じで使ってますけど。

なにより、最後のレポートダウンロード時に[保存]を1回クリックしないといけないのがダメダメです。

これさえなければ完全無人で、レポートだけを毎日ダウンロードする処理を自動実行させるんだけどなぁ。

このへんはもうちょっと調べて、どうしてもダメそうならSeleniumのお勉強しようかなぁと思っています。