owned this note
owned this note
Published
Linked with GitHub
# Line Bot 教學
> 本教學由 **北科程式設計研究社** 所屬
> 喜歡這篇教學,可以到我的 [Github](https://github.com/yaoandy107/line-bot-tutorial) 上面給我一顆 Star
> [name=姚韋辰]
本教程介紹如何使用 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

2. 輸入自己喜歡的 App name ,然後點擊 Create app

## 創建 Line Bot 頻道
1. 進入 [Line 控制台](https://developers.line.me/console/)

2. 創建提供者

3. 填入提供者名稱

4. 點擊 Create

5. 點擊 Create Channel

6. 填入 Bot 資訊

7. 同意 Line 條款,並按 Create

8. 選擇剛剛創建的 Bot

## 設定範例機器人
按照以下步驟架設一個回話機器人。
1. 下載 [範例程式碼](https://github.com/yaoandy107/line-bot-tutorial/archive/master.zip)
2. 進入 [Line 控制台](https://developers.line.me/console/),選擇你剛剛創建的機器人

3. 開啟 webhook


4. 關閉預設罐頭回覆訊息

5. 產生 **Channel access token**


6. 取得 **Channel access token**

7. 取得 **Channel secret**

6. 使用編輯器開啟範例程式碼資料夾內的 app.py,將剛剛取得的 **channel secret** 和 **channel access token** 填入

## 將程式推到 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

2. 在 webhook URL 中輸入 Heroku 網址
```shell
{HEROKU_APP_NAME}.herokuapp.com/callback
```

注意:{HEROKU_APP_NAME} 是 Heroku 應用的名稱
## 測試範例成果
1. 進入 [Line 控制台](https://developers.line.me/console/),選擇你剛剛創建的 Bot

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() 方法內的程式碼來控制機器人的訊息回覆

新版範例程式碼內附註解
如想更多了解此程式,可以去研究 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 (文字訊息)

```python
message = TextSendMessage(text='Hello, world')
line_bot_api.reply_message(event.reply_token, message)
```
### ImageSendMessage(圖片訊息)

```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(影片訊息)

```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(音訊訊息)

```python
message = AudioSendMessage(
original_content_url='https://example.com/original.m4a',
duration=240000
)
line_bot_api.reply_message(event.reply_token, message)
```
### LocationSendMessage(位置訊息)

```python
message = LocationSendMessage(
title='my location',
address='Tokyo',
latitude=35.65910807942215,
longitude=139.70372892916203
)
line_bot_api.reply_message(event.reply_token, message)
```
### StickerSendMessage(貼圖訊息)

```python
message = StickerSendMessage(
package_id='1',
sticker_id='1'
)
line_bot_api.reply_message(event.reply_token, message)
```
### ImagemapSendMessage (組圖訊息)

```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 (按鈕介面訊息)

```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(確認介面訊息)

```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

```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

```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)
```