:::info **<第10回Web会議日程>** 2023年08月23日(水)19:00から ::: ## 第9回 解説 ### ・課題 **現在、「<span style="color:blue">lambda_function.py</span>」は、以下のようにLINEで入力した場合、** **HotpepperAPIを利用し、おすすめのお店を1軒紹介します** ![](https://hackmd.io/_uploads/rJqiG4zF2.png) **同様の入力をした場合に、お店の名前に加え、お店の画像と** **付加情報をLINEに返すよう処理を追加してください** ![](https://hackmd.io/_uploads/Sya9zVfth.png) ### ・回答例 「<span style="color:blue">hotpepper_function.py</span>」  ※一部抜粋 ```python= def shop_search(from_text): # リストの要素数が2つの場合 if( len(str) == 2 ): # ~省略~ #  # レスポンスを辞書型に変換 response_dict = response.json() # JSONデータの中からお店の名前を取得 shopname = response_dict['results']['shop'][0]['name'] # LINEに応答する付加情報を取得 mobile_access = response_dict['results']['shop'][0]['mobile_access'] catch = response_dict['results']['shop'][0]['catch'] photo = response_dict['results']['shop'][0]['photo']['pc']['l'] to_text = [shopname,mobile_access,catch,photo] else: to_text = '2行目に検索キーワードを入力してください' return to_text # ~省略~ ``` ### ・解説 「<span style="color:blue">hotpepper_function.py</span>」 #### ① LINEに応答する付加情報を取得 「response_dict」から任意の情報を5つまで取得し、 それぞれ変数に代入する ```python shopname = response_dict['results']['shop'][0]['name'] mobile_access = response_dict['results']['shop'][0]['mobile_access'] catch = response_dict['results']['shop'][0]['catch'] photo = response_dict['results']['shop'][0]['photo']['pc']['l'] ``` #### ②「to_text」にリスト型で代入 1で取得したそれぞれの要素を [ ] で括り、 リスト型として、「to_text」に代入する ```python to_text = [shopname,mobile_access,catch,photo] ``` ### ・回答例 「<span style="color:blue">lambda_function.py</span>」  ※一部抜粋 ```python= # ~省略~ def lambda_handler(event, context): # ~省略~   if type(to_text) is str: params['messages'].append({}) params['messages'][0]['type'] = 'text' params['messages'][0]['text'] = to_text else: for no,item in enumerate(to_text): if item.endswith('.jpg'): params['messages'].append({}) params['messages'][no]['type'] = 'image' params['messages'][no]['originalContentUrl'] = item params['messages'][no]['previewImageUrl'] = item else: params['messages'].append({}) params['messages'][no]['type'] = 'text' params['messages'][no]['text'] = item # ~省略~ ``` ### ・解説 「<span style="color:blue">lambda_function.py</span>」 #### ①「to_text」のデータ型 「to_text」が文字列だった場合の分岐を作成し、これまで通り、 リスト型「messages」内に、type、textのキーを持つ辞書を1つ定義する ```python if type(to_text) is str: params['messages'].append({}) params['messages'][0]['type'] = 'text' params['messages'][0]['text'] = to_text ``` ![](https://hackmd.io/_uploads/SyNV70XF3.png) #### ②「messages」への要素の追加/③画像の場合の処理 「to_text」が文字列ではない場合、リスト型のため、 リストのインデックスと要素をまとめて取り出せるenumerateを利用して for文で、「messages」への要素の追加をループ処理させる ```python else: for no,item in enumerate(to_text): ``` for文内でif分で分岐を作成し、画像の(「jpg」で終わる)場合、 スト型「messages」内に、type、originalContentUrl、previewImageUrlの キーを持つ辞書を定義する 画像ではなければ、type、textのキーを持つ辞書を定義する ```python if item.endswith('.jpg'): params['messages'].append({}) params['messages'][no]['type'] = 'image' params['messages'][no]['originalContentUrl'] = item params['messages'][no]['previewImageUrl'] = item else: params['messages'].append({}) params['messages'][no]['type'] = 'text' params['messages'][no]['text'] = item ``` ![](https://hackmd.io/_uploads/B1bHXRXY3.png) :::warning **<enumerate>** **`list.enumerate()`** ・リストに含まれている要素にインデックスを0から割り振り、「(インデックス, 要素)」というタプルにまとめた特殊なオブジェクトを返す ::: ------ ## 第10回 課題 ### ・課題 **以下のように、LINEに位置情報を送信した場合、** **HotpepperAPIを利用し、画像やその他の情報と合わせて おすすめのお店を1軒紹介するよう処理を追加してください** ![](https://hackmd.io/_uploads/BJatXRrh3.png) ----- ### ・課題の概要 これまでは、LINEに**文字列**を入力しその内容に合わせて、 Lambda内で処理を実行させ、LINEに応答を返していました。 今回は、LINEに**位置情報**を入力し、緯度経度の情報をもとに HotpepperAPIにリクエストを送信し、おすすめの店舗の情報を 返すよう処理を修正していただきます。 ----- ### ・「<span style="color:blue">lambda_function.py</span>」への修正 #### ①位置情報が入力された場合の処理 LINEで入力された内容は、その他の情報と合わせて変数「event」に格納されています。 その中から、以下の処理で、画像内の緑下線の入力メッセージを取得して「from_text」に格納して利用していました。 ```python from_text = json.loads(event['body'])['events'][0]['message']['text'] ``` ■文字列が入力された場合の「event」の一部 ![](https://hackmd.io/_uploads/rJea0Rr2h.png) 位置情報が入力された場合は、以下の画像のようになります。 ■位置情報が入力された場合の「event」の一部 ![](https://hackmd.io/_uploads/BkJE7J8n3.png) 青下線の「type」が**location**に変わり、 緑下線の「latitude」「longitude」に緯度経度の情報が格納されています。 そのため、青下線の「type」が**text**だった場合は、 これまで通り、LINEで文字列が入力された場合の処理を実行し、 そうでない場合(青下線の「type」が**location**)の場合、 「latitude」「longitude」から緯度経度を取得するよう、処理を分岐してください ■「type」の判別 ```python json.loads(event['body'])['events'][0]['message']['type'] == 'text' ``` ■緯度経度取得処理 ```python latitude = json.loads(event['body'])['events'][0]['message']['latitude'] longitude = json.loads(event['body'])['events'][0]['message']['longitude'] ``` #### ② 「hotpepper_function.py」呼び出し処理 hotpepper_functionのshop_search関数の引数は、「from_text」一つだけのため、 ①で追加した分岐内で、「latitude」「longitude」の 2つの引数を引数とするshop_search_map関数を呼び出し、 結果を「to_text」に代入してください ----- ### ・「<span style="color:blue">hotpepper_function.py</span>」への修正 hotpepper_function.py内に、「latitude」「longitude」を 引数とするshop_search_map関数を追加してください。 これまでのshop_search関数は、引数「keyword」をHotpepperAPIへの リクエストパラメータ「hp_param」に定義し、 キーワードでおすすめ店舗を検索していました。 追加するshop_search_map関数では、緯度経度でおすすめ店舗の検索を行うため、 引数「keyword」ではなく、「latitude」「longitude」を 「hp_param」に定義し、HotpepperAPIにリクエストを送信し、 レスポンスを「to_text」に代入し、lambda_functionに返してください。 ■緯度経度検索用パラメータ定義 ```python # HotpepperAPIへのリクエストパラメータ準備 hp_pram = { 'key':HP_API_KEY, 'lat':latitude, 'lng':longitude, 'order':4, 'count':1, 'format':'json' } ``` 改行コードで区切る処理や、要素数を確認する処理は不要です。 また、HotpepperAPIにリスエストを送信し、 レスポンスから情報を取得する処理は、そのまま利用して問題ございません。 --- ### ・LINEでの位置情報の送信方法 位置情報は、以下のリンクを参考に、送信してください。 PC版のLINEでは送信できないため、携帯から送信してください。 ▼位置情報 送信方法 https://guide.line.me/ja/services/location-information.html :::danger デフォルトでは、現在地にピンが立っているため、 任意の場所にピンの位置を変更してください :::