【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう!【初心者の方もわかりやすいように解説】

はじめに

こんにちは、キノコードです。 

みなさんが普段から使っていらっしゃるであろうLINE。 
現在、LINEのアクティブユーザー数は8400万人といわれています。 
これは、日本の人口の約67%にあたります。
この圧倒的なユーザー数を誇るLINEですが、メッセージのやり取り以外にもこんな機能が欲しい!と思ったことはありませんか? 
例えば、気になるサイトの新しい記事が出たら通知して欲しい。
毎朝決まった時間に天気予報を通知して欲しい。
株価で狙っている金額になったらチャート画像ともに通知して欲しい。 

もし、こんなことを自動で通知をしてくれたら、自分だけの秘書を無料で雇っている感覚ですよね。

この動画では、画像とともにメッセージを送ってくれるプログラムを作成します。

動画で説明する内容は、自分のLINEへ通知を送る方法、通知だけでなくメッセージの送り方、そして、画像と一緒に送る方法です。

以前、別の動画で解説をしたPythonを自動実行してくれるプログラムと組み合わせれば、用途は格段に広がると思います。

動画で何回かご紹介していますが、私がおすすめしている、最速のプログラミング上達方法があります。 

それは、作りたいプログラムを、実際に作ってみることです。 

ただ、勉強を始めたばかりだと、何を作ればいいかわからないという方もいらっしゃると思います。 

今回の動画はそうした、Pythonの勉強を始めたばかりで、何を作ればいいかわからない、という方にも非常におすすめの内容になっています。 

というのも、普段から使っているLINEに、自分で作ったプログラムから通知が来るというのは、なかなか達成感があると思いませんか? 

ぜひ最後までご視聴ください。

キノコードでは、この動画の他にも仕事の自動化の動画、株のデータ分析の講座も配信しています。

ご興味ある方はぜひそちらもご覧ください。

チャンネル登録がまだの方は、新着通知をもいきますのでチャンネル登録をお願いします。

それでは、さっそくレッスンスタートです。 

from google.colab import drive
drive.mount('/content/drive')

Mounted at /content/drive

LINE Notifyへの登録

まず、使用するAPIサービス、LINE Notifyに登録します。

APIとは、Webサービスやソフトウェアの機能を、別のWebサービスやソフトウェアから呼び出せるようにしたものです。
APIの正式名称は、Application Programming Interface(アプリケーション プログラミング インターフェース)といいます。
APIには、天気予報のWebサービスから天気情報を引っ張ってくるAPIや、株価の情報を引っ張ってくるAPI、地図情報を引っ張ってくるAPIなどがあります。

LINE NotifyというAPIは、自分、もしくは自分が入っているグループにメッセージを送るために使用します。
ちなみに、notifyは、通知するという意味です。
それでは、Googleの検索画面でLINE Notifyと検索し公式サイトにアクセスしてください。
LINE Notifyの登録には、LINEアカウントで連携しているメールアドレスとパスワードを使用します。

LINE Notify tokenの発行

ログインができたら、WEBページ右上に登録したご自身の名前が表示されいるはずです。
名前を一度クリックしましょう。
そうすると、「マイページ・登録サービス管理・ログアウト」と表示されます。
マイページをクリックします。
次に、WEBページの下の方にある、「トークンを発行する」をクリックします。
ここにはトークン名を入力します。
私は、「kinotest」としておきます。
次に、「通知を送信するトークルームを選択してください」の部分で、「1:1でLINE Notifyから通知を受け取る」を選択してください。
トークン名と、通知を送信するトークルームを選択すると、「発行する」が緑になります。
「発行する」をクリック。
発行されたトークンは後で使用するので、メモ帳かどこかにメモをして忘れないようにしましょう。
トークンが発行されると、連携中サービスに先ほど登録したトークン名とあなたのアイコンが表示されているはずです。 これでAPIを使用する準備が整いました。

詳しいことについては、LINE Notify APIの公式ドキュメントの「通知系」をご覧ください。

実行環境と環境構築

