KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

GitHub Copilot Agent でアプリを作ってみた

こんにちは。みなさん、AIは活用していますか?
今回は GitHub Copilot Agent によるアプリを作成していきます。どんな感じでアプリ作成を行っていくのか実際に作業しながら記事を書きたいと思います。

アイデア出し

まずはアイデアを出すことから始めます。アイデアは、日々の生活で不便に感じたことの中に隠されているものです。

私は毎週火曜日に富士水泳場へ泳ぎに行くのですが、先日行ってみると臨時休館で閉まっていました。富士水泳場は ホームページの予定表 で営業予定を確認できますが、プールに行く前にわざわざチェックするのは面倒ですよね。

そこで今回のお題は、GitHub Copilot Agentを使って「今日、プールはお休み!」と教えてくれるアプリを作ることです。

GitHub リポジトリを作る

ではどうやって作っていくか?というところですが、まずは作業するためのリポジトリを作成します。

リポジトリを作成する

README は作ってください。
リポジトリができたらチェックアウトします。

ざっくり仕様を洗い出す

次に AI にサービスの仕様を考えてもらうための ざっくりとした仕様 を洗い出します。ドキュメント管理用の docs フォルダーを作り洗い出した仕様をテキストファイルとして保存します。

└ docs
    └ ざっくり仕様.md
- プールの予定表からその日営業しているか確認する。
- やっていなかったら通知する。
- 通知方法は SendGrid を使ったメール。
- プールの予定表の URL とチェックする日時はアプリ設定として外から設定できる。
- チェックプログラムは Azure Functions で実装する。

こんな感じ。

タスクを考えさせる

ここからいよいよ AI を使います。
VS Code でチェックアウトしたフォルダーを開きます。
※ VS Code では GitHub Copilot が使える状態にしておいてください。
※ 今回は Claude Sonnet 4 を使用しました。

そうしたら GitHub Copilot Agent のモデルを選択して、ざっくり仕様に不足する情報が無いかを聞いてみます。

ざっくり仕様.md を元にアプリの作成タスクを作ってもらいたいです。
ざっくり仕様.md を読んで必要な情報があれば聞いて下さい。

そうすると以下の様な回答が返ってきました。

ざっくり仕様を読ませていただきました。プール営業チェックアプリの仕様がわかりましたが、詳細なタスクを作成するために、いくつか確認させてください:

### 確認事項
1. プールの予定表の形式:
    - 予定表はWebページですか?それともPDFファイルやAPIなど他の形式ですか?
    - スクレイピングが必要でしょうか?
2. チェック頻度・タイミング:
    - 毎日自動的にチェックしますか?
    - 何時頃にチェックを実行しますか?
3. 通知の詳細:
    - 誰にメールを送信しますか?(送信先のメールアドレス設定方法)
    - メールの件名や本文のテンプレートは必要ですか?
