MAGAZINE

ルーターマガジン

Python

【line notify】pythonでlineへ通知してみよう!

2021.03.19
Pocket

 

pythonでlineへ通知してみよう!

こんにちは、学生バイトの福島です。情報理工学科に在学している性分からか、日頃から自動化するプログラムを頻繁に書くのですが、その都度プログラムの動作状況が気になって仕方がありません。
どうにかならないかと少しだけ悩んだ結果、lineに通知するという結論に至りました。slackでもいいのですが、非エンジニアと共有したい場合にはlineの方が都合が良さそうなのでlineにしました。
ということで、今回はpythonを使ってlineへメッセージを送る方法とちょっとした実用例を共有したいと思います。

Line Notifyのご紹介

pythonスクリプトからlineへ通知を送るのにLine Notifyというapiを使います。Line Notifyとは、メッセージや画像を任意のトークルームに送信できるlineの公式apiで、一時間に最大1000件まで送信することができます。

1.アクセストークンの発行

以下のリンクからline notifyのホームページに遷移します。

https://notify-bot.line.me/ja/

1-1.右上のログインボタンからmyページへログイン

1-2.ログイン後、Generate tokenボタンをクリック

 

1-3. トークン名と通知先を指定

今回はトークン名をsampleくん、通知先を自身の個人チャットとしています。グループも選択可能です。
入力できたら最下部のGenerate tokenボタンを押下します。

1-4. 発行されたトークンを保存

この画面を閉じてしまうとトークンを二度と確認できないので、然るべきところに保存しておきましょう。これで下準備は完了です。

2.解説

ここでは簡単のため、curlを用いて説明します。
メッセージを送信するcurlコマンドは以下。

$curl -X POST -H "Authorization: Bearer TOKEN" -F "message=TEXT" https://notify-api.line.me/api/notify

このコマンドはhttps://notify-api.line.me/api/notifyへHTTPのPOSTメソッドで通信をしています。その通信にリクエストヘッダーとしてアクセストークンを載せ、-Fオプションで送信するメッセージを指定しています。
たったこれだけでlineへメッセージを送ることができてしまいます。
※先程発行したアクセストークンをここではTOKEN,送信するメッセージをTEXTと表現しています。各自で発行したものに置換してください。

2-2.pythonで実装

シェルスクリプトよりpythonの方が他のライブラリなどと組み合わせて転用が効くのでpythonで実装します。
ちなみにpythonのバージョンは3.8.0です

import requests

def send_message():
headers = {
'Authorization': 'Bearer TOKEN',
}

files = {
'message': (None, 'TEXT'),
}

requests.post('https://notify-api.line.me/api/notify', headers=headers, files=files)


3. 実用例

今回は実用例として、一時間毎に現在の天気を取得し、lineへ通知するというプログラムを書いてみました。
どのような感じでline notifyを使えばわからない場合は参考にしてください。
使用する言語は引き続きpython、ライブラリはrequestsとbeautiful soupです。

これらのライブラリがインストール済みでない場合はターミナル上で

$pip install requests
$pip install beautifulsoup4

を実行しておいてください。
プログラムは以下です。

import requests
import time
from bs4 import BeautifulSoup

def parse_html(url):

time.sleep(1)

html = requests.get(url)

return BeautifulSoup(html.text, 'html.parser')


def send_message(list):

headers = {
# 各自発行したトークンを記述
'Authorization': 'Bearer TOKEN

}

icon_image = list[1]

text = "\n" + "時刻:" + list[0] + "\n" + "降雨量:" + list[2] + "\n" + "気温:" + list[3] + "\n" + "風速:" + list[4]

files = {

'message': (None, text),

'imageFullsize': (None, icon_image),

'imageThumbnail': (None, icon_image),

}

requests.post('https://notify-api.line.me/api/notify', headers=headers, files=files)

def crawl(url):
# htmlをパース
soup = parse_html(url)

current_weather = soup.select_one('.weather-day > .weather-day__body > .weather-day__item')
# 時刻
current_time = current_weather.select_one('.weather-day__time').text
# 天気画像
icon_image_url = current_weather.select_one('.weather-day__icon > img')['src'].replace("//", 'https://')
# 降水量
rainfall = current_weather.select_one('.weather-day__r').text
# 気温
temperature = current_weather.select_one('.weather-day__t').text
# 風速
wind_speed = current_weather.select_one('.weather-day__w').text

return [current_time, icon_image_url, temperature, rainfall, wind_speed]

# wether newsの天気予報ページ。(渋谷区)
url = 'https://weathernews.jp/onebox/tenki/tokyo/13113/'

# 無限ループ
while True:
# lineへ通知
time.sleep(1)
send_message(crawl(url))
# 一時間待機
time.sleep(3600)

sampleくんが現在の天気を教えてくれました。名前ミスった感が否めませんがしっかり時刻、天気画像、降水量、気温、風速を取得しています。


本当はcrontabやタスクスケジューラの方が好ましいのですが、今回はpythonプログラムで完結させるために無限ループ中に一時間待つ処理を記述することで一時間おきに通知することを実現しています。

最後に

他にもline notifyを使って、定期的に発生する身内で共有したいことを通知したり、logファイルの末尾、スクレイピングの成果物など、様々な使い方ができると思います。
それでは良きline notify lifeを。

その他おすすめ記事

Firebase Hosting / Cloud Functionsを用いてLINE Notify連携サービスを作成する
Pocket

CONTACT

お問い合わせ・ご依頼はこちらから