2020-11-29更新 API制限を受けずにデータを取得するには、WebDAVを使うだけではなく、共有フォルダ一括同期ツールの使用が必要である事が明記されていた。つまり、本記事に従ってWebDAVでアクセスしても、規約を満たさない過剰アクセスとなる可能性がある。下記はその前提で読み進めていただきたい。
概要
KABU+で提供されるCSVは、WebDAVを使用することにより共有フォルダ一括同期ツールを使用することによりAPIの呼び出し制限回数にかかわらず呼べるようになる。
ここでは、WebDAVを使って、RubyでCSVを取得するサンプルを紹介する。
Rubyを選んだ理由
Rubyを選んだのは、著者が好きな言語であるからだが、もし Lambda (AWS) or Cloud Functions (GCP) に載せるなら、必ずしも最善の選択ではないかもしれない。
今回は著者自身が、「最も早く動作を検証できる」言語として採用したが、最初から Lambda or Cloud Functions が必須ならば、素直に Python or Node.js で書いた方が良いと思う。
ソースコード
ここでは、動作試験の為に用意されているエンドポイントへ接続する。
ID、パスワード、URLは、KABU+の接続ツールで提供されるファイル中の mount_CSVEX-WebDAV.vbs
に記載のものを使った。ここでは具体的な値の明記を避ける。
main.rb
# main.rb # frozen_string_literal: true require 'net/dav' ID = '(テスト用ID)' PW = '(テスト用パスワード)' URL = '(テスト用エンドポイント)' dav = Net::DAV.new(URL) dav.credentials(ID, PW) dav.find('./japan-all-stock-prices.csv', :recursive => false) do |item| puts item.uri puts item.content.encode!(Encoding::UTF_8, 'Windows-31J') end
Dockerfile
# Dockerfile FROM ruby:2.7.2-alpine LABEL maintainer="dogwood008" ARG tmpdir=/tmp ARG appdir=/app COPY Gemfile $tmpdir COPY Gemfile.lock $tmpdir ENV TZ=Asia/Tokyo WORKDIR $tmpdir RUN apk update && \ apk add --no-cache tzdata libxml2-dev curl-dev make gcc libc-dev g++ libxslt-dev && \ bundle config build.nokogiri --use-system-libraries && \ bundle install && \ rm -rf /usr/local/bundle/cache/* /usr/local/share/.cache/* /var/cache/* && \ apk del curl-dev make gcc libc-dev g++ WORKDIR $appdir CMD ["/bin/sh"]
実行結果
/app # ruby sample.rb https://(テスト用ホストとパス)/japan-all-stock-prices.csv "SC","名称","市場","業種","日時","株価","前日比","前日比(%)","前日終値","始値","高値","安値","出来高","売買代金(千円)","時価総額(百万円)","値幅下限","値幅上限" (以下略)
今後の筆者の課題
- 必要に応じて Lambda (AWS) or Cloud Functions (GCP) で動かすことを検討する
- Ruby では重いので、 Python or Node.js での書き直しが必要か
- パスの一覧はサンプルからではわからないので、一覧の作成が必要
余談
今回、 alpine のイメージを使ったが 77.4MB
とかなり小さいイメージを作れた。
libxml2-dev
と libxslt-dev
も削除できるとさらに小さくできたが、 net_dav
が依存する nokogiri
がビルド時だけではなく実行時にも依存していたので、消すことはできなかった。