目次
🎯 目的
- 毎日
birthdays.csvを読み込み - 当日が誕生日の顧客にだけ テンプレートメッセージを送信
- LINE公式アカウントの管理画面上で送信(APIは使わない)
- 手動2FA対応可(ログインは手作業で先にやっておく)
log.csvで同日+顧客IDの重複送信防止- メッセージは文字数制限(500字)対応、絵文字除去オプションあり
📁 フォルダ構成(ロボットディレクトリ)
LineBirthdayDM/
├─ main_flow.padx
├─ modules/
│ ├─ LoadBirthdays.padx
│ ├─ SendMessage.padx
│ ├─ WriteLog.padx
│ └─ Utilities/
│ ├─ TrimToMaxLength.padx
│ └─ RemoveEmoji.padx
├─ data/
│ ├─ birthdays.csv ← 顧客データ
│ ├─ log.csv ← 送信履歴
│ ├─ config.json ← 設定(絵文字除去/文字数)
│ └─ template.txt ← メッセージテンプレ
🔄 処理全体の流れ
[1] 誕生日データ読み込み(birthdays.csv)
↓
[2] 今日が誕生日の人だけ抽出
↓
[3] log.csvと照合(同日+顧客IDで未送信を判定)
↓
[4] テンプレ文生成 → 文字数調整 → 絵文字除去(オプション)
↓
[5] LINE管理画面で顧客検索+フォーム送信
↓
[6] 成功したらログ保存(log.csvへ)
📄 birthdays.csvの例
顧客ID,名前,誕生日,LINE名
1234,田中太郎,2000/09/11,tanakataro
1235,山田花子,1995/09/11,yamahana
1236,佐藤次郎,2001/02/14,satojiro
🧾 log.csvの例(送信履歴)
送信日,顧客ID,LINE名,結果
2025/09/11,1234,tanakataro,送信成功
⚙️ config.jsonの例
{
"maxLength": 500,
"removeEmoji": true
}
✉️ template.txtの例
{{名前}}さん、お誕生日おめでとうございます🎉
素敵な1年になりますように!
LINEスタッフ一同より
🛠 フロー作成ステップ(初心者向けに丁寧解説)
✅ STEP1:birthdays.csvの読み込み(LoadBirthdays.padx)
アクション:
- 「CSVファイルを読み取る」→
birthdays.csv - 出力:
BirthdayList
当日判定:
- ループ処理内で
%Today%と%行["誕生日"]%の MM/DD比較 - 条件一致した人だけ
TodayBirthdaysに追加
🔍 STEP2:log.csvと照合(送信済みチェック)
アクション:
- log.csv を読み取り →
SentLogListに格納 - 条件:「%今日% + 顧客ID」で一致したらスキップ
ループ:%TodayBirthdays%
条件:行["顧客ID"] + 今日 が log.csv にあるか?
→ なければ処理対象として次へ
✏️ STEP3:メッセージ生成&整形
1. テンプレ読み込み
templateText ← ファイル読み取り(template.txt)
2. プレースホルダ置換
{{名前}} → %CurrentCustomer["名前"]%
3. 絵文字除去(オプション)
If config["removeEmoji"] = true
→ 正規表現 or ユーティリティで削除
4. 最大文字数制限
最大500文字(config["maxLength"])を超えたら自動で末尾カット
🌐 STEP4:LINE管理画面で送信(SendMessage.padx)
1. 顧客検索
- LINE管理画面の「メッセージ送信」ページへ遷移済みを前提
- 検索欄に
%CurrentCustomer["LINE名"]%を入力 → Enter
2. DOM操作または座標クリックで顧客選択
- UI要素で選択できない場合は「画像近傍クリック」や「相対座標クリック」にフォールバック
3. フォームへメッセージ入力
- クリア →
%FinalMessageText%を貼り付け - 日本語IMEがONであることを保証(「キーの送信:半角/全角」)
4. 送信ボタン押下
- UI要素がない場合も「相対クリック」で対応可能
- 成功判定は送信ボタンが非表示になる or 確認ダイアログで判定
💾 STEP5:送信ログの記録(WriteLog.padx)
送信日,顧客ID,LINE名,結果
2025/09/11,1235,yamahana,送信成功
アクション:
- 変数
Nowで日時取得 - CSV追記(appendモード)
⚠️ DOM未検出時のフォールバック処理
| 操作対象 | 対策例 |
|---|---|
| 顧客選択ボタン | 「画像認識」 or 「座標指定クリック」 |
| メッセージ入力欄 | UI要素指定 → なければ「Tab+Ctrl+V」で貼り付け |
| 日本語入力 | 「キー送信:半角/全角」でIME強制ON+入力確実化 |
🧪 テスト手順
birthdays.csvに今日の人だけ入れるlog.csvを空にする or 一部送信済みとして入れておく- 実行してフォーム送信 → 正しく貼り付けられるか確認
- log.csvに送信履歴が追記されているか確認
- 次回実行時、同じ人はスキップされるかを確認
✨ 応用・拡張アイデア
| 機能 | 実装方法 |
|---|---|
| 名前の敬称追加 | テンプレで {{名前}}さん のように記述 |
| 画像添付機能 | 管理画面で「ファイルを選択」ボタン操作 |
| 遅延送信・時間指定送信 | メッセージ送信前に「時間を指定」入力欄操作 |
❓ よくある質問(FAQ)
Q1. APIでやった方が楽では?
A. 公式LINE Messaging APIはBusiness IDごとに設定が必要+審査ありです。本自動化はブラウザベースでAPI不要のため、どのLINE公式アカウントでもすぐに運用可能です。
Q2. 絵文字ってどうやって除去してる?
A. Unicodeの範囲で絵文字を正規表現で検出・削除しています。シンプルな [\uD83C-\uDBFF\uDC00-\uDFFF]+ でもほぼ対応可。
Q3. メッセージが途中で切れる原因は?
A. LINE管理画面の仕様で500文字制限があります。config.jsonの"maxLength"を守るよう設計されていますが、テンプレ文が長すぎると切れることもあるため調整してください。
Q4. 顧客検索で表示されない場合は?
A. LINE名が間違っている可能性があります。カナや絵文字を含む場合は正確に一致しないと表示されません。
Q5. 管理画面のUIが変わったら動かなくなる?
A. はい。そのため、セレクタと画像認識・座標クリックの2段構えで処理しており、柔軟に対応できます。
