同期で勉強会
2025年6月7日は同期で集まってプログラミングをやってみようの会を開きました。
今回はその内容をまとめていく。
プログラミングをやってみようの会の概要
今回やることはWebから天気予報を取得して、メールで送信するアプリを作る。
目的は気軽にプログラミングをやってみて、楽しむ。新しいことを体験して、自分のできる幅を増やす。
今回の制限は以下の1つである。
- データの取得側と送信側の間は共通のインターフェイスを使う
インターフェイスは取得するデータだけ決めている。取得するデータは日付、天気、場所、最高気温、最低気温である。
この2つを守っていたらどんな技術を使っても、どんな言語を使ってもOK。
仕事でいつも気にしているセキュリティなどは考えなくていいので、AIを使ってもOK。
参加者は私含めて4人でソロ(私)、ソロ、ペアで作っていく。
作業の開始
Webスクレイピングでデータを取得する部分の作成
私は慣れているのでPythonでやることにして、スクレイピング部分をChatGPTにお願いして書いてもらった。

このプロンプトで基本的なコードを書いてもらって、今回必要なデータを伝えてそのデータのクラスを作ってもらう

この時点でデータを取ってきてオブジェクトを作るコードはできた。
次は実行していきたいがライブラリのインストールなどをしていかないといけない。
そのままpipでインストールしても良かったが、仮想環境を作ってライブラリのインストールをしたかったのでuvを使って仮想環境を作ってみる。
uvの使い方を調べるより、聞いた方が早そうなのでChatGPTに聞いてみる。

これで仮想環境ができたのでここに必要なライブラリを入れていく。
やっぱりuvは動作が早い!
これで実行できる環境ができたので実行してみる。
やっぱりエラーが出た(笑)
まだChatGPTが出力したそのままのコードだからエラーが出るのはしょうがない…..
コードを見てみるとBeautifulSoupのselect_one()メソッドの引数に入れるCSSセレクターが悪そう。

おそらくCSSセレクターをURLにあったものにすることはChatGPTにしては難しかったんだろう。
今回取得して欲しい情報がある部分のHTMLを教えてコードを修正してもらう。

これでスクレイピング部分は動くものが完成した。
メールに送る処理の作成
まずはChatGPTにどうやったらいいか聞いてみる。
そうしたら、SMTPで直接サーバへ送信する方法が出てきた。

今回はメールが送れたらいいのでGmailのAPIを使ってみることにする。

ChatGPTの説明にしたがって、Google Cloud Consoleでプロジェクトを作成して、APIを有効にする。
この部分はWebサイトの画面をぽちぽちしていけばいいので、かなり楽だった。
認証情報のファイルをダウンロードして、プロジェクトのフォルダに入れて、送信するための処理をChatGPTにしたがって作る。
そのあと動かしてみるとブラウザでの認証のあと無事にメールが送信できた。
しかし、このやり方だと実行するたびにブラウザでの確認が求められるので2回目以降はtokenを使って、確認作業を省略させるように変更。
これもChatGPTに依頼したけどうまく動かなかった、いろいろ調べるとGoogleに認証されているプロジェクトでなかったらGoogle Cloud Console上からテストユーザーとして登録する必要があるっぽい。

テストユーザーを登録したら、1回目実行したらプロジェクト内にtoken.jsonが作成されて、2回目以降は確認作業なしで実行できるようになった。
↓実際に送られたメール

これで今回作る予定だったものは完成したのであとはリファクタリングをしていく。
リファクタリング
今回のリファクタリングでは以下のことを書いていく。
- コードに直接書かない方がいいことを.envファイルに移動させる
- データ取得部分とメール送信部分でインターフェイスを定義する
- Webスクレイピング部分とGmail API部分はサイトやサービスに依存することなのでインターフェイスを継承したの専用クラスを作成する
- それぞれのクラスをmain.pyで使うようにする
最終的には下の画像のようなフォルダ構成にした。

main.pyのコードはこのようになった。
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from infrastructure.repositories.nagoya_weather_repository import NagoyaWeatherRepository
from infrastructure.services.gmail_api_sender import GmailSender
from usecase.send_today_weather_to_mail import SendTodayWeatherToMail
def main():
usecase = SendTodayWeatherToMail(weather_repository=NagoyaWeatherRepository(), sender=GmailSender())
usecase.send_today_weather_to_mail()
if __name__ == "__main__":
main()
最終的にはDDD的な感じでusecase、infrastracture、domainに分けてmain.pyではusecaseのインスタンス作成&メソッドの実行をするだけにした。
他のメンバーの様子
ソロの人
使用言語:Python
データ取得:open-meteoのAPIを使って天気を取得
データ送信:discordのWebhookを使ってチャネルに送信、SMTPプロトコルを使ってメールに送信
作業中の様子:AIを使ってコードを生成し、一番早く一連の機能を作成できていた。作成後も機能の追加を行っていた。
ペアの2人
使用言語:JavaScript
データ取得:CheerioでWebページのHTMLを取得し、その中から必要な情報を取得
データ送信:Gmail APIを使ってメール送信
作業中の様子:2人での作業ということで和気藹々と作業していた。Gmail APIの部分だけ苦戦していたが他のメンバーに聞きながら最終的にはメールを送信することができていた。
まとめ
今回は小さな機能を作るプログラミング会を行った。
今回作ったものは普段業務で使う機能とは違うことで全ての参加者が新しい体験ができた。
今後も小さな機能だけど動いて価値のあるものを作ってみるプログラミング会を開いていきたいと感じた。
裏話
最初はLINEに送信するようしたかったがLINEのMessageing APIを使うには利用規約やポリシーなどのURLを設定する必要があったので、今回はLINEに送信することをやめた。