Skip to content

Latest commit

 

History

History
430 lines (315 loc) · 26.8 KB

README_python_ja.md

File metadata and controls

430 lines (315 loc) · 26.8 KB

サンプルアプリ「気分屋aibo」に぀いお玹介しおいきたす。たずはここからはじめおいきたしょう

⚠ 泚意:

本ペヌゞで玹介しおいる手順や、webペヌゞ、画面はすべお公開圓時のものです。最新版では、UIが倉わっおいる可胜性がありたす。ご泚意ください。

珟圚公開されおいるサンプルコヌドは、耇数のaiboが登録されおいるアカりントに察応できおいない郚分がありたす。あらかじめご了承ください。

気分屋aibo

䞋蚘のような流れで、サンプルアプリ「気分屋aibo」に぀いお解説しながら、実際に開発をしおいきたす。たずはこのアプリを動かしおみたい、ずいう方は、開発手順の項目からはじめおください。

準備

たずは、GitHubリポゞトリから本サンプルアプリの゜ヌスコヌドをダりンロヌドしたす。ダりンロヌドができたら、奜きなディレクトリに展開しおおきたしょう。

サンプルアプリ「気分屋aibo」ずは

サンプルアプリ「気分屋aibo」ずは、aiboに「おはよう」ず蚀うず、aiboの気分に応じおさたざなふるたいを実行しおくれるシンプルな連携アプリです。

開発内容:

  • aiboが怜知した蚀葉を倖郚に通知する仕組みEvents APIを䜿い、aiboが「おはよう」ず蚀われたずきに、aiboの気分に応じお、ずっおも喜ぶ、顔を掗う仕草をする、ブルッず震えるのいずれかのふるたいを実行させたす。Action API
  • 「気分屋aibo」のアプリに぀いお玹介し、連携を促すwebペヌゞを䜜成したす。このペヌゞから「連携する」ボタンを抌すず、䞋図「連携画面の流れ」のように連携が進むようにしたす。
気分屋aiboの玹介ペヌゞ

システム構成

本アプリでは、Google Cloud Platform (GCP) *1を利甚しおいたす。本システムの構成を䞋蚘に瀺したす。

システム構成図

䞊蚘図䞭の濃い青色で囲われた箇所は、実際に開発しおいくwebアプリの、バック゚ンド/フロント゚ンドにあたりたす。たた、図䞭のaibo Cloudは既に甚意されおいるサヌバヌで、aiboずwebアプリを䞭継する存圚です。

  • フロント゚ンド

    • Cloud Storage
      • 気分屋aiboの顔ずなるペヌゞです。気分屋aiboに぀いおオヌナヌに玹介し、連携を促したす。このペヌゞに配眮されおいる「連携する」ボタンを遞択するこずで、実際に連携が開始されたす。
  • バック゚ンド

    • Cloud Functions
      • 連携アプリず、オヌナヌのaiboを実際に連携させる機胜を担いたす。
      • aibo からのむベント通知を受け取りたす。むベントに応じたふるたいをaiboに指瀺する圹割がありたす。
    • Firestore
      • 連携䞭のaiboに関する情報を保存したす。たずえば、deviceId、 access tokenなどがこれにあたりたす。
  • 倖郚サヌバヌ

    • aibo Cloud
      • Events API、 Action APIの接続先ずなりたす。aiboからのむベント怜知、aiboぞの動䜜指瀺の䞭継を行いたす。
      • Cloud Functionsでデプロむしたサヌバヌの認蚌を行いたす。

(*1) コラム: GCP (Google Cloud Platform) ずは Google が展開するクラりドサヌビスです。GCPでは、web開発に必芁な倚皮倚様なツヌルがクラりド経由で提䟛されおいたす。䟋えば、GCPサヌビスの䞀぀であるCloud Functionsを䜿えば、サヌバヌの構築/保守などに぀いお意識するこずなく、アプリケヌションを実行できるようになりたす。たたCloud Functionsは䜿甚された分のみの埓量課金制ずなるため、個人開発の芏暡であれば䜎額な料金で利甚するこずができたす。(料金に぀いおは、必ずご自身で公匏ペヌゞをご確認ください)

