Puppeteerでファイルのアップロード

Puppeteerで業務自動化はこれまで6個ほど現場向けにアプリケーションを作り現在本格稼働しています。割とシンプルな構造なので、この仕組を横展開する事で高額で応用の効かないRPA製品を使わずともウェブアプリケーション全盛の時代では、Puppeteerで自動化が簡単に実現可能です。

さて、今回そういった業務用アプリで頻繁に使うシーンの1つとして、指定のサイト上でファイルをアップロードする作業があります。これを今回Puppeteerで実現してみます。今回はログイン不要でネットプリントを利用できるセブンイレブンのネットプリントを利用してみようと思います。

今回使用するライブラリ等

デスクトップに作成済みのuploadフォルダ内にあるjpgファイルをアップロードするのが今回の仕組みになりますので、予めデスクトップにuploadフォルダを作り、jpgファイルを格納しておいてください。但しネットプリントの使用により最大5個まで。

今回のアップロード上の問題点

今回利用するセブンイレブンのネットプリント。自宅にプリンタが無い人が利用するのに非常に便利なサービスで、それなりにコストは掛かるものの、買って無駄にしがちなプリンタを所有しなくて良いのは大きな利点なのと、出先であってもプリント出来る大きなメリットがあります。

しかし、その仕様により制限もあるので、Puppeteerで作り込む場合には注意が必要。今回は写真を登録(フォト用紙にプリント)するので、通常のドキュメント(WordやPDF)のパターンではありませんが、基本は同じ流れになります。

  1. ユーザID登録がなくてもインスタントに利用できる(24時間後に自動的に削除される)
  2. 暗証番号と通知用のメアド登録を今回は利用します。
  3. Puppeteer Recorderを使って作ろうとすると、余計なエレメント操作がかなり多数記録されてしまうので、必要な部分だけを取り出す必要がある。
  4. jpg画像でなければNG。また最大5個までしか登録が出来ません。トータルのファイルサイズ制限もあるので要注意。
  5. 画像の縦横サイズの最小サイズ規制もあるので、小さいサイズの画像ファイルだと印刷出来ません。
  6. Puppeteerはまだ「ドラッグアンドドロップ」に対応していない
  7. アップロード後すぐに登録番号が出るわけじゃないので、ブラウザは閉じないほうが親切。メアド通知は来ますが。

図:色々とお世話になったサービスです

ソースコード

冒頭部分

  • グローバル変数でデスクトップのパスを取得しておきます。
  • つづけて、getprompt()を実行してユーザの入力を受付待ちします。
  • chromeはいつもの「C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe」ではなく、「C:\\Users\\ユーザー名\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe」となるため、ユーザ毎のパスを取得して、chromepathに格納する

プロンプト入力受付部分

  • 暗証番号は4桁の数値である必要があるので、numberで型付けしています。
  • メアドと暗証番号を受け取ってmain関数に引き渡します。

Puppeteer部分

  1. HTML解析してみた所、ファイルアップ用のinputが5個用意されていたので、直接ファイルパスを流し込んであげる必要がある(それぞれのinputはIDを持ってる)
  2. フォルダ内の画像一覧を配列に入れた後にスリープを入れないと非同期にループまで実行されてしまうので、2000msのスリープを間に入れてあります。
  3. 1個ずつ各file-imageのIDを持つinputに対して画像のフルパスを格納してあげます。uploadFileメソッドでinputに対して登録します。
  4. 最大5個まで。ソレ以上のファイルは配列に登録しません。
  5. 登録ボタンクリック後はブラウザを閉じずにそのままにしています。メアド通知を入れているので、閉じてしまっても問題はないかと思いますが。

ダウンロード

今回作成したPuppeteerプログラムをnexeでEXE化してみました。アカウント登録がなくてもnetprintは使えるのでそのまま利用が可能です。netprintの指定の画像の制限等注意が必要です。もちろん、事前にChromeをインストールしておく必要性があります

download ダウンロード

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)