LINE Notifyを使って、Raspberry Pi Pico Wから自分のLINEに送信してみます。
LINE Notify API Documentによると、https://notify-api.line.me/api/notifyに、
application/x-www-form-urlencodedでPOSTすればよいようです。
しかし、Pico WのMicroPythonには、URLエンコードができるモジュールはないようです。そこで、upipでurllib.parseモジュールをインストールすることにします。
ところが、最新版のPico W用MicroPythonには、upipがなく、mipというものに代わっているようなのです。そして、mipでは、urllib.parseをインストールできません。前回の投稿のWifiに接続するモジュールを使って下の様なコードを実行しても、エラーになってしまいました。import wifi
wlan, ip = wifi.connect()
import mip
mip.install('urllib.parse')
Installing urllib.parse (latest) from https://micropython.org/pi/v2 to /lib
Package not found: https://micropython.org/pi/v2/package/6/urllib.parse/latest.json
Package may be partially installed
upipが実行できるのは、古いバージョンのMicroPythonのようです。探してみると、Raspberry Pi Datasheetsにある、soft/micropython-firmware-pico-w-290622.uf2では、upipが使えました。下のようなコードに変更すると、urllib.parseモジュールがインストールできました。import wifi
wlan, ip = wifi.connect()
import upip
upip.install('urllib.parse')
Installing to: /lib/
Warning: micropython.org SSL certificate is not validated
Installing urllib.parse 0.5.2 from https://micropython.org/pi/urllib.parse/urllib.parse-0.5.2.tar.gz
Installing micropython-collections 0.1.2 from https://micropython.org/pi/collections/collections-0.1.2.tar.gz
Installing micropython-collections.defaultdict 0.3 from https://micropython.org/pi/collections.defaultdict/collections.defaultdict-0.3.tar.gz
Installing micropython-re-pcre 0.2.5 from https://micropython.org/pi/re-pcre/re-pcre-0.2.5.tar.gz
Installing micropython-ffilib 0.1.3 from https://micropython.org/pi/ffilib/ffilib-0.1.3.tar.gz
ようやくURLエンコードができるかと思いきや、import urllib.parseでエラーになってしまいます。Traceback (most recent call last):
File "", line 2, in
File "/lib/urllib/parse.py", line 30, in
File "/lib/re.py", line 11, in
AttributeError: 'NoneType' object has no attribute 'func'
これは、どうやらlibフォルダからffilib.pyとre.pyを削除して、内蔵のものを使うようにすればよいようです。それで、下のコードを実行できるようになりました。実行すると、無事、LINEに通知が送られました。import urequests as requests
from urllib.parse import urlencode
from micropython import const
LINE_TOKEN = const('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
LINE_URL = const('https://notify-api.line.me/api/notify')
def line_notify(message):
header = {
'Content-Type' : 'application/x-www-form-urlencoded',
'Authorization': 'Bearer ' + LINE_TOKEN
}
contents = { 'message' : message}
message = urlencode(contents)
try:
response = requests.post(LINE_URL, headers = header, data = message)
print(message)
except Exception as e:
print(e)
finally:
if 'response' in locals():
response.close()
if __name__ == '__main__':
import wifi
try:
wlan, ip = wifi.connect()
line_notify('テスト送信')
except Exception as e:
print(e)
finally:
if 'wlan' in locals():
wifi.disconnect(wlan)