548
Help us understand the problem. What are the problem?

posted at

updated at

PythonでLINEにメッセージを送る

はじめに

何番煎じかわかりませんが,Python x LINE NotifyでLINEにメッセージを送れるボットを作ったので,その備忘録です。

深層学習モデルの学習など,時間がかかる処理を回しているときに,その場を離れても進捗状況を知りたい!というときに重宝しています。

できること

LINEのグループや自分自身にメッセージ・画像・スタンプを送ります

※こちらからのメッセージには反応できません

LINE Notifyについて

LINE Notify公式

Webサービスからの通知をLINEで受信

Webサービスと連携すると、LINEが提供する公式アカウント"LINE Notify"から通知が届きます。

複数のサービスと連携でき、グループでも通知を受信することが可能です。

動作環境

僕の環境は下の通りです。
が,Pythonでimport requestsできれば動くと思います。

  • Windows10 (64bit)
  • Python3.6

準備

LINE Notifyと友達になる

まずはLINE Notifyを友達に追加します。
自分に送るだけならこれで大丈夫です。
グループに送りたいときは,そのグループにLINE Notifyを招待しておきます。
このLINE Notifyからメッセージが送られてきます。

アクセストークンの発行

次に,アクセストークンを発行します。

1. マイページにアクセス

LINE Notify公式にアクセス
② 右上からログイン
③ ログインと同じところをクリックし,マイページへ

2. トークンの発行

① ページ下部の「トークンを発行」をクリック

② トークン名を指定し,グループを選択して発行

③ 発行されたトークンをコピーしてどこかに保存

④ ページ上部でちゃんと連携されているか確認

連携を解除したいときは「解除」をクリックすればOKです。

トークンを保存し忘れたときなどは,一旦解除してもう一度発行すればOKです。

実装

ライブラリ

必要なのは requests だけなので,

import requests

準備

LINE NotifyのAPIのURLと,アクセストークンを含んだヘッダが必要になります。

url = "https://notify-api.line.me/api/notify"
access_token = 'Your Access Token'
headers = {'Authorization': 'Bearer ' + access_token}

メッセージを送る

3行でメッセージを送ることができます。
なお,空文字は送れません。

message = 'Write Your Message'
payload = {'message': message}
r = requests.post(url, headers=headers, params=payload,)

画像を送る

画像を送るときは, requests.postfiles も渡します。
なお,空文字でないメッセージと一緒でないと送れません。
空文字と一緒に送ろうとすると,エラーは出さずに何も送らないという挙動をするので注意が必要です。

message = 'Write Your Message'
image = 'test.png'  # png or jpg
payload = {'message': message}
files = {'imageFile': open(image, 'rb')}
r = requests.post(url, headers=headers, params=payload, files=files,)

スタンプを送る

スタンプを送るときは,payloadstickerPackageIdstickerIdを追加します。
これらのIDは ここ から探してきて指定します。
こちらも画像と同様,空文字でないメッセージと一緒じゃないと送れず,空文字と一緒に送ろうとしてもエラーは出ません。
また,存在しないIDを指定した場合はメッセージも送られないので,注意が必要です。

message = 'Write Your Message'
payload = {
    'message': message,
    'stickerPackageId': 1,
    'stickerId': 13,
}
r = requests.post(url, headers=headers, params=payload,)

まとめる

以上をまとめてクラスにしてしまうと,次のようになります。

line_notify_bot.py
import requests

class LINENotifyBot(object):
    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='Your Access Token')

bot.send(
    message='Write Your Message',
    image='test.png',  # png or jpg
    sticker_package_id=1,
    sticker_id=13,
)

こちらは GitHubに公開 しているので,使えればOKという方はcloneして頂ければすぐ使えます。
test/test.ipynb にこれらの実行例をまとめてあるので,そちらを見て頂いた方がわかりやすいかもしれません。

git clone https://github.com/moritagit/LINENotifyBot.git

まとめ

自分が使いやすいように作ってみましたが,かなり簡単に使える割になかなか便利です。
とりあえず深層学習モデルの学習中にlossの値や学習曲線を送ったりしてみてます(tensorboardを使いましょう)。
スタンプを自動で送りたい場面にはまだ出会ってないので,早く出会いたいところ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
548
Help us understand the problem. What are the problem?