このレッスンでは、pythonとJupyter Labという実行環境を使って解説を進めていきます。
まず、簡単にJupyter Labを使うために、PythonのディストリビューションのAnacondaを使います。
Anacondaのインストール方法は、Pythonの環境構築についての動画がありますので、ご覧ください。概要欄にURLを貼っておきます。 概要欄にURLを貼っておきます。
また、AnacondaにはJupyter Labがインストールされています。Jupyter Labを起動してみましょう。
起動方法についても別途動画があります。 こちらについても概要欄にURLを貼っておきます。

起動方法は、macの場合はターミナル、Windowsの場合はコマンドプロンプトでJupyter Labと入力をしてエンターです。

必要なライブラリのインストール&インポート

#必要なライブラリのインストール
!pip install requests

では、今回のプログラムで使用するライブラリをインストールします。

ライブラリとは、よく使う機能・関数をまとめて、簡単に使えるようにしたものです。

今回は、requestsというライブラリを使用します。
requestsは、http通信をするためのライブラリです。 簡単にいうと、特定のWEBページにアクセスしたり、サーバに指示を送ったりするためのライブラリです。

Jupiter lab上でライブラリをインストールするには、エクスクラメーションマーク、インストール、ライブラリ名と書きます。
実行します。

requestsライブラリをインストールできました。

#必要なライブラリのインポート
import requests

次に、ライブラリを使用できるようにインポートをします。
インポート、requestsと書きます。
実行します。

必要な変数の設定

#必要な変数を設定
#取得したトークン
TOKEN = 'あなたのトークン'
#APIのURL
api_url = 'https://notify-api.line.me/api/notify'
#送りたい内容
send_contents = 'キノコード'

プログラムで使用する変数を設定します。
まず、先ほど取得したトークンを、TOKENという変数に代入します。
トークンと書いて、イコール、シングルクォーテーション、取得したトークンを貼り付けます。
次に、アクセスするnotifyのWEB-APIのURLを変数に代入します。
この、WEB-APIにアクセスするためのURLをエンドポイントといいます。

APIのURLなので、変数名は、エーピーアイ、アンダースコア、URLとします。
アクセスするURLは、LINE Notify API の公式ドキュメント、通知系のPOSTの後にあるURLをコピペします。
これをシングルクォーテーションで括って変数に代入します。 最後に、通知内容を変数に代入します。
変数名はセンド、アンダースコア、コンテンツとしましょう。
シングルクォーテーションで括って、送りたい内容を書きます。
ここでは、「キノコード」としておきます。 実行します。

必要な情報を辞書型にする

#情報を辞書型にする
TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN} 
send_dic = {'message': send_contents}
print(TOKEN_dic)
print(send_dic)

今回使用する、notifyのAPIはトークンと送りたい内容を指定の辞書型で渡す必要があります。
辞書型とは、キーとバリューをコロンで対にしたデータ型です。例えばキーの情報に紐づいているバリューを参照することができます。
notifyのAPIでは、認証情報のトークンは、このようにAuthorization(オーソライゼーション)をキーとした辞書型で渡す必要があります。
また、送りたい内容は、message(メッセージ)をキーにした辞書型で渡す必要があります。
それでは、これらのそれぞれの情報を新しい変数に代入します。
どちらも、辞書の英語頭文字のdicを変数名に使用します。
認証情報のトークンをTOKEN、アンダースコア、dicという変数に代入します。
辞書型は波括弧の中にキーとバリューを指定します。キーはAuthorization(オーソラゼーション)をシングルクォーテーションで括ります。そして、コロンに続けてバリューを書きます。シングルクォーテーションでBearer(ベアラー)を括り、プラス、シングルクォーテーションの中に半角スペース、プラス、変数TOKENと書きます。 このTOKENには先ほど取得したトークンが代入されています。プラスを使用することで、ひとまとまりの文字列を作成することができます。

ここで、半角スペースを間に挟んでいる理由について説明します。
ベアラーの後に半角スペースだけでも、問題なく動作はします。
ですが、半角スペースなどの空白は見落としやすいです。
なので、ここでは、強調するためにわざとこのような書き方をしています。

次に、送りたい内容センド、アンダースコア、dicという変数に代入します。
これも辞書型にする必要があるので、波カッコで括ります。キーの部分はシングルクォーテーションの中にmessageです。そしてコロンのあとにセンド、アンダースコア、コンテンツと書きます。

