ホットペッパービューティの管理サイト(サロンボード)からダウンロードしたサロンレポートPDFを解析し、経営状況のサマリーをLINE Worksに自動送信するBotです。
- Google Driveの指定フォルダから直近のサロンレポートPDF(日次保存分)を取得
- 複数PDFのテキストを結合
- NotebookLMに投入し、経営状況の分析・改善提案を生成
- 分析結果をLINE Worksのチャンネルに送信
salon-report-bot/
├── src/ # ソースコード
│ ├── main.py # エントリーポイント
│ ├── config.py # 設定ローダー
│ ├── drive_client.py # Google Drive連携
│ ├── lineworks_client.py # LINE Works Bot API連携
│ ├── notebooklm_client.py# NotebookLM連携
│ └── pdf_parser.py # PDFテキスト抽出
├── credentials/ # 認証情報(Gitignore済み)
│ ├── gdrive-service-account.json
│ └── lineworks-private.key
├── logs/ # ログ出力先(Gitignore済み)
├── config.yml # 非秘匿設定
├── extra_reference_urls.txt# NotebookLMに追加する参照URL(Gitignore済み・任意)
├── .env # 秘匿情報(Gitignore済み)
├── .env.example # 秘匿情報テンプレート
├── pyproject.toml
└── uv.lock
uv synccredentials/gdrive-service-account.json— Google DriveアクセスのサービスアカウントキーJSONcredentials/lineworks-private.key— LINE Works Bot APIのRSA秘密鍵
.env.example をコピーして .env を作成し、各値を設定します。
cp .env.example .env| 変数名 | 説明 |
|---|---|
GDRIVE_SERVICE_ACCOUNT_JSON |
サービスアカウントJSONのパス |
GDRIVE_FOLDER_ID |
PDFが保存されているGoogle DriveフォルダのID |
LINEWORKS_CLIENT_ID |
LINE Works アプリのClient ID |
LINEWORKS_CLIENT_SECRET |
LINE Works アプリのClient Secret |
LINEWORKS_SERVICE_ACCOUNT_ID |
LINE Works サービスアカウントID |
LINEWORKS_PRIVATE_KEY_PATH |
RSA秘密鍵ファイルのパス |
LINEWORKS_BOT_ID |
LINE Works BotのID |
LINEWORKS_CHANNEL_ID |
送信先チャンネル(またはユーザー)のID |
config.yml で各種設定を変更できます。
| キー | デフォルト | 説明 |
|---|---|---|
drive.pdf_fetch_count |
7 |
Google Driveから取得するPDF件数 |
notebooklm.notebook_title |
"サロンレポート分析" |
NotebookLMノートブック名 |
notebooklm.extra_reference_urls_file |
"extra_reference_urls.txt" |
追加参照URLファイルのパス |
notebooklm.flex_message.query |
(省略) | Flexメッセージ用の分析クエリ |
NotebookLMのソースとして、サロンレポートPDF以外のURLを追加したい場合は extra_reference_urls.txt を作成します。このファイルはGitignore対象のため、サロン固有のURLをコミットせずに管理できます。
# extra_reference_urls.txt
# 1行1URL。# から始まる行はコメント。
https://beauty.hotpepper.jp/kr/example
https://beauty.hotpepper.jp/kr/example/coupon/
https://beauty.hotpepper.jp/kr/example/review/
#https://beauty.hotpepper.jp/kr/example/map/
ファイルが存在しない場合は何も追加されません。ファイルのパスは config.yml の notebooklm.extra_reference_urls_file で変更できます。
NotebookLMはブラウザ経由でGoogleアカウントにサインインして認証します。認証情報は ~/.notebooklm/storage_state.json に保存されます。
注意: playwrightは初回ログイン時のみ必要です。
storage_state.jsonが存在すれば、以降の実行ではplaywrightは不要です。
# 初回ログイン時のみ(--with で一時的に playwright を追加)
uv run --with "notebooklm-py[browser]" playwright install chromium
uv run --with "notebooklm-py[browser]" notebooklm loginGUIがないサーバでは、noVNCを使ってローカルブラウザ越しに操作します。
前提: xvfb, x11vnc, novnc, websockify がインストール済みであること。
# [サーバ] インストールされていない場合
sudo apt-get install -y xvfb x11vnc novnc websockify[サーバ] 1. Chromiumをインストール
uv run --with "notebooklm-py[browser]" playwright install chromium[サーバ] 2. noVNCを起動
Xvfb :99 -screen 0 1280x720x24 &
x11vnc -display :99 -nopw -listen localhost -forever -bg -o /tmp/x11vnc.log
websockify --web /usr/share/novnc/ 6080 localhost:5900 &[ローカル] 3. 別ターミナルでSSHポートフォワーディング
ssh -L 6080:localhost:6080 user@<サーバーIP>[ローカル] 4. ブラウザで http://localhost:6080/vnc.html を開き「Connect」をクリック
[サーバ] 5. ログインコマンドを実行
DISPLAY=:99 uv run --with "notebooklm-py[browser]" notebooklm login[ローカル] 6. noVNC画面でGoogleアカウントにログイン
noVNC画面にChromiumが起動するので、Googleアカウントでログイン → NotebookLMのホームが表示されたらサーバのターミナルでENTERを押す。
[サーバ] 7. 完了後にnoVNC関連プロセスを停止
pkill -f "Xvfb :99"; pkill -f "x11vnc"; pkill -f "websockify.*6080"uv run python src/main.py [オプション]| オプション | 値 | デフォルト | 説明 |
|---|---|---|---|
--mode |
flex_message / video / both |
flex_message |
送信モード。flex_message=分析レポートのみ、video=動画のみ、both=両方 |
src/preview_test_message.py を実行するとテストデータでHTMLプレビューを生成できます。
uv run python src/preview_test_message.pyプロジェクトルートに preview.html が生成されるので、ブラウザで開いて確認してください。テストデータの内容は src/preview_test_message.py の TEST_DATA を編集して変更できます。
- Google Cloud ConsoleでサービスアカウントとDrive API v3を有効化
- サービスアカウントのJSONキーを発行し
credentials/に配置 - 対象フォルダをサービスアカウントのメールアドレスに共有
- LINE Works Developer ConsoleでBot・アプリを作成
- サービスアカウントとRSA鍵ペアを発行
- Botを送信先チャンネルに招待
