PythonからEpsonプリンタを使うためのライブラリ"pyson_connect"を作成した話

# お知らせ？
pyson_connectを利用して開発しているプラットフォームの事例として、セイコーエプソン株式会社様の[DXイノベーションサイト](https://openinnovation.epson.com/developer/)に掲載されました!!!!
# とつぜんですがPythonを書いているそこのあなた！！！

なんとなくPythonからプリンタを操作したいなって思うときありませんか？ありますよね？**僕はあります。**

シチュエーション的には......

- コマンドラインから印刷かけたいとき
- webサービスに組み込みたいとき
- ラズパイで使えるようにしたい
- 機械学習で使う

......などなど一見ニッチな需要に思えるけど痒いところに手が届かない人は多いのではないのでしょうか。

Epsonには**"Epson Connect"**という便利なサービスがあり、さらに、プリンタを遠隔で操作するためのRestful APIが公式で準備されているのでそちらを使うことによってPythonからプリンタを操作できるようになります。

つまり......
**プリンタードライバー**を**自作できるのです！！！**

## しかし......

Restful APIと日本語ドキュメントがあって実装しやすい反面、毎回api実装するのがまあまあ面倒なので**ライブラリ化**してみました。

**非公式のものなので使用は自己責任でお願いします。**

# そもそもEpson Connectとは

> Epson Connect は、インターネットを通じてお客様とエプソンプリンター、スキャナーとを結ぶサービスです。「メールプリント」など、いつでも・どこからでも印刷できる便利な各種サービスを提供しています。
> 

([https://www.epsonconnect.com/](https://www.epsonconnect.com/) より引用)

とのことで昨年終了してしまったクラウドプリントの代替手段としても使えそう。

## サービスを利用するには

今回はEpson Connect自体の登録方法は解説しませんが、以下のサイトでユーザ登録及びプリンタを登録する必要があります。
[Epson Connectの登録はこちらから](https://www.epsonconnect.com/guide/ja/html/regst_1.htm) 

# Epson ConnectをPythonから使ってみよう

Epson ConnectをPythonから使用するには、上記の登録の他にEpson Connectの開発者登録を行い、ライセンス申請をする必要があります。

## Epson Connectのデベロッパーに登録する
### ユーザーアカウントの登録
1. まずは[こちら](https://developer.cp.epson.com/ecapi/?lang=ja)から新規登録を行います。
![スクリーンショット 2021-12-13 21.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/e5cbbe11-eb0f-c3f6-2740-cd9472281b09.png)

2. 続いて作成するアカウントのタイプを選択します。今回は個人的な利用を想定しているので個人用アカウントを選択します。![スクリーンショット 2021-12-13 21.25.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/7cd12cc4-9346-4202-c856-defa4ab50a45.png)

3. 画面の指示に従い必要事項を入力し、完了するとメールが届くのでメール内のリンクを踏んでアカウントの登録は完了です。
![スクリーンショット 2021-12-13 21.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/64033726-e6fc-c15e-c671-3f49fd3feaae.png)

### ライセンス申請を行う
1. まずは**ライセンス申請**をクリックします。
![スクリーンショット 2021-12-13 21.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/a23d1469-a56b-dd52-9a0a-b5b76ecd350f.png)
2. 必要事項を記入します。
![スクリーンショット 2021-12-13 21.34.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509951/7f6b2973-52d4-d27a-8c83-f3cf3c17b91c.png)
アプリケーションの概要は「Pythonスクリプトの作成」などでも良いと思います。
ちなみに、 APIのドキュメントによると、

> 1 分間あたりの API 呼び出し回数を 100 回に制限します。リクエスト回数はクライアント ID 単位でカウントしま す。1 分間あたり 100 回の API 呼び出しで、目安として 20 回の印刷が可能です。
※2021/2/5 までに発行したライセンスは、1 時間あたりの API 呼び出し回数が 10,000 回に制限されています。 ※以下の API は API 呼び出し回数に含まれません。
・ 認証 API
・ アクセストークン再発行 API
・ 印刷ファイルアップロード API

とのことなので、このことは考慮に入れておきましょう。
3. 記入から数日後にメールにて認証情報が届くので各自控えておきましょう。

# Pythonから印刷を実行してみる
ライブラリを使用し、実際に印刷するには以下の手順を行います。

## ライブラリのインストール
まずはpipからインストール

```shell
pip install pyson-connect
```
## クライアントキーなどを環境変数に追加
ソースコードに直接書いても良いのですが、うっかり流出すると大変なことになるので環境変数に登録します。以下の変数名にするとライブラリが勝手に呼び出してくれます。

```shell
export epsonClientID=クライアントID
export epsonClientSecret=クライアントシークレット
```
## 印刷実行のサンプルコード
```python
import pyson_connect


class printer:
    def __init__(self, epson_email):
        self.pc = pyson_connect.PysonConnect()
        # 認証関数の実行
        auth = self.pc.authentification(epson_email)


    def settings(self, setting_data):
        # 印刷設定関数の実行
        settings = self.pc.print_setting(setting_data)


    def file_upload(self, file_path, document_type):
        # ファイルアップロード関数の実行
        self.pc.upload_print_file(file_path, document_type)


    def printing(self):
        # 印刷実行関数の実行
        self.pc.excute_print()


if __name__ == "__main__":
    email = input("input EpsonConnect Email: ")
    p = printer(email)
    # 印刷タイプ
    # ドキュメントを印刷する場合:document
    # 写真を印刷する場合:photo
    document_type = input("input document_type(document/photo): ")
    # 印刷設定(この場合はEpson Connectが定義したデフォルト設定で印刷される。)
    # 用紙の設定や給紙トレイの場所の指定、カラーやモノクロなどの詳しい指定方法はライブラリのドキュメントを参照。
    p.settings({"job_name":"demo", "print_mode":document_type})
    # 印刷したいファイルをアップロード
    file_path = input("input filePath: ")
    p.file_upload(file_path, document_type)
    # 印刷実行
    p.printing()
```
*なお、「印刷能力取得」と呼ばれる、印刷を実行したいプリンタでどの用紙が使えて、給紙トレイがどこにあるか、両面印刷が可能かどうかなどを取得する関数があるのですが今回は省略しています。より詳細な印刷設定を行う際は一度実行し、確認しておくことをお勧めします。*

*ライブラリの詳しい使い方は[こちら](https://github.com/clipper-programing/pyson_connect/)をご覧ください。*

# 最後に

スキャン機能もライブラリから利用することができますが、その使い方などはまた機会があればご紹介します。