WATCH SCOUT
読み込み中...
0 件登録
v2.0 DARK
今日のスキャン数
OK判定
NG判定
登録型番数
0
USD/JPY
🔔
Ref
📬 未振り分け 件 📌 あとで確認
🎯
Cal / Series
Cal・Series候補の振り分け
BID LIST
🔵 0件 入札中 🔍 0件 確認待ち
SCAN
今すぐスキャンを開始
📋
WATCH LIST
型番の追加・編集・削除
🔵
CAL LIST
Cal番号クエリの管理
🟣
SERIES LIST
Seriesクエリの管理
🚫
EXCLUDE
除外アカウント・URLの管理
📊
相場トラッカー
型番別の相場データ
今日のスキャン内訳
🎯 Ref
0
0 OK / 0 NG
⚙️ Cal
0
0 OK / 0 NG
📚 Series
0
0 OK / 0 NG
今日のフローKPI
📬 Ref振り分け
⭐ 入札リスト行き0
📌 あとで確認0
❌ 対象外0
🎯 Cal/Series振り分け
⭐ 割当0
📌 あとで確認0
❌ 対象外0
💰 BIDLIST
⭐ 入札リスト行き0
🔍 確認待ち行き0
✅ 落札0
❌ 負け0
📅 直近7日の推移
日付 スキャン 入札行き ✅ 落札
件数 OK NG 🎯 Ref ⚙️ Cal 📚 Series 合計
読み込み中...
直近のスキャン履歴
日時 種別 モード スキャン数 OK NG
スキャン履歴がありません
🤖 AI判定設定
⚡ AI判定
AI判定を使う
OFFにするとAI判定をスキップします(APIコスト0円)
ON
📷 画像判定
サムネイル画像をAI判定に使う
ONにするとサムネイル1枚をAIに送信します(1件あたり約+1円)
OFF
📝 判定プロンプト(テキストのみ)
画像OFF時に使われるプロンプトです。商品説明テキストのみで判定します。
文字数: 0
⚙️ 判定フロー
1 URL重複チェック → スキップ
2 タイトルNGキーワード → 即FAIL(ページ取得なし)
3 詳細ページ取得 → 本文NGキーワード → 即FAIL
4 AI判定(テキスト+サムネ画像1枚)→ A/B/C/D
※ AI ONの場合のみ④が実行されます。OFFの場合はキーワード+価格+サイズのみで判定。
🔎 Ref推測AI 仕様書
📌 概要
NOTIFYタブの出品カードにある「🔎 Ref推測」ボタンを押すと起動。
出品画像・タイトル・シリーズ名をもとに、Google検索+AI(Claude Haiku 4.5)がRef番号を推測する。
推測結果はLISTとの照合・タスク保存・NOTIFYカード置き換えまで一貫して処理できる。
🔄 全体処理フロー
STEP 1 フロントから送信
   → title / maker / series / thumbnail URL
   → watchListが未ロードの場合は /load を自動fetch(LIST照合に必要)
STEP 2 Google テキスト検索(Custom Search API)
   → クエリ:{maker} {series} ref(例:OMEGA De Ville ref)
   → 上位5件のタイトル+スニペットを収集
STEP 3 Google 画像検索(searchType=image)
   → 同クエリで画像URL を最大5件取得・Base64変換(失敗はスキップ)
STEP 4 Claude Haiku 4.5 へ投げる
   → 画像:出品画像1枚 + Google参考画像 最大5枚(計最大6枚)
   → テキスト:メーカー・シリーズ・タイトル・Google検索スニペット
STEP 5 結果を返してLIST照合
   → 推測RefをwatchList(メモリ内)と照合(完全一致 or 前方一致)
   → LIST登録済み → 「🔄 このリストカードに置き換え」ボタン表示
   → LIST未登録 → 「📥 タスクに追加」ボタン表示
