エンジニアの頭の中

フリーランスエンジニアが書く技術系ブログです。

SeleniumとPythonを使用してネットプリントへの書類登録を自動化

http://www.printing.ne.jp/support/common_v5/src/jpn/images/nps-logo.png

あらすじ

仕事の取引先とは、見積書や請求書などの書類を、郵送でやりとりしなくてはならないのですが、印刷するためのプリンタを持っていないため(たまにしか印刷しないので所有したくない)、紙の書類を印刷する必要がある時は、ネットプリントというウェブサービスを使用しています。

www.printing.ne.jp

ネットプリントは、ウェブ上で登録した文書をセブンイレブンのプリンタで印刷できるサービスです。

月に数枚程度しか印刷しないので、これで十分なのですが、毎月使用していると、ブラウザから印刷するためのファイルを登録する作業さえも面倒に感じるようになり、自動化しようと思いました。

自動化のイメージとしては、印刷したいファイルのファイルパスを自動化プログラムに渡して起動すれば、あとはプログラムがネットプリントにファイルを登録してくれるというものです。

外部から印刷用ファイルを登録するための、APIが公開されていれば、手っ取り早いのですが、調べてみた結果、APIは公開されていませんでした。 そのため、普段手作業で行なっていたブラウザの操作を、Seleniumを使って自動化するためのコードを書きました。

使用した Python のバージョンは、3.5.1 です。(別に3系である必要はありません)

前準備

Seleniumをインストール

Seleniumを使用して、ウェブブラウザを操作するため、pipを使用してPythonSeleniumライブラリをインストールします。

$ pip install selenium

$ pip show selenium
---
Metadata-Version: 2.0
Name: selenium
Version: 3.3.3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
Installer: pip
License: Apache 2.0
Location: /Users/mi2/.pyenv/versions/3.5.1/lib/python3.5/site-packages
Requires:
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  License :: OSI Approved :: Apache Software License
  Operating System :: POSIX
  Operating System :: Microsoft :: Windows
  Operating System :: MacOS :: MacOS X
  Topic :: Software Development :: Testing
  Topic :: Software Development :: Libraries
  Programming Language :: Python
  Programming Language :: Python :: 2.6
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
  Programming Language :: Python :: 3.5
  Programming Language :: Python :: 3.6

Chrome Driverをインストール

今回は、ウェブブラウザは、Google Chrome を使用します。 Seleniumで、Chromeを操作するために、Chromeのwebdriverが必要になります。 Homebrew でインストールします。

$ brew install chromedriver

$ chromedriver --version
ChromeDriver 2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b)

実装

Seleniumを使用して、Google Chrome の操作を自動化するためのコードを、Pythonで書きます。

upload_to_netprint.py

#!/usr/bin/env python
# coding: utf-8

import sys
import time

from selenium import webdriver


def upload(username, password, file):
    driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")
    try:
        driver.implicitly_wait = 3  # ページロード待ち時間(秒)
        driver.delete_all_cookies()  # Cookieを削除

        # ログイン画面取得
        print("[Step 1] Get login display.")
        driver.get("https://www.printing.ne.jp/usr/web/NPCM0010.seam")
        driver.find_element_by_id("NPCM0010:userIdOrMailads-txt").send_keys(username)
        driver.find_element_by_id("NPCM0010:password-pwd").send_keys(password)

        # ログイン実行
        print("[Step 2] Login.")
        driver.find_element_by_id("login").click()

        # create-document
        print("[Step 3] Open create-document display.")
        driver.find_element_by_xpath('//*[@id="NPFL0010"]/section[1]/div[1]/a').click()

        # プリントの設定
        print("[Step 4] Input printing preferences.")
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[3]/td[2]/div[1]/label[1]/span[2]').click() # 用紙サイズはA4を指定
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[5]/td[2]/div[2]/label[3]').click() # カラーモードは白黒を指定
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[6]/td[2]/div/label[2]/span[2]').click() # 予約番号タイプは「数字のみ」を指定
        driver.find_element_by_xpath('//*[@id="checkBox3"]/div[1]/label[2]/span[2]').click() # 登録結果通知は「設定する」を指定
        driver.find_element_by_xpath('//*[@id="upload-document"]').send_keys(file) # アップロード対象ファイルを選択
        driver.find_element_by_xpath('//*[@id="update-btn"]/span[2]/span').click() # アップロード実行

        time.sleep(2)

    finally:
        driver.close()


if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: $user $pass $file")
        exit(1)
    upload(username=sys.argv[1], password=sys.argv[2], file=sys.argv[3])
    exit(0)

webdriverの初期化時にchromedriverのパスを指定する

executable_pathにchromedriverのパスを指定しています。

driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")

予めchromedriverにパスが通っている場合は、driver = webdriver.Chrome()と、引数無しで書いても問題ありません。

操作対象の要素の指定

画面の要素は、XPathで指定しています。

driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[3]/td[2]/div[1]/label[1]/span[2]').click() # 用紙サイズはA4を指定

印刷設定を変更したい場合は、コードも書き換える必要があります。(最終的には、印刷設定をコードと切り離して指定できるようにしたい) 画面の要素のXPathを調べて、書き換えてください。XPathの簡単な取得方法は、以下の記事でも紹介しています。

mi2.hatenablog.com

実行

ネットプリントにログインするため、ネットプリントのアカウントを持っている必要があります。 実行時に、引数でネットプリントのアカウントの認証情報と、登録対象のファイルのパスを渡します。

upload_to_netprint.py $username $password $filepath

引数の内容は、以下の通りです。

driver.find_element_by_xpath('//*[@id="checkBox3"]/div[1]/label[2]/span[2]').click()で、登録結果を通知するよう指定しているため、プログラムが正常終了した後は、登録結果がメールで通知されます。

セブンイレブンへ行って、専用の端末にこのメールに記載された番号を入力してプリントする事ができます。

まとめ

このプログラムによって、ネットプリントにファイルを登録するために、ブラウザを操作は自動化できましたが、プログラムの実行の際に、ファイルパスを渡してプログラムを実行するのは、若干面倒です。 次は、このプログラムを実行するためのトリガーを仕掛けて、自動起動を実現したいと思います。