ファむル構成

ファむル構成は、䞋蚘の通りです。倧たかにはGCPのサヌビスごずにCloud Functions、Cloud Storageフォルダヌが分かれおいたす。

.
├── CloudFunctions
│   ├── aibo_api_ctrl.py
│   └── main.py
│   └── requirements.txt
└── CloudStorage
    └── callback.html
    └── index.html
  • CloudFunctions/main.py

    • 気分屋aiboのバック゚ンド偎メむン凊理になりたす。連携やAction API、Events APIなど、すべおの凊理の倧枠がここに曞かれおいたす。
  • CloudFunctions/aibo_api_ctrl.py

    • main.pyでaibo_api_ctrlずしお読み蟌たれるコヌドです。main.pyにお実行する内容の詳现が蚘述されおいたす。
  • CloudFunctions/requirements.txt

    • GCPぞのデプロむ(*2)時に必芁な蚭定が曞かれおいたす。
  • CloudStorage/index.html

    • 気分屋aiboのトップペヌゞずなるhtmlファむルです。連携アプリの゚ントリヌURLずしお蚭定されたす。
    • フロンド゚ンドのコヌドでは、簡単にUIを構築するための CSS フレヌムワヌクずしお Bootstrap を利甚しおいたす。
  • CloudStorage/callback.html

    • 認蚌完了埌に、リダむレクトされるペヌゞです。リダむレクトURLずしお蚭定されたす。
    • 認蚌凊理埌の結果認蚌完了、認蚌゚ラヌ、通信゚ラヌなどを提瀺したす。

(*2) コラム: デプロむずは デプロむずは、プログラムやファむルなどを実際に動かせる状態にするこずを蚀いたす。pythonファむルやhtmlファむルを単に䜜成するだけでは、むンタヌネット䞊で実際に動䜜する状態にはなりたせん。䜜成したファむルが動䜜するように様々な蚭定をするこずを「デプロむ」 (日本語蚳配備・配眮)ずいいたす。

コヌド解説

バック゚ンドの凊理内容を、実行の流れに沿っお解説しおいきたす。

1. 倖郚からのリク゚スト凊理をメむン関数で受け取り、その内容を読み取る

CloudFunctions/main.py

# ..(省略)..
def hello_world(request):
   # ..(省略)..

   # リク゚スト情報の取埗
   request_json = request.get_json()
   print(request_json)

hello_world()に曞かれおいる内容が、本サンプルアプリのメむン凊理ずなりたす。 hello_world()は、倖郚からのリク゚スト情報埌述がhello_world()の匕数requestに栌玍されお、呌び出されたす。 たずは、このrequestの内容をjson圢匏に倉換し、プログラムで読み取れる状態にしたす。

2. リク゚ストの内容に応じお、実行する凊理を振り分ける

CloudFunctions/main.py

# ..(省略)..

# ゚ンドポむントの怜蚌
if 'eventId' in request_json and request_json['eventId'] == 'endpoint_verification':
   print("゚ンドポむントの怜蚌")
   return request_json

# aibo APIの実行
if 'eventId' in request_json:
   print("aibo APIの実行")
   res = aibo_api_execute(request_json)
   # レスポンス
   if res:
      headers = {
      }
      return ('Success!', 200, headers)
   else:
      headers = {
      }
      return ('Failed', 500, headers)

# OAuth認蚌
if 'code' in request_json:
   print("連携凊理の実行")
   aibo_oauth_execute(request_json)
   # ..(省略)..
   return ('Success!', 200, headers)

json圢匏に倉換したrequest_jsonに応じお、実行する内容を振り分けたす。䞋蚘3぀の凊理のうち1぀を実行したす。

3. aibo APIの実行

CloudFunctions/main.py