🔍 Google検索クエリの仕組み
条件 クエリ例
シリーズ名が判明している場合 OMEGA De Ville ref
シリーズ不明の場合 OMEGA watch ref {タイトルの英数字}
※ シリーズを軸にすることで、SeamasterをDe Villeと誤認するシリーズ混在を防止。
🔗 LIST照合ロジック
推測されたRefをwatchListと照合。スペース・ハイフン・ドットを除去した正規化文字列で比較。
マッチ条件(いずれか):
  ① 完全一致:normalize(ref) === normalize(w.ref_no)
  ② 前方一致:AIのRefがLISTのRefで始まる(Cal番号混入対策)
     例:AI「511.0471.625」→ LIST「511.0471」にマッチ
  ③ 逆前方一致:LISTのRefがAIのRefで始まる
✅ マッチした場合 → LIST情報(No.・maker・series・eBay価格・上限)を表示
「🔄 このリストカードに置き換え」でNOTIFYカードをLIST情報に差し替え+DBのSKU更新
📥 未登録の場合 → 「タスクに追加」でREF TASKSに保存(後でまとめて新規LIST登録)
🖼️ AIへ渡す画像
順番 内容 枚数
1枚目 ヤフオク出品画像(判定対象) 1枚
2枚目〜 Google画像検索の参考画像(同シリーズの実物) 最大5枚
※ 画像取得失敗はスキップ。1枚も取れない場合はテキストのみで推測。
📝 AIへ渡す指示プロンプト(実際の内容)
あなたは時計の専門家です。 以下の情報からこの時計のRef番号(型番)を推測してください。 メーカー: {maker} シリーズ: {series ※不明の場合は「(不明)」} 【ヤフオク出品タイトル(これが判定対象の商品説明です)】: {title} 【Google検索結果(参考情報)】 - {検索ヒットしたページのタイトル}: {スニペット} ×最大5件 【重要】「ヤフオク出品タイトル」はオークション出品者が書いたものです。 「Google検索結果」はWeb上の参考情報です。両者を混同しないでください。 reasonには「ヤフオク出品タイトルに〇〇と記載」か「Google検索結果に〇〇と記載」のように情報源を明記してください。 【重要】シリーズが判明している場合は、必ずそのシリーズ内のRefのみを候補にしてください。 例:シリーズが「De Ville」なら、SeamasterやSpeedmasterのRefは候補にしない。 【添付画像について】 - 1枚目: ヤフオク出品画像(判定対象の時計) - 2枚目以降: Google画像検索で取得した同系統の参考画像(N枚) 【分析手順】 1. シリーズ名を最優先で確認し、そのシリーズのRef番号に絞る 2. ヤフオク出品タイトルに含まれる型番・Cal番号・年代の手がかりを抽出する 3. Google検索結果のテキストにRef番号の手がかりがあれば優先活用する 4. 参考画像と出品画像を見比べて、文字盤・ケース・ベゼル・針のデザインが一致するものを探す 5. 上記を総合してRef番号を推測する 以下の形式でJSONのみ回答(説明文・コードブロック不要): { "refs": ["推測Ref1", "推測Ref2"], "confidence": 確信度(0〜100の整数), "reason": "情報源を明記して判断根拠を日本語100字以内で(例:ヤフオク出品タイトルに511.0457と記載)" } refsは最大3件。確信度が低い場合は1件でも可。全く不明な場合は空配列。
📋 REF TASKSタブの仕組み
未登録のRefをタスクとして保存し、まとめてLIST新規登録できる機能。
タスクに保存される情報:
  ref_no / maker / series / confidence / reason / title_sample / thumbnail_url
  source_url(ヤフオク出品URL・置き換え対象カードの特定に使用)
  google_image_urls(将来の画像照合フェーズ2用に保存)

タスクからの登録フロー:
「✅ LISTに追加」クリック
  → LIST新規登録フォームへ遷移(maker・series・ref_noが自動入力)
  → eBay販売履歴URLも自動入力(maker + ref_no のSold検索URL)
  → フォーム入力後「LISTに登録する」
  → NOTIFYタブへ移動
  → source_urlでNOTIFYカードを特定して情報を置き換え
  → DBのSKUを新list_noで再割り当て(/notify_reassign)
  → タスクのstatusをaddedに更新(一覧から消える)
