:::info **<第9回Web会議日程>** 2023年07月19日(水)19:00から ::: ## 第8回 解説 **現在、「<span style="color:blue">lambda_function.py</span>」は、以下のようにLINEで入力した場合、** **何も処理されません** ![](https://hackmd.io/_uploads/SkziJVEw2.png) **上記に以下のようにLINEで入力した場合、2行目を検索キーワードとして、** **HotpepperのグルメサーチAPIにリクエストを送信し、** **おすすめのお店を一軒紹介するよう処理を追加してください** ![](https://hackmd.io/_uploads/B1HhyE4vn.png) ### ・回答例 「<span style="color:blue">lambda_function.py</span>」  ※一部抜粋 ```python= def lambda_handler(event, context): # ~省略~ # 《2.入力内容に合わせて処理分岐》 if from_text == 'おはよう': to_text = 'おはようございます!' elif from_text == 'こんばんは': to_text = 'こんばんは!' # LINEで入力内容が「入力」から始まった場合 elif from_text.startswith('入力'): # s3_functionモジュールのs3_input関数を呼び出す to_text = s3_function.s3_input(from_text) # LINEで入力内容が「出力」から始まった場合 elif from_text.startswith('出力'): to_text = s3_function.s3_output(from_text) # LINEで入力内容が「ホットペッパー」から始まった場合 elif from_text.startswith('ホットペッパー'): to_text = hotpepper_function.shop_search(from_text) else: to_text = '定義されていないメッセージです' # ~省略~ ``` ### ・解説 「<span style="color:blue">lambda_function.py</span>」 LINEの入力内容が"ホットペッパー"から始まる場合、 「hotpepper_function.py」のshop_search関数を呼び出したい 「from_text」で処理を分岐するIF分に以下の分岐を追加 ```python # LINEで入力内容が「ホットペッパー」から始まった場合 elif from_text.startswith('ホットペッパー'): to_text = hotpepper_function.shop_search(from_text) ``` ### ・回答例 「<span style="color:blue">hotpepper_function.py</span>」  ※一部抜粋 ```python= # ~省略~ def shop_search(from_text): # ~省略~   # HotpepperAPIにリスクエスト response = requests.get(HP_URL,hp_pram) logger.info(response) # レスポンスを辞書型に変換 response_dict = response.json() logger.info(json.dumps(response_dict,indent=2,ensure_ascii=False)) # JSONデータの中からお店の名前を取得 shop_name = response_dict['results']['shop'][0]['name'] to_text = shop_name # ~省略~ ``` ### ・解説 「<span style="color:blue">hotpepper_function.py</span>」 辞書型の「response_dict」は以下のように要素が格納されている(一部抜粋) ![](https://hackmd.io/_uploads/HJDdZkuuh.png) リスト型「shop」の0番目の要素の辞書から 「name」をキーに値を取り出すため、以下の記述を 「shop_name」に代入できていればOK ```python shop_name = response_dict['results']['shop'][0]['name'] ``` ------ ## 第9回 課題 ### ・課題の前に。。。 第9回の課題で、複数メッセージをLINEに応答できるようにするため、 第8回までの「<span style="color:blue">lambda_function.py</span>」に以下2か所の記述を修正してください #### <修正①> ■修正前 ```python params['messages'] = [{}] params['messages'][0]['type'] = 'text' ``` ■修正後 ```python params['messages'] = [] ``` #### <修正②> ■修正前 ```python params['messages'][0]['text'] = to_text ``` ■修正後 ```python params['messages'].append({}) params['messages'][0]['type'] = 'text' params['messages'][0]['text'] = to_text ``` ---- ### ・課題 **現在、「<span style="color:blue">lambda_function.py</span>」は、以下のようにLINEで入力した場合、** **HotpepperAPIを利用し、おすすめのお店を1軒紹介します** ![](https://hackmd.io/_uploads/rJqiG4zF2.png) **同様の入力をした場合に、お店の名前に加え、お店の画像と** **付加情報をLINEに返すよう処理を追加してください** ![](https://hackmd.io/_uploads/Sya9zVfth.png) ----- ### ・課題の概要 これまであまり触れてきませんでしたが、 LINEへの応答メッセージの送信は、LINEが提供している **Messaging API**を利用していました。 応答したいメッセージ、必要な情報を「params」に定義し、 **Messaging API**にリクエストを送信することで、 LINEにメッセージを送っていました。 これまでは、単一のメッセージの送信のみでしたが、 今回は、複数のメッセージを送信できるよう修正していただきます。 ----- ### ・「<span style="color:blue">hotpepper_function.py</span>」への修正 #### ① LINEに応答する付加情報を取得 「response_dict」に格納されたレスポンスから **「掲載店名」** のみを取得しておりますが、 各自お好みの情報を「掲載店名」を含め、5つまで取得してください。 うち、1つはPC向けの「店舗トップ写真(大)画像URL」を取得してください。 ■掲載店名 取得サンプル ```python shopname = response_dict['results']['shop'][0]['name'] ``` :::success レスポンスにどんな情報が含まれているかは、 [APIリファレンス](https://webservice.recruit.co.jp/doc/hotpepper/reference.html)のグルメサーチAPI、レスポンスフィールドを参照 ::: #### ② 「to_text」にリスト型で代入 ①で取得した情報を複数要素を保持できるリスト型で、 「to_text」に代入し、lambda_functionに返して下さい ### ・「<span style="color:blue">lambda_function.py</span>」への修正 #### 1 . params['messages'] 定義時の処理修正 LINEで応答する際の「params」は以下のように定義する必要があります ![](https://hackmd.io/_uploads/SyNV70XF3.png) ■params定義 ```python! params['messages'] = []  ~省略~ params['messages'].append({}) params['messages'][0]['type'] = 'text' params['messages'][0]['text'] = to_text ``` 複数のメッセージで応答するには、「params」を以下のように、 リスト型の「messages」内に、複数の辞書型の要素を定義することで実現できます ![](https://hackmd.io/_uploads/B1bHXRXY3.png) 以下に留意し、paramsを定義する記述を修正してください #### ①「to_text」のデータ型 hotpepper_functionからの戻り値「to_text」はリスト型ですが、 s3_functionやその他の処理では、 文字列型です。 ⇒「to_text」のデータ型によって処理を分岐してください #### ②「messages」への要素の追加 「to_text」がリスト型だった場合、 「messages」のリストに、複数の辞書型の要素を追加する必要があります ⇒「<span style="color:blue">hotpepper_function.py</span>」で取得した情報の数だけ、  「messages」のリストに要素を追加してください #### ③画像の場合の処理 トップ画像はJPEG、値としては「https://XXXX.jpg」でレスポンスに登録されています。 また、辞書型の定義も、文字列の応答時とは異なり、 以下のように変更する必要があります。 ![](https://hackmd.io/_uploads/rJXGvHEYn.png) ⇒②のループ内で、値が「.jpg」の場合、処理を分岐してください  「originalContentUrl」と「previewImageUrl」は  同じ値で問題ないです ※もし、「.jpg」以外の拡張子で登録されていた場合、  その拡張子も「.jpg」と同じ処理に分岐してください --- ### ・ローカルで実行するためのコード Lambda上で試行錯誤することが煩わしい場合、 ローカルで「hotpepper_function.py」と同様のAPI利用結果を 取得できるコードを準備してしましたので、ご利用ください ```python= import requests import json HP_URL = 'http://webservice.recruit.co.jp/hotpepper/gourmet/v1/' HP_API_KEY = '003698bcd54c9063' keyword = '池袋' # HotpepperAPIへのリクエストパラメータ準備 hp_pram = { 'key':HP_API_KEY, 'keyword':keyword, 'order':4, 'count':1, 'format':'json' } # HotpepperAPIにリスクエスト response = requests.get(HP_URL,hp_pram) # レスポンスを辞書型に変換 response_dict = response.json() print(json.dumps(response_dict,indent=2,ensure_ascii=False)) ``` 「ModuleNotFoundError」が出る場合は、requestsとjsonを コマンドプロンプトでpip install してください