UiPathプロセスの依存関係を抽出してみよう（Part２：Nupkg取得編）

## はじめに

認証編（Part1）では、Automation Cloudの外部アプリケーションを作成してトークンを取る方法をご紹介しました。本記事はその続編となり、APIコールを使って指定したテナント配下のすべてのフォルダにおけるプロセスが利用するアクティブなNupkgをダウンロードする方法について説明します。まだPart1をご覧になっていない方は、目を通しておきましょう。

 https://qiita.com/Ouyang/items/51deb38d07ef190d2083

## 環境準備

| 項目 | バージョン |
|:-----------|------------:|
| UiPath Studio| 2024.10.6        |
| UiPath.WebAPI.Activities     | 1.21.1      |
| 対応OS     | Windows      |

前回作成した「依存関係抽出ツール」プロジェクトの「Main.xaml」を開き、「ワークフローファイルを呼び出し」で「認証.xaml」を指定します。引数パネルで、「認証.xaml」の出力引数である`outStToken`と`outStTenantName`に、それぞれ`stToken`と`stTenantName`を指定して保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/3d9ab40c-6bdd-b4c2-748a-a11f2df000dd.png)

続いて、その下にもう一つ「ワークフローファイルを呼び出し」を配置し、「パッケージダウンロード.xaml」を作成して呼び出します。引数を以下の通りに設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/0907dd07-1846-e08c-c38e-7bf4d517d6e8.png)

完成したら、「パッケージダウンロード.xaml」を開きます。

## フォルダ情報の取得

Part2の最終目標は利用中のパッケージをダウンロードすることです。利用中のパッケージは、アクティブパッケージとも呼ばれ、プロセスが利用するパッケージのことを指しております。プロセスの情報を取得すれば、当該プロセスはどのパッケージを利用しているのかがわかります。さらに、プロセスはフォルダ単位のリソースなので、プロセスの情報を取得する前提として、フォルダ情報の抽出が必要です。

本セッションは、APIコールでフォルダ情報を抽出する方法を説明します。

①フォルダの名称とIDを取得したいため、まず「データテーブルを構築」で情報を取得するための準備をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/6a5e6e1e-f5ff-96c3-3ff3-e902c22174be.png)

②APIコールでAutomation Cloud上のフォルダ情報を要求します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/ddcdc6d8-e333-ad64-327c-c1a181d05930.png)

「HTTP要求」を配置し、そのプロパティで、ア、イ、ウの情報を以下の通りに入力します。

ア、APIコールの際に、トークンをヘッダーとしてAutomation Cloudに渡す必要があるため、ヘッダーを開いて「認証.xaml」から受け取ったトークン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/641ee30d-4128-8469-a23c-abb3113bfcd8.png)

```ruby: トークン渡し
Authorization ＝ "Bearer " & inStToken
```
イ、要求URLを入力します。

Automation CloudへのAPIコールは、ベースURLが`https://cloud.uipath.com/Organization/Tenant/orchestrator_/`です。ご自身の情報に合わせて書き換えてください。テナント名は、入力フォームで指定して変数に保存しているので、その変数を入れます。

```ruby:筆者の情報
"https://cloud.uipath.com/oyb/" & inStTenantName & "/orchestrator_/"
```

そして、フォルダ情報を取得したいので、上記のベースURLの後ろに、`odata/Folders`を追加する必要があります。そのため、要求URLは以下のようになります。

```ruby:要求URL
"https://cloud.uipath.com/oyb/" & inStTenantName & "/orchestrator_/odata/Folders"
```

ウ、応答コンテンツのところで、変数stFolderInfoを作成してAPIコールの結果を保存します。

③応答コンテンツを逆シリアル化して情報を抽出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/d261dc15-ca1b-26b3-7fdf-1be34b0e681c.png)

ゲットフォルダの応答コンテンツでどのような情報が入っているのかをSwaggerで確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/8560ece4-5478-6abe-aa70-89e9257540f4.png)

`FullyQualifiedName`と`Id`のキーで、親フォルダの情報を含めたフォルダ名とIDが取得できますね。なお、Automation Cloud上のすべてのフォルダ情報を一一括取得したいため、応答コンテンツをループして情報をデータテーブルに保存する必要があります。設定方法は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/d5359826-e93d-3c13-d66b-d7f242843685.png)

```ruby:条件
Not String.IsNullOrEmpty(item("DisplayName").ToString)
※：フォルダ名が存在するかどうかを確認
```

```ruby:列配列
{item("FullyQualifiedName").ToString, item("Id").ToString}
```

実行してフォルダ情報が正しく抽出されたかどうかを確認しましょう。

抽出の結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/26792e60-2eda-6323-a5c3-00ee28713bb5.png)

左側はAutomation Cloud上のフォルダと一致していますね。右側のFoldeIDはプロセス抽出の際に必須な情報です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/4ad570c6-abc4-0378-0af7-0c81881d5a25.png)

## プロセス情報の取得

