はじめに
通常は現金しか使えない税金・公共料金の支払いに、セブンイレブンでnanaco払いを使うという節約術は、その筋では昔から有名です。クレジットチャージの改悪等で昔より旨みは減ってしまいましたが、2023年現在の主流は福利厚生サービス「ベネフィット・ステーション」等で手に入れたnanacoギフトコードを使う方法です。この方法のいいところは2つあります。
ただし、この方法には致命的な問題があります。nanacoギフトは1枚1000円なので、まとまった額の支払いとなると何百ものギフトコードが必要になる訳ですが、このチャージ操作が恐ろしく大変なんです。
半ばルーティンワークになっているこのクソめんどい作業をNode.jsライブラリ Puppeteer 使ったスクリプトで自動化したいと思います。
環境
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を操作するので画面表示は無いのですが、わかりやすくするためにあえて表示)
以上、puppeteerを使った税金支払い節約(のために使うnanacoギフトチャージをオートメーション化する技)術でした。