---
# System prepended metadata

title: AI LINE Bot練功坊-L6 Sending Message
tags: [Python, Line Bot]

---

AI LINE Bot練功坊-L6 Sending Message
===

## 傳送訊息的方式
* Reply Messgae
* Push Message
* Broadcast
* Narrowcast
* Multicast

## 匯入函式庫
```python
from linebot.v3.messaging import (
    ReplyMessageRequest,
    PushMessageRequest,
    BroadcastRequest,
    MulticastRequest
)
```
## Send Reply Message
當使用者將官方帳號加入好友或傳送訊息給官方帳號時，您可以用Messaging API做回覆。要傳送回覆訊息時，必須要有包含Reply Token的Webhook Event Object

### 程式碼
單純回覆訊息
```python
line_bot_api.reply_message(
    ReplyMessageRequest(
        reply_token=event.reply_token,
        messages=[TextMessage(text=event.message.text)]
    )
)
```
有回傳HTTP Status Code 
```python
line_bot_api.reply_message_with_http_info(
    ReplyMessageRequest(
        reply_token=event.reply_token,
        messages=[TextMessage(text=event.message.text)]
    )
)
```
詳細HTTP狀態碼可參考官網
>Reference：
https://developers.line.biz/en/reference/messaging-api/#status-codes

### 屬性
1. `reply_token`
    當在使用reply_token時，需要確認以下幾件事情
    * Replytoken只能被使用一次
    * Reply Token必須在收到 Webhook 後一分鐘內使用。使用超過一分鐘並不能保證有效。
    * Reply Token在以下情況不能保證能使用
        * 原本的webhook中的Reply Token已被使用
        * Webhook Event發生20分鐘後
2. `messages`
    放要傳送的訊息內容(最大數量是**五則**)
3. `notificationDisabled` (傳送訊息的通知)
    預設為 `false`，傳送訊息時會有通知，如果將其設為 `true`，就會發送給使用者無聲訊息，使用者收到訊息後不會有通知


