年間437.27円もらえるようにした

前置き

hontoってあるじゃないですか(以下URL参照).

honto.jp

個人的に愛用していて,kindleとかと比べてウェブサイトのフォーマットとかが好み.尚,ちゃんと使い比べたわけではない.実際の書店で買っても提携していればポイントが共通なのも使っている理由の一つ.というのも活字本とか参考書は紙派だけど通販はゴミ増えるし今住んでるところは宅配時間かかるしで嫌いなのでなるべく本屋で買いたいからである.定期的に電子書籍向けのクーポンを配布していて,最近は漫画とか気になってたラノベはもっぱらhontoで安く買わせていただいている.多分この点はkindleより優れているのでは.

ただ,在庫がなくて通販しかない場合は圧倒的にkindle(というかamazon)の方が安くかつポイント還元率も高く買えるのはさすが大手といったところ.あと英書とかの扱いもhontoはほとんどない.まあそこは仕方がない.英書そこまで読むわけではないけど電子書籍の方が読みやすいからそういう時はkindle使ってる.

 

さて,hontoには「あしあと抽選ポイント」なるものがある.1日に1回,ウェブサイトから抽選に参加して最大100人に100ポイント,最大49,900人に1ポイントを配布するというサービスである.

昔はこれに加えてスマホアプリからも1日1回ボタンを押すことで1ポイントがもらえて,月の参加率で最大200円引きクーポンを入手できるサービスがあったが,2021年の12月に廃止になった.2022年の1月中旬まではその埋め合わせなのかあしあと抽選ポイントの当選ポイントが2倍になっていたが,もう終了したのでもらえるポイント・クーポンはだいぶ渋くなった.

ともあれ,この1日1回の抽選を自動で参加してくれるシステムを作ったので今回はこれを紹介する.一度もはずれたことがないので,抽選にはずれがないことを前提にすると,100ポイントもらえる確率は0.002(100/50000),1ポイントもらえる確率は0.998(49900/50000)である.これにより1回の抽選でもらえるポイントの期待値は1.198,これを年間欠かさずに参加すると437.27円(ポイント)もらえるというわけである(タイトル回収).紹介といっても,技術的に新しいことをやっているわけじゃないし,正確にはただの感想文かもしれない.

 

システムの紹介

実際のプログラムは以下参照(個人情報が乗せたままになってないかすごく心配)

github.com

処理の概要は,

  1. hontoにログイン
  2. あしあと抽選ポイントへページ遷移
  3. 抽選に参加するjavascript実行
  4. 獲得ポイント確認
  5. 異常があればメール送信

である.1-4までの処理にはブラウザ操作の自動化を実現するseleniumを用いた.特に特別な処理はしていない.抽選に参加する際,ボタンの特定からクリックする本来のやり方ではなく,対応するjavascriptを実行するようにしたのは工夫した点というか,頑張ってウェブサイトを調査した点である.獲得ポイントを検証する際,"find_element(By.ID)" にしていたが,spanなどはIDで要素を特定できないため断念.次に,"find_element(By.XPATH).text" で試したが,実際のブラウザ上で非表示になっている要素は取り出せないらしい.実際にあしあと抽選ポイントの獲得ポイントが表示されるのには数秒の演出の後である.最終的には非表示の要素も取り出せる"find_element(By.XPATH).get_attribute('textContent')" を用いた.

mailerAshiato.pyはあしあと抽選ポイントで1ポイント以外を獲得したときにメールを送信するプログラムである.正確にはプログラム自体はメールを送信するだけで,autoAshiato.pyが獲得ポイントの検証をしている.具体的な状況としては,100ポイントが当たったときと,はずれもしくは不具合で1ポイントももらえなかった時の2通りを想定している.これに関しても特に特別な処理はしていなく,調べて出てくるsmtplibを用いている.苦労した点としては,調べたとおりに組んでもメールが送信できなくて最終的にはメールサーバーを構築したりと紆余曲折した点である.最終的にはSMTPサーバーの指定を,本来”smtp.gmail.com" であるはずが,"smtp.google.com" にしていたのが原因だったと判明した.あまりにも時間を無駄にした... しかも本来なくても問題ないプログラムで...つらい.しかもメールでエラー文が送られてくるわけでもなくただ定型文が送られてくるだけなのに.まあ不具合が毎日発生していた開発途中と比べて今は何か発生した際に送られてくるだけなので,これでいいのかもしれない.はずれや100ポイント獲得の演出は”https://honto.jp/my/account/point/footmark/result?tgtYmd=YYYYMMDD" (=以降のYYYYMMDDをその日の日付に変更すること)から確認できるし. 

プログラムを定期的に,具体的には毎日朝4時(あしあと抽選ポイントは午前4時に更新される)に実行してくれるようにするにはlinuxのコマンドであるcrontabを用いた.これは,実行する環境がUTCだったのでそれをJSTに合わせるように時間指定をすること,パスが通らなくなるのでプログラムには絶対パスを通すことに注意すれば特に問題なく動いた.出力に関してもちゃんと保存してくれるようにしたので開発当初のエラー祭りの際にはお世話になった.

個人情報について,GitHubにアップしたかったのでなるべくコードに直接書くことは避けたかった.ので,別でJSONファイルを作成しそこから参照するようにした.JSONファイルは.gitignoreに追加することで公開しなくて済む.セキュリティ的にも,システム的にももっと良い解がありそうだがほかに良い案が思いつかなかった.結局個人情報は公開せずに済んでいるもののローカルではプレーンテキストで保存することになっているし,ほかに良い解があるならぜひとも紹介してほしい.

おわりに

あしあと抽選ポイントの目的は,毎日ユーザーにアクセスしてもらうことで購入機会を増やすことにあり,本システムはそれを無碍にするようなものである.とはいえ,あしあと抽選ポイントでもらえるポイントの使用期限は次の月までであり,個人的にはその使用期限があるから本買うかぁーってなって買っている.また,使用期限の短いクーポンやシステムがちゃんと稼働しているかを確認するためにほとんど毎日アクセスしてるのでhonto側に損失は全くないと考える.

1日に1回しか試せないという都合上だいぶ開発に手間がかかって苦労したけど,ブラウザ操作の自動化・pythonでのメール送信・linuxでの定期的なプログラムの実行とそれなりに学びを得られたと考える.

みんなもhonto使おう.では気が向いたらまた.