如何將LineBot裝在7688上

LineBot需要裝在具有https的伺服器上,例如heroku或azure,但是每次程式有一些小修改都要重新再上傳到heroku,好像有點麻煩,如果能在本機上直接測試就方便多了。但是,本機通常在區域網路的虛擬IP內,外界根本無法識別這些IP位置,於是,就有一種伺服器,能夠幫我們在外界和本機之間建立起https的虛擬通道,並且還能給定一個domain name,讓外界可以找到並穿透進內部網路,找到內部的機器,像這些服務,可以找得到的就有ngrok以及localtunnel。

但是,今天我想要把LineBot的程式放進7688 DUO裡面,ngrok沒辦法使用,但是localtunnel可以,於是,就決定用localtunnel來實作出LineBot的虛擬通道。其實要將LineBot裝進7688真的不容易:

1、ngrok比localtunnel穩定,但7688無法使用ngrok,只能用localtunnel,localtunnel常常會crash,且在Line上傳訊息時,有時會漏訊息。

2、我之前的LineBot程式都是用node.js寫的,但是,7688的node.js是0.12.7,實在太老舊了,一些LineBot要用的套件都無法裝上去。

3、7688上的記憶體實在太少,裝沒幾個套件,記憶體幾乎都快用完。

所以,本來要用node.js開發的程式,改用python來寫,似乎還勉強能夠達成,於是,就用python實作LineBot程式,再加上localtunnel讓Line的伺服器能識別得到7688。


一、為7688安裝localtunnel

首先,請將7688 duo韌體升級到最新版(0.9.4),用ssh登入7688後,執行如下指令安裝localtunnel

npm install -g localtunnel

以上安裝過程需要一段時間,而且可能會產生一些警告訊息,只怪7688上的node.js太老舊了。

localtunnel的相關使用可參閱如下網址

https://github.com/localtunnel/localtunnel

二、為python安裝需要的套件:Flask以及line-bot-sdk

pip install Flask
pip install line-bot-sdk

三、在7688建立資料夾,放置python寫的LineBot程式

cd /root
mkdir app
cd app

四、在/root/app底下建立linebot程式,檔名main.py,內容如下:

# coding=utf-8
import mraa
from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

#這邊的port可以修改成你要想run的port
myPort=8090

#這邊會對S0這個接腳點亮或關閉LED,S0是gpio17
pin = mraa.Gpio(17)  
pin.dir(mraa.DIR_OUT)
pin.write(0)

app = Flask(__name__)

#請修改以下的程式,加入自己Line的channelAccessToken以及channelSecret
line_bot_api = LineBotApi('這裡改成自己Line的channelAccessToken')
handler = WebhookHandler('這裡改成自己Line的channelSecret')

@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):
    if event.message.text==u"LED開":
       pin.write(1)
       line_bot_api.reply_message(event.reply_token,TextSendMessage(u"LED已開"))
    elif event.message.text==u"LED關":
       pin.write(0)
       line_bot_api.reply_message(event.reply_token,TextSendMessage(u"LED已關"))
    else:
       line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))


if __name__ == "__main__":
    app.run(host='0.0.0.0', port= myPort)

五、請將7688的S0腳位接上一個LED燈。(若只是要單純測試LineBot能否裝上7688的話,這個LED不接也行)

六、先進入/root/app底下,執行以下兩列指令,第一個是執行python的LineBot程式,第二個則是執行localtunnel,讓外界和內部網路穿透,並註冊取得一個domain name。這兩行指令執行時會有點久

python main.py &
lt --port 8090 --subdomain XXXXX &

以上第二行指令的XXXXX請改成你想要的外界識別得到的domain name,例如,如果XXXXX是abcdef的話,外界識別得到的這個7688的domain則是https://abcdef.localtunnel.me/,請注意XXXXX不要用一個很常用的,以免和別人重複,這時就得要重新執行第二行的指令,重新取得另一個domain name。

七、到Line的管理介面,https://business.line.me/zh-hant/,登入後,將上面第六個步驟取得到網址填入LineBot的Webhook URL的網址欄位內。

八、至此大功告成,可以開始用Line輸入任何訊息,7688也會回應並傳回Line上,或是可以讓7688執行一些開啟家電或是燈光i或是其他更有趣的工作了。