https://blog.naskya.net/

[[ 🗃 ^wzWnj blog ]] :: [📥 Inbox] [📤 Outbox] [💥 Errbox] [🐤 Followers] [🤝 Collaborators] [🏗 Projects] [🛠 Commits]

Clone

HTTPS: git clone https://code.naskya.net/repos/wzWnj

SSH: git clone USERNAME@code.naskya.net:wzWnj

Branches

Tags

main :: content / post /

g37erumpy5xl.md

作ったもの

視聴したアニメの情報を Discord のチャンネルに自動的に投稿したくなったので、 Annictで記録した視聴情報を転送する bot を書きました。

Annict で表示したアニメの視聴記録の画像
Annict で表示したアニメの視聴記録の画像
Discord に転送されたアニメの視聴記録の画像
Discord に転送されたアニメの視聴記録の画像

Annict ではアニメの視聴状況として - 見てる - 見たい - 見た - 一時中断してる - 視聴中止した

の 5 つを設定できますが、このうち「見てる」と「見た」の記録のみを転送します(私がそれ以外を使わないので)。

また、アニメの作品という単位ではなく各話ごとに視聴を記録することもできますが、この転送にも対応していません(私が使わないので)。 というか各話ごとの記録を行った際にどうなるか試していないのでバグるかも(需要があれば確認します。 ソースコードは公開しているのでバグっていたら勝手に直して pull request をしてくれるのも歓迎です)。

使い方

{{}}. Discord bot の作成

まず Discord のアプリケーションを作成するページ からアプリケーションを作成します。

次に、設定の Bot という項目から bot を作成します{{< note アプリケーションを作成しても bot を作成しなければ使えないので注意 >}}。

そして Bot の上にある OAuth2 > URL Generator の項目を開き - SCOPES では bot を - BOT PERMISSIONS では Send MessagesEmbed Links

それぞれ選択するとページの下部に URL が表示されます。

Discord bot の管理画面
Discord bot の管理画面

ブラウザでこの URL にアクセスすれば作った bot をサーバーに招待できます。

{{}}. スクリプトの準備

スクリプトを好きな場所に clone して、clone したディレクトリに移動します。

$ git clone https://github.com/naskya/annict-discord-bot.git
$ cd annict-discord-bot

{{}}. 必要な情報の指定

Discord bot のアクセストークン

先程開いていた Discord bot の管理画面に再び戻り、Bot の項目からアクセストークンをコピーし、 クローンしたディレクトリにある config というファイルの

DISCORD_BOT_ACCESS_TOKEN:

から始まる行に貼り付けます。

最初にダミーの文字列 0aA1bB2cC3dD4eE5fF6gG7hH8i.I9jJ0k.K1lL2mM3nN4oO5.pP6qQ7rR8sS9tT0uU1vV2wW が入っているので、それを置換してください。 また、(ダミーの文字列がそうなっているように): と貼り付けた文字列の間に半角空白が入るようにしてください。

Annict のアクセストークン

Annict にログインし、設定 > アプリケーション > 新規作成 からアクセストークンを作成し、config

ANNICT_ACCESS_TOKEN:

から始まる行に貼り付けます。

Annict のユーザー ID

$ curl -X GET https://api.annict.com/v1/me?access_token=ANNICT_ACCESS_TOKEN

ANNICT_ACCESS_TOKEN を先程作ったアクセストークンに置換して実行すると json 形式のデータが返ってきます。

その情報に含まれる id: に続く数値を config

ANNICT_USER_ID:

から始まる行に入力します。

Discord のチャンネル ID

投稿したい Discord チャンネルを右クリックしてチャンネル ID をコピーします。 このチャンネルには作成した Discord bot が参加している必要があります。 チャンネル ID をコピーする画面

コピーされた値を config

DISCORD_CHANNEL_ID:

から始まる行に貼り付けます。

できた config というファイルには一般公開してはならない情報(アクセストークン)が含まれるので、 管理には十分に注意してください。

{{}}. 手動で実行

main.py を実行すると Discord のチャンネルにメッセージが投稿されるはずです。 当然、実行するとメッセージが投稿されてしまうので注意してください。

Python 3.9 以上がインストールされていて、python3 コマンドで呼び出せる必要があります。

$ ./main.py

過去に一度投稿した内容は再度投稿されないようにしているため、 上記のコマンドを再度実行すると今度はメッセージが投稿されないはずです。

チャンネルにメッセージを投稿することなく、現在までに視聴したアニメのデータを取得だけしておきたい (現時点で記録してあるものは投稿済みとして扱いたい)場合には dry という引数をつけて実行します。

$ ./main.py dry

{{}}. 自動で実行

以下のような systemd サービスと systemd タイマーを作成します。

[Unit]
Description=forward activities recorded on Annict to Discord

[Service]
Type=simple
ExecStart=/path/to/annict-discord-bot/main.py
WorkingDirectory=/path/to/annict-discord-bot

[Install]
WantedBy=multi-user.target
[Unit]
Description=run annict-discord-bot

[Timer]
OnCalendar=*-*-* *:00/20:00
Persistent=true

[Install]
WantedBy=timers.target

/path/to/annict-discord-bot は clone したリポジトリのパスに置換してください。

以下のコマンドでタイマーを有効化します。上記の設定では毎時 00,20,40 分にスクリプトが実行されます。

$ sudo systemctl enable annict-discord-bot.service
$ sudo systemctl enable annict-discord-bot.timer

ログの確認には以下のコマンドを使用します。

$ journalctl -xeu annict-discord-bot

ログを表示した画面:

journalctl でログを確認した結果(1 枚目)
journalctl でログを確認した結果(1 枚目)
journalctl でログを確認した結果(2 枚目)
journalctl でログを確認した結果(2 枚目)

タイマーを停止したいときには以下のコマンドを実行します。

$ sudo systemctl disable annict-discord-bot.timer
[See repo JSON]