メインコンテンツまでスキップ

dry_run とは(仕組み)

MercariClient(dry_run=True)メルカリ API に TCP 接続しない モードです。
代わりに、ライブ時と 同じ組み立てパイプライン でリクエストを作り、中身を返します。

何のため?

用途説明
デバッグkeyword / category / condition が protobuf にどう載るか確認
テストネットワーク・トークンなしで CI 可能
学習DPoP ヘッダや search_condition の形を見る
安全誤って大量リクエストしない

仕組み(search)

c.search(...) または c.search_from_condition(...)


builder.build_search_dict(**kwargs) # ラベル → id、status など


codec.json_to_binary(..., kind=request) # protobuf 本体


_keystore.make_dpop("POST", url) # 本物の DPoP JWT(鍵があれば)


dry_run=True → return { mode: "dry_run", url, headers, request_json, body_hex, ... }
dry_run=False → mercari_http.urlopen(POST body) → live / network_error

戻り値の形(search)

{
"mode": "dry_run", # live | dry_run | network_error
"url": "https://api.mercari.jp/...",
"method": "POST",
"headers": { "DPoP": "...", "X-PLATFORM": "android", ... },
"request_json": {
"search_condition": { "keyword": "...", "category_id": [3833], ... },
"page_size": 30,
...
},
"body_hex": "...", # 実際に送る protobuf
"auth": { "guest_ready": true, "mode": "dpop_only", ... },
}

items は空です(API を叩いていないため)。ヒット一覧が欲しいときは dry_run=False(ライブ)。

item() の dry_run

商品詳細もネットワークなしで GET URL + ヘッダ形 を返します。

c = mercari.MercariClient(dry_run=True)
print(c.item("m12345678901")["url"])

ライブとの切り替え

# 開発
c = mercari.MercariClient(dry_run=True)

# 本番ゲスト検索
c = mercari.MercariClient(dry_run=False) # 既定
# または CLI: mercari --live search -k iPhone -c 3833

webapp は環境変数 MERCARI_WEB_DRY_RUN=1 で dry_run 起動できます。

よくある誤解

誤解実際
dry_run はモックデータいいえ。本物のリクエスト組み立てだけ
DPoP はダミー鍵があれば 本物の JWT を mint
dry_run で相場が取れるいいえ。ヒットが無いので stats は空
プロキシは dry_run でも効くネットワークしないので プロキシは使われない

関連: 高度な検索 JSON · プロキシ · Sample dry-run