# <center>CTPS Fall 2022 - Line Bot Programming<br><font color="#0000dd"> LAB 1 Prerequisites & Creating Your First Line Bot </font></center>
###### tags: `CTPS LINEBOT LAB`
[TOC]
## Outline
在linebot的lab1我們要先建立我們所需要的開發環境,並使用其建立簡單的linebot。
- VScode
## Line Bot
#### 1. 建立 [Line Bot](https://developers.line.biz/console/?status=success)
- 登入 [Linebot Developer](https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F%3Fstatus%3Dsuccess)
- 找到 providers後,點選 create,選擇 messaging API,並新增帳號資訊;一個Line 帳號可以建立多個聊天機器人。


- 填寫基本資料即可建立自己的 Line Bot

- 點選 Messaging API,往下滑看到 Auto-reply messages 點選 Edit

- 即可透過設定的方式簡易完成一些 Line Bot 訊息簡單回復功能

- 設定完後回到 Messaging API,即可掃 QR code 加入好友進行測試

#### 2. Linebot Script與linebot連接
- [Linebot 先備知識](https://drive.google.com/file/d/1txf1EZ_MVAxEnZM1CbELYc7pK_Cz_69f/view?usp=sharing)
- Basic settings 裡有個 channel secret,Messaging API 最下方有 channel access token,若沒有則可點擊 issue 產生。這兩筆資料等等要貼到 ini 檔裡,可以讓你的 python script 連結 Line Bot


- Basic settings裡有個channel secret,Messaging API最下方有channel access token,沒有的話點issue。這兩筆資料等等要貼到ini檔裡,可以讓你的python script連結line bot


- 下載 - [Linebot example code](https://github.com/Botang-l/Line-Bot)並在vs code開啟資料夾
2.
- 建立一個名叫 config.ini 的檔案,並將 Line Bot 的 channel secret 和 token 輸入 config.ini(可以用記事本打開,也可以Vscoode內開啟更改)

- 打開Linebot_server.py檔,為Flask架構
```python=
from flask import Flask,request,abort
from linebot import LineBotApi,WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage,TextSendMessage
import configparser
app = Flask(__name__)
#linebot基本資料
config = configparser.ConfigParser()
config.read('config.ini')
line_bot_api = LineBotApi(config.get('line-bot', 'channel_access_token'))
handler = WebhookHandler(config.get('line-bot', 'channel_secret'))
@app.route("/callback", methods=['POST'])
def callback():
signature = request.headers['X-Line-Signature']
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def echo(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text)
)
if __name__ == "__main__":
app.run()
```
[flask簡介](https://blog.techbridge.cc/2017/06/03/python-web-flask101-tutorial-introduction-and-environment-setup/)
打開vs code底下terminal,打指令安裝flask及line-bot-sdk套件

```shell=
$ pip install Flask
$ pip install line-bot-sdk
```
- ngrok 讓外網與本機連結
- [ngrok](https://ngrok.com/) 註冊並下載電腦版本對應的檔案
- 解壓縮並在同一個路徑下輸入
```shell=
$ ngrok authtoken <your authtoken>
```

```shell=
$ ngrok http <port> #通常為5000
```

> 會Forwarding出一個網址,讓本機端的server能跟外界溝通
- 將 Line Bot 與 python script 連接
- 把 ngrok 產生的一串網址貼到 line messaging API 下的 webhook URL 並在尾端加上 /callback, 並開啟 Use webhook

- Auto-reply messages 右邊 edit 點進去,Auto-response 關掉,開啟webhooks

- 執行Linebot_server.py檔

- 回到line Webhook URL點verify,success代表成功連上,掃QR code加入好友就可以開始傳訊息囉!

- 當你對你建立完的 Line Bot 發送訊息,你應該會發現他會覆誦你說的話
我們建立的 Line Bot 會回傳你輸入訊息是因為 example 內的這段 code
```python=
@handler.add(MessageEvent, message= TextMessage)
def echo(event):
msg = event.message.text
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=msg)
)
```
- ```@handler.add(MessageEvent, message= TextMessage)```
這一行程式碼,是提醒我們的 LINE 機器人,當收到 LINE 的 MessageEvent (信息事件),而且信息是屬於 TextMessage (文字信息)的時候,就執行下列程式碼。
- 底下```echo```的函式則是我們自已定義的名稱和功能,參數event則是幫使用者輸入的訊息貼上標籤
- ```msg = event.message.text```可以幫我們取出使用者輸入的訊息
- ```line_bot_api.reply_message```是使用上半部linebot框架所建立的物件```line_bot_api = LineBotApi(config.get('line-bot', 'channel_access_token'))```內的```reply_message```method
而此method內有兩個參數,第一個的是```event.reply_token```是指當有新訊息時會產生一個reply_token,你的聊天機器人會拿著這個reply token回覆傳信息的使用者,回覆完時reply token就會消失,這也是你沒有辦法使用一個以上reply_message method的原因。
第二個參數是```TextSendMessage(text=msg)```,也就是指用文字信息的方式回應,並回傳指定的text,而這裡是指派了原先讀到使用者輸入的文字信息,所以就會回傳跟使用者一樣的話。
###### tags: `Linebot`
## HW1-1 建立基本 Line Bot
請根據Lab1-5的流程建立 Line Bot,此時的 Line Bot 應該會覆誦你說的話,請對你剛建立完的Linebot發送訊息,請分批輸入你的姓名、學號和系級,並截圖
## HW1-2 以學號判斷系所、入學管道 (查詢姓名:`廖柏棠`/學號:`N66104571`)
- 作業要求
1. 此次作業要求為希望透過助教提供的 ExampleData.py 裡已經寫好的學號前兩碼對應系所及學號倒數第四碼對應入學管道之 dictionary,同學需要自己做字串切割等等去比對輸入查詢者之系所與入學管道,若無此系所回傳"找不到這個系所!"
2. 將student_id、姓名、line_id 存入 student_data 此 dictionary
- 打開Homework.py檔,看到以下code
```python=
import json
from ExampleData import department_table # 系所代號對照資料Dictionary
from ExampleData import route_table # 入學管道代號對照資料Dictionary
def HW2(text, user_id): # text => 接收到的訊息字串; user_id => User的Line ID
student_data = dict() # 學生資料
department = '尚未實作' # 學號對應的系所
route = '尚未實作' # 入學管道
### 請在下方完成作業功能的程式碼 ###
return ('您的系所是 ' + department + ' ,入學管道是 ' + route, student_data)
```
**學習目標:**
1. string parsing、dict.get()。不須判斷格式是否正確,只要在正確的格式下能順利回傳資料就好。(department、route)
2. 練習dictionary的寫入,將資料寫入student_data,將其'Key'設為student_id,'value'為另一個dict存放學生姓名及line_id。
- objective

