使用IFTTT串聯網路自動化服務(二):從Python執行Webhooks

既然透過IFTTT平台就能簡單的發布LINE訊息,我們何苦用PythonNode.js等程式語言編寫LINE應用?因為單憑IFTTT做不出「LINE聊天機器人」之類的對話型應用程式,它所能傳送參數資料和類型有限,也無法在LINE上面顯示對話方塊和圖文選單等介面。

IFTTT的工作是把來自某個應用或者自訂程式的訊息,轉給LINE或其他服務。

上一篇文章已經設定好串聯Webhooks和LINE的方案程式。在程式語言中,“Webhooks”也稱為“callback”(回呼),它其實是一個連結網址,目的是讓外部程式觸發執行網站平台上的某項功能;進入IFTTT的Webhooks頁面,點擊右上方的Documentation(說明文件)

Documentation(說明文件)連結

就能看到你專屬的驗證碼(key)和Webhooks網址:

你專屬的驗證碼(key)和Webhooks網址

Webhooks的網址格式如下,此處假設這個方案程式的事件名稱叫PIR,驗證碼是“abcd1234”:

Webhooks的網址格式

直接在瀏覽器中輸入上面的網址,後面附加一個其值為“客廳”的value1參數,將觸發執行我們之前設定好的方案程式.:

瀏覽器畫面

你的LINE帳號也會收到通知訊息(底下畫面的第2則訊息來自另一個程式,請忽略):

LINE畫面

使用Python執行IFTTT方案程式

底下的程式透過Python的request程式庫的get()方法發出GET請求,並傳遞一個value1參數。參數值包含中文,傳送前最好先經過URL編碼:

import requests as req
from urllib import parse

evt = 'PIR'   # 事件名稱
key = '你的驗證碼'
val1 = parse.quote('大門')  # value1參數值

url = (f'https://maker.ifttt.com/trigger/{evt}' +
       f'/with/key/{key}?value1={val1}')

r = req.get(url)  # 執行IFTTT平台的webhooks
r.text   # 取得IFTTT的回應

在命令行字元或終端機執行上面的程式碼,IFTTT將回應“Congratulations! You’ve fired the PIR event”字串,你的LINE也會收到通知訊息。

在MicroPython控制板安裝Python程式庫

在微電腦控制板上執行的MicroPython並沒有內建urllib.parse程式庫,所以也沒有處理URL編碼的函式,但是在MicroPython官方程式庫原始碼專案網頁micropython-lib,可以看到urllib.parse程式庫

urllib.parse程式庫

MicroPython也具備套件管理員,電腦版Python的套件管理員是個叫做pip的命令,MicroPython則是叫做”upip”的程式庫。底下是透過PuTTY連接MicroPython,執行upip的install()函式安裝“urllib.parse”程式庫的例子:程式庫預設會被安裝到‘/lib/’路徑

透過upip安裝程式庫

然而,因為ESP8266記憶體空間不足,導致安裝過程出現錯誤。如果自行編譯MicroPython韌體時,一併納入“urllib.parse”程式庫,它可能也會在執行階段出現記憶體錯誤。

所以,與其讓MicroPython處理URL編碼,倒不如直接給它已編碼的資料。JavaScript語言中,處理URL編碼的全域函式叫做encodeURI()。在Chrome瀏覽器中按F12功能鍵,開啟「開發人員工具」面板,然後切換到Console(控制台)窗格:

開發人員工具的Console(控制台)窗格

在「控制台」輸入上面第一行的JavaScript敘述,便能得到URL編碼的「客廳」文字。

在MicroPython控制板測試IFTTT連線

筆者把經過URL編碼的“客廳”字串存入“livingroom”變數,修改後的MicroPython版程式如下:

import urequests as req

evt = 'PIR'   # 事件名稱
key = '你的驗證碼'
livingroom = '%E5%AE%A2%E5%BB%B3'  # URL編碼的“客廳”

url = ('https://maker.ifttt.com/trigger/{evt}' +
       '/with/key/{key}?value1={val1}').format(
    evt=evt,
    key=key,
    val1= livingroom
)

r = req.get(url)
r.text

在PuTTY終端機的執行結果:

在PuTTY終端機執行MicroPython

用PIR人體紅外線感測器搭配MicroPython觸發執行IFTTT Webhooks

「PIR人體紅外線感測器」相當於一個開關電路,此處把它的輸出接到Wemos D1 mini控制板的D1 (GPIO 5)

PIR人體紅外線感測器麵包板電路

底下的程式修改自《超圖解Python程式設計入門》附錄B的「偵測人體移動」,它將在偵測到有人經過時,觸發IFTTT的Webhooks發送LINE訊息:

from machine import Pin
import time
import urequests as req

evt = 'PIR'   # 事件名稱
key = '你的驗證碼'
livingroom = '%E5%AE%A2%E5%BB%B3'  # URL編碼的"客廳"

state = False
start_timer = True
delay_ms = 30 * 1000  # 延遲30秒

LED = Pin(2, Pin.OUT)
PIR = Pin(5, Pin.IN)

LED.value(1)

apiURL = ('https://maker.ifttt.com/trigger/{evt}' +
       '/with/key/{key}?value1={val1}').format(
    evt=evt,
    key=key,
    val1= livingroom
)

try:
    while True:
        if PIR.value() == 1:
            if state == False:
                LED.value(0)
                print('Motion detected')
                state = True
                req.get(apiURL)

        if state:
            if start_timer:
                print('start timer!')
                start = time.ticks_ms()
                start_timer = False

            delta = time.ticks_diff(time.ticks_ms(), start)

            if delta >= delay_ms:
                start_timer = True
                state = False
                LED.value(1)
                print('LED is OFF!')

except KeyboardInterrupt:
    LED.value(1)
    print('bye!')
Posts created 469

One thought on “使用IFTTT串聯網路自動化服務(二):從Python執行Webhooks

  1. 我想問如果要一次傳value1跟value2,
    url = (‘https://maker.ifttt.com/trigger/{evt}’ +
    ‘/with/key/{key}?value1={val1}’).format(
    evt=evt,
    key=key,
    val1= num,
    val2= renum,
    )
    前面的要怎麼改
    請幫個忙,謝謝

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top