---
# System prepended metadata

title: Line Bot 教學
tags: [droidtown]

---

# Line Bot 教學

本教程介紹如何使用 Python LINE Bot SDK 在 Heroku 上架設一個簡單的回話機器人。
<!--more-->
如果您想以另一種語言架設範例 bot，請參閱以下  LINE Bot SDK repositories。
- [PHP](https://github.com/line/line-bot-sdk-php)
- [Go](https://github.com/line/line-bot-sdk-go)
- [Perl](https://github.com/line/line-bot-sdk-perl)
- [Ruby](https://github.com/line/line-bot-sdk-ruby)
- [Python](https://github.com/line/line-bot-sdk-python)
- [Node.js](https://github.com/line/line-bot-sdk-nodejs)

## 在你開始之前

確保您具有以下內容：

- 擁有 Line 帳號
- 擁有 [Heroku](https://www.heroku.com) 帳戶（您可以免費創建一個）

## 建立 Heroku 專案
1. 登入 Heroku 後，
  在 [Heroku](https://dashboard.heroku.com/apps) 頁面中，點選 New -> Create New App
  ![](https://i.imgur.com/Y3njp7I.png)
2. 輸入自己喜歡的 App name ，然後點擊 Create app
  ![](https://i.imgur.com/WJ85jXR.png)

## 創建 Line Bot 頻道
1. 進入 [Line 控制台](https://developers.line.me/console/)
    ![](https://i.imgur.com/vseYQt1.png)
2. 創建提供者
    ![](https://i.imgur.com/0tnYFBd.png)
3. 填入提供者名稱
    ![](https://i.imgur.com/2ne3H1F.png)
4. 點擊 Create
    ![](https://i.imgur.com/bdESW8G.png)
5. 點擊 Create Channel
    ![](https://i.imgur.com/F1nAWhK.png)
6. 填入 Bot 資訊
    ![](https://i.imgur.com/3wYFSvl.png)
7. 同意 Line 條款，並按 Create
    ![](https://i.imgur.com/WNzl4sL.png)
8. 選擇剛剛創建的 Bot
    ![](https://i.imgur.com/6ocsOBW.png)

## 設定範例機器人

按照以下步驟架設一個回話機器人。

1. 下載 [範例程式碼](https://github.com/yaoandy107/line-bot-tutorial/archive/master.zip)
2. 進入 [Line 控制台](https://developers.line.me/console/)，選擇你剛剛創建的機器人
    ![](https://i.imgur.com/6ocsOBW.png)
3. 開啟 webhook
![](https://i.imgur.com/nxvFPB1.png)
![](https://i.imgur.com/PzEKzdq.png)
4. 關閉預設罐頭回覆訊息
![](https://i.imgur.com/nXPRhT4.png)

5. 產生 **Channel access token**
![](https://i.imgur.com/QyxnpZB.png)
![](https://i.imgur.com/quYbPx9.png)
6. 取得 **Channel access token**
![](https://i.imgur.com/C7OTect.png)
7. 取得 **Channel secret**
![](https://i.imgur.com/IwmvyzL.png)

6. 使用編輯器開啟範例程式碼資料夾內的 app.py，將剛剛取得的 **channel secret** 和 **channel access token** 填入
  ![](https://i.imgur.com/Uz16joi.png)

## 將程式推到 Heroku 上

1. 下載並安裝 [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)、[Git](https://git-scm.com/)
2. 開啟剛剛下載的範例程式碼資料夾，在路徑上輸入 cmd
3. 使用終端或命令行應用程序登錄到 Heroku
    ```shell＝
    heroku login
    ```
4. 初始化 git
    ``` shell=
    $ git config --global user.name "你的名字"
    $ git config --global user.email 你的信箱
    ```
    注意：**你的名字** 和 **你的信箱** 要換成各自的 **名字** 和 **信箱**

5. 初始化 git
    ```shell＝
    git init
    ```
    注意：僅第一次使用時要輸入

6. 用 git 將資料夾與 heroku 連接
    ```shell＝
    heroku git:remote -a {HEROKU_APP_NAME}
    ```
    注意：{HEROKU_APP_NAME} 是 Heroku 應用的名稱
    
7. 輸入以下指令，將程式碼推上 Heroku，**如果有跳出錯誤請重新輸入**
    ```shell
    git add .
    git commit -m "Add code"
    git push -f heroku master
    ```
    **每當需要更新 Bot 時，請重新輸入上述指令**

## 將 Heroku 與 Line 綁定
1. 進入 [Line 控制台](https://developers.line.me/console/)，選擇你剛剛創建的 Bot
    ![](https://i.imgur.com/6ocsOBW.png)
2. 在 webhook URL 中輸入 Heroku 網址

    ```shell
    {HEROKU_APP_NAME}.herokuapp.com/callback
    ```
    ![](https://i.imgur.com/EkDhAgb.png)
    注意：{HEROKU_APP_NAME} 是 Heroku 應用的名稱

  
## 測試範例成果
1. 進入 [Line 控制台](https://developers.line.me/console/)，選擇你剛剛創建的 Bot
    ![](https://i.imgur.com/6ocsOBW.png)
2. 通過在控制台的 “Channel settings” 頁面上掃描 QR Code，將您的 Bot 添加到 LINE 的朋友中
3. 在 Line 上向您的 Bot 發送文字訊息，並確認它會學你說話

## 錯誤尋找

> 當程式遇到問題時，可查看日誌以找出錯誤

要查看您的 Bot 在 Heroku 的日誌，請按照以下步驟。

1. 如果沒登入，請先透過 Heroku CLI 登入
    ```shell
    heroku login
    ```

2. 顯示 app 日誌
    ```shell
    heroku logs --tail --app {HEROKU_APP_NAME}
    ```
    注意：{HEROKU_APP_NAME} 是上述步驟2中的應用名稱。
    ```shell
    --tail                     # 持續打印日誌
    --app {HEROKU_APP_NAME}    # 指定 App
    ```

## 程式檔案解說

> 資料夾裡需含有兩份文件來讓你的程式能在 heroku 上運行

- Procfile：heroku 執行命令，web: {語言} {檔案}，這邊語言為 python，要自動執行的檔案為 app.py，因此我們改成 **web: python app.py**。
- requirements.txt：列出所有用到的套件，heroku 會依據這份文件來安裝需要套件

### app.py (主程式)
可透過修改程式裡的 handle_message() 方法內的程式碼來控制機器人的訊息回覆

![](https://i.imgur.com/DNeNbpV.png)

新版範例程式碼內附註解
如想更多了解此程式，可以去研究 Git、Python3、[Flask 套件](http://docs.jinkan.org/docs/flask/)、[Line bot sdk](https://github.com/line/line-bot-sdk-python)


## 進階操作
[官方文件](https://github.com/line/line-bot-sdk-python#api)
### 回覆訊息
只有當有訊息傳來，才能回覆訊息
```python
line_bot_api.reply_message(reply_token, 訊息物件)
```
### 主動傳送訊息
Bot 需要有開啟 push 功能才可以做，否則程式會出錯
```python
line_bot_api.push_message(push_token, 訊息物件)
```

## 訊息物件分類

[官方文件](https://developers.line.me/en/docs/messaging-api/message-types/)

修改範例程式碼中， handle_message() 方法內的程式碼，可實現多種功能

### TextSendMessage （文字訊息）
![](https://i.imgur.com/LieCFAb.png =250x)
```python
message = TextSendMessage(text='Hello, world')
line_bot_api.reply_message(event.reply_token, message)
```

### ImageSendMessage（圖片訊息）
![](https://i.imgur.com/RaH7gqo.png =250x)
```python
message = ImageSendMessage(
    original_content_url='https://example.com/original.jpg',
    preview_image_url='https://example.com/preview.jpg'
)
line_bot_api.reply_message(event.reply_token, message)
```

### VideoSendMessage（影片訊息）
![](https://i.imgur.com/o6cvf3o.png =250x)
```python
message = VideoSendMessage(
    original_content_url='https://example.com/original.mp4',
    preview_image_url='https://example.com/preview.jpg'
)
line_bot_api.reply_message(event.reply_token, message)
```

### AudioSendMessage（音訊訊息）
![](https://i.imgur.com/w5szZag.png =250x)
```python
message = AudioSendMessage(
    original_content_url='https://example.com/original.m4a',
    duration=240000
)
line_bot_api.reply_message(event.reply_token, message)
```

### LocationSendMessage（位置訊息）
![](https://i.imgur.com/tXE7Aus.png =250x)
```python
message = LocationSendMessage(
    title='my location',
    address='Tokyo',
    latitude=35.65910807942215,
    longitude=139.70372892916203
)
line_bot_api.reply_message(event.reply_token, message)
```

### StickerSendMessage（貼圖訊息）
![](https://i.imgur.com/7x0mgK1.png =250x)
```python
message = StickerSendMessage(
    package_id='1',
    sticker_id='1'
)
line_bot_api.reply_message(event.reply_token, message)
```

### ImagemapSendMessage （組圖訊息）
![](https://i.imgur.com/MoSf2D6.png =250x)
```python
message = ImagemapSendMessage(
    base_url='https://example.com/base',
    alt_text='this is an imagemap',
    base_size=BaseSize(height=1040, width=1040),
    actions=[
        URIImagemapAction(
            link_uri='https://example.com/',
            area=ImagemapArea(
                x=0, y=0, width=520, height=1040
            )
        ),
        MessageImagemapAction(
            text='hello',
            area=ImagemapArea(
                x=520, y=0, width=520, height=1040
            )
        )
    ]
)
line_bot_api.reply_message(event.reply_token, message)
```

### TemplateSendMessage - ButtonsTemplate （按鈕介面訊息）
![](https://i.imgur.com/41lXWjP.png =250x)
```python
message = TemplateSendMessage(
    alt_text='Buttons template',
    template=ButtonsTemplate(
        thumbnail_image_url='https://example.com/image.jpg',
        title='Menu',
        text='Please select',
        actions=[
            PostbackTemplateAction(
                label='postback',
                text='postback text',
                data='action=buy&itemid=1'
            ),
            MessageTemplateAction(
                label='message',
                text='message text'
            ),
            URITemplateAction(
                label='uri',
                uri='http://example.com/'
            )
        ]
    )
)
line_bot_api.reply_message(event.reply_token, message)
```

### TemplateSendMessage - ConfirmTemplate（確認介面訊息）
![](https://i.imgur.com/U8NDhrt.png =250x)
```python
message = TemplateSendMessage(
    alt_text='Confirm template',
    template=ConfirmTemplate(
        text='Are you sure?',
        actions=[
            PostbackTemplateAction(
                label='postback',
                text='postback text',
                data='action=buy&itemid=1'
            ),
            MessageTemplateAction(
                label='message',
                text='message text'
            )
        ]
    )
)
line_bot_api.reply_message(event.reply_token, message)
```

### TemplateSendMessage - CarouselTemplate
![](https://i.imgur.com/982Glgo.png =250x)
```python
message = TemplateSendMessage(
    alt_text='Carousel template',
    template=CarouselTemplate(
        columns=[
            CarouselColumn(
                thumbnail_image_url='https://example.com/item1.jpg',
                title='this is menu1',
                text='description1',
                actions=[
                    PostbackTemplateAction(
                        label='postback1',
                        text='postback text1',
                        data='action=buy&itemid=1'
                    ),
                    MessageTemplateAction(
                        label='message1',
                        text='message text1'
                    ),
                    URITemplateAction(
                        label='uri1',
                        uri='http://example.com/1'
                    )
                ]
            ),
            CarouselColumn(
                thumbnail_image_url='https://example.com/item2.jpg',
                title='this is menu2',
                text='description2',
                actions=[
                    PostbackTemplateAction(
                        label='postback2',
                        text='postback text2',
                        data='action=buy&itemid=2'
                    ),
                    MessageTemplateAction(
                        label='message2',
                        text='message text2'
                    ),
                    URITemplateAction(
                        label='uri2',
                        uri='http://example.com/2'
                    )
                ]
            )
        ]
    )
)
line_bot_api.reply_message(event.reply_token, message)
```

### TemplateSendMessage - ImageCarouselTemplate
![](https://i.imgur.com/2ys1qqc.png =250x)
```python
message = TemplateSendMessage(
    alt_text='ImageCarousel template',
    template=ImageCarouselTemplate(
        columns=[
            ImageCarouselColumn(
                image_url='https://example.com/item1.jpg',
                action=PostbackTemplateAction(
                    label='postback1',
                    text='postback text1',
                    data='action=buy&itemid=1'
                )
            ),
            ImageCarouselColumn(
                image_url='https://example.com/item2.jpg',
                action=PostbackTemplateAction(
                    label='postback2',
                    text='postback text2',
                    data='action=buy&itemid=2'
                )
            )
        ]
    )
)
line_bot_api.reply_message(event.reply_token, message)
```
###### tags: `droidtown`