仕事の依頼はこちらから 依頼フォーム

【Python】WebスクレイピングでのLINE Notify APIの使いどころ

PythonでWebスクレイピングを行う際のLINE Notify APIの使いどころを説明したと思います。以下の記事は例なので応用して使用していたければ嬉しいです。

LINE Notify APIの概要、トークン発行、基本的な使い方に関しては過去記事にて説明していますのでまずはそちらをご覧ください。

目次

例1:抽出した情報の通知

以前の記事で作成した以下のLINE Notify用自作モジュールmyline.pyを使用することを前提とします。

import traceback

import requests  # インストール必要


class LineNotify:
    token = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'  # 取得したトークンを設定
    url = 'https://notify-api.line.me/api/notify'

    @classmethod
    def send_message(cls, message):
        """テキストメッセージを送信"""
        headers = {'Authorization': f'Bearer {cls.token}'}
        params = {'message': message}

        requests.post(cls.url, headers=headers, params=params)

    @classmethod
    def send_message_with_image(cls, message, filepath):
        """画像付きメッセージを送信"""
        headers = {'Authorization': f'Bearer {cls.token}'}
        params = {'message': message}

        with open(filepath, 'rb') as f:
            files = {'imageFile': f}

            requests.post(cls.url, headers=headers, params=params, files=files)

以下のコードがWebスクレイピングした結果をLINEに通知するためのサンプルコードとなります。

関数scrapeの中の具体的なコードは省略していますが、ECサイト等で新着商品のURLのリストを返却する関数と考えてください。このようにmain関数を記載することで新着商品のURLを一つずつ送信することが可能となります。

過去に定期的に実行して新着商品があった際にLINEで通知したシステムを作成してほしいと依頼があった際にこのようなコードを使用しました。

from myline import LineNotify


def main():
    urls = scrape()

    for url in urls:
        LineNotify.send_message(url)


def scrape():
    # URL一覧を取得するスクレイピングコード
    
    return urls

if __name__ == '__main__':
    main()

例2:スクレイピングの完了通知

Webスクレイピングを行う際に実行時間が数時間かかるようなことも多いかと思います。その際にPC画面に張り付いていれば完了やエラー発生したことに気付けるのですが、数時間張り付いていることも難しいですよね。時には放置して外出するようなこともあるかと思います。私は外出していても状況がどうなっているかが不安で集中できないこともありました。

それを解消するために完了やエラー発生をLINEに通知するのが良いのではと思い、数時間かかるようなWebスクレイピングを行うときは以下のようなコードを使用しています。

先ほどの例と同じくスクレイピングの具体的なコードは省略していますが、実行時にまず実行開始と通知され、エラー発生時にはエラー発生正常完了時には実行完了と通知されます。

import traceback

from myline import LineNotify


def main():
    LineNotify.send_message('実行開始')
    try:
        # スクレイピングの処理を記述
    except Exception:
        print(traceback.format_exc())  # エラー詳細をコンソールに表示
        LineNotify.send_message('エラー発生')
    else:
        LineNotify.send_message('実行完了')


if __name__ == '__main__':
    main()

面倒なので自作モジュール化

例2はよく使いそうだけどコード量が絶妙な長さで
いちいち書くのは面倒だわ

これが面倒とか言ってるなら外出しても
実行状況とか気にならないのでは

ごちゃごちゃ言わずにモジュール化してよ

仕方ない、自作モジュール化しましょう。

ということで既にあるLineNotifyクラスにメソッドnotify_resultを追加しましょう。

import traceback

import requests  # インストール必要


class LineNotify:
    token = 'xxxxxxxxxxxxxxxxxxxxxxxxxx'  # 取得したトークンを設定
    url = 'https://notify-api.line.me/api/notify'

    @classmethod
    def send_message(cls, message):
        """テキストメッセージを送信"""
        headers = {'Authorization': f'Bearer {cls.token}'}
        params = {'message': message}

        requests.post(cls.url, headers=headers, params=params)

    @classmethod
    def send_message_with_image(cls, message, filepath):
        """画像付きメッセージを送信"""
        headers = {'Authorization': f'Bearer {cls.token}'}
        params = {'message': message}

        with open(filepath, 'rb') as f:
            files = {'imageFile': f}

            requests.post(cls.url, headers=headers, params=params, files=files)

    @classmethod
    def notify_result(cls, func):
        """実行結果を通知"""
        def wrapper(*args, **kwargs):
            cls.send_message('実行開始')
            try:
                func(*args, **kwargs)
            except Exception:
                print(traceback.format_exc())
                cls.send_message('エラー発生')
            else:
                cls.send_message('実行完了')
        return wrapper

デコレータを使用しています。はっきり言ってこの自作モジュールを作るまではデコレータという概念は知っていましたが、どのような時に使うのかよく分かっていませんでした。この自作モジュールを作ることで初めてしっくりきました。

実際に使用するにはmyline.pyをインポートして以下のように使用します。クラスメソッドなのでインスタンス化不要でスクレイピング処理を記載する関数の上に@デコレータ名を記述します。

from myline import LineNotify


@LineNotify.notify_result
def main():
    # スクレイピングの処理を記述


if __name__ == '__main__':
    main()

この記事が気に入ったら
フォローしてね!

シェアしていただけると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次