はじめに
アマゾンで頻繁に注文するものを毎回サイトにアクセスして注文するのがめんどくさいということはよくあることかと思います。
そこで今回はタイトルの通りボットとしてamazonを使えるsinatraアプリを作成しました。
(余談ですが先日AmazonがSlackを買収するかもしれないというニュースが話題になりましたが、それが実現すればこんなものをamazon自体が提供しそうですね笑)
システム構成
システム構成は上記のようになっています。
メッセンジャーから注文コマンドを送ると
- slackからoutgoing web hook で出したリクエストをローカルのmacに立てたsinatraがngrok経由で受け取る。
- sinatraはseleniumを使って注文操作を実行する。
- 完了したらスクショを撮る
- スクショと共に注文が完了した通知をslackに返す
の流れで注文を処理します。
作っている時に起きた問題は以下の2つで
- EC2 + Headlessブラウザを使っていたらrecaptchaで弾かれた → ローカルPCで対応(なのでこれを使うためにはサーバー用のPCを1台用意しないといけません...)
- ローカルのPCをサーバーとしてどうやって安全かつ簡単に外部公開できるかわからない → ngrokが使えた
の形でそれぞれ対応しました。
あとはslackのoutgoing web hookと注文のエンドポイントを繋いで、実際注文するとうまく注文できました!!
完成形
その他いくつかコマンドを足して、完成形がこちらです。
- 使い方
- 商品登録
- 商品登録解除
- 登録商品一覧
- 商品注文
- 注文履歴参照
結構いい感じに出来ましたね!!
またslack以外のメッセンジャーを使いたい場合はBotBaseを継承したクラスに#send_messageメソッドを実装すれば簡単にカスタムのbotクライアントを追加できます。
module Bot
class CustomBot < BotBase
# required
def send_message(message)
some_messanger_client.send_message(message)
end
end
end
もし自分でも使ってみたいという方がいればソースとセットアップの方法はこちらのGitのレポジトリにあるので使ってみてください (プルリクもお待ちしていますmm)
さて、ここまで読んでこれ別にamazonで注文するのがめんどくさいのがslackに投げるのめんどくさいに変わっただけじゃないか?と思った方が多いかと思います。
そうです。あくまでもこれは副産物で本当に今回作りたかったのはこちらです!!