BLOG

ブログ

【6期生】LINEで完結する奨学金申請 LINE Bot

こんにちは!この記事では、インターンシップでの開発成果物である「奨学金申請LINE Bot」について紹介します。 「奨学金の申請書類を書くのが面倒...」「書き方がわからなくて不安」そんな学生の悩みを解決するために、使い慣れたLINEを使って手軽に申請書を作成できるアプリを開発しました。

アプリ概要

アプリ名:奨学金申請LINE Bot

ターゲット:奨学金の申請を考えている学生

目的:複雑な申請書類の作成ハードルを下げ、手軽に申請を行えるようにすること

強み:LINEのチャット形式で質問に答えるだけで、提出用のPDF書類が自動生成される点

使用した技術:TypeScript, Node.js, Google Cloud Function, Firestore(DB), LINE Messaging API, PDFKit

特徴

最大の特徴は「チャットボットと会話するだけで書類が完成する」という点です。様々な書類を用意して、試行錯誤する必要はありません。

1. LINEのトーク画面下部にあるリッチメニューから、「奨学金を選ぶ」「必要書類を確認する」「申請を開始する」といった操作がワンタップで行えます。迷うことなく直感的に操作できるUIを目指しました。

2. チャット形式での入力サポート
「氏名」「住所」などの入力項目がBotから1つずつ質問されます。ユーザーはLINEで返信したり、選択肢ボタンをタップするだけで済みます。会話感覚で進められるので負担が少ないです。

3. PDF自動生成機能
全て回答し終えて「提出する」を選択すると回答内容が反映されたPDFファイルが自動的に生成され、ユーザーにダウンロード用URLが送信されます。これを印刷すればそのまま申請書類として利用可能です。

処理ワークフロー

全体の流れは大きく分けて 「1. 申請開始と質問・回答」と「2. 最終的なPDFの生成と提出」の2つに分かれています。

LINEによる対話型入力

  1. 申請開始:
    ・ユーザーがLINEのリッチメニューから「奨学金を選ぶ」をタップします。
    ・Botが奨学金の一覧を提示して、ユーザーが任意の奨学金の「申請を始める」を選択します。
  2. 質問と回答のループ:
    ・Botが「氏名」「住所」などの質問を1つずつ送信します。
    ・ユーザーはテキスト入力やボタン選択で回答します。
    ・システムは、ユーザーからの回答をその都度DBに保存して進捗状態(state)を更新します。

PDF申請書の自動生成

  1. 提出指示:
    ・ユーザーがリッチメニューから「提出する」をタップします。
  2. PDF生成処理:
    ・システムはDBからユーザーの全ての「回答データ」と、対応する「質問データ」を取得します。
    ・取得したデータを組み合わせて、PDFファイルを生成します。
  3. クラウド保存とURL発行:
    ・生成されたPDFファイルは、Google Cloud Storageに保存されます。
    ・保存されたファイルにアクセスするための有効期限つきのダウンロードURLが発行されます。
  4. 完了通知:
    ・Botが発行されたPDFのダウンロードURLをLINEでユーザーに送信します。
    ・ユーザーはURLからPDFをダウンロードして、利用することができます。

技術的なこだわりと実装

開発にあたっては、バックエンドにGoogle Cloud FunctionsとFirestoreを採用し、サーバーレスな構成に挑戦しました。

◯LINE Messaging APIとFirestoreによる状態管理

ユーザーが「今どの質問に答えているのか」という状態(state)を管理するために、Firestoreを活用しました。 state コレクションに userIdscholarshipId をキーとして、現在の質問ID(currentQuestionId)やこれまでの回答(answers)を保存しています。これにより、途中で入力を中断しても、続きからスムーズに再開できる設計になっています。

苦戦した点

◯イベントハンドリング

LINE Bot開発では、ユーザーからのイベント(メッセージやポストバック)を非同期で処理する必要があります。 特に、ユーザーがボタンを押した時の「Postbackイベント」、テキストを入力した時の「Messageイベント」の振り分けや、Firestoreへの読み書きのタイミング(Promise/async/await)の制御には苦労しました。

◯状態(state)管理

もっとも悩んだのが、「ユーザーが今、どの状態・どの質問に答えているのか」という状態(state)の管理です。LINE Botとのやり取りでは一問一答のようなステートレスの通信です。LINEプラットフォーム側では「今このユーザーは問3まで進んでいる」といったユーザーの状態を保持してくれません。そのため、質問のラリーを繰り返すために、DBを使って自前で状態を管理する仕組みを構築しました。

学んだこと

今回の開発を通して、単に「コードを書く」だけでなく、「ユーザーがどう使うか」を意識した設計の重要性を深く学びました。技術的な面では、TypeScriptによる型安全な開発手法や、Firebaseを活用したモダンなサーバーレスバックエンドの構築知識が身につきました。加えて、関数分割の重要性を痛感しました。当初は一つのファイルに処理が集中しがちでしたが、開発が進むにつれて「サービス層(line-service、question-serviceなど)」のように責務に応じてコードを分離することで、可読性と保守性が格段に向上することを実感を持って理解できました。

これから

現状ではまだ動作が不安定な部分もあり、完璧な成果物とは言えませんが、この経験は大きな糧となりました。今後は、サービス層だけでなく、コントローラー層やリポジトリ層といったシステム全体のアーキテクチャを意識した設計・実装を実践していきたいと考えています。もちろん、今回のプロジェクトで見つかった多くの課題もしっかりと修正していきます。これからも技術力を磨き続け、アプリケーション開発に取り組んでいきます。