※ 同じref_noのpendingタスクを重複追加しようとすると「追加済み」の警告が出る。
※ 「📦 eBay販売履歴」ボタンでタスクカードからeBay Sold検索に直接アクセス可能。
🔄 NOTIFYカード置き換えの仕組み
LISTへの登録・照合後、元のNOTIFYカードを新しいLIST情報で差し替える。
置き換えられる情報: list_no / maker / series / ref_no / model / ebay_price / limit / ebay_url

DB側の更新(/notify_reassign API):
  → notify_list テーブルの SKU を新 list_no ベースで再生成
     例:W-0457 → L0457-0001(スキャン商品マスター番号を正しい系統に更新)
  → list_no / maker / model も同時に更新
※ SKUはスキャン時の商品マスター番号。置き換え時に正しいlist_no系統へ再割り当てする。
🔌 関連APIエンドポイント
エンドポイント 用途
POST /ref_guess/analyze Google検索+AI推測を実行
GET /ref_tasks pendingタスク一覧取得
POST /ref_tasks タスク追加(重複チェックあり)
PATCH /ref_tasks/{id} タスクのstatus更新(added/dismissed)
POST /notify_reassign NOTIFYカードのSKU・list_noをDB更新
💰 コスト目安(Claude Haiku 4.5)
画像1枚 ≒ 1,600トークン / テキスト ≒ 1,000トークン / 出力 ≒ 150トークン
1回あたり ≒ 約1.6円(出品画像1枚 + Google参考5枚 + テキスト込み)
月100回利用 → 約480円 / 月50回 → 約240円
📋 Refタスク Ref推測AIで保存した候補をまとめてLISTに登録できます
保存済みタスク
読み込み中...
🕮 LIST 新規登録
1
親情報
メーカー・Ref・画像
2
枝番
色・デザイン・相場(任意)
3
クエリ
ヤフオク検索URL
4
確認
登録プレビュー
① 親情報(検索の材料)
② 枝番情報(画像・相場・バリエーション) 複数追加可・スキップ可
💡 枝番は色違い・文字盤違いなど型番のバリエーション。不要なら「Step 3」へそのまま進めます。
③ ヤフオク検索クエリを生成
④ 確認 → 登録
下記の内容で登録します。修正は上部の ① ② ③ タブをクリックで戻って編集できます。
📝 親情報
📝 枝番
📝 ヤフオク代表クエリ
Step 1 / 4
🔔 通知履歴 (0件)
▽ 絞り込み
表示: |
スキャンを実行すると通知履歴がここに表示されます
▽ 絞り込み
| |
|
📊 落札分析
⭐ 入札リスト 0件
通知ページから「入札リストへ追加」を押してください
📦

手動仕入れ

