Amazon Dash ButtonとRaspberry Piで安くなったら自動購入するおうちハック

  • 36
    いいね
  • 1
    コメント

作ったもの

Amazon Dash Buttonが発売され色々な方がハックしていますが、このデバイスの弱点はボタンを押すというシンプルなUIであるため金額がわからないこと、、、

Amazonの値段は頻繁に変わるので、できるだけお安く買いたいですよね?
そこでAmazon Dash Buttonを物理ハックして、指定した金額まで値段が下がったら自動で購入してくれるデバイスを作成してみました。

タイトルなし.gif

材料

名前 部品 値段
Amazon Dash Button image ¥500
Raspberry Pi 3 image ¥4,800
マイクロサーボ SG92G ¥500
Arduino Uno image ¥3,240

とりあえずサーボモーターとAmazon Dash Buttonは結束バンドで固定しています。

Arduinoでサーボモーターを動かす

Raspberry PiのGPIOに接続するための部材が足りなかったので、少々面倒くさいですがArduino経由でサーボモーターを操作するようにしました。
ちゃんと準備していればArduinoは不要です。

シリアル通信でAを受信したときにサーボモーターを少し動かしAmazon Dash Buttonを押すようにしています。

#include <Servo.h> 
const int pin = 8;
Servo myservo;

void setup() {
  myservo.attach(pin);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    byte res = Serial.read();
    if (res == 'A') {
      myservo.write(20);
      delay(500);
    }
  } else {
    int val = myservo.read();
    if (val != 0) {
      myservo.write(0);
    }
  }
}

実際にArduino IDEのシリアルモニタからAを送信してみると
こんなかんじでサーボモーターが動作します

タイトルなし.gif

Raspberry PiとArduinoでシリアル通信する

Raspberry PiとArduinoをUSBケーブルで接続し、シリアル通信経由でサーボモーターを操作する手順です。

pipでpyserialをインストール

まずはRaspberry Pi側の下準備必要なライブラリーをインストールします

$ sudo apt-get install python-pip
$ sudo pip install pyserial

dmesgでArduinoのデバイス名を確認

Raspberry PiとArduinoをUSBケーブルで接続し、接続を確認します。
コマンドを打つとわらわらと表示されますがArduinoって表示されているあたりでttyACM0というデバイス名で接続されていることが確認できます。

$ dmesg
[ 3401.469507] usb 1-1.5: new full-speed USB device number 4 using dwc_otg
[ 3401.583400] usb 1-1.5: New USB device found, idVendor=2341, idProduct=0043
[ 3401.583420] usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[ 3401.583433] usb 1-1.5: Manufacturer: Arduino (www.arduino.cc)
[ 3401.583446] usb 1-1.5: SerialNumber: 554313134383513061F0
[ 3401.601770] cdc_acm 1-1.5:1.0: ttyACM0: USB ACM device

シリアル通信してみる

serial.Serialには先程取得したデバイス名や、Arduinoで指定した値を設定します。

dashpush.py
import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(3)
ser.write(b'A')
ser.close()

動かしてみる

$ sudo python dashpush.py

すべてを接続した状態でサーボモーターが動作すれば準備完了です

商品が安いかどうかを判定する

Amazon Product Advertising APIを使い商品の値段を取得し、
設定した金額より安かった場合ボタンを押し購入するように作っていきます。

ASINを取得

Amazon Dash Buttonに設定している商品のASINを取得します。
ページの商品の情報にあるのでコピペ

このサントリー 天然水
image

の場合B0043TXMWMとなります。

ライブラリーのインストール

pipでbottlenoseBeautifulSoupをインストールします

$ sudo pip install bottlenose
$ sudo pip install BeautifulSoup

商品情報を取得して購入する

bottlenoseで取得したAmazonの商品情報のXMLをBeautifulSoupでパースし、
水の値段が1200円未満だったら、先程のシリアル通信を投げ購入します。

dashpush.py
import serial
import time
from bottlenose import api
from BeautifulSoup import BeautifulStoneSoup

AMAZON_ACCESS_KEY_ID = "xxxxxxxxxx"
AMAZON_SECRET_KEY = "xxxxxxxxxx"
AMAZON_ASSOC_TAG = "corelar-22"
ASIN = "B0043TXMWM"
PURCHASE_PRICE = 1200

# get api
amazon = api.Amazon(AMAZON_ACCESS_KEY_ID, AMAZON_SECRET_KEY, AMAZON_ASSOC_TAG, Region="JP")
res = amazon.ItemLookup(ItemId=ASIN, ResponseGroup="Offers")

# xml parse
soup = BeautifulStoneSoup(res)
price = soup.find("item").find("offer").find("price").find("amount").text

# push button
if int(price) < PURCHASE_PRICE:
    ser = serial.Serial('/dev/ttyACM0', 9600)
    time.sleep(3)
    ser.write(b'A')
    ser.close()

購入できました。
IMG_1108.PNG

スマホで購入を制御

このままでは、在庫状況に関係なく常に無限購入するようになってしまうため。
スマホから購入する商品の金額の閾値を変更できるようにします。

たとえば
- 必ず購入する(10000円に設定)
- 1200円未満なら購入する(1200円に設定)
- 購入しない(0円に設定)

AWS Lambda上でAPIを作り、この金額をiOSアプリから更新して、Raspberry Piから読み込めるように作っておけば連続で購入される心配はないです。
ボタンが押されたらRaspberry Piから0円指定に戻すだけ。

商品の値段を逐一トラッキングしてここ1ヶ月で一番安くなったら購入!みたいなこともできる

cronに設定して定期実行

今回は30分に1度チェックするようにしました。

$ crontab -e

raspbianの場合初回起動時にエディタの選択画面が表示されるんだけど、
読まずに適当にエンター押したらnanoが選択されて詰みかけた
select-editorコマンドを打つとvimで選択しなおせる

crontab
*/30 * * * * sudo python dashpush.py > /dev/null 2>&1

あとは放置・・・

おわり

Advent Calendarぎりぎり間に合った・・・。
これまで購入APIが存在しなかったんですが、やっと購入できるようになって嬉しい。

前にポケモンGOプラスをいじったときの応用でしたが、これは完全に放置デバイスになった

AWS GreengrassAWS IoT ボタンとかAmazonが力を入れてきているし、
やっとRaspberry Pi Zeroも来年には国内で販売されるっていうし、
はやく日本に正式版きてほしいですね。