iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
自我挑戰組

Micropython x ESP H/W 之三十個錦囊妙計系列 第 27

[錦囊-貳拾柒] MicroPython webhook 拆雷之旅 + Line notify 實作

  • 分享至 

  • xImage
  •  

筆者發現, https 協議 在使用上還存在不少問題待解, 下面將說明筆者之前使用webhook 遇到的雷該如何拆解及避開. 另外, 將有一個簡單的實作, 題目如右: ESP x MicroPython x heroku x Line notify

  • webhook - GET/ POST
  1. 匯入urequests 模組
import urequests
  1. 使用GET 得到網頁資訊
res = urequests.get('http://micropython.org/ks/test.html')

https://ithelp.ithome.com.tw/upload/images/20181109/20103824aiFLkQQzAF.png
3. 將數值透過POST餵給後端server

urequests.post(url, payload=data)

類別一

  • payload 設定成dict (MicroPython 不支援, 會報錯)
    PS: 但這種寫法在常規版本的Python上是可以被正常使用的)
data = {'table':'1','chair':'2'}

https://ithelp.ithome.com.tw/upload/images/20181109/20103824MtirXf4tDX.png
類型二

  • payload 設定成string 的型態 (正常, 沒有報錯)
data = "{'table':'1','chair':'2'}"

https://ithelp.ithome.com.tw/upload/images/20181109/201038248yMkjm7efJ.png
[秘訣]
(1) micropython 將payload中的data視為字串而非dict, 記得要注意這個不同的形態
(2) 一般使用request 在上傳資料後, 後端取資料的方式是下面這樣, 但micropython 並不是

token = request.form['token']
msg = request.form['msg']

[實作] 使用ESP裝置的MicroPython 發送通知給使用者 (利用Line notify)
(1) 這個實作總共會拆成三個部分:

  • heroku 端處理
  • Line notify 權杖申請
  • ESP x MicroPython 端的操作

(2) Line notify 及Line Message API (push message) 差別如下:

  • LINE Messaging API: 可以實現單向主動推播訊息給用戶, 但月租不便宜且條件限制很多 ex. 不能使用LINE@App來管理與操作及LINE@帳號只要轉換成使用LINE Messaging API,就不可以使用1對1聊天, 簡單的說, 這樣就不能用這個帳戶回應客戶了
  • Line notify: 免費, 目前沒有限制條件, 且可以繼續使用原來的LINE@帳號與Line@App

[正文開始]

  1. 申請heroku 帳號 (heroku sign up)
  2. 安裝heroku cli toolchain (以ubuntu 為例)
curl https://cli-assets.heroku.com/install.sh | sh
  1. 檢查heroku版本
heroku --version
heroku/7.18.5 linux-x64 node-v11.0.0
  1. 登入heroku 帳號
$ heroku login
Enter your Heroku credentials.
Email: (input your email address that you sign up)
Password (typing will be hidden):
Login in as xxx@xxx.com 
  1. 切換到heroku-app 目錄 (就是含有自己寫的heroku app)
  2. 建立/ 查看/ 刪除 heroku app

(1) 建立

heroku create [project name]
* project name 可空白, 會自動assign 一個名字
Creating ⬢ wbln... done
https://wbln.herokuapp.com/ | https://git.heroku.com/wbln.git

(2) 查看

$ heroku list
=== XXX@xxx.com Apps
wbln
* 列出剛剛筆者創建的app

(3) 完整刪除APP的方式如下: (筆者創建的名稱為wbln)

$ heroku apps:destroy --app wbln --confirm wbln
Destroying ⬢ wbln (including all add-ons)... done
  1. Clone https://git.heroku.com/wbln.git 到本地
git clone https://git.heroku.com/wbln.git
  1. 新增app.py/ requirements.txt/ Procfile/ runtime.txt 到wbln資料夾
    [秘訣]
    (1) runtime.txt 內容設定為python-3.7.0 , 如果沒有這個檔案, heroku 就無法判斷APP是使用哪種語言
    (2) app.py: 在heroku 上面轉發訊息給Line notify server 的訊息的程式
    (3) Line notify API 官方設計原則: Line notify bot API
    (4) 筆者的練習版本 heroku-line-app 練習
  2. 新增所有檔案並commit 上去
git add .  
* 將修改過的檔案新增到暫存區
git command -m 'heroku app 1st version'
* 增加註解
git push origin master
* 將本地端的檔案推送到遠端
  1. 申請Line 權杖
  1. 按下[發行]後可看到權杖名稱及已連動的種類
    https://ithelp.ithome.com.tw/upload/images/20181110/20103824Ab9IJZdrik.png
    [秘訣]
    (1) 權杖名稱(token): 那串字串請務必妥善保存, 之後會用到
    (2) 筆者之前已經先申請一筆群的來使用, 因此在這邊就會看到兩筆資訊
  2. 使用瀏覽器做測試
https://[heroku-app name].herokuapp.com/line?token=[line notify token]&message=[your message]

https://ithelp.ithome.com.tw/upload/images/20181110/20103824FbbQxcvxoA.png
https://ithelp.ithome.com.tw/upload/images/20181110/201038242b6jSXPMiz.png
[秘訣] 筆者測試是以[透過1對1聊天接收LINE Notify] 做測試, 依照上面的操作可看到heroku APP 回傳OK代表收到, 而Line notify 也傳送hi 單詞 (代表測試成功)
13. 登入ESP裝置, 在Micropython 中使用urequests 測試是否可以使用

import urequests
>>> url = "https://wbln.herokuapp.com/line"
>>> token = "your line notiry token'
>>> msg = "your message that you want"
>>> msg = msg.replace(' ', '%20')
* 需要把空白字元使用'%20'取代, 否則會報錯
>>> payload = {'token':token, "message":msg}
>>> res = urequests.post(url+'?token='+token+'&message='+msg)
>>> print('response: ', r.text')
'OK'
>>> res.close()
  1. Line 跳出視窗顯示剛剛輸入的訊息
    https://ithelp.ithome.com.tw/upload/images/20181111/20103824BbEwakeEKy.png
  2. 實做結束

上一篇
[錦囊-貳拾陸] 好用的萬用百寶袋
下一篇
[錦囊-貳拾捌] MicroPython x ESP 設定之一鍵佈署
系列文
Micropython x ESP H/W 之三十個錦囊妙計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言