頭ん中

しがないITエンジニアが、考えた事を書きます。

Puppeteerを使った税金支払い節約術

はじめに

通常は現金しか使えない税金・公共料金の支払いに、セブンイレブンnanaco払いを使うという節約術は、その筋では昔から有名です。クレジットチャージの改悪等で昔より旨みは減ってしまいましたが、2023年現在の主流は福利厚生サービス「ベネフィット・ステーション」等で手に入れたnanacoギフトコードを使う方法です。この方法のいいところは2つあります。

  • 還元率は1%~2%くらい。(時期によって変動、大体1.5%)
  • nanacoギフトはチャージ上限が無いので高額な支払に使える。*1

ただし、この方法には致命的な問題があります。nanacoギフトは1枚1000円なので、まとまった額の支払いとなると何百ものギフトコードが必要になる訳ですが、このチャージ操作が恐ろしく大変なんです。

半ばルーティンワークになっているこのクソめんどい作業をNode.jsライブラリ Puppeteer 使ったスクリプトで自動化したいと思います。

環境

pptr.dev

node --version        
v16.15.0
npm --version                      
9.4.1
npm ls
└── puppeteer@17.1.3

Puppeteerコード

まずはテンプレ通りにブラウザ起動して、ギフトコードの分だけループする処理にしていきます。nanaco公式サイトはギフトコードをクエリパラメータgidで指定してログインすることができるので、これを利用します。

const puppeteer = require('puppeteer');
// 画面表示
const LAUNCH_OPTION = {
    headless: false
};
const urls = [
    'https://www.nanaco-net.jp/pc/emServlet?gid=xxxxxx',
    'https://www.nanaco-net.jp/pc/emServlet?gid=yyyyyy',
    'https://www.nanaco-net.jp/pc/emServlet?gid=zzzzzz',
];

(async () => {

    const browser = await puppeteer.launch(LAUNCH_OPTION);
    const page = await browser.newPage();

    for (const url of urls) {
        await page.goto(url);

id属性を指定して要素を操作する

page.typeで文字列入力し、page.clickでフォーム送信します。Developerツールで要素のidを調べながら、入力内容をコードにしていきます。

        // カードNo入力
        const nanacoNo = 'xxx';
        const nanacoPass = 'xxx';
        await page.type('#nanacoNumber01', nanacoNo);
        await page.type('#pass', nanacoPass );

        // ログイン
        await Promise.all([
            page.click('#loginPass01'),
            page.waitForNavigation({ timeout: 10000, waitUntil: "domcontentloaded" }),
        ]);

id属性が無い場合

操作したい要素にidが無い場合は、DOMのパスを指定して操作します。例えば以下の例、同意ボタンのinput要素にはidがありませんが、上位のdiv要素id=registerは特定できるので、div要素以下のパス/form/p/inputを記載して操作対象を特定しています。

        // 同意
        let agreexpath = '//*[@id="register"]/form/p/input';
        console.log(agreexpath);
        let agreeinput = await page.$x(agreexpath);
        await Promise.all([
            agreeinput[0].click(),
        ]);

完成

そんな感じでチャージの実行までコード化したら、あとはギフトコードの数だけループして勝手にやってくれます。(本当はヘッドレスChromeを操作するので画面表示は無いのですが、わかりやすくするためにあえて表示)

待つだけチャージ10万円!

以上、puppeteerを使った税金支払い節約(のために使うnanacoギフトチャージをオートメーション化する技)術でした。

*1:通常、nanacoカードは5万円+センター預かり分5万円、合わせて10万円が残高上限です。nanacoギフトはこのセンター預かり分5万円の上限を超えてチャージができるため、1枚のnanacoで10万円以上の高額な支払も可能になります。