Python > 投稿内容が言及された場合に取得する

指定されたユーザー名(例:UserA)が投稿で言及されたときに、OpenAIからの応答を生成したいのだと仮定します。それが正しい場合、DiscourseにAPIリクエストを行って通知を取得する代わりに、Discourseの通知イベントWebhookをPythonアプリケーションのサーバーに向けることができます。PythonアプリケーションはWebhookのペイロードを確認する必要があります。ペイロードのnotification_typeが1に設定されており、そのuser_idが通知を取得したいユーザーのIDと一致する場合、ペイロードのoriginal_post_idフィールドに設定されている投稿を取得するためにDiscourseにAPIリクエストを行います。次に、そのリクエストから返された投稿コンテンツをOpenAIに送信します。

以下は、メンション通知のペイロードの例です。

{
  "notification": {
    "id": 55267,
    "user_id": 2,
    "notification_type": 1,
    "read": false,
    "high_priority": false,
    "created_at": "2022-12-08T23:23:36.379Z",
    "post_number": 5,
    "topic_id": 277,
    "fancy_title": "I should be able to call this topic anything",
    "slug": "i-should-be-able-to-call-this-topic-anything",
    "data": {
      "topic_title": "I should be able to call this topic anything",
      "original_post_id": 10999,
      "original_post_type": 1,
      "original_username": "scossar",
      "revision_number": null,
      "display_username": "scossar"
    }
  }
}

このアプローチの利点は、Discourseサイトへの大量のAPIリクエストを行うことなく、リアルタイムで通知を取得できることです。

Webhookアプローチを採用する場合、DiscourseでWebhookの「シークレット」フィールドを設定し、Pythonアプリケーションでリクエストを検証してシークレットキーが正しく設定されていることを確認することをお勧めします。まだPythonアプリケーションにWebhookのシークレットを設定するルートを作成したことはありません。WordPressでWebhookのシークレットを検証する方法の詳細はこちらをご覧ください:wp-discourse-custom-webhook-request/wp-discourse-custom-webhook-request.php at master · scossar/wp-discourse-custom-webhook-request · GitHub