【Python】LINE Notifyを活用してお気に入りのサイトの更新をLINEで自動通知させよう!

Python

皆さん、LINE Notifyってご存知ですか?
LINEが提供しているAPIで予め組んだプログラムに従ってLINEから通知を飛ばすことができるようになる非常に便利なサービスです!今回は筆者が最近ハマっているPythonを使ってカンタンに実装する方法を紹介しています。

まずはLINE Notifyに登録

https://notify-bot.line.me/ja/に飛んでLINE Notifyに登録しましょう。

登録はLINEアカウントを持っていれば誰でも無料でできます。

すでにLINEアカウントを持っている方は右上のログインからログインしてください。

トークンを取得する

ログインすると、先程まで「ログイン」と表示されていた部分がユーザー名に変わっています。

クリックするとメニューが表示されますので、「マイページ」を選択してください。

すると以下のページが表示されます。

初めて利用する方は連携中サービスには何も表示されていませんので、「トークンを発行する」をクリックしてサービスを利用するためのキーのようなものを取得します。

「トークンを発行する」をクリックすると以下のダイアログが表示されますので、トークン名通知を送信するグループまたは自分自身を選択します。

トークン名は通知される際、メッセージの先頭に表示されます。

トークン名を入力し、通知先を選択して「発行する」をクリックするとトークンが発行されます。
この画面は一度閉じてしまうと二度と表示されませんので、メモ帳に貼り付けるなどして別の場所に保存しておきましょう。また他人に教えてはいけないものです。

※下はすでに削除してあるトークンなので公開しています。

ここまででLINE Notify側の準備は完了です!あとはこれを利用してPythonコードを書いていくだけです!

LINE Notify Pythonコード例

以下は超シンプルなサンプルコードになります。

#notify.py
import requests

def send_line_notify(notification_message):
    # コピーしたトークンを貼り付けてください
    line_notify_token = 'あなたのトークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'{notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

send_line_notify("通知内容をここに渡してください")

基本的には上のコードをまんまコピーしてnotify.pyを実行するだけで

上の画像のような通知が自分宛てに飛んできます。

注意すべき点は2つだけ。

一つはrequestsを使用しているため、インストールしていない方は先にpipコマンドでインストールする必要があります。

pip install requests

もう一つは line_notify_token 変数に先程保存しておいた自分専用のトークンを文字列として代入する点です。これだけです。

あとは send_line_notify関数に通知したい文字列を渡すだけ。文字列を直接渡してもいいですし、もちろん文字列型の変数を渡してもOKです。

サイトの更新を通知する(実践編)

今回は当サイト、コードラボJPが更新された際に更新された記事名とそのURLを通知するコードを例に、様々なサイトの更新を自動通知させる方法を紹介します。

まずは以下のコードを御覧ください。

import requests
import schedule
import time
from bs4 import BeautifulSoup

#接続したいサイトのURL
url = "https://codelabsjp.net/articles/"
#最後に取得したhref(リンク)保存用変数
last_href = ''

def send_line_notify(notification_message):
    #LINE通知
    line_notify_token = 'あなたのトークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': f'Bearer {line_notify_token}'}
    data = {'message': f'{notification_message}'}
    requests.post(line_notify_api, headers = headers, data = data)

#サイトにアクセスし、更新されているかチェックする関数
def job():
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'html.parser')
    elem = soup.find_all('a',attrs={'class': 'entry-card-wrap'})[0]
    title = elem['title']
    href = elem['href']
    global last_href
    #最新の記事のURLが前回取得したURLと異なっていれば通知を送る
    if last_href != href:
        send_line_notify(title + href)
    last_href = href


def main():
    job()
    #scheduleに30分おきにjob()関数を行うようにセット
    schedule.every(30).minutes.do(job)

    #scheduleがずっと動作するように無限ループ
    # #sleep(1)で1秒間隔を置き負荷を軽減
    while True:
        schedule.run_pending()
        time.sleep(1)


#notify.pyが実行されると最初にmain()関数の中身が呼び出される
if __name__ == "__main__":
    main()

これがコードラボJPのサイト更新を知らせるためのコードになります。

サイト情報を取得(スクレイピング)するためにBeautifulSoup4、定期実行を行わせるためにschedule、時間間隔を置くためにtimeをインポートしています。

BeautifulSoup4schedule は先にインストールしてください。

pip install BeautifulSoup4
pip install schedule

あとはコード中のコメントにある通りです。

ここではBeautifulSoupを用いたスクレイピングの手法について詳しくは解説いたしませんが、やっていることは新着記事一覧のページにアクセスし、最新記事のURLを30分おきに取得させ、URLを変数に保存、30分後にまた最新記事のURLを取得し、そのURLが先程保存したURLと異なっていれば新たな記事が投稿されたことになるので、タイトルとURLを抜き出して通知しています。

URLの表記がhrefとなっているのは、スクレイピングする際にURLがhtml上aタグ内のhref属性に位置しているためです。紛らわしいと思いますが、最初にサイトにアクセスするためにurlという変数をすでに使っているので、あえて区別しました。

このコードをちょっと改変すれば別のサイトにも応用できます。ぜひ試してみてください!

ただしこのコードの定期実行はプログラムを実行中のみ有効で、ローカルで動かす場合、PC上で常にプログラムを実行し続けている必要があります。

PCを切っても定期実行を行わせたい場合はこのプログラムをHerokuなどのサーバーにアップロードして行わせる必要があります。そちらについても今後解説していこうかと思います。

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました