This commit is contained in:
2026-07-27 10:34:53 +08:00
commit 3527975794
74 changed files with 16405 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
"""测试夹具:加载从真实站点抓取并裁剪后的页面状态样本"""
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
import pytest
FIXTURES_DIR = Path(__file__).parent / "fixtures"
def load_fixture(name: str) -> dict[str, Any]:
return json.loads((FIXTURES_DIR / name).read_text(encoding="utf-8"))
@pytest.fixture
def search_state() -> dict[str, Any]:
"""搜索页 __INITIAL_STATE__ 样本(保留 1 条广告位 + 2 条普通商品)"""
return load_fixture("search_state.json")
@pytest.fixture
def item_state() -> dict[str, Any]:
"""商品详情页 __INITIAL_STATE__ 样本(多 SKU 商品,variants 裁剪为 3 条)"""
return load_fixture("item_state.json")
@pytest.fixture
def item_with_options_state() -> dict[str, Any]:
"""带商品选项(名入れギフト)的详情页样本,含必填 select 与自由文本 text"""
return load_fixture("item_with_options_state.json")
@pytest.fixture
def genre_root_state() -> dict[str, Any]:
"""哨兵关键词搜索页样本,根节点挂着全部顶层分类"""
return load_fixture("genre_root_state.json")
@pytest.fixture
def genre_node_state() -> dict[str, Any]:
"""分类页样本(テレビゲーム 101205,顶层分类,带 genreInfo)"""
return load_fixture("genre_node_state.json")
File diff suppressed because one or more lines are too long
+2115
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+248
View File
@@ -0,0 +1,248 @@
{
"state": {
"data": {
"genreTree": {
"parent_category": {
"id": 0,
"name": "",
"count": null,
"shortcut": null,
"leaf": false,
"children": [
{
"id": 101205,
"name": "テレビゲーム",
"count": null,
"shortcut": "game",
"leaf": false,
"children": [
{
"id": 568771,
"name": "Nintendo Switch 2",
"count": 8253,
"shortcut": "game_nintendo_switch_two",
"leaf": false,
"children": []
},
{
"id": 565950,
"name": "Nintendo Switch",
"count": 132279,
"shortcut": "game_nintendo_switch",
"leaf": false,
"children": []
},
{
"id": 568375,
"name": "プレイステーション5",
"count": 28407,
"shortcut": "game_playstation_five",
"leaf": false,
"children": []
},
{
"id": 568382,
"name": "Xbox Series X/S",
"count": 1366,
"shortcut": "game_xbox_series_x",
"leaf": false,
"children": []
},
{
"id": 563544,
"name": "プレイステーション4",
"count": 44066,
"shortcut": "game_playstation_four",
"leaf": false,
"children": []
},
{
"id": 553848,
"name": "Nintendo 3DS・2DS",
"count": 43115,
"shortcut": "game_nintendo_threeds_twods",
"leaf": false,
"children": []
},
{
"id": 112317,
"name": "スーパーファミコン",
"count": 37896,
"shortcut": "game_super_nintendo_entertainment_system",
"leaf": false,
"children": []
},
{
"id": 112243,
"name": "プレイステーション2",
"count": 32723,
"shortcut": "game_playstation_two",
"leaf": false,
"children": []
},
{
"id": 206062,
"name": "プレイステーション・ポータブル",
"count": 26661,
"shortcut": "game_playstation_portable",
"leaf": false,
"children": []
},
{
"id": 500481,
"name": "プレイステーション3",
"count": 21800,
"shortcut": "game_playstation_three",
"leaf": false,
"children": []
},
{
"id": 112257,
"name": "プレイステーション",
"count": 21211,
"shortcut": "game_playstation",
"leaf": false,
"children": []
},
{
"id": 206076,
"name": "Nintendo DS",
"count": 20226,
"shortcut": "game_nintendo_ds",
"leaf": false,
"children": []
},
{
"id": 562921,
"name": "プレイステーション・ヴィータ",
"count": 14626,
"shortcut": "game_playstation_vita",
"leaf": false,
"children": []
},
{
"id": 500739,
"name": "Wii",
"count": 9188,
"shortcut": "game_wii",
"leaf": false,
"children": []
},
{
"id": 200592,
"name": "ゲームボーイアドバンス",
"count": 8825,
"shortcut": "game_game_boy_advance",
"leaf": false,
"children": []
},
{
"id": 300955,
"name": "Xbox360",
"count": 7140,
"shortcut": "game_xbox_three_sixty",
"leaf": false,
"children": []
},
{
"id": 200589,
"name": "ファミコン",
"count": 6287,
"shortcut": "game_nintendo_entertainment_system",
"leaf": false,
"children": []
},
{
"id": 200192,
"name": "ゲームキューブ",
"count": 5921,
"shortcut": "game_gamecube",
"leaf": false,
"children": []
},
{
"id": 563545,
"name": "XboxOne",
"count": 5299,
"shortcut": "game_xboxone",
"leaf": false,
"children": []
},
{
"id": 112303,
"name": "ゲームボーイ",
"count": 4542,
"shortcut": "game_game_boy",
"leaf": true,
"children": []
},
{
"id": 563543,
"name": "WiiU",
"count": 3904,
"shortcut": "game_wiiu",
"leaf": false,
"children": []
},
{
"id": 112285,
"name": "セガサターン",
"count": 3351,
"shortcut": "game_sega_saturn",
"leaf": true,
"children": []
},
{
"id": 200193,
"name": "Xbox",
"count": 2743,
"shortcut": "game_xbox",
"leaf": true,
"children": []
},
{
"id": 112271,
"name": "ドリームキャスト",
"count": 1768,
"shortcut": "game_dreamcast",
"leaf": true,
"children": []
},
{
"id": 112289,
"name": "NINTENDO 64",
"count": 1689,
"shortcut": "game_nintendo_sixty_four",
"leaf": true,
"children": []
},
{
"id": 200594,
"name": "アーケードゲーム",
"count": 1153,
"shortcut": "game_arcade_games",
"leaf": true,
"children": []
},
{
"id": 101915,
"name": "その他",
"count": 194697,
"shortcut": "game_others",
"leaf": true,
"children": []
}
]
}
]
},
"error": null
},
"genreInfo": {
"fullGenreName": "テレビゲーム",
"description": "最新のテレビゲームのランキングに基づいた話題のテレビゲーム用ソフトやゲーム機など充実した品揃えです。ゲーム速報に名が上がる新着ゲームはもちろんのこと、中古の懐かしいゲームソフトも勢揃い!ゲームボーイやファミコン、スーパーファミコンなどの少し",
"cmsFormId": null
}
}
}
}
+331
View File
@@ -0,0 +1,331 @@
{
"state": {
"data": {
"genreTree": {
"parent_category": {
"id": 0,
"name": "",
"count": null,
"shortcut": null,
"leaf": false,
"children": [
{
"id": 100000,
"name": "百貨店・総合通販・ギフト",
"count": null,
"shortcut": "department",
"leaf": false,
"children": []
},
{
"id": 100005,
"name": "花・ガーデン・DIY",
"count": null,
"shortcut": "flower",
"leaf": false,
"children": []
},
{
"id": 100026,
"name": "パソコン・周辺機器",
"count": null,
"shortcut": "computer",
"leaf": false,
"children": []
},
{
"id": 100227,
"name": "食品",
"count": null,
"shortcut": "food",
"leaf": false,
"children": []
},
{
"id": 100316,
"name": "水・ソフトドリンク",
"count": null,
"shortcut": "drink",
"leaf": false,
"children": []
},
{
"id": 100371,
"name": "レディースファッション",
"count": null,
"shortcut": "ladiesfashion",
"leaf": false,
"children": []
},
{
"id": 100433,
"name": "インナー・下着・ナイトウェア",
"count": null,
"shortcut": "inner",
"leaf": false,
"children": []
},
{
"id": 100533,
"name": "キッズ・ベビー・マタニティ",
"count": null,
"shortcut": "baby",
"leaf": false,
"children": []
},
{
"id": 100804,
"name": "インテリア・寝具・収納",
"count": null,
"shortcut": "interior",
"leaf": false,
"children": []
},
{
"id": 100938,
"name": "ダイエット・健康",
"count": null,
"shortcut": "health",
"leaf": false,
"children": []
},
{
"id": 100939,
"name": "美容・コスメ・香水",
"count": null,
"shortcut": "beauty",
"leaf": false,
"children": []
},
{
"id": 101070,
"name": "スポーツ・アウトドア",
"count": null,
"shortcut": "sports",
"leaf": false,
"children": []
},
{
"id": 101114,
"name": "車・バイク",
"count": null,
"shortcut": "auto",
"leaf": false,
"children": []
},
{
"id": 101164,
"name": "ホビー",
"count": null,
"shortcut": "hobby",
"leaf": false,
"children": []
},
{
"id": 101205,
"name": "テレビゲーム",
"count": null,
"shortcut": "game",
"leaf": false,
"children": []
},
{
"id": 101213,
"name": "ペット・ペットグッズ",
"count": null,
"shortcut": "pet",
"leaf": false,
"children": []
},
{
"id": 101240,
"name": "CD・DVD",
"count": null,
"shortcut": "media",
"leaf": false,
"children": []
},
{
"id": 101381,
"name": "カタログギフト・チケット",
"count": null,
"shortcut": "ticket",
"leaf": false,
"children": []
},
{
"id": 101438,
"name": "サービス・リフォーム",
"count": null,
"shortcut": "service",
"leaf": false,
"children": []
},
{
"id": 111427,
"name": "住宅・不動産",
"count": null,
"shortcut": "realestates",
"leaf": false,
"children": []
},
{
"id": 112493,
"name": "楽器・音響機器",
"count": null,
"shortcut": "instrument",
"leaf": false,
"children": []
},
{
"id": 200162,
"name": "本・雑誌・コミック",
"count": null,
"shortcut": "book",
"leaf": false,
"children": []
},
{
"id": 211742,
"name": "TV・オーディオ・カメラ",
"count": null,
"shortcut": "electronics",
"leaf": false,
"children": []
},
{
"id": 215783,
"name": "日用品雑貨・文房具・手芸",
"count": null,
"shortcut": "daily",
"leaf": false,
"children": []
},
{
"id": 216129,
"name": "ジュエリー・アクセサリー",
"count": null,
"shortcut": "accessories",
"leaf": false,
"children": []
},
{
"id": 216131,
"name": "バッグ・小物・ブランド雑貨",
"count": null,
"shortcut": "fashiongoods",
"leaf": false,
"children": []
},
{
"id": 503190,
"name": "車用品・バイク用品",
"count": null,
"shortcut": "autogoods",
"leaf": false,
"children": []
},
{
"id": 510901,
"name": "日本酒・焼酎",
"count": null,
"shortcut": "sake",
"leaf": false,
"children": []
},
{
"id": 510915,
"name": "ビール・洋酒",
"count": null,
"shortcut": "liquor",
"leaf": false,
"children": []
},
{
"id": 551167,
"name": "スイーツ・お菓子",
"count": null,
"shortcut": "sweets",
"leaf": false,
"children": []
},
{
"id": 551169,
"name": "医薬品・コンタクト・介護",
"count": null,
"shortcut": "medicine",
"leaf": false,
"children": []
},
{
"id": 551177,
"name": "メンズファッション",
"count": null,
"shortcut": "mensfashion",
"leaf": false,
"children": []
},
{
"id": 558885,
"name": "靴",
"count": null,
"shortcut": "shoes",
"leaf": false,
"children": []
},
{
"id": 558929,
"name": "腕時計",
"count": null,
"shortcut": "watch",
"leaf": false,
"children": []
},
{
"id": 558944,
"name": "キッチン用品・食器・調理器具",
"count": null,
"shortcut": "kitchen",
"leaf": false,
"children": []
},
{
"id": 562637,
"name": "家電",
"count": null,
"shortcut": "appliance",
"leaf": false,
"children": []
},
{
"id": 564500,
"name": "スマートフォン・タブレット",
"count": null,
"shortcut": "smartdevice",
"leaf": false,
"children": []
},
{
"id": 565004,
"name": "光回線・モバイル通信",
"count": null,
"shortcut": "telecommunication",
"leaf": false,
"children": []
},
{
"id": 566382,
"name": "おもちゃ",
"count": null,
"shortcut": "toy",
"leaf": false,
"children": []
}
]
},
"error": null
},
"genreInfo": null
}
}
}
+766
View File
@@ -0,0 +1,766 @@
{
"item": {
"itemId": 10000033,
"itemNumber": "TX-300",
"itemName": "★期間限定セール!40%OFF!3650円→2190円!★Tシャツ 半袖 EU製 Emmauela イタリア ミラノ発 エジプト綿100% 通気 フラワーベア クマ柄 可愛い トップス カットソー スウェット プルオーバー シャツ ユニセックス レディース メンズ カップル ペアルック 通学 通勤 夏",
"itemNameEnc": "%A1%FA%B4%FC%B4%D6%B8%C2%C4%EA%A5%BB%A1%BC%A5%EB%A1%AA40%25OFF%A1%AA3650%B1%DF%A2%AA2190%B1%DF%A1%AA%A1%FAT%A5%B7%A5%E3%A5%C4+%C8%BE%C2%B5+EU%C0%BD+Emmauela+%A5%A4%A5%BF%A5%EA%A5%A2+%A5%DF%A5%E9%A5%CE%C8%AF+%A5%A8%A5%B8%A5%D7%A5%C8%CC%CA100%A1%F3+%C4%CC%B5%A4+%A5%D5%A5%E9%A5%EF%A1%BC%A5%D9%A5%A2+%A5%AF%A5%DE%CA%C1+%B2%C4%B0%A6%A4%A4+%A5%C8%A5%C3%A5%D7%A5%B9+%A5%AB%A5%C3%A5%C8%A5%BD%A1%BC+%A5%B9%A5%A6%A5%A7%A5%C3%A5%C8+%A5%D7%A5%EB%A5%AA%A1%BC%A5%D0%A1%BC+%A5%B7%A5%E3%A5%C4+%A5%E6%A5%CB%A5%BB%A5%C3%A5%AF%A5%B9+%A5%EC%A5%C7%A5%A3%A1%BC%A5%B9+%A5%E1%A5%F3%A5%BA+%A5%AB%A5%C3%A5%D7%A5%EB+%A5%DA%A5%A2%A5%EB%A5%C3%A5%AF+%C4%CC%B3%D8+%C4%CC%B6%D0+%B2%C6",
"manageNo": "tx-300",
"genreId": 551180,
"sellType": "normal",
"sellTypeId": 0,
"catchCopy": "Tシャツ 半袖 EU製 Emmauela イタリア ミラノ発 柔らか オーバーサイズ ビッグシルエット カジュアル レジャー スポーツ 日常 定番 ユニセックス カップル ペアルック 通学 通勤 夏",
"description": "<img src=\"https://image.rakuten.co.jp/fafachai/cabinet/13512838/001.jpg\" width=\"100%\"><a href=\"https://item.rakuten.co.jp/fafachai/tx-300/\"><img src=\"https://image.rakuten.co.jp/fafachai/cabinet/13512",
"isMnoFlag": false,
"isShippingFree": false,
"isTelecom": false,
"isSuperSaleDiscount": false,
"taxFlag": true,
"catchCopyEnc": "T%A5%B7%A5%E3%A5%C4+%C8%BE%C2%B5+EU%C0%BD+Emmauela+%A5%A4%A5%BF%A5%EA%A5%A2+%A5%DF%A5%E9%A5%CE%C8%AF+%BD%C0%A4%E9%A4%AB+%A5%AA%A1%BC%A5%D0%A1%BC%A5%B5%A5%A4%A5%BA+%A5%D3%A5%C3%A5%B0%A5%B7%A5%EB%A5%A8%A5%C3%A5%C8+%A5%AB%A5%B8%A5%E5%A5%A2%A5%EB+%A5%EC%A5%B8%A5%E3%A1%BC+%A5%B9%A5%DD%A1%BC%A5%C4+%C6%FC%BE%EF+%C4%EA%C8%D6+%A5%E6%A5%CB%A5%BB%A5%C3%A5%AF%A5%B9+%A5%AB%A5%C3%A5%D7%A5%EB+%A5%DA%A5%A2%A5%EB%A5%C3%A5%AF+%C4%CC%B3%D8+%C4%CC%B6%D0+%B2%C6",
"genreKaimawari": {
"isKaimawariCampaignPeriod": false
},
"installPaymentInfo": {
"installPaymentEnabled": false
},
"timeSale": {
"startDateTime": "2026/07/23 18:39:00",
"endDateTime": "2026/07/27 15:00:59"
},
"media": {
"images": [
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000140.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%柔らか通気フラワーベアクマ柄可愛いトップスカットソースウェットプルオーバーシャツユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000002.jpg",
"alt": "バレンタインバレンタインデー母の日父の日ギフトプレゼント贈り物彼氏彼女女性男性職場入学卒業卒園入園進学就職祝い新生活応援学生中学生高校生大学生新社会人記念品お祝いお返し団体服運動服運動会トレッキングサイクリングキャンプ"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000003.jpg",
"alt": "エジプト綿100%半袖Tシャツメンズレディース男女兼用シンプルデザインコットン100%半袖Tシャツユニセックス通勤通学デイリーウェアTシャツメンズレディース快適な着心地夏コーデ半袖コットンTシャツ男女兼用大人からシニアまで着用可能"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000004.jpg",
"alt": "シンプル半袖Tシャツメンズレディースカジュアルファッション柔らかな肌触り春夏コーデユニセックスTシャツ通学通勤休日のお出かけにおすすめ旅行レジャー散歩に最適"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000005.jpg",
"alt": "男女兼用Tシャツシンプルで個性的なデザイン日常使い夏休み旅行リラックススタイルメンズレディースゴールデンウィークのお出かけコーデコットンTシャツユニセックスカフェ巡りショッピングコーデ"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000006.jpg",
"alt": "半袖Tシャツ父の日ギフトプレゼントにおすすめ母の日ギフトシンプルで着やすい男女兼用半袖Tシャツ敬老の日プレゼントにもおすすめ家族旅行カジュアルスタイル"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000007.jpg",
"alt": "アウトドアキャンプBBQコーデユニセックスTシャツ春夏秋対応ベーシックアイテム在宅ワークルームウェアにも最適シンプルTシャツメンズレディーススポーツ観戦お出かけコーデ軽やかで快適な着心地"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000008.jpg",
"alt": "Tシャツシニア世代にも人気のベーシックデザイン男女兼用通気性の良い快適トップスユニセックスコットンTシャツデート休日コーデにおすすめ半袖Tシャツ街歩き旅行散策スタイル"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000009.jpg",
"alt": "コットンTシャツメンズレディース春のお花見コーデ夏祭り花火大会カジュアルファッション海辺の散歩リゾートスタイル男女兼用コットンTシャツ家族で楽しむ休日コーデ"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000010.jpg",
"alt": "シンプル半袖Tシャツメンズレディース年齢を問わず着用可能柔らかく上質な素材感半袖コットンTシャツカップルコーデペアスタイルにもおすすめ通勤通学オフィスカジュアル対応"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000011.jpg",
"alt": "半袖Tシャツ春夏の定番アイテムレジャードライブ旅行スタイル男女兼用Tシャツ父の日母の日敬老の日ギフト対応シンプルながら個性を演出"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000012.jpg",
"alt": "コットンTシャツメンズレディースオールシーズン活躍ユニセックス半袖Tシャツショッピングデートお出かけ向けエジプト綿100%Tシャツ快適でナチュラルな着心地"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000013.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000014.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000015.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000016.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000017.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000018.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/13525956/t0626.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
},
{
"imageUrl": "https://tshop.r10s.jp/fafachai/cabinet/12147904/101501.jpg",
"alt": "Tシャツ半袖EU製Emmauelaイタリアミラノ発エジプト綿100%トップススウェットプルオーバーシャツカジュアルレジャースポーツ日常定番ユニセックスレディースメンズカップルペアルック通学通勤夏服"
}
]
},
"oldImage": "https://tshop.r10s.jp/fafachai/cabinet/12147800/12220974/12895888/tx3000140.jpg",
"picImageUrl": "@0_mall/fafachai/cabinet/12147800/12220974/12895888/tx3000140.jpg",
"mobileFlag": 1,
"isRestricted": 0
},
"purchase": {
"information": {
"unit": 0,
"showDeliveryExcuse": false
},
"sku": {
"inventoryType": "multiple",
"inventoryTypeId": 2,
"variants": [
{
"variantId": "r-sku00000129",
"selectorValues": [
"D",
"黒",
"M-46"
],
"attributes": [
{
"title": "カラー",
"value": "黒"
},
{
"title": "ブランド名",
"value": "Emmauela"
},
{
"title": "メーカー型番",
"value": "なし"
},
{
"title": "素材(生地・毛糸)",
"value": "綿100%"
},
{
"title": "代表カラー",
"value": "ブラック"
},
{
"title": "サイズ(S/M/L)",
"value": "M"
},
{
"title": "シーズン",
"value": "春夏秋"
}
],
"shippingXRequestQueryInfo": {
"inStockDelvTemplateId": 1,
"includedPostage": false,
"overseasShipping": false,
"individualShipping": false,
"postageSegment1": 0,
"postageSegment2": 0,
"inStockOltTemplateId": 198966,
"shipFromTemplateId": 88485
},
"price": 2190,
"unit": 0,
"deliveryMessageRMS": "1-2日以内に発送・売れ筋商品",
"deliveryMessageShippingX": "12:00までの注文で最短7/28にお届け(あす楽)",
"showDeliveryExcuse": false,
"quantity": 500,
"noshi": false
},
{
"variantId": "r-sku00000128",
"selectorValues": [
"D",
"黒",
"S-38"
],
"attributes": [
{
"title": "カラー",
"value": "黒"
},
{
"title": "ブランド名",
"value": "Emmauela"
},
{
"title": "メーカー型番",
"value": "なし"
},
{
"title": "素材(生地・毛糸)",
"value": "綿100%"
},
{
"title": "代表カラー",
"value": "ブラック"
},
{
"title": "サイズ(S/M/L)",
"value": "S"
},
{
"title": "シーズン",
"value": "春夏秋"
}
],
"shippingXRequestQueryInfo": {
"inStockDelvTemplateId": 1,
"includedPostage": false,
"overseasShipping": false,
"individualShipping": false,
"postageSegment1": 0,
"postageSegment2": 0,
"inStockOltTemplateId": 198966,
"shipFromTemplateId": 88485
},
"price": 2190,
"unit": 0,
"deliveryMessageRMS": "1-2日以内に発送・売れ筋商品",
"deliveryMessageShippingX": "12:00までの注文で最短7/28にお届け(あす楽)",
"showDeliveryExcuse": false,
"quantity": 500,
"noshi": false
},
{
"variantId": "r-sku00000127",
"selectorValues": [
"D",
"黒",
"XS-36"
],
"attributes": [
{
"title": "カラー",
"value": "黒"
},
{
"title": "ブランド名",
"value": "Emmauela"
},
{
"title": "メーカー型番",
"value": "なし"
},
{
"title": "素材(生地・毛糸)",
"value": "綿100%"
},
{
"title": "代表カラー",
"value": "ブラック"
},
{
"title": "サイズ(S/M/L)",
"value": "SS"
},
{
"title": "シーズン",
"value": "春夏秋"
}
],
"shippingXRequestQueryInfo": {
"inStockDelvTemplateId": 1,
"includedPostage": false,
"overseasShipping": false,
"individualShipping": false,
"postageSegment1": 0,
"postageSegment2": 0,
"inStockOltTemplateId": 198966,
"shipFromTemplateId": 88485
},
"price": 2190,
"unit": 0,
"deliveryMessageRMS": "1-2日以内に発送・売れ筋商品",
"deliveryMessageShippingX": "12:00までの注文で最短7/28にお届け(あす楽)",
"showDeliveryExcuse": false,
"quantity": 500,
"noshi": false
}
],
"showInventory": false,
"quantity": 1,
"shippingIdentical": true,
"isShippingFeeIdentical": true,
"isDcpIdentical": true,
"axis": [
{
"key": "Key2",
"label": "タイプ",
"values": [
{
"value": "A",
"label": "A",
"isSoldOut": false
},
{
"value": "B",
"label": "B",
"isSoldOut": false
},
{
"value": "C",
"label": "C",
"isSoldOut": false
},
{
"value": "D",
"label": "D",
"isSoldOut": false
},
{
"value": "E",
"label": "E",
"isSoldOut": false
},
{
"value": "F",
"label": "F",
"isSoldOut": false
}
]
},
{
"key": "Key0",
"label": "カラー",
"values": [
{
"value": "白",
"label": "白",
"isSoldOut": false
},
{
"value": "黒",
"label": "黒",
"isSoldOut": false
},
{
"value": "ピンク",
"label": "ピンク",
"isSoldOut": false
},
{
"value": "グリーン",
"label": "グリーン",
"isSoldOut": false
},
{
"value": "グレー",
"label": "グレー",
"isSoldOut": false
}
]
},
{
"key": "Key1",
"label": "サイズ",
"values": [
{
"value": "XS-36",
"label": "XS-36",
"isSoldOut": false
},
{
"value": "S-38",
"label": "S-38",
"isSoldOut": false
},
{
"value": "M-46",
"label": "M-46",
"isSoldOut": false
},
{
"value": "L-48",
"label": "L-48",
"isSoldOut": false
},
{
"value": "XL-50",
"label": "XL-50",
"isSoldOut": false
},
{
"value": "2XL-52",
"label": "2XL-52",
"isSoldOut": false
}
]
}
],
"deliveryMessageRMS": "1-2日以内に発送・売れ筋商品",
"deliveryMessageShippingX": "12:00までの注文で最短7/28にお届け(あす楽)",
"identicalVariants": {
"backOrderFlag": true,
"doublePrice": true,
"orderQuantityLimit": true,
"shipping": true,
"standardPrice": true,
"tags": true,
"normalDeliveryTime": true,
"dltSenderZipCodeId": true,
"normalDeliveryDateId": true,
"backOrderDeliveryDateId": true,
"noshi": true
}
},
"sellType": {
"normalPurchase": {
"minPrice": 2190,
"preTaxPrice": 2190,
"basketDomain": "https://ts.sp.basket.step.rakuten.co.jp/rms/mall/bss/cartadd/set",
"directDomain": "https://ts.direct.step.rakuten.co.jp/rms/mall/cartAdd/",
"purchaseCondition": "enabled"
}
}
},
"shop": {
"information": {
"shopId": 434651,
"shopUrl": "fafachai",
"shopName": "チャチャショップ",
"shopNameEnc": "%A5%C1%A5%E3%A5%C1%A5%E3%A5%B7%A5%E7%A5%C3%A5%D7",
"taxPriceRoundType": "floor",
"taxRate": 0.1,
"calendar": {
"showShopCalendar": 1,
"eventDates": {
"holiday": [],
"orderOnly": [],
"shippingOnly": []
},
"currentJapanDate": "2026-07-27"
},
"categories": [
{
"name": "トップス",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000002"
},
{
"name": "ボトムス",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000006"
},
{
"name": "ジャケット・アウター",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000007"
},
{
"name": "レザージャケット・ライダース",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000008"
},
{
"name": "上下セット",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000009"
},
{
"name": "バッグ・小物",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000018"
},
{
"name": "その他",
"url": "https://item.rakuten.co.jp/fafachai/c/0000000001"
}
],
"shopReview": {
"rating": 4.68,
"total": 167
},
"is39Shop": true
},
"bundle": {
"state": "waiting"
},
"cart": {
"state": "waiting"
},
"ranking": {
"state": "waiting"
}
},
"review": {
"shop": {
"rating": 4.68,
"total": 167
},
"item": {
"totalRating": 4.79,
"count": 29,
"writeReviewFlag": true,
"isReviewList": true,
"reviews": [
{
"rating": 4,
"comment": "170センチ62キロMサイズ購入、いつものオーバーサイズの少し大きめに感じますが、生地もしっかりしていますし、何よりプリントが気に入り購入させて頂きました。今度は違うパターンを欲しくなってます。",
"user": "かつどん7503さん",
"date": "2026/07/24",
"shopReply": "この度は当店をご利用いただき、また丁寧なレビューをお寄せいただき誠にありがとうございます。\nサイズ感や生地について詳しくご感想をお聞かせいただき、大変参考になります。生地のしっかりとした品質や、プリントデザインをお気に召していただけたとのこと、スタッフ一同大変嬉しく拝見いたしました。\nまた、「今度は違うパターンも欲しい」とのお言葉をいただき、大変光栄に存じます。ぜひお好みに合うデザインを見つけていただけましたら幸いです。\nこれからもご満足いただける商品をお届けできるよう努めてまいりますので、今後ともどうぞよろしくお願いいたします。\nまたのご利用を心よりお待ちしております。",
"shopReplyDate": "2026/07/24"
},
{
"rating": 5,
"comment": "以前黒のTシャツを購入して肌触りが良く可愛いいデザインだったので再度白で購入しました?",
"user": "一服太郎さん",
"date": "2026/07/13",
"shopReply": "この度はリピートでのご購入、そして嬉しいレビューをご投稿いただき、誠にありがとうございます。\n以前ご購入いただいたブラックに続き、今回はホワイトもお選びいただけたとのこと、大変嬉しく思っております。\n肌触りやデザインをお気に召していただき、再び当店の商品をお選びいただけたことは、スタッフ一同にとって何よりの励みです。\nこれからもご満足いただける商品とサービスをお届けできるよう努めてまいります。\n今後とも当店をどうぞよろしくお願いいたします。",
"shopReplyDate": "2026/07/13"
},
{
"rating": 4,
"comment": "このシリーズが私も子供もお気に入りでして、パーカーも持っています。生地もしっかりしてるし、着心地もいい、絵もかわいくて、大事にしたいと思います。",
"user": "購入者さん",
"date": "2026/06/29",
"shopReply": "この度は当店をご利用いただき、また心温まるレビューをお寄せいただきまして誠にありがとうございます。\nこちらのシリーズをお子様とご一緒にお気に召していただき、パーカーもご愛用いただいているとのこと、大変嬉しく拝見いたしました。\n生地感や着心地、デザインにつきましてもご満足いただけているようで、スタッフ一同大変励みになります。大切にご愛用いただけるとのお言葉、心より感謝申し上げます。\n今後もご期待に添える商品をご提供できるよう努めてまいります。\nまたのご利用を心よりお待ちしております。誠にありがとうございました。",
"shopReplyDate": "2026/07/02"
}
]
}
},
"shipping": {
"shippingByDestination": null,
"informationFromServer": {
"prefectureId": 13,
"methodId": 1,
"carrierId": "01",
"startDate": "2026-07-28T08:00:00.000+09:00",
"cutOffDateTime": "2026-07-27T12:00:00.000+09:00",
"isNextDayDelivery": true,
"isCutOffToday": true,
"carrierNonSupportedMethods": [],
"shippingFee": 0,
"isIndividualShipping": false,
"isAsuraku": false,
"isShippingFree": true,
"is39Shop": false,
"isDcp": true,
"isRslItem": false,
"isRmsV1": false,
"freeShippingThreshold": 3980,
"requestQuery": {
"marketplaceId": "JP",
"calculationMode": "CHEAPEST",
"resultType": "DATE_FEE",
"shippingUnits": {
"request": {
"shipTo": {
"level1": "JP",
"level2": "13",
"postalCode": null
},
"shopShippingUnits": {
"shippingRequest": {
"shopId": "434651",
"items": {
"10000033:r-sku00000129": {
"data": {
"price": 2190,
"inventory": 1,
"includedPostage": false,
"deliverySetId": null,
"customShipping": {
"fixedFee": null,
"postageSegment1": 0,
"postageSegment2": 0,
"customTariffId": null
},
"individualShipping": false,
"asuraku": null,
"handlingTime": {
"inStockOltTemplateId": 198966,
"noStockOltTemplateId": null,
"shipFromTemplateId": 88485,
"inStockDelvTemplateId": 1,
"noStockDelvTemplateId": null
}
},
"quantity": 1
}
}
}
}
}
},
"calculationSettings": {
"deferredProcessingRequired": false,
"showAvailableThresholdDiscounts": true,
"showCalculationGroups": true
}
},
"overseasShipping": false
},
"shippingXRequestQueryInfo": {
"prefectureId": 13,
"is39Shop": false,
"includedPostage": false,
"individualShipping": false,
"postageSegment1": 0,
"postageSegment2": 0,
"overseasShipping": false,
"inStockOltTemplateId": 198966,
"inStockDelvTemplateId": 1,
"shipFromTemplateId": 88485
},
"information": null,
"bulkShipping": null,
"freeShipping": null,
"shippingCarriers": {
"10": {
"ja-JP": "新潟運輸",
"en-US": "Niigata Transport"
},
"11": {
"ja-JP": "中越運送",
"en-US": "Chuetsu Transport"
},
"12": {
"ja-JP": "岡山県貨物運送",
"en-US": "Okayamaken Freight Transport"
},
"13": {
"ja-JP": "久留米運送",
"en-US": "Kurume Transport"
},
"14": {
"ja-JP": "山陽自動車運送",
"en-US": "Sanyo Jidosha Transport"
},
"15": {
"ja-JP": "NXトランスポート",
"en-US": "NX Transport"
},
"16": {
"ja-JP": "エコ配",
"en-US": "Ecohai"
},
"17": {
"ja-JP": "EMS",
"en-US": "EMS"
},
"18": {
"ja-JP": "DHL",
"en-US": "DHL"
},
"19": {
"ja-JP": "FedEx",
"en-US": "FedEx"
},
"20": {
"ja-JP": "UPS",
"en-US": "UPS"
},
"21": {
"ja-JP": "日本通運",
"en-US": "Nippon Express"
},
"22": {
"ja-JP": "TNT",
"en-US": "TNT"
},
"23": {
"ja-JP": "OCS",
"en-US": "OCS"
},
"24": {
"ja-JP": "USPS",
"en-US": "USPS"
},
"25": {
"ja-JP": "SFエクスプレス",
"en-US": "SF Express"
},
"26": {
"ja-JP": "Aramex",
"en-US": "Aramex"
},
"27": {
"ja-JP": "SGHグローバル・ジャパン",
"en-US": "SGH Global Japan"
},
"28": {
"ja-JP": "Rakuten EXPRESS",
"en-US": "Rakuten EXPRESS"
},
"29": {
"ja-JP": "日本郵便 楽天倉庫出荷",
"en-US": "Japan Post from Rakuten Warehouse"
},
"30": {
"ja-JP": "ヤマト運輸 クロネコゆうパケット",
"en-US": "Yamato Kuroneko Yu-Packet"
},
"31": {
"ja-JP": "名鉄NX運輸",
"en-US": "Meitetsu NX Transport"
},
"00": {
"ja-JP": "その他",
"en-US": "Other"
},
"01": {
"ja-JP": "ヤマト運輸",
"en-US": "Yamato Transport"
},
"02": {
"ja-JP": "佐川急便",
"en-US": "Sagawa Express"
},
"03": {
"ja-JP": "日本郵便",
"en-US": "Japan Post"
},
"04": {
"ja-JP": "西濃運輸",
"en-US": "Seino Transportation"
},
"05": {
"ja-JP": "セイノースーパーエクスプレス",
"en-US": "Seino Super Express"
},
"06": {
"ja-JP": "福山通運",
"en-US": "Fukuyama Transporting"
},
"07": {
"ja-JP": "名鉄運輸",
"en-US": "Meitetsu Transport"
},
"08": {
"ja-JP": "トナミ運輸",
"en-US": "Tonami Transport"
},
"09": {
"ja-JP": "第一貨物",
"en-US": "Daiichi Freight System"
}
},
"identicalShippingFee": null,
"identicalDcp": null
},
"breadcrumbs": {
"genreBreadcrumbs": [
{
"name": "メンズファッション",
"url": "https://www.rakuten.co.jp/category/551177/"
},
{
"name": "トップス",
"url": "https://www.rakuten.co.jp/category/110765/"
},
{
"name": "Tシャツ・カットソー",
"url": "https://www.rakuten.co.jp/category/551180/"
}
]
}
}
File diff suppressed because it is too large Load Diff
+478
View File
@@ -0,0 +1,478 @@
<!doctype html><html><head><meta charset='utf-8'><script type="application/ld+json">
{"@context":"http://schema.org/","@type":"Product","name":"NintendoSwitch ONE PIECE 海賊無双4","image":"https://img.fril.jp/img/844877033/m/2914810081.jpg?1785071831","description":"初めに大変恐縮では御座いますが、他のサイトでも出品していますので、購入希望の方は先にコメントにて在庫の確認をお願い致します。\n\n「ONE PIECE 海賊無双4」\n\nバンダイナムコエンターテインメント\n型番:HAC-P-ATLZA\n\n本作は、「リアルなONE PIECEの戦場体験」をコンセプトに、アクション中に破壊される建物や土煙が漂う空気感など「ONE PIECEの戦場体験」を追及! 従来の「海賊無双」では出来なかった「破壊アクション」「空中無双アクション」「フォルムチェンジ」などの新要素を盛り込むことで、これまで以上に爽快な…\n\n#バンダイナムコエンターテインメント\n#HAC-P-ATLZA\n#エンタメ/ホビー\n#ゲームソフト/ゲーム機本体\n#家庭用ゲームソフト\n#NintendoSwitchワンピース海賊無双4\n#ONEPIECE海賊無双4","offers":{"@type":"Offer","priceCurrency":"JPY","price":2460,"priceValidUntil":"2027-01-27","itemCondition":"http://schema.org/UsedCondition","availability":"http://schema.org/InStock","seller":{"@type":"Organization","name":"naonao"}},"brand":{"@type":"Thing","name":"BANDAI NAMCO Entertainment"}}
</script></head><body><a data-rat-cp-item_condition="目立った傷や汚れなし" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="北海道" data-rat-cp-brand_id="6454"></a><div class="sp-slide"><img src="https://img.fril.jp/img/844877033/l/2914810081.jpg?1785071831" class="sp-image" alt="BANDAI NAMCO Entertainment(バンダイナムコエンターテインメント)のNintendoSwitch ONE PIECE 海賊無双4 エンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品写真"><img src="https://img.fril.jp/img/844877033/l/2914810083.jpg?1785071831" class="sp-image" alt="BANDAI NAMCO Entertainment(バンダイナムコエンターテインメント)のNintendoSwitch ONE PIECE 海賊無双4 エンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品写真"></div><section class="item-info row">
<div class="item-info__header">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="item-info__icons clearfix">
<span class="item__icon postage-included"><i class="icon_item_tag"></i>送料込</span>
<span class="item__icon anonymous">匿名配送</span>
<span class="item__icon request-required">すぐに購入可</span>
</div>
<h1 class="item__name">NintendoSwitch ONE PIECE 海賊無双4</h1>
<p><a onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_brand', {'dimension1': '6454'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_brand&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}" href="https://fril.jp/brand/6454">BANDAI NAMCO Entertainment</a></p>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<!-- 通常価格 -->
<p class="item__value_area">
<span class="item__price"><span class="item__currency-symbol">¥</span>2,460</span>
<span class="item__postage">送料込</span>
</p>
</div>
</div>
</div>
<!-- 選択サイズ表示 PC用 -->
<!-- 選択サイズ表示 PC用ここまで -->
<div class="reduction-status ft-new-position">
</div>
<section class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="btn-buy-fixed clearfix">
<p class="sell-price-fixed">
<span class="item__value"><span class="currency-symbol">¥</span>2,460</span>
<span class="item__icon postage-included">送料込</span>
</p>
<div class="reduction__section mbt__8 pc__only">
</div>
<!-- pc用 -->
<p class="sell-btn-fixed">
<a class="ga-class ga-item-buybutton btn btn-primary btn-large btn_buy" href="https://fril.jp/users/sign_up?l-id=cmn_oth_p_buy_b_measure&amp;ref_action=btn_buy">購入に進む</a>
</p>
</div>
<div class="buttons-box">
<div class="buttons-box-cell">
<div class="like_button_set">
<div class="ga-class ga-item-likebutton like_button">
<a class="list-icon-like list-icon-button" href="#" data-toggle="modal" data-target="#directSignupModal">
<i class="list-icon-like icon_tl_heart_line"></i> <span>いいね 1件</span>
</a>
</div>
</div>
</div>
<div class="buttons-box-cell sp">
<a class="go-to-comment-button" href="#" data-toggle="modal" data-target="#directSignupModal">
<i class="icon_tl_comment_line"></i>
<span>コメント 0件</span>
</a>
</div>
</div>
</div>
</div>
<div class="only__pc">
<div class="safety-badges" data-test="safety-badges">
<ul class="safety-badges__top">
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/identification-user-outline-c1ea65e83d0b6221d759eefa62133ae75dcfb5cb67f8d9a875d9758017430076.svg">
<span class="safety-badges__caption safety-badges__caption--normal">本人確認済</span>
</li>
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/support-agent-a6db00f6a0de9b3279109b0ed5aa1d18a92ee5dba689782938628a788cd4f07a.svg">
<span class="safety-badges__caption safety-badges__caption--normal">紛失補償有</span>
</li>
</ul>
<div class="safety-badges__bottom">
<a target="_blank" rel="noopener noreferrer" class="ato-kantei__text-link ga-class ga-safety" href="https://fril.jp/safety">
ラクマ安心・安全への取り組み
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="currentColor"></path>
</svg>
</a> </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const clickItemAuthenticityLpTarget = document.querySelector('[data-click-item-authenticity-lp]');
const clickItemAuthenticityLpParams = {"event":"fireEvent","eventData":{"event_name":"","event_parameter":{"view":0,"event_label":"click_item_authenticity_lp"},"commerce_data":null}};
clickItemAuthenticityLpTarget?.addEventListener('click', () => {
if (!clickItemAuthenticityLpTarget.dataset.listenerAdded) {
window.dataLayer.push(clickItemAuthenticityLpParams);
clickItemAuthenticityLpTarget.dataset.listenerAdded = true;
};
});
});
</script>
</div>
<div class="hidden-xs">
<div class="item__description only__pc">
<h4>商品説明</h4>
<div class="item__description__line-limited">
<span> 初めに大変恐縮では御座いますが、他のサイトでも出品していますので、購入希望の方は先にコメントにて在庫の確認をお願い致します。<br><br>「ONE&nbsp;PIECE&nbsp;海賊無双4」<br><br>バンダイナムコエンターテインメント<br>型番:HAC-P-ATLZA<br><br>本作は、「リアルなONE&nbsp;PIECEの戦場体験」をコンセプトに、アクション中に破壊される建物や土煙が漂う空気感など「ONE&nbsp;PIECEの戦場体験」を追及!&nbsp;&nbsp;従来の「海賊無双」では出来なかった「破壊アクション」「空中無双アクション」「フォルムチェンジ」などの新要素を盛り込むことで、これまで以上に爽快な…<br><br>#バンダイナムコエンターテインメント<br>#HAC-P-ATLZA<br>#エンタメ/ホビー<br>#ゲームソフト/ゲーム機本体<br>#家庭用ゲームソフト<br>#NintendoSwitchワンピース海賊無双4<br>#ONEPIECE海賊無双4 </span>
</div>
<div class="time_ago">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14C4.6915 14 2 11.3085 2 8C2 4.6915 4.6915 2 8 2C11.3085 2 14 4.6915 14 8C14 11.3085 11.3085 14 8 14ZM8 1C4.134 1 1 4.134 1 8C1 11.866 4.134 15 8 15C11.866 15 15 11.866 15 8C15 4.134 11.866 1 8 1Z" fill="#757575"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3032 9.95944L7.50018 8.32944V3.49994H8.50018V7.67044L11.6967 9.04044L11.3032 9.95944Z" fill="#757575"></path>
</svg>
約4時間前
</div>
</div>
</div>
</div>
</section>
<div class="reduction__section mtp__16 sp__only">
</div>
<!-- sp用 -->
<div class="only__sp">
<div class="safety-badges" data-test="safety-badges">
<ul class="safety-badges__top">
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/identification-user-outline-c1ea65e83d0b6221d759eefa62133ae75dcfb5cb67f8d9a875d9758017430076.svg">
<span class="safety-badges__caption safety-badges__caption--normal">本人確認済</span>
</li>
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/support-agent-a6db00f6a0de9b3279109b0ed5aa1d18a92ee5dba689782938628a788cd4f07a.svg">
<span class="safety-badges__caption safety-badges__caption--normal">紛失補償有</span>
</li>
</ul>
<div class="safety-badges__bottom">
<a target="_blank" rel="noopener noreferrer" class="ato-kantei__text-link ga-class ga-safety" href="https://fril.jp/safety">
ラクマ安心・安全への取り組み
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="currentColor"></path>
</svg>
</a> </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const clickItemAuthenticityLpTarget = document.querySelector('[data-click-item-authenticity-lp]');
const clickItemAuthenticityLpParams = {"event":"fireEvent","eventData":{"event_name":"","event_parameter":{"view":0,"event_label":"click_item_authenticity_lp"},"commerce_data":null}};
clickItemAuthenticityLpTarget?.addEventListener('click', () => {
if (!clickItemAuthenticityLpTarget.dataset.listenerAdded) {
window.dataLayer.push(clickItemAuthenticityLpParams);
clickItemAuthenticityLpTarget.dataset.listenerAdded = true;
};
});
});
</script>
</div>
<section class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="visible-xs">
<div class="item__description only__sp">
<h4 class="mtp__0">商品説明</h4>
<div class="item__description__line-limited">
<span> 初めに大変恐縮では御座いますが、他のサイトでも出品していますので、購入希望の方は先にコメントにて在庫の確認をお願い致します。<br><br>「ONE&nbsp;PIECE&nbsp;海賊無双4」<br><br>バンダイナムコエンターテインメント<br>型番:HAC-P-ATLZA<br><br>本作は、「リアルなONE&nbsp;PIECEの戦場体験」をコンセプトに、アクション中に破壊される建物や土煙が漂う空気感など「ONE&nbsp;PIECEの戦場体験」を追及!&nbsp;&nbsp;従来の「海賊無双」では出来なかった「破壊アクション」「空中無双アクション」「フォルムチェンジ」などの新要素を盛り込むことで、これまで以上に爽快な…<br><br>#バンダイナムコエンターテインメント<br>#HAC-P-ATLZA<br>#エンタメ/ホビー<br>#ゲームソフト/ゲーム機本体<br>#家庭用ゲームソフト<br>#NintendoSwitchワンピース海賊無双4<br>#ONEPIECE海賊無双4 </span>
</div>
<div class="time_ago">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14C4.6915 14 2 11.3085 2 8C2 4.6915 4.6915 2 8 2C11.3085 2 14 4.6915 14 8C14 11.3085 11.3085 14 8 14ZM8 1C4.134 1 1 4.134 1 8C1 11.866 4.134 15 8 15C11.866 15 15 11.866 15 8C15 4.134 11.866 1 8 1Z" fill="#757575"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3032 9.95944L7.50018 8.32944V3.49994H8.50018V7.67044L11.6967 9.04044L11.3032 9.95944Z" fill="#757575"></path>
</svg>
約4時間前
</div>
</div>
</div>
</div>
</section>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="item-status ft-new-position">
<h4 class="mtp__0">商品情報</h4>
<table class="item__details">
<tbody><tr>
<th><i class="icon-status icon_top_category_etc item-status-category"></i> カテゴリ</th>
<td>
<a href="https://fril.jp/category/10007">エンタメ/ホビー</a><br>
<a href="https://fril.jp/category/786">ゲームソフト/ゲーム機本体</a><br>
<a href="https://fril.jp/category/788">家庭用ゲームソフト</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_category_tops item-status-size"></i> サイズ</th>
<td>なし</td>
</tr>
<tr>
<th><i class="icon-status icon_item_brand item-status-brand"></i> ブランド</th>
<td>
<a href="https://fril.jp/brand/6454">BANDAI NAMCO Entertainment</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_item_status item-status-status"></i> 商品の状態</th>
<td>目立った傷や汚れなし</td>
</tr>
<tr>
<th><i class="icon-status icon_item_tag item-status-carriage"></i> 配送料の負担</th>
<td>送料込</td>
</tr>
<tr>
<th><i class="icon-status icon_item_trac item-status-delivery_method"></i> 配送方法</th>
<td>かんたんラクマパック(ヤマト運輸)</td>
</tr>
<tr>
<th><i class="icon-status icon_item_calendar item-status-delivery_date"></i> 発送日の目安</th>
<td>支払い後、1~2日で発送</td>
</tr>
<tr>
<th><i class="icon-status icon_item_pin item-status-delivery_area"></i> 発送元の地域</th>
<td>北海道</td>
</tr>
</tbody></table>
<div class="text-right mbt__24 mr__16"><a href="https://fril.jp/guide/howto" target="_blank" id="btn_guide" class="text--link text--b" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_purchase_flow');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_purchase_flow&quot;},&quot;commerce_data&quot;:null}}">購入の流れを確認する</a></div>
<div class="row sharebuttons">
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a href="https://twitter.com/intent/tweet?hashtags=BANDAINAMCOEntertainment%2C%E3%83%90%E3%83%B3%E3%83%80%E3%82%A4%E3%83%8A%E3%83%A0%E3%82%B3%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88%2C%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BD%E3%83%95%E3%83%88%2F%E3%82%B2%E3%83%BC%E3%83%A0%E6%A9%9F%E6%9C%AC%E4%BD%93%2C%E5%AE%B6%E5%BA%AD%E7%94%A8%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BD%E3%83%95%E3%83%88%2C%E3%83%A9%E3%82%AF%E3%83%9E%2C%E3%83%95%E3%83%AA%E3%83%9E%E3%82%A2%E3%83%97%E3%83%AA&amp;text=%E3%80%8ENintendoSwitch+ONE+PIECE+%E6%B5%B7%E8%B3%8A%E7%84%A1%E5%8F%8C4%28%C2%A52%2C460%29%E3%80%8F%E3%82%92%E3%83%A9%E3%82%AF%E3%83%9E%E3%81%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%EF%BC%81&amp;url=https%3A%2F%2Fitem.fril.jp%2F4aca1d6db3e422f3a251a8a8b61e1eff" class="ga-class ga-item-sharebutton btn btn-block x-twitter" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_share_twitter', {'dimension1': '844877033'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_twitter&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}"><img alt="" class="lazy" data-original="https://asset.fril.jp/assets/new_web/icon-x-166df5e59867c52d69f791e2566140922a1e521dc281b69eb59e7438165e3dcc.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> ポスト</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-x-166df5e59867c52d69f791e2566140922a1e521dc281b69eb59e7438165e3dcc.png"></noscript>
</div>
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a href="https://www.facebook.com/share.php?u=https://item.fril.jp/4aca1d6db3e422f3a251a8a8b61e1eff" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); ga('send', 'event', 'ui_action', 'search', 'click_item_share_facebook', {'dimension1': '844877033'}); return false;" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_facebook&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}" class="ga-class ga-item-sharebutton btn btn-block facebook"><img class="lazy" alt="" data-original="https://asset.fril.jp/assets/new_web/icon-facebook-1a25d5b26a65896fb90c6b38503ad2bfcde84f78b66d670347d212018781b2b5.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> シェア</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-facebook-1a25d5b26a65896fb90c6b38503ad2bfcde84f78b66d670347d212018781b2b5.png"></noscript>
</div>
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a target="_blank" href="https://line.me/R/msg/text/?NintendoSwitch%20ONE%20PIECE%20%E6%B5%B7%E8%B3%8A%E7%84%A1%E5%8F%8C4%20%7C%20https%3A%2F%2Fitem.fril.jp%2F4aca1d6db3e422f3a251a8a8b61e1eff" rel="noreferrer" class="ga-class ga-item-sharebutton btn btn-block line" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_share_line', {'dimension1': '844877033'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_line&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}"><img alt="" class="lazy" data-original="https://asset.fril.jp/assets/new_web/icon-line-6db6ecdc05f67f632ec40c964574e0a98bbbd6739e69beeffd13c3ac6385f2d7.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> LINEで送る</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-line-6db6ecdc05f67f632ec40c964574e0a98bbbd6739e69beeffd13c3ac6385f2d7.png"></noscript>
</div>
</div>
<!--PC C--><!-- /7727/Rakuma/Item/MiddleRect1 -->
<div class="googleAdsense-box hidden-xs hidden-sm" data-test-g-ad-md-react1-pc="">
<div id="div-gpt-ad-1566432529257-0">
<script>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1566432529257-0'); });
</script>
</div>
</div>
<h4>出品者情報</h4>
<!-- ショップ情報 -->
<div class="row header-shopinfo shopinfo-area">
<div class="icon_and_shop_info_and_verifed-badge">
<a class="shopinfo-wrapverified-badge-item shop_link clearfix" href="https://fril.jp/shop/83b56a796a72011dc58b6e469270dfb7" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_shop'); window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_item_shop" data-ratevent="click" data-ratparam="all" data-rat-cp-content_group="商品詳細" data-rat-cp-pagetitle="BANDAI NAMCO Entertainment - NintendoSwitch ONE PIECE 海賊無双4の通販 by naonao's shop | バンダイナムコエンターテインメントならラクマ" data-rat-cp-title="商品詳細画面(通常・ディスプレイ)" data-rat-cp-screen_url="https://fril.jp/item/4aca1d6db3e422f3a251a8a8b61e1eff" data-rat-cp-authenticity_item_status="not_covered" data-rat-cp-brand_id="6454" data-rat-cp-item_condition="目立った傷や汚れなし" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="北海道" data-rat-cp-item_type="1" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A"></a>
<div class="col-lg-2 col-md-2 col-sm-1 col-xs-2 header-shopinfo__user-icon user-icon-fit">
<img class="user img-circle img-responsive lazy" alt="" data-original="https://img.fril.jp/user/3850223/s/3850223.jpg?1545873036" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
<noscript><img alt="" src="https://img.fril.jp/user/3850223/s/3850223.jpg?1545873036"></noscript>
</div>
<div class="col-lg-9 col-md-9 col-sm-10 col-xs-9 header-shopinfo__shop_name_and_user_name">
<p class="header-shopinfo__shop-name clearfix"><span>naonao's shop</span></p>
<p class="header-shopinfo__user-name">naonao</p>
<div class="header-shopinfo__verified-badge-item">
<img class="header-shopinfo--iverified-icon" data-original="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png" src="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png">
本人確認済
<a href="https://faq.fril.jp/17420/" target="_blank" rel="noopener noreferrer" data-test="verified_badge_shop" onclick="gtmClickBadgeStatus('本人確認済')">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.11101 2.17971C5.26216 1.41054 6.61553 1 8 1C9.85652 1 11.637 1.7375 12.9497 3.05025C14.2625 4.36301 15 6.14348 15 8C15 9.38447 14.5895 10.7378 13.8203 11.889C13.0511 13.0401 11.9579 13.9373 10.6788 14.4672C9.3997 14.997 7.99224 15.1356 6.63437 14.8655C5.2765 14.5954 4.02922 13.9287 3.05026 12.9497C2.07129 11.9708 1.4046 10.7235 1.13451 9.36563C0.86441 8.00776 1.00303 6.6003 1.53285 5.32122C2.06266 4.04213 2.95987 2.94888 4.11101 2.17971ZM4.66658 12.9888C5.65328 13.6481 6.81332 14 8 14C9.5913 14 11.1174 13.3679 12.2426 12.2426C13.3679 11.1174 14 9.5913 14 8C14 6.81331 13.6481 5.65327 12.9888 4.66658C12.3295 3.67988 11.3925 2.91085 10.2961 2.45672C9.19975 2.0026 7.99335 1.88378 6.82946 2.11529C5.66558 2.3468 4.59648 2.91824 3.75736 3.75736C2.91825 4.59647 2.3468 5.66557 2.11529 6.82946C1.88378 7.99334 2.0026 9.19974 2.45673 10.2961C2.91085 11.3925 3.67989 12.3295 4.66658 12.9888ZM7.17999 8.77002V9.11502L8.80999 9.13002V8.84002C8.80878 8.66485 8.85361 8.49242 8.93999 8.34002C9.09209 8.12732 9.2819 7.9443 9.49999 7.80002C9.81046 7.58848 10.0784 7.3205 10.29 7.01002C10.4803 6.712 10.5762 6.36345 10.565 6.01002C10.5729 5.63781 10.4684 5.27186 10.265 4.96002C10.0494 4.65554 9.75817 4.41254 9.41999 4.25502C9.0291 4.07854 8.60378 3.99142 8.17499 4.00002C7.67506 3.98766 7.17897 4.0903 6.72499 4.30002C6.33811 4.49475 5.98926 4.75723 5.69499 5.07502L6.45499 6.30002C6.63675 6.05331 6.86009 5.84012 7.11499 5.67002C7.37663 5.49526 7.68539 5.40455 7.99999 5.41002C8.23263 5.38767 8.4662 5.44211 8.66499 5.56502C8.74383 5.62176 8.80744 5.69708 8.85018 5.7843C8.89292 5.87153 8.91346 5.96795 8.90999 6.06502C8.91542 6.24353 8.86279 6.41898 8.75999 6.56502C8.59368 6.77098 8.39631 6.94979 8.17499 7.09502C7.85377 7.29967 7.58356 7.57501 7.38499 7.90002C7.24695 8.16905 7.17659 8.46767 7.17999 8.77002ZM7.58634 11.9257C7.7178 11.9781 7.8585 12.0034 7.99999 12C8.14303 12.0039 8.28538 11.9788 8.41854 11.9264C8.55169 11.874 8.67292 11.7953 8.77499 11.695C8.87865 11.5989 8.96077 11.482 9.01593 11.3518C9.07109 11.2217 9.09804 11.0813 9.09499 10.94C9.09875 10.7979 9.07215 10.6566 9.01697 10.5255C8.96179 10.3944 8.87929 10.2767 8.77499 10.18C8.56721 9.97978 8.28851 9.87009 7.99999 9.87502C7.85868 9.87308 7.71839 9.89902 7.58712 9.95136C7.45585 10.0037 7.33619 10.0814 7.23499 10.18C7.13068 10.2767 7.04818 10.3944 6.993 10.5255C6.93782 10.6566 6.91122 10.7979 6.91499 10.94C6.91194 11.0813 6.93888 11.2217 6.99404 11.3518C7.0492 11.482 7.13132 11.5989 7.23499 11.695C7.33536 11.7948 7.45487 11.8732 7.58634 11.9257Z"></path>
</svg>
</a>
</div>
</div>
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 header-shopinfo__chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
<div class="header-shopinfo__review_counts user-review-wrap">
<a href="https://fril.jp/shop/83b56a796a72011dc58b6e469270dfb7/review" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_review');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop_review&quot;,&quot;screen_title&quot;:&quot;商品詳細画面(通常・ディスプレイ)&quot;,&quot;screen_name&quot;:&quot;item_detail&quot;},&quot;commerce_data&quot;:null}}">
<span>取引の評価</span>
<div class="review-list">
<ul class="list-inline">
<li>
<i class="icon-sun icon_review_sun"></i><span>456</span>
</li>
<li>
<i class="icon-cloud icon_review_cloud"></i><span>5</span>
</li>
<li>
<i class="icon-rain icon_review_rain"></i><span>0</span>
</li>
</ul>
<div class="review-chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
</a>
</div>
<div class="user-bio-wrap seller__detail--link shop__profile">
<div class="shop__profile__line-limited">
★数あるショップの中からご覧頂き、誠に有難うございます。<br><br>★★★‼️フォロー大歓迎‼️★★★<br><br>★基本的に送料無料・匿名配送で、ネコポス、小~中(コンパクト)中~大(宅急便)での発送の為、お値下げ出来ない商品も御座いますので、その旨、ご了承下さい。<br><br>★フィギュアに着きましては、購入・獲得してから未開封の物が多いので、開封後の初期不良に着きましては責任を負いかねますので何卒ご理解頂きますようお願い致します。<br><br>★洋服等は写真の写り方によってお色の違いがある事が御座いますので、ご心配の方はコメントにて最初にお色の確認をお願い致します。到着後の思っていたのと色が違う等の返品はご遠慮願います。<br><br>★評価の悪い方、マナーの悪い方はコメントなく購入の場合、トラブル防止の為、お取引をお断りさせて頂く場合が御座います。ご理解・ご了承願います。<br><br>★出品させて頂いています商品に関しましては到着後にすり替え防止のため、すべての商品に付きましてNC.NRでお願い致します。<br><br>★カード類に付きましては、すり替え防止と致しまして、お届け後の返品・返金はご遠慮願います。<br>ご不安な方は購入をお控え下さい。<br>初期傷等、素人ですので見落し有る場合が御座います。ご不安な方は御遠慮下さい。<br><br>★発送後のトラブルに関しては責任は負いかねます。<br><br>★購入後は速やかにご入金お願い致します<br><br>★商品を出来るだけお安くお出しさせて頂くため、大きいもの等はコンパクトに圧縮等をさせて頂きます。<br><br>★コンビニ支払い等をご利用の方で期日内までにご入金頂けないかたはトラブル防止の為、購入をご遠慮願います。支払期日を過ぎましたら、キャンセル申請をさせて頂きます。<br><br>★出品しています商品に関しましては基本的に先に購入した方優先とさせて頂きますので、ご了承下さい。<br><br>★商品受け取り後は速やかにご評価願います。<br><br>★★突然不定期にてお値下げ致します。又、突然元の値段に戻すことも御座いますがご了承下さい。
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div id="comments" class="comment-area-wrap">
<h4>コメント</h4>
<div class="comment-input">
<p><span id="btn_comment" class="comment-input__btn comment-input__btn--submit" data-toggle="modal" data-target="#directSignupModal">商品について質問する</span></p>
</div>
</div>
<div class="comment-area">
<div class="comment-area-inner">
<div id="comment-list">
</div>
<p class="commentmore-box">
<a href="#comment-list">すべてのコメントを見る<i class="icon_tl_cursor_down"></i></a>
</p>
</div>
</div>
</div>
</div>
</section><div class="item-status ft-new-position">
<h4 class="mtp__0">商品情報</h4>
<table class="item__details">
<tbody><tr>
<th><i class="icon-status icon_top_category_etc item-status-category"></i> カテゴリ</th>
<td>
<a href="https://fril.jp/category/10007">エンタメ/ホビー</a><br>
<a href="https://fril.jp/category/786">ゲームソフト/ゲーム機本体</a><br>
<a href="https://fril.jp/category/788">家庭用ゲームソフト</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_category_tops item-status-size"></i> サイズ</th>
<td>なし</td>
</tr>
<tr>
<th><i class="icon-status icon_item_brand item-status-brand"></i> ブランド</th>
<td>
<a href="https://fril.jp/brand/6454">BANDAI NAMCO Entertainment</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_item_status item-status-status"></i> 商品の状態</th>
<td>目立った傷や汚れなし</td>
</tr>
<tr>
<th><i class="icon-status icon_item_tag item-status-carriage"></i> 配送料の負担</th>
<td>送料込</td>
</tr>
<tr>
<th><i class="icon-status icon_item_trac item-status-delivery_method"></i> 配送方法</th>
<td>かんたんラクマパック(ヤマト運輸)</td>
</tr>
<tr>
<th><i class="icon-status icon_item_calendar item-status-delivery_date"></i> 発送日の目安</th>
<td>支払い後、1~2日で発送</td>
</tr>
<tr>
<th><i class="icon-status icon_item_pin item-status-delivery_area"></i> 発送元の地域</th>
<td>北海道</td>
</tr>
</tbody></table>
<div class="text-right mbt__24 mr__16"><a href="https://fril.jp/guide/howto" target="_blank" id="btn_guide" class="text--link text--b" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_purchase_flow');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_purchase_flow&quot;},&quot;commerce_data&quot;:null}}">購入の流れを確認する</a></div>
<div class="row sharebuttons">
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a href="https://twitter.com/intent/tweet?hashtags=BANDAINAMCOEntertainment%2C%E3%83%90%E3%83%B3%E3%83%80%E3%82%A4%E3%83%8A%E3%83%A0%E3%82%B3%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%86%E3%82%A4%E3%83%B3%E3%83%A1%E3%83%B3%E3%83%88%2C%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BD%E3%83%95%E3%83%88%2F%E3%82%B2%E3%83%BC%E3%83%A0%E6%A9%9F%E6%9C%AC%E4%BD%93%2C%E5%AE%B6%E5%BA%AD%E7%94%A8%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%BD%E3%83%95%E3%83%88%2C%E3%83%A9%E3%82%AF%E3%83%9E%2C%E3%83%95%E3%83%AA%E3%83%9E%E3%82%A2%E3%83%97%E3%83%AA&amp;text=%E3%80%8ENintendoSwitch+ONE+PIECE+%E6%B5%B7%E8%B3%8A%E7%84%A1%E5%8F%8C4%28%C2%A52%2C460%29%E3%80%8F%E3%82%92%E3%83%A9%E3%82%AF%E3%83%9E%E3%81%A7%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%EF%BC%81&amp;url=https%3A%2F%2Fitem.fril.jp%2F4aca1d6db3e422f3a251a8a8b61e1eff" class="ga-class ga-item-sharebutton btn btn-block x-twitter" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_share_twitter', {'dimension1': '844877033'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_twitter&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}"><img alt="" class="lazy" data-original="https://asset.fril.jp/assets/new_web/icon-x-166df5e59867c52d69f791e2566140922a1e521dc281b69eb59e7438165e3dcc.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> ポスト</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-x-166df5e59867c52d69f791e2566140922a1e521dc281b69eb59e7438165e3dcc.png"></noscript>
</div>
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a href="https://www.facebook.com/share.php?u=https://item.fril.jp/4aca1d6db3e422f3a251a8a8b61e1eff" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); ga('send', 'event', 'ui_action', 'search', 'click_item_share_facebook', {'dimension1': '844877033'}); return false;" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_facebook&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}" class="ga-class ga-item-sharebutton btn btn-block facebook"><img class="lazy" alt="" data-original="https://asset.fril.jp/assets/new_web/icon-facebook-1a25d5b26a65896fb90c6b38503ad2bfcde84f78b66d670347d212018781b2b5.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> シェア</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-facebook-1a25d5b26a65896fb90c6b38503ad2bfcde84f78b66d670347d212018781b2b5.png"></noscript>
</div>
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
<a target="_blank" href="https://line.me/R/msg/text/?NintendoSwitch%20ONE%20PIECE%20%E6%B5%B7%E8%B3%8A%E7%84%A1%E5%8F%8C4%20%7C%20https%3A%2F%2Fitem.fril.jp%2F4aca1d6db3e422f3a251a8a8b61e1eff" rel="noreferrer" class="ga-class ga-item-sharebutton btn btn-block line" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_share_line', {'dimension1': '844877033'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_share_line&quot;,&quot;item_id&quot;:&quot;844877033&quot;,&quot;item_name&quot;:&quot;NintendoSwitch ONE PIECE 海賊無双4&quot;,&quot;seller_user_id&quot;:&quot;3850223&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;6454&quot;,&quot;brand_name&quot;:&quot;BANDAI NAMCO Entertainment&quot;,&quot;price&quot;:2460,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}"><img alt="" class="lazy" data-original="https://asset.fril.jp/assets/new_web/icon-line-6db6ecdc05f67f632ec40c964574e0a98bbbd6739e69beeffd13c3ac6385f2d7.png" src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png"> LINEで送る</a>
<noscript><img alt="" src="https://asset.fril.jp/assets/new_web/icon-line-6db6ecdc05f67f632ec40c964574e0a98bbbd6739e69beeffd13c3ac6385f2d7.png"></noscript>
</div>
</div>
<!--PC C--><!-- /7727/Rakuma/Item/MiddleRect1 -->
<div class="googleAdsense-box hidden-xs hidden-sm" data-test-g-ad-md-react1-pc="">
<div id="div-gpt-ad-1566432529257-0">
<script>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1566432529257-0'); });
</script>
</div>
</div>
<h4>出品者情報</h4>
<!-- ショップ情報 -->
<div class="row header-shopinfo shopinfo-area">
<div class="icon_and_shop_info_and_verifed-badge">
<a class="shopinfo-wrapverified-badge-item shop_link clearfix" href="https://fril.jp/shop/83b56a796a72011dc58b6e469270dfb7" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_shop'); window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_item_shop" data-ratevent="click" data-ratparam="all" data-rat-cp-content_group="商品詳細" data-rat-cp-pagetitle="BANDAI NAMCO Entertainment - NintendoSwitch ONE PIECE 海賊無双4の通販 by naonao's shop | バンダイナムコエンターテインメントならラクマ" data-rat-cp-title="商品詳細画面(通常・ディスプレイ)" data-rat-cp-screen_url="https://fril.jp/item/4aca1d6db3e422f3a251a8a8b61e1eff" data-rat-cp-authenticity_item_status="not_covered" data-rat-cp-brand_id="6454" data-rat-cp-item_condition="目立った傷や汚れなし" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="北海道" data-rat-cp-item_type="1" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A"></a>
<div class="col-lg-2 col-md-2 col-sm-1 col-xs-2 header-shopinfo__user-icon user-icon-fit">
<img class="user img-circle img-responsive lazy" alt="" data-original="https://img.fril.jp/user/3850223/s/3850223.jpg?1545873036" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
<noscript><img alt="" src="https://img.fril.jp/user/3850223/s/3850223.jpg?1545873036"></noscript>
</div>
<div class="col-lg-9 col-md-9 col-sm-10 col-xs-9 header-shopinfo__shop_name_and_user_name">
<p class="header-shopinfo__shop-name clearfix"><span>naonao's shop</span></p>
<p class="header-shopinfo__user-name">naonao</p>
<div class="header-shopinfo__verified-badge-item">
<img class="header-shopinfo--iverified-icon" data-original="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png" src="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png">
本人確認済
<a href="https://faq.fril.jp/17420/" target="_blank" rel="noopener noreferrer" data-test="verified_badge_shop" onclick="gtmClickBadgeStatus('本人確認済')">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.11101 2.17971C5.26216 1.41054 6.61553 1 8 1C9.85652 1 11.637 1.7375 12.9497 3.05025C14.2625 4.36301 15 6.14348 15 8C15 9.38447 14.5895 10.7378 13.8203 11.889C13.0511 13.0401 11.9579 13.9373 10.6788 14.4672C9.3997 14.997 7.99224 15.1356 6.63437 14.8655C5.2765 14.5954 4.02922 13.9287 3.05026 12.9497C2.07129 11.9708 1.4046 10.7235 1.13451 9.36563C0.86441 8.00776 1.00303 6.6003 1.53285 5.32122C2.06266 4.04213 2.95987 2.94888 4.11101 2.17971ZM4.66658 12.9888C5.65328 13.6481 6.81332 14 8 14C9.5913 14 11.1174 13.3679 12.2426 12.2426C13.3679 11.1174 14 9.5913 14 8C14 6.81331 13.6481 5.65327 12.9888 4.66658C12.3295 3.67988 11.3925 2.91085 10.2961 2.45672C9.19975 2.0026 7.99335 1.88378 6.82946 2.11529C5.66558 2.3468 4.59648 2.91824 3.75736 3.75736C2.91825 4.59647 2.3468 5.66557 2.11529 6.82946C1.88378 7.99334 2.0026 9.19974 2.45673 10.2961C2.91085 11.3925 3.67989 12.3295 4.66658 12.9888ZM7.17999 8.77002V9.11502L8.80999 9.13002V8.84002C8.80878 8.66485 8.85361 8.49242 8.93999 8.34002C9.09209 8.12732 9.2819 7.9443 9.49999 7.80002C9.81046 7.58848 10.0784 7.3205 10.29 7.01002C10.4803 6.712 10.5762 6.36345 10.565 6.01002C10.5729 5.63781 10.4684 5.27186 10.265 4.96002C10.0494 4.65554 9.75817 4.41254 9.41999 4.25502C9.0291 4.07854 8.60378 3.99142 8.17499 4.00002C7.67506 3.98766 7.17897 4.0903 6.72499 4.30002C6.33811 4.49475 5.98926 4.75723 5.69499 5.07502L6.45499 6.30002C6.63675 6.05331 6.86009 5.84012 7.11499 5.67002C7.37663 5.49526 7.68539 5.40455 7.99999 5.41002C8.23263 5.38767 8.4662 5.44211 8.66499 5.56502C8.74383 5.62176 8.80744 5.69708 8.85018 5.7843C8.89292 5.87153 8.91346 5.96795 8.90999 6.06502C8.91542 6.24353 8.86279 6.41898 8.75999 6.56502C8.59368 6.77098 8.39631 6.94979 8.17499 7.09502C7.85377 7.29967 7.58356 7.57501 7.38499 7.90002C7.24695 8.16905 7.17659 8.46767 7.17999 8.77002ZM7.58634 11.9257C7.7178 11.9781 7.8585 12.0034 7.99999 12C8.14303 12.0039 8.28538 11.9788 8.41854 11.9264C8.55169 11.874 8.67292 11.7953 8.77499 11.695C8.87865 11.5989 8.96077 11.482 9.01593 11.3518C9.07109 11.2217 9.09804 11.0813 9.09499 10.94C9.09875 10.7979 9.07215 10.6566 9.01697 10.5255C8.96179 10.3944 8.87929 10.2767 8.77499 10.18C8.56721 9.97978 8.28851 9.87009 7.99999 9.87502C7.85868 9.87308 7.71839 9.89902 7.58712 9.95136C7.45585 10.0037 7.33619 10.0814 7.23499 10.18C7.13068 10.2767 7.04818 10.3944 6.993 10.5255C6.93782 10.6566 6.91122 10.7979 6.91499 10.94C6.91194 11.0813 6.93888 11.2217 6.99404 11.3518C7.0492 11.482 7.13132 11.5989 7.23499 11.695C7.33536 11.7948 7.45487 11.8732 7.58634 11.9257Z"></path>
</svg>
</a>
</div>
</div>
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 header-shopinfo__chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
<div class="header-shopinfo__review_counts user-review-wrap">
<a href="https://fril.jp/shop/83b56a796a72011dc58b6e469270dfb7/review" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_review');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop_review&quot;,&quot;screen_title&quot;:&quot;商品詳細画面(通常・ディスプレイ)&quot;,&quot;screen_name&quot;:&quot;item_detail&quot;},&quot;commerce_data&quot;:null}}">
<span>取引の評価</span>
<div class="review-list">
<ul class="list-inline">
<li>
<i class="icon-sun icon_review_sun"></i><span>456</span>
</li>
<li>
<i class="icon-cloud icon_review_cloud"></i><span>5</span>
</li>
<li>
<i class="icon-rain icon_review_rain"></i><span>0</span>
</li>
</ul>
<div class="review-chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
</a>
</div>
<div class="user-bio-wrap seller__detail--link shop__profile">
<div class="shop__profile__line-limited">
★数あるショップの中からご覧頂き、誠に有難うございます。<br><br>★★★‼️フォロー大歓迎‼️★★★<br><br>★基本的に送料無料・匿名配送で、ネコポス、小~中(コンパクト)中~大(宅急便)での発送の為、お値下げ出来ない商品も御座いますので、その旨、ご了承下さい。<br><br>★フィギュアに着きましては、購入・獲得してから未開封の物が多いので、開封後の初期不良に着きましては責任を負いかねますので何卒ご理解頂きますようお願い致します。<br><br>★洋服等は写真の写り方によってお色の違いがある事が御座いますので、ご心配の方はコメントにて最初にお色の確認をお願い致します。到着後の思っていたのと色が違う等の返品はご遠慮願います。<br><br>★評価の悪い方、マナーの悪い方はコメントなく購入の場合、トラブル防止の為、お取引をお断りさせて頂く場合が御座います。ご理解・ご了承願います。<br><br>★出品させて頂いています商品に関しましては到着後にすり替え防止のため、すべての商品に付きましてNC.NRでお願い致します。<br><br>★カード類に付きましては、すり替え防止と致しまして、お届け後の返品・返金はご遠慮願います。<br>ご不安な方は購入をお控え下さい。<br>初期傷等、素人ですので見落し有る場合が御座います。ご不安な方は御遠慮下さい。<br><br>★発送後のトラブルに関しては責任は負いかねます。<br><br>★購入後は速やかにご入金お願い致します<br><br>★商品を出来るだけお安くお出しさせて頂くため、大きいもの等はコンパクトに圧縮等をさせて頂きます。<br><br>★コンビニ支払い等をご利用の方で期日内までにご入金頂けないかたはトラブル防止の為、購入をご遠慮願います。支払期日を過ぎましたら、キャンセル申請をさせて頂きます。<br><br>★出品しています商品に関しましては基本的に先に購入した方優先とさせて頂きますので、ご了承下さい。<br><br>★商品受け取り後は速やかにご評価願います。<br><br>★★突然不定期にてお値下げ致します。又、突然元の値段に戻すことも御座いますがご了承下さい。
</div>
</div>
</div>
</div></body></html>
+364
View File
@@ -0,0 +1,364 @@
<!doctype html><html><head><meta charset='utf-8'><script type="application/ld+json">
{"@context":"http://schema.org/","@type":"Product","name":"スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封","image":"https://img.fril.jp/img/844649627/m/2913695594.jpg?1784942799","description":"★値下げ交渉、取り置き不可★\n値下げコメントお返事しません。\n\n★到着後→評価まで時間がかかる方はご購入をお控えください。よろしくお願い致します。\n\n★ 14時までのお支払いで当日発送手配します!14時以降は翌日の発送になります。ご了承ください。\n\n「スプラトゥーン レイダース」\n\n新品未使用、透明のパッケージフィルムも剥がしてません。未開封です。ネコポスで発送します。\n\n★すり替え防止のため、返品交換できません。\nご了承頂ける方のみ、ご購入ください。よろしくお願い致します。\n\n\n#エンタメ/ホビー\n#ゲームソフト/ゲーム機本体\n#家庭用ゲームソフト","offers":{"@type":"Offer","priceCurrency":"JPY","price":6299,"priceValidUntil":"2027-01-27","itemCondition":"http://schema.org/UsedCondition","availability":"http://schema.org/InStock","seller":{"@type":"Organization","name":"(^.^)"}},"brand":{"@type":"Thing","name":"Nintendo Switch"}}
</script></head><body><a data-rat-cp-item_condition="新品、未使用" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="千葉県" data-rat-cp-brand_id="5296"></a><div class="sp-slide"><img src="https://img.fril.jp/img/844649627/l/2913695594.jpg?1784942799" class="sp-image" alt="Nintendo Switch(ニンテンドースイッチ)のスプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封 エンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品写真"><img src="https://img.fril.jp/img/844649627/l/2913695611.jpg?1784942802" class="sp-image" alt="Nintendo Switch(ニンテンドースイッチ)のスプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封 エンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品写真"></div><section class="item-info row">
<div class="item-info__header">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="item-info__icons clearfix">
<span class="item__icon postage-included"><i class="icon_item_tag"></i>送料込</span>
<span class="item__icon anonymous">匿名配送</span>
<span class="item__icon request-required">すぐに購入可</span>
</div>
<h1 class="item__name">スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封</h1>
<p><a onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_brand', {'dimension1': '5296'});" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_brand&quot;,&quot;item_id&quot;:&quot;844649627&quot;,&quot;item_name&quot;:&quot;スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封&quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:6299,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}}" href="https://fril.jp/brand/5296">Nintendo Switch</a></p>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<!-- 通常価格 -->
<p class="item__value_area">
<span class="item__price"><span class="item__currency-symbol">¥</span>6,299</span>
<span class="item__postage">送料込</span>
</p>
</div>
</div>
</div>
<!-- 選択サイズ表示 PC用 -->
<!-- 選択サイズ表示 PC用ここまで -->
<section class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<p class="mtp__8"><span class="type-modal__contents--button--sold">SOLD OUT</span></p>
</div>
</div>
<div class="only__pc">
<div class="safety-badges" data-test="safety-badges">
<ul class="safety-badges__top">
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/identification-user-outline-c1ea65e83d0b6221d759eefa62133ae75dcfb5cb67f8d9a875d9758017430076.svg">
<span class="safety-badges__caption safety-badges__caption--normal">本人確認済</span>
</li>
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/support-agent-a6db00f6a0de9b3279109b0ed5aa1d18a92ee5dba689782938628a788cd4f07a.svg">
<span class="safety-badges__caption safety-badges__caption--normal">紛失補償有</span>
</li>
</ul>
<div class="safety-badges__bottom">
<a target="_blank" rel="noopener noreferrer" class="ato-kantei__text-link ga-class ga-safety" href="https://fril.jp/safety">
ラクマ安心・安全への取り組み
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="currentColor"></path>
</svg>
</a> </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const clickItemAuthenticityLpTarget = document.querySelector('[data-click-item-authenticity-lp]');
const clickItemAuthenticityLpParams = {"event":"fireEvent","eventData":{"event_name":"","event_parameter":{"view":0,"event_label":"click_item_authenticity_lp"},"commerce_data":null}};
clickItemAuthenticityLpTarget?.addEventListener('click', () => {
if (!clickItemAuthenticityLpTarget.dataset.listenerAdded) {
window.dataLayer.push(clickItemAuthenticityLpParams);
clickItemAuthenticityLpTarget.dataset.listenerAdded = true;
};
});
});
</script>
</div>
<div class="hidden-xs">
<div class="item__description only__pc">
<h4>商品説明</h4>
<div class="item__description__line-limited">
<span> ★値下げ交渉、取り置き不可★<br>値下げコメントお返事しません。<br><br>★到着後→評価まで時間がかかる方はご購入をお控えください。よろしくお願い致します。<br><br>&nbsp;14時までのお支払いで当日発送手配します!14時以降は翌日の発送になります。ご了承ください。<br><br>「スプラトゥーン&nbsp;レイダース」<br><br>新品未使用、透明のパッケージフィルムも剥がしてません。未開封です。ネコポスで発送します。<br><br>★すり替え防止のため、返品交換できません。<br>ご了承頂ける方のみ、ご購入ください。よろしくお願い致します。<br><br><br>#エンタメ/ホビー<br>#ゲームソフト/ゲーム機本体<br>#家庭用ゲームソフト </span>
</div>
<div class="time_ago">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14C4.6915 14 2 11.3085 2 8C2 4.6915 4.6915 2 8 2C11.3085 2 14 4.6915 14 8C14 11.3085 11.3085 14 8 14ZM8 1C4.134 1 1 4.134 1 8C1 11.866 4.134 15 8 15C11.866 15 15 11.866 15 8C15 4.134 11.866 1 8 1Z" fill="#757575"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3032 9.95944L7.50018 8.32944V3.49994H8.50018V7.67044L11.6967 9.04044L11.3032 9.95944Z" fill="#757575"></path>
</svg>
約1時間前
</div>
</div>
</div>
</div>
</section>
<div class="reduction__section mtp__16 sp__only">
</div>
<!-- sp用 -->
<div class="only__sp">
<div class="safety-badges" data-test="safety-badges">
<ul class="safety-badges__top">
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/identification-user-outline-c1ea65e83d0b6221d759eefa62133ae75dcfb5cb67f8d9a875d9758017430076.svg">
<span class="safety-badges__caption safety-badges__caption--normal">本人確認済</span>
</li>
<li class="safety-badges__badge-box">
<img class="safety-badges__badge" alt="" src="https://asset.fril.jp/assets/safety_badges/support-agent-a6db00f6a0de9b3279109b0ed5aa1d18a92ee5dba689782938628a788cd4f07a.svg">
<span class="safety-badges__caption safety-badges__caption--normal">紛失補償有</span>
</li>
</ul>
<div class="safety-badges__bottom">
<a target="_blank" rel="noopener noreferrer" class="ato-kantei__text-link ga-class ga-safety" href="https://fril.jp/safety">
ラクマ安心・安全への取り組み
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="currentColor"></path>
</svg>
</a> </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
const clickItemAuthenticityLpTarget = document.querySelector('[data-click-item-authenticity-lp]');
const clickItemAuthenticityLpParams = {"event":"fireEvent","eventData":{"event_name":"","event_parameter":{"view":0,"event_label":"click_item_authenticity_lp"},"commerce_data":null}};
clickItemAuthenticityLpTarget?.addEventListener('click', () => {
if (!clickItemAuthenticityLpTarget.dataset.listenerAdded) {
window.dataLayer.push(clickItemAuthenticityLpParams);
clickItemAuthenticityLpTarget.dataset.listenerAdded = true;
};
});
});
</script>
</div>
<section class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="visible-xs">
<div class="item__description only__sp">
<h4 class="mtp__0">商品説明</h4>
<div class="item__description__line-limited">
<span> ★値下げ交渉、取り置き不可★<br>値下げコメントお返事しません。<br><br>★到着後→評価まで時間がかかる方はご購入をお控えください。よろしくお願い致します。<br><br>&nbsp;14時までのお支払いで当日発送手配します!14時以降は翌日の発送になります。ご了承ください。<br><br>「スプラトゥーン&nbsp;レイダース」<br><br>新品未使用、透明のパッケージフィルムも剥がしてません。未開封です。ネコポスで発送します。<br><br>★すり替え防止のため、返品交換できません。<br>ご了承頂ける方のみ、ご購入ください。よろしくお願い致します。<br><br><br>#エンタメ/ホビー<br>#ゲームソフト/ゲーム機本体<br>#家庭用ゲームソフト </span>
</div>
<div class="time_ago">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M8 14C4.6915 14 2 11.3085 2 8C2 4.6915 4.6915 2 8 2C11.3085 2 14 4.6915 14 8C14 11.3085 11.3085 14 8 14ZM8 1C4.134 1 1 4.134 1 8C1 11.866 4.134 15 8 15C11.866 15 15 11.866 15 8C15 4.134 11.866 1 8 1Z" fill="#757575"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M11.3032 9.95944L7.50018 8.32944V3.49994H8.50018V7.67044L11.6967 9.04044L11.3032 9.95944Z" fill="#757575"></path>
</svg>
約1時間前
</div>
</div>
</div>
</div>
</section>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="item-status ft-new-position">
<h4 class="mtp__0">商品情報</h4>
<table class="item__details">
<tbody><tr>
<th><i class="icon-status icon_top_category_etc item-status-category"></i> カテゴリ</th>
<td>
<a href="https://fril.jp/category/10007">エンタメ/ホビー</a><br>
<a href="https://fril.jp/category/786">ゲームソフト/ゲーム機本体</a><br>
<a href="https://fril.jp/category/788">家庭用ゲームソフト</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_item_brand item-status-brand"></i> ブランド</th>
<td>
<a href="https://fril.jp/brand/5296">Nintendo Switch</a>
</td>
</tr>
</tbody></table>
<!--PC C--><!-- /7727/Rakuma/Item/MiddleRect1 -->
<div class="googleAdsense-box hidden-xs hidden-sm" data-test-g-ad-md-react1-pc="">
<div id="div-gpt-ad-1566432529257-0">
<script>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1566432529257-0'); });
</script>
</div>
</div>
<h4>出品者情報</h4>
<!-- ショップ情報 -->
<div class="row header-shopinfo shopinfo-area">
<div class="icon_and_shop_info_and_verifed-badge">
<a class="shopinfo-wrapverified-badge-item shop_link clearfix" href="https://fril.jp/shop/422750cb7921557bc8dba2416915d968" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_shop'); window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_item_shop" data-ratevent="click" data-ratparam="all" data-rat-cp-content_group="商品詳細" data-rat-cp-pagetitle="Nintendo Switch - スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封の通販 by (^.^) | ニンテンドースイッチならラクマ" data-rat-cp-title="商品詳細画面(通常・ディスプレイ)" data-rat-cp-screen_url="https://fril.jp/item/61b174d42b58216828a24b86b7903ced" data-rat-cp-authenticity_item_status="not_covered" data-rat-cp-brand_id="5296" data-rat-cp-item_condition="新品、未使用" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="千葉県" data-rat-cp-item_type="1" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A"></a>
<div class="col-lg-2 col-md-2 col-sm-1 col-xs-2 header-shopinfo__user-icon user-icon-fit">
<img class="user img-circle img-responsive lazy" alt="" data-original="https://img.fril.jp/user/12073120/s/12073120.jpg?1609027502" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
<noscript><img alt="" src="https://img.fril.jp/user/12073120/s/12073120.jpg?1609027502"></noscript>
</div>
<div class="col-lg-9 col-md-9 col-sm-10 col-xs-9 header-shopinfo__shop_name_and_user_name">
<p class="header-shopinfo__shop-name clearfix"><span>(^.^)</span></p>
<p class="header-shopinfo__user-name">(^.^)</p>
<div class="header-shopinfo__verified-badge-item">
<img class="header-shopinfo--iverified-icon" data-original="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png" src="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png">
本人確認済
<a href="https://faq.fril.jp/17420/" target="_blank" rel="noopener noreferrer" data-test="verified_badge_shop" onclick="gtmClickBadgeStatus('本人確認済')">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.11101 2.17971C5.26216 1.41054 6.61553 1 8 1C9.85652 1 11.637 1.7375 12.9497 3.05025C14.2625 4.36301 15 6.14348 15 8C15 9.38447 14.5895 10.7378 13.8203 11.889C13.0511 13.0401 11.9579 13.9373 10.6788 14.4672C9.3997 14.997 7.99224 15.1356 6.63437 14.8655C5.2765 14.5954 4.02922 13.9287 3.05026 12.9497C2.07129 11.9708 1.4046 10.7235 1.13451 9.36563C0.86441 8.00776 1.00303 6.6003 1.53285 5.32122C2.06266 4.04213 2.95987 2.94888 4.11101 2.17971ZM4.66658 12.9888C5.65328 13.6481 6.81332 14 8 14C9.5913 14 11.1174 13.3679 12.2426 12.2426C13.3679 11.1174 14 9.5913 14 8C14 6.81331 13.6481 5.65327 12.9888 4.66658C12.3295 3.67988 11.3925 2.91085 10.2961 2.45672C9.19975 2.0026 7.99335 1.88378 6.82946 2.11529C5.66558 2.3468 4.59648 2.91824 3.75736 3.75736C2.91825 4.59647 2.3468 5.66557 2.11529 6.82946C1.88378 7.99334 2.0026 9.19974 2.45673 10.2961C2.91085 11.3925 3.67989 12.3295 4.66658 12.9888ZM7.17999 8.77002V9.11502L8.80999 9.13002V8.84002C8.80878 8.66485 8.85361 8.49242 8.93999 8.34002C9.09209 8.12732 9.2819 7.9443 9.49999 7.80002C9.81046 7.58848 10.0784 7.3205 10.29 7.01002C10.4803 6.712 10.5762 6.36345 10.565 6.01002C10.5729 5.63781 10.4684 5.27186 10.265 4.96002C10.0494 4.65554 9.75817 4.41254 9.41999 4.25502C9.0291 4.07854 8.60378 3.99142 8.17499 4.00002C7.67506 3.98766 7.17897 4.0903 6.72499 4.30002C6.33811 4.49475 5.98926 4.75723 5.69499 5.07502L6.45499 6.30002C6.63675 6.05331 6.86009 5.84012 7.11499 5.67002C7.37663 5.49526 7.68539 5.40455 7.99999 5.41002C8.23263 5.38767 8.4662 5.44211 8.66499 5.56502C8.74383 5.62176 8.80744 5.69708 8.85018 5.7843C8.89292 5.87153 8.91346 5.96795 8.90999 6.06502C8.91542 6.24353 8.86279 6.41898 8.75999 6.56502C8.59368 6.77098 8.39631 6.94979 8.17499 7.09502C7.85377 7.29967 7.58356 7.57501 7.38499 7.90002C7.24695 8.16905 7.17659 8.46767 7.17999 8.77002ZM7.58634 11.9257C7.7178 11.9781 7.8585 12.0034 7.99999 12C8.14303 12.0039 8.28538 11.9788 8.41854 11.9264C8.55169 11.874 8.67292 11.7953 8.77499 11.695C8.87865 11.5989 8.96077 11.482 9.01593 11.3518C9.07109 11.2217 9.09804 11.0813 9.09499 10.94C9.09875 10.7979 9.07215 10.6566 9.01697 10.5255C8.96179 10.3944 8.87929 10.2767 8.77499 10.18C8.56721 9.97978 8.28851 9.87009 7.99999 9.87502C7.85868 9.87308 7.71839 9.89902 7.58712 9.95136C7.45585 10.0037 7.33619 10.0814 7.23499 10.18C7.13068 10.2767 7.04818 10.3944 6.993 10.5255C6.93782 10.6566 6.91122 10.7979 6.91499 10.94C6.91194 11.0813 6.93888 11.2217 6.99404 11.3518C7.0492 11.482 7.13132 11.5989 7.23499 11.695C7.33536 11.7948 7.45487 11.8732 7.58634 11.9257Z"></path>
</svg>
</a>
</div>
</div>
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 header-shopinfo__chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
<div class="header-shopinfo__review_counts user-review-wrap">
<a href="https://fril.jp/shop/422750cb7921557bc8dba2416915d968/review" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_review');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop_review&quot;,&quot;screen_title&quot;:&quot;商品詳細画面(通常・ディスプレイ)&quot;,&quot;screen_name&quot;:&quot;item_detail&quot;},&quot;commerce_data&quot;:null}}">
<span>取引の評価</span>
<div class="review-list">
<ul class="list-inline">
<li>
<i class="icon-sun icon_review_sun"></i><span>1,883</span>
</li>
<li>
<i class="icon-cloud icon_review_cloud"></i><span>3</span>
</li>
<li>
<i class="icon-rain icon_review_rain"></i><span>0</span>
</li>
</ul>
<div class="review-chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
</a>
</div>
<div class="user-bio-wrap seller__detail--link shop__profile">
<div class="shop__profile__line-limited">
★評価に悪いがたくさんある方、大幅な値下げ交渉をされる方、言葉遣い等、不快に感じた場合ブロックします。<br><br>★取り置き不可。コメント中でも即決してくださる方優先です。<br><br>★ 返品できませんので、ご納得頂けるまで、お気軽にコメントでご質問ください☺︎︎<br>素人の自宅保管品になりますので、完璧な状態でお探しの方、少しの見逃しも許せない方はお店で新品をご購入ください。<br><br>★小さな子供がいる為、お急ぎの方、急かされる方はご購入をお控えくださいm(_ _)m<br>夜は子供と早く寝てしまうので、朝お返事する事が多いです。<br><br>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div id="comments" class="comment-area-wrap">
<h4>コメント</h4>
<div class="comment-input">
<p><span id="btn_comment" class="comment-input__btn comment-input__btn--submit" data-toggle="modal" data-target="#directSignupModal">商品について質問する</span></p>
</div>
</div>
<div class="comment-area">
<div class="comment-area-inner">
<div id="comment-list">
</div>
<p class="commentmore-box">
<a href="#comment-list">すべてのコメントを見る<i class="icon_tl_cursor_down"></i></a>
</p>
</div>
</div>
</div>
</div>
</section><div class="item-status ft-new-position">
<h4 class="mtp__0">商品情報</h4>
<table class="item__details">
<tbody><tr>
<th><i class="icon-status icon_top_category_etc item-status-category"></i> カテゴリ</th>
<td>
<a href="https://fril.jp/category/10007">エンタメ/ホビー</a><br>
<a href="https://fril.jp/category/786">ゲームソフト/ゲーム機本体</a><br>
<a href="https://fril.jp/category/788">家庭用ゲームソフト</a>
</td>
</tr>
<tr>
<th><i class="icon-status icon_item_brand item-status-brand"></i> ブランド</th>
<td>
<a href="https://fril.jp/brand/5296">Nintendo Switch</a>
</td>
</tr>
</tbody></table>
<!--PC C--><!-- /7727/Rakuma/Item/MiddleRect1 -->
<div class="googleAdsense-box hidden-xs hidden-sm" data-test-g-ad-md-react1-pc="">
<div id="div-gpt-ad-1566432529257-0">
<script>
googletag.cmd.push(function() { googletag.display('div-gpt-ad-1566432529257-0'); });
</script>
</div>
</div>
<h4>出品者情報</h4>
<!-- ショップ情報 -->
<div class="row header-shopinfo shopinfo-area">
<div class="icon_and_shop_info_and_verifed-badge">
<a class="shopinfo-wrapverified-badge-item shop_link clearfix" href="https://fril.jp/shop/422750cb7921557bc8dba2416915d968" onclick="ga('send', 'event', 'ui_action', 'search', 'click_item_shop'); window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_item_shop" data-ratevent="click" data-ratparam="all" data-rat-cp-content_group="商品詳細" data-rat-cp-pagetitle="Nintendo Switch - スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封の通販 by (^.^) | ニンテンドースイッチならラクマ" data-rat-cp-title="商品詳細画面(通常・ディスプレイ)" data-rat-cp-screen_url="https://fril.jp/item/61b174d42b58216828a24b86b7903ced" data-rat-cp-authenticity_item_status="not_covered" data-rat-cp-brand_id="5296" data-rat-cp-item_condition="新品、未使用" data-rat-cp-shipping_cost_payer="出品者" data-rat-cp-shipping_date_estimate="1~2日" data-rat-cp-shipping_from="千葉県" data-rat-cp-item_type="1" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A"></a>
<div class="col-lg-2 col-md-2 col-sm-1 col-xs-2 header-shopinfo__user-icon user-icon-fit">
<img class="user img-circle img-responsive lazy" alt="" data-original="https://img.fril.jp/user/12073120/s/12073120.jpg?1609027502" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
<noscript><img alt="" src="https://img.fril.jp/user/12073120/s/12073120.jpg?1609027502"></noscript>
</div>
<div class="col-lg-9 col-md-9 col-sm-10 col-xs-9 header-shopinfo__shop_name_and_user_name">
<p class="header-shopinfo__shop-name clearfix"><span>(^.^)</span></p>
<p class="header-shopinfo__user-name">(^.^)</p>
<div class="header-shopinfo__verified-badge-item">
<img class="header-shopinfo--iverified-icon" data-original="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png" src="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png">
本人確認済
<a href="https://faq.fril.jp/17420/" target="_blank" rel="noopener noreferrer" data-test="verified_badge_shop" onclick="gtmClickBadgeStatus('本人確認済')">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.11101 2.17971C5.26216 1.41054 6.61553 1 8 1C9.85652 1 11.637 1.7375 12.9497 3.05025C14.2625 4.36301 15 6.14348 15 8C15 9.38447 14.5895 10.7378 13.8203 11.889C13.0511 13.0401 11.9579 13.9373 10.6788 14.4672C9.3997 14.997 7.99224 15.1356 6.63437 14.8655C5.2765 14.5954 4.02922 13.9287 3.05026 12.9497C2.07129 11.9708 1.4046 10.7235 1.13451 9.36563C0.86441 8.00776 1.00303 6.6003 1.53285 5.32122C2.06266 4.04213 2.95987 2.94888 4.11101 2.17971ZM4.66658 12.9888C5.65328 13.6481 6.81332 14 8 14C9.5913 14 11.1174 13.3679 12.2426 12.2426C13.3679 11.1174 14 9.5913 14 8C14 6.81331 13.6481 5.65327 12.9888 4.66658C12.3295 3.67988 11.3925 2.91085 10.2961 2.45672C9.19975 2.0026 7.99335 1.88378 6.82946 2.11529C5.66558 2.3468 4.59648 2.91824 3.75736 3.75736C2.91825 4.59647 2.3468 5.66557 2.11529 6.82946C1.88378 7.99334 2.0026 9.19974 2.45673 10.2961C2.91085 11.3925 3.67989 12.3295 4.66658 12.9888ZM7.17999 8.77002V9.11502L8.80999 9.13002V8.84002C8.80878 8.66485 8.85361 8.49242 8.93999 8.34002C9.09209 8.12732 9.2819 7.9443 9.49999 7.80002C9.81046 7.58848 10.0784 7.3205 10.29 7.01002C10.4803 6.712 10.5762 6.36345 10.565 6.01002C10.5729 5.63781 10.4684 5.27186 10.265 4.96002C10.0494 4.65554 9.75817 4.41254 9.41999 4.25502C9.0291 4.07854 8.60378 3.99142 8.17499 4.00002C7.67506 3.98766 7.17897 4.0903 6.72499 4.30002C6.33811 4.49475 5.98926 4.75723 5.69499 5.07502L6.45499 6.30002C6.63675 6.05331 6.86009 5.84012 7.11499 5.67002C7.37663 5.49526 7.68539 5.40455 7.99999 5.41002C8.23263 5.38767 8.4662 5.44211 8.66499 5.56502C8.74383 5.62176 8.80744 5.69708 8.85018 5.7843C8.89292 5.87153 8.91346 5.96795 8.90999 6.06502C8.91542 6.24353 8.86279 6.41898 8.75999 6.56502C8.59368 6.77098 8.39631 6.94979 8.17499 7.09502C7.85377 7.29967 7.58356 7.57501 7.38499 7.90002C7.24695 8.16905 7.17659 8.46767 7.17999 8.77002ZM7.58634 11.9257C7.7178 11.9781 7.8585 12.0034 7.99999 12C8.14303 12.0039 8.28538 11.9788 8.41854 11.9264C8.55169 11.874 8.67292 11.7953 8.77499 11.695C8.87865 11.5989 8.96077 11.482 9.01593 11.3518C9.07109 11.2217 9.09804 11.0813 9.09499 10.94C9.09875 10.7979 9.07215 10.6566 9.01697 10.5255C8.96179 10.3944 8.87929 10.2767 8.77499 10.18C8.56721 9.97978 8.28851 9.87009 7.99999 9.87502C7.85868 9.87308 7.71839 9.89902 7.58712 9.95136C7.45585 10.0037 7.33619 10.0814 7.23499 10.18C7.13068 10.2767 7.04818 10.3944 6.993 10.5255C6.93782 10.6566 6.91122 10.7979 6.91499 10.94C6.91194 11.0813 6.93888 11.2217 6.99404 11.3518C7.0492 11.482 7.13132 11.5989 7.23499 11.695C7.33536 11.7948 7.45487 11.8732 7.58634 11.9257Z"></path>
</svg>
</a>
</div>
</div>
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-1 header-shopinfo__chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
<div class="header-shopinfo__review_counts user-review-wrap">
<a href="https://fril.jp/shop/422750cb7921557bc8dba2416915d968/review" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_review');" data-gtm-click="{&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_item_shop_review&quot;,&quot;screen_title&quot;:&quot;商品詳細画面(通常・ディスプレイ)&quot;,&quot;screen_name&quot;:&quot;item_detail&quot;},&quot;commerce_data&quot;:null}}">
<span>取引の評価</span>
<div class="review-list">
<ul class="list-inline">
<li>
<i class="icon-sun icon_review_sun"></i><span>1,883</span>
</li>
<li>
<i class="icon-cloud icon_review_cloud"></i><span>3</span>
</li>
<li>
<i class="icon-rain icon_review_rain"></i><span>0</span>
</li>
</ul>
<div class="review-chevron">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M5.207 1.5L4.5 2.207L10.293 8L4.5 13.793L5.207 14.5L11.707 8L5.207 1.5Z" fill="#757575"></path>
</svg>
</div>
</div>
</a>
</div>
<div class="user-bio-wrap seller__detail--link shop__profile">
<div class="shop__profile__line-limited">
★評価に悪いがたくさんある方、大幅な値下げ交渉をされる方、言葉遣い等、不快に感じた場合ブロックします。<br><br>★取り置き不可。コメント中でも即決してくださる方優先です。<br><br>★ 返品できませんので、ご納得頂けるまで、お気軽にコメントでご質問ください☺︎︎<br>素人の自宅保管品になりますので、完璧な状態でお探しの方、少しの見逃しも許せない方はお店で新品をご購入ください。<br><br>★小さな子供がいる為、お急ぎの方、急かされる方はご購入をお控えくださいm(_ _)m<br>夜は子供と早く寝てしまうので、朝お返事する事が多いです。<br><br>
</div>
</div>
</div>
</div></body></html>
+94
View File
@@ -0,0 +1,94 @@
<!doctype html><html><head><meta charset='utf-8'></head><body><div class="page-count">約1,190,000件中 1 - 40件</div><a data-rat-cp-totalresults="1196774"></a><div class="item"><div class="item-box">
<div class="item-box__image-wrapper">
<a href="https://item.fril.jp/61b174d42b58216828a24b86b7903ced" class="link_search_image" title="スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封 ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844649627' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844649627&quot;,&quot;item_name&quot;:&quot;スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封&quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:6299,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844649627" data-rat-item_name="スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封" data-rat-igenre="788" data-rat-brand="Nintendo Switch" data-rat-price="6299" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="1" data-rat-cp-price="6299" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<img src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png" data-original="https://img.fril.jp/img/844649627/m/2913695594.jpg?1784942799" class="img-responsive lazy" alt="ニンテンドースイッチ(Nintendo Switch)のスプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封(家庭用ゲームソフト)">
<noscript><img src="https://img.fril.jp/img/844649627/m/2913695594.jpg?1784942799" alt="ニンテンドースイッチ(Nintendo Switch)のスプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封(家庭用ゲームソフト)"></noscript>
<div class="item-box__soldout_ribbon">SOLD OUT</div>
<div class="item-box__icon-section">
</div>
</a>
</div>
<div class="item-box__text-wrapper">
<div class="item-box__item-sub-name">
<a href="/brand/5296" class="brand-name" title="Nintendo Switch(ニンテンドースイッチ)の商品一覧ページへのリンク">Nintendo Switch</a>
</div>
<p class="item-box__item-name">
<a href="https://item.fril.jp/61b174d42b58216828a24b86b7903ced" class="link_search_title" title="スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封 ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844649627' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844649627&quot;,&quot;item_name&quot;:&quot;スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封&quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:6299,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844649627" data-rat-item_name="スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封" data-rat-igenre="788" data-rat-brand="Nintendo Switch" data-rat-price="6299" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="1" data-rat-cp-price="6299" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<span>スプラトゥーン レイダース スイッチ switch 2 ソフト 新品 未開封</span>
</a>
</p>
<div class="price-status__wrap">
<div class="price-status__price">
<!-- 二重価格表示時用 class price-status__price--down が付与される事で赤文字表記になります。出し分けの設定をお願いします。 -->
<p class="item-box__item-price"><span data-content="JPY">¥</span><span data-content="6299">6,299</span></p>
</div>
<div>
<div class="like_item_off">
<a class="small" href="#" data-toggle="modal" data-target="#directSignupModal"><i class="ga-class ga-items-likebutton list-icon-like icon_tl_heart"></i></a>
</div>
</div>
</div>
</div>
</div></div><div class="item"><div class="item-box">
<div class="item-box__image-wrapper">
<a href="https://item.fril.jp/f00d05890d49e1e5c9abc4fae20a97a4" class="link_search_image" title="HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844908440' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844908440&quot;,&quot;item_name&quot;:&quot;HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ&quot;,&quot;seller_user_id&quot;:&quot;14691076&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:7280,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="14691076/844908440" data-rat-item_name="HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ" data-rat-igenre="788" data-rat-brand="Nintendo Switch" data-rat-price="7280" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="2" data-rat-cp-price="7280" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<img src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png" data-original="https://img.fril.jp/img/844908440/m/2914810873.jpg?1785103049" class="img-responsive lazy" alt="ニンテンドースイッチ(Nintendo Switch)のHYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ(家庭用ゲームソフト)">
<noscript><img src="https://img.fril.jp/img/844908440/m/2914810873.jpg?1785103049" alt="ニンテンドースイッチ(Nintendo Switch)のHYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ(家庭用ゲームソフト)"></noscript>
<div class="item-box__icon-section">
</div>
</a>
</div>
<div class="item-box__text-wrapper">
<div class="item-box__item-sub-name">
<a href="/brand/5296" class="brand-name" title="Nintendo Switch(ニンテンドースイッチ)の商品一覧ページへのリンク">Nintendo Switch</a>
</div>
<p class="item-box__item-name">
<a href="https://item.fril.jp/f00d05890d49e1e5c9abc4fae20a97a4" class="link_search_title" title="HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844908440' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844908440&quot;,&quot;item_name&quot;:&quot;HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ&quot;,&quot;seller_user_id&quot;:&quot;14691076&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:7280,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="14691076/844908440" data-rat-item_name="HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ" data-rat-igenre="788" data-rat-brand="Nintendo Switch" data-rat-price="7280" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="2" data-rat-cp-price="7280" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<span>HYKE:Northern Light(s) 輸入版 switch ニンテンドースイッチ</span>
</a>
</p>
<div class="price-status__wrap">
<div class="price-status__price">
<!-- 二重価格表示時用 class price-status__price--down が付与される事で赤文字表記になります。出し分けの設定をお願いします。 -->
<p class="item-box__item-price"><span data-content="JPY">¥</span><span data-content="7280">7,280</span></p>
</div>
<div>
<div class="like_item_off">
<a class="small" href="#" data-toggle="modal" data-target="#directSignupModal"><i class="ga-class ga-items-likebutton list-icon-like icon_tl_heart"></i></a>
</div>
</div>
</div>
</div>
</div></div><div class="item"><div class="item-box">
<div class="item-box__image-wrapper">
<a href="https://item.fril.jp/15f7297584e2c61a39981994837412f6" class="link_search_image" title="Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲーム機本体)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844891307' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844891307&quot;,&quot;item_name&quot;:&quot;Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド&quot;,&quot;seller_user_id&quot;:&quot;18993214&quot;,&quot;category_id&quot;:&quot;787&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:19000,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="18993214/844891307" data-rat-item_name="Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド" data-rat-igenre="787" data-rat-brand="Nintendo Switch" data-rat-price="19000" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="3" data-rat-cp-price="19000" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<img src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png" data-original="https://img.fril.jp/img/844891307/m/2914752086.jpg?1785081164" class="img-responsive lazy" alt="ニンテンドースイッチ(Nintendo Switch)のNintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド(家庭用ゲーム機本体)">
<noscript><img src="https://img.fril.jp/img/844891307/m/2914752086.jpg?1785081164" alt="ニンテンドースイッチ(Nintendo Switch)のNintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド(家庭用ゲーム機本体)"></noscript>
<div class="item-box__icon-section">
</div>
</a>
</div>
<div class="item-box__text-wrapper">
<div class="item-box__item-sub-name">
<a href="/brand/5296" class="brand-name" title="Nintendo Switch(ニンテンドースイッチ)の商品一覧ページへのリンク">Nintendo Switch</a>
</div>
<p class="item-box__item-name">
<a href="https://item.fril.jp/15f7297584e2c61a39981994837412f6" class="link_search_title" title="Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲーム機本体)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'search', 'click_search_item', {'dimension1': '844891307' }); dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_search_item&quot;,&quot;item_id&quot;:&quot;844891307&quot;,&quot;item_name&quot;:&quot;Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド&quot;,&quot;seller_user_id&quot;:&quot;18993214&quot;,&quot;category_id&quot;:&quot;787&quot;,&quot;first_category&quot;:null,&quot;second_category&quot;:null,&quot;third_category&quot;:null,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:19000,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_search_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="18993214/844891307" data-rat-item_name="Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド" data-rat-igenre="787" data-rat-brand="Nintendo Switch" data-rat-price="19000" data-rat-sgenre="一般" data-rat-cp-content_group="商品検索>検索結果" data-rat-cp-title="検索結果画面" data-rat-cp-pagetitle="switchのフリマアイテム一覧" data-rat-cp-screen_url="https://fril.jp/s?query=switch" data-rat-cp-search_keyword="switch" data-rat-cp-search_return_code_list="指定なし" data-rat-cp-search_order="おすすめ順" data-rat-cp-gsp_var="" data-rat-cp-gsp_reqid="" data-rat-cp-totalresults="1196774" data-rat-cp-hits="40" data-rat-cp-sort="1" data-rat-cp-rpgn="1" data-rat-cp-fa="2" data-rat-cp-search_keyword="switch" data-rat-cp-search_exclude_keyword="" data-rat-cp-brand_id="5296" data-rat-cp-location="3" data-rat-cp-price="19000" data-rat-cp-event_gp1="organic" data-rat-cp-return_amount="0" data-rat-cp-return_rate="0" data-rat-cp-return_code_list="N/A">
<span>Nintendo Switch ニンテンドースイッチ Joy-Con ネオンブルー ネオンレッド</span>
</a>
</p>
<div class="price-status__wrap">
<div class="price-status__price">
<!-- 二重価格表示時用 class price-status__price--down が付与される事で赤文字表記になります。出し分けの設定をお願いします。 -->
<p class="item-box__item-price"><span data-content="JPY">¥</span><span data-content="19000">19,000</span></p>
</div>
<div>
<div class="like_item_off">
<a class="small" href="#" data-toggle="modal" data-target="#directSignupModal"><i class="ga-class ga-items-likebutton list-icon-like icon_tl_heart"></i></a>
</div>
</div>
</div>
</div>
</div></div></body></html>
+120
View File
@@ -0,0 +1,120 @@
<!doctype html><html><head><meta charset='utf-8'><script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Store",
"name": "(^.^)",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "5.0",
"ratingCount": "1886",
"worstRating": "0",
"bestRating": "5"
}
}
</script></head><body><div class="profile-area__shop-cover" style="background: url(https://asset.fril.jp/assets/new_web/bg_default_shop_cover-dcc4c6a370f958789c2c8215a44e7433a68e101b96b725a887221e5c8526fa38.png) center center; background-size: 100% auto;">
<div class="profile-area__text-cover">
<div class="col-lg-push-2 col-md-push-2 col-sm-push-3 col-xs-push-3 col-lg-10 col-md-10 col-sm-8 col-xs-7">
<h1 class="profile-area__shop-name">(^.^)</h1>
</div>
</div>
</div><div class="profile-area__name-space">
<div class="col-lg-2 col-md-2 col-xs-3 profile-area__user-icon user-icon-fit">
<img src="https://img.fril.jp/user/12073120/s/12073120.jpg?1609027502" class="user img-circle img-responsive">
</div>
<div class="col-lg-10 col-md-10 col-xs-9">
<p class="profile-area__user verified-badge-shop"><span class="profile-area__user-name" data-test="profile_user_name">(^.^)</span></p>
<div class="header-shopinfo__verified-badge-shop badge-status">
<img class="header-shopinfo--iverified-icon" data-original="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png" src="https://asset.fril.jp/assets/new_web/icon-verified-badge-178e2665b2afa925c984e980a73993ad82ab44ac8575378962c1c600cf30b6bc.png">
本人確認済
<a href="https://faq.fril.jp/17420/" target="_blank" rel="noopener noreferrer" data-test="verified_badge_shop" onclick="gtmClickBadgeStatus('本人確認済')">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none">
<path fill-rule="evenodd" clip-rule="evenodd" d="M4.11101 2.17971C5.26216 1.41054 6.61553 1 8 1C9.85652 1 11.637 1.7375 12.9497 3.05025C14.2625 4.36301 15 6.14348 15 8C15 9.38447 14.5895 10.7378 13.8203 11.889C13.0511 13.0401 11.9579 13.9373 10.6788 14.4672C9.3997 14.997 7.99224 15.1356 6.63437 14.8655C5.2765 14.5954 4.02922 13.9287 3.05026 12.9497C2.07129 11.9708 1.4046 10.7235 1.13451 9.36563C0.86441 8.00776 1.00303 6.6003 1.53285 5.32122C2.06266 4.04213 2.95987 2.94888 4.11101 2.17971ZM4.66658 12.9888C5.65328 13.6481 6.81332 14 8 14C9.5913 14 11.1174 13.3679 12.2426 12.2426C13.3679 11.1174 14 9.5913 14 8C14 6.81331 13.6481 5.65327 12.9888 4.66658C12.3295 3.67988 11.3925 2.91085 10.2961 2.45672C9.19975 2.0026 7.99335 1.88378 6.82946 2.11529C5.66558 2.3468 4.59648 2.91824 3.75736 3.75736C2.91825 4.59647 2.3468 5.66557 2.11529 6.82946C1.88378 7.99334 2.0026 9.19974 2.45673 10.2961C2.91085 11.3925 3.67989 12.3295 4.66658 12.9888ZM7.17999 8.77002V9.11502L8.80999 9.13002V8.84002C8.80878 8.66485 8.85361 8.49242 8.93999 8.34002C9.09209 8.12732 9.2819 7.9443 9.49999 7.80002C9.81046 7.58848 10.0784 7.3205 10.29 7.01002C10.4803 6.712 10.5762 6.36345 10.565 6.01002C10.5729 5.63781 10.4684 5.27186 10.265 4.96002C10.0494 4.65554 9.75817 4.41254 9.41999 4.25502C9.0291 4.07854 8.60378 3.99142 8.17499 4.00002C7.67506 3.98766 7.17897 4.0903 6.72499 4.30002C6.33811 4.49475 5.98926 4.75723 5.69499 5.07502L6.45499 6.30002C6.63675 6.05331 6.86009 5.84012 7.11499 5.67002C7.37663 5.49526 7.68539 5.40455 7.99999 5.41002C8.23263 5.38767 8.4662 5.44211 8.66499 5.56502C8.74383 5.62176 8.80744 5.69708 8.85018 5.7843C8.89292 5.87153 8.91346 5.96795 8.90999 6.06502C8.91542 6.24353 8.86279 6.41898 8.75999 6.56502C8.59368 6.77098 8.39631 6.94979 8.17499 7.09502C7.85377 7.29967 7.58356 7.57501 7.38499 7.90002C7.24695 8.16905 7.17659 8.46767 7.17999 8.77002ZM7.58634 11.9257C7.7178 11.9781 7.8585 12.0034 7.99999 12C8.14303 12.0039 8.28538 11.9788 8.41854 11.9264C8.55169 11.874 8.67292 11.7953 8.77499 11.695C8.87865 11.5989 8.96077 11.482 9.01593 11.3518C9.07109 11.2217 9.09804 11.0813 9.09499 10.94C9.09875 10.7979 9.07215 10.6566 9.01697 10.5255C8.96179 10.3944 8.87929 10.2767 8.77499 10.18C8.56721 9.97978 8.28851 9.87009 7.99999 9.87502C7.85868 9.87308 7.71839 9.89902 7.58712 9.95136C7.45585 10.0037 7.33619 10.0814 7.23499 10.18C7.13068 10.2767 7.04818 10.3944 6.993 10.5255C6.93782 10.6566 6.91122 10.7979 6.91499 10.94C6.91194 11.0813 6.93888 11.2217 6.99404 11.3518C7.0492 11.482 7.13132 11.5989 7.23499 11.695C7.33536 11.7948 7.45487 11.8732 7.58634 11.9257Z"></path>
</svg>
</a>
</div>
<div class="profile-area__share">
<div class="social_item">
<a id="social_twitter" class="twitter" onclick=" ga('send', 'event', 'ui_action', 'share', 'click_shop_share_twitter', {'dimension1': '12073120'});window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_share_twitter&quot;,&quot;screen_title&quot;:&quot;ショップページ,レビューページ&quot;,&quot;screen_name&quot;:&quot;shop_profile&quot;},&quot;commerce_data&quot;:null}});" href="https://twitter.com/intent/tweet?url=https://fril.jp/shop/422750cb7921557bc8dba2416915d968&amp;text=(^.^)のショップをラクマでチェック!&amp;via=rakuma_official" target="_blank"><img src="https://asset.fril.jp/assets/new_web/icon_x-1506ba8bfddbba6fbf4e8545ca96ef45101a17d91be0851d6b7484c1a59dfd7b.png" class="img-circle img-responsive" alt="xでシェア"></a>
</div>
<div class="social_item">
<a id="social_facebook" class="facebook" href="https://www.facebook.com/share.php?u=https://fril.jp/shop/422750cb7921557bc8dba2416915d968" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); ga('send', 'event', 'ui_action', 'share', 'click_shop_share_facebook', {'dimension1': '12073120'}); window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_share_facebook&quot;,&quot;screen_title&quot;:&quot;ショップページ,レビューページ&quot;,&quot;screen_name&quot;:&quot;shop_profile&quot;},&quot;commerce_data&quot;:null}}); return false"><img src="https://asset.fril.jp/assets/new_web/icon_facebook-42fdc43bfb82c28356543ae044972aa56722d9ab1fb024063c40c66c8900e859.png" class="img-circle img-responsive" alt="Facebookでシェア"></a>
</div>
<div class="social_item">
<a id="social_line" class="line" onclick="ga('send', 'event', 'ui_action', 'share', 'click_shop_share_line', {'dimension1': '12073120'});window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_share_line&quot;,&quot;screen_title&quot;:&quot;ショップページ,レビューページ&quot;,&quot;screen_name&quot;:&quot;shop_profile&quot;},&quot;commerce_data&quot;:null}});" href="https://line.me/R/msg/text/?%28%5E.%5E%29%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97%20%7C%20https%3A%2F%2Ffril.jp%2Fshop%2F422750cb7921557bc8dba2416915d968" rel="noreferrer"><img src="https://asset.fril.jp/assets/new_web/icon_line-9298ce0f2493206b9be4af506443266b12cc56cbc66b9adecf33e4ed241ff87f.png" class="img-circle img-responsive" alt="LINEで送る"></a>
</div>
</div>
</div>
</div><div class="content-group__text" data-test="profile-text-top">
<p>★評価に悪いがたくさんある方、大幅な値下げ交渉をされる方、言葉遣い等、不快に感じた場合ブロックします。</p>
<p>★取り置き不可。コメント中でも即決してくださる方優先です。</p>
<p>★ 返品できませんので、ご納得頂けるまで、お気軽にコメントでご質問ください☺︎︎
<br>素人の自宅保管品になりますので、完璧な状態でお探しの方、少しの見逃しも許せない方はお店で新品をご購入ください。</p>
<p>★小さな子供がいる為、お急ぎの方、急かされる方はご購入をお控えくださいm(_ _)m
<br>夜は子供と早く寝てしまうので、朝お返事する事が多いです。</p>
</div><div class="page-count">21件中 1 - 21件</div><div class="item"><div class="item-box">
<div class="item-box__image-wrapper">
<a href="https://item.fril.jp/61546447a7f13c34a5d015f37a7f3319" class="link_shop_image" title="ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_item', {'dimension1': '844851001' });window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_item&quot;,&quot;item_id&quot;:&quot;844851001&quot;,&quot;item_name&quot;:&quot;ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ&quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:6399,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_shop_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844851001" data-rat-item_name="ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ" data-rat-igenre="[788]" data-rat-igenrenamepath="エンタメ/ホビー/ゲームソフト/ゲーム機本体/家庭用ゲームソフト" data-rat-brand="[&quot;Nintendo Switch&quot;]" data-rat-price="[6399]" data-rat-sgenre="一般" data-rat-cp-brand_id="5296">
<img src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png" data-original="https://img.fril.jp/img/844851001/m/2914570137.jpg?1785056298" class="img-responsive lazy" data-test="img_responsive" alt="ニンテンドースイッチ(Nintendo Switch)のヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ(家庭用ゲームソフト)">
<noscript><img src="https://img.fril.jp/img/844851001/m/2914570137.jpg?1785056298" alt="ニンテンドースイッチ(Nintendo Switch)のヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ(家庭用ゲームソフト)"></noscript>
</a>
</div>
<div class="item-box__text-wrapper">
<div class="item-box__item-sub-name">
<a href="/brand/5296/category/788" class="brand-name" data-test="brand_name" title="Nintendo Switch(ニンテンドースイッチ)の家庭用ゲームソフトの商品一覧ページへのリンク">Nintendo Switch</a>
</div>
<p class="item-box__item-name">
<a href="https://item.fril.jp/61546447a7f13c34a5d015f37a7f3319" class="link_shop_title" title="ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_item', {'dimension1': '844851001' });window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_item&quot;,&quot;item_id&quot;:&quot;844851001&quot;,&quot;item_name&quot;:&quot;ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ&quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:6399,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_shop_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844851001" data-rat-item_name="ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ" data-rat-igenre="[788]" data-rat-igenrenamepath="エンタメ/ホビー/ゲームソフト/ゲーム機本体/家庭用ゲームソフト" data-rat-brand="[&quot;Nintendo Switch&quot;]" data-rat-price="[6399]" data-rat-sgenre="一般" data-rat-cp-brand_id="5296">
<span data-test="item_name">ヨッシー フカシギ 図鑑 スイッチ switch ソフト 新品 未使用 マリオ</span>
</a>
</p>
<div class="price-status__wrap">
<div class="price-status__price">
<p class="item-box__item-price">
<span data-content="JPY">¥</span>
<span data-test="item_price" data-content="6399">6,399
</span>
</p>
</div>
<div>
<div class="like_item_off">
<a class="small" href="#" data-toggle="modal" data-target="#directSignupModal"><i class="ga-class ga-items-likebutton list-icon-like icon_tl_heart"></i></a>
</div>
</div>
</div>
</div>
</div></div><div class="item"><div class="item-box">
<div class="item-box__image-wrapper">
<a href="https://item.fril.jp/46271f7e8b2db8f31e653d515463e492" class="link_shop_image" title="リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_item', {'dimension1': '844825502' });window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_item&quot;,&quot;item_id&quot;:&quot;844825502&quot;,&quot;item_name&quot;:&quot;リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 &quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:5450,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_shop_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844825502" data-rat-item_name="リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 " data-rat-igenre="[788]" data-rat-igenrenamepath="エンタメ/ホビー/ゲームソフト/ゲーム機本体/家庭用ゲームソフト" data-rat-brand="[&quot;Nintendo Switch&quot;]" data-rat-price="[5450]" data-rat-sgenre="一般" data-rat-cp-brand_id="5296">
<img src="https://asset.fril.jp/assets/new_web/item_square_dummy-e093d031b2a9738d2115341c1aa868b76ba6b0aa513492bd0068e673e7a6d3f6.png" data-original="https://img.fril.jp/img/844825502/m/2914435187.jpg?1785040941" class="img-responsive lazy" data-test="img_responsive" alt="ニンテンドースイッチ(Nintendo Switch)のリズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 (家庭用ゲームソフト)">
<noscript><img src="https://img.fril.jp/img/844825502/m/2914435187.jpg?1785040941" alt="ニンテンドースイッチ(Nintendo Switch)のリズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 (家庭用ゲームソフト)"></noscript>
<div class="item-box__soldout_ribbon">SOLD OUT</div>
</a>
</div>
<div class="item-box__text-wrapper">
<div class="item-box__item-sub-name">
<a href="/brand/5296/category/788" class="brand-name" data-test="brand_name" title="Nintendo Switch(ニンテンドースイッチ)の家庭用ゲームソフトの商品一覧ページへのリンク">Nintendo Switch</a>
</div>
<p class="item-box__item-name">
<a href="https://item.fril.jp/46271f7e8b2db8f31e653d515463e492" class="link_shop_title" title="リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 ニンテンドースイッチ(Nintendo Switch)のエンタメ/ホビーのゲームソフト/ゲーム機本体(家庭用ゲームソフト)の商品詳細ページへのリンク" onclick="ga('send', 'event', 'ui_action', 'profile', 'click_shop_item', {'dimension1': '844825502' });window.dataLayer.push({&quot;event&quot;:&quot;fireEvent&quot;,&quot;eventData&quot;:{&quot;event_name&quot;:&quot;&quot;,&quot;event_parameter&quot;:{&quot;view&quot;:0,&quot;event_label&quot;:&quot;click_shop_item&quot;,&quot;item_id&quot;:&quot;844825502&quot;,&quot;item_name&quot;:&quot;リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 &quot;,&quot;seller_user_id&quot;:&quot;12073120&quot;,&quot;category_id&quot;:&quot;788&quot;,&quot;first_category&quot;:&quot;エンタメ/ホビー&quot;,&quot;second_category&quot;:&quot;ゲームソフト/ゲーム機本体&quot;,&quot;third_category&quot;:&quot;家庭用ゲームソフト&quot;,&quot;brand_id&quot;:&quot;5296&quot;,&quot;brand_name&quot;:&quot;Nintendo Switch&quot;,&quot;price&quot;:5450,&quot;seller_user_type&quot;:&quot;一般&quot;},&quot;commerce_data&quot;:null}});" data-ratid="click_shop_item" data-ratevent="click" data-ratparam="all" data-rat-itemid="12073120/844825502" data-rat-item_name="リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 " data-rat-igenre="[788]" data-rat-igenrenamepath="エンタメ/ホビー/ゲームソフト/ゲーム機本体/家庭用ゲームソフト" data-rat-brand="[&quot;Nintendo Switch&quot;]" data-rat-price="[5450]" data-rat-sgenre="一般" data-rat-cp-brand_id="5296">
<span data-test="item_name">リズム天国 ミラクルスターズ スイッチ 新品 未使用 未開封 </span>
</a>
</p>
<div class="price-status__wrap">
<div class="price-status__price">
<p class="item-box__item-price">
<span data-content="JPY">¥</span>
<span data-test="item_price" data-content="5450">5,450
</span>
</p>
</div>
<div>
<div class="like_item_off">
<a class="small" href="#" data-toggle="modal" data-target="#directSignupModal"><i class="ga-class ga-items-likebutton list-icon-like icon_tl_heart"></i></a>
</div>
</div>
</div>
</div>
</div></div></body></html>
+122
View File
@@ -0,0 +1,122 @@
<!doctype html><html><head><meta charset='utf-8'></head><body><ul class="nav nav-pills nav-justified">
<li role="presentation" class="active">
<a href="#all-all" aria-controls="good" role="tab" data-toggle="tab">
すべて
</a>
</li>
<li role="presentation">
<a href="#all-good" aria-controls="all-good" role="tab" data-toggle="tab">
<i class="icon-sun icon_review_sun"></i>
118
</a>
</li>
<li role="presentation">
<a href="#all-normal" aria-controls="all-normal" role="tab" data-toggle="tab">
<i class="icon-cloud icon_review_cloud"></i>
0
</a>
</li>
<li role="presentation">
<a href="#all-bad" aria-controls="all-bad" role="tab" data-toggle="tab">
<i class="icon-rain icon_review_rain"></i>
0
</a>
</li>
</ul><ul class="nav nav-pills nav-justified">
<li role="presentation" class="active">
<a href="#seller-all" aria-controls="good" role="tab" data-toggle="tab">
すべて
</a>
</li>
<li role="presentation">
<a href="#seller-good" aria-controls="all-good" role="tab" data-toggle="tab">
<i class="icon-sun icon_review_sun"></i>
110
</a>
</li>
<li role="presentation">
<a href="#seller-normal" aria-controls="all-normal" role="tab" data-toggle="tab">
<i class="icon-cloud icon_review_cloud"></i>
0
</a>
</li>
<li role="presentation">
<a href="#seller-bad" aria-controls="all-bad" role="tab" data-toggle="tab">
<i class="icon-rain icon_review_rain"></i>
0
</a>
</li>
</ul><ul class="nav nav-pills nav-justified">
<li role="presentation" class="active">
<a href="#buyer-all" aria-controls="good" role="tab" data-toggle="tab">
すべて
</a>
</li>
<li role="presentation">
<a href="#buyer-good" aria-controls="all-good" role="tab" data-toggle="tab">
<i class="icon-sun icon_review_sun"></i>
8
</a>
</li>
<li role="presentation">
<a href="#buyer-normal" aria-controls="all-normal" role="tab" data-toggle="tab">
<i class="icon-cloud icon_review_cloud"></i>
0
</a>
</li>
<li role="presentation">
<a href="#buyer-bad" aria-controls="all-bad" role="tab" data-toggle="tab">
<i class="icon-rain icon_review_rain"></i>
0
</a>
</li>
</ul><div class="tab-pane active" id="all-all"><article class="row review-item" style="display:">
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-2">
<img class="user img-circle img-responsive" alt="" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
</div>
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-10">
<p class="review-item-title"><i class="icon-sun icon_review_sun"></i>よい出品者です</p>
<div class="review-item-text"><p></p></div>
<div class="row">
<div class="review-item-name col-lg-6 col-md-6 col-sm-6 col-xs-6">
トシちゃん
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6">
<p class="review-item-date text-right">2026/05/04</p>
</div>
</div>
</div>
</article><article class="row review-item" style="display:">
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-2">
<img class="user img-circle img-responsive" alt="" src="https://asset.fril.jp/assets/new_web/icon_user-9e49e957def667b1abdaae57b9e81d66c31b27f8559d80e2eb682cfbb24e18cd.png">
</div>
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-10">
<p class="review-item-title"><i class="icon-sun icon_review_sun"></i>よい出品者です</p>
<div class="review-item-text"><p>無事商品受け取りました。
<br>ありがとうございました。</p></div>
<div class="row">
<div class="review-item-name col-lg-6 col-md-6 col-sm-6 col-xs-6">
はる
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6">
<p class="review-item-date text-right">2023/05/16</p>
</div>
</div>
</div>
</article><article class="row review-item" style="display:">
<div class="col-lg-1 col-md-1 col-sm-1 col-xs-2">
<img class="user img-circle img-responsive" alt="" src="https://img.fril.jp/user/4552835/s/4552835.jpg?1510868311">
</div>
<div class="col-lg-11 col-md-11 col-sm-11 col-xs-10">
<p class="review-item-title"><i class="icon-sun icon_review_sun"></i>よい出品者です</p>
<div class="review-item-text"><p>また、ご縁がありましたら宜しくお願いします!</p></div>
<div class="row">
<div class="review-item-name col-lg-6 col-md-6 col-sm-6 col-xs-6">
rasta.mama
</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6">
<p class="review-item-date text-right">2023/04/10</p>
</div>
</div>
</div>
</article></div></body></html>
+1583
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
<!doctype html><html><head><meta charset='utf-8'><script type="application/ld+json">{"@context":"https://schema.org/","@type":"AggregateRating","itemReviewed":{"@type":"Organization","logo":"https://thumbnail.image.rakuten.co.jp/@0_mall/edion/logo/logo1.jpg","name":"エディオン 楽天市場店"},"ratingValue":4.51,"ratingCount":128136}</script></head><body></body></html>
+28
View File
@@ -0,0 +1,28 @@
{
"shop": {
"shopCode": "edion",
"ageVerificationFlag": false,
"shopIntroduction": "エディオン楽天市場店は「家電と暮らしのエディオン」のECショップです",
"shopName": "エディオン 楽天市場店",
"shopId": 272415,
"shopUrl": "http://www.rakuten.co.jp/edion",
"is39Shop": true,
"signboardUrl": "https://shop.r10s.jp/edion/cabinet/header/kanban_pc2.jpg",
"shopPoint": [],
"shopReview": {
"didMeetDisplayRequirements": true,
"total": 128136,
"average": 4.51
},
"couponIds": [],
"status": 1,
"shopCalendar": {
"eventDates": {
"holiday": [],
"orderOnly": [],
"shippingOnly": []
},
"currentJapanDate": "2026-07-27"
}
}
}
+455
View File
@@ -0,0 +1,455 @@
"""API 层测试:鉴权、参数校验、错误映射与响应包装
抓取客户端被替换为桩实现,不触达真实站点。
"""
from __future__ import annotations
import pytest
from fastapi.testclient import TestClient
from app.core.config import get_settings
from app.core.errors import ItemNotFoundError, OffIchibaRedirectError, UpstreamBlockedError
from app.main import create_app
from app.models.scrape import (
GenreData,
GenreNode,
ItemDetailData,
RakumaItemDetailData,
RakumaSearchItem,
RakumaSearchResultData,
RakumaShopDetailData,
RakumaShopItemsData,
SearchItem,
SearchResultData,
ShopDetailData,
)
TOKEN = get_settings().bearer_token
AUTH = {"Authorization": f"Bearer {TOKEN}"}
class StubClient:
"""记录入参并返回固定结果的抓取客户端桩"""
def __init__(self) -> None:
self.search_payload = None
self.detail_payload = None
self.genre_payload = None
self.shop_detail_payload = None
self.shop_items_payload = None
self.raise_on_search: Exception | None = None
self.raise_on_detail: Exception | None = None
async def search(self, payload) -> SearchResultData:
self.search_payload = payload
if self.raise_on_search:
raise self.raise_on_search
return SearchResultData(
keyword=payload.keyword,
page=payload.page,
page_size=45,
total_count=1234,
reachable_count=1234,
has_more=True,
ad_count=2,
request_url="https://search.rakuten.co.jp/search/mall/x/",
items=[SearchItem(item_id="1", item_code="c1", item_name="商品", price=100)],
)
async def item_detail(self, payload) -> ItemDetailData:
self.detail_payload = payload
if self.raise_on_detail:
raise self.raise_on_detail
return ItemDetailData(item_id="1", item_code="c1", item_name="商品", price=100)
async def genres(self, payload) -> GenreData:
self.genre_payload = payload
return GenreData(
genre_id=payload.genre_id or "",
name="テレビゲーム" if payload.genre_id else "",
children=[GenreNode(genre_id="565950", name="Nintendo Switch")],
)
async def shop_detail(self, payload) -> ShopDetailData:
self.shop_detail_payload = payload
return ShopDetailData(
shop_id=272415,
shop_code=payload.shop_code or "edion",
shop_name="エディオン 楽天市場店",
review_score=4.51,
review_count=128136,
)
async def shop_items(self, payload) -> SearchResultData:
self.shop_items_payload = payload
return await self.search(payload.to_search_request(payload.shop_id or 272415))
class StubRakumaClient:
"""ラクマ 抓取客户端桩"""
def __init__(self) -> None:
self.search_payload = None
self.detail_payload = None
self.shop_detail_payload = None
self.shop_items_payload = None
self.raise_on_detail: Exception | None = None
async def search(self, payload) -> RakumaSearchResultData:
self.search_payload = payload
return RakumaSearchResultData(
keyword=payload.keyword,
page=payload.page,
page_size=40,
total_count=1196774,
has_more=True,
request_url="https://fril.jp/s?query=x",
items=[RakumaSearchItem(item_id="abc", item_name="商品", price=6299)],
)
async def item_detail(self, payload) -> RakumaItemDetailData:
self.detail_payload = payload
if self.raise_on_detail:
raise self.raise_on_detail
return RakumaItemDetailData(item_id="abc", item_name="商品", price=6299)
async def shop_detail(self, payload) -> RakumaShopDetailData:
self.shop_detail_payload = payload
return RakumaShopDetailData(shop_id="s1", shop_name="出品者", review_count=118)
async def shop_items(self, payload) -> RakumaShopItemsData:
self.shop_items_payload = payload
return RakumaShopItemsData(
shop_id="s1",
shop_name="出品者",
page=payload.page,
total_count=21,
items=[RakumaSearchItem(item_id="abc", item_name="商品", price=6299)],
)
@pytest.fixture
def client_and_stub():
app = create_app()
with TestClient(app) as client:
stub = StubClient()
rakuma_stub = StubRakumaClient()
app.state.container.rakuten_client = stub
app.state.container.rakuma_client = rakuma_stub
yield client, stub, rakuma_stub
@pytest.fixture
def client(client_and_stub):
return client_and_stub[0]
@pytest.fixture
def stub(client_and_stub):
return client_and_stub[1]
@pytest.fixture
def rakuma_stub(client_and_stub):
return client_and_stub[2]
# ---- 鉴权 ----
@pytest.mark.parametrize("path", ["/api/search", "/api/item_detail", "/api/genres"])
def test_endpoints_reject_missing_token(client, path):
response = client.post(path, json={"keyword": "a", "item_url": "https://item.rakuten.co.jp/s/c/"})
assert response.status_code == 401
body = response.json()
assert body["success"] is False
assert body["code"] == 1001
def test_endpoints_reject_wrong_token(client):
response = client.post(
"/api/search", json={"keyword": "a"}, headers={"Authorization": "Bearer wrong-token"}
)
assert response.status_code == 401
def test_endpoints_reject_non_bearer_scheme(client):
response = client.post("/api/search", json={"keyword": "a"}, headers={"Authorization": TOKEN})
assert response.status_code == 401
def test_health_needs_no_token(client):
response = client.get("/health")
assert response.status_code == 200
body = response.json()
assert body["data"]["status"] == "ok"
assert set(body["data"]["sessions"]) == {"pc", "sp", "rakuma"}
# ---- 参数校验 ----
def test_search_requires_a_target(client):
response = client.post("/api/search", json={}, headers=AUTH)
assert response.status_code == 422
assert response.json()["code"] == 1002
def test_search_rejects_page_beyond_site_limit(client):
response = client.post("/api/search", json={"keyword": "a", "page": 151}, headers=AUTH)
assert response.status_code == 422
def test_search_rejects_unknown_sort(client):
response = client.post("/api/search", json={"keyword": "a", "sort": "cheapest"}, headers=AUTH)
assert response.status_code == 422
def test_item_detail_requires_url_or_code_pair(client):
response = client.post("/api/item_detail", json={"shop_code": "edion"}, headers=AUTH)
assert response.status_code == 422
# ---- 正常响应 ----
def test_search_passes_filters_through_to_client(client, stub):
response = client.post(
"/api/search",
json={
"keyword": "switch",
"page": 2,
"sort": "price_asc",
"min_price": 1000,
"condition": "used",
"free_shipping": True,
"exclude_ads": False,
},
headers=AUTH,
)
assert response.status_code == 200
payload = stub.search_payload
assert payload.keyword == "switch"
assert payload.page == 2
assert payload.sort.value == "price_asc"
assert payload.min_price == 1000
assert payload.condition.value == "used"
assert payload.free_shipping is True
assert payload.exclude_ads is False
body = response.json()
assert body["success"] is True
assert body["code"] == 0
assert body["data"]["total_count"] == 1234
assert body["data"]["items"][0]["item_code"] == "c1"
def test_genres_accepts_empty_body_for_top_level(client, stub):
"""顶层分类不需要任何入参"""
response = client.post("/api/genres", json={}, headers=AUTH)
assert response.status_code == 200
assert stub.genre_payload.genre_id is None
assert response.json()["data"]["children"][0]["genre_id"] == "565950"
def test_genres_passes_genre_id_through(client, stub):
response = client.post("/api/genres", json={"genre_id": "101205"}, headers=AUTH)
assert response.status_code == 200
assert stub.genre_payload.genre_id == "101205"
assert response.json()["data"]["name"] == "テレビゲーム"
def test_item_detail_defaults_to_including_sku_variants(client, stub):
response = client.post(
"/api/item_detail",
json={"shop_code": "edion", "item_code": "4902370549263"},
headers=AUTH,
)
assert response.status_code == 200
assert stub.detail_payload.include_sku_variants is True
assert response.json()["data"]["item_name"] == "商品"
# ---- 抓取异常映射 ----
def test_blocked_upstream_maps_to_structured_error(client, stub):
stub.raise_on_search = UpstreamBlockedError("blocked by akamai")
response = client.post("/api/search", json={"keyword": "a"}, headers=AUTH)
assert response.status_code == 400
body = response.json()
assert body["success"] is False
assert body["code"] == 3002
assert "blocked" in body["msg"]
def test_off_ichiba_redirect_gets_its_own_error_code(client, stub):
"""楽天ブックス等官方子站的商品不该被当成反爬拦截,上游要能据此改走别的通道"""
stub.raise_on_detail = OffIchibaRedirectError(
"https://item.rakuten.co.jp/book/16033028/",
"https://books.rakuten.co.jp/rb/16033028/",
)
response = client.post(
"/api/item_detail", json={"shop_code": "book", "item_code": "16033028"}, headers=AUTH
)
assert response.status_code == 400
body = response.json()
assert body["code"] == 4002
assert "books.rakuten.co.jp" in body["msg"]
def test_missing_item_maps_to_404(client, stub):
stub.raise_on_detail = ItemNotFoundError("no such item")
response = client.post(
"/api/item_detail", json={"shop_code": "s", "item_code": "c"}, headers=AUTH
)
assert response.status_code == 404
assert response.json()["code"] == 4004
# ---- 乐天商家 ----
def test_shop_detail_returns_store_profile(client, stub):
response = client.post("/api/shop_detail", json={"shop_code": "edion"}, headers=AUTH)
assert response.status_code == 200
assert stub.shop_detail_payload.shop_code == "edion"
data = response.json()["data"]
assert data["shop_id"] == 272415
assert data["review_count"] == 128136
def test_shop_detail_requires_an_identifier(client):
response = client.post("/api/shop_detail", json={}, headers=AUTH)
assert response.status_code == 422
def test_shop_items_scopes_the_search_to_the_shop(client, stub):
"""商家商品实际是一次 sid 限定的搜索,筛选字段要原样传下去"""
response = client.post(
"/api/shop_items",
json={"shop_id": 272415, "page": 2, "keyword": "テレビ", "sort": "price_asc"},
headers=AUTH,
)
assert response.status_code == 200
assert stub.shop_items_payload.shop_id == 272415
# 转换后的搜索请求必须带上店铺限定
assert stub.search_payload.shop_id == 272415
assert stub.search_payload.keyword == "テレビ"
assert stub.search_payload.page == 2
assert response.json()["data"]["total_count"] == 1234
def test_shop_items_requires_an_identifier(client):
response = client.post("/api/shop_items", json={"page": 2}, headers=AUTH)
assert response.status_code == 422
# ---- ラクマ ----
@pytest.mark.parametrize(
"path",
[
"/api/rakuma/search",
"/api/rakuma/item_detail",
"/api/rakuma/shop_detail",
"/api/rakuma/shop_items",
],
)
def test_rakuma_endpoints_reject_missing_token(client, path):
response = client.post(path, json={"keyword": "a", "item_id": "x", "shop_id": "s"})
assert response.status_code == 401
assert response.json()["code"] == 1001
def test_rakuma_search_passes_filters_through(client, rakuma_stub):
response = client.post(
"/api/rakuma/search",
json={
"keyword": "switch",
"page": 2,
"sort": "price_asc",
"conditions": ["new", "almost_new"],
"transaction": "on_sale",
"free_shipping": True,
"brand_id": "5296",
},
headers=AUTH,
)
assert response.status_code == 200
payload = rakuma_stub.search_payload
assert payload.keyword == "switch"
assert payload.page == 2
assert payload.sort.value == "price_asc"
assert [c.value for c in payload.conditions] == ["new", "almost_new"]
assert payload.transaction.value == "on_sale"
assert payload.free_shipping is True
assert payload.brand_id == "5296"
assert response.json()["data"]["total_count"] == 1196774
def test_rakuma_search_requires_a_target(client):
response = client.post("/api/rakuma/search", json={}, headers=AUTH)
assert response.status_code == 422
assert response.json()["code"] == 1002
def test_rakuma_search_rejects_page_beyond_site_limit(client):
"""站点 page>100 直接 404,不必打出去才知道"""
response = client.post(
"/api/rakuma/search", json={"keyword": "a", "page": 101}, headers=AUTH
)
assert response.status_code == 422
def test_rakuma_search_rejects_rakuten_only_sort(client):
"""两站排序枚举不同,乐天的 review_count 在 ラクマ 上不存在"""
response = client.post(
"/api/rakuma/search", json={"keyword": "a", "sort": "review_count"}, headers=AUTH
)
assert response.status_code == 422
def test_rakuma_item_detail_accepts_item_id(client, rakuma_stub):
response = client.post("/api/rakuma/item_detail", json={"item_id": "abc"}, headers=AUTH)
assert response.status_code == 200
assert rakuma_stub.detail_payload.item_id == "abc"
assert response.json()["data"]["price"] == 6299
def test_rakuma_item_detail_requires_an_identifier(client):
response = client.post("/api/rakuma/item_detail", json={}, headers=AUTH)
assert response.status_code == 422
def test_rakuma_missing_item_maps_to_404(client, rakuma_stub):
rakuma_stub.raise_on_detail = ItemNotFoundError("no such item")
response = client.post("/api/rakuma/item_detail", json={"item_id": "x"}, headers=AUTH)
assert response.status_code == 404
assert response.json()["code"] == 4004
def test_rakuma_shop_detail_skips_reviews_by_default(client, rakuma_stub):
"""评价明细要多打一次请求,默认不取"""
response = client.post("/api/rakuma/shop_detail", json={"shop_id": "s1"}, headers=AUTH)
assert response.status_code == 200
assert rakuma_stub.shop_detail_payload.include_reviews is False
assert response.json()["data"]["review_count"] == 118
def test_rakuma_shop_detail_can_request_reviews(client, rakuma_stub):
response = client.post(
"/api/rakuma/shop_detail", json={"shop_id": "s1", "include_reviews": True}, headers=AUTH
)
assert response.status_code == 200
assert rakuma_stub.shop_detail_payload.include_reviews is True
def test_rakuma_shop_items_passes_page_through(client, rakuma_stub):
response = client.post(
"/api/rakuma/shop_items", json={"shop_id": "s1", "page": 3}, headers=AUTH
)
assert response.status_code == 200
assert rakuma_stub.shop_items_payload.page == 3
assert response.json()["data"]["total_count"] == 21
@pytest.mark.parametrize("path", ["/api/rakuma/shop_detail", "/api/rakuma/shop_items"])
def test_rakuma_shop_endpoints_require_an_identifier(client, path):
response = client.post(path, json={}, headers=AUTH)
assert response.status_code == 422
+109
View File
@@ -0,0 +1,109 @@
"""分类树解析测试:基于真实页面状态样本"""
import pytest
from app.core import site
from app.core.errors import ScrapeParseError
from app.parsers.genre import parse_genres
from app.utils.urls import build_genre_url
# ---- URL 构建 ----
def test_genre_url_uses_category_page_when_id_given():
assert build_genre_url("101205") == "https://www.rakuten.co.jp/category/101205/"
def test_genre_url_falls_back_to_sentinel_search_for_top_level():
"""顶层列表没有对应的分类页,改用查不到东西的哨兵关键词取干净的分类分面"""
url = build_genre_url(None)
assert url == f"https://search.rakuten.co.jp/search/mall/{site.GENRE_FACET_PROBE_KEYWORD}/"
# ---- 顶层分类 ----
def test_root_returns_all_top_level_genres(genre_root_state):
result = parse_genres(genre_root_state, genre_id=None)
assert result.genre_id == ""
assert result.ancestors == []
assert len(result.children) == 39
names = {child.name for child in result.children}
assert "テレビゲーム" in names
assert "レディースファッション" in names
def test_root_children_expose_id_shortcut_and_url(genre_root_state):
result = parse_genres(genre_root_state, genre_id=None)
game = next(child for child in result.children if child.name == "テレビゲーム")
assert game.genre_id == "101205"
assert game.shortcut == "game"
assert game.url == "https://www.rakuten.co.jp/category/101205/"
def test_root_omits_item_count_because_it_is_query_scoped(genre_root_state):
"""站点给的是「当前查询在该分类下的命中数」,不是分类商品总量,不能透出"""
result = parse_genres(genre_root_state, genre_id=None)
assert all(child.item_count is None for child in result.children)
# ---- 指定分类 ----
def test_genre_node_returns_itself_and_direct_children(genre_node_state):
result = parse_genres(genre_node_state, genre_id="101205")
assert result.genre_id == "101205"
assert result.name == "テレビゲーム"
assert result.is_leaf is False
assert result.url == "https://www.rakuten.co.jp/category/101205/"
assert len(result.children) == 27
child_names = {child.name for child in result.children}
assert "Nintendo Switch" in child_names
def test_genre_children_carry_item_count(genre_node_state):
result = parse_genres(genre_node_state, genre_id="101205")
switch = next(child for child in result.children if child.name == "Nintendo Switch")
assert switch.genre_id == "565950"
assert switch.item_count and switch.item_count > 0
def test_top_level_genre_has_no_ancestors_and_carries_genre_info(genre_node_state):
result = parse_genres(genre_node_state, genre_id="101205")
# 虚拟根 id=0 不是真实分类,不应出现在祖先里
assert result.ancestors == []
assert result.full_name == "テレビゲーム"
assert result.description
def test_nested_genre_reports_its_ancestor_chain(genre_node_state):
"""深层分类要能回报从顶层到父级的路径,方便上游拼面包屑"""
root = genre_node_state["state"]["data"]["genreTree"]["parent_category"]
game = root["children"][0]
switch = next(child for child in game["children"] if child["id"] == 565950)
# 模拟站点返回深层分类页时的链式结构:只保留通往目标的那条分支
game["children"] = [switch]
switch["children"] = [{"id": 566404, "name": "ソフト", "count": 100, "leaf": True, "children": []}]
result = parse_genres(genre_node_state, genre_id="565950")
assert result.genre_id == "565950"
assert [(a.genre_id, a.name) for a in result.ancestors] == [("101205", "テレビゲーム")]
assert [c.genre_id for c in result.children] == ["566404"]
def test_leaf_genre_reports_no_children(genre_node_state):
root = genre_node_state["state"]["data"]["genreTree"]["parent_category"]
root["children"] = [{"id": 999999, "name": "", "count": 5, "leaf": True, "children": []}]
result = parse_genres(genre_node_state, genre_id="999999")
assert result.is_leaf is True
assert result.children == []
# ---- 错误处理 ----
def test_missing_genre_tree_is_a_parse_error():
with pytest.raises(ScrapeParseError):
parse_genres({"state": {"data": {}}}, genre_id=None)
def test_unknown_genre_id_is_a_parse_error(genre_node_state):
with pytest.raises(ScrapeParseError):
parse_genres(genre_node_state, genre_id="1")
+147
View File
@@ -0,0 +1,147 @@
"""解析器测试:基于真实页面状态样本"""
import pytest
from app.core.errors import ScrapeParseError
from app.parsers.item import parse_item_detail
from app.parsers.search import parse_search
from app.parsers.state import extract_initial_state
# ---- __INITIAL_STATE__ 抽取 ----
def test_extract_initial_state_stops_at_end_of_json_object():
"""赋值语句后面紧跟其他脚本代码,不能整段吃掉"""
html = '<script>window.__INITIAL_STATE__ = {"a": {"b": 1}};window.__LOCALE__="ja";</script>'
assert extract_initial_state(html) == {"a": {"b": 1}}
def test_extract_initial_state_reports_missing_marker():
with pytest.raises(ScrapeParseError):
extract_initial_state("<html><body>blocked</body></html>")
def test_extract_initial_state_reports_broken_json():
with pytest.raises(ScrapeParseError):
extract_initial_state("window.__INITIAL_STATE__ = {oops")
# ---- 搜索结果 ----
def test_search_excludes_ads_by_default_but_still_counts_them(search_state):
result = parse_search(search_state, request_url="https://x", page=1, exclude_ads=True)
assert result.ad_count == 1
assert all(not item.is_ad for item in result.items)
assert len(result.items) == 2
def test_search_can_keep_ads_and_resolves_their_real_item_url(search_state):
result = parse_search(search_state, request_url="https://x", page=1, exclude_ads=False)
ads = [item for item in result.items if item.is_ad]
assert len(ads) == 1
# 广告位的 url 是跳转域,必须还原成 originalItemUrl 才能拿到商品编号
assert ads[0].item_url.startswith("https://item.rakuten.co.jp/")
assert ads[0].shop.shop_code and ads[0].item_code
def test_search_item_carries_fields_needed_to_call_item_detail(search_state):
result = parse_search(search_state, request_url="https://x", page=1, exclude_ads=True)
item = result.items[0]
assert item.item_name
assert item.price > 0
# shop.shop_code + item_code 就是 /api/item_detail 的入参
assert item.shop.shop_code and item.item_code
assert item.image_url.startswith("https://")
assert item.genre_id.isdigit()
def test_search_pagination_is_capped_by_site_subset(search_state):
result = parse_search(search_state, request_url="https://x", page=1, exclude_ads=True)
assert result.total_count > 0
# 站点声明命中数很大,但实际只能翻到 subset 条为止
assert result.reachable_count <= result.total_count
assert result.reachable_count <= 6750
def test_search_reports_request_url(search_state):
result = parse_search(search_state, request_url="https://search.rakuten.co.jp/x", page=1, exclude_ads=True)
assert result.request_url == "https://search.rakuten.co.jp/x"
def test_search_flags_out_of_range_page_and_drops_wrapped_items(search_state):
"""越过可达窗口时站点会静默回绕到第 1 页,必须识别出来而不是把重复数据交上去"""
assert search_state["state"]["data"]["effectiveUiQuestion"]["page"] == 1
result = parse_search(search_state, request_url="https://x", page=10, exclude_ads=True)
assert result.out_of_range is True
assert result.items == []
assert result.has_more is False
assert result.page == 10 # 回报请求页码,而不是站点回绕后的 1
def test_search_within_range_is_not_flagged_out_of_range(search_state):
search_state["state"]["data"]["effectiveUiQuestion"]["page"] = 3
result = parse_search(search_state, request_url="https://x", page=3, exclude_ads=True)
assert result.out_of_range is False
assert result.items
def test_search_rejects_state_without_search_node():
with pytest.raises(ScrapeParseError):
parse_search({"state": {"data": {}}}, request_url="https://x", page=1, exclude_ads=True)
# ---- 商品详情 ----
def test_item_detail_extracts_core_fields(item_state):
detail = parse_item_detail(
item_state, item_url="https://item.rakuten.co.jp/fafachai/tx-300/",
shop_code="fafachai", include_sku_variants=True,
)
assert detail.source == "ichiba"
assert detail.source_url == "https://item.rakuten.co.jp/fafachai/tx-300/"
assert detail.item_name
assert detail.item_code
assert detail.price > 0
assert detail.images and all(url.startswith("https://") for url in detail.images)
assert detail.shop.shop_id and detail.shop.shop_code
assert detail.genre_id.isdigit()
assert detail.breadcrumbs
def test_item_detail_purchasable_item_is_not_sold_out(item_state):
detail = parse_item_detail(
item_state, item_url="https://x", shop_code="fafachai", include_sku_variants=True,
)
assert detail.purchase_condition == "enabled"
assert detail.is_sold_out is False
def test_item_detail_parses_sku_axis_and_variants(item_state):
detail = parse_item_detail(
item_state, item_url="https://x", shop_code="fafachai", include_sku_variants=True,
)
assert detail.sku.inventory_type == "multiple"
assert detail.sku.axis and detail.sku.axis[0].values
assert detail.sku.variants
variant = detail.sku.variants[0]
assert variant.variant_id and variant.price > 0
assert len(variant.selector_values) == len(detail.sku.axis)
def test_item_detail_can_omit_variants_but_keeps_their_count(item_state):
"""SKU 组合可能上百条,关闭后应只省略明细、不丢失规模信息"""
full = parse_item_detail(item_state, item_url="https://x", shop_code="s", include_sku_variants=True)
slim = parse_item_detail(item_state, item_url="https://x", shop_code="s", include_sku_variants=False)
assert slim.sku.variants == []
assert slim.sku.variant_count == full.sku.variant_count > 0
assert slim.sku.axis == full.sku.axis
def test_item_detail_falls_back_to_request_shop_code_when_state_lacks_it(item_state):
item_state["shop"]["information"]["shopUrl"] = ""
detail = parse_item_detail(item_state, item_url="https://x", shop_code="fallback", include_sku_variants=False)
assert detail.shop.shop_code == "fallback"
def test_item_detail_rejects_state_without_item_node():
with pytest.raises(ScrapeParseError):
parse_item_detail({}, item_url="https://x", shop_code="s", include_sku_variants=True)
+187
View File
@@ -0,0 +1,187 @@
"""加购信息(purchase 块)解析测试
契约取自各站点前端构造加购请求的逻辑,四个来源的端点与字段名互不相同,
因此这里逐来源验证「提交到哪里、带哪些固定字段、数量/规格/选项各用哪个字段名」。
本服务只提供这些数据,不执行加购。
"""
from pathlib import Path
import pytest
from app.parsers.item import parse_item_detail, parse_purchase_options
from app.parsers.subsites import parse_subsite_item
from app.parsers.subsites.base import SubsitePage
from app.parsers.subsites.brandavenue import _resolve_cart_url
FIXTURES = Path(__file__).parent / "fixtures"
ICHIBA_URL = "https://item.rakuten.co.jp/fafachai/tx-300/"
def subsite(filename: str, host: str, shop_code: str, item_code: str):
return parse_subsite_item(
SubsitePage(
html=(FIXTURES / filename).read_text(encoding="utf-8"),
requested_url=f"https://item.rakuten.co.jp/{shop_code}/{item_code}/",
final_url=f"https://{host}/item/{item_code}/",
shop_code=shop_code,
item_code=item_code,
include_sku_variants=True,
)
)
# ---- 市场 ----
def test_ichiba_cart_url_comes_from_item_not_hardcoded(item_state):
"""basketDomain 逐商品不同(不同店铺落在不同 basket 集群),不能写死"""
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
assert d.purchase.cart_url == "https://ts.sp.basket.step.rakuten.co.jp/rms/mall/bss/cartadd/set"
def test_ichiba_form_fields_match_site_contract(item_state):
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
fields = d.purchase.form_fields
assert fields["shop_bid"] == str(d.shop.shop_id)
assert fields["item_id"] == d.item_id
assert fields["__event"] == "ES01_003_001"
assert d.purchase.quantity_field == "units"
assert d.purchase.variant_field == "variant_id"
def test_ichiba_multi_sku_reports_inventory_flag_2_without_prefilled_variant(item_state):
"""多规格商品必须由调用方选定 SKU,不能预填"""
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
assert d.sku.inventory_type == "multiple"
assert d.purchase.form_fields["inventory_flag"] == "2"
assert "variant_id" not in d.purchase.form_fields
def test_ichiba_single_sku_prefills_its_only_variant(item_state):
"""单一库存商品规格固定,直接填好,调用方无需再选"""
item_state["purchase"]["sku"]["inventoryType"] = "single"
item_state["item"]["variantId"] = "4902370549263"
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
assert d.purchase.form_fields["inventory_flag"] == "1"
assert d.purchase.form_fields["variant_id"] == "4902370549263"
def test_ichiba_selected_variant_id_is_available_from_sku(item_state):
"""调用方要往 variant_field 里填的值,来自 sku.variants[].variant_id"""
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
assert d.sku.variants[0].variant_id
def test_item_without_options_has_no_options_field(item_state):
d = parse_item_detail(item_state, item_url=ICHIBA_URL, shop_code="fafachai", include_sku_variants=True)
assert d.purchase.options == []
assert d.purchase.options_field == ""
assert d.purchase.has_required_options is False
# ---- 商品选项 ----
def test_options_are_parsed_with_types_and_required_flag(item_with_options_state):
d = parse_item_detail(
item_with_options_state,
item_url="https://item.rakuten.co.jp/kizamu/set-beermug-031/",
shop_code="kizamu",
include_sku_variants=True,
)
assert d.purchase.options_field == "choice"
assert d.purchase.has_required_options is True
types = {o.type for o in d.purchase.options}
assert {"select", "text"} <= types
required = [o for o in d.purchase.options if o.is_required]
assert required and required[0].name
def test_select_option_carries_candidate_values(item_with_options_state):
d = parse_item_detail(
item_with_options_state, item_url="https://x", shop_code="kizamu", include_sku_variants=True
)
select = next(o for o in d.purchase.options if o.type == "select")
assert select.values
assert all(v.name for v in select.values)
def test_text_option_has_no_candidate_values(item_with_options_state):
"""自由文本选项由买家填写,没有候选值"""
d = parse_item_detail(
item_with_options_state, item_url="https://x", shop_code="kizamu", include_sku_variants=True
)
text = next(o for o in d.purchase.options if o.type == "text")
assert text.values == []
def test_parse_purchase_options_tolerates_malformed_input():
assert parse_purchase_options(None) == []
assert parse_purchase_options([None, "x", 1]) == []
assert parse_purchase_options([{"id": 1, "name": "a", "type": "select", "values": [None]}])[0].values == []
# ---- 楽天ブックス ----
def test_books_item_id_comes_from_cart_form_not_url():
"""加购要用表单里的 item_id;URL 上的编号是市场侧商品编号,拿去下单会失败"""
d = subsite("books_item.html", "books.rakuten.co.jp", "book", "17065211")
assert d.item_code == "17065211"
assert d.item_id == "20600328"
assert d.purchase.form_fields["item_id"] == "20600328"
def test_books_cart_endpoint_and_shop_bid():
d = subsite("books_item.html", "books.rakuten.co.jp", "book", "17065211")
assert d.purchase.cart_url == "https://sp.books.step.rakuten.co.jp/rms/mall/book/bs/Cart"
assert d.purchase.form_fields["shop_bid"] == "213310"
def test_books_cart_form_has_no_quantity_or_variant_field():
"""该站表单不支持指定件数与规格,字段名留空以示不可用"""
d = subsite("books_item.html", "books.rakuten.co.jp", "book", "17065211")
assert d.purchase.quantity_field == ""
assert d.purchase.variant_field == ""
# ---- Rakuten Fashion ----
@pytest.mark.parametrize(
("cart_url_type", "expected"),
[
("6", "https://sp.basket.step.rakuten.co.jp/rms/mall/bss/cartadd/set"),
("5", "https://basket.step.rakuten.co.jp/rms/mall/bs/cartadd/set"),
("1", "https://ts.basket.step.rakuten.co.jp/rms/mall/bs/cartadd/set"),
("https://custom.example.com/cart", "https://custom.example.com/cart"),
("99", ""),
("", ""),
],
)
def test_brandavenue_cart_url_type_mapping(cart_url_type, expected):
"""端点由 cart_url_type 编号映射得到;已经是 URL 时原样使用"""
assert _resolve_cart_url(cart_url_type) == expected
def test_brandavenue_uses_same_contract_as_ichiba():
d = subsite("brandavenue_item.html", "brandavenue.rakuten.co.jp", "stylife", "md7606")
assert d.purchase.cart_url == "https://sp.basket.step.rakuten.co.jp/rms/mall/bss/cartadd/set"
assert d.purchase.form_fields["shop_bid"] == "279405"
assert d.purchase.form_fields["item_id"] == "14674748"
assert d.purchase.form_fields["inventory_flag"] == "2"
assert d.purchase.quantity_field == "units"
assert d.purchase.variant_field == "variant_id"
def test_brandavenue_variant_ids_are_usable_for_cart():
"""variant_field 要填的值就是 sku.variants[].variant_id(来自 inventory_list)"""
d = subsite("brandavenue_item.html", "brandavenue.rakuten.co.jp", "stylife", "md7606")
assert all(v.variant_id for v in d.sku.variants if v.quantity)
# ---- ビックカメラ ----
def test_biccamera_uses_its_own_json_endpoint_without_shop_bid():
d = subsite("biccamera_item.html", "biccamera.rakuten.co.jp", "biccamera", "4548736147041")
assert d.purchase.cart_url == "https://biccamera.step.rakuten.co.jp/cart/item"
assert d.purchase.form_fields == {"item_id": "13873289"}
assert d.purchase.quantity_field == "units"
assert "shop_bid" not in d.purchase.form_fields
+285
View File
@@ -0,0 +1,285 @@
"""ラクマ(fril.jp)解析测试:基于真实页面裁剪出的夹具
夹具保留了解析所依赖的结构微数据规格表埋点属性商品卡片
去掉了广告位与推荐位等噪音全部离线运行
"""
from pathlib import Path
import pytest
from app.core.errors import InvalidRequestError, ScrapeParseError
from app.models.scrape import (
RakumaAuthenticity,
RakumaCondition,
RakumaSearchRequest,
RakumaSortOption,
RakumaTransaction,
)
from app.parsers.rakuma.base import parse_int, parse_total_count
from app.parsers.rakuma.item import parse_item_detail
from app.parsers.rakuma.search import parse_search
from app.parsers.rakuma.shop import parse_shop_detail, parse_shop_items
from app.utils.rakuma_urls import (
build_item_url,
build_search_url,
build_shop_url,
normalize_search_url,
split_item_url,
split_shop_url,
)
FIXTURES = Path(__file__).parent / "fixtures"
def fixture(name: str) -> str:
return (FIXTURES / name).read_text(encoding="utf-8")
# ---- URL 构建 ----
def test_search_url_carries_keyword_and_default_sort():
url = build_search_url(RakumaSearchRequest(keyword="switch"))
assert "query=switch" in url
# 站点的排序由 sort + order 两个参数共同决定,默认是相关度降序
assert "sort=relevance" in url and "order=desc" in url
def test_search_url_maps_filters_to_site_codes():
"""筛选码必须与站点码表一致——站点对不认识的取值会静默返回首页"""
url = build_search_url(
RakumaSearchRequest(
keyword="switch",
category_id="788",
brand_id="5296",
min_price=3000,
max_price=20000,
conditions=[RakumaCondition.NEW, RakumaCondition.ALMOST_NEW],
transaction=RakumaTransaction.ON_SALE,
free_shipping=True,
anonymous_shipping=True,
authenticity_types=[RakumaAuthenticity.BEFORE_DELIVERY],
sort=RakumaSortOption.PRICE_ASC,
page=3,
)
)
assert "category_id=788" in url
assert "brand_id=5296" in url
assert "min=3000" in url and "max=20000" in url
assert "statuses=5%2C4" in url # 多选成色用逗号连接
assert "transaction=selling" in url
assert "carriage=1" in url
assert "anonymous_shipping=true" in url
assert "authenticity_types=pre" in url
assert "sort=sell_price" in url and "order=asc" in url
assert "page=3" in url
def test_search_url_except_for_no_brand_overrides_brand_id():
"""站点前端把两者做成互斥分支,勾选排除无品牌时不下发 brand_id"""
url = build_search_url(
RakumaSearchRequest(keyword="a", brand_id="5296", except_for_no_brand=True)
)
assert "except_for_no_brand=true" in url
assert "brand_id" not in url
def test_search_url_omits_page_on_first_page():
assert "page=" not in build_search_url(RakumaSearchRequest(keyword="switch"))
def test_search_requires_a_target():
with pytest.raises(ValueError):
RakumaSearchRequest()
def test_exclude_keyword_requires_a_keyword():
"""站点在无关键词时不接受排除词,提前拦下而不是打一次无效请求"""
with pytest.raises(ValueError):
RakumaSearchRequest(category_id="788", exclude_keyword="本体")
def test_normalize_search_url_overrides_page():
url = normalize_search_url("https://fril.jp/s?query=switch&page=2", 5)
assert "page=5" in url and "page=2" not in url
def test_normalize_search_url_rejects_foreign_host():
with pytest.raises(InvalidRequestError):
normalize_search_url("https://example.com/s?query=x", 1)
def test_item_and_shop_url_round_trip():
item_id = "4aca1d6db3e422f3a251a8a8b61e1eff"
assert split_item_url(build_item_url(item_id)) == item_id
shop_id = "422750cb7921557bc8dba2416915d968"
assert split_shop_url(build_shop_url(shop_id)) == shop_id
def test_shop_url_supports_paging_and_review_page():
shop_id = "abc123"
assert build_shop_url(shop_id, page=2).endswith("?page=2")
assert build_shop_url(shop_id, review=True).endswith("/review")
def test_split_urls_reject_wrong_host_or_path():
with pytest.raises(InvalidRequestError):
split_item_url("https://fril.jp/item/abc") # 商品页在 item.fril.jp 子域
with pytest.raises(InvalidRequestError):
split_shop_url("https://fril.jp/brand/5296")
# ---- 搜索页解析 ----
def test_parse_search_reads_items_and_exact_total():
result = parse_search(
fixture("rakuma_search.html"), request_url="u", page=1, keyword="switch"
)
assert len(result.items) == 3
# 页面上展示的是四舍五入值(約1,190,000件),精确值取自埋点属性
assert result.total_count == 1196774
assert result.request_url == "u"
item = result.items[0]
assert item.item_id == "61b174d42b58216828a24b86b7903ced"
assert item.item_number == "844649627"
assert item.price == 6299
assert item.is_sold_out is True
assert item.brand_id == "5296"
assert item.brand_name == "Nintendo Switch"
assert item.category_id == "788"
assert item.seller_user_id == "12073120"
assert item.image_url.startswith("https://img.fril.jp/")
def test_parse_search_rejects_non_search_page():
"""站点对无法识别的筛选取值会静默返回首页,必须识别出来而不是当成空结果"""
with pytest.raises(ScrapeParseError):
parse_search("<html><body>home</body></html>", request_url="u", page=1, keyword="x")
def test_parse_search_has_more_stops_at_site_page_limit():
"""站点 page>100 直接 404,第 100 页不应再报 has_more"""
result = parse_search(
fixture("rakuma_search.html"), request_url="u", page=100, keyword="switch"
)
assert result.has_more is False
# ---- 商品详情解析 ----
def test_parse_item_detail_reads_all_blocks():
detail = parse_item_detail(fixture("rakuma_item.html"), item_id="X", item_url="u")
assert detail.item_id == "X"
assert detail.item_number == "844877033"
assert detail.item_name == "NintendoSwitch ONE PIECE 海賊無双4"
assert detail.price == 2460
assert detail.is_sold_out is False
assert detail.condition == "目立った傷や汚れなし"
assert detail.brand_id == "6454"
assert detail.category_id == "788"
assert detail.shipping_from == "北海道"
assert detail.shipping_method == "かんたんラクマパック(ヤマト運輸)"
assert detail.is_anonymous_shipping is True
assert [crumb.name for crumb in detail.breadcrumbs] == [
"エンタメ/ホビー",
"ゲームソフト/ゲーム機本体",
"家庭用ゲームソフト",
]
assert detail.images and all("img.fril.jp" in url for url in detail.images)
assert detail.seller.shop_id == "83b56a796a72011dc58b6e469270dfb7"
assert detail.seller.user_id == "3850223"
assert detail.seller.is_verified is True
def test_parse_item_detail_falls_back_to_tracking_attrs_when_sold_out():
"""已售出商品的页面换了套布局、规格表消失,需退回页面级埋点属性取值"""
detail = parse_item_detail(fixture("rakuma_item_sold.html"), item_id="Y", item_url="u")
assert detail.is_sold_out is True
assert detail.item_number == "844649627"
assert detail.condition == "新品、未使用" # 规格表已消失,取自埋点
assert detail.shipping_from == "千葉県"
assert detail.brand_id == "5296"
# 价格与名称仍由 ld+json 提供,不受布局变化影响
assert detail.price == 6299
assert detail.item_name.startswith("スプラトゥーン")
def test_parse_item_detail_rejects_non_item_page():
with pytest.raises(ScrapeParseError):
parse_item_detail("<html><body>nope</body></html>", item_id="X", item_url="u")
# ---- 店铺解析 ----
def test_parse_shop_detail_reads_profile_and_rating():
detail = parse_shop_detail(
fixture("rakuma_shop.html"), shop_id="S", shop_url="u"
)
assert detail.shop_name == "(^.^)"
assert detail.user_id == "12073120"
# 评价数只有 ld+json 的 Store 节点给得出来,可见 DOM 上没有
assert detail.review_score == 5.0
assert detail.review_count == 1886
assert detail.item_count == 21
assert detail.is_verified is True
assert detail.verification_label == "本人確認済"
assert detail.introduction
def test_parse_shop_detail_reads_reviews_when_supplied():
detail = parse_shop_detail(
fixture("rakuma_shop.html"),
shop_id="S",
shop_url="u",
review_html=fixture("rakuma_shop_review.html"),
)
assert detail.rating_breakdown.good == 118
assert detail.rating_breakdown.bad == 0
assert detail.seller_rating_breakdown.good == 110
assert len(detail.reviews) == 3
first = detail.reviews[0]
assert first.rating == "good"
assert first.reviewer_name == "トシちゃん"
assert first.reviewed_at == "2026/05/04"
def test_parse_shop_detail_leaves_reviews_empty_by_default():
"""不传评价页时不应臆造分档数据"""
detail = parse_shop_detail(fixture("rakuma_shop.html"), shop_id="S", shop_url="u")
assert detail.reviews == []
assert detail.rating_breakdown.good == 0
def test_parse_shop_items_reads_cards_and_total():
result = parse_shop_items(
fixture("rakuma_shop.html"), shop_id="S", request_url="u", page=1
)
assert result.shop_id == "S"
assert result.shop_name == "(^.^)"
assert result.total_count == 21
assert len(result.items) == 2
assert result.items[0].item_id == "61546447a7f13c34a5d015f37a7f3319"
assert result.items[0].price == 6399
def test_parse_shop_pages_reject_non_shop_page():
with pytest.raises(ScrapeParseError):
parse_shop_detail("<html><body>x</body></html>", shop_id="S", shop_url="u")
with pytest.raises(ScrapeParseError):
parse_shop_items("<html><body>x</body></html>", shop_id="S", request_url="u", page=1)
# ---- 取值工具 ----
@pytest.mark.parametrize(
"text,expected",
[("¥6,299", 6299), ("いいね 12件", 12), ("6399", 6399), ("", 0), (None, 0)],
)
def test_parse_int_handles_site_formats(text, expected):
assert parse_int(text) == expected
def test_parse_total_count_handles_nbsp_and_rounding_prefix():
assert parse_total_count("約1,190,000件中 1\xa0-\xa040件") == (1190000, 1, 40)
assert parse_total_count("21件中 1 - 21件") == (21, 1, 21)
assert parse_total_count("no numbers here") == (0, 0, 0)
+116
View File
@@ -0,0 +1,116 @@
"""ラクマ 会话层测试:并发限流下的重试与错误映射
全部用 httpx.MockTransport 拦截不触达真实站点
"""
from __future__ import annotations
import httpx
import pytest
from app.core import rakuma_site as site
from app.core.config import Settings
from app.core.errors import ItemNotFoundError, UpstreamRequestError
from app.services.rakuma_session import RakumaSession
TARGET = "https://fril.jp/s?query=switch"
GOOD_PAGE = '<html><body><div class="page-count">21件中 1 - 21件</div></body></html>'
def make_settings(**overrides) -> Settings:
base = {
"http_max_attempts": 3,
"request_timeout_seconds": 5.0,
"max_site_concurrency": 4,
}
base.update(overrides)
return Settings(**base)
async def build_session(handler, *, settings=None) -> RakumaSession:
"""构建 RakumaSession 并把 client 换成 MockTransport 版本"""
session = RakumaSession(settings or make_settings())
await session.start()
await session._client.aclose()
session._client = httpx.AsyncClient(
headers=site.default_headers(),
transport=httpx.MockTransport(handler),
follow_redirects=True,
)
return session
async def test_fetch_returns_page_without_warmup():
"""ラクマ 无 Akamai 限速,不应像乐天那样先打一次首页预热"""
seen: list[str] = []
def handler(request: httpx.Request) -> httpx.Response:
seen.append(str(request.url))
return httpx.Response(200, text=GOOD_PAGE)
session = await build_session(handler)
try:
assert await session.fetch_html(TARGET) == GOOD_PAGE
finally:
await session.close()
assert seen == [TARGET]
async def test_404_fails_fast_without_retrying():
"""商品下架或 ID 不存在时重试没有意义"""
attempts = {"n": 0}
def handler(request: httpx.Request) -> httpx.Response:
attempts["n"] += 1
return httpx.Response(404, text="not found")
session = await build_session(handler)
try:
with pytest.raises(ItemNotFoundError):
await session.fetch_html("https://item.fril.jp/deadbeef")
finally:
await session.close()
assert attempts["n"] == 1
async def test_retry_recovers_when_a_later_attempt_succeeds():
attempts = {"n": 0}
def handler(request: httpx.Request) -> httpx.Response:
attempts["n"] += 1
if attempts["n"] == 1:
return httpx.Response(503, text="unavailable")
return httpx.Response(200, text=GOOD_PAGE)
session = await build_session(handler)
try:
assert await session.fetch_html(TARGET) == GOOD_PAGE
finally:
await session.close()
assert attempts["n"] == 2
async def test_persistent_5xx_surfaces_as_request_error():
def handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(503, text="unavailable")
session = await build_session(handler)
try:
with pytest.raises(UpstreamRequestError):
await session.fetch_html(TARGET)
finally:
await session.close()
async def test_status_reports_readiness():
def handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(200, text=GOOD_PAGE)
session = RakumaSession(make_settings())
assert session.status()["ready"] is False
session = await build_session(handler)
try:
assert session.status()["ready"] is True
finally:
await session.close()
assert session.status()["ready"] is False
+146
View File
@@ -0,0 +1,146 @@
"""搜索/商品 URL 构建与解析的单元测试"""
from urllib.parse import parse_qsl, urlsplit
import pytest
from app.core.errors import InvalidRequestError
from app.models.scrape import ItemCondition, SearchRequest, SortOption
from app.utils.urls import (
build_item_url,
build_search_url,
item_url_parts,
normalize_search_url,
split_item_url,
)
def query_of(url: str) -> list[tuple[str, str]]:
return parse_qsl(urlsplit(url).query, keep_blank_values=True)
def test_keyword_only_uses_default_sort_without_params():
url = build_search_url(SearchRequest(keyword="nintendo switch"))
assert url == "https://search.rakuten.co.jp/search/mall/nintendo%20switch/"
def test_genre_without_keyword_uses_placeholder_segment():
url = build_search_url(SearchRequest(genre_id="565950"))
assert urlsplit(url).path == "/search/mall/-/565950/"
def test_keyword_and_genre_are_both_path_segments():
url = build_search_url(SearchRequest(keyword="switch", genre_id="565950"))
assert urlsplit(url).path == "/search/mall/switch/565950/"
def test_page_one_is_omitted_but_later_pages_are_explicit():
assert "p=" not in build_search_url(SearchRequest(keyword="a", page=1))
assert ("p", "3") in query_of(build_search_url(SearchRequest(keyword="a", page=3)))
@pytest.mark.parametrize(
("sort", "expected"),
[
(SortOption.STANDARD, None),
(SortOption.PRICE_ASC, "2"),
(SortOption.PRICE_DESC, "3"),
(SortOption.NEWEST, "4"),
(SortOption.REVIEW_COUNT, "5"),
(SortOption.REVIEW_SCORE, "6"),
(SortOption.PRICE_WITH_SHIPPING_ASC, "11"),
(SortOption.PRICE_WITH_SHIPPING_DESC, "12"),
],
)
def test_sort_maps_to_site_codes(sort, expected):
"""排序码取自站点前端 bundle 的枚举,改动会直接影响返回顺序"""
query = dict(query_of(build_search_url(SearchRequest(keyword="a", sort=sort))))
assert query.get("s") == expected
def test_condition_and_bool_filters_share_repeatable_f_param():
url = build_search_url(
SearchRequest(
keyword="a",
condition=ItemCondition.USED,
free_shipping=True,
include_sold_out=True,
has_review=True,
next_day_delivery=True,
super_deal=True,
)
)
f_values = sorted(value for key, value in query_of(url) if key == "f")
assert f_values == sorted(["100", "0", "2", "4", "12", "13"])
def test_advanced_filters_are_mapped_to_site_param_names():
url = build_search_url(
SearchRequest(
keyword="a",
min_price=1000,
max_price=5000,
shop_id=272415,
exclude_keyword="中古",
title_only=True,
or_query=True,
min_review_score=4,
tags=["1001", "1002"],
)
)
query = dict(query_of(url))
assert query["min"] == "1000"
assert query["max"] == "5000"
assert query["sid"] == "272415"
assert query["nitem"] == "中古"
assert query["sf"] == "1"
assert query["st"] == "O"
assert query["review"] == "4"
assert query["tg"] == "1001,1002"
def test_search_request_requires_a_target():
with pytest.raises(ValueError):
SearchRequest()
def test_search_request_rejects_inverted_price_range():
with pytest.raises(ValueError):
SearchRequest(keyword="a", min_price=5000, max_price=1000)
def test_normalize_search_url_keeps_url_untouched_on_first_page():
raw = "https://search.rakuten.co.jp/search/mall/switch/?s=2&f=2"
assert normalize_search_url(raw, 1) == raw
def test_normalize_search_url_overrides_existing_page():
raw = "https://search.rakuten.co.jp/search/mall/switch/?p=9&s=2"
query = dict(query_of(normalize_search_url(raw, 4)))
assert query["p"] == "4"
assert query["s"] == "2"
def test_normalize_search_url_rejects_foreign_host():
with pytest.raises(InvalidRequestError):
normalize_search_url("https://example.com/search/mall/switch/", 1)
def test_build_item_url_joins_shop_and_item_code():
assert build_item_url("edion", "4902370549263") == "https://item.rakuten.co.jp/edion/4902370549263/"
def test_split_item_url_extracts_shop_and_item_code():
assert split_item_url("https://item.rakuten.co.jp/edion/4902370549263/?variantId=x") == (
"edion",
"4902370549263",
)
def test_split_item_url_rejects_foreign_host():
with pytest.raises(InvalidRequestError):
split_item_url("https://www.rakuten.co.jp/edion/4902370549263/")
def test_item_url_parts_returns_empty_for_ad_redirect_links():
"""广告位链接指向跳转域,解析不出来应静默返回空串而不是抛异常"""
assert item_url_parts("https://grp07.ias.rakuten.co.jp/redirect_rpp/?s=abc") == ("", "")
+101
View File
@@ -0,0 +1,101 @@
"""乐天商家(店铺)解析与请求转换测试"""
import json
from pathlib import Path
import pytest
from app.core.errors import InvalidRequestError, ScrapeParseError
from app.models.scrape import ShopItemsRequest, SortOption
from app.parsers.shop import parse_shop_detail
from app.utils.urls import build_search_url, build_shop_url, split_shop_url
FIXTURES = Path(__file__).parent / "fixtures"
@pytest.fixture
def shop_state() -> dict:
return json.loads((FIXTURES / "shop_state.json").read_text(encoding="utf-8"))
@pytest.fixture
def shop_html() -> str:
return (FIXTURES / "shop_page.html").read_text(encoding="utf-8")
# ---- 解析 ----
def test_parse_shop_detail_reads_state_and_logo(shop_state, shop_html):
detail = parse_shop_detail(shop_state, shop_code="edion", html=shop_html)
assert detail.shop_id == 272415
assert detail.shop_code == "edion"
assert detail.shop_name == "エディオン 楽天市場店"
assert detail.review_score == 4.51
assert detail.review_count == 128136
assert detail.review_displayed is True
assert detail.is_39_shop is True
assert detail.status == 1
assert detail.introduction
assert detail.signboard_url.startswith("https://")
# logo 不在 state 里,只能从页面的 ld+json 微数据取
assert detail.logo_url.startswith("https://thumbnail.image.rakuten.co.jp/")
def test_parse_shop_detail_normalizes_shop_url(shop_state):
"""state 里的 shopUrl 是 http 且不带尾斜杠,对外统一成规范形式"""
detail = parse_shop_detail(shop_state, shop_code="edion")
assert detail.shop_url == "https://www.rakuten.co.jp/edion/"
def test_parse_shop_detail_without_html_leaves_logo_empty(shop_state):
assert parse_shop_detail(shop_state, shop_code="edion").logo_url == ""
def test_parse_shop_detail_rejects_page_without_shop_node():
with pytest.raises(ScrapeParseError):
parse_shop_detail({"state": {}}, shop_code="edion")
# ---- URL ----
def test_shop_url_round_trip():
assert split_shop_url(build_shop_url("edion")) == "edion"
def test_split_shop_url_rejects_reserved_paths():
"""/category/ 之类的站点自有路径不是店铺页,别把 category 当成店铺代码"""
with pytest.raises(InvalidRequestError):
split_shop_url("https://www.rakuten.co.jp/category/101205/")
def test_split_shop_url_rejects_foreign_host():
with pytest.raises(InvalidRequestError):
split_shop_url("https://item.rakuten.co.jp/edion/123/")
# ---- 商家商品:转成限定店铺的搜索 ----
def test_shop_items_request_converts_to_shop_scoped_search():
payload = ShopItemsRequest(
shop_code="edion", page=2, keyword="テレビ", sort=SortOption.PRICE_ASC, max_price=50000
)
search = payload.to_search_request(272415)
assert search.shop_id == 272415
assert search.keyword == "テレビ"
assert search.page == 2
url = build_search_url(search)
assert "sid=272415" in url
assert "p=2" in url
assert "s=2" in url # price_asc
assert "max=50000" in url
def test_shop_items_request_needs_an_identifier():
with pytest.raises(ValueError):
ShopItemsRequest()
def test_search_accepts_shop_id_alone_as_target():
"""只按店铺取商品是合法查询:站点的 sid-only 搜索能正常返回"""
url = build_search_url(ShopItemsRequest(shop_id=272415).to_search_request(272415))
assert "sid=272415" in url
+280
View File
@@ -0,0 +1,280 @@
"""会话层测试:cookie 预热、失败升级、浏览器兜底降级
全部用 httpx.MockTransport 拦截不触达真实站点
"""
from __future__ import annotations
import httpx
import pytest
from app.core import site
from app.core.config import Settings
from app.core.errors import (
ItemNotFoundError,
OffIchibaRedirectError,
UpstreamBlockedError,
UpstreamRequestError,
)
from app.parsers.subsites import build_item_page_validator
from app.services.browser_fallback import BrowserVisit
from app.services.site_session import SiteSession
GOOD_PAGE = '<html><script>window.__INITIAL_STATE__ = {"ok":1};</script></html>'
BLOCK_PAGE = "<html><body>Access Denied. Reference #18.abc</body></html>"
TARGET = "https://search.rakuten.co.jp/search/mall/x/"
class FakeBrowser:
"""可控的浏览器兜底替身"""
def __init__(self, visit: BrowserVisit | None = None):
self.visit_result = visit
self.calls: list[tuple[str, bool]] = []
self.enabled = True
self.unavailable_reason = None if visit else "playwright is not installed"
self.ready = visit is not None
async def visit(self, url: str, *, mobile: bool) -> BrowserVisit | None:
self.calls.append((url, mobile))
return self.visit_result
async def close(self) -> None:
pass
def make_settings(**overrides) -> Settings:
base = {
"http_max_attempts": 3,
"request_timeout_seconds": 5.0,
"max_site_concurrency": 4,
"browser_fallback_enabled": True,
}
base.update(overrides)
return Settings(**base)
async def build_session(handler, *, browser=None, settings=None) -> SiteSession:
"""构建 SiteSession 并把两条通道的 client 换成 MockTransport 版本"""
session = SiteSession(settings or make_settings(), browser or FakeBrowser())
await session.start()
for profile in session._profiles.values():
await profile.client.aclose()
profile.client = httpx.AsyncClient(
headers=site.default_headers(mobile=profile.mobile),
transport=httpx.MockTransport(handler),
follow_redirects=True,
)
return session
async def test_warmup_happens_before_first_fetch_and_is_reused():
seen: list[str] = []
def handler(request: httpx.Request) -> httpx.Response:
seen.append(str(request.url))
headers = {}
if request.url.host == "www.rakuten.co.jp":
headers["set-cookie"] = "ak_bmsc=abc; Domain=.rakuten.co.jp; Path=/"
return httpx.Response(200, text=GOOD_PAGE, headers=headers)
session = await build_session(handler)
try:
await session.fetch_html(TARGET, mobile=False)
await session.fetch_html(TARGET, mobile=False)
finally:
await session.close()
# 首页预热只做一次,第二次抓取直接复用 cookie
assert seen.count("https://www.rakuten.co.jp/") == 1
assert seen.count(TARGET) == 2
async def test_missing_state_marker_is_treated_as_blocked():
def handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(200, text="<html>no state here</html>")
session = await build_session(handler)
try:
with pytest.raises(UpstreamBlockedError):
await session.fetch_html(TARGET, mobile=False)
finally:
await session.close()
async def test_retry_recovers_when_a_later_attempt_succeeds():
attempts = {"n": 0}
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
attempts["n"] += 1
if attempts["n"] == 1:
return httpx.Response(200, text=BLOCK_PAGE)
return httpx.Response(200, text=GOOD_PAGE)
session = await build_session(handler)
try:
assert await session.fetch_html(TARGET, mobile=False) == GOOD_PAGE
finally:
await session.close()
assert attempts["n"] == 2
async def test_browser_fallback_supplies_cookies_and_page_on_persistent_block():
"""浏览器已经取到页面时应直接采用,不再多打一次 HTTP"""
browser = FakeBrowser(
BrowserVisit(
cookies=[{"name": "bm_sv", "value": "xyz", "domain": ".rakuten.co.jp", "path": "/"}],
html=GOOD_PAGE,
)
)
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
return httpx.Response(200, text=BLOCK_PAGE)
session = await build_session(handler, browser=browser)
try:
assert await session.fetch_html(TARGET, mobile=False) == GOOD_PAGE
finally:
cookie_names = {cookie.name for cookie in session._profiles["pc"].client.cookies.jar}
await session.close()
assert browser.calls == [(TARGET, False)]
assert "bm_sv" in cookie_names # cookie 已回灌,后续请求可复用
async def test_missing_playwright_degrades_to_blocked_error_not_crash():
browser = FakeBrowser(None) # 模拟未安装 playwright
def handler(request: httpx.Request) -> httpx.Response:
return httpx.Response(200, text=BLOCK_PAGE)
session = await build_session(handler, browser=browser)
try:
with pytest.raises(UpstreamBlockedError):
await session.fetch_html(TARGET, mobile=False)
finally:
await session.close()
assert browser.calls # 尝试过兜底
async def test_404_fails_fast_without_retrying():
attempts = {"n": 0}
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
attempts["n"] += 1
return httpx.Response(404, text="not found")
session = await build_session(handler)
try:
with pytest.raises(ItemNotFoundError):
await session.fetch_html("https://item.rakuten.co.jp/s/c/", mobile=True)
finally:
await session.close()
assert attempts["n"] == 1
async def test_unsupported_subsite_redirect_fails_fast_without_retrying():
"""跳到未登记的乐天子站时重试没有意义,应立刻以专门的错误返回"""
attempts = {"n": 0}
requested = "https://item.rakuten.co.jp/somewhere/1/"
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
if request.url.host == "item.rakuten.co.jp":
attempts["n"] += 1
return httpx.Response(302, headers={"location": "https://unknown.rakuten.co.jp/x/1/"})
return httpx.Response(200, text="<html>unknown site</html>")
session = await build_session(handler)
try:
with pytest.raises(OffIchibaRedirectError) as exc:
await session.fetch(
requested, mobile=True, validator=build_item_page_validator(requested)
)
finally:
await session.close()
assert attempts["n"] == 1
assert exc.value.final_url == "https://unknown.rakuten.co.jp/x/1/"
async def test_known_subsite_redirect_is_accepted_and_reports_final_url():
"""已登记的子站应正常通过校验,并把落地地址回报给调用方用于分派"""
requested = "https://item.rakuten.co.jp/biccamera/1/"
landed = "https://biccamera.rakuten.co.jp/item/1/"
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
if request.url.host == "item.rakuten.co.jp":
return httpx.Response(302, headers={"location": landed})
return httpx.Response(200, text='<html><script>window.__NUXT__={"state":{}}</script></html>')
session = await build_session(handler)
try:
page = await session.fetch(
requested, mobile=True, validator=build_item_page_validator(requested)
)
finally:
await session.close()
assert page.url == landed
assert "__NUXT__" in page.html
async def test_upstream_5xx_surfaces_as_request_error():
def handler(request: httpx.Request) -> httpx.Response:
if request.url.host == "www.rakuten.co.jp":
return httpx.Response(200, text="home")
return httpx.Response(503, text="service unavailable")
session = await build_session(handler)
try:
with pytest.raises(UpstreamRequestError):
await session.fetch_html(TARGET, mobile=False)
finally:
await session.close()
async def test_search_and_detail_use_separate_cookie_jars():
"""PC 与手机两条通道的 cookie 不能互相污染"""
def handler(request: httpx.Request) -> httpx.Response:
mobile = request.headers.get("sec-ch-ua-mobile") == "?1"
headers = {}
if request.url.host == "www.rakuten.co.jp":
headers["set-cookie"] = f"ak_bmsc={'sp' if mobile else 'pc'}; Domain=.rakuten.co.jp; Path=/"
return httpx.Response(200, text=GOOD_PAGE, headers=headers)
session = await build_session(handler)
try:
await session.fetch_html(TARGET, mobile=False)
await session.fetch_html("https://item.rakuten.co.jp/s/c/", mobile=True)
pc_cookie = session._profiles["pc"].client.cookies.get("ak_bmsc")
sp_cookie = session._profiles["sp"].client.cookies.get("ak_bmsc")
finally:
await session.close()
assert pc_cookie == "pc"
assert sp_cookie == "sp"
async def test_profile_status_reports_warmup_state():
def handler(request: httpx.Request) -> httpx.Response:
headers = {"set-cookie": "ak_bmsc=abc; Domain=.rakuten.co.jp; Path=/"}
return httpx.Response(200, text=GOOD_PAGE, headers=headers)
session = await build_session(handler)
try:
assert session.profile_status()["pc"]["warmed"] is False
await session.fetch_html(TARGET, mobile=False)
status = session.profile_status()
assert status["pc"]["warmed"] is True
assert "ak_bmsc" in status["pc"]["cookies"]
assert status["sp"]["warmed"] is False
finally:
await session.close()
+290
View File
@@ -0,0 +1,290 @@
"""子站商品页解析测试:基于真实页面样本
夹具说明books 的解析依赖 DOM 结构保留了完整真实页面brandavenue
biccamera 只读页面内联的 JSON夹具做了裁剪以免把上百 KB 的噪音带进仓库
"""
from pathlib import Path
import pytest
from app.core.errors import OffIchibaRedirectError, ScrapeParseError
from app.parsers.subsites import (
SUBSITE_PARSERS,
build_item_page_validator,
host_of,
parse_subsite_item,
)
from app.parsers.subsites.base import SubsitePage, looks_sold_out, parse_price
FIXTURES = Path(__file__).parent / "fixtures"
def make_page(filename: str, *, host: str, shop_code: str, item_code: str, variants: bool = True):
return SubsitePage(
html=(FIXTURES / filename).read_text(encoding="utf-8"),
requested_url=f"https://item.rakuten.co.jp/{shop_code}/{item_code}/",
final_url=f"https://{host}/item/{item_code}/",
shop_code=shop_code,
item_code=item_code,
include_sku_variants=variants,
)
@pytest.fixture
def books_page():
return make_page("books_item.html", host="books.rakuten.co.jp", shop_code="book", item_code="17065211")
@pytest.fixture
def brandavenue_page():
return make_page(
"brandavenue_item.html", host="brandavenue.rakuten.co.jp", shop_code="stylife", item_code="md7606"
)
@pytest.fixture
def biccamera_page():
return make_page(
"biccamera_item.html", host="biccamera.rakuten.co.jp", shop_code="biccamera", item_code="4548736147041"
)
# ---- 通用工具 ----
@pytest.mark.parametrize(
("raw", "expected"),
[("3,091円", 3091), ("1760", 1760), (1760, 1760), ("", 0), (None, 0), ("価格未定", 0)],
)
def test_parse_price_handles_site_formats(raw, expected):
assert parse_price(raw) == expected
@pytest.mark.parametrize(
("status", "expected"),
[("在庫あり", False), ("在庫なし", True), ("品切れ", True), ("販売終了", True), ("", False)],
)
def test_looks_sold_out_reads_japanese_stock_wording(status, expected):
assert looks_sold_out(status) is expected
# ---- 分派 ----
def test_registry_covers_the_three_known_subsites():
assert set(SUBSITE_PARSERS) == {
"books.rakuten.co.jp",
"brandavenue.rakuten.co.jp",
"biccamera.rakuten.co.jp",
}
def test_validator_accepts_ichiba_page_with_state():
validate = build_item_page_validator("https://item.rakuten.co.jp/s/c/")
ok = validate("window.__INITIAL_STATE__ = {}", "https://item.rakuten.co.jp/s/c/")
assert ok is None
def test_validator_rejects_ichiba_page_without_state_as_retryable():
validate = build_item_page_validator("https://item.rakuten.co.jp/s/c/")
reason = validate("<html>blocked</html>", "https://item.rakuten.co.jp/s/c/")
assert reason and "INITIAL_STATE" in reason
def test_validator_raises_for_unregistered_subsite():
"""未登记的站点是「不支持」而非「抓取失败」,不能走重试"""
validate = build_item_page_validator("https://item.rakuten.co.jp/s/c/")
with pytest.raises(OffIchibaRedirectError):
validate("<html>whatever</html>", "https://unknown.rakuten.co.jp/x/")
def test_validator_delegates_to_subsite_rules(books_page):
validate = build_item_page_validator(books_page.requested_url)
assert validate(books_page.html, books_page.final_url) is None
assert validate("<html>empty</html>", books_page.final_url) is not None
def test_parse_subsite_item_rejects_unknown_host(books_page):
books_page.final_url = "https://unknown.rakuten.co.jp/x/"
with pytest.raises(ScrapeParseError):
parse_subsite_item(books_page)
def test_host_of_extracts_hostname():
assert host_of("https://books.rakuten.co.jp/rb/1/?a=b") == "books.rakuten.co.jp"
# ---- 楽天ブックス ----
def test_books_extracts_core_fields(books_page):
d = parse_subsite_item(books_page)
assert d.source == "books"
assert d.source_url == books_page.final_url
assert d.item_url == books_page.requested_url
assert d.item_name == "12歳までに知っておきたい語彙力図鑑"
assert d.price == 1760
assert d.shop.shop_code == "book"
assert d.shop.shop_name == "楽天ブックス"
def test_books_maps_review_and_stock(books_page):
d = parse_subsite_item(books_page)
assert d.review.score == pytest.approx(4.54)
assert d.review.count == 218
assert d.purchase_condition == "在庫あり"
assert d.is_sold_out is False
def test_books_uses_rms_genre_ids_for_breadcrumbs(books_page):
"""站内分类 ID 对上游没用,要取 data_genres 里的 rmsGenreId(市场侧 genre_id)"""
d = parse_subsite_item(books_page)
assert [b.name for b in d.breadcrumbs] == ["", "絵本・児童書・図鑑", "図鑑・ちしき"]
assert d.genre_id == "208880"
assert d.breadcrumbs[0].url == "https://www.rakuten.co.jp/category/200162/"
def test_books_spec_table_becomes_sku_attributes(books_page):
d = parse_subsite_item(books_page)
spec = {a.title: a.value for a in d.sku.attributes}
assert spec["ISBN"] == "9784800590039"
assert spec["出版社"] == "日本能率協会マネジメントセンター"
assert "齋藤 孝" in spec["著者/編集"]
def test_books_description_collects_flat_sibling_sections(books_page):
"""标题与正文是兄弟节点而非父子,按容器取会漏掉绝大部分内容"""
d = parse_subsite_item(books_page)
assert len(d.description) > 1000
assert "内容紹介(JPROより)" in d.description
assert "目次" in d.description
def test_books_images_are_absolute_and_deduplicated(books_page):
d = parse_subsite_item(books_page)
assert d.images
assert all(url.startswith("https://") for url in d.images)
assert len(d.images) == len(set(d.images))
def test_books_has_no_sku_variants(books_page):
"""图书没有规格轴,SKU 只承载规格表"""
d = parse_subsite_item(books_page)
assert d.sku.inventory_type == "single"
assert d.sku.variant_count == 0
assert d.sku.axis == []
# ---- Rakuten Fashion ----
def test_brandavenue_extracts_core_fields(brandavenue_page):
d = parse_subsite_item(brandavenue_page)
assert d.source == "brandavenue"
assert d.item_name == "プリント ロゴ 刺繍 エンブロイダリー 半袖 Tシャツ"
assert d.price == 3091
assert d.catch_copy == "andme" # 品牌名
assert d.is_sold_out is False
def test_brandavenue_reads_ichiba_ids_from_rms_info(brandavenue_page):
"""市场侧的商品 ID 与 genre_id 藏在 rms_info 里,不是站内编码"""
d = parse_subsite_item(brandavenue_page)
assert d.item_id == "14674748"
assert d.genre_id == "303656"
assert d.shop.shop_id == 279405
assert d.shop.shop_code == "stylife"
def test_brandavenue_builds_color_and_size_axes(brandavenue_page):
d = parse_subsite_item(brandavenue_page)
assert [a.label for a in d.sku.axis] == ["カラー", "サイズ"]
assert d.sku.inventory_type == "multiple"
assert d.sku.variant_count == len(d.sku.variants) > 1
def test_brandavenue_variant_joins_stock_from_inventory_list(brandavenue_page):
"""售价来自 product_sku,库存与 variant_id 来自 rms_info.inventory_list,按尺码+颜色对齐"""
d = parse_subsite_item(brandavenue_page)
by_selector = {tuple(v.selector_values): v for v in d.sku.variants}
variant = by_selector[("オフホワイト×レッド", "Sサイズ")]
assert variant.price == 2810
assert variant.quantity == 90
assert variant.variant_id
def test_brandavenue_variant_without_matching_inventory_stays_purchasable(brandavenue_page):
"""站点两侧的颜色命名偶有出入导致对不上;此时库存未知,但不能据此判成售罄"""
import json
import re
html = brandavenue_page.html
state = json.loads(re.search(r"__INITIAL_STATE__ = (\{.*?\});window", html, re.S).group(1))
state["itemDetail"]["data"]["product"]["rms_info"]["inventory_list"] = []
brandavenue_page.html = re.sub(
r"__INITIAL_STATE__ = \{.*?\};window",
lambda _: f"__INITIAL_STATE__ = {json.dumps(state, ensure_ascii=False)};window",
html,
flags=re.S,
)
d = parse_subsite_item(brandavenue_page)
variant = d.sku.variants[0]
assert variant.quantity == 0
assert variant.variant_id == ""
assert variant.is_sold_out is False # 以 inventory_exist_flg 为准
def test_brandavenue_can_omit_variants_but_keeps_count(brandavenue_page):
brandavenue_page.include_sku_variants = False
d = parse_subsite_item(brandavenue_page)
assert d.sku.variants == []
assert d.sku.variant_count > 0
assert d.sku.axis
def test_brandavenue_takes_images_rendered_in_page(brandavenue_page):
"""图片按商品编号做了目录分片,分片规则不外露,只能取页面已渲染的地址"""
d = parse_subsite_item(brandavenue_page)
assert d.images
assert all("stylife/cabinet/item" in url for url in d.images)
# 主图应排在最前
assert d.images[0].lower().endswith("md7606-13_1.jpg")
def test_brandavenue_breadcrumbs_have_names_without_urls(brandavenue_page):
"""站内分类编码不是市场 genre_id,拼不出可用链接,只给名称"""
d = parse_subsite_item(brandavenue_page)
assert [b.name for b in d.breadcrumbs] == ["トップス", "カットソー・Tシャツ"]
assert all(b.url == "" for b in d.breadcrumbs)
# ---- ビックカメラ ----
def test_biccamera_extracts_core_fields(biccamera_page):
d = parse_subsite_item(biccamera_page)
assert d.source == "biccamera"
assert d.item_name.startswith("SONY")
assert d.price == 73760
assert d.item_id == "13873289"
assert d.item_code == "4548736147041"
assert d.shop.shop_id == 269553
def test_biccamera_maps_inventory_and_delivery(biccamera_page):
d = parse_subsite_item(biccamera_page)
assert d.is_sold_out is False
assert d.purchase_condition == "enabled"
assert d.sku.quantity == 28
assert d.sku.show_inventory is True
assert "出荷予定" in d.shipping.delivery_message
assert d.shipping.is_shipping_free is True
def test_biccamera_breadcrumbs_use_ichiba_genre_ids(biccamera_page):
d = parse_subsite_item(biccamera_page)
assert [b.name for b in d.breadcrumbs][0] == "TV・オーディオ・カメラ"
assert d.breadcrumbs[0].url == "https://www.rakuten.co.jp/category/211742/"
assert d.genre_id == "110110"
def test_biccamera_rejects_page_without_nuxt_state(biccamera_page):
biccamera_page.html = "<html><script>window.__NUXT__={\"state\":{}}</script></html>"
with pytest.raises(ScrapeParseError):
parse_subsite_item(biccamera_page)