👮‍♂️

流れていく質問を救出せよ!~Go✖️Slack APIで通知機能を作る~

2023/12/20に公開

はじめに

  • 流れていく質問 = 誰からも返信の無い質問です。
  • こうした質問を減らすため、流れていく質問を検出し通知するシステムを簡単に作ってみました。
経緯
  • Happiness Chain(以下、HC)にはSlackの「質問チャンネル」があります。
  • このチャンネルは「間違えていたら運営がフォローするので誰でも質問に答えてみよう!」という方針で運営されています。
  • つまり、質問を確認しても「誰かが返信するだろうから一旦後回しにしよう」ということが起きてしまうことがあります(自分も結構していました)。
  • しかし、あるとき質問チャンネルを徘徊していると4~5時間ぐらい返信が無い質問を見つけました
  • 「これはいけない!」と思い、このような事態を防ぐ手段を考えてみました。
  • 質問者が再度、メンションを付けて「返信お願いします」と言うのが簡単な解決策ではあると思いますが、自分だったら少し言いにくいなと思ったので勝手ながら通知機能の作成に至りました。
  • 私はHCでGoコースを受講しています。折角なのでGoを使って通知機能を作ってみました。

通知機能の概要

採用した技術

  1. Go(質問の放置を判定し、APIを叩くため)
  2. Slack API(質問チャンネルの会話を取得し、結果を送信するため)
  3. Rasspberry pi(定期実行のため)

通知の仕組み

  1. Raspberry Piのクーロンジョブが、9時から23時の1時間ごとに実行されます。
  2. GoアプリケーションはSlack APIを呼び出し、質問チャンネルの過去24時間の会話を取得します。
  3. Goアプリケーションは質問を一つずつ検証し、返信数(reply_count)が0の質問を配列に追加します。
  4. 質問を整理し、読みやすい形式にします。
  5. 自分自身のtimesチャンネルにメッセージを送ります

https://github.com/syunsuke-I/missedQ

現状の課題

  1. 返信数のみで判定していますが。これは完全ではありません。例えば、質問者Aさんが質問1を投稿します。また、Aさんが追記情報で質問1に返信してしまった場合、放置されていないと判定されてしまいます。
  • ユーザーが単一であるかどうかに基づいて判断を行うかどうか迷いましたが、質問者Aさんが質問1を投稿し、自己解決した旨を返信をした場合、これも放置として誤判定してしまいます。
  • この問題に対処するために、形態素解析を使用して解決しているかどうかを判断するアイデアが考えられます(解決/しました/済み のキーワードを検出して判断する方法)。
  • ですが、今のところアイデアとしてあるだけです(そこまでするなら通知された誤判定メッセージを実際に確認した方が速そうです)
  1. また、投稿に返信する形ではなく別スレッドで回答者が返信するパターンも放置されている判定になります。
  2. 「別に再通知しなくてもいいよ」と言うニーズもあると思ったので、除外リスト機能を実装しようとしましたが。今のところ除外リストの追加を希望する人がいなかったので保留しています。

作ってみた感想/今後に向けて

  • まず、課題解決は出来たのではないかと思います。自分自身でも積極的に質問の返答を行うようになりました。
  • また、GoでAPIを叩く経験。Slack APIの使い方。ラズパイの使い方など、色々勉強になったので作ってみてよかったです。
  • 特に、envファイルから値を取得する方法や、jsonの扱い方なども勉強になりました。
  • まだまだ初学者なので色々な課題解決に取り組みスキルアップをしていきたいです。

参考記事

https://zenn.dev/kou_pg_0131/articles/slack-api-post-message
https://qiita.com/yoshii0110/items/2a7ea29ca8a40a9e42f4
https://qiita.com/snaka/items/676728e6bf9968d81581

補足

  • 取得したmessagesの構造例

https://api.slack.com/methods/conversations.replies

messages
{
    "messages": [
        {
            "type": "message",
            "user": "U061F7AUR",
            "text": "island",
            "thread_ts": "1482960137.003543",
            "reply_count": 3,
            "subscribed": true,
            "last_read": "1484678597.521003",
            "unread_count": 0,
            "ts": "1482960137.003543"
        },
        {
            "type": "message",
            "user": "U061F7AUR",
            "text": "one island",
            "thread_ts": "1482960137.003543",
            "parent_user_id": "U061F7AUR",
            "ts": "1483037603.017503"
        },
}

Discussion