:::danger
:warning:若是超過五則，則不會回應訊息，並且伺服器會出現以下錯誤
:::
![image](https://hackmd.io/_uploads/HJXXXSbCp.png)

>Reference：https://developers.line.biz/en/reference/messaging-api/#send-reply-message

## Send Push Message
您可以發送Push Message的對象 : 
* 有將您的官方帳號加入好友的使用者
* 有將您的官方帳號加入群組中
* 七天內在一對一聊天中向您的LINE官方帳戶發送過訊息的用戶

以下情況可以發送Push Message但用戶不會收到:
* 刪除LINE帳號的用戶
* 封鎖發送訊息的LINE官方帳號的用戶
* 尚未將LINE官方帳號新增為好友的使用者

:::warning
使用者可以向尚未新增為好友的LINE官方帳號發訊息，若LINE官方帳號收到非好友的使用者的訊息，LINE官方帳號在七天內可以向該使用者發送Push Message
:::

### 程式碼
單純推播訊息
```python
line_bot_api.push_message(
    PushMessageRequest(
        to=event.source.user_id,
        messages=[TextMessage(text='PUSH!')]
    )
)
```
有回傳HTTP Status Code 
```python
line_bot_api.push_message_with_http_info(
    PushMessageRequest(
        to=event.source.user_id,
        messages=[TextMessage(text='PUSH!')]
    )
)
```

### 屬性
1. `to`
    接收者的UserID或者是GroupID、RoomID(最大數量是**五則**)
2. `messages`
    放要傳送的訊息內容
3. `notificationDisabled` (傳送訊息的通知)
    預設為 `false`，傳送訊息時會有通知，如果將其設為`true`，就會發送給使用者無聲訊息，使用者收到訊息後不會有通知

>Reference : https://developers.line.biz/en/reference/messaging-api/#send-push-message

## Send Multicast Message
這是有效的傳送相同訊息給多位使用者的API，但是不能傳送到群組或者是多人聊天室
也可以傳送給一位使用者，但是還是建議使用Push Message，因為Push Message的延遲比較低
可以發訊息送給將官方帳號加入好友的使用者
如果回傳錯誤，訊息就不會被送出
以下情況可以發送Multicast message但用戶不會收到:
* 刪除LINE帳號的使用者
* 封鎖官方帳號的使用者
* 沒有將官方帳號加入好友的使用者
* channel中不存在的使用者ID
    :::warning
    :bulb: 不同provider下的另一個channel取得的使用者ID
    :::

### 程式碼
單純推播訊息給多位使用者
```python
line_bot_api.multicast(
    MulticastRequest(
        to=[event.source.user_id],
        messages=[TextMessage(text="Multicast Message")]
    )
)
```
有回傳HTTP Status Code
```python
line_bot_api.multicast_with_http_info(
    MulticastRequest(
        to=[event.source.user_id],
        messages=[TextMessage(text="Multicast Message")]
    )
)
```

### 屬性
1. `to`
    接收者的UserID的陣列(**最多500個UserID**)
2. `messages` 
    放要傳送的訊息內容(最大數量是**五則**)
3. `notificationDisabled` (傳送訊息的通知)
    預設為 `false`，傳送訊息時會有通知，如果將其設為 `true`，就會發送給使用者無聲訊息，使用者收到訊息後不會有通知

>Reference : https://developers.line.biz/en/reference/messaging-api/#send-multicast-message

## Send Narrowcast Message
傳送訊息給多位加入官方帳號好友的使用者，可以指定特殊屬性的使用者(例如:年齡、性別、地區等等)，但是不能傳送到群組或者是多人聊天室
如果回傳錯誤，訊息就不會被送出

特點:
* 目標人數必須為100人以上
    :::warning
    :warning: 這個目標人數指的是LINE官方統計在LINE服務上活躍並具有高度確定性的使用者，不是發出訊息的對象的總人數
    :::
* 特定受眾(至少50人)
* 指定多個受眾作為發送條件時，每個受眾都至少要有50位收件者，否則會在訊息傳遞開始時發生錯誤

以下受眾沒有接收人數限制:
* 從LINE官方帳號管理者或Messaging API建立的受眾
* 聊天標籤生成受眾(Target Audience)

發送訊息剩餘量
* 如果當月能發送的剩餘訊息量小於您LINE官方帳戶的目標人數(受眾)時，在發送narrowcast messages時會發生錯誤
* 即使實際的收件人數夠小，當月能發送的剩餘訊息量也可能會暫時耗盡，導致在發送narrowcast messages期間無法傳送其他訊息

:::warning
:bulb: LINE平台收到request後，在後台非同步發送Narrowcast Message
:::
以下情況可以發送Narrowcast Message但用戶不會收到:
* 刪除LINE帳號的使用者
* 封鎖官方帳號的使用者
* 沒有將官方帳號加入好友的使用者
* channel中不存在的使用者ID
    :::warning
    :bulb: 不同provider下的另一個channel取得的使用者ID
    :::

利用AND、OR、NOT邏輯運算子將複數個接收者的條件結合
:::warning
:warning: 確定只有AND、OR、NOT三個條件，不可以指定空陣列
:::

### 人口統計過濾物件
人口統計過濾物件是指過濾收件人的標準，可以利用剛才介紹的邏輯運算子將不同標準做結合
屬性
* 用於人口統計過濾的資料都是三天前的
* 如果沒有指定屬性，將會發送訊息給所有人，甚至是＂未知＂屬性值的使用者

>Reference : https://developers.line.biz/en/reference/messaging-api/#send-narrowcast-message

## Send Broadcast Message
向所有將您的官方帳號加入好友的人發送訊息
如果回傳錯誤，訊息就不會被送出

### 程式碼
單純群發訊息
```python
line_bot_api.broadcast(
    BroadcastRequest(
        messages=[TextMessage(text='Broadcast Message')]
    )
)
```

有回傳HTTP Status Code
```python
line_bot_api.broadcast_with_http_info(
    BroadcastRequest(
        messages=[TextMessage(text='Broadcast Message')]
    )
)
```

### 屬性
1. `messages`
    放要傳送的訊息內容
    (最大數量是**五則**)
2. `notificationDisabled` (傳送訊息的通知)
     預設為`false`，傳送訊息時會有通知，如果將其設為true，就會發送給使用者無聲訊息，使用者收到訊息後不會有通知


>Reference : https://developers.line.biz/en/reference/messaging-api/#send-broadcast-message

Youtube 課程影片
---
<iframe width="560" height="315" src="https://www.youtube.com/embed/TVt2d-aP7tc?si=JzcgPzYa09T1O82c" 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/webhook-event-type" style="color:white;width:300px;text-overflow:ellipsis;overflow:hidden">◀◀◀ L05 Webhook Event Type ◀◀◀</a>
  </div>
  <div>
    <a class="btn btn-info" 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>