1-1. システム概要
オークタウン(ヤフオク)とメルカリに同じ商品を二重出品しています。
どちらかで売れたとき、もう一方から自動的に削除・処理するのがこのツールです。
1-2. 毎日の使い方
削除ツール(売れた商品を削除する)
ランチャー.bat をダブルクリックして起動- 両方(推奨):メルカリ売れ&ヤフオク売れを一括処理
- ヤフオク削除のみ:メルカリで売れた商品のオークタウン削除のみ
- メルカリ削除のみ:ヤフオクで売れた商品のメルカリ削除のみ
再出品ツール(期限切れ商品を再出品する)
- 通常実行(推奨):実際に再出品します(ブラウザ非表示)
- 確認のみ:再出品せず対象だけ確認(ドライラン)
- ブラウザ表示あり:動作確認したいときに使用
終了の仕方
ランチャーウィンドウ右上の × で閉じるだけでOKです。実行中に閉じたい場合は先に「⏹ 中断」ボタンを押してください。
1-3. ランチャー画面の説明
| 場所 | 名前 | 説明 |
|---|---|---|
| 画面上部(常時表示) | 🔓 ロック強制解除 | ツールが途中で止まって再実行できない場合に押す。C:\tool-lock\browser.lock を削除して状態をリセット |
| 削除ツールタブ | ▶ 削除ツールを実行する | 緑ボタン。スーパーマシンシートを読んで削除を実行 |
| 削除ツールタブ | ⏹ 中断 | 赤ボタン。実行中にすぐ停止 + ロック解放 |
| 再出品ツールタブ | ▶ 再出品ツールを実行する | 青ボタン。オークタウンの終了商品を再出品 |
| ログインタブ | 🔐 ○○にログイン | ログインセッションが切れたアカウントを再ログイン |
ログの色の意味
⚠️ 入札あり(500円の違約金が発生しますが削除を継続します)
❌ ログインが切れています → スキップ
ℹ️ 出品中に [MD34] なし(すでに終了済みか未出品)
🔍 検索キーワード: #hikari_store MD34
| 色 | 意味 |
|---|---|
| 緑 | 成功・完了 |
| 赤 | エラー・失敗 |
| 橙 | 警告(入札あり・ログイン切れなど要注意) |
| 青 | 情報・進捗(問題なし) |
1-4. アカウント一覧
| 記号 | 名前 | ヤフオク(オークタウン) | メルカリ | 備考 |
|---|---|---|---|---|
| H | hikari_store | — | ✅ あり(#hikari_store) | メルカリメインアカウント |
| M | micchan | — | ✅ あり(#micchan) | メルカリサブアカウント |
| P | pua_boutique | — | ✅ あり(#pua_boutique) | メルカリのみ・ヤフオク紐づけなし |
| A | アマドール | ✅ あり | — | オークタウンAアカウント |
| T | トラフグ | ✅ あり | — | オークタウンTアカウント |
| V | タウシャン | ✅ あり | — | オークタウンVアカウント |
| W | WANG | — | — | ヤフオク未出品のため自動でスキップされる |
1-5. よくあるトラブルと対処法
ツールが途中で強制終了すると C:\tool-lock\browser.lock が残り、次の実行がブロックされます。
対処:ランチャー上部の橙色「🔓 ロック強制解除」ボタンを押すと自動的に解放されます。
ランチャーが開いていない場合はエクスプローラーで C:\tool-lock\ フォルダを開き、browser.lock ファイルを手動で削除してください。
Chatworkに「ログインセッション切れ」の通知が来るか、ログに赤文字でエラーが表示されます。
対処:
- ランチャーの「🔐 ログイン」タブを開く
- 切れているアカウント(オークタウンA/T/V または メルカリH/M/P)のボタンを押す
- ブラウザが開いて自動入力されるので、ログインを完了させる
- 削除ツール・再出品ツールを再実行する
Chatworkに「エラーが発生しました」の通知が来ます。
対処:
- ランチャーのログを確認(赤文字がヒント)
- ロック解除ボタンを押す
- 再実行する(スプレッドシートのM列が空の行から自動的に再開)
- 繰り返す場合は小口さんに連絡
オークタウンでの入札がある商品を削除するとオークタウン側で500円の違約金が発生します。
ログとChatworkに ✅⚠️ 入札あり削除 として記録されます。通常運用の範囲内なので対処不要です。
2-1. システムアーキテクチャ
全体構成図
┌─────────────────────────────────────────────┐
│ スーパーマシン(Google Sheets) │
│ B列: 管理番号 / F列: アカウント / M列: フラグ │
└──────────────────┬──────────────────────────┘
│ Google Sheets API
┌──────────────────▼──────────────────────────┐
│ delete_tool.py │
│ Phase1: F=H/M → オークタウン(A/T/V)削除 │
│ Phase2: F=A/T/V → メルカリ(H/M)削除 │
│ W=WANG → スキップ │
└──────┬──────────────────────┬───────────────┘
│ │
│ Playwright │ Playwright
┌────▼──────┐ ┌────▼──────────┐
│ オークタウン │ │ メルカリ │
│ A/T/V │ │ H/M/P │
│ Firefox │ │ Firefox │
└──────────┘ └──────────────┘
┌─────────────────────────────────────────────┐
│ relist_tool.py │
│ settings.csv の条件 → /myCloseList/ 再出品 │
│ アカウント A / T / V を順に処理 │
└──────┬──────────────────────────────────────┘
│ Playwright
┌────▼──────┐
│ オークタウン │
│ A/T/V │
│ Firefox │
└──────────┘
ロック: C:\tool-lock\browser.lock(排他制御)
通知: Chatwork API(ルーム427400103)
ファイル一覧と役割
| ファイル | 場所 | 役割 |
|---|---|---|
delete_tool.py | C:\mercari-delete-tool\ | メインの削除処理(Phase1 + Phase2) |
relist_tool.py | C:\auctown-relist-tool\ | オークタウン再出品処理 |
launcher.py | C:\mercari-delete-tool\ | GUIランチャー(tkinter) |
login_tool.py | C:\mercari-delete-tool\ | 各アカウントのログイン補助 |
settings.csv | C:\auctown-relist-tool\ | 再出品条件(入札価格・終了日時・自動再出品回数) |
token.json | C:\mercari-delete-tool\ | Google Sheets API 認証トークン |
profiles/ | C:\mercari-delete-tool\ | 各アカウントのFirefoxプロファイル(ログイン維持) |
logs/ | 各ツールフォルダ | 実行ログ(日時付きファイル名) |
2-2. スプレッドシート仕様
| 列 | 内容 | 備考 |
|---|---|---|
| A列 | (タイトル等) | ツールでは未使用 |
| B列 | 管理番号 | オークタウン・メルカリ共通の識別子 |
| C〜E列 | (商品情報等) | ツールでは未使用 |
| F列 | アカウント記号 | H/M/P/A/T/V/W のいずれか |
| G〜L列 | (その他情報) | ツールでは未使用 |
| M列 | 処理済みフラグ | 空=未処理、値あり=処理済みでスキップ |
M列フラグ値
| フラグ値 | 意味 |
|---|---|
| ✅ 削除成功 | 正常に削除完了 |
| ✅⚠️ 入札あり削除 | 入札があった商品を削除(500円違約金) |
| ❌ 削除できませんでした | 対象商品が見つからなかった(手動確認推奨) |
1dzBFvnAM7tqozATRpRAKy7EbDn8IyoalrzDh2WOac2s(シート名:スーパーマシン)削除ログは同スプレッドシートの「削除ログ」シートに記録(日時・管理番号・アカウント・タイトル・ステータス)。
2-3. delete_tool.py 仕様
起動オプション
| オプション | 動作 |
|---|---|
| なし | 確認モード(削除しない) |
--run | 実行モード(1件ずつ確認して削除) |
--bulk | 一括モード(確認なしで削除)← ランチャーはこれを使用 |
--phase1-only | Phase1のみ(メルカリ売れ→オークタウン削除) |
--phase2-only | Phase2のみ(ヤフオク売れ→メルカリ削除) |
Phase1 フロー(メルカリ売れ → オークタウン削除)
F列=H/M の行を対象
を順に検索
/mySellingList/
/myCloseList/
Phase2 フロー(ヤフオク売れ → メルカリ削除)
F列=A/T/V の行を対象
を順に検索
例: #hikari_store MD34
メルカリ削除の3ステップ
| ステップ | セレクター | 内容 |
|---|---|---|
| Step 1 | a[data-testid="checkout-link"] | 「商品の編集」リンクをクリックして編集ページへ移動 |
| Step 2 | button[data-testid="delete-button"] | 「この商品を削除する」ボタンをクリック |
| Step 3 | [data-testid="dialog-action-button"] button | 確認ダイアログの「削除する」ボタンをクリック |
スキップ対象アカウント
- W(WANG):ヤフオク未出品のためスキップ(
ℹ️ Wアカウント(WANG)はスキップとログ出力) - P(pua_boutique):メルカリのみ・ヤフオク紐づけなし。Phase2では検索対象になるがProfluの存在によりスキップされる場合あり
管理番号マッチング(完全一致)
# MD34 が MD348 にマッチしないよう前後に英数字境界チェック pattern = re.compile(r'(?<![A-Za-z0-9])' + re.escape(mgmt_num) + r'(?![A-Za-z0-9])')
ランダム遅延
BAN対策として各操作の間に random.uniform(2, 10) 秒のランダム待機を挿入しています。
2-4. relist_tool.py 仕様
起動オプション
| オプション | 動作 |
|---|---|
| なし | 通常実行(ヘッドレス) |
--dry | ドライラン(再出品しない・確認のみ) |
--visible | ブラウザを表示して実行 |
再出品フロー
入札価格範囲・終了日時・再出品回数
A→T→Vの順
チェックボックス
をクリック
価格・日時・回数設定
→「すぐ再出品する」
settings.csv の列
| 列名 | 内容 | 例 |
|---|---|---|
| 最高入札価格(以上) | 対象入札価格の下限 | 1 |
| 最高入札価格(以下) | 対象入札価格の上限 | 999999999 |
| 開始価格(増減) | 現在価格からの増減額 | -500 |
| 開始価格(指定) | 固定価格を指定(増減と同時指定不可。指定優先) | 3000 |
| 自動再出品 | 自動再出品回数(0〜) | 3 |
| 終了日(○日) | 何日後に終了するか | 1 |
| 終了時間(○時台) | 終了時間帯(時) | 22 |
日時設定のJS強制セット
オークタウンの終了日時セレクトボックスはhiddenのため、page.evaluate() でJSを経由してvalueをセットし、dispatchEvent(new Event('change')) で変更を反映させています。
表示件数設定
select[name="pageSize"] で300件表示に設定してから処理(再出品ツール)、または250件表示に設定してから処理(削除ツール)。
2-5. launcher.py 仕様
タブ構成
| タブ | クラス | 内容 |
|---|---|---|
| 🗑 削除ツール | DeleteTab | モード選択(both/phase1/phase2)・実行・中断・ログ |
| 🔄 再出品ツール | RelistTab | オプション選択(normal/dry/visible)・実行・中断・ログ |
| 🔐 ログイン | LoginTab | オークタウンA/T/V・メルカリH/M/Pの個別ログインボタン |
中断処理
def stop_tool(self): if self.process and self.process.poll() is None: self.process.kill() # プロセス強制終了 self.process.wait() # 完全終了を待つ release_lock() # ロックファイル削除 # → これで再実行可能になる
ロック強制解除ボタン(上部バー)
LOCK_FILE = r'C:\tool-lock\browser.lock' def release_lock(): if os.path.exists(LOCK_FILE): os.remove(LOCK_FILE)
2-6. ロックファイル制御
C:\tool-lock\browser.lock(Windows)/tmp/auctown-tools/browser.lock(Mac/Linux・開発時)
排他制御の仕組み
削除ツールと再出品ツールが同時に動くと同一Firefoxプロファイルを取り合ってクラッシュする問題を防ぐため、実行開始時にロックファイルを作成し、終了時に削除します。
# ロック取得(O_CREAT | O_EXCL = アトミックな排他作成) fd = os.open(LOCK_FILE, os.O_CREAT | os.O_EXCL | os.O_WRONLY) os.write(fd, str(os.getpid()).encode()) # PIDを書き込み os.close(fd)
ロックが既に存在する場合は FileExistsError が発生し、10秒ごとに再試行(最大30分待機)します。
詰まり時の手動対処
- ランチャーの「🔓 ロック強制解除」ボタンを押す
- ランチャーが開いていない場合:エクスプローラーで
C:\tool-lock\を開きbrowser.lockを削除 - Pythonで削除する場合:
import os; os.remove(r'C:\tool-lock\browser.lock')
2-7. Chatwork 通知仕様
| ルームID | 用途 |
|---|---|
427400103 | メイン通知(確認ルーム)。全ての完了・エラー通知はここに届く |
333988786 | 堀内ひかり(エラー通知専用)。再出品ツールのログイン切れ・エラー時に追加通知 |
通知タイミングと内容
| タイミング | 内容 |
|---|---|
| 削除ツール正常完了 | ✅ 削除件数・管理番号一覧・削除ログシートURL |
| 削除ツールログイン切れ | 🔐 切れアカウント名・対処方法 |
| 削除ツール見つからない | 🔍 見つからなかった管理番号一覧 |
| 削除ツールエラー | ❌ エラー内容・再実行方法 |
| 削除ボタンが見つからない | ⚠️ 商品タイトル・URL・原因の推測 |
| 再出品ツール正常完了 | ✅ 再出品件数・アカウント別内訳 |
| 再出品ツールログイン切れ | 🔐 + 堀内ひかりへも通知 |
| 再出品ツールエラー | ❌ エラー内容 + 堀内ひかりへも通知 |
2-8. Windows 環境
フォルダ構成
C:\
├── mercari-delete-tool\
│ ├── delete_tool.py
│ ├── launcher.py
│ ├── login_tool.py
│ ├── token.json
│ ├── profiles\
│ │ ├── auctown_A\ ← Firefoxプロファイル(ログイン維持)
│ │ ├── auctown_T\
│ │ ├── auctown_V\
│ │ ├── mercari_H\
│ │ ├── mercari_M\
│ │ └── mercari_P\
│ ├── screenshots\
│ └── logs\
├── auctown-relist-tool\
│ ├── relist_tool.py
│ ├── settings.csv
│ └── logs\
└── tool-lock\
└── browser.lock ← 実行中のみ存在
ランチャー起動ショートカット
デスクトップの ランチャー.bat をダブルクリックで起動。
内容は python C:\mercari-delete-tool\launcher.py を呼び出すバッチファイル。
Task Scheduler(タスクスケジューラ)
現在は手動実行。将来的にタスクスケジューラで自動化予定。設定時は以下を参考に:
タスク名: SUSH_DeleteTool 実行: python C:\mercari-delete-tool\delete_tool.py --bulk 実行間隔: 毎日(希望する時間に設定) 実行ユーザー: Windows管理者アカウント
SSH 接続情報
Mac から Windows をリモート操作する場合は既存のリモートデスクトップ設定を使用。
SSH / ファイル転送が必要な場合は小口さんに確認してください。
2-9. 設計上の判断と経緯
オークタウン・メルカリどちらもAPIが存在しないか、用途に合ったAPIが公開されていないため、実際にブラウザを操作するスクレイピング方式を採用。Playwright は async/sync の両対応・Firefox対応・永続プロファイル(ログイン維持)が優れており採用した。
削除ツールと再出品ツールが同じFirefoxプロファイルを同時に開くと競合してクラッシュするため。DBやメッセージキューを使わずファイルの存在チェック(O_CREAT | O_EXCL)でシンプルに排他制御。Windows環境でも動作する実績のある方式。
メルカリ・オークタウンのBAN(自動アクセス遮断)を避けるため。一定間隔のアクセスはボットと判定されやすい。random.uniform(2, 10) で人間的な操作速度に近づける。
部分一致では「MD34」を検索したときに「MD340」「MD341」「MD348」なども誤ってヒットして誤削除が発生するリスクがあった。正規表現の先読み・後読みによる境界チェック((?<![A-Za-z0-9])MD34(?![A-Za-z0-9]))を導入して完全一致のみ対象にした。
2-10. 残課題・今後の実装予定
| カテゴリ | 内容 | 優先度 |
|---|---|---|
| 自動化 | Task Scheduler による定期自動実行(現在は手動) | 中 |
| 自動化 | ツール1(商品情報抽出)→ 削除ツール → 再出品ツールの連鎖自動化 | 中 |
| メルカリ | P(pua_boutique)アカウントのPhase1対応(現在H/Mのみ) | 低 |
| エラー対応 | メルカリ利用制限ダイアログの自動リトライ(現在は通知のみ) | 中 |
| 再出品 | settings.csv の複数条件が競合した場合のより精緻な制御 | 低 |
| 監視 | スプレッドシートの「❌ 削除できませんでした」行の定期レポート | 低 |
| ログイン | ログインセッション切れの自動検知と事前通知(現在は実行時に発覚) | 中 |
| セキュリティ | token.json / Chatwork トークンの環境変数化(現在はコード内ハードコード) | 低 |
| Mac連携 | Mac側のClaudeからWindowsツールをSSH経由でトリガーできる仕組み | 中 |