まるっとワーク

統計・機械学習・電子工作など気になることを残していきます

Python:LINEに通知をする

PythonでLINEにメッセージや画像を送りたい時に、毎回検索しているのでここにまとめておきます。
プログラムの完了通知をLINEに送りたい/センサーの値を監視していて、特定の値になったらその通知をLINEに送りたいなどで使えるかと思います。

1.LINE Notifyのトークン取得

パーソナルアクセストークンを利用することで、Webサービスの登録をせずに通知を設定することができるようです。
詳細は以下公式ページを参考にしてください。
LINE Notify

1.1 LINEのマイページにアクセスする

上記公式ページにアクセスして、自身のLINEアカウントにログイン後、マイページをクリックする。

1.2 LINE Notifyのトークン発行

以下順番でページをクリックして、 発行されたトークンをコピーする。
トークンを発行する>通知を送信するグループを選択>発行する」

2.LINE通知機能を実装

2.1 必要なモジュールをインストールする

 以下コードを実行。

$pip install requests 

2.2 LINEに通知

以下コードを実行する。
LINEにメッセージを送れます。

import requests

def main():
    message =  ""#ここにメッセージを入力
    send_line_notify('message')

def send_line_notify(message):
    """
    LINEに通知する
    """
    url = "https://notify-api.line.me/api/notify"
    token = "" #ここにトークンを入力
    headers = {"Authorization" : "Bearer "+ token}

    headers = {'Authorization': f'Bearer {token}'}
    payload = {"message" :  message}
    requests.post(url, headers = headers, params=payload, files=files)

if __name__ == "__main__":
    main()


+αサンプルコード

Rasberry Piにて、Rasberry Pi Cameraで写真を撮ってLINEに画像とメッセージを送るPythonコードです。

from picamera import PiCamera
from time import sleep
import subprocess, os, sys, re
from datetime import datetime
import time
import requests
import os
import subprocess
from base_camera import BaseCamera

def camera():
    now = datetime.now()
    dir_path = '/home/pi/smart/image/'
    file_name= now.strftime('%Y%m%d%_H') + '.jpg'
    fname    = dir_path + file_name
    try:
        os.mkdir(dir_path)
    except OSError:
        print('Date dir already exists')
    #os.system('raspistill -w 480 -h 360 -o ' + fname)
    camera = PiCamera()
    camera.resolution = (600, 400)
    camera.framerate = 15
    camera.start_preview(alpha=200)
    sleep(4)
    camera.capture(fname)
    camera.stop_preview()
    return fname

def line(fname):
    url = "https://notify-api.line.me/api/notify"
    token = "" #ここにトークンを入力
    headers = {"Authorization" : "Bearer "+ token}

    message =  "写真を撮りました!"
    payload = {"message" :  message}
    files = {"imageFile": open(fname, "rb")}
    r = requests.post(url, headers = headers, params=payload, files=files)
    print(r.text)
    

def main(image=""):
    if image == "":
        call_alexa()
        sleep(5)
        fname = camera()
    else:
        fname = image
    if fname:
      line(fname)

if __name__ == '__main__':
    main()


通知画像とメッセージ
f:id:toku_dango:20210515140217p:plain

まとめ

今回はPythonでLINEに通知する方法をまとめました。
LINEは、普段から使うタイミングが多いと思うので、通知するには良いですね。