每個步驟有其他相關驗證細節,大概都有一大拖庫文章可搜尋,
這裡只記錄關鍵設置步驟,詳細的部份有空再補上
本來使用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裡打文字回文字,打貼圖回一個貼圖
沒有留言:
張貼留言