Pythonで名言をスクレイピングしてLINEにメッセージを送ってみた

Pythonで、名言をスクレイピングして、LINEにメッセージで送ってみました。

名言をスクレイピングしてくる部分は、以下、Rubyで実装されていた記事を参考にさせていただきました。

プッシュメッセージの種類

Messaging APIでメッセージ送信する方法は大きく分けて2種類(応答メッセージ、プッシュメッセージ)で、今回はプッシュメッセージを使います。

プッシュメッセージは、任意のタイミングでユーザーに送信できるメッセージで、送る方法には、以下の4種類があります。

送信方法説明備考
プッシュメッセージユーザー、グループ、トークルームを指定してメッセージを送信。例えば、ショッピングサイトで商品を購入したユーザーに対して、商品の発送を通知する場合に使用。
マルチキャストメッセージ複数のユーザーIDに対して、同じメッセージを効率よく送信。例えば、ショッピングサイトを利用したことがあるユーザーに対して、新機能を一斉に通知する場合に使用。
ナローキャストメッセージ複数のユーザーに対して、同じメッセージを送信。送信対象は、属性情報(性別や年齢、OSの種類、地域など)やリターゲティング(オーディエンス)を利用して指定。
ブロードキャストメッセージLINE公式アカウントと友だちになっているすべてのユーザーに、同じメッセージを送信。

マルチキャストメッセージが複数のユーザーIDを指定するのに対して、ナローキャストメッセージは、ある条件に一致するユーザーのかたまり(オーディエンス)を利用して、オーディエンス同士をAND、ORなどの条件で指定できます。

ナローキャストメッセージは、さらに属性情報も使えるので、マーケティングオートメーションとして、プッシュメッセージを行うのに有用な送信方法です。

ただ、ナローキャストメッセージは送信対象が50人以上必要(送信できる例外もある)なので、個人レベルで使うのには、他の送信方法で十分なので、ナローキャストメッセージ以外について、試します。

Pythonでプッシュメッセージを送ってみた

まず、プッシュメッセージを送るのに、自分自身のユーザーIDを知る必要があります。LINE Developers > チャネル基本設定 > あなたのユーザーID で確認できます。ユーザーIDはUから はじまる文字列です。

以下、記事同様のPipenv環境で、.envファイルに環境変数を記載して実行します。

LINEサンプルボット(Python)をローカルで動かしてみた(2021年版)
LINE_CHANNEL_ACCESS_TOKEN='YOUR_LINE_CHANNEL_ACCESS_TOKEN'
OWN_USER_ID='YOUR_OWN_USER_ID'

メッセージ送信するPythonコードです。

from linebot import LineBotApi
from linebot.models import TextSendMessage
import os

channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
own_user_id = os.getenv('OWN_USER_ID', None)
line_bot_api = LineBotApi(channel_access_token)

line_bot_api.push_message(own_user_id, TextSendMessage(text='プッシュメッセージ'))
line_bot_api.multicast([own_user_id], TextSendMessage(text='マルチキャストメッセージ'))
line_bot_api.broadcast(TextSendMessage(text='ブロードキャストメッセージ'))

コマンドを実行すると、LINEにメッセージが配信されます。

$ pipenv run python push_message.py

Pythonで名言を送ってみた

参考サイト同様、以下サイトから、ランダムに名言を表示させ、スクレイピングして取得します。Getでリクエストして、レスポンスのHTMLからBeautifulSoupで、必要な情報を取得します。

名言をスクレイピングして、LINEにプッシュメッセージを送るPythonコードです。

from linebot import LineBotApi
from linebot.models import TextSendMessage
import os
import requests
from bs4 import BeautifulSoup

channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
own_user_id = os.getenv('OWN_USER_ID', None)
line_bot_api = LineBotApi(channel_access_token)

def saying_text():
    url = 'http://www.meigensyu.com/quotations/view/random'
    res = requests.get(url)
    html = res.text
    soup = BeautifulSoup(html, 'html.parser')

    saying = soup.find('div', class_='text')
    book = soup.find('div', class_='link')
    tags = soup.find('div', class_='tags').find_all('a')

    tag_text = str()
    for a in tags:
        tag_text = tag_text + a.string + ' '

    out = saying.text + '\n(' + book.text + '、' + tag_text + ')'
    return out

line_bot_api.push_message(own_user_id, TextSendMessage(text=saying_text()))

コマンドを実行すると、LINEにランダムに名言が配信されます。

$ pipenv run python push_message_saying.py

まとめ

  • Messaging APIのプッシュメッセージを利用
  • プッシュメッセージには、送る方法によって4種類あり、今回は、1対1のプッシュメッセージを利用
  • BeautifulSoupで名言をスクレイピング

作成したPythonファイルをXserverなどのサーバーにアップロードして、定期実行すると、毎日、自分自身を鼓舞するBotを作成できたりするかと思います。

また、Flexmessageを利用して、名言の見せ方を工夫するのも面白いかと思います。