Python 實作 Line-bot 及 Line-notify
想要有自己私人機器人嗎?使用Line-bot + Line-notify可以完成各種事情,Line輸入關鍵字後能爬取網站氣象,圖片,文章再傳送到line上,只要透過Line Webhook API在手都能滿足願望
請準備具備SSL(配置方式請參閱)及有外部網路的web伺服器(Nginx部署Flask方式請參閱),另外有簡易的heroku網站可以使用,不過該方式無法連接database及30分鐘會自動睡眠並且有每月時間上限!!!建議使用各大公有雲上部署比較容易唷~~
請注意,目前Line Bot除了日本外,其餘api並不支援TLS 1.3唷 !!
- 使用 Flask創建web伺服器處理Line訊息
# app.py import requests from flask import Flask, request, abort from linebot import ( LineBotApi, WebhookHandler ) from linebot.exceptions import ( InvalidSignatureError ) from linebot.models import *
初始化app
app = Flask(name)
Line Channel Access Token
line_bot_api = LineBotApi('<Channel Access Token>')
Line Channel Secret
handler = WebhookHandler('<Channel Secret>')
測試web伺服器有正常渲染
@app.route("/")
def hello():
return "Hi~~!This is a Line-bot server.."
監聽所有來自 /callback 的 Post Request
@app.route("/callback", methods=['POST'])
def callback():
get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
print(body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
abort(400)
return 'OK'
處理 Line 訊息
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
message = TextSendMessage(text=event.message.text)
同步回傳訊息
# line_bot_api.reply_message(event.reply_token, message)
if name == "main":
app.run(host='0.0.0.0', port=5000)
2. 測試執行 app .py ,確認有SSL加密,並且檢查callback路由
```bash=
gunicorn -w 3 app:app --reload
:information_source: callback路由這樣顯示是正常的,因為沒有設置get方法
-
創立line bot 機器人
-
至Line developers網頁登入,並點擊右上角個人配置
-
詳細申請步驟請參閱其他網友的教學不一一分解教學
-
-
將Channel secret 及 Channel Access Token 貼至python app .py程式內
-
並將 flask web 網址貼至 Webhook URL ,並測試是否連線暢通
-
將程式第49行
注解打開,並檢測Line-bot是否會回覆一樣訊息line_bot_api.reply_message(event.reply_token, message)
:warning: Line-bot 至從改版後免費版每月只有回傳500則訊息,非常不方便…
- 使用Line-notify 克服每月500則訊息上限
:information_source: 創建line-notify方式請參閱1-11步驟# app.py # 49 行後面添加 token = '<Your Line Notify Token>' try: requests.post( url='https://notify-api.line.me/api/notify', headers={ 'Authorization': f'Bearer {token}' }, data={ 'message': f"使用Line-Notify回覆訊息:{event.message.text}", }, ) except Exception as _: print(_)
:information_source: Line Notify的無法一對一回覆,只能加入群組內傳遞訊息
簡易的Line-bot機器人已經建立完成~~
範例程式-爬取IG文章、圖片及顯示氣象資訊實作
- 程式碼均放置GitHub上供參考使用
- 需求:
- 擁有IG帳號
- 擁有中央氣象局開放資料平臺會員
- Line-Bot 伺服器 (使用者自定義的伺服器)
- 擁有Line Developer、Line Notify
- 自定義Line群組內包含Line-Bot及Line Notify機器人
三大公有雲中(都有免費使用方案):
1.推薦使用Google GCP上實作,最簡單且直覺,最重要的是伺服器地區有台灣(網速非常快)
2.AWS EC2 進階設定稍微複雜些
3.微軟 Azure 違反人性介面操作..
-
請先將程式碼從GitHub上打包下載到Web Server上
建議使用輕量級及反向代理 Nginx 當作 Web Sever
-
程式架構
-
爬取IG 文章
- 設定IG帳號密碼
# Line-Bot 資料夾 vim conf/ig_conf.yaml
- 設定Line Notify
# Line-Bot 資料夾 vim conf/token.txt
- 確認設定無誤後,執行app .py程式
# Line-Bot 資料夾 gunicorn -w 3 app:app # 3 為 (核心數*2)+1
請確保具備web伺服器具備SSL安全認證,SSL安全認證配置方式請參閱
- 至Line群組發送測試訊息
確認伺服器有收到Line訊息就可以使用~~
- 至Line群組發送測試訊息
- 設定IG帳號密碼
-
爬取氣象資訊
-
至中央氣象局開放資料平臺取得授權碼
-
將授權碼貼至authorization.yaml內
# Line-Bot 資料夾 vim conf/authorization.yaml
-
設定Line Notify
# Line-Bot 資料夾 vim conf/token.txt
-
確認設定無誤後,執行app .py程式
# Line-Bot 資料夾 gunicorn -w 3 app:app # 3 為 (核心數*2)+1
請確保具備web伺服器具備SSL安全認證,SSL安全認證配置方式請參閱
-
至Line群組發送測試訊息
確認伺服器有收到Line訊息就可以使用~~
-