4. 技術スタック:
    - プログラミング言語の希望はありますか?(Python、C#、Node.jsなど)
    - Azure Functionsのトリガー方式の希望はありますか?(Timer Trigger、HTTP Triggerなど)
5. 設定方法:
    - アプリ設定(プール予定表URL、チェック日時など)はどこに保存しますか?
    - Azure App Configuration、環境変数、設定ファイルなど

これらの情報を教えていただければ、より具体的で実装可能なタスクリストを作成できます。

Copilot とやり取りしていくことでアプリ作成に必要なことを決めていきます。

> 予定表はWebページですか?それともPDFファイルやAPIなど他の形式ですか?
Webページ上に Google カレンダーが表示されています。APIがあるかは不明です。

> スクレイピングが必要でしょうか?
はい

> 毎日自動的にチェックしますか?
プールに行く日だけでよいです。基本的には毎週火曜日ですが、週に2回など曜日指定できるように柔軟に対応してほしいです。

> 何時頃にチェックを実行しますか?
17時にチェックしてください。

> 誰にメールを送信しますか?(送信先のメールアドレス設定方法)
送信先はアプリ設定で設定できるようにしてください。

> メールの件名や本文のテンプレートは必要ですか?
メールは休館の場合のみ送信し、件名は「富士水泳場は本日休館」で本文には予定表のリンクを貼っておいてください。

> プログラミング言語の希望はありますか?(Python、C#、Node.jsなど)
C# でお願いします。

> Azure Functionsのトリガー方式の希望はありますか?(Timer Trigger、HTTP Triggerなど)
Timer Tigger でお願いします。

> アプリ設定(プール予定表URL、チェック日時など)はどこに保存しますか?
appsetting.json でお願いします。

他に必要な情報があれば聞いて下さい。

Copilot からの質問に何度か回答していき、質問が終わったら仕様をまとめてくれるので 実装手順書.md というファイル名で保存してもらいます。
内容を確認し、おかしなところがあれば修正を指示したり自分で修正します。
最後に Copilot にこれを元に実装できそうか聞いてください。問題がなければコミットします。

完成した 実装手順書.md は以下の通りです。

# プール営業チェックアプリ作成タスクリスト

## 概要

富士水泳場の営業状況を自動でチェックし、休館または営業状態要確認の場合にメール通知を行う Azure Functions アプリケーション。

## 基本仕様

- **対象プール**: 富士水泳場
- **予定表 URL**: https://fuji-pool.jp/calender/
- **チェック方法**: Google カレンダー埋め込みページの Web スクレイピング
- **実行タイミング**: CRON 式で設定可能(基本は火曜日の 17 時)
- **通知条件**: 「通常営業」以外の場合
- **通知方法**: SendGrid によるメール送信
- **実装言語**: C#
- **実行環境**: Azure Functions (Timer Trigger)

## 作成タスク

### 1. プロジェクト基盤構築

- [ ] Azure Functions C#プロジェクトの作成
- [ ] 必要な NuGet パッケージの追加
  - `Microsoft.Azure.Functions.Worker`
  - `Microsoft.Azure.Functions.Worker.Extensions.Timer`
  - `HtmlAgilityPack` (Web スクレイピング用)
  - `SendGrid` (メール送信用)
- [ ] プロジェクト構造の作成

### 2. 設定機能の実装

- [ ] `appsettings.json`の作成
  - プール予定表 URL
  - チェック実行 CRON 式
  - SendGridAPI キー
  - 送信先メールアドレス
  - メール送信者アドレス
- [ ] 設定クラスの作成
- [ ] DependencyInjection の設定

### 3. Web スクレイピング機能の実装

- [ ] HTTP クライアントサービスの作成
- [ ] Google カレンダー埋め込みページのスクレイピング機能
- [ ] 当日の営業状態判定ロジック
  - 「通常営業」の場合:メール送信しない
  - 「通常営業」以外の場合:メール送信
- [ ] エラーハンドリング(ネットワークエラー、ページ構造変更など)

### 4. メール送信機能の実装

- [ ] SendGrid サービスクラスの作成
- [ ] メールテンプレート機能
  - 休館時:件名「富士水泳場は本日休館」
  - 要確認時:件名「富士水泳場営業状態要確認!」
  - 本文にカレンダー URL 挿入
- [ ] メール送信エラーハンドリング

### 5. Azure Functions 実装

- [ ] Timer Trigger 関数の作成
- [ ] CRON 式による実行スケジュール設定(17 時実行)
- [ ] ログ出力機能の実装
- [ ] 例外処理とリトライ機能

### 6. テスト・デバッグ

- [ ] ローカル実行環境での動作確認
- [ ] 設定値の検証機能
- [ ] スクレイピング結果の確認機能
- [ ] メール送信テスト機能

### 7. デプロイ・運用準備

- [ ] Azure Functions 用の設定ファイル作成
- [ ] デプロイ用の ARM template または Bicep ファイル作成
- [ ] 環境変数設定手順書作成
- [ ] 運用監視設定(Application Insights)

### 8. ドキュメント作成

- [ ] README.md の更新
- [ ] 設定方法ドキュメント
- [ ] トラブルシューティングガイド

## 詳細仕様

### メール通知仕様

- **通常営業の場合**: メール送信なし
- **休館の場合**:
  - 件名: 「富士水泳場は本日休館」
  - 本文: 予定表リンク (https://fuji-pool.jp/calender/) を含む
- **その他(要確認)の場合**:
  - 件名: 「富士水泳場営業状態要確認!」
  - 本文: 予定表リンク (https://fuji-pool.jp/calender/) を含む

### 実行スケジュール

- CRON 式での設定(appsettings.json で管理)
- デフォルト: 毎週火曜日 17:00
- 祝日でも実行する

### 設定項目

- プール予定表 URL
- チェック実行 CRON 式
- SendGrid API キー
- 送信先メールアドレス
- 送信者メールアドレス
- メールテンプレート(件名・本文)

Copilot が結構きれいにまとめてくれます。

実装させる

作られた手順書に従って実装させます。
まずはソースコードを配置するためのフォルダーを作ります。

└ docs
└ src

src フォルダーにコードを実装するように指示します。
タスクは少しずつ処理させましょう。その方が精度が高く、誤った行動を行っていても修正が容易で、何よりこちらの確認がしやすいです。

今回は手順書に番号が振ってあるので番号ごとに作業を進めさせます。そのために以下のような指示を出します。

実装手順書.md を読み、1. プロジェクト基盤構築 のタスクを実行してください。
ソースコードは src フォルダー内に配置してください。
確認事項があればタスクを実行せずに質問してください。

小さなタスク単位での質問もちょこちょこあるので回答し、実行結果を確認します。問題が無いようならコミットし、次のタスクを同様に処理させていきます。

README.md

GitHub ページでドキュメントを確認するときれいに出来ていることがわかります。

デバッグする

appsettings.json に必要な項目を設定し、デバッグ実行してみます。

そうするとちゃんとメールが送信されてきました。

デバッグ実行結果メール

予定表を確認すると

予定表

2025年8月29日は臨時休館でメールのタイトルは 要確認 になっており、意図した通りになっている事がわかります。

デプロイと動作確認

Azure にデプロイします。デプロイ手順などはドキュメントにまとめてくれているので手順に従ってデプロイします。
デプロイが終わったら Azure ポータル上で手動で実行し、動作確認をして問題がなければ完成です。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp