Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

QStashスケジューラでWhatsAppリマインダーを自動化する方法

QStashは、サーバーレス環境向けに設計されたタスクスケジューラ兼メッセージキューのシステムです。状態管理を意識することなく、特定の間隔で1回だけ、あるいは繰り返し実行される自動化ワークフローを構築できるため、開発者にとって非常に心強いツールとなっています。

まずはQStashのコンソールを実際に触ってみて、リクエストの組み立て方を感覚的に掴んでみると良いでしょう。

QStashスケジューラでWhatsAppリマインダーを自動化する方法

ユースケース

私が開発しているプロダクト「GPT Hotline」は、いわばWhatsApp上で動くChatGPTです(同じ基盤モデルを使用しています)。ChatGPTアプリを使うときと同じ感覚で、専用の番号宛てにボットへメッセージを送ることができます。

GPT Hotlineには、単なるテキスト対話以外にも、画像検索・動画検索・ニュース取得などの追加機能が備わっています。そこに加えて、ユーザーがボットにメッセージを送るだけで、指定した時刻に通知を受け取れる「リマインダー機能」を実装したいと考えました。

ボットにメッセージを送ると、指定した時刻にその内容が届く——非常にシンプルなフローです。イメージは以下のようになります。

QStashスケジューラでWhatsAppリマインダーを自動化する方法

以前からサーバーレスRedisとしてUpstashを利用していたため、QStashの存在自体はなんとなく知っていました。今回がまさに詳しく学ぶ絶好の機会だと感じました!

実装の全体像

今回コードに落とし込みたいワークフローは以下の通りです。

ユーザーがリマインダーメッセージを送信 → QStashジョブが登録される → 指定時刻にQStashがAPIを呼び出す → ユーザーへメッセージが配信される

話をシンプルにするため、この記事ではQStashに関わるコードに絞って解説します。GPT Hotlineには、ボットのデフォルト応答を上書きできる「Power Commands」という仕組みがあり、リマインダーを設定するコマンドは次の形式になっています。

sudo reminder <時間間隔> <メッセージ本文>

たとえば、次のように送信したとしましょう。

sudo reminder 3h go for a walk

「sudo reminder」コマンドがリマインダー処理を起動し、「3h」が「3時間後に(go for a walkという)リマインダーを送ってほしい」という意味になります。

QStashの呼び出し方

GPT HotlineはNext.jsで構築されているため、QStashを呼び出す方法はいくつかあります。署名検証用のverifySignature関数も用意されていますが、ここではシンプルさを優先してREST API方式を採用しました。

// 注: QStash公式ドキュメントにはCURLコマンドのサンプルも掲載されています。
const YOUR_API_URL = "https://api.example.com";
const MY_MESSAGE = "go for a walk";
const REMINDER_TIME = "3h";
const MESSENGER = "1800-MCDONALDS";
 
await fetch(`https://qstash.upstash.io/v1/publish/${YOUR_API_URL}`, {
 headers: {
 Authorization: `Bearer ${process.env.QSTASH_TOKEN}`,
 "Upstash-Delay": REMINDER_TIME,
 "Content-Type": "application/json",
 },
 method: "POST",
 body: JSON.stringify({
 message: MY_MESSAGE,
 messenger: MESSENGER,
 }),
});

これはQStashへ送信するfetchリクエストの一例です。説明用に値をハードコードし、不要なフィールドは省いていますが、アプリ内の実際のリクエスト内容をよく表しています。

QStashでは、メッセージの送信先となるURLが必須です。ここには、指定した時刻に呼び出したいAPIのURLを指定します。

「Upstash-Delay」ヘッダーの値が、メッセージを送信するタイミングを決めます。指定できる単位は秒(s)、分(m)、時間(h)、日(d)で、たとえば「30m」なら30分後、「2d」なら2日後という具合です。もし1回きりではなく定期的に実行されるジョブを作りたい場合は、cron記法が使える「Upstash-Cron」フィールドを利用します。

あとは、リマインダーの本文(message)と受信者の番号(messenger)をリクエストボディに含めて送信し、環境変数に設定しておいたQSTASH_TOKENで認証を行うだけです。

以上で完了です!問題なく動作すれば、リマインダーが登録された旨の確認が返ってきます。そして設定した時刻になると、QStashがmessageとmessengerの値とともにAPIを呼び出し、結果として受信者へリマインダーが届く仕組みです。

まとめ

正直、この機能は実装が少し面倒になりそうだと感じていて、後回しにしていました。しかしQStashのおかげで、わずか一晩で完成させることができました!

ぜひ一度試してみてください。1日500メッセージまで使える充実の無料枠(Free Tier)が用意されており、アプリがスケールしてから初めて課金が発生する仕組みなので、挑戦しない理由はありません。

それでは、
Bilalより

sudo reminder 1m Good Luck!

QStashスケジューラでWhatsAppリマインダーを自動化する方法

  1. RenderとUpstashでNext.jsアプリをサーバーレスRedisと共にデプロイする方法

    Renderは、即時デプロイやオートスケーリングなどの機能を備えた強力なインフラストラクチャプラットフォームです。この記事では、Upstashを使ってシンプルなNext.jsアプリケーションを作成し、それをRenderにデプロイする手順を解説します。 注意:このチュートリアルでは、UpstashでRedisインスタンスがすでに作成済みであることを前提としています。まだ作成していない場合は、Upstashコンソールから簡単に作成できます。 はじめに まず、新しいNext.jsアプリを作成し、そのディレクトリに移動しましょう。 npx create-next-app upstash-render

  2. Redis APPENDコマンドの使い方 – 既存の文字列値に文字列を追加する方法

    このチュートリアルでは、Redisデータストア内のキーに保存されている既存の文字列値に対して、別の文字列を追加(連結)する方法を解説します。この操作には、RedisのAPPENDコマンドを使用します。 APPENDコマンドとは APPENDコマンドは、指定した文字列を、キーに保存されている既存の文字列値の末尾に追加します。もしキーがRedisデータストアに存在しない場合は、追加操作を実行する前に、まず空の文字列を持つキーが自動的に新規作成されます。 一方、キーが存在していても、その値が文字列型ではない場合(リスト・セット・ハッシュなどの場合)は、エラーが返されます。また、このコマンドはO(1)