---
# System prepended metadata

title: 【50期】Python勉強会　第9回
tags: [Python勉強会]

---


:::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」に格納されたレスポンスから **「掲載店名」** のみを取得しておりますが、
各自お好みの情報を「掲載店名」を含め、５つまで取得してください。
うち、１つは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 してください