Ads 468x60px

##EasyReadMore##

23 5月, 2018

第二章. 建立會回話的 Line bot

linebot 如果要有 reply 的功能,還需要架一個 webserver 來接收 line 的訊息,接收 LINE 的 POST 用,舉個例子,有人傳訊息給你的 BOT 時,LINE 就會發送一個 POST Request 給你(JSON),
所以要架 Flask 微型網站來接收

但要架站會遇到 IP 的問題,如果除非你有對外的固定 IP ,否則就需要穿越防火牆

使用 ngrok 穿越防火牆:

image
先下載 ngrok 的系統相對應的執行檔:
https://ngrok.com/download
假設說你有個網址是  http://127.0.0.1:5000
你在 terminal 裡面輸入 ngrok http 5000
取得對外的網頁如下
image
有個缺點就是8小時候會過期
原因就是在下載的畫面,有提醒沒註冊就不能長久使用
image
註冊完做 ./ngrok authtoken AUTH_TOKEN_key
就不會有限制了
image
line Messaging API 設定:   
將取得的網址貼到 line 的 Messaging API
不用 Verify
image
若不想要預設回覆訊息
image
怎麼將內網的 localhost 讓外面的人都看得到呢?用用 ngrok 吧! - Startup Incubator Asia - https://goo.gl/WLGVMY
[Python] Flask + Requests 試玩 Line Bot API - FuYuan's Space - https://goo.gl/kAWXMn

line_bot.py sample code:

# -*- coding: iso-8859-15 -*-
from flask import Flask, request, abort
from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

app = Flask(__name__)

handler = WebhookHandler('你的Channel secret')

line_bot_api = LineBotApi('你的Channel access token (long-lived) ')

@app.route("/", methods=['POST'])
def index():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
 # get who send profile
 profile = line_bot_api.get_profile(event.source.user_id)

 # convert recive message to utf8 for chinese
 msg = event.message.text.encode('utf-8')
 
 if msg=="名字":
  line_bot_api.reply_message(event.reply_token,TextSendMessage("愛米莉"))
 elif msg=="hi":
  line_bot_api.reply_message(event.reply_token,TextSendMessage("HI~ @"+profile.display_name))
 else:
  line_bot_api.reply_message(event.reply_token,
  TextSendMessage(text=event.message.text))

 # print(profile.display_name)
 # print(profile.user_id)
 # print(profile.picture_url)

if __name__ == "__main__":
    app.run()
python line_bot.py 執行結果:
image

錯誤處理:

加不進群組
如果設定沒錯 那就是該群組已有一個 bot,所以無法加入第二隻 bot.

SyntaxError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)
# -*- coding: iso-8859-15 -*-
import os, sys
...
更多的 Line API 用法可參考官網:
line/line-bot-sdk-python: SDK of the LINE Messaging API for Python. - https://goo.gl/xVbxsq

用 Docker 發送 Line 訊息 可參考:

用 Docker 發送 Line 訊息 | 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY - https://goo.gl/TY1hCF

自己架 ngrok

但有有以下條件
●要有 Domain Name、DNS管理權
●一台有實體 IP 的 主機 :範例 GCP 主機,IP 為 12.12.12.12

更多的使用方法可參考:

line-bot-sdk-python/app.py at master · line/line-bot-sdk-python - https://goo.gl/KNNePz

一個功能完整的 bot:

mao-shonen/LINE-chat-bot - https://goo.gl/n47CFe

與 MQTT 做結合:

hikoyoshi/mqtt_with_linebot: 簡易機房溫度監測 - https://goo.gl/iVopHj

架設方法可參考:

lightblue: 自架 ngrok server (穿透內網) - https://goo.gl/d6k86u

Python中文問題 或 SyntaxError: Non-ASCII character '\xe8' in file - CSDN博客 - https://goo.gl/Xd42XD

0 意見:

張貼留言

 
Blogger Templates