PCゲームをしたいという子供の願いを叶えるためにMBP2012を与えて一年ほど経とうとしているのですが、今時の若者らしく使い方が相当ヘビーになってきて本人も重たさを感じてきたのか新調したいという要望が出てきました。そこで今年になって上手く稼働ができたMac mini 2018を譲り、ライトゲーマーな親は新たにCore i3版のMac miniでどこまでできるか試してみようと思い、メルカリで調達するべく巡回ボットを作ることにしました。
巡回ボットと言えば過去に任天堂スイッチを購入する際などにも製作した経験があるので過去流用としては容易に、要件としては「cURLを定期実行し取得データ差分を通知する」ということになるのですが、メルカリのスクレイピングについては規約と技術の両面に問題があることが分かりました。
- メルカリのスクレイピングに関する規約と違法性について【python】 | ちくわドットファン
- Ruby – メルカリのスクレイピングで403 forbiddenエラーが発生する原因を解決したい【ローカルはok、本番環境でエラーが発生】|teratail
これらの内容から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
)となったところでまとめてみました。