業者オークション・店舗仕入・ネット仕入を登録
上のフォームから種別・取引先・商品マスターを選んで「下書きへ追加」 → 下のリストに溜まります。
画像コピペ・URL付与など編集してから、チェックを入れて「選択分を入札待ちへ移動」で BIDLIST へ送ります。
業者オーク → 入札待ち、店舗仕入・ネット仕入 → 落札(仕入済)として移動されます。
1. 仕入れ種別
2. 取引先
3. 商品マスター(LIST 割り当て)
読み込み中...
📝 下書きリスト (0件)
読み込み中...
🕮 WATCH LIST (0件)
📄 CSV / Excel 読み込み
0件選択中
編集
📷
🔗 検索クエリ
枝番一覧
⚙️ SCAN SETTINGS
価格・サイズ(型番スキャン用)
上限価格(Cal・Series)
超えたら即除外
超えたら即除外
最大取得件数
⏭ スキャン済みURL: -
🚫 NGワード(タイトル・商品説明 除外)
タイトルまたは商品説明本文に含まれていたらAI判定なしで即除外
Ref(型番)
Cal
Series
🏪 ショップ別 NG パターン
特定ショップの出品で、ここに登録した文字列が本文に含まれていたら即除外。
ストア凡例の「商品ランク【1】」「状態ランク:C」など、テンプレ表記で実質ジャンクのものを捕捉する用途。
🤖 AI SETTINGS
AI判定
OFF
画像AI
OFF
📝 AIプロンプト設定
Ref(型番)プロンプト
Cal プロンプト
Series プロンプト
🔍 スキャン実行
SCANNING... 0%
準備中...
🚫
除外アカウント
スキャン時にこのリストの出品者をスキップします
NEW EXCLUSION
読み込み中...
📖 Omega リサーチ手順書RAG実装までの暫定メモ
Ref. と Cal. の基本
Ref.(Reference)
外装側の型番。ケース基準で見る。裏蓋の刻印で最終確認。
Cal.(Caliber)
中のムーブメント番号。ムーブ本体で最終確認。
ヴィンテージOmegaの6桁系Refは1960年代初頭から使用。先頭3桁がケース属性、後ろ3〜4桁が個別モデル番号。
先頭3桁ルール早見表
1桁目:性別・スタイル
1Gent's Watch
2Gent's Jewellery
3Gent's Bracelet
4Gent's Jewellery Bracelet
5Lady's Watch
6Lady's Jewellery
7Lady's Bracelet
8Lady's Jewellery Bracelet
2桁目:ムーブ種別
1手巻き・秒針なし
2手巻き小秒針
3手巻きセンターセコンド
4手巻きクロノグラフ
5自動巻き・秒針なし
6自動巻きセンターセコンド
7自動巻きクロノグラフ
8電子クロノグラフ
9電子式・クォーツ系
3桁目:防水・機能
1非防水
2非防水・カレンダー
3非防水・クロノメーター
4非防水・クロノメーター+Cal
5防水
6防水・カレンダー
7防水・クロノメーター
8防水・クロノメーター+Cal
具体例
196
メンズ・クォーツ・防水カレンダー
196.0312.1の読み方
511
レディース・手巻き・非防水
511.0392の読み方
145
メンズ・手巻きクロノ・防水
Speedmaster系
166
メンズ・自動巻き・防水カレンダー
Seamaster系
Refが変わりやすいポイント
Ref変更の決定打(変わりやすい)
  • ケース素材
  • ケースサイズ
  • ケース形状
  • ベゼル・ラグ形状
  • 日付あり/なし
  • 手巻き/自動巻き/クォーツ
  • 搭載ムーブ系統
Ref変更に直結しにくい
  • ベルト・尾錠
  • 後年交換の文字盤・針
  • 風防交換
  • 色だけの違い(同ケース設計なら同Ref)
