柳屋

ソースコードのリファクタからよもやままで

Google Homeとヨドバシ.comを連携させてみた【サーバサイド編】

前回に引き続き、Google Homeとヨドバシ.comを連携させてみましたのサーバサイド編です。

前回の記事はこちら yanagiya.hatenadiary.com

GitHub

github.com

構成

  • さくらVPS
  • Docker
  • NodeJS
  • CasperJS(PhantomeJS)
  • SQLite

Docker

さくらVPS等にDockerがインストール済みの状態とします

dockerでNodeJS、SQLite3、PhantomJS、CasperJSが入った環境を作成します

Dockerfileは以下のようになってます。
(今思えば一つのコンテナに入れすぎですね。CasperJSは別コンテナにした方がよかったかも。
SQLiteも永続性からホストOSの方が良いかもです)

FROM debian:latest
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

# 必要なパッケージをインストール
RUN apt-get update \
    && apt-get install -y curl \
    && apt-get install -y python \
    && apt-get install -y git \
    && apt-get install -y vim \
    && apt-get install -y wget \
    && apt-get install -y bzip2 \
    && apt-get install -y fontconfig \
    && apt-get -y autoclean

# nvmをインストールするパスとNODEのバージョン
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 6.11.2

# nvmインストール
# https://github.com/creationix/nvm#install-script
RUN curl --silent -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash

# nodeとnpmインストール
RUN source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

# add node and npm to path so the commands are available
ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH

# インストールされたnodeとnpmのバージョン確認
RUN node -v
RUN npm -v

# sqlite3インストール
run apt-get -y install sqlite3

# PhantomJSインストール
RUN wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
RUN tar jxf /phantomjs-1.9.7-linux-x86_64.tar.bz2 && ln -s phantomjs-1.9.7-linux-x86_64 phantomjs && ln -s /phantomjs/bin/phantomjs /usr/local/bin/phantomjs

# CasperJSインストール
RUN npm install -g casperjs

# ソースファイルをDL
RUN git clone https://github.com/yanagisawahidetoshi/yodobashi-dash.git

# yodobashi.comの認証情報を引数としセットアップ
RUN cd /yodobashi-dash && npm install && npm run set -- --mail="{ヨドバシのログインID}" --password="ヨドバシのパスワード" --securityCode="{クレジットカードの番号}" --receiptName="{領収書の宛名}" 

うん。dockerファイルに書いてしまったのでこれで終わりなんですが それを言うと元も子もないので少し解説を

OSの設定

FROM debian:latest

まずはこれでOSの設定をしてます。今回はdebianの最新版です
最初はnodeがもともと入ってるコンテナを指定してたんですが、それやと apt-getでSQLiteがインストールできなかったので、プレーンなものを選択しました。

パケージインストール

RUN apt-get update \
    && apt-get install -y curl \
    && apt-get install -y python \
    && apt-get install -y git \
    && apt-get install -y vim \
    && apt-get install -y wget \
    && apt-get install -y bzip2 \
    && apt-get install -y fontconfig \
    && apt-get -y autoclean

SQLiteやphantomインストールするのに上記パッケージが必要なのでインストールしてます

NodeJSインストール

# nvmをインストールするパスとNODEのバージョン
ENV NVM_DIR /usr/local/nvm
ENV NODE_VERSION 6.11.2

# nvmインストール
# https://github.com/creationix/nvm#install-script
RUN curl --silent -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.2/install.sh | bash

# nodeとnpmインストール
RUN source $NVM_DIR/nvm.sh \
    && nvm install $NODE_VERSION \
    && nvm alias default $NODE_VERSION \
    && nvm use default

NodeJSはnvmでバージョン管理をしたかったのでnvmインストールした後にnvm経由でインストールしてます

SQLite

# sqlite3インストール
run apt-get -y install sqlite3

言わずもがなのSQLite3のインストールですね。
SQLiteはyodobashi.comのログイン情報を格納するのに使ってます

PhantomeJSインストール

RUN wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2
RUN tar jxf /phantomjs-1.9.7-linux-x86_64.tar.bz2 && ln -s phantomjs-1.9.7-linux-x86_64 phantomjs && ln -s /phantomjs/bin/phantomjs /usr/local/bin/phantomjs

最初npm経由でPhantomeJSをインストールしようとしたのですが、うまく行かず調べてみるとバイナリーファイルを落として配置するやり方が多かったので今回のようになってます

CasperJSインストール

RUN npm install -g casperjs

CasperJSはなぜかnpm経由でインストールできました。

Yodobashi Go Homeの設定

RUN git clone https://github.com/yanagisawahidetoshi/yodobashi-dash.git
RUN cd /yodobashi-dash && npm install && npm run set -- --mail="{ヨドバシのログインID}" --password="ヨドバシのパスワード" --securityCode="{クレジットカードの番号}" --receiptName="{領収書の宛名}" 

環境はできたのでgithubからソースをダウンロードし、設定を初期化しています &&を繋げてるのはDockerはディレクトリ移動してもその場所を覚えてくれてないので、&&で繋げて連続で処理が走るようにしております

しかしDockerファイルにログインのIDやらパスワードを書いてるのはあきませんよね。
SQLiteでは暗号化して入れてるんですが意味ない
docker起動時に引数として渡した方がええんんかな。
この辺り改善する必要がありますね。

これでサーバサイド側もひとまず完成。

Docker使うとサーバサイドの構築がソースコードに落とせるのでメンテナンスも容易になるし
積極的に使っていきたいなと思いました

;(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ if (pre.className.indexOf("gist") !== -1) { return } var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) || 0 ol.className = "preLine" ol.setAttribute("role", "presentation") // no lang, no line-number if( pre.className && ! /lang-./.test(pre.className) ){ br.length += 1 } for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)