こんにちは、アプリケーションチームの茂野です。
今回は LANSCOPE クラウド版 の API 活用法というテーマで、PowerAutomate を用いた活用事例をご紹介します!
- はじめに
- 実現したいこと
- 作ってみる
- おわりに
はじめに
LANSCOPE クラウド版の API を利用してみたいけれど、何ができるのかよく分からない・・・といった声をユーザー様からお聞きすることがあります。
そこで、API と PowerAutomate を連携して、LANSCOPE の情報を通知する仕組みを作ってみました。
ご参考になれば幸いです。
※クラウド版 API は、利用申請ユーザー様のみへの限定公開となっています。お客様専用サイト(LANSCOPE PORTAL)からお問い合わせが可能です。
実現したいこと
今回のテーマは「前日に長時間業務していた社員を知りたい!」です。
毎朝、長時間業務していた社員を自動で通知してくれるシステムです。
通知までのイメージ図がこちらです。
チャットワークには、このような通知が送られます。
作ってみる
Power Automate のフロー構成はこちらになります。
作成方法について、ご紹介します。
1. PowerAutomate の準備
Power Automate にログインし、「作成」 > 「スケジュール済みクラウド フロー」を選択します。
フロー名を入力し、
時間:09:00 AM 繰り返し間隔:1日
と設定した後「作成」を押してください。
2. LANCSOPE クラウド版 API を実行
LANSCOPE クラウド版のデバイス取得 API を実行して、管理デバイスの一覧を取得します。
2−1. デバイス取得 API の実行
「+新しいステップ」から「HTTP」を選択します。
各項目に、こちらを設定します。
方法:GET URI:https://api.lanscopean.com/v1/devices ヘッダー:[Authorization][Bearer <API利用申請時に発行されたトークン>]
2−2. API レスポンスの JSON 解析
デバイス取得 API を実行して得られたレスポンスを解析します。
「+新しいステップ」から「データ操作」を選択し、「JSONの解析」を選択します。
各項目に、こちらを設定します。
コンテンツ:本文
スキーマ:(下記をクリックするとスキーマを確認することができます)
スキーマ
{ "type": "object", "properties": { "data": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "asset_no": { "type": "integer" }, "belong_group_name": { "type": "string" }, "collected_datetime": { "type": "string" }, "managed_device_name": { "type": "string" }, "client_install_status": { "type": "string" }, "client_type": { "type": "string" }, "device_name": { "type": "string" }, "internal_available_storage": { "type": "integer" }, "internal_storage": { "type": "integer" }, "os_version": { "type": "string" }, "product_name": { "type": "string" }, "serial": { "type": "string" }, "manufacturer_name": { "type": "string" }, "max_frequency": { "type": "integer" }, "memory_size": { "type": "integer" }, "processor_name": { "type": "string" }, "bios_version": { "type": "string" }, "computer_name": { "type": "string" }, "country_code": { "type": "string" }, "drive_count": { "type": "integer" }, "file_system": { "type": "string" }, "ie_version": { "type": "string" }, "logical_disk": { "type": "array", "items": { "type": "object", "properties": { "volume_name": { "type": "string" }, "media_type": { "type": "string" }, "internal_storage": { "type": "integer" }, "internal_available_storage": { "type": "integer" } } } }, "login_user_disp": { "type": "string" }, "login_user_name": { "type": "string" }, "login_user_sid": { "type": "string" }, "netbios_name": { "type": "string" }, "number_of_cores": { "type": "integer" }, "number_of_threads": { "type": "integer" }, "os_architecture": { "type": "string" }, "service_pack": { "type": "string" }, "system_drive": { "type": "string" }, "volume_name": { "type": "string" }, "windows_productid": { "type": "string" }, "workgroup_name": { "type": "string" }, "antivirus_signature_status": { "type": "string" }, "antivirus_status": { "type": "string" }, "auto_update_status": { "type": "string" }, "cylance_pol_type": { "type": "string" }, "cylance_version": { "type": "string" }, "firewall_status": { "type": "string" }, "remote_wipe_errors": { "type": "array", "items": { "type": "string" } }, "remote_wipe_status": { "type": "boolean" }, "nic_info": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string" }, "type": { "type": "string" }, "mac_address": { "type": "string" }, "ip_address": { "type": "string" }, "subnet_mask": { "type": "string" }, "default_gateway": { "type": "string" }, "dns_servers": { "type": "array", "items": { "type": "string" } } } } }, "wifi_state": { "type": "boolean" }, "bluetooth_enabled": { "type": "boolean" }, "client_installed_datetime": { "type": "string" }, "client_last_active_datetime": { "type": "string" }, "client_uninstalled_datetime": { "type": "string" }, "client_version": { "type": "string" }, "device_type": { "type": "string" }, "user_name": { "type": "string" }, "windows_version": { "type": "string" }, "defender_engine_version": { "type": "string" }, "defender_pattern_version": { "type": "string" }, "defender_program_version": { "type": "string" }, "protector_numerical_password": { "type": "string" }, "scsi": { "type": "string" }, "model": { "type": "string" }, "build_version": { "type": "string" }, "itunesstore_accounthash": { "type": "string" }, "udid": { "type": "string" }, "is_itunesstore_account_enabled": { "type": "boolean" }, "local_host_name": { "type": "string" }, "is_firewall_enabled": { "type": "boolean" }, "is_full_disk_encryption_enabled": { "type": "boolean" }, "is_full_disk_encryption_institutional_key_present": { "type": "boolean" }, "is_full_disk_encryption_personal_key_present": { "type": "boolean" }, "is_system_integrity_protection_enabled": { "type": "boolean" }, "bluetooth_mac_address": { "type": "string" }, "wifi_mac_address": { "type": "string" }, "device_status": { "type": "string" }, "user_type": { "type": "string" }, "place": { "type": "string" }, "user_code": { "type": "string" }, "using_group_name": { "type": "string" }, "manager_name": { "type": "string" }, "managing_group_code": { "type": "string" }, "managing_group_name": { "type": "string" }, "apple_id": { "type": "string" }, "custom_item_001": { "type": "string" }, "custom_item_002": { "type": "string" }, "custom_item_003": { "type": "string" }, "board_name": { "type": "string" }, "brand_name": { "type": "string" }, "external_available_storage": { "type": "integer" }, "external_storage": { "type": "integer" }, "hardware_name": { "type": "string" }, "host_name": { "type": "string" }, "is_android_enterprise": { "type": "boolean" }, "mail_address1": { "type": "string" }, "timezone_id": { "type": "string" }, "is_android_debug_bridge_enabled": { "type": "boolean" }, "is_rooted": { "type": "boolean" }, "password_policy_status": { "type": "string" }, "sim_state": { "type": "string" }, "dhcp_ip_address": { "type": "string" }, "dhcp_server_ip_address": { "type": "string" }, "net_country_code": { "type": "string" }, "network_authentication_type": { "type": "string" }, "ssid": { "type": "string" }, "allowed_location_providers": { "type": "array", "items": { "type": "string" } }, "allow_usage_access": { "type": "string" }, "is_admin": { "type": "boolean" }, "imei": { "type": "string" }, "eas_device_identifier": { "type": "string" }, "modem_firmware_version": { "type": "string" }, "battery_level": { "type": "integer" }, "cellular_technology": { "type": "string" }, "is_activation_lock_enabled": { "type": "boolean" }, "is_device_locator_service_enabled": { "type": "boolean" }, "is_do_not_disturb_in_effect": { "type": "boolean" }, "is_icloud_backup_enabled": { "type": "boolean" }, "is_location_services_enabled": { "type": "boolean" }, "is_mdm_lost_mode_enabled": { "type": "boolean" }, "is_supervised": { "type": "boolean" }, "location_service_authorization_status": { "type": "string" }, "meid": { "type": "string" }, "hardware_encryption_caps": { "type": "string" }, "is_passcode_compliant_with_profiles": { "type": "boolean" }, "passcode_lock_grace_period": { "type": "integer" }, "is_passcode_present": { "type": "boolean" }, "jailbreak_status": { "type": "string" }, "current_mcc": { "type": "string" }, "current_mnc": { "type": "string" }, "is_data_roaming_enabled": { "type": "boolean" }, "is_personal_hotspot_enabled": { "type": "boolean" }, "is_roaming_enabled": { "type": "boolean" }, "anapp_installed_datetime": { "type": "string" }, "mail_address2": { "type": "string" }, "mail_address3": { "type": "string" }, "current_carrier_network": { "type": "string" }, "phone_number": { "type": "string" }, "subscriber_carrier_network": { "type": "string" }, "bluetooth_name": { "type": "string" }, "sim_country_code": { "type": "string" } } } } } }
3. 管理デバイスの管理Noリストを作成する処理
デバイス取得 API から取得した情報から、管理Noだけを抽出して管理No一覧を作成します。
3-1. 変数初期化:管理No一覧
管理Noの一覧が入る変数を初期化します。
「+新しいステップ」から「変数」を選択し、「変数を初期化する」を選択します。
各項目に、こちらを設定します。変数の名前は、自由に設定が可能です。
名前:assetNoListStr 種類:文字列
3-2. 管理Noの一覧を作成
管理Noを、先ほど用意した変数に入れていくことで、管理Noの一覧を作成します。
「+新しいステップ」から「コントロール」を選択し、「Apply to each」を選択します。
「以前の手順から出力を選択」に「data」を指定します。
3-3. データのチェック
さらに「アクションの追加」を選択します。
「コントロール」を選択し、「条件」を選択します。
条件を設定していきます。
左は「動的なコンテンツ」を選択して asset_no を選択します。
条件は「次の値に等しくない」とします。
右は「式」を選択して null と入力します。
3-4. 管理Noの一覧作成
次に「はいの場合」の「アクションの追加」を選択します。
「変数」を選択し、「変数の設定」を選択します。
名前は assetNoListStr を選択します。
値は、「動的なコンテンツ」を選択して asset_no を選択します。
各項目に、こちらを設定します。値の最後のカンマを忘れないように注意。
名前:assetNoListStr(先ほど用意した変数名です) 値:asset_no,
これで、管理Noの一覧が作成できました。
4. LANCSOPE クラウド版 API を実行
前項目で作成した管理No一覧を使用して、デバイス毎の前日の「起動時刻」「終了時刻」を取得します。
ここでは、活動時間取得 API を利用します。
4−1. 変数初期化:アクセス先URL
活動時間取得 API にアクセスするためのURLが入る変数を初期化します。
変数初期化なので、「+新しいステップ」から「変数」を選択し、「変数を初期化する」を選択します。
各項目に、こちらを設定します。
名前:nextActivityTimeURL 種類:文字列
4−2. 変数初期化:取得対象日
活動時間取得対象の開始日と終了日を入れる変数を初期化します。
今回は、前日の時間を取得したいため、開始日・終了日ともに1日前を指定します。
「変数を初期化する」で、「動的なコンテンツ」を選択し、「式」を選択して入力欄にこちらを入力します。
getPastTime(1,'Day','yyyy-MM-dd')
getPastTimeという関数を使用しています。
上記の関数を使いながら、各項目にこちらを設定します。getPastTime関数の中身は両方同じです。(開始日と終了日)
名前:checkDate 種類:アレイ 値: [ (関数getPastTimeを設定), (関数getPastTimeを設定) ]
4−2. LANSCOPE クラウド版の活動時間取得 API の URL を設定
活動時間取得 API にアクセスするためのURLを設定します。
「変数の設定」で nextActivityTimeURL を指定し、値にこちらのURLを入力します。
URLの中に関数を3つ使用します。(後述)
名前:nextActivityTimeURL 値:https://api.lanscopean.com/v1/reports/devices/activity_time?start_date=(関数variablesを設定)&end_date=(関数variablesを設定)&asset_no=(関数substringを設定)
1つ目の関数
開始日を指定します。
variables('checkDate')[0]
2つ目の関数
終了日を指定します。
variables('checkDate')[1]
3つ目の関数
管理Noを指定します。
substring(variables('assetNoListStr'),0,lastIndexOf(variables('assetNoListStr'),','))
最終的にこのようなアクションになります。
4−3. 活動時間取得 API の実行
LANSCOPE クラウド版の活動時間取得 API を実行して、デバイス毎の前日の「起動時刻」「終了時刻」を取得します。
「HTTP」を追加し、各項目でこちらを選択します。URIには前項目で用意した nextActivityTimeURL を指定します。
方法:GET URI:nextActivityTimeURL ヘッダー:[Authorization][Bearer <API利用申請時に発行されたトークン>]
4−4. API レスポンスの JSON 解析
活動時間取得 API を実行して得られたレスポンスを解析します。
「+新しいステップ」から「データ操作」を選択し、「JSONの解析」を選択します。
各項目に、こちらを設定します。
コンテンツ:本文
スキーマ:(下記をクリックするとスキーマを確認することができます)
スキーマ
{ "type": "object", "properties": { "data": { "type": "array", "items": { "type": "object", "properties": { "date": { "type": "string" }, "asset_no": { "type": "integer" }, "start_datetime": { "type": "string" }, "end_datetime": { "type": "string" } }, "required": [ "date", "asset_no", "start_datetime", "end_datetime" ] } } } }
5. フロー内で使用する変数の初期化
ここまでで、デバイス毎の前日の起動時刻・終了時刻を取得することができました。
残りは、稼働時間を計算してチャットに通知です。
その前に、後のフローで使用する変数をここで一気に用意します。
全て、「+新しいステップ」から「変数」を選択し、「変数を初期化する」で作成します。
5-1. 変数初期化:デバイス起動時刻
デバイス起動時刻を入れるための変数を用意します。
名前:tempStartTime 種類:文字列
5-2. 変数初期化:デバイス起動時刻を数値変換
デバイス起動時刻を数値変換した値を入れるための変数を用意します。
PowerAutomate では、時刻形式の差分を出すことができないため、一度数値に変換してから計算する必要があります。
名前:startTime 種類:整数
5-3. 変数初期化:デバイス起動時刻を日本時間変換
デバイス起動時刻を日本時間に変換した値を入れるための変数を用意します。
名前:startTimeJst 種類:文字列
5-4. 変数初期化:デバイス終了時刻
デバイス終了時刻を入れるための変数を用意します。
名前:tempEndTime 種類:文字列
5-5. 変数初期化:デバイス終了時刻を数値変換
デバイス終了時刻を数値変換した値を入れるための変数を用意します。
名前:endTime 種類:整数
5-6. 変数初期化:デバイス終了時刻を日本時間変換
デバイス終了時刻を日本時間に変換した値を入れるための変数を用意します。
名前:endTimeJst 種類:文字列
5-7. 変数初期化:稼働時間(Hours)
デバイス起動時刻と終了時刻の差分(つまりデバイス稼働時間)を入れるための変数を用意します。
こちらには「時間」が入ります。
名前:workHours 種類:整数
5-8. 変数初期化:稼働時間(Minutes)
デバイス起動時刻と終了時刻の差分(つまりデバイス稼働時間)を入れるための変数を用意します。
こちらには「分」が入ります。
名前:workMinutes 種類:整数
5-9. 変数初期化:通知メッセージ
通知メッセージを入れるための変数を用意します。
値は、メッセージ通知したいタイトルを入れます。
名前:message 種類:文字列 値:[info]昨日長時間稼働していたデバイスをお知らせします(12時間以上)[/info]
6. デバイス毎に稼働時間を計算
デバイス毎に稼働時間を計算して、前日に一定時間以上稼働していたデバイスを抽出します。
6−1. データの設定
「+新しいステップ」から「コントロール」を選択し、「Apply to each」を選択します。
「動的なコンテンツ」で「data」を選択します。
この時、「活動時間取得APIのレスポンスのJSON解析」の data を使います。
6−2. データのチェック
さらに「アクションの追加」を選択します。
「コントロール」を選択し、「条件」を選択します。
条件を設定していきます。
左は「動的なコンテンツ」を選択して asset_no を選択します。この時、「活動時間取得APIのレスポンスのJSON解析」の asset_no を使います。
条件は「次の値に等しくない」とします。
右は「式」を選択して null と入力します。
6−3. デバイス起動時刻を設定
API 取得したデバイスの起動時刻を設定します。
「はいの場合」の「アクションの追加」を選択します。
「変数」を選択し、「変数の設定」を選択します。
名前は tempStartTime を選択します。
値は、「動的なコンテンツ」を選択してstart_datetime を選択します。
6−4. デバイス起動時刻を数値変換
「アクションの追加」から「変数の設定」を選択します。
名前は startTime を選択します。
値は、「式」を選択してこちらを入力します。
ticks(variables('tempStartTime'))
ticks 関数を使用することで、時刻を数値変換し、稼働時間を計算できるようになります。
6−5. デバイス起動時刻を日本時間変換
「アクションの追加」から「変数の設定」を選択します。
名前は startTimeJst を選択します。
値は、「式」を選択してこちらを入力します。
convertTimeZone(variables('tempStartTime'),'UTC','Tokyo Standard Time','yyyy-MM-dd HH:mm:ss')
6−6. デバイス終了時刻を設定
API 取得したデバイスの終了時刻を設定します。
「アクションの追加」から「変数の設定」を選択します。
名前は tempEndTime を選択します。
値は、「動的なコンテンツ」を選択してend_datetime を選択します。
6−7. デバイス終了時刻を数値変換
「アクションの追加」から「変数の設定」を選択します。
名前は endTime を選択します。
値は、「式」を選択してこちらを入力します。
ticks(variables('tempEndTime'))
6−8. デバイス終了時刻を日本時間変換
「アクションの追加」から「変数の設定」を選択します。
名前は endTimeJst を選択します。
値は、「式」を選択してこちらを入力します。
convertTimeZone(variables('tempEndTime'),'UTC','Tokyo Standard Time','yyyy-MM-dd HH:mm:ss')
6−9. 稼働時間(Hours)を計算
「アクションの追加」から「変数の設定」を選択します。
名前は workHours を選択します。
値は、「式」を選択してこちらを入力します。
div(sub(variables('endTime'),variables('startTime')),36000000000)
ここの計算で、起動時刻と終了時刻の時間の差を計算し、デバイス稼働時間を出しています。(時間だけを見ており、分は考慮していません)
6−10. 稼働時間(Minutes)を計算
「アクションの追加」から「変数の設定」を選択します。
名前は workMinutes を選択します。
値は、「式」を選択してこちらを入力します。
mod(div(sub(variables('endTime'),variables('startTime')),600000000),60)
前項目で時間しか考慮していないので、ここで分の計算もします。
6−11. デバイス稼働時間と設定時間の比較
ここで、デバイス稼働時間と設定した時間の比較を行なって、長時間業務を抽出します。
「アクションの追加」を選択します。
「コントロール」を選択し、「条件」を選択します。
条件を設定していきます。
左は「動的なコンテンツ」を選択して workHours を選択します。
条件は「次の値以上」とします。
右は「式」を選択して 12 と入力します。ここの値が、「長時間」の定義になるので、必要に応じて変更します。
これで、前日に12時間以上起動されていたデバイスを抽出することができました。残すは通知です!
6−12. 通知する文章を設定
「はいの場合」の「アクションの追加」を選択します。
「変数」を選択し、「変数の設定」を選択します。
名前は message を選択します。
値には通知したい文章を記入し、表示したい情報を「動的なコンテンツ」から選択します。
7. チャットワークに通知
最後、チャットワークに通知を行います。通知自体はslackやTeamsでも可能です。
URIの <ルームID> には、通知したいルームのIDを入れます。
ヘッダーには、チャットワークで取得したトークン情報を入れます。
方法:POST URI:https://api.chatwork.com/v2/rooms/<ルームID>/messages ヘッダー:[X-ChatWorkToken] [chatworkのトークン] [Content-Type][application/x-www-form-urlencoded]
これで、チャットワークに通知が完了です!
実際の通知内容はこちらです。
おわりに
以上、長時間業務していた社員を通知するためのシステムの作成でした。
実際作成してみると膨大な量になり、「プログラミングならもっと汎用性あるのに!もっとこうしたいのに!」と思う部分も多々あったのが本音です・・・
作成には時間を要しますが、上記サンプルを参考いただけばローコストに実現できると思います。
ただ、PowerAutomate を利用することで実行環境を用意しなくてよいのは大きなメリットでもあると感じます。今回紹介したものは一例ですが、API を利用して業務自動化が進むことを願っています!