確認のために、プリント関数で、この二つの変数を表示してみましょう。

実行します。
それぞれの辞書型に、値が代入されていることが確認できました。

LINE通知を送る

#LINE通知を送る(200: 成功時、400: リクエストが不正、401: アクセストークンが無効:公式より)
requests.post(api_url, headers=TOKEN_dic, data=send_dic)

それでは、自分のLINEに通知を送ってみましょう。
通知を送るためにリクエスツ、のポストメソッドを使用します。
ポストメソッドは、サーバーにデータや指令を送るために使用するメソッドです。

リクエスツ、ドット、ポスト、丸カッコの中に、第一引数にはアクセスするWEBAPIのURL、引数ヘッダーズに認証情報、引数データには送りたい内容を渡します。

実行します。

レスポンスの後に200という数字と、ご自身のLINEに通知がきていれば成功です。
送りたい内容として指定した「キノコード」が送られてきています。
おめでとうございます!
自分で作ったプログラムでLINEの通知が来ました。 達成感がありますよね。

ここで、400が返ってきた場合はリクエストが不正ということです。 設定した変数のapi_url、TOKEN_dicとsend_dicが正しく代入されているか、確認してみてください。

画像ファイルを送信する

#画像ファイルのパスを指定
image_file = './test.png'
#バイナリデータで読み込む
binary = open(image_file, mode='rb')
#指定の辞書型にする
image_dic = {'imageFile': binary}
#LINEに画像とメッセージを送る
requests.post(api_url, headers=TOKEN_dic, data=send_dic, files=image_dic)

次に、画像データを送信する方法について説明します。
自分のLINEに画像を送信するのは、どういった場面で活用できるのか1つ例をあげたいと思います。
キノコードでは株や為替のデータ分析のレッスン講座があります。そこでチャートの画像の作り方を説明しました。
例えば、自分にパソコンの為替のデータを24時間、APIを使って取得していたとします。
そして、自分が狙っていた価格やシグナルになったタイミングで、チャートの画像とともに送られてきたら便利ではありませんか?
他にも、24時間パソコンを動かさなくても、毎朝1日1回、パソコンを自動実行をして、株のデータを取得してLINEで通知をしたりすることもできます。 ちなみに、パソコンでpythonファイルを自動実行する方法については、別の解説動画があります。概要欄にURLを貼っておきますし、今右上にカードがでているはずです。 資産運用をやっている人じゃないとこれについてはイメージがつかないかもしれませんが、ひとつの活用シーンとしてご参考になさってください。

さて、LINEで画像ファイルを送信する方法についての説明に戻ります。
最初に、送りたい画像ファイルのパスをイメージファイルという変数に代入します。
私は、同じディレクトリにある、テスト、ドット、ピングという画像ファイルを送ることにします。
このファイルは、株のデータ分析の講座3回目で作成したファイルになります。

ここで一つ補足があります。
今回使用する、notifyの通知系APIで送信できる画像形式は、pngかjpgです。 送信に使用する画像データは、pngかjpgのものを選択しましょう。

次に、読み込んだ画像ファイルをバイナリデータとして開き、読み込む処理をします。
バイナリデータとは、コンピュータが読み取れるように、0と1の値で書かれたデータのことです。

バイナリデータで、ファイルを開くには、openメソッドを使用します。
第一引数に読み込むファイルのパスとして、image_fileを渡します。引数modeには読み込み専用バイナリデータを指すrbと書きます。
こうすることで、指定したファイルをバイナリデータとして開くことができます。
これをバイナリという変数に代入します。

送るデータは、メッセージを送るときと同様に、辞書型にする必要があります。
image_dicという変数に 読み込んだバイナリデータを辞書型にして代入しましょう。 辞書型なので、波カッコの中に記述します。 画像ファイルを送信するためにはキーをimageFileとします。 この時、イメージファイルのFは大文字です。
キーをimageFileとするのはAPIの決まりになっています。 コロンを書いて、バイナリデータが入っている変数名です。

