UiPath Document UnderstandingをPythonなどの外部から利用する方法

今回はUiPathのDocument Understandingを外部プログラムから使用する方法を解説します。
例えば、UiPathが提供している日本語のAI-OCR処理をPythonから使いたい場合などです。

Pythonなどの外部プログラムからDocument Understandingのデジタル化などの処理を実行したい場合には、次の3つのステップが必要です。

・外部アプリケーションの登録
・Document Understandingプロジェクトの作成
・呼び出し

::: note
Studioのアクティビティから呼び出す場合には認証などが自動的に行われますので、エンドポイント等を指定するだけで簡単に実行可能です。
:::

## 外部アプリケーションの登録

Automation Cloudの管理画面にアクセスします。
外部アプリケーション登録を行うため、External applicationページをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/d86d70d5-c7ea-f0e9-2b11-482cb11c17c0.png)

新たにアプリケーションを登録します。
アプリケーションを追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/2edcce3b-e080-552a-7bfc-dba3fd9d8765.png)

シークレットIDを新しく生成します。
アプリケーションIDとシークレットIDをコピーします。
シークレットIDは生成した時のみ表示されますので、大事に保管しておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/ac83e464-a506-0dc0-9cb9-84dbf0077d74.png)

スコープを追加から、権限を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/e72eaa45-78a6-57c2-67e6-7ad72c946169.png)

Documetn Understanding関連の権限を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/609f7e64-47e4-0fc8-2fdc-4f79140d89d7.png)


## Document Understandingプロジェクトの作成

Automation CloudのDocument Understandingページに移動します。
プロジェクトを新規に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/3f5f9181-67ee-0063-d339-21003351e566.png)

:::note warn
Document Understanding機能を管理画面から有効化しておく必要があります。
有効化には管理者権限が必要です。
新規プロジェクト作成にも権限が必要です。
:::

プロジェクト設定でOCRメソッドを選びます。
日本語の場合は「UiPath Chinese Japanese Korean OCR」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/5acd6b45-7b5d-ab13-6f17-280be74413b5.png)

アクセス権を管理より、外部アプリケーションにロールを割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/5e56b850-9ab8-21e6-c155-43ac644cba32.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/b7509ee4-6679-b46d-0d65-eda45cebff64.png)

## 呼び出し

まずSwaggerから呼び出せることを確認しましょう。
Swaggerを使用することによって、プログラムを書かずにAPIをアクセスすることができます。
Document Understanding右上のREST APIからFrameworkを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/c2541bf9-9103-51ad-205c-236a561d3855.png)

認証します。
Authorizeをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/28f96d02-42d7-de3b-82f1-d019f871f5f5.png)

外部アプリケーションのIDを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/25c7ab6d-6f4f-4dc0-778c-d684c2d33cac.png)

正常に認証されると、このような画面が出てきます。
Staging環境のため、Token URLはみなさんと違う可能性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/c39ee23f-7b60-3cd4-b48c-4e240dd22c9d.png)

デジタル化を行います。
DigitalizationのstartのTry it outをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/19d6ba8d-8f98-8a5d-b089-0d9c08f999d2.png)

プロジェクトIDはURLから取得します。
「https://staging.uipath.com/xxxx/xxxxxxxx/du_/projects/342646c9-ae59-ee11-9937-000d3a2e596b/」の場合には、342646c9-ae59-ee11-9937-000d3a2e596bがプロジェクトIDになります。

設定後にExecuteを押して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/38ce6367-e3de-e094-8aad-4840e597bbc8.png)

正しく実行できていれば、レスポンスにDocument IDが返ってきます。
これは後で使用するため、コピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/96008e15-35e3-3653-dc41-f3341134ca45.png)

結果の取得を行います。
Digitalizationのresultを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/2e5cc00e-dcde-528a-6550-4298504e0ea4.png)

プロジェクトIDとドキュメントIDを指定して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2577004/73709222-daba-42df-dde2-46e842c756aa.png)


後はこの処理をPythonなどの呼び出したいアプリケーションで実装するだけです。
（以下はコードの一部抜粋のため、このままでは動きません。）
```python:sample.py
        # 認証
        response = requests.post('https://cloud.uipath.com/identity_/connect/token', data = {
        # response = requests.post('https://staging.uipath.com/identity/connect/token', data={
            'client_id': UIPATH_APP_ID,
            'client_secret': UIPATH_APP_SECRET,
            'grant_type': 'client_credentials',
            'scope': "Du.Digitization.Api Du.Classification.Api Du.Extraction.Api Du.Validation.Api"
        })

        # デジタライズ
        response = requests.post(UIPATH_DU_API_ENDPOINT + '/projects/' + PROJECT_ID + '/digitization/start?api-version=1', files=[
            ('File', (path, open(path, 'rb'), 'application/octet-stream'))
        ], headers={
            'Authorization': 'Bearer ' + token
        })

        # 結果の取得
        digitization_response = requests.get(UIPATH_DU_API_ENDPOINT + '/projects/' + PROJECT_ID + '/digitization/result/' + doc_id + '?api-version=1', headers={
                    'Authorization': 'Bearer ' + token
        })

```