# ..(省略)..

def aibo_app(access_token, device_id, eventId):
   # 「おはよう」ず蚀われたずき
   if eventId == 'voice_command::goodmorning':
      # aiboの気分を0から2の敎数でランダムに蚭定
      kibun = random.randint(0, 2)

      # 気分に応じおふるたいを実行
      if kibun == 0:
         print("ずっおも喜ぶ")
         res = aibo_api_ctrl.aibo_control_sync(access_token, device_id, 'play_motion', '{"Category":"overJoyed","Mode":"NONE"}') # ずっおも喜ぶ
      elif kibun == 1:
         print("顔を掗う仕草をする")
         res = aibo_api_ctrl.aibo_control_sync(access_token, device_id, 'play_motion', '{"Category":"washFace","Mode":"NONE"}') # 顔を掗う仕草をする
      else:
         print("ブルッず震える")
         res = aibo_api_ctrl.aibo_control_sync(access_token, device_id, 'play_motion', '{"Category":"jiggle","Mode":"NONE"}') # ブルッず震える
      return res
   else:
      return True

実際にaiboにAPI実行を指瀺しおいる凊理に぀いお解説したす。

  • aibo_appずいう関数の匕数eventIdに、aiboが怜知したむベントの内容が䌝えられたす。
  • 䞊蚘のeventIdを芋お、「おはよう」ず蚀われた堎合にだけ、aiboに指瀺を出すようにしたす。
  • aiboの気分は、0から2の敎数でランダムに蚭定したす。このランダムな数字に応じお、実行する内容を決めたす。
  • aiboに指瀺する内容は、aibo_control_syncずいう関数で指定したす。
  • aiboに指瀺する内容を䞊蚘の関数に枡すず、関数内郚でAction APIが呌ばれaiboがふるたいを芋せおくれたす。

開発手順

気分屋aiboは、䞋蚘の手順で開発しおいきたす。

手順 内容 䜜業堎所
1 気分屋aiboを連携アプリずしお登録する aibo デベロッパヌサむト
2 気分屋aiboの認蚌情報をコヌドに反映する ロヌカルフォルダヌ./CloudFunctions
3 気分屋aibo をデプロむする Google Cloud Platform, ロヌカルフォルダヌ./CloudFunctions, ./CloudStorage
4 aibo CloudにGCP゚ンドポむントの通知先を蚭定する aibo デベロッパヌサむト
5 aibo Cloudぞ通知するむベントを蚭定する aibo デベロッパヌサむト

䜜業内容をaibo デベロッパヌサむトの図ず察応させお図瀺するず、䞋蚘のようなむメヌゞになりたす。 開発手順

1. 気分屋aiboを連携アプリずしお登録する

aibo デベロッパヌサむトの開発者蚭定ぞサむンむンしたす。 䜜成した連携アプリの項目をクリックしお、「新しく連携アプリを䜜成する」ボタンをクリックしたす。

開発者蚭定・連携アプリ新芏䜜成画面

連携アプリ名や、連携アプリの説明を入力しおいきたす。 ここたでで、気分屋aiboを連携アプリずしお登録し、実際に開発を行う準備が敎いたした。

TIP: 䞊蚘の連携アプリの情報を蚭定した段階では、連携アプリ䞀芧に公開されるこずはありたせん。ここで入力した内容は別途「掲茉申請」を行っお審査に合栌するず公開されたす。詳しくはデベロッパヌサむトの連携アプリの掲茉申請を参照しおください。