プロセスはフォルダ単位のリソースのため、フォルダ情報を把握すれば、APIコールでプロセス情報の抽出が可能になります。

まず、プロセス情報格納用のdtProcessを構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/e81ae00f-e53c-2646-736a-9f87a46831c7.png)

次に、「フォルダの情報を取得」で作成したdtFolderをループし、個々のフォルダに対してAPIを叩きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/0da8e0de-37bf-777a-547f-bd9c2ad32713.png)

ア、プロセスを取得するためのエンドポイントは以下の通りです。

```ruby:要求URL
"https://cloud.uipath.com/oyb/" & inStTenantName & "/orchestrator_/odata/Releases"

※組織名をご自身のAutomation Cloudの組織情報に置き換えてください
```

このAPIコールで返してくれる結果を確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/6f836b90-728f-ad01-3619-2b785fd990a0.png)

たくさんありますが、`*`がついている項目に注目しまよう。

`Name`でプロセス名が取得できます。

`ProcessKey`は、上記のロセスの利用するパッケージが取得できます。

`ProcessVersion`は、上記のパッケージのバージョンが取得できます。

イ、ヘッダーに、トークンを入れるほか、`X-UIPATH-OrganizationUnitId`という項目があるため、そこに上記で取得したFolderIDを埋め込む必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/51b97cca-bbe9-74ff-56cd-3838c50db054.png)

そのため、ヘッダーは以下の通りになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/07df2e4a-f10a-a533-b0e1-72527980bae5.png)

ウ、応答コンテンツで、変数`stProcessInfo`を作成し、「JSONを逆シリアル化」でそのjsonStringをjsonObject型の`jsonProcessInfo`に変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/cba87466-6144-cfd3-287f-71e6f44dceae.png)

さらに、`jsonProcessInfo`をループし、情報を取り出して`dtProcess`の行として追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/51cc67c6-130b-5ae1-afdf-51f45547d8d2.png)

最後に、`dtProcess`を出力して結果を確認しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/9296ca50-161f-259d-f74d-4a5dc8a4e17a.png)

これで、プロセスの情報も抽出しました。

## パッケージのダウンロード

以上で、プロセスが利用するパッケージ名とそのバージョンを手に入れたので、これからパッケージのダウンロード作業をご説明します。

①ダウンロード先のフォルダを作成します。デスクトップで、「Downloaded Nupkg」のフォルダを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/d2b64881-872d-60ab-cc51-26ad7581bdb1.png)

```ruby:フォルダパス
System.IO.Path.Combine(stDesktop,"Downloaded Nupkg")
```

出力結果を`lrDownloadedPath`に保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/2dfe6c67-bb3a-8f48-1599-9d22f7c5e213.png)

②`dtProcess`には各パッケージの情報を保存しているため、それをループして情報を取り出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/34ffef83-eb90-b46e-d011-50c0be1c4dd7.png)

③本文で、APIコールしてパッケージをダウンロードします。パッケージダウンロードのエンドポイントは以下の通りです。

```ruby:要求URL
"https://cloud.uipath.com/oyb/" & inStTenantName & "/orchestrator_/odata/Processes/UiPath.Server.Configuration.OData.DownloadPackage

※組織名をご自身のAutomation Cloudの組織情報に置き換えてください
```

これに基づき、「HTTP要求」にパラメータを渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/7e017526-a89b-7c95-f2f4-d1457da3d960.png)

ア、ヘッダー情報を渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/4420c45c-af34-1718-5e70-978fbc5671e4.png)

イ、要求URLを書きます。`odata/Processes/UiPath.Server.Configuration.OData.DownloadPackage
`のコードは、Key（パス）が必要です。つまり、どのパッケージをダウンロードするのかを明確に指定しなければなりません。`dtProcess`の`Row("Package Name")`と`Row("Version")`はKeyに該当します。よって、要求URLは以下の通りです。

```ruby:要求URL
"https://cloud.uipath.com/oyb/" & inStTenantName & "/orchestrator_/odata/Processes/UiPath.Server.Configuration.OData.DownloadPackage(key='" & Row("PackageName").ToString & ":" + Row("Version").Tostring &"')"

※組織名をご自身のAutomation Cloudの組織情報に置き換えてください
```

ウ、上記のAPIコールと違い、今回は「応答コンテンツ」を空欄にします。

エ、その代わりに、「応答の添付ファイルのファイル名」にダウンロード先の情報を記載します。

```ruby:応答の添付ファイルのファイル名
lrDownloadedPath.LocalPath & "\" & Row("PackageName").ToString & "_" & Row("Version").ToString & ".nupkg"
```

結果を確認しましょう。すべてのパッケージがダウンロードされました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334103/b45fa41d-b842-12d1-30dc-7f8d930d43b2.png)

## 終わりに

Part2はPart1の認証情報を利用して、フォルダ情報、プロセス情報及びNupkgを取得しました。次回の「依存関係解析編」で、Nupkg中のProject.jsonを解析して依存関係を抽出しようと思います。ぜひ楽しみにしてください。