Misskey上で競プロのコンテスト情報を確認できるウィジェット
2024-12-06 00:00 +0900
Misskeyのウィジェット欄に直近のコンテスト情報を表示させるAiScript Appを作ったので,使ってみてね.

実際の表示
AtCoder, Codeforces, yukicoderで現在開催中または開催予定のコンテストを一覧表示する. コンテスト名をクリックすると,各コンテストページに飛ぶ.
長期コンテストのみ,終了までの残り期間を表示する.
導入手順(簡単に)
- Competitive-Programming Contest List (Misskey Play)のページ下部にある「ソースを表示」からソースコードをコピー
- ウィジェット欄に「AiScript App」を追加
- 追加されたAppの設定を開き,「script」にソースコードをペースト
- (オプション)
Config
の各値を好みに合わせて設定する
動作の全体像

データ取得部
GASスクリプトのソースはこちら↓
CLIST APIとyukicoder APIを叩いてコンテストデータを取得し,コンテストの名前・URL・開催日時等をまとめたJSONに整形したものをMisskeyのページに上書き更新する. このスクリプトを2時間おきに自動実行するようトリガーを設定しておく.
元々はウィジェットからCLIST APIのRSSを取得するつもりでいたが,
- APIのauth keyを直接書き込む必要がある
- リロードする度にAPIを叩くことになり微妙
- 現在CLISTがyukicoderのコンテスト情報を取得できていない + yukicoder APIがRSS形式をサポートしていない
等の理由から見送った.
Misskey APIの仕様はここを参照した↓
データ表示部
ウィジェットのAiScriptが担う.
Mk:api("pages/show", options)
でページに保存したJSON文字列を取得し,これを基にコンテストの一覧リストを表示する.
10分ごとに終了したコンテストの除外処理とリストの再作成を行うことで準リアルタイム更新っぽくしている.
AiScriptの記法などは次のリファレンス等を参考にした↓
最近になってAiScriptのリファレンスページもリリースされたが,0.19.0以前のバージョンと互換性のない最新バージョンの仕様説明になっている. そのため,各Misskeyサーバーが対応しているAiScriptバージョンに応じたリファレンスを探す必要がある.
Misskeyのページ機能を経由する構成はこちらの記事を参考にした.今回のウィジェットに限らず使えそう?
問題点
リモートサーバーを含む外部のAPIを叩くMk:apiExternal()
がセキュリティ上の問題から削除されたことにより,競プロ鯖のページの情報を他のMisskeyサーバーで取得することができないため,そのままでは競プロ鯖以外のサーバーで動作しない.
他サーバーで動かしたい人は上記のGASのAPI keyやAiScriptのページ指定等をご自身のものに設定して動かしてみてください.