Discordへのアマプラ更新通知

概要

AmazonPrimeVideoの新エピソードが更新されると,通知してくれるサービス(自分でいちいち確認するのが手間だったため)
DiscordにはWebhookという簡単に投稿できるサービスがあり,チャンネルなどで通知分けが容易などのメリットがある
言語にはPythonを使用し,自宅のUbuntuサーバーでCronによる定期実行している

github.com

Pythonによる実装

調べてみると同じようなことをしている人がいたので,大いに参考にした.(初めはWindowsのPowerAutomate?を使おうと思っていたが,よくわからなかったのでやめた)
コードの骨組みは次のサイトを参考にした.てかほとんどコピペ
qiita.com

エラー処理や,ログ処理を行っていて本格的ですごい.

期待していた動作をほぼ行っていたので,少しだけ改造.

pklファイルによる保存

エピソード数の変化を検知するために,取得したい作品と,そのエピソード数をローカルで保存しておく必要がある.
上サイトでは,URLの保存などにCSVを使っていたが,自分は辞書形式({"タイトル":"エピソード数"})のようにしたかったので,いろいろ調べた結果,Pythonのpickleモジュールを使うことにした.
通常のファイルと同様に,with openでファイルの操作ができる.(pklファイルはバイナリ扱い?で,読み込みや書き込み時はrb,wbを用いるっぽい)

参考サイト↓
qiita.com

BeautifulSoupによるスクレイピング

BeautifulSoupを用いて,Htmlなどの要素を検索する.今回は,アマプラVideoサイトHTML中の,各エピソードにのみ含まれるIDを検索するようにした.
同じ要領でタイトルも取得できるようにした.なので,スクリプトに監視したいサイトのURLだけ貼っておけば,更新された作品を教えてくれる.
BeautifulSoupとpklを併用する時の注意点として,BeautifulSoupで取得した文字列をそのままpklに突っ込んで保存しようとすると,エラーが発生するので,dictionary[str(titl)] = hogeのようにstrで変換しておく.

Discordにおける通知

Discordでの通知には,Webhookを用いた.イメージとしてLineNotifyと同じで,Discord上で取得したWebhookのURLにPythonなどでrequestすることで,メッセージをDiscordのチャンネルに送れる.
今回のbotは投稿のみの一方通行botである.
投稿自体は,Webhookを使うことで容易にできた.しかし,Discordのロールへのメンションで少し手間取った.

Webhook使用時のメンション

Discordでは,各位に与えられたロールに@ロールとすることで,限定的なメンションをすることができる.
これをWebhookで行おうとしたが,@hereや@everyoneしかうまく機能しなかった.

調べてみると,ロールへのメンションはIDを使う必要があるみたい.下記のサイトが参考になった.
note.com

まずは,Discordの開発者モードを(詳細設定にある)ONにする必要がある.これによって,各チャンネルや各ユーザー,各ロールに紐づけられたIDを取得できる.
上記サイトによると,このIDを使って,ユーザーへのメンションの場合は,"<@ユーザーID>"とすれば良いみたい.
ロールの場合も,"<@%ロールID>"とすることで無事メンションすることができた.

またこのサイトによると,IDを簡単に取得する方法として,Discord上で"\@here"のように,メンション発言の手前にバックスラッシュをつけて投稿することで,簡単にIDを得られるみたい.

その他

今回の開発では,Logの処理を初めてみたので印象的だった.今回みたいなサーバー上で常時動作させるプログラムの際は,活用したほうが良いかもしれない.
ロギングについて勉強する必要がある.まあその時が来たら.
qiita.com
qiita.com