---
# System prepended metadata

title: AI LINE Bot練功坊-L8 Message Type (2) Template Message
tags: [Python, Line Bot]

---

AI LINE Bot練功坊-L8 Message Type (2) Template Message
===

# Template Message

### 匯入函式庫
```python
from linebot.v3.messaging import (
    ConfirmTemplate,
    ButtonsTemplate,
    CarouselTemplate,
    ImageCarouselTemplate
)
```

## Action objects
### 匯入函式庫
```python
from linebot.v3.messaging import (
    PostbackAction,
    MessageAction,
    URIAction,
    DatetimePickerAction,
    CameraAction,
    CameraRollAction,
    LocationAction
)
``` 
Template Message、Flex Message都可以使用到messagingAPI裡的Action objects。
**Action objects**是當使用者點擊訊息中的按鈕或影像時機器人會執行的操作類型，共有以下幾種Type：
* Postback action : 回傳指定給伺服器的內容
* Message action : 讓使用者傳出指定訊息
* URI action連結 : 讓使用者連結指定網址
* Datetime picker action : 讓使用者選擇時間日期
* Camera action : 讓使用者開啟相機
* Camera roll action : 讓使用者開啟相簿
* Location action位置 : 讓使用者開啟地圖

**使用範例_程式碼**
```python
URIAction(label='連結', uri='https://www.facebook.com/NTUEBIGDATAEDU'),
PostbackAction(label='回傳值', data='ping', text='傳了'),
MessageAction(label='傳"哈囉"', text='哈囉'),
DatetimePickerAction(type="datetimepicker", label="Select date",data ='storeId=12345', mode='datetime'),
CameraAction(type='camera',label='Camera'),
CameraRollAction(type='cameraRoll',label='cameraRoll'),
LocationAction(type="location",label="Location")
```

---
>Reference：https://developers.line.biz/en/reference/messaging-api/#action-objects

## Template types
Template message 是一個事先模板化的訊息，我們只需要透過調整各項參數來製作客製化的訊息。
跟 Flex message 有類似的功能，但是Template message只能在手機上查看訊息，在電腦版只會看到一串文字。
**總共有四種類型的樣式可以選擇，分別為 Buttons、Confirm、Carousel、ImageCarousel。**

**1. Buttons Template**
**2. Confirm Template**
**3. Carousel Template**
**4. ImageCarousel Template**

### 1. Confirm Template
 簡短提問的訊息模板，會提供最多兩個按鈕供使用者點選。
 只能有兩個 action，通常用來用在使用者只有兩個選擇的時候。

