iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
自我挑戰組

總是學不來的中年大叔,孤獨的自學之旅系列 第 11

DAY11 - 第一個小範例 : LineBot 自動回話

前言

今天是鐵人賽的第十一天,開始進入新的階段啦
從這邊開始會寫一些我自學過程中寫過的範例

Imgur

申請 Line Developer 帳號

要開始寫Line Bot之前,先要有Line開發者帳號
請先到LINE Developers Console 建立一個開發者帳號
(註: 要創立開發者帳號之前...要先有Line的帳號)

如不知知道怎麼註冊開發者帳號,請點選下面的圖片連結
Imgur

建好開發者帳號後,就在管理頁面上建立一個 provider
Imgur
在建立的類型選擇 Create Messaging API channel
Imgur
之後就照著填資料,下面的圖就是我建好的 (豬頭可以換成自己喜歡的圖..)
Imgur

保存LineBot 的重要資料

Line Bot的帳號建好之後,有兩個資料要先保存

Channel secret
Imgur
Channel access token
Imgur
上面的兩張圖,紅色框起來的部分,把文字複製下來,貼在記事本裡保存
在本機開發Lien Bot時,會用到,存下來就不用去開網頁查看。

補充: 最後記得要把這個LineBot 加到你的Line好友

LineBot 開發環境建置 (for Python)

以下都是在win10 64bit 家用版的環境下建置

下載Ngrok

這是一個可在本地端測試webhook 的必備工具

安裝Python 虛擬環境的套件
pip install virtualenvwrapper-win

建立 Python 虛擬環境

mkvirtualenv mylinebot

建立 LineBot 開發專案

#註: 以下操作都需要在python的虛擬環境底下執行
#安裝 Django & Line SDK
pip install Django==2.2.4
pip install line-bot-sdk==1.8.0
pip install yfinance

#建立 django 專案
django-admin starproject mybot
cd mybot

#建立 app 跟 資料庫初始化
python manage.py startapp myapp
python manage.py makemigrations
python manage.py migrate

在這個範例裡只會修改3隻檔案如下圖所示:
Imgur

/settings.py 設定檔內容太長,只列出要改的地方

#找到ALLOWED_HOSTS 把內容改成 ['*']
ALLOWED_HOSTS = ['*']

#檔案最後面加入
LINE_CHANNEL_SECRET ='這邊改成你申請的' 
LINE_CHANNEL_ACCESS_TOKEN ='這邊改成你申請的'

/urls.py

from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from myapp import views

urlpatterns = [
    url('^callback',views.callback),
    path('admin/', admin.site.urls),
]

/views.py

from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt

from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextSendMessage
from module import func


line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)



#傳什麼訊息回覆相同訊息的範例
@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            if isinstance(event, MessageEvent):
                line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))

        return HttpResponse()
    else:
        return HttpResponseBadRequest()

以上的程式碼內容,只要複製貼上,基本上都可以正確地執行
這個是Line Bot最簡單的Echo範例,也是Line官網上面的範例(又可稱為公版程式)
Imgur
(註:Line官網的python範例是以另一個框架Flask為例,這邊是用Django)

測試LineBot

python manage.py runserver

Imgur

打開 ngrok
Imgur

把 ngrok的網址 填到 LineBot 的管理頁面上
補充: "每次" 打開ngrok 得到的網址都不一樣,每次都要去LineBot的管理頁面更換Webhook URL
Imgur

打開Line 傳給訊息給Bot
Imgur

下載本篇的範例程式碼 (使用git clone)

git clone https://smilehsu@bitbucket.org/smilehsu/mylinebot.git

以上就是鐵人賽第11天的內容 :)


上一篇
DAY10 - 如何挑選自學的教材
下一篇
DAY12 - 踩坑紀錄 : Bitbucket
系列文
總是學不來的中年大叔,孤獨的自學之旅30

尚未有邦友留言

立即登入留言