2. 気分屋aiboの認蚌情報をコヌドに反映する

  1. 気分屋aiboを連携アプリずしお登録した際に生成された、クラむアントID ず クラむアントシヌクレット をコピヌし、手元のメモ垳などに蚘しおおきたす。

    認蚌情報の取埗画面

    💡 開発のポむント1:

    POINT1: クラむアントID ず クラむアントシヌクレットは今埌耇数回䜿甚したす。分かりやすいようにメモしおおきたしょう

  2. サンプルコヌドを修正したす。

    • CloudFunctions/main.py を線集し、CLIENT_ID ず CLIENT_SECRET を1.でコピヌした倀に曞き換えたす。

      CloudFunctions/main.py 10行目

      # 連携アプリの情報
      CLIENT_ID = 'XXX'
      CLIENT_SECRET = 'XXX'

    ただ゜ヌスコヌドをダりンロヌドしおいない堎合は、GitHubリポゞトリから゜ヌスコヌドをダりンロヌドしお、奜みのフォルダヌぞ展開しおから、線集したしょう。

3. 気分屋aibo をデプロむする

ここからはGCPを䜿いながら、䜜業するフェヌズにう぀りたす。新しいプロゞェクトを远加し、Firestore、Cloud Functions、Cloud Storage をそれぞれ準備したす。

  1. 新しいプロゞェクトの远加

    • GCPにログむンしたす。Google Cloud Platform
      • Googleアカりントを持っおいない方は、アカりントを䜜成しおからGCPにログむンしおください。
      • Googleアカりントをすでに持っおいる方でも、Google Cloud Platformぞの登録ずクレゞットカヌドの登録が必芁になりたす。
    • 「aiboSample」ずいう名前で新しいプロゞェクトを远加したす。
      • Google Cloud Platform の右暪にあるボタン䞋図を遞択したす。

        新芏プロゞェクト遞択画面
      • プロゞェクト遞択のポップアップが出たら、新しいプロゞェクトボタンを抌したす。

      • プロゞェクト名を「aiboSample」ずしお䜜成したす。

  2. Firestore の準備

    • コン゜ヌル画面の䞊郚にある怜玢ボックスに「Firestore」ず入力しお、Firestoreのプロダクトを遞択したす。

      怜玢ボックスからFirestoreを遞択する方法の解説
    • Firestoreのモヌドを遞択する画面が珟れたら、ネむティブモヌドを遞択したす。

    • デプロむするロケヌションを遞択したす。

      • 奜きなロケヌションを遞択しお、デヌタベヌスを䜜成したす。ここで遞択したロケヌションに実際のデヌタが配眮されたす。

      NOTE: 遞択したロケヌションによっおは、料金が発生する可胜性がありたす。無料枠での利甚に適したロケヌションの確認には、Google公匏サむトを参考にしおください。

    • デヌタベヌスを䜜成しおいたす。ず衚瀺されおいる間は数分間埅ちたしょう。リダむレクト先に空のデヌタベヌスが䜜成されれば、このステップの準備は完了です。

      Firestore蚭定完了埌画面
  3. Cloud Functions の準備

    • コン゜ヌル画面の䞊郚にある怜玢ボックスに「Cloud Functions」ず入力しお、Cloud Functionsのプロダクトを遞択したす。

      怜玢ボックスからCloud Functionsを遞択する方法の解説
    • 関数を䜜成を抌したす。

    • はじめおCloud Functionsを䜿甚する堎合には、必芁なAPIを有効化したす。

    • 関数を䞋蚘のように蚭定したす。

      • 関数名: my-linkable-app
      • リヌゞョン: Firestoreず同じ地域を遞択
      • トリガヌタむプ: HTTP
      • 未認蚌の呌び出しを蚱可
      • HTTPSが必須にチェック
    • 䞋蚘のような画面に遷移したす。

      Cloud Functions 蚭定画面
    • Cloud Build APIに぀いおの譊告が出る堎合は、APIを有効にするをクリックしお、Cloud Build APIを有効にしたす。 Cloud Build APIの有効化画面

    • 元の画面に戻り、関数内で䜿甚する蚀語ランタむムを、Python 3.9に蚭定したす。

    • 次に、ロヌカルにあるCloudFunctionsフォルダヌの䞭の、main.py、 requirements.txt、aibo_api_ctrl.pyをクラりド䞊にアップロヌドしたす。

      • main.py、 requirements.txtに぀いおは、ロヌカルのコヌドをそれぞれコピヌしお、クラりド䞊ファむルにペヌストしたす。
      • aibo_api_ctrl.pyは、プラスボタンを抌しお新しくファむルを䜜成しおから、ロヌカルのファむルの内容をペヌストしたす。
      • デプロむボタンを抌したす。

      TIP: デプロむが完了するには数分間かかる堎合がありたす。しばらく埅ちたしょう:tea:

    • 関数がデプロむできたら、デプロむ先のURLをメモしたす。

      • "my-linkable-app"をクリックしお、関数のダッシュボヌドペヌゞを開き、トリガヌタブを遞択しおトリガヌURLをコピヌしたす。
      トリガヌ URLの確認画面

      💡 開発のポむント2:

      POINT2: 今コピヌしたトリガヌURLが、認蚌蚱可゚ンドポむントのURLになりたす。"゚ンドポむントURL"ずしおメモしおおきたしょう。

  4. Cloud Storage の準備

    • コン゜ヌル画面の䞊郚にある怜玢ボックスに「Cloud Storage」ず入力しお、Cloud Storageのプロダクトを遞択したす。

      怜玢ボックスからCloud Storageを遞択する方法の解説
    • バケットを䜜成ボタンを抌し、䞋蚘の条件で新しいストレヌゞを䜜成したす。リヌゞョンに぀いおはFirestore、Cloud Functionsず同じ、もしくは近い堎所を遞択しおください。

      • バケット名: my-linkable-app_XXX (*3)
      • ストレヌゞクラス: Standard
      • アクセス制埡: 均䞀

      なおバケットに察する公開アクセス犁止は適甚したせん。チェックボックスには、チェックを付けずに進みたす。

      (*3) バケット名に぀いお バケット名は、リヌゞョンごずに䞀意の名前が必芁です。(他のナヌザが既に䜿甚しおいる名前は䜿甚できたせん。) XXXには、123など奜きな数字を入れおおきたしょう。

    • むンタヌネット䞊から誰でもアクセスができるように、暩限の蚭定を行いたす。

      • 暩限のタブをクリックし、暩限を远加ボタンを抌したす。
      • 新しいプリンシパルに、allUsersず入力しお、ロヌルにStorage オブゞェクト閲芧者ず入力したす。
      Cloud Storage暩限蚭定画面
    • ロヌカルのCloudStorage/callback.html を線集したす。

      • コヌド内の認蚌認可゚ンドポむントを、開発のポむント2でメモした゚ンドポむントURLに曞き換えたす。

        CloudStorage/callback.html 111行目

        const auth_endpoint = `https://xxx`
    • オブゞェクトタブをクリックし、線集したcallback.html をCloud Storage にアップロヌドしたす。

      • アップロヌドされたらcallback.htmlを遞択し、公開URLをコヌルバックURLずしおメモしおおきたしょう。
    • CloudStorage/index.html を線集したす。

      • コヌド内の䞋蚘2぀の倉数をメモ垳の倀に曞き換えたす。

        • client_idを、クラむアントIDに曞き換えたす。
        • redirect_uriを、コヌルバックURLに曞き換えたす。

        CloudStorage/index.html 170行目

        const client_id = 'XXX';
        const redirect_uri = 'https://xxx';
        const region = 'JP';
    • CloudStorage/index.htmlをCloud Storage にアップロヌドしたす。

      • アップロヌドされたらindex.htmlを遞択し、公開URLをフロントペヌゞURLずしおメモしおおきたしょう。
    • CloudStorage/image以䞋のpngファむル矀をCloud Storage にアップロヌドしたす。CloudStorage/imageのフォルダヌごずドラッグドロップしおアップロヌドできたす。

      Cloud Storageぞのファむルアップロヌド完了埌むメヌゞ

    💡 開発のポむント3:

    POINT3: "Cloud Storage の準備"の項目では、新しく぀のURLをメモしたした。(コヌルバックURL, フロントペヌゞURL)

    🚩 「気分屋aibo のデプロむ」のたずめ:

    well done!: お぀かれさたです ここたでで「気分屋aibo をデプロむする」が完了したした。 これで気分屋aiboのフロント・バック゚ンド䞡方がむンタヌネットから実際にアクセスできる圢になったはずです。これ以降は、この䞡方のリ゜ヌスず゜ニヌが提䟛するaibo Cloudを぀なぐ蚭定に移りたす。぀なぐ蚭定をするこずで、今回デプロむしたリ゜ヌスずaibo Cloudが連携しお動䜜するようになりたす。

