指定されたユーザー名(例: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