それでは、画像とメッセージを同時にLINEに送ってみましょう。
先ほどと同じく、リクエスツの、ポストメソッドを使用します。
ここは、先ほどのメッセージだけを送ったポストメソッドのコードと同じです。
ここに、画像ファイルを送るための引数filesを追加します。
この引数filesに、バイナリ画像データのimage_dicを渡します。 実行します。

メッセージと画像データが送られてきました。

時刻を取得する

import datetime
time = datetime.datetime.now()
time
#(年、月、日付、時、分、秒、マイクロ秒)の並びになっている

datetime.datetime(2020, 11, 30, 5, 25, 52, 783587)

LINEの通知には時刻が書いてあります。 ただし、あとから振り返った時に日付がわかりやすいように、メッセージに日付を挿入しましょう。

そのため、pythonで現在時刻を取得する方法について説明します。
Pythonで現在時刻を取得するには、デイトタイムライブラリを使用します。
デイトタイムライブラリを使えるように、インポートする記述をします。

次に、現在時刻を取得しましょう。 変数名をタイムとします。
タイム、イコール、デイトタイム、ドット、デイトタイム、ドット、ナウ、丸カッコです。 これで現在の時刻を取得できます。 Timeを表示してみましょう。
実行します。

デイトタイム、デイトタイム、カッコ、年、月、日、時、分、秒の形で情報が入っていますね。
最後の6桁の数字はマイクロ秒です。
このような、データ型をデイトタイム型といいます。
デイトタイム型は、パソコンには読みやすいかもしれませんが、私たちにはあまり読みやすくありません。

#見やすい形(〇〇年◯◯月〇〇日 00:00:00)に変換
time = time.strftime('%Y年%m月%d日 %H:%M:%S')
time
'2020年11月30日 05:25:52'

読みやすい時刻表示に変換しましょう。
時刻の変換には、strftimeメソッドを使用します。 strftimeは、string format timeの略だと私は思っています。そこでここではストリングフォーマットタイムメソッドと呼ばせてもらいます。間違っていたらごめんなさい。 使い方は、変換したいデイトタイム型に、ドット、strftime、丸括弧の中に変換したい書式文字列、です。
今回は、マイクロ秒を除いた、何年、何月、何日、何時、何分、何秒と変換しましょう。
シングルクォーテーションの中に、このように記述します。 変換した時刻を、変数timeに代入しなおします。 ではタイムを表示してみましょう。

実行します。
読みやすい形に変換できていますね。
時刻を変換するstrftimeメソッドには、表示形式にいくつか種類があります。 気になる方は、公式ドキュメントをご確認ください。

時報を作る

#全てをまとめて、時報になるように、送る内容をtime(その時の時刻)にする
import requests
import datetime

time = datetime.datetime.now()
time = time.strftime('%Y年%m月%d日 %H:%M:%S')

TOKEN = 'あなたのトークン'
api_url = 'https://notify-api.line.me/api/notify'
#時刻を送る内容の変数に設定
send_contents = time

TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN}
send_dic = {'message': send_contents}

image_file = './test.png'
binary = open(image_file, mode='rb')
image_dic = {'imageFile': binary}

requests.post(api_url, headers=TOKEN_dic, data=send_dic, files=image_dic)

それでは、最後に時刻と画像データが送られてくるプログラムにします。
といっても今までのコードをコピペして組み合わせるだけです。
このようにコードをコピペしてつなげてみましょう。
一箇所だけ変える部分として、時間を通知してくれる記述になります。
送信する内容を代入していた、センド、アンダースコア、コンテンツに、時刻が入っているタイムに変えてみましょう。

実行します。

時刻と画像データがLINEに送られてきましたね。

エンディング

Lineで通知をするプログラムはいかがでしたか?
LINEの通知では、他にもいろんなサービスと組み合わせることにより便利な使い方がたくさんあります。
キノコードでは、今後も、皆さんの仕事や生活が便利になる動画を作っていきたいと思ってます。
キノコードの新着動画はチャンネル登録をしていただければ、通知が届きますので、ぜひチャンネル登録をお願いします。
それでは、次のレッスンでお会いしましょう。

レッスンで使ったファイルはこちら

■保存方法

Mac:右クリック⇒「リンク先を別名で保存」

Windows:右クリック⇒「名前を付けてリンク先を保存」

Jupyter Labのファイルはこちら