前回の記事では、管理人:下村がこの度、ⅮⅯⅯ英会話のレッスン開講お知らせ通知アプリを作ろうと思うに至った背景を長々とひとり語りするのにお付き合いいただきました。
前回の記事の最後でお約束したように、今回はまだまだ未完成&セットアップは超メンドクサイですけど、それでもいいから開講通知が欲しいんじゃ!という方のために、今現在ワタクシが自分用に使ってるやり方をご紹介します。
なぜなら、本当にレッスン開講通知システムが完成するのかどうかは私自身あんまり自信が無いし、出来たとしても数年後になるかもしれないからです。
X(旧Twitter)上でこんな風に自慢(?)しちゃったら、ありがたくも数名のフォロワーさんに興味を示してもらえたので、せっかくリアクションいただいたんだから、手っ取り早く何とかお役に立てる方法は無いかと思ったんだよね。
ただ、繰り返しておきますが私自身別にこういった分野に強い人間ではない(むしろ弱い)ので、セットアップ中に行き詰って問い合わせをいただいたとしても十中八九解決はしてあげられません。ご自分で ChatGPT なんかに質問して頑張ってもらうしかありません。
ダメ元でメッセージ等送っていただいても、私自身が今ツール作成のために結構な時間を費やしていて、個別に返信している余裕が無いと思いますので、普通に既読無視する可能性大ですマジで。
そこらへんを理解いただいた方のみ、試していただくようお願いします。更に、私が使っている Python 実行用のアプリは android スマホ用しかない事が判明したので、Iphoneユーザーは非対応となることもご了承ください。
🌳
①pushbullet
さて、lekcije がメールでの開講通知だったのに対し、サイトウォッチャーはスマホ上でのプッシュ通知でした(詳細は前回の記事参照)。
私には各ツールの諸々の仕組みについては一切分かりませんが、メールはサーバー経由で受信しますよね。でもってプッシュ通知はスマホに直接来ますよね? って事は、プッシュ通知のほうが比較的早く届くんでは? と根拠は無いけど管理人は勝手にそう思い込んだため、プッシュ通知を使った方法を考えてみます。
まず、通知を受け取るプラットフォームはこちらの pushbullet で用意。PC・スマホの両端末で作業が要ります。
Googleアカウントで簡単に登録完了できますので、まずはPCからアクセスします。
PCで開けた時のトップページはこんな風になってますので、右上の自身のアイコンをクリックすると、My Account と Invite Friends、Sign Out の3つが出てくるので一番上の「My Account」を選択。

すると、My Account の画面が表示されます。

画面の真ん中やや下のほうに「Access Tokens」っていう文字が見えるかと思います。
その更に下、灰色の四角い「Create Access Token」をクリック。

すると、暗号のようなものが表示されます。

この暗号みたいな文字と数字の羅列をメモっておきます。
この暗号が無いと、スマホにプッシュ通知を送ることができません。
次にスマホにも同じ pushbullet をダウンロードします。アイコンはこんな感じ。

アプリを起動させると「GOOGLEを使用してサインイン」って出てくると思うので、PCと同じ自身のGoogleアカウントでサインインします。
「パソコン上で、電話の通知を参照できます」や「パソコンやタブレットからのテキスト」みたいな画面が出てくるけど、「スキップ」を押して無視しましょう。
「もう少しで完了です!」という画面まで来たら、「完了」を押してください。pushbulletの設定はこれでOKです。
🌳
②Termux
次が Termux です。こっちのほうがややこしい。こちらはスマホのみダウンロードします。
「Termux」で検索するとGoogle Playストアがまずヒットするかと思いますが(こんな感じ)↓

Google Playストアのものは古いそうで、F-Droid版を使わないといけません(私も ChatGPTに教えてもらった)。というわけで、まず F-Droid をダウンロード。
F-Droid のアイコンはこんな感じ。

アプリを開くとこんな画面が出てきますので、画面右下の黄緑の虫眼鏡をクリック。

するとアプリ検索ができる画面に移行しますので「←アプリを検索」という所に Termux と打ち込みます。

「Termux – Terminal emulator with packages」を選んでインストールすればOKです。

🌳
③Python
さっそく Termux を開けてみましょう。慣れてない方は「?」ってなりそうですが、「~$」のマークのあるところに入力していきます。
試しに適当に英語でも数字でも打ち込んでみてください。オレンジ色のところに文字が入力されると思います。

打ち込んだ文字は「×」で消せます。一旦消して下さいね。
またコピペのやり方ですが、貼り付けたいテキストをCTRL+Cでコピーしておいて、Termux上を適当にどこでもいいので長押しすると、以下のように COPY、PASTE、MORE…って出るので「PASTE」を押すとペーストできます。

操作方法が少し分かったところで、続いて以下のコマンドをコピー&Termuxに貼り付け → 画面右下の「↩」を押して実行 → 終了するのを待ちます。
これはプログラムの実行に必要なものをインストールする作業です。
pkg update && pkg upgrade -y

数分かかります。あまりにも時間がかかりすぎな場合は「↩」を押すと再度動き出す時があるので、もし5分以上動かない気がしたら「↩」を押してみてください。
「~$」に戻ったら、インストールの完了です。