![image](https://hackmd.io/_uploads/SkN8iETJR.png)

text	樣板說明文字。
actions	點擊按鈕觸發的行為，一個按鈕一種行為，最多支援兩個按鈕。

**程式碼:**
```python
confirm_template = ConfirmTemplate(
    text='今天學程式了嗎?',
    actions=[
        MessageAction(label='是', text='是!'),
        MessageAction(label='否', text='否!')
    ]
)
template_message = TemplateMessage(
    alt_text='Confirm alt text',
    template=confirm_template
)
```

>Reference：https://developers.line.biz/en/docs/messaging-api/message-types/#confirm-template

### 2. Buttons Template
 是一種包含按鈕的訊息，提供 ==**最多**4個== 按鈕供使用者點選
![image](https://hackmd.io/_uploads/SJ5xDvFlC.png)


thumbnailImageUrl	縮圖連結，支援 jpg 和 png，最大寬度 1024px。
title	樣板標題。
text	樣板說明文字。
actions	點擊按鈕觸發的行為，一個按鈕一種行為，最多支援四個按鈕。

**這裡使用三種action type 分別是 uri、postback、message，可以根據需要的功能去設定按鈕動作。**
uri      是使用者按下後會導入 web連結。
postback 在使用者按下的時候可以用 event postback 接收這個資訊來做後續處理。
message  是使用者按下去會自動變成輸入文字模式，而 label 通常與 text 設定一樣就可以了。

**程式碼:**
```python
buttons_template = ButtonsTemplate(
    thumbnail_image_url=url,
    title='示範',
    text='詳細說明',
    actions=[
        URIAction(
            label='連結',
            uri='https://www.facebook.com/NTUEBIGDATAEDU'),
            PostbackAction(label='回傳值', data='ping', displayText='傳了'),
            MessageAction(label='傳"哈囉"', text='哈囉'),
            DatetimePickerAction(label="選擇時間", data="時間", mode="datetime")
    ]
)
template_message = TemplateMessage(
    alt_text="This is a buttons template",
    template=buttons_template
)
```

>Reference：https://developers.line.biz/en/docs/messaging-api/message-types/#buttons-template

### 3. Carousel Template
 是一種多個 Buttons template 的集合，如果要做一個左右滑的 Buttons template 就可以用 Carousel template。
 最多有五個區塊，每個區塊內最多三個 action，這些區塊會呈橫向排列，並可以滑動。
<img src='https://hackmd.io/_uploads/ryVapH0-0.gif' width=300 height=300/>

columns	要出現的按鈕樣板，使用串列格式。
thumbnailImageUrl	縮圖連結，支援 jpg 和 png，最大寬度 1024px。
title	樣板標題。
text	樣板說明文字。
actions	點擊按鈕觸發的行為，一個按鈕一種行為，最多支援四個按鈕。
**有三種action type 分別是 uri、postback、message，可以根據需要的功能去設定按鈕動作。**
uri      是使用者按下後會導入 web連結。
postback 在使用者按下的時候可以用 event postback 接收這個資訊來做後續處理。
message  是使用者按下去會自動變成輸入文字模式，而 label 通常與 text 設定一樣就可以了。
**程式碼:**
```python
url = request.url_root + '/static/Logo.jpg'
url = url.replace("http", "https")
app.logger.info("url=" + url)
carousel_template = CarouselTemplate(
    columns=[
        CarouselColumn(
            thumbnail_image_url=url,
            title='第一項',
            text='這是第一項的描述',
            actions=[
                URIAction(
                    label='按我前往 Google',
                    uri='https://www.google.com'
                )
            ]
        ),
        CarouselColumn(
            thumbnail_image_url=url,
            title='第二項',
            text='這是第二項的描述',
            actions=[
                URIAction(
                    label='按我前往 Yahoo',
                    uri='https://www.yahoo.com'
                )
            ]
        )
    ]
)

carousel_message = TemplateMessage(
    alt_text='這是 Carousel Template',
    template=carousel_template
)
```

>Reference：https://developers.line.biz/en/docs/messaging-api/message-types/#carousel-template

### 4. ImageCarousel Template
會提供最多十張可以滑動選擇的圖片，作為按鈕供使用者點選。
和 Carousel template 相似，不同的地方是每個區中沒有選項，而是顯示一張大圖
<img src='https://hackmd.io/_uploads/SkO0aHAZR.gif' width=300 height=300/>

columns   要出現的圖片樣板，使用串列格式。
image_Url 圖片網址，支援 jpg 和 png，最大寬度 1024px。
actions   點擊圖片所觸發的行為，一張圖片一種行為，最多支援十張圖片。
uri       點擊會連結的網址

**程式碼:**
```python
url = request.url_root + '/static'
url = url.replace("http", "https")
app.logger.info("url=" + url)
image_carousel_template = ImageCarouselTemplate(
    columns=[
        ImageCarouselColumn(
            image_url=url+'/facebook.png',
            action=URIAction(
                label='造訪FB',
                uri='https://www.facebook.com/NTUEBIGDATAEDU'
            )
        ),
        ImageCarouselColumn(
            image_url=url+'/instagram.png',
            action=URIAction(
                label='造訪IG',
                uri='https://instagram.com/ntue.bigdata?igshid=YmMyMTA2M2Y='
            )
        ),
        ImageCarouselColumn(
            image_url=url+'/youtube.png',
            action=URIAction(
                label='造訪YT',
                uri='https://www.youtube.com/@bigdatantue'
            )
        ),
    ]
)

image_carousel_message = TemplateMessage(
    alt_text='圖片輪播範本',
    template=image_carousel_template
)
```

>Reference：https://developers.line.biz/en/docs/messaging-api/message-types/#image-carousel-template

Youtube 課程影片
---
<iframe width="560" height="315" src="https://www.youtube.com/embed/ag4EMzhIxqQ?si=99KseSKMh8IXhmSF" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

{%hackmd @ntuebigdata/about %}

## 相關教材連結

<div style="display: flex; justify-content:space-between;">
  <div>
    <a class="btn btn-warning" href="https://hackmd.io/@ntuebigdata/message-type-1" style="color:white;width:300px;text-overflow:ellipsis;overflow:hidden">◀◀◀ L07 Message Type(1) ◀◀◀</a>
  </div>
  <div>
    <a class="btn btn-info" href="https://hackmd.io/@ntuebigdata/message-type-3-flex-message" style="color:white;width:300px;text-overflow:ellipsis;overflow:hidden">▶▶▶ L09 Message Type(3) Flex Message ▶▶▶</a>
  </div>
</div>