MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensのRestAPIをPythonで実行する その2(ファイルのダウンロード)

本日は HoloLens の調査枠です。
前回記事の続きです。
bluebirdofoz.hatenablog.com

今回はパラメータを用いて、HoloLensの特定のディレクトリのファイルをダウンロードしてみます。

なお、HoloLens で利用可能な API は以下の公式ページにまとめられています。
・デバイス ポータル コア API リファレンス(すべての Windows 10 デバイスに共通する API)
docs.microsoft.com
・デバイス ポータル Mixed Reality API リファレンス(HoloLens で利用できるすべての REST API の拡張リスト)
docs.microsoft.com

pythonサンプルコード

HoloLens の特定ディレクトリのファイルを取得する python スクリプトを作成します。
ファイルアクセスの API は以下の /api/filesystem/apps/file です。
f:id:bluebirdofoz:20190125001625j:plain

/api/filesystem/apps/file は knownfolderid や filename をパラメータとして指定する必要があります
Picuture フォルダから TestImage.jpg を取得する python スクリプトを作成してみました。
・GetPicture.py

# import
import requests
import base64
import os
from datetime import datetime

# 実行指定で呼び出されているかチェック
if __name__ == "__main__":

    print('--------------------------- START ---------------------------')
    # DevicePortal接続のための設定項目
    # username:DevicePortalアクセスのユーザ名
    # password:DevicePortalアクセスのパスワード
    # ipaddress:DevicePortalアクセスのIPアドレス
    # isVerify:証明書の利用(自己証明書なので無視する)
    username = 'USERNAME'
    password = 'PASSWORD'
    ipaddress = '192.168.XX.XXX'
    isVerify = False

    # RestAPIアクセスのURLを作成
    api = '/api/filesystem/apps/file'
    url = 'http://' + ipaddress + api

    # パラメータを指定
    payload = {'knownfolderid': 'Pictures', 'filename': 'TestImage.jpg', 'packagefullname': '\\', 'path': '\\Camera Roll', 'op': 'stream'}

    # RestAPIのURLと設定を指定してGET/POST実行
    response = requests.get(url, params = payload, auth=(username, password), verify = isVerify, stream = True)

    # RestAPIの応答メッセージを受信
    response.status_code
    image = response.content

    # 受信したメッセージタイプを標準出力で確認
    print('--------------------------- RESPONSE JSON ---------------------------')
    print(response.headers['content-type'])
    print(response.status_code)

    # ダウンロードディレクトリの指定
    downloadDir = 'C:\\Users\\PCNAME\\Desktop\\hololens\\20190119\\HoloLensAPITest\\HoloLensAPITest\\TestProgram\\Download'
    fileName = 'download.jpg'

    # バイナリデータをファイルに書き込み
    saveFileName = datetime.now().strftime("%Y%m%d_%H%M%S_") + fileName
    saveFilePath = os.path.join(downloadDir, saveFileName)
    with open(saveFilePath, 'wb') as saveFile:
        saveFile.write(image)

    print('--------------------------- END ---------------------------')

実行してみた結果が以下になります。
f:id:bluebirdofoz:20190125001702j:plain

指定したダウンロード先フォルダを確認すると、画像ファイルがダウンロードできています。
f:id:bluebirdofoz:20190125001712j:plain

パラメータの調査方法

例えば、対象ディレクトリの knownfolderid のタグを調べたい場合です。

DevicePortal が実際にこのRestAPIを用いた通信を行っています。
GoogleChrome の場合、F12 でデベロッパーツールを開くことで、通信しているメッセージ内容を確認できます。
メッセージを確認するには[Network]タブを開きます。
f:id:bluebirdofoz:20190125001722j:plain

例えば、この状態で Picture ディレクトリにあるファイルに対して[Delete]ボタンを押してみます。
すると新しいメッセージがリストに追加され、これをクリックするとその詳細が確認できます。

内容を確認すると、/api/filesystem/apps/file の RestAPI に対して DELETE メッセージを送信しています。
更に URL を読みとくと knownfolderid に Pictures を設定していることが分かります。
f:id:bluebirdofoz:20190125001741j:plain

次はPOSTメッセージを利用し、ファイルをアップロードしてみます。
bluebirdofoz.hatenablog.com