6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DirectCloud-BOX with Power Automate Desktop「API連携でオンプレミスからのファイル配信を効率化する」

Last updated at Posted at 2021-08-25

概要

DirectCloud-BOXとPower Automate DesktopのAPI連携を利用したファイル配信の自動化を検証します。オンプレミスのファイルをDirectCloud-BOXにアップロード、配信先リストに基づいてパスワードおよび閲覧回数制限、期限付きリンクを作成、取得後メール配信をおこないます。

DirectCloud.gif

想定

  • オンプレ基幹システムが残る中小企業
  • ユーザーが安全に使用
  • たくさんの書類を配信先リストに基づいてミスなく一括送信したい
  • パス付zipをやめたい
  • ファイル閲覧パスワードについてはあらかじめ配信先に通知しておく(今後はSMS等別途手段を検討)

イメージ

注意事項

  • スコープが大きくなりすぎるため基幹システムからデーター取り出す部分については触れません。
  • 請求書ファイルが「取引先コード+処理日付.pdf」の形式で出力済みのところから考えます。
  • DirectCloud-BOXとPower Automate DesktopとのAPI連携を「PowerShellスクリプトの実行」アクションで行います。
  • 検証用にコピペ可能なPower Automate Desktopのコードがありますが、認証情報等は抜いてありますのでご自身の環境にあわせ適宜置き換える必要があります。
  • 2021年8月の記事です。
  • 試す場合、自己責任でお願いいたします。

検証環境および想定される必要環境

開発者とユーザーの権限を分ける想定をしているため実際の運用は「Power Automateアテンド型RPAのユーザーごとのプラン」が必要になります。ユーザーに実行のみの権限でフローを共有することで、認証情報に触れないようにできます。

DirectCloud-BOXの準備

DirectCloud-BOX登録後ログインします。
初回管理者でログインとなるので二要素認証等必要に応じて設定します。わかりやすく迷うことはないと思います。

初期パスワードの変更についてはユーザー管理から行うかアプリ版起動時に求められます。

共有>カスタム設定よりAPIを使用するように設定します。
今回はユーザーの権限でAPI連携を行うのでユーザーのServiceコードとService Keyを使用します。管理者権限でログインすればコードは確認できます。

ユーザーを追加します。ユーザーIDはアクセストークン取得にも使用します。

管理者とユーザーでAPIは機能差があります。

ユーザーでブラウザからログインした場合、権限、インターフェイスは制限されます。

今回の検証ではユーザー権限のAPI機能を使用します。

Power Automate Desktopの準備

製品ページ

Power Automate Desktopの準備についてはリリースされてから時間がたつので割愛いたします。

@K2_kzy 様の【Power Automate Desktopの始め方】が参考になります。

機能については

@maekawawawa 様の【Power Automateの新しいRPA機能】Power Automate Desktopで出来ること(全33機能の紹介)が参考になります。

サンプルデータの準備

配信先リストの準備

Excelで次のような表を準備しSendList.xlsxとしてデスクトップに設置しました。本来は社内サーバ等の取引先データに接続した方がよいかと思います。Power Automate DesktopにはSQL接続やターミナルエミュレーションに関するアクションが用意されているので、そうした連携も楽にできますが今回はスコープが広くなりすぎてしまうため、Excelで代用します。

Code Name Adress Pass LastSendDate
1001 株式会社A **@z.com axjmg42Z
1002 B株式会社 @**.jp Y6rDCmn
1003 有限会社C @r**.jp AF8K2gv1g
1004 D株式会社 @****** Hg#ggD34

配信データの作成

請求データのダミーとして適当なPDFを作成しInvoiceファルダーを作り格納しました。ファイルの名づけルールは先頭4文字が取引先コードとし数値化した日付と組あわせています。

処理済みフォルダーの作成

処理済みのファイルを保管しておくフォルダーをUploadedと名前を付けてデスクトップに設置しました。

2021-08-23-19-12-42.png

アクセストークンの取得フロー作成

設定したDirectCloud-BOXのユーザー情報を使用しますので準備ください。

Name Description
service APIキーのservice
service_key APIキーのservice_key
code 会社ID
id ユーザーID
password パスワード

###「DirectCloud-BOX Get_Token」フローを作成

