メルカリの出品数取得ボットを作る

PCゲームをしたいという子供の願いを叶えるためにMBP2012を与えて一年ほど経とうとしているのですが、今時の若者らしく使い方が相当ヘビーになってきて本人も重たさを感じてきたのか新調したいという要望が出てきました。そこで今年になって上手く稼働ができたMac mini 2018を譲り、ライトゲーマーな親は新たにCore i3版のMac miniでどこまでできるか試してみようと思い、メルカリで調達するべく巡回ボットを作ることにしました。

巡回ボットと言えば過去に任天堂スイッチを購入する際などにも製作した経験があるので過去流用としては容易に、要件としては「cURLを定期実行し取得データ差分を通知する」ということになるのですが、メルカリのスクレイピングについては規約と技術の両面に問題があることが分かりました。

これらの内容からcURLは使わず、AppleScriptでブラウザを実際に操作し手動で動かしているかのようにする手法を採用し、もう少し具体的な要件として「型番検索結果一覧の個数の変化をメッセに通知する」としました。

上述コードを簡単に解説すると、BASE_URLには価格順で販売中のみの検索結果画面のアドレスを使い、{検索語}には機種の型番を入れました。itemsCntは個数の受け皿として用意し、theTargetFileは取得した個数を保存するためのスクリプト本体と同階層にテキストファイルです。prevDataにテキストファイルから読み込み、成功すればそのまま比較用のprevCntに入れ、初回配置でファイルが見当たらない等の条件で失敗すれば初期値としたitemsCntを入れます。

次にSafariで新規ドキュメントを作りBASE_URLを開くのですが、Safariがアクティブになっている作業中のことを考慮し縦横サイズが0のウィンドウにしました。当初はWindow IDを操作して背面に移動させようとしたところ、閉じた後の処理が上手くいかなかったため苦肉の策というところです(何か良い方法があれば教えてください)。その後はJavaScriptと連携し個々のDOMクラスの数を取得しprevCntと異なればメッセを送信しウィンドウを閉じるという流れです。

最後にこのスクリプトを実行専用で~/Library/Scriptsに書き出し、/Library/LaunchAgentsに定期実行する(実際には30分に一度にしました)plistファイルを置き、launchctl loadすると完了です。消費電力の少ないM1 Macを24時間稼働させておけば(今回はLaunchAgentsを使ったのでログインしておく必要があります)、個数に変化があった時に(自分から自分宛に)メッセが飛んでくるようになります。

ということで1ヶ月ほど運用していたのですが、先日なかなか安値で購入できお役御免(launchctl unload)となったところでまとめてみました。

投稿者: hkitago

個人事業主でウェブと iOS, Android アプリの開発者で一児の父親。JavaScript, ActionScript, AppleScript, PHP, SQL, ObjC, Swift, Java の読書実行試験運用管理を生業とし(Golang学習中)、Bind, Postfix, Apache を MacOS で使い、エディタは Vim, mi, Kod, Smultron, TextWrangler を経て Coda, Xcode, Android Studio, Atom といった IDE と CotEditor を重用しています。座右の銘は「アウトプットは量多い方がいい。フィルタは各自がやればいい。」です。