以下のコマンドも同様に、コピー&Termuxに貼り付け → 一番右下の「↩」を押して実行 → 終了するのを待つ、を繰り返し全部インストールします。
pkg install python -y
pip install schedule
pip3 install requests
pip install pushbullet.py
pkg i python-numpy tur-repo
pkg i python-pandas
pip install beautifulsoup4
pkg i python-numpy tur-repo だけは、途中で do you want to continue? と尋ねられるので、「はい」の意味で y と「↩」を順に打ち込みます。
続いて、今度はPythonのプログラムファイルを準備します。
Termux上で
nano lesson.py
と打ち込んで「↩」を押します。

こんな画面になります。

以下のコードを全てコピーして、上記画面に貼り付けます。
import os
import time
import schedule
import datetime
import requests
import pushbullet
from bs4 import BeautifulSoup
# 実行時にAPIキーと講師番号を入力
API_KEY = input("PushbulletのAPIキーを入力してください:\n")
num = input("講師番号を入力してください:\n")
# Pushbullet APIの設定
pb = pushbullet.Pushbullet(API_KEY)
# 前回通知した「予約可」の数を保持する変数
last_notify_count = 0
def send_push_notification(title, message):
push = pb.push_note(title, message)
print(f"Push通知送信: {title} - {message}")
def job():
global last_notify_count # 前回の通知回数を保持するためにグローバル変数を使用
print(datetime.datetime.now())
load_url = "https://eikaiwa.dmm.com/teacher/index/" + num + "/"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
# HTTPステータスコードを確認
if html.status_code != 200:
print(f"⚠️ ページが見つかりません: {load_url} (ステータスコード: {html.status_code})")
return # ページが見つからない場合は処理を終了
name = soup.find("h1").text.strip().replace(" ", "_").replace("(", "_").replace(")", "_")
# 予約可の数をカウント(CSV出力をせずに直接取得)
current_count = len(soup.find_all(string="予約可"))
# 予約可の数が増えた場合のみ通知
if current_count > last_notify_count:
send_push_notification(f"{name} レッスン開講通知", f"{name}のレッスンに新しい予約可が追加されました")
last_notify_count = current_count # 最後に通知した時点の予約可の数を更新
else:
print(f"{datetime.datetime.now()} - 変化なし") # ログを出す場合
# 定期的にスクレイピングを実行
schedule.every(600).seconds.do(job)
while True:
schedule.run_pending()
time.sleep(10)
ペーストしたら、CTRL → x の順にクリック(ファイルを保存)。

「Save modified buffer?」と聞かれるので、「はい」の意味で y →「↩」の順に打ちます。

これでプログラムが完成しました。実行前に、スマホがスリープ状態の時にも実行が続くように、以下コマンドを入力し「↩」を押します。
termux-wake-lock

では実行します。以下のように打ち込み「↩」をクリック。
python lesson.py

①pushbulletで取得していた暗号(APIキー)を入力するように求められるので、入力して「↩」を押してください。

次に登録したい講師の番号を入力するように求められるので、APIキーと同様に入力し、「↩」を押します。
講師番号はⅮⅯⅯ英会話の該当講師のページのURLを見れば確認できます。
https://eikaiwa.dmm.com/teacher/index/〇〇〇〇〇/
大半の講師は5桁の数字になります。たまーに古株の先生は3桁だったり4桁だったりもします。
これで、プログラムの実行まで終わりました。手動でプログラムを中止させるまでは、10分おきに該当の先生のページを確認し「予約可」の文字があれば通知が pushbullet に届くはずです。

なぜ10分ごとにチェックするように設定してあるのかと言うと、lekcije がそうなっていたので。あんまり頻繁にアクセスし過ぎるとサイト側に負荷がかかり、最悪アクセス不可の対策を取られてしまうこともあるらしい。
どのくらいの頻度なら許容範囲なのかは、素人の私には判断が付かないので、lekcije に倣っておけばとりあえず安心かと思いましたのでね。
最後に、プログラムを止めたい時。
Termux上で CTRL → C(キャンセルのC)の順にクリックすると止まります。

KeyboardInterrupt という表示が出て、また「~$」のマークが出てきたら止まった合図です。
🌳
……もし自分がPythonの事なぁ~~~んにも知らんかったとしても、これなら書いてある通りに進めば何とかなるのでは? と想像しながら、一連の流れをご紹介してみましたが、どうでしょうね。
冒頭でも書きましたけど、途中で行き詰まってご相談されても、ワタクシ助けてあげられませんのでね。ついでに、2025年3月時点ではこのプログラムは正常に動いていますけど、何かしらの事情でこれまでは問題無かったのにある日突然エラーが出ることありますので、そこんとこよろしくお願いします。投げやりに聞こえるかもですけど、Pythonって実際そうなんですよ。アタクシも職場でしばしば被害に遭ってますから。
ただ、エラーが出たら私自身多分気付くと思うので、その場合はまたブログなりX(旧Twitter)なりでお知らせすると思われますので、エラーのまま放置ってことは無かろうと思います。