gtag

2021年3月12日 星期五

Line Bot + Python + Flask + Apache + virtualenv 架在Raspberry Pi 4上

每個步驟有其他相關驗證細節,大概都有一大拖庫文章可搜尋,
這裡只記錄關鍵設置步驟,詳細的部份有空再補上
本來使用ngrok,但網址每次執行即變更,使用上不方便,改用APACHE

1.安裝apache

sudo apt-get install apache2

在接下來設置過程,要常看/var/log/apache2/error.log,最好用tail指令

tail -f /var/log/apache2/error.log

2.確認Python版本
原生的樹莓派OS己有內建,這裡使用的是3.7.3版本

pi@raspberrypi:~ $python --version
Python 3.7.3

3.安裝mod_wsgi

pip install mod_wsgi

4.安裝virtualenv

pip install virtualenv

5.設定wsgi要使用的venv
python的主目錄設定在/var/www/app
app的名稱叫slinebot,目錄設定在/var/www/app/slinebot
切換到/var/www/app/slinebot下,執行以下命令

virtualenv -p /usr/bin/python3 venv

執行後會產生一個venv的目錄
切換到venv/bin目錄底下,進入venv虛擬環境

pi@raspberrypi:/var/www/app/slinebot/venv/bin $source activate
(venv) pi@raspberrypi:/var/www/app/slinebot/venv/bin $

有看到前面括號有venv的字樣即正確,接下來步驟6,7都要在venv裡安裝

6.[venv虛擬環境裡]安裝Flask

pip install flask

7.[venv虛擬環境裡]安裝LineBot SDK

pip3 install line-bot-sdk

8.設置 LINE 的 Messaging API
確認取得Channel secret及Channel access token
確認設定Line developers的Messaging API裡的Webhook settings
Webhook URL:填入你的網址,必須是https開頭的
Use webhook:打開

9.設定apache2使用wsgi
python的主目錄設定在/var/www/app
在此目錄放置一檔案 app.wsgi 內容如下:

#!/usr/bin/python3
import sys, os
import logging
activate_this = '/var/www/app/slinebot/venv/bin/activate_this.py'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0, "/var/www/app/")

from slinebot import app as application

10.設定apache2使用ssl

啟用 apache2 SSL 模組

sudo a2enmod ssl

sudo a2ensite default-ssl

重啟apache2

sudo service apache2 restart

再到https://zerossl.com/
申請免費的SSL憑證,申請完成可下載三個檔案

private.key
certificate.crt
ca_bundle.crt

分別放到以下目錄,沒有手動建

/etc/ssl/certs/certificate.crt
/etc/ssl/private/private.key
/etc/ssl/ssl.crt/ca_bundle.crt

修改/etc/apache2/sites-available/default-ssl.conf

SSLCertificateFile    /etc/ssl/certs/certificate.crt
SSLCertificateKeyFile    /etc/ssl/private/private.key
SSLCACertificatePath    /etc/ssl/certs/
SSLCACertificateFile    /etc/ssl/ssl.crt/ca_bundle.crt

11.加入linebot主程式
在/var/www/app/slinebot目錄下產生一檔案__init__.py,內容如下

import os, sys
from flask import Flask, request
from linebot import LineBotApi, WebhookHandler
from linebot.models import *

app = Flask(__name__)

# get channel_secret and channel_access_token from OS environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)

if channel_secret is None:
    print('Set LINE_CHANNEL_SECRET as environment variable.')
    sys.exit(1)
if channel_token is None:
    print('Set LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
    sys.exit(1)

line_bot_api = LineBotApi(channel_token)
handler = WebhookHandler(channel_secret)

@app.route("/", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    handler.handle(body, signature)
    return ""

@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
    msg = event.message.text
    msg = msg.encode('utf-8')
    if event.message.text == "貼圖":
        line_bot_api.reply_message(
            event.reply_token,
            StickerSendMessage(package_id=1, sticker_id=2)
        )
    else:
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=event.message.text)
        )
    return ""

if __name__ == "__main__":
    app.run()

12.設置LINE的OS環境變數
在裡加入以下兩行

export LINE_CHANNEL_SECRET={你的SECRET}
export LINE_CHANNEL_ACCESS_TOKEN={你的TOKEN}

重啟apache2

sudo service apache2 restart

最後應該可以在LINE裡打文字回文字,打貼圖回一個貼圖

沒有留言:

張貼留言