:::info
**<第9回Web会議日程>**
2023年07月19日(水)19:00から
:::
## 第8回 解説
**現在、「<span style="color:blue">lambda_function.py</span>」は、以下のようにLINEで入力した場合、**
**何も処理されません**

**上記に以下のようにLINEで入力した場合、2行目を検索キーワードとして、**
**HotpepperのグルメサーチAPIにリクエストを送信し、**
**おすすめのお店を一軒紹介するよう処理を追加してください**

### ・回答例 「<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」は以下のように要素が格納されている(一部抜粋)

リスト型「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軒紹介します**

**同様の入力をした場合に、お店の名前に加え、お店の画像と**
**付加情報をLINEに返すよう処理を追加してください**

-----
### ・課題の概要
これまであまり触れてきませんでしたが、
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」は以下のように定義する必要があります

■params定義
```python!
params['messages'] = []
~省略~
params['messages'].append({})
params['messages'][0]['type'] = 'text'
params['messages'][0]['text'] = to_text
```
複数のメッセージで応答するには、「params」を以下のように、
リスト型の「messages」内に、複数の辞書型の要素を定義することで実現できます

以下に留意し、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」でレスポンスに登録されています。
また、辞書型の定義も、文字列の応答時とは異なり、
以下のように変更する必要があります。

⇒②のループ内で、値が「.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 してください