競技プログラミングの環境構築(Slackとの連携編)

前回のwiki設置編からの続きです。今回の目的はPukiWikiが編集された時にSlackに通知されるようにすることです。

構成予定

  1. wiki設置(リンク
  2. Slackとの連携(今回)
  3. gitとrimeの使い方(リンク
  4. GitHub Actionsでの自動テスト
  5. コンテスト開催の準備(主に問題文)
  6. コンテスト開催の準備(その他)
  7. コンテスト本番

だいたいの人がSlackで作業をしていると思うので、今回は前回設置したwikiが更新されたらSlackにメッセージが流れるようにします。原案を投稿したことを一々Slackで報告するのも面倒臭いですし、原案にコメントしたことをわざわざ「コメントしたよ」って報告するのも大変ですよね。今後、自動でwikiを更新するツールを導入したりすることもあるため、今のうちに設定しておきましょう。またSlack以外のツールを使ってる人でも、一部は役に立つと思うので読んでみてください。

さて、ここでweb系に詳しくない人であれば、「Slackのbotなんて作ったことがない」だとか「PHPなんて書いたことないよ」だとか思っていることでしょう。なので、今回はコピペだけで動くコードを用意してきました。ローカルでテストしたりは多分しなくてもなんとかなります。また、今回の作業の過程でSlackにアプリを追加します。無料版のSlackを使っている場合には10個までしかアプリが使えないので、もしあなたがワークスペースの管理者でない場合は管理者の許可を得てから作業してください。アプリの追加自体は(特別な設定がされていなければ)管理者でなくとも可能です。また、もしもあなたがサーバーにwikiを設置した本人でない場合は、サーバーにFTPできるように準備をしておいてください。FTPソフトの設定方法などは前回の記事を参考に、URL、ユーザー名やパスワードはwikiを設置した人に教えてもらっておいてください。

まずはSlackの準備をします。以下、ブラウザ版のSlackを操作しているものとしますが、デスクトップ版でも大体同じ事ができると思います。左側のメニューの上の方にAPPという項目があるので、そこをクリックしてください。すると、たくさんアイコンが表示されると思います。そこで、ページ上部にある検索ウィンドウに「Incoming Webhook」と入力してください。Incoming Webhookという名前のアプリが見つかると思うので、追加が押せるなら押してください。追加というボタンが存在しない場合は既にワークスペースに追加されているのでそのままで良いです。次に、Incoming Webhookの設定をしていきます。もしもwikiの更新を通知する専用のチャンネルが必要だと考えるなら、この時点でチャンネルを作成しておいてください。SlackのAPPの画面で、Incoming Webhookのアイコンをクリックすると画面が変化して「Appディレクトリで確認する」というボタンが出てくるのでクリックです。別のページが開くのでそこで設定を行います。「Slackに追加」をクリックすると、様々な設定ができます。まず、自動で通知を送りたいチャンネルを選び、「Incoming Webhook インテグレーションの追加」を押すとさらに詳しい設定ができます。名前とアイコンは好きなものに変更してください。この後必要になるのは「Webhook URL」ですので、控えておくかいつでも参照できるようにしておいてください。このURLが他人に漏れるとSlackにメッセージを送られてしまうので、このURLは公開しないよう注意してください。これでSlack側の設定は終わりです。動作確認がしたい場合は、Webhook URLにJSON送ってみてください。また、英語ですが公式のマニュアルにこれらの手順とメッセージの送り方が詳しく書いてあります。

PukiWikiの方の設定の前に、今からやりたいことを簡単に説明しておきます。まず、wikiが変更された時に先程設定したwobhookに変更内容が書かれたJSONを送るように設定します。すると、JSONを受け取ったアプリケーションがSlackの方で設定したチャンネルにメッセージを送信します。仕組みはこれだけです。なので、今からPukiWikiが更新された時にJSONを送信するように設定します。といっても、PHPに詳しくない人はそんなもん無理だと言われるでしょうから、とりあえず必要な設定だけ紹介します。これからPukiWikiソースコードの一部を書き換えるので、必要に応じてバックアップを取ってください。まずはローカルのサーバーと同期させているディレクトリに移動し、libというフォルダを開きましょう。次に、「slack.php」というファイルを新規作成してください。ファイルのパーミッションは600です。中に、以下のコードを貼り付けて保存しましょう。URLの部分をちゃんと書き換えてください。

次に、「file.php」を開いて、「if ($dir === DIFF_DIR)」と検索してください。おそらく、1か所ヒットするのでヒットした行のすぐ上に以下のコードを貼り付けて保存しましょう。


次が最後です。「pukiwiki.php」を開いて、「// Main」と検索してください。1か所がヒットし、その行の上に/がたくさんある行があると思います。そしたら、その行の上に以下のコードを貼り付けて保存しましょう。コメントが嫌いな人は//以降を貼り付けなくても動作はしますが、推奨しません。

require(LIB_DIR . 'slack.php'); // Slack notification


これでPukiWikiの改造は終わりです。PHPのテスト環境があれば必要に応じて動作確認をして、問題がなければサーバーにファイルを転送します。更新したファイルだけを選択して転送を行います。設定は前回のままで大丈夫です。上書きするか聞かれた場合は上書きを選択してください。アップロードが成功したら、wikiにアクセスして適当なページを更新してみてください。Slackにメッセージが届いていれば成功です!おつかれさまでした。

今回のコードをコピペした場合、送信されるメッセージは差分になっています。もし、このレイアウトが気に食わない場合はfile.phpで作ってる$payloadをいい感じに変更してみてください。Discordにもwebhookがあるようなので、Webhook URLをDiscordのものにすれば同じようなことができるはずです。うまくいったら教えていただけると嬉しいです。今回もありがとうございました。

次回は「gitとrimeの使い方」です。