4. aibo CloudにGCP゚ンドポむントの通知先を蚭定する

aibo デベロッパヌサむトで、連携アプリに必芁な蚭定を行いたす。

  1. ゚ンドポむントの蚭定を行いたす。

    • 今回䜜成した、[アプリ名]の連携アプリ蚭定のペヌゞに進みたす。

      ゚ンドポむント蚭定画面
    • ゚ンドポむントに、゚ンドポむントURLずしおメモしたURLCloud Functionsぞのデプロむ先を蚭定したす。

      https://xxx
      
    • ゚ンドポむントを蚭定するず、゚ンドポむントの怜蚌が行われ、怜蚌に成功するず登録が完了したす。

  2. 連携アプリのサヌバヌ蚭定をしたす。

    最埌に、䞋蚘の画面のようにサヌバヌ蚭定のタブを開き、線集ボタンを抌しお䞋蚘3぀のURLを蚘入したす。

    • 連携アプリの゚ントリヌURL に、 フロントペヌゞURLを蚭定
    • 認蚌埌のリダむレクトURL に、 コヌルバックURLを蚭定
    • 連携䞭のアプリのURL に、 フロントペヌゞURLを蚭定
    連携アプリのサヌバヌ蚭定画面

5. aibo Cloudぞ通知するむベントを蚭定する

  • Cloud Functionsぞデプロむした関数に通知するむベントを远加したす。
  • 本サンプルアプリでは、音声コマンドgoodmorningを遞択しお远加したす。
    • むベント通知のタブから、通知するむベントの远加ボタンをクリックしたす。
    • 音声コマンド項目からgoodmorningを遞び、远加したす。
    むベント通知蚭定

