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