529

この記事は最終更新日から1年以上が経過しています。

@moriita

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.postにfilesも渡します。
なお,空文字でないメッセージと一緒でないと送れません。
空文字と一緒に送ろうとすると,エラーは出さずに何も送らないという挙動をするので注意が必要です。

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:
    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を使いましょう)。
スタンプを自動で送りたい場面にはまだ出会ってないので,早く出会いたいところ。

529
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
moriita
この記事は以下の記事からリンクされています
L_or_R友達の誕生日を通知するLinebotからリンク
過去の15件を表示する

コメント

サービス利用規約に基づき、このコメントは削除されました。
サービス利用規約に基づき、このコメントは削除されました。
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
BitriseでCI/CDを実現したモバイルアプリ開発の成果を共有しよう!
~
Auth0を使ってID管理にまつわる記事を投稿しよう!
~