Dragon Arrow written by Tatsuya Nakaji, all rights reserved animated-dragon-image-0164

python/jupyterでLINE Notify

イメージ
Jan 27, 2020

python/jupyterでLINE通知


概要


機械学習なり、重い処理を用意してそれを実行してすることはpythonを使っていると割と良くあります。
また、GCPやAWS, Microsoft Azureなどで仮想機械を借りて実行するときは、実行終了に気づかずインスタンスを立ち上げっぱなしだと課金時間が続いてしまいます。 
そこで、LINEに通知をおこなってくれるサービスを今回紹介します。 それを簡単にやってくれるのが LINE Notify です。


はじめに


LINE Notifyとは、LINEが提供しているメッセージングAPIのことで、ウェブサービスと連携させることでメッセージを送信することができます。pythonでなくても、rubyやphpなど、その他の言語や環境でも使用できるのでぜひ応用してください。


その他の通知機能


jupyterで実行するとinline上にQRコードが出てくるのでスマホなどで読みこみ、読み込んだ機体へ通知を行う。

メリット: 超簡単で手間いらず

デメリット: pipによる導入手法しかドキュメントに乗っておらず、anacondaによるインストール方法がわからず、筆者はこのサービスを使用することをやめた。また、QR一つで他の機体と接続を行うので、セキュリティには気をつけなければならない。


ブラウザの右上からピロっと通知が出現します。

$ pip install jupyternotify や $ conda install -c conda-forge jupyternotify で簡単に導入可能。

便利ではあるが、やはり筆者としてはいつでも休日や外出時でも確認できる、スマホでの通知が良い。


手順


  1. アクセストークンを取得
  2. 送信する画像を用意
  3. コードを書いて実行


1. LINE Notifyのアクセストークンの取得

1.公式サイトにアクセスして、LINEのアカウントでログインし、トークンを発行


2. 送信する画像を用意

メッセージとともに、アップロードする画像を用意しておく。

何でも良いです。


3. 実行

ドキュメント https://notify-bot.line.me/doc/ja/ 

これを見るとわかりますが、いくつかやり方があります!


3-1. 最も楽な方法

jupyterからcurlコマンドで、APIコール

jupyter notebookではコマンド実行時は、先頭に!をつけます

!curl -X POST -H 'Authorization: Bearer <あなたの発行したトークン>' -F 'message=モデルの学習が終了しました' \ https://notify-api.line.me/api/notify
{"status":200,"message":"ok"}


スタンプや画像も送れます

[スタンプに関してはこちらを参照 https://devdocs.line.me/files/sticker_list.pdf ]

curl -X POST https://notify-api.line.me/api/notify \
       -H 'Authorization: Bearer <あなたの発行したトークン>' \
       -F 'message=インスタンスの学習が終了しました' \
       -F 'imageFile=@/Users/username/Downloads/deep_learning_vm_image.png' \
       -F 'stickerPackageId=2' \
       -F 'stickerId=144'


3-2. コードから実行

筆者的には3-2-2の方が3-2-1よりおすすめです!!


3-2-1 ファイル内で関数をコール

[1]のやり方を紹介しています。

import requests


def PythonNotify(message, *args):
    # 諸々の設定
    line_notify_api = 'https://notify-api.line.me/api/notify'
    line_notify_token = 'xxxxxxxxxxxxxxxxxxxxxx' #メモしておいたアクセストークンに置換
    headers = {'Authorization': 'Bearer ' + line_notify_token}
    # 通知メッセージ
    payload = {'message': message}
    # 画像を含むか否か
    if len(args) == 0:
        requests.post(line_notify_api, data=payload, headers=headers)
    else:
        # 画像
        files = {"imageFile": open(args[0], "rb")}
        requests.post(line_notify_api, data=payload, headers=headers, files=files)




if __name__=='__main__':
    PythonNotify('通知メッセージのテスト', '/your/path/to/image')


3-2-2 親ファイルからインポートして使う

[2]のやり方を紹介しています。

[1]よりも、こちらの方が良い気がします。理由は、親ファイルを1つ作っておけば、子ファイルから読み込んで関数をコールできるから効率的であるからです。


親ファイル ( line_notify_bot.py )

import requests
class LINENotifyBot:
    API_URL = 'https://notify-api.line.me/api/notify'
    def __init__(self, access_token):
        self.__headers = {'Authorization': 'Bearer ' + access_token}


    def send(
            self, message,
            image=None, sticker_package_id=None, sticker_id=None,
            ):
        payload = {
            'message': message,
            'stickerPackageId': sticker_package_id,
            'stickerId': sticker_id,
            }
        files = {}
        if image != None:
            files = {'imageFile': open(image, 'rb')}
        r = requests.post(
            LINENotifyBot.API_URL,
            headers=self.__headers,
            data=payload,
            files=files,
            )


(子ファイルから読み込む)

from line_notify_bot import LINENotifyBot

bot = LINENotifyBot(access_token='xxxxxxxxxxxxxx')

bot.send(
    message='テストメッセージ',
    image='/path/to/image',  # png or jpg
    sticker_package_id=1,
    sticker_id=138,
    )


受けつけるパラメータは以下の通りです。

より詳しい説明は、ドキュメントをみてね https://notify-bot.line.me/doc/ja/ 

パラメータ名必須説明
message必須String最大 1000文字
imageThumbnail省略可能HTTP/HTTPS URL最大 240×240px / JPEG のみ許可されます
imageFullsize省略可能HTTP/HTTPS URL最大 2048×2048px / JPEG のみ許可されます
imageFile省略可能File

LINE上の画像サーバーにアップロードします。
対応している画像形式は、png, jpegです。

imageThumbnail/imageFullsizeと同時に指定された場合は、imageFileが優先されます。

1時間にuploadできる量に制限があります。
詳しくは、API Rate Limitの項を見てください。

stickerPackageId省略可能Numberパッケージ識別子。
Stickerの識別子は以下を参照ください。
Sticker一覧
stickerId省略可能NumberSticker識別子
notificationDisabled省略可能Boolean

true: メッセージ送信時に、ユーザに通知されない。

false: メッセージ送信時に、ユーザに通知される。ただし、LINEで通知をオフにしている場合は通知されません。

デフォルト値は false です。



4. まとめ


LINE Notify を使って、スタンプや画像、メッセージを通じて、通知する方法を紹介しました。

通知するライブラリは色々ありますが、私が知る限りではこれがNo1 ですね!

是非是非使ってくださいな。




参考文献

[1] https://kuroyagikun.com/python-line-message-picture-send/#toc1

[2] https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9