Club-Off(クラブオフ)などで取得したnanacoギフトを効率よく登録する方法として、筆者はGreasemonkeyのスクリプトを作成して登録している。
今回は、スクリプトを公開し、解説して行きたい。1つのスクリプトで全てできるのかも知れないが、今回は3つのスクリプトを作成した。
1.Greasemonkeyをインストール
まず、FirefoxにGreasemonkeyをインストールしよう。Greasemonkeyとは、Firefoxの拡張機能となり、ユーザのスクリプトを指定したサイトで実行することが可能となる。
例えば、ID・パスワードを登録できないサイトを指定して、オートコンプリート無効を解除する。
そうすると、IDやパスワードを保存できないようなサイトでも保存できるようにすることも可能だ。
今回は、このGreasemonkeyを使用してnanacoギフトのサイトに強引にタグを埋め込むことで自動登録することにした。
2.nanacoギフト登録画面に<input>タグを入れる
まず、1つ目のスクリプトは、nanacoギフト登録画面に16桁のnanacoギフトを入力できるテキストボックスを追加する。<table>タグを置換し、<input>タグを挿入。
この<input>タグが変化した場合、デフォルトに設置されている4つのテキストボックスに16桁のnanacoギフトを4桁ずつ分割で入力し、サブミットするJavaScriptを<head></head>間に入れ込む。
スクリプト1ダウンロード(Greasemonkeyがインストールされている状態でクリック)
// ==UserScript== // @name??????? nanacoギフトID登録1 // @namespace?? http://www.poitan.net/ // @description nanacoギフトIDを効率よく登録するスクリプトです。 // @include???? https://nanacogift.jp/ap/p/register1.do* // @version???? 1 // @grant?????? none // ==/UserScript== function setGlobalJS(js) { var head, jsobj; head = document.getElementsByTagName('head')[0]; if (!head) { return } jsobj = document.createElement('script'); jsobj.type = 'text/javascript'; jsobj.innerHTML = js; head.appendChild(jsobj); } setGlobalJS('function setgiftid(){str = document.getElementById("nanacogiftid").value; document.getElementById("gift01").value = str.substr(0,4); document.getElementById("gift02").value = str.substr(4,4); document.getElementById("gift03").value = str.substr(8,4); document.getElementById("gift04").value = str.substr(12,4);} function change1(){var str = document.getElementById("gift01").value; if(str.length==4){document.EjoicaActionForm.submit(); }}'); document.body.innerHTML=document.body.innerHTML.replace(/<table/g,'<div style="text-align:center; margin-bottom:1em; font-size=120%;"><input type="text" name="nanacogiftid" id="nanacogiftid" value="" maxlength="16"? onchange="setgiftid();"></div><table');
これで、nanacoギフトのページを表示すると、16桁のnanacoギフトのコードを入力するボックスが表示されるため、コードをペーストし、タブキーを押下すると自動的に確認画面に飛ぶ事になる。
3.確認画面で自動サブミット
次に、確認画面を自動的にサブミットするため、<head></head>間に、画面が表示された場合に、自動的にサブミットするスクリプトを入れ込む。
スクリプト2ダウンロード(Greasemonkeyがインストールされている状態でクリック)
// ==UserScript== // @name??????? nanacoギフトID登録2(自動サブミット) // @namespace?? http://www.poitan.net/ // @description nanacoギフトIDを効率よく登録するスクリプトです。 // @include???? https://nanacogift.jp/ap/p/register3.do* // @version???? 1 // @grant?????? none // ==/UserScript== function setGlobalJS(js) { var head, jsobj; head = document.getElementsByTagName('head')[0]; if (!head) { return } jsobj = document.createElement('script'); jsobj.type = 'text/javascript'; jsobj.innerHTML = js; head.appendChild(jsobj); } setGlobalJS('window.onload = function(){document.getElementById("registerForm").submit();}');
4.登録完了メッセージ画面を閉じる
最後に、完了メッセージを確認するが、自動的に閉じるスクリプトを<head></head>間に入れ込む。ただし、エラーなどを確認するために、自動的に閉じるのは1秒遅らせることにした。1000となっている所を3000にすれば3秒遅らせることが可能だ。
スクリプト3ダウンロード(Greasemonkeyがインストールされている状態でクリック)
// ==UserScript== // @name??????? nanacoギフトID登録3(自動クローズ) // @namespace?? http://www.poitan.net/ // @description nanacoギフトIDを効率よく登録するスクリプトです。 // @include???? https://nanacogift.jp/ap/p/register5.do* // @version???? 1 // @grant?????? none // ==/UserScript== function setGlobalJS(js) { var head, jsobj; head = document.getElementsByTagName('head')[0]; if (!head) { return } jsobj = document.createElement('script'); jsobj.type = 'text/javascript'; jsobj.innerHTML = js; head.appendChild(jsobj); } setGlobalJS('window.onload = function(){window.setTimeout("window.open(\'about:blank\',\'_self\').close();",1000);}');
この3つのスクリプトを登録したブラウザでnanacoギフトを登録すると、16桁のnanacoギフトをペーストし、タブを押すだけで登録が完了する。
改善点は?
このスクリプトの改善点としては、最後にウィンドウを閉じた時に、再度登録ウィンドウを開きたい。1,000円分のnanacoギフトを何十件も登録するには、登録ボタンを押すのも煩わしいためだ。
nanaco会員メニューのソースコードを確認すると、window.openで登録画面を起動しているため、子ウィンドウからwindow.openerを使えば親ウィンドウの関数をキックすることができるはずだ。しかし、何をやっても動作しない。
よく考えたところ、クロスドメインのためにwindow.openerが利かないことが判明した。nanacoの会員メニューのドメインはnanaco-net.jpとなるが、nanacoギフトの登録画面は、nanacogift.jpとなる。そのため、window.openerで子ウィンドウから親ウィンドウのnanacogift.open()をキックすることができないようだ。
もっと効率良いスクリプトがある場合は連絡して欲しい。