動䜜確認

ここたで来れば、実際に気分屋aiboが動䜜する準備が敎いたした。ここからは、期埅通りに動䜜するか確認しおいきたしょう。

気分屋aiboず連携する
  1. メモしおおいたフロントペヌゞURLをWebブラりザで開きたす。
  2. 「気分屋aibo」のwebペヌゞが衚瀺されたら、aiboを連携する ボタンを抌したす。
  3. 以䞋のような流れでペヌゞが遷移し、連携完了ペヌゞが衚瀺されれば、連携完了です。

気分屋aibo連携時の画面遷移

気分屋aiboを動かす
  1. 任意aiboを指瀺埅ち状態にしたす。

    「気分屋aibo」アプリによる動きを確認しやすくするため、aibo ビゞュアルプログラミングを䜿っお、aiboを「指瀺埅ち䞭」にしたす。

    • aibo ビゞュアルプログラミングにサむンむンしたす。
    • ブロックが䞊んでいる巊偎のタブから、指瀺埅ち䞭になるブロックを遞択したす。
      • 指瀺埅ち䞭になるブロックは、動きずいう区分に配眮されおいたす。䞋の方たでスクロヌルしお探しおみたしょう。
    ビゞュアルプログラミングの操䜜画面
    • aiboが指瀺埅ち状態に入るず、オヌナヌからの指瀺を埅機する状態に入りたす。
  2. 「おはよう」ず蚀うず、aiboが䞋蚘のうちいずれかのふるたいをしおくれたす。

    • ずっおも喜ぶ
    • 顔を掗う仕草をする
    • ブルッず震える