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唷 !!

  • 三大公有雲( GCPEC2Azure )建立VM方式請參閱~~

  • 基本架構

  1. 使用 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方法

  1. 創立line bot 機器人

    1. Line developers網頁登入,並點擊右上角個人配置

    2. 詳細申請步驟請參閱其他網友的教學不一一分解教學

  2. 將Channel secret 及 Channel Access Token 貼至python app .py程式內

  3. 並將 flask web 網址貼至 Webhook URL ,並測試是否連線暢通

  4. 將程式第49行line_bot_api.reply_message(event.reply_token, message)注解打開,並檢測Line-bot是否會回覆一樣訊息


:warning: Line-bot 至從改版後免費版每月只有回傳500則訊息,非常不方便…

  1. 使用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文章、圖片及顯示氣象資訊實作


三大公有雲中(都有免費使用方案):

1.推薦使用Google GCP上實作,最簡單且直覺,最重要的是伺服器地區有台灣(網速非常快)
2.AWS EC2 進階設定稍微複雜些
3.微軟 Azure 違反人性介面操作..

  • 三大公有雲( GCPEC2Azure )建立VM方式請參閱~~

  • 請先將程式碼從GitHub上打包下載到Web Server上

    建議使用輕量級及反向代理 Nginx 當作 Web Sever
  • 程式架構

  • 爬取IG 文章

    1. 設定IG帳號密碼
      # Line-Bot 資料夾
      vim conf/ig_conf.yaml

    2. 設定Line Notify
      # Line-Bot 資料夾
      vim conf/token.txt

    3. 確認設定無誤後,執行app .py程式
      # Line-Bot 資料夾
      gunicorn -w 3 app:app # 3 為 (核心數*2)+1
      請確保具備web伺服器具備SSL安全認證,SSL安全認證配置方式請參閱
      1. 至Line群組發送測試訊息


        確認伺服器有收到Line訊息就可以使用~~
  • 爬取氣象資訊

    1. 中央氣象局開放資料平臺取得授權碼

    2. 將授權碼貼至authorization.yaml內

      # Line-Bot 資料夾
      vim conf/authorization.yaml

    3. 設定Line Notify

      # Line-Bot 資料夾
      vim conf/token.txt

    4. 確認設定無誤後,執行app .py程式

      # Line-Bot 資料夾
      gunicorn -w 3 app:app # 3 為 (核心數*2)+1
      請確保具備web伺服器具備SSL安全認證,SSL安全認證配置方式請參閱
    5. 至Line群組發送測試訊息


      確認伺服器有收到Line訊息就可以使用~~

Similar Posts

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。