色違いでも同じケース設計なら同じ後半4桁の場合あり
eBayで売れ筋を探す優先順位
Ref.
外装まで特定・精度高
Cal.
Ref不明時に近い仲間を広く
先頭3桁
ファミリー全体を広く掘る
仕入れ判断の精度を上げる → Ref.で検索 / 近い仲間を探す → Cal.で検索 / ファミリー全体を掘る → 先頭3桁で検索
ヤフオクでRef不明の時の実務フロー
1
まず「売れそうな顔」かを見る
ブランド・シリーズ・メンズ/レディース・クォーツ/手巻き/自動巻き・2針/3針・デイトありなし・ケース形状・インデックス・文字盤色・サイズ感 → eBayで需要がありそうか先に判定
2
タイトル・商品説明の弱い情報を拾う
裏蓋刻印・ケース番号・電池番号・横幅mm・風防形状など。OmegaならDe Ville / Geneve / Quartz / Ladies / Square / Dateだけでもかなり絞れる
3
eBayで類似検索(広め)
omega de ville quartz gold date ladies など。ブランド+シリーズ+駆動+性別+形+色+デイト で当てる
4
類似売れ商品からRef/Calを逆引き
eBayで似た顔の個体を見つけたら、タイトル・説明・裏蓋写真・ムーブ写真からRef/Cal候補を拾う
5
RefでSold確認
omega 196.0312 sold / omega 511.0392 sold → 売れ数と相場を確認
6
完全一致でなくても利益が出るかで判断
別Refでも相場が近いか・回転が遅すぎないか・不動でも採算が合うか・文字盤ダメージが重すぎないか・社外ベルトでも売れるか
一番大事な実務ルール
✓ 色だけでRefが変わるとは限らない
✓ Refは文字盤よりケース基準で見る
✓ 最終確認は裏蓋内側とムーブ
✓ eBay開拓は Ref. > Cal. > 先頭3桁
✓ ヤフオクで番号不明なら顔で探してから逆引き
✓ 完全特定できなくても近い群で利益が出るなら仕入れ候補
※ RAG知識エンジン実装後は、このページの内容をDBに取り込み自動参照できるようにする予定
📘 自動振り分けロジック 仕様書 v1.0 (2026-05-21 制定)
⚡ 判定優先順位 (5段階)
スキャン結果は以下の順番で判定。早期に確定したら以降のチェックは行われない。
取りこぼし最小化を最優先。グレーゾーンはOK寄りにする方針。
1
タイトルNG → 即NG。詳細ページ取得もスキップ (最強)
タイトル文字列に NG ワード (11語) が含まれていれば確定
2
ショップ別NG → 即NG (社長が明示登録したテンプレ確定情報)
出品者名 × 本文パターン (例: ecoプラン店「商品ランク【1】」)
3
OKワード優先 → 即OK (本文NGをスルー)
タイトル or 本文に OK ワード (10語) があれば、本文の不動記述等は無視
4
本文NG → NG
凡例 TABLE 除去後の本文に NG ワードがあれば
5
デフォルト → OK (グレーゾーンは取りこぼし防止)
どれにも該当しなければ OK 扱い
🚫 NG ワード一覧 (11語・UI で社長が編集可能)
タイトル または 凡例除去後の本文 に含まれていたら NG 判定。「ジャンク」は意図的に未収録 (動くジャンクもあるため)。
不動 不働 動作未確認 動作不良 訳あり 訳アリ 訳有 訳有り 難あり 難アリ 難有り
⚙ 編集場所: SCAN ページ → 🚫 NGワード(タイトル・商品説明 除外)
✅ OK ワード一覧 (10語・コード定数 TITLE_OK_KW)
タイトル または 本文 に含まれていれば、本文NGがあっても OK 化 (ショップ別NGには勝てない)。出品者が「動く」と明示した商品の誤NGを救う。
稼働 稼働品 稼働中 稼働確認 稼働確認済 動作品 動作確認済 動作OK 実働 実働品
⚙ 編集場所: app.py の TITLE_OK_KW 定数 (UI 化は将来検討)
🏪 ストア別 NG パターン (4大ストア解析結果)
出品者名 × 本文パターンの組み合わせで NG 判定。各ストアのテンプレ文を解析して登録。UI から社長が追加・削除できる。
ストア名 登録パターン 意味 / 補足
ecoプラン
ヤフー店
商品ランク【1】
ランク【1】
商品説明ランク【1】
商品説明ランク【2】
独自ランク制 (S/5/4/3/2/1)。1=ジャンク品・2=傷み多い使用不可寄り → どちらも NG。3以上は OK。
TOKYO VIP
COLLECTION
(登録なし) タイトルに「稼働」「不動」「不働」明示が多い → タイトルNGとOKワードで対応可能。凡例TABLEは Level1 で自動除去される。
ブランドカラー 状態ランク:C コメント 独自ランク制 (S/SA/A/AB/B/BC/C)。C=ジャンク品 → NG。BC・B以上は OK。
※ パターンに「 コメント」まで含めるのは BC を巻き込まないため
らくらく時計店 (登録なし) タイトルに「稼働」「ジャンク」明示が多い → OKワードで対応可能。「ジャンク」は社長ポリシーで NG しない (動くジャンクあり)。
⚙ 編集場所: SCAN ページ → 🏪 ショップ別 NG パターン (UI から追加・削除可能)
📄 ストア凡例ランク表の自動除去 (Level 1)
多くのストアが商品ページ末尾に「コンディション一覧表」を <TABLE> で組んでいる (例: 【N】新古品 〜 【C】ジャンク品)。
これを本文判定で拾うと「商品個別の状態」と「凡例の説明文」を区別できず誤NGになる問題があった。

解決ロジック: scrape_item_detail 内で descriptionHtml をパース → <TABLE> 内に 【○】(半角A-Z/全角A-Z/数字 1-3文字) が 3個以上含まれる TABLE = 凡例ランク表 → 削除してから本文NG判定を行う。
効果: LW-0990-0991 (TOKYO VIP COLLECTION の凡例「【C】不動 ジャンク品」を拾っていた誤NG) を解消。商品個別のスペック表 (腕回り・サイズ・ランク AB 単独等) は影響受けず残る。
⏰ 毎朝の自動スキャン
実行時刻 毎日 8:00 JST (VPS は Asia/Tokyo)
起動方法 curl POST /auto_scan/run_daily (cron)
Phase 1 型番 + Cal (scan_mode=ref_cal、watch_list 全件) を完走
Phase 2 Series 単独 (scan_mode=series、series_queries WHERE enabled=true)
順次実行 同一スレッドで Phase 1 完了後に Phase 2 起動。狭いクエリ (型番) を先にスキャン済み登録 → 広いクエリ (Series) で重複自動スキップ
重複防止 scan_state['running']=True ならスキップ・ログ記録
記録 scan_history に type='自動' で記録 + ログファイル /opt/ai-automation/watch-scout/logs/auto_scan_daily.log
🔀 スキャン経路別 機能整合性
scan_worker には 3 つの経路があるが、全経路で同じロジックが動くよう整備済 (2026-05-21 修正)。
経路 タイトルNG ショップNG OK判定 本文NG 凡例除去
手動 Ref/Cal/Series (scan_mode=ref_cal)
Cal単独 (scan_mode=cal)
Series単独 (scan_mode=series、毎朝 Phase 2)
🖥 NOTIFY 画面の挙動
  • 終了済み自動非表示: end_time が現在時刻を過ぎた商品は API レスポンスから除外 (DB には保持)
  • 未振り分け/あとで確認/対象外/入札済み: いずれも終了済みは非表示で統一
  • フィルタタブ: 📋全件 / ✅OK / 🤖AI:NG / ❌NG で切り替え可能
  • OKタブ = pass=true の商品 / NGタブ = pass=false かつ ai_rank≠NG (キーワードNG・価格NG)
  • BIDLIST は別エンドポイントのため、終了済み非表示の影響なし
🗄 関連テーブル
テーブル 用途
watchscout.notify_list Ref スキャン結果。NOTIFY 画面 Ref タブのデータソース
watchscout.notify_candidates Cal/Series 単独スキャン結果。NOTIFY 画面 Cal/Series タブのデータソース
watchscout.settings (key=main) ng_keywords / ng_keywords_ref/cal/series/all / seller_ng_patterns / その他全設定
watchscout.excluded_accounts 出品者ブラックリスト (完全スルー対象)
watchscout.scan_history スキャン実行履歴 (type='手動'/'自動')
📜 改善履歴 (2026-05-20 → 21)
5/20 ① 自動振り分け復活 - __NEXT_DATA__ 対応 (ヤフオク Next.js 化追随)
5/20 ② NOTIFY 全タブで終了済みUI非表示 (DB保持)
5/20 ③ 毎朝 8:00 JST 自動スキャン実装 (型番+Cal → Series 順次)
5/21 ① ストア凡例自動除去 + ショップ別NGパターン機能
5/21 ② タイトル/本文 OK 判定追加 (取りこぼし最小化)
5/21 ③ Cal/Series 単独経路に本文NG+OK判定 (経路間バグ修正)
5/21 ④ 異字体 5語追加 (不働/訳アリ/動作不良/難アリ/訳有)
5/21 ⑤ 4大ストア解析 + ecoプラン2語/ブランドカラー1語 追加
※ 仕様変更時は本ページの記述と app.py / settings の整合性を保つこと
📡 Cal クエリ管理 Cal番号ごとのスキャン設定
+ 新規登録
登録済みクエリ
読み込み中...
🏷 シリーズ クエリ管理 シリーズ名ごとのスキャン設定
+ 新規登録
登録済みクエリ
読み込み中...
📡 Cal・Series (0件)
表示: | | |
クエリ: | ソート:
🤖 AI絞り込み (対象: 未計算)
読み込み中...
📊 相場トラッカー
0件
|
まだ相場データがありません