はじめに
忘れがちだけど自分が年を取ると親も年を取る。
ちょっとずつ高齢になってきて、離れて暮らしている親が少し心配な日もチラホラ増えてきた。
お互い良い年なのに軽いケンカして何日も連絡来なかったりすると、少々面倒に。
(ケンカしてるから連絡取りづらい)
Discord
親は私に似てメンドクサイ所があって、なんやかんや今の連絡方法はDiscord。
Discordって現在のステータスは確認できるんだけど、最終ログイン時間って分からないよね。
運よくオンライン状態を確認できればいいんだけど、タイミングが合わず何日もメッセージやりとりしてなければ、無事かどうかも分からない。(ケンカしてるから連絡取りづらい)
ケンカしててもパソコンは毎日付けてるっぽいので、自動で立ち上がるDiscordのログイン履歴が取得できないかと思ってやってみた。
必要になる知識
最低限のDiscordの知識と操作は必要です。
私もほぼ使ってないので、Discordの言葉を正確に把握できていないところもあるかもしれません。
自分用の記事です。
テキストチャンネルの用意
「母ログイン」という名前のテキストチャンネルを作る。
母親に悟られないように、このチャンネルに母親は追加してはいけない。

チャンネルの編集->連携サービス->ウェブフック からウェブフックURLを取得しておく

プログラムからウェブフック出来るか確認
import requests
import json
def channel_url(type_name):
if type_name == '母ログイン':
return "https://discord.com/api/webhooks/12345679・・/ABC・・長い文字列"
else:
raise Exception("タイプミスってるよ")
def text_send(type_name, text):
message = {"content": text}
headers = {'Content-Type': 'application/json'}
response = requests.post(channel_url(type_name), data=json.dumps(message), headers=headers)
if response.status_code != 204:
print(f"エラーが発生しました: {response.status_code}")
if __name__ == '__main__':
text_send('母ログイン', 'テストメッセージ')
サクッと実行して確認しておく。
ウェブフックURLなどは環境変数にして、プログラムに直接書き込まないようにしましょう!

botを作成する
チャンネルにメッセージを送る用のbotを作成し、追加までしておく。
手順は先人たちの素晴らしい記事があるはずなので、「discord bot 作り方」でググる!(笑)
認証トークンも取得しておく。
監視したい人のユーザーIDを調べる
無くても後で実行するプログラムから調べれるんだけど、一応正規の方法で調べる。
自分のアカウントの設定から、開発者モードをONにする。

監視したい母親のアカウントのユーザーIDをコピーする。
(開発者モードをONにしないと選べない模様)

慣れてないので、こういう操作で時間かかる。
メインのプログラム
import discord
from datetime import datetime
import discord_send
TOKEN = "あなたのbotのトークン"
TARGET_USER_ID_LST = [12345・・・] # 監視ユーザーID(母)。 文字列じゃなくて数字だよ!
# 現在オンライン中か記録
online_users = {}
def format_jp_datetime(dt: datetime) -> str:
return f"{dt.month}月{dt.day}日 {dt.hour}時{dt.minute}分"
def format_duration(td) -> str:
total_seconds = int(td.total_seconds())
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
return f"{hours}時間{minutes}分"
def main():
intents = discord.Intents.default()
intents.members = True
intents.presences = True
client = discord.Client(intents=intents)
@client.event
async def on_ready():
print(f"ログイン完了: {client.user}")
@client.event
async def on_presence_update(before, after):
# 監視対象以外は終了
if after.id not in TARGET_USER_ID_LST:
return
before_status = str(before.status)
after_status = str(after.status)
# オフライン → オンライン
if before_status == "offline" and after_status != "offline":
login_time = datetime.now()
online_users[after.id] = login_time
discord_send.text_send('母ログイン', f"{format_jp_datetime(login_time)} {after.display_name} がログイン")
# オンライン → オフライン
elif before_status != "offline" and after_status == "offline":
logout_time = datetime.now()
login_time = online_users.get(after.id)
discord_send.text_send('母ログイン', f"{format_jp_datetime(logout_time)} {after.display_name} がログアウト")
if login_time:
duration = logout_time - login_time
discord_send.text_send('母ログイン', f"オンライン時間: {format_duration(duration)}")
client.run(TOKEN)
if __name__ == "__main__":
main()
ChatGPTに書いてもらった。最初から完璧なものを提示してきたので、絶対誰かが書いたものを学習してると思う。でも記事は見つからなかったんよな。。日本語以外の記事とか?
修正したのは以下ぐらい。ほんと人間は何もしなくてよいですな~
・時間の表示形式を自分好みに
・監視ユーザーIDが複数になっても良いようにリストに
・ただのprintになってた監視内容をDiscord送信処理に
実行環境への導入
後はこのプログラムをクラウドサーバーとかに導入して常時実行させるようにしましょう。
監視の様子
以下3つが表示されるので、あっパソコン付けてるな~が把握できるようになりました。
・ログイン時間
・ログアウト時間
・オンライン時間(ログイン ~ ログアウトの間の時間)
おわりに
監視してること言ったら怒るかもしれないので、このことは墓場まで持っていくね