※出力変数を使用して次のフローに渡すため「access_token」「API_Url」を作成します。

###3.「PowerShellスクリプトの実行」アクションの内容
APIリファレンスを参考にInvoke-RestMethodをつかってコードを記述します。

設定情報は適宜ご自分のものに書き換えてください。
ハッシュテーブルとして設定値を記述しています。

PowerShell
$endpoint = "/openapi/jauth/token";

$uri = "https://api.directcloud.jp$endpoint";

$body = @{
    service     = "**********"
    service_key = "***********************************************"
    code        = "**********" 
    id          = "*******" 
    password    = "*********"
};

$headers = @{
    lang = "eng"
};

$response = Invoke-RestMethod -Uri $uri `
    -Method 'POST' `
    -Headers $headers `
    -Body $body;
$response | ConvertTo-Json;

DirectCloud-BOXではPowerShellからAPI接続する場合、https://api.directcloud.jpとリファレンスに記されているエンドポイントをつなげて使用します。必要なデータを設定しInvoke-RestMethodで叩けば動作することがわかりました。出力形式はJSONです。上記コードはPowerShellのコードとして動作可能です。

Power Automate Desktopのコード

PowerAutomateDesktop

SET Domain TO $'''https://api.directcloud.jp'''
/# ======================================
access_tokenの取得
======================================
#/
System.RunPowershellScript Script: $'''$endpoint = \"/openapi/jauth/token\";

$uri = \"%Domain%$endpoint\";

$body = @{
    service     = \"********\"
    service_key = \"*************************************************\"
    code        = \"********\" 
    id          = \"*******\" 
    password    = \"**********\"
};

$headers = @{
    lang = \"eng\"
};

$response = Invoke-RestMethod -Uri $uri `
    -Method \'POST\' `
    -Headers $headers `
    -Body $body;
$response | ConvertTo-Json;''' ScriptOutput=> PowershellOutput ScriptError=> ScriptError
Variables.ConvertJsonToCustomObject Json: PowershellOutput CustomObject=> JsonAsCustomObject
SET access_token TO JsonAsCustomObject['access_token']
SET API_Url TO Domain

保存すればアクセストークンを取得するフローは完成です。

ファイル配信自動化フローの作成

  • 少しだけ長めなフローなのまず大まかなフロー図です。
  • サブフロー「DirectCloudBox」内でAPI接続しファイルアップロードとダウンロードリンク作成をおこないます。。
  • メール配信後日時をExcelに記録しています。
  • エラー処理は最終エラーを記録するだけの単純なものです。
  • Mainフローの最後にアクセストークンを廃棄します。

flowx.png

Power Automate Desktopのフロー

メインフロー「Main」

Main.jpg

サブフロー「DirectCloudBox」

DCB.jpg

PowerShellスクリプトの実行 DirectCloud-BOXへのファイルアップロード

3行目PowerShellスクリプトの実行アクション内スクリプト

PowerShell
$endpoint="/openapp/v1/files/upload/";
$node="1{2000";
$uri = "%API_Url%$endpoint$node";
$headers = @{access_token = "%access_token%" };
$FilePath = "%CurrentItem%";

$fileBytes = [System.IO.File]::ReadAllBytes($FilePath);
$fileEnc = [System.Text.Encoding]::GetEncoding('ISO-8859-1').GetString($fileBytes);
$boundary = [System.Guid]::NewGuid().ToString(); 
$LF = "`r`n";

$bodyLines = (
    "--$boundary",
    "Content-Disposition: form-data; name=`"Filedata`"; filename=`"%CurrentItem.Name%`"",
    "Content-Type: application/octet-stream$LF",
    $fileEnc,
    "--$boundary--$LF" 
) -join $LF;

$response = Invoke-RestMethod -Uri $uri `
    -Method 'POST' `
    -Headers $headers `
    -ContentType "multipart/form-data; boundary=`"$boundary`"" `
    -Body $bodyLines;
$response | ConvertTo-Json;

%で囲ってある文字はPower Automate Desktopの変数です。

まず$nodeについてはリファレンスを読んだところフォルダー名だと思いこんでしまい、最初にハマったポイントでした。
今回の例では共有フォルダー内のDocフォルダーを指定しているのですが

$node="1{2000"

このような記述になります。
nodeの値を取得するためにはフォルダリストを取得しながら確認しました。以下にフォルダー取得のPowerShellsスクリプトをのせておきます。

PowerShell
$uri = "https://api.directcloud.jp/openapp/v1/folders/index/"
$headers = @{access_token = "%access_token%" };

$response = Invoke-RestMethod -Uri $uri `
    -Method 'GET' `
    -Headers $headers;
$response | ConvertTo-Json;

$uriのindex以下にnode値を指定してフォルダーリストを取得できます。このままnode指定無しで実行するとMyBOXが"1"SharedBOXが"1{2"というnode値が取得できます。配信先ごとにフォルダーを分けるなどの処理を組み込みたいときはnode値を取得するフローをつくる必要があります。スクリプト自体はこれまでと同様Invoke-RestMethodのGETメソッドで可能です。

アップロードに話は戻りますがはmultipart/form-dataで行う必要があります。
そして今回最大のハマりポイントです。
$fileBytes = [System.IO.File]::ReadAllBytes($FilePath);
ファイルを読み込んだ後、文字列として読み込む際に必要な文字コードをutf-8にしていたことが原因でアップロードされたファイルが破損していました。
PowerShellを使う場合ISO-8859-1で設定する必要がありました。
$fileEnc = [System.Text.Encoding]::GetEncoding('ISO-8859-1').GetString($fileBytes);
https://ja.wikipedia.org/wiki/ISO/IEC_8859-1
アップロードのコードにつきましてはstackoverflowの記事を参考にさせていただき、Fiddlerで確認しながら作成ました。感謝です。

PowerShellスクリプトの実行 DirectCloud-BOXのファイルへのリンク作成

9行目PowerShellスクリプトの実行アクション内スクリプト
配信先の情報に応じてリンク作成の設定を行います。

PowerShell
$endpoint = "/openapp/v1/links/create";
$uri = "%API_Url%$endpoint";
$headers = @{access_token = "%access_token%" };
$body = @{
    target_type     = "file"
    target_seq      = %file_seq%
    view_option     = "both" 
    expiration_date = "%expiration_date%"
    limit_count     = %DLCount% 
    password        = "%Password%"
};

$response = Invoke-RestMethod -Uri $uri `
    -Method 'POST' `
    -Headers $headers `
    -Body $body;
$response | ConvertTo-Json;

Mainフローの終了処理でおこなうアクセストークン廃棄のスクリプトです。
どの機能もほとんど同じ形式ですのでリファレンス通り設定すれば動くと思います。

$endpoint = "/openapi/jauth/tokenExpire";
$uri = "%API_Url%$endpoint";
$body = @{
    service      = "********"
    service_key  = "********************************"
    access_token = "%access_token%" 
};

$response = Invoke-RestMethod -Uri $uri `
    -Method 'POST' `
    -Body $body;
$response | ConvertTo-Json;

サブフロー「Error_Rec」

エラー吐いた時のために作っておきます。
errorrec.jpg

まとめ

  • 事務のおじさんが、ローコードツールを使ってAPI連携でファイル配信自動化してみました。
  • PowerShellスクリプト実行アクションを使って、Invoke-RestMethodとハッシュテーブルで記述すれば、DirectCloud-BOXとPower Automate Desktop連携できることがわかりました!
  • GUI操作での自動化ではないため早く確実な自動化処理が見込まれます。
    今回のフローでは組み込めませんでしたが、リンク先のパスワードを別途SMS等で送信できればパス付zipにかわる強力な仕組みがつくれそうです。
  • はじめてDirectCloud-BOXを触ってみましたが、どのインターフェイスでも迷うことがない、すばらしいサービスだと感じました。
  • 権限設定やログ関連も充実しとてもわかりやすいです。
  • 現状のAPIリファレンスにサンプルがないため試行錯誤しました。結果的にはかなり勉強になったので個人的には楽しかったですがw

中小企業ではまだまだオンプレミスのシステムが残っています。オンプレミスとクラウドつなぐことは重要度が増すのではと想像しています。API+ローコードソリューションはそのカギのひとつだと思います。
考える機会を頂きありがとうございました😊

参考およびリンク

6
2
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?