diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4041396
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+server/node_modules/*
+.env
\ No newline at end of file
diff --git a/mv2_simple_crx/src/actions/amazon.js b/mv2_simple_crx/src/actions/amazon.js
index 64db60c..39689cb 100644
--- a/mv2_simple_crx/src/actions/amazon.js
+++ b/mv2_simple_crx/src/actions/amazon.js
@@ -86,7 +86,7 @@ export function injected_amazon_switch_language(params) {
export function injected_amazon_search_list(params) {
const start_url = params && params.url ? String(params.url) : location.href;
- const category_keyword = params && params.category_keyword ? String(params.category_keyword).trim() : '';
+ const category_keyword = params && params.category_keyword ? String(params.category_keyword).trim() : '';
const sort_by = params && params.sort_by ? String(params.sort_by).trim() : '';
function pick_number(text) {
@@ -106,15 +106,15 @@ export function injected_amazon_search_list(params) {
if (mm) return Math.round(parseFloat(mm[1]) * 1000000);
const digits = raw.replace(/[^\d]/g, '');
return digits ? Number(digits) : null;
- }
+ }
- function abs_url(href) {
- try {
- return new URL(href, location.origin).toString();
- } catch (_) {
- return href;
- }
- }
+ function abs_url(href) {
+ try {
+ return new URL(href, location.origin).toString();
+ } catch (_) {
+ return href;
+ }
+ }
function parse_asin_from_url(url) {
if (!url || typeof url !== 'string') return null;
@@ -161,20 +161,20 @@ export function injected_amazon_search_list(params) {
const n = pick_int(review_count_text);
return Number.isFinite(n) ? n : null;
})();
- items.push({
+ items.push({
index: idx + 1,
asin: asin || parse_asin_from_url(item_url),
- title,
+ title,
url: item_url,
- price,
+ price,
rating,
rating_text,
review_count,
review_count_text,
- });
- });
- return items;
- }
+ });
+ });
+ return items;
+ }
function pick_next_url() {
const a = document.querySelector('a.s-pagination-next');
@@ -191,7 +191,7 @@ export function injected_amazon_search_list(params) {
return {
start_url,
href: location.href,
- category_keyword,
+ category_keyword,
sort_by,
total: items.length,
items,
@@ -273,18 +273,90 @@ export function injected_amazon_product_detail() {
if (t) bullets.push(t);
});
- const variants = {};
- document.querySelectorAll('[id^="variation_"]').forEach((block) => {
- const key = block.id.replace(/^variation_/, '') || block.id;
- const sel =
- block.querySelector('.selection') ||
- block.querySelector('.a-button-selected .a-button-text') ||
- block.querySelector('[class*="dropdown"]');
- if (sel) {
- const v = norm(sel.textContent);
- if (v) variants[key] = v;
+ /** 变体 id 后缀是否为颜色 / 尺寸(仅提取这两项,不收集其它维度) */
+ function is_sku_color_key(k) {
+ const x = String(k).toLowerCase();
+ return x === 'color' || x === 'color_name' || x.endsWith('_color_name');
+ }
+ function is_sku_size_key(k) {
+ const x = String(k).toLowerCase();
+ return x === 'size' || x === 'size_name' || x.endsWith('_size_name');
+ }
+
+ /** 变体维度:颜色 / 尺寸 各为选项列表 */
+ const sku = { color: [], size: [] };
+
+ const twister_plus_root = document.querySelector('#twister-plus-desktop-twister-container');
+
+ if (twister_plus_root) {
+ const color_row = twister_plus_root.querySelector('#inline-twister-row-color_name');
+ if (color_row) {
+ const seen_c = new Set();
+ color_row.querySelectorAll('li').forEach((li) => {
+ const img = li.querySelector('img[alt]');
+ if (!img) return;
+ const v = norm(img.getAttribute('alt'));
+ if (v && !seen_c.has(v)) {
+ seen_c.add(v);
+ sku.color.push(v);
+ }
+ });
}
- });
+ if (!sku.color.length) {
+ const dim = twister_plus_root.querySelector('#inline-twister-expanded-dimension-text-color_name');
+ const v = dim && norm(dim.textContent);
+ if (v) sku.color.push(v);
+ }
+ const size_row = twister_plus_root.querySelector('#inline-twister-row-size_name');
+ if (size_row) {
+ const seen_s = new Set();
+ size_row.querySelectorAll('li').forEach((li) => {
+ const el = li.querySelector('.swatch-title-text-display, .swatch-title-text-single-line');
+ const v = el ? norm(el.textContent) : null;
+ if (v && !seen_s.has(v)) {
+ seen_s.add(v);
+ sku.size.push(v);
+ }
+ });
+ }
+ if (!sku.size.length) {
+ const dim = twister_plus_root.querySelector('#inline-twister-expanded-dimension-text-size_name');
+ const v = dim && norm(dim.textContent);
+ if (v) sku.size.push(v);
+ }
+ } else {
+ let cur_color = null;
+ let cur_size = null;
+ document.querySelectorAll('[id^="variation_"]').forEach((block) => {
+ const key = block.id.replace(/^variation_/, '') || block.id;
+ if (!is_sku_color_key(key) && !is_sku_size_key(key)) return;
+ const sel =
+ block.querySelector('.selection') ||
+ block.querySelector('.a-button-selected .a-button-text') ||
+ block.querySelector('[class*="dropdown"]');
+ if (!sel) return;
+ const v = norm(sel.textContent);
+ if (!v) return;
+ if (is_sku_color_key(key) && !cur_color) cur_color = v;
+ if (is_sku_size_key(key) && !cur_size) cur_size = v;
+ });
+ document.querySelectorAll('div.inline-twister-row[id^="inline-twister-row-"]').forEach((row) => {
+ const id = row.id || '';
+ const key = id.replace(/^inline-twister-row-/, '') || id;
+ if (!is_sku_color_key(key) && !is_sku_size_key(key)) return;
+ const selected =
+ row.querySelector('.a-button-selected .swatch-title-text-display') ||
+ row.querySelector('.a-button-selected .a-button-text') ||
+ row.querySelector('.a-button-selected');
+ if (!selected) return;
+ const v = norm(selected.textContent);
+ if (!v) return;
+ if (is_sku_color_key(key) && !cur_color) cur_color = v;
+ if (is_sku_size_key(key) && !cur_size) cur_size = v;
+ });
+ if (cur_color) sku.color.push(cur_color);
+ if (cur_size) sku.size.push(cur_size);
+ }
let delivery_hint = null;
const del = document.querySelector(
@@ -292,11 +364,6 @@ export function injected_amazon_product_detail() {
);
if (del) delivery_hint = norm(del.innerText).slice(0, 500);
- let sku = null;
- Object.keys(product_info).forEach((k) => {
- if (/^sku$/i.test(k) || /item model|型号|part number|制造商型号/i.test(k)) sku = product_info[k];
- });
-
const images = [];
const seen_img = new Set();
function add_img(u) {
@@ -338,7 +405,6 @@ export function injected_amazon_product_detail() {
product_info,
detail_extra_lines,
bullets,
- variants,
delivery_hint,
sku,
images,
@@ -492,8 +558,8 @@ export function amazon_search_list(data, sendResponse) {
chrome.tabs.update(tab.id, { url: next_url, active: true }, () => {
if (chrome.runtime.lastError) return reject_nav(new Error(chrome.runtime.lastError.message));
resolve_nav(true);
- });
- });
+ });
+ });
await wait_tab_complete(tab.id);
}
const injected_result_list = await tab.execute_script(
@@ -518,10 +584,10 @@ export function amazon_search_list(data, sendResponse) {
total: unique_map.size,
items: Array.from(unique_map.values()).slice(0, limit),
};
- const result = {
- code: 0,
- status: true,
- message: 'ok',
+ const result = {
+ code: 0,
+ status: true,
+ message: 'ok',
data: { tab_id: tab.id, url, category_keyword, sort_by: sort_by || 'featured', limit, result: list_result },
};
send_action('amazon_search_list', result);
@@ -610,7 +676,7 @@ export function amazon_set_language(data, sendResponse) {
data: null,
documentURI: AMAZON_HOME_FOR_LANG,
});
- reject(err);
+ reject(err);
}
});
}
@@ -686,7 +752,8 @@ export function amazon_product_detail(data, sendResponse) {
return run_pdp_action(data && data.product_url, injected_amazon_product_detail, [], 'amazon_product_detail', sendResponse);
}
-amazon_product_detail.desc = 'Amazon 商品详情(标题、价格、品牌、SKU、要点、变体、配送摘要等)';
+amazon_product_detail.desc =
+ 'Amazon 商品详情(标题、价格、品牌、sku{color[],size[]}、要点、配送摘要等)';
amazon_product_detail.params = {
product_url: {
type: 'string',
diff --git a/mv2_simple_crx/src/bridge/bridge.html b/mv2_simple_crx/src/bridge/bridge.html
new file mode 100644
index 0000000..3599743
--- /dev/null
+++ b/mv2_simple_crx/src/bridge/bridge.html
@@ -0,0 +1,11 @@
+
+
+
+
+ server_bridge
+
+
+
+
+
+
diff --git a/mv2_simple_crx/src/bridge/bridge.js b/mv2_simple_crx/src/bridge/bridge.js
new file mode 100644
index 0000000..54fd827
--- /dev/null
+++ b/mv2_simple_crx/src/bridge/bridge.js
@@ -0,0 +1,32 @@
+/**
+ * 服务端 Puppeteer 通过此页与 background 通讯(等同 UI 发 chrome.runtime.sendMessage)
+ * 页面内若需 Web Worker 做重计算,可在此 postMessage;当前直连 background 即可满足指令/结果
+ */
+(function () {
+ function server_bridge_invoke(action, data) {
+ return new Promise(function (resolve, reject) {
+ if (!action) {
+ reject(new Error('缺少 action'));
+ return;
+ }
+ chrome.runtime.sendMessage({ action: action, data: data || {} }, function (res) {
+ var err = chrome.runtime.lastError;
+ if (err) {
+ reject(new Error(err.message));
+ return;
+ }
+ if (!res) {
+ reject(new Error('background 无响应'));
+ return;
+ }
+ if (res.ok) {
+ resolve(res.data);
+ } else {
+ reject(new Error(res.error || 'action 失败'));
+ }
+ });
+ });
+ }
+
+ window.server_bridge_invoke = server_bridge_invoke;
+})();
diff --git a/server/.env.example b/server/.env.example
new file mode 100644
index 0000000..c20f82d
--- /dev/null
+++ b/server/.env.example
@@ -0,0 +1,13 @@
+# MySQL
+MYSQL_HOST=127.0.0.1
+MYSQL_PORT=3306
+MYSQL_USER=root
+MYSQL_PASSWORD=
+MYSQL_DATABASE=ecom_crawl
+
+# 扩展目录(未打包,含 manifest.json)
+CRX_SRC_PATH=d:/项目/电商抓取项目/mv2_simple_crx/src
+
+SERVER_PORT=38080
+ACTION_TIMEOUT_MS=300000
+PUPPETEER_HEADLESS=false
diff --git a/server/app.js b/server/app.js
new file mode 100644
index 0000000..b51f309
--- /dev/null
+++ b/server/app.js
@@ -0,0 +1,31 @@
+import dotenv from 'dotenv';
+import Koa from 'koa';
+import body_parser from 'koa-bodyparser';
+
+import { sequelize } from './models/index.js';
+import { crawl_router } from './routes/crawl.js';
+import { schedule_task_router } from './routes/schedule_task.js';
+import { reload_all_schedules } from './services/schedule_loader.js';
+
+dotenv.config();
+
+const app = new Koa();
+app.use(body_parser({ jsonLimit: '10mb' }));
+
+app.use(crawl_router.routes()).use(crawl_router.allowedMethods());
+app.use(schedule_task_router.routes()).use(schedule_task_router.allowedMethods());
+
+app.use(async (ctx) => {
+ ctx.status = 404;
+ ctx.body = { ok: false, error: 'not_found' };
+});
+
+const port = Number(process.env.SERVER_PORT || 38080);
+
+await sequelize.authenticate();
+await sequelize.sync();
+await reload_all_schedules();
+
+app.listen(port);
+// eslint-disable-next-line no-console
+console.log(`server listening on ${port}`);
diff --git a/server/config/database.js b/server/config/database.js
new file mode 100644
index 0000000..b1322b5
--- /dev/null
+++ b/server/config/database.js
@@ -0,0 +1,22 @@
+import dotenv from 'dotenv';
+
+dotenv.config();
+
+export function get_sequelize_options() {
+ return {
+ host: process.env.MYSQL_HOST || '127.0.0.1',
+ port: Number(process.env.MYSQL_PORT || 3306),
+ username: process.env.MYSQL_USER || 'root',
+ password: process.env.MYSQL_PASSWORD || '',
+ database: process.env.MYSQL_DATABASE || 'ecom_crawl',
+ dialect: 'mysql',
+ logging: false,
+ define: {
+ underscored: true,
+ timestamps: true,
+ createdAt: 'created_at',
+ updatedAt: 'updated_at'
+ },
+ timezone: '+08:00'
+ };
+}
diff --git a/server/models/crawl_run_record.js b/server/models/crawl_run_record.js
new file mode 100644
index 0000000..ccbcb22
--- /dev/null
+++ b/server/models/crawl_run_record.js
@@ -0,0 +1,26 @@
+import { DataTypes } from 'sequelize';
+
+export function define_crawl_run_record(sequelize) {
+ return sequelize.define(
+ 'crawl_run_record',
+ {
+ id: { type: DataTypes.BIGINT.UNSIGNED, primaryKey: true, autoIncrement: true },
+ action_name: { type: DataTypes.STRING(128), allowNull: false },
+ request_payload: { type: DataTypes.TEXT, allowNull: true, comment: 'JSON 请求体' },
+ ok: { type: DataTypes.BOOLEAN, allowNull: false },
+ result_payload: { type: DataTypes.TEXT('long'), allowNull: true, comment: 'JSON 结果' },
+ error_message: { type: DataTypes.TEXT, allowNull: true },
+ source: {
+ type: DataTypes.STRING(32),
+ allowNull: false,
+ defaultValue: 'api',
+ comment: 'api | cron'
+ },
+ schedule_task_id: { type: DataTypes.BIGINT.UNSIGNED, allowNull: true }
+ },
+ {
+ tableName: 'crawl_run_record',
+ indexes: [{ fields: ['action_name'] }, { fields: ['created_at'] }]
+ }
+ );
+}
diff --git a/server/models/index.js b/server/models/index.js
new file mode 100644
index 0000000..398a558
--- /dev/null
+++ b/server/models/index.js
@@ -0,0 +1,15 @@
+import { Sequelize } from 'sequelize';
+import { get_sequelize_options } from '../config/database.js';
+import { define_crawl_run_record } from './crawl_run_record.js';
+import { define_schedule_task } from './schedule_task.js';
+
+const sequelize_options = get_sequelize_options();
+const { database, username, password, ...rest } = sequelize_options;
+
+export const sequelize = new Sequelize(database, username, password, rest);
+
+export const crawl_run_record = define_crawl_run_record(sequelize);
+export const schedule_task = define_schedule_task(sequelize);
+
+schedule_task.hasMany(crawl_run_record, { foreignKey: 'schedule_task_id', as: 'records' });
+crawl_run_record.belongsTo(schedule_task, { foreignKey: 'schedule_task_id', as: 'schedule_task' });
diff --git a/server/models/schedule_task.js b/server/models/schedule_task.js
new file mode 100644
index 0000000..67a839e
--- /dev/null
+++ b/server/models/schedule_task.js
@@ -0,0 +1,19 @@
+import { DataTypes } from 'sequelize';
+
+export function define_schedule_task(sequelize) {
+ return sequelize.define(
+ 'schedule_task',
+ {
+ id: { type: DataTypes.BIGINT.UNSIGNED, primaryKey: true, autoIncrement: true },
+ name: { type: DataTypes.STRING(128), allowNull: false },
+ cron_expression: { type: DataTypes.STRING(64), allowNull: false },
+ action_name: { type: DataTypes.STRING(128), allowNull: false },
+ payload_json: { type: DataTypes.TEXT, allowNull: true },
+ enabled: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: true },
+ last_run_at: { type: DataTypes.DATE, allowNull: true }
+ },
+ {
+ tableName: 'schedule_task'
+ }
+ );
+}
diff --git a/server/package-lock.json b/server/package-lock.json
new file mode 100644
index 0000000..e863dcf
--- /dev/null
+++ b/server/package-lock.json
@@ -0,0 +1,2461 @@
+{
+ "name": "ecom_crawl_server",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "ecom_crawl_server",
+ "version": "1.0.0",
+ "dependencies": {
+ "@koa/router": "^12.0.1",
+ "dotenv": "^16.4.5",
+ "koa": "^2.15.3",
+ "koa-bodyparser": "^4.4.1",
+ "mysql2": "^3.11.0",
+ "node-cron": "^3.0.3",
+ "puppeteer": "^23.4.1",
+ "sequelize": "^6.37.3"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@hapi/bourne": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/@hapi/bourne/-/bourne-3.0.0.tgz",
+ "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@koa/router": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmmirror.com/@koa/router/-/router-12.0.2.tgz",
+ "integrity": "sha512-sYcHglGKTxGF+hQ6x67xDfkE9o+NhVlRHBqq6gLywaMc6CojK/5vFZByphdonKinYlMLkEkacm+HEse9HzwgTA==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "http-errors": "^2.0.0",
+ "koa-compose": "^4.1.0",
+ "methods": "^1.1.2",
+ "path-to-regexp": "^6.3.0"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/@puppeteer/browsers": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmmirror.com/@puppeteer/browsers/-/browsers-2.6.1.tgz",
+ "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "extract-zip": "^2.0.1",
+ "progress": "^2.0.3",
+ "proxy-agent": "^6.5.0",
+ "semver": "^7.6.3",
+ "tar-fs": "^3.0.6",
+ "unbzip2-stream": "^1.4.3",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmmirror.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "25.5.0",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.5.0.tgz",
+ "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==",
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~7.18.0"
+ }
+ },
+ "node_modules/@types/validator": {
+ "version": "13.15.10",
+ "resolved": "https://registry.npmmirror.com/@types/validator/-/validator-13.15.10.tgz",
+ "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/aws-ssl-profiles": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
+ "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/b4a/-/b4a-1.8.0.tgz",
+ "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-events": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmmirror.com/bare-events/-/bare-events-2.8.2.tgz",
+ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-fs": {
+ "version": "4.5.5",
+ "resolved": "https://registry.npmmirror.com/bare-fs/-/bare-fs-4.5.5.tgz",
+ "integrity": "sha512-XvwYM6VZqKoqDll8BmSww5luA5eflDzY0uEFfBJtFKe4PAAtxBjU3YIxzIBzhyaEQBy1VXEQBto4cpN5RZJw+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
+ },
+ "engines": {
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmmirror.com/bare-os/-/bare-os-3.8.0.tgz",
+ "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "bare": ">=1.14.0"
+ }
+ },
+ "node_modules/bare-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/bare-path/-/bare-path-3.0.0.tgz",
+ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-os": "^3.0.1"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmmirror.com/bare-stream/-/bare-stream-2.8.1.tgz",
+ "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "streamx": "^2.21.0",
+ "teex": "^1.0.1"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/bare-url": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmmirror.com/bare-url/-/bare-url-2.3.2.tgz",
+ "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/basic-ftp": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/basic-ftp/-/basic-ftp-5.2.0.tgz",
+ "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cache-content-type": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/cache-content-type/-/cache-content-type-1.0.1.tgz",
+ "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^2.1.18",
+ "ylru": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chromium-bidi": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmmirror.com/chromium-bidi/-/chromium-bidi-0.11.0.tgz",
+ "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "mitt": "3.0.1",
+ "zod": "3.23.8"
+ },
+ "peerDependencies": {
+ "devtools-protocol": "*"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmmirror.com/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/co-body": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/co-body/-/co-body-6.2.0.tgz",
+ "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@hapi/bourne": "^3.0.0",
+ "inflation": "^2.0.0",
+ "qs": "^6.5.2",
+ "raw-body": "^2.3.3",
+ "type-is": "^1.6.16"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookies": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmmirror.com/cookies/-/cookies-0.9.1.tgz",
+ "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "keygrip": "~1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/copy-to": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz",
+ "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==",
+ "license": "MIT"
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-9.0.1.tgz",
+ "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==",
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.0.1.tgz",
+ "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==",
+ "license": "MIT"
+ },
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT"
+ },
+ "node_modules/denque": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz",
+ "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/devtools-protocol": {
+ "version": "0.0.1367902",
+ "resolved": "https://registry.npmmirror.com/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
+ "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dottie": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/dottie/-/dottie-2.0.7.tgz",
+ "integrity": "sha512-7lAK2A0b3zZr3UC5aE69CPdCFR4RHW1o2Dr74TqFykxkUCBXSRJum/yPc7g8zRHJqWKomPLHwFLLoUnn8PXXRg==",
+ "license": "MIT"
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bare-events": "^2.7.0"
+ }
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmmirror.com/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "license": "MIT"
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generate-function": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz",
+ "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "is-property": "^1.0.2"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-uri": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmmirror.com/get-uri/-/get-uri-6.0.5.tgz",
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+ "license": "MIT",
+ "dependencies": {
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/http-assert/-/http-assert-1.5.0.tgz",
+ "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==",
+ "license": "MIT",
+ "dependencies": {
+ "deep-equal": "~1.0.1",
+ "http-errors": "~1.8.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-assert/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-assert/node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-assert/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflation": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/inflation/-/inflation-2.1.0.tgz",
+ "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/inflection": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmmirror.com/inflection/-/inflection-1.13.4.tgz",
+ "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==",
+ "engines": [
+ "node >= 0.4.0"
+ ],
+ "license": "MIT"
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ip-address": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz",
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "license": "MIT"
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "license": "MIT"
+ },
+ "node_modules/keygrip": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/keygrip/-/keygrip-1.1.0.tgz",
+ "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "license": "MIT",
+ "dependencies": {
+ "tsscmp": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa": {
+ "version": "2.16.4",
+ "resolved": "https://registry.npmmirror.com/koa/-/koa-2.16.4.tgz",
+ "integrity": "sha512-3An0GCLDSR34tsCO4H8Tef8Pp2ngtaZDAZnsWJYelqXUK5wyiHvGItgK/xcSkmHLSTn1Jcho1mRQs2ehRzvKKw==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^1.3.5",
+ "cache-content-type": "^1.0.0",
+ "content-disposition": "~0.5.2",
+ "content-type": "^1.0.4",
+ "cookies": "~0.9.0",
+ "debug": "^4.3.2",
+ "delegates": "^1.0.0",
+ "depd": "^2.0.0",
+ "destroy": "^1.0.4",
+ "encodeurl": "^1.0.2",
+ "escape-html": "^1.0.3",
+ "fresh": "~0.5.2",
+ "http-assert": "^1.3.0",
+ "http-errors": "^1.6.3",
+ "is-generator-function": "^1.0.7",
+ "koa-compose": "^4.1.0",
+ "koa-convert": "^2.0.0",
+ "on-finished": "^2.3.0",
+ "only": "~0.0.2",
+ "parseurl": "^1.3.2",
+ "statuses": "^1.5.0",
+ "type-is": "^1.6.16",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4"
+ }
+ },
+ "node_modules/koa-bodyparser": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/koa-bodyparser/-/koa-bodyparser-4.4.1.tgz",
+ "integrity": "sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==",
+ "license": "MIT",
+ "dependencies": {
+ "co-body": "^6.0.0",
+ "copy-to": "^2.0.1",
+ "type-is": "^1.6.18"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/koa-compose": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/koa-compose/-/koa-compose-4.1.0.tgz",
+ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==",
+ "license": "MIT"
+ },
+ "node_modules/koa-convert": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/koa-convert/-/koa-convert-2.0.0.tgz",
+ "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==",
+ "license": "MIT",
+ "dependencies": {
+ "co": "^4.6.0",
+ "koa-compose": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/koa/node_modules/http-errors": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz",
+ "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa/node_modules/http-errors/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/koa/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash": {
+ "version": "4.17.23",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.23.tgz",
+ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+ "license": "MIT"
+ },
+ "node_modules/long": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz",
+ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/lru.min": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz",
+ "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==",
+ "license": "MIT",
+ "engines": {
+ "bun": ">=1.0.0",
+ "deno": ">=1.30.0",
+ "node": ">=8.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wellwelwel"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.48",
+ "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.48.tgz",
+ "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==",
+ "license": "MIT",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mysql2": {
+ "version": "3.20.0",
+ "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.20.0.tgz",
+ "integrity": "sha512-eCLUs7BNbgA6nf/MZXsaBO1SfGs0LtLVrJD3WeWq+jPLDWkSufTD+aGMwykfUVPdZnblaUK1a8G/P63cl9FkKg==",
+ "license": "MIT",
+ "dependencies": {
+ "aws-ssl-profiles": "^1.1.2",
+ "denque": "^2.1.0",
+ "generate-function": "^2.3.1",
+ "iconv-lite": "^0.7.2",
+ "long": "^5.3.2",
+ "lru.min": "^1.1.4",
+ "named-placeholders": "^1.1.6",
+ "sql-escaper": "^1.3.3"
+ },
+ "engines": {
+ "node": ">= 8.0"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 8"
+ }
+ },
+ "node_modules/named-placeholders": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz",
+ "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==",
+ "license": "MIT",
+ "dependencies": {
+ "lru.min": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/netmask": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz",
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/node-cron": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/node-cron/-/node-cron-3.0.3.tgz",
+ "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
+ "license": "ISC",
+ "dependencies": {
+ "uuid": "8.3.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/only": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmmirror.com/only/-/only-0.0.2.tgz",
+ "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ=="
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmmirror.com/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+ "license": "MIT",
+ "dependencies": {
+ "degenerator": "^5.0.0",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
+ "license": "MIT"
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "license": "MIT"
+ },
+ "node_modules/pg-connection-string": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmmirror.com/pg-connection-string/-/pg-connection-string-2.12.0.tgz",
+ "integrity": "sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/proxy-agent": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmmirror.com/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.4.tgz",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/puppeteer": {
+ "version": "23.11.1",
+ "resolved": "https://registry.npmmirror.com/puppeteer/-/puppeteer-23.11.1.tgz",
+ "integrity": "sha512-53uIX3KR5en8l7Vd8n5DUv90Ae9QDQsyIthaUFVzwV6yU750RjqRznEtNMBT20VthqAdemnJN+hxVdmMHKt7Zw==",
+ "deprecated": "< 24.15.0 is no longer supported",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@puppeteer/browsers": "2.6.1",
+ "chromium-bidi": "0.11.0",
+ "cosmiconfig": "^9.0.0",
+ "devtools-protocol": "0.0.1367902",
+ "puppeteer-core": "23.11.1",
+ "typed-query-selector": "^2.12.0"
+ },
+ "bin": {
+ "puppeteer": "lib/cjs/puppeteer/node/cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/puppeteer-core": {
+ "version": "23.11.1",
+ "resolved": "https://registry.npmmirror.com/puppeteer-core/-/puppeteer-core-23.11.1.tgz",
+ "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@puppeteer/browsers": "2.6.1",
+ "chromium-bidi": "0.11.0",
+ "debug": "^4.4.0",
+ "devtools-protocol": "0.0.1367902",
+ "typed-query-selector": "^2.12.0",
+ "ws": "^8.18.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.0.tgz",
+ "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/retry-as-promised": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/retry-as-promised/-/retry-as-promised-7.1.1.tgz",
+ "integrity": "sha512-hMD7odLOt3LkTjcif8aRZqi/hybjpLNgSk5oF5FCowfCjok6LukpN2bDX7R5wDmbgBQFn7YoBxSagmtXHaJYJw==",
+ "license": "MIT"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sequelize": {
+ "version": "6.37.8",
+ "resolved": "https://registry.npmmirror.com/sequelize/-/sequelize-6.37.8.tgz",
+ "integrity": "sha512-HJ0IQFqcTsTiqbEgiuioYFMSD00TP6Cz7zoTti+zVVBwVe9fEhev9cH6WnM3XU31+ABS356durAb99ZuOthnKw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sequelize"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.1.8",
+ "@types/validator": "^13.7.17",
+ "debug": "^4.3.4",
+ "dottie": "^2.0.6",
+ "inflection": "^1.13.4",
+ "lodash": "^4.17.21",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.43",
+ "pg-connection-string": "^2.6.1",
+ "retry-as-promised": "^7.0.4",
+ "semver": "^7.5.4",
+ "sequelize-pool": "^7.1.0",
+ "toposort-class": "^1.0.1",
+ "uuid": "^8.3.2",
+ "validator": "^13.9.0",
+ "wkx": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ibm_db": {
+ "optional": true
+ },
+ "mariadb": {
+ "optional": true
+ },
+ "mysql2": {
+ "optional": true
+ },
+ "oracledb": {
+ "optional": true
+ },
+ "pg": {
+ "optional": true
+ },
+ "pg-hstore": {
+ "optional": true
+ },
+ "snowflake-sdk": {
+ "optional": true
+ },
+ "sqlite3": {
+ "optional": true
+ },
+ "tedious": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sequelize-pool": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/sequelize-pool/-/sequelize-pool-7.1.0.tgz",
+ "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmmirror.com/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sql-escaper": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/sql-escaper/-/sql-escaper-1.3.3.tgz",
+ "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==",
+ "license": "MIT",
+ "engines": {
+ "bun": ">=1.0.0",
+ "deno": ">=2.0.0",
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/mysqljs/sql-escaper?sponsor=1"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.23.0",
+ "resolved": "https://registry.npmmirror.com/streamx/-/streamx-2.23.0.tgz",
+ "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==",
+ "license": "MIT",
+ "dependencies": {
+ "events-universal": "^1.0.0",
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-3.1.2.tgz",
+ "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==",
+ "license": "MIT",
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.8.tgz",
+ "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "bare-fs": "^4.5.5",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/teex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/teex/-/teex-1.0.1.tgz",
+ "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
+ "license": "MIT",
+ "dependencies": {
+ "streamx": "^2.12.5"
+ }
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/text-decoder/-/text-decoder-1.2.7.tgz",
+ "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "license": "MIT"
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/toposort-class": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toposort-class/-/toposort-class-1.0.1.tgz",
+ "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==",
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.x"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-query-selector": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmmirror.com/typed-query-selector/-/typed-query-selector-2.12.1.tgz",
+ "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==",
+ "license": "MIT"
+ },
+ "node_modules/unbzip2-stream": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "through": "^2.3.8"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.18.2.tgz",
+ "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+ "license": "MIT"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.15.26",
+ "resolved": "https://registry.npmmirror.com/validator/-/validator-13.15.26.tgz",
+ "integrity": "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/wkx": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmmirror.com/wkx/-/wkx-0.5.0.tgz",
+ "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.19.0",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.19.0.tgz",
+ "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/ylru": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/ylru/-/ylru-1.4.0.tgz",
+ "integrity": "sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmmirror.com/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/server/package.json b/server/package.json
new file mode 100644
index 0000000..834df29
--- /dev/null
+++ b/server/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "ecom_crawl_server",
+ "version": "1.0.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "start": "node app.js",
+ "db_sync": "node scripts/db_sync.js"
+ },
+ "dependencies": {
+ "@koa/router": "^12.0.1",
+ "dotenv": "^16.4.5",
+ "koa": "^2.15.3",
+ "koa-bodyparser": "^4.4.1",
+ "mysql2": "^3.11.0",
+ "node-cron": "^3.0.3",
+ "puppeteer": "^23.4.1",
+ "sequelize": "^6.37.3"
+ }
+}
diff --git a/server/routes/crawl.js b/server/routes/crawl.js
new file mode 100644
index 0000000..29fc428
--- /dev/null
+++ b/server/routes/crawl.js
@@ -0,0 +1,26 @@
+import Router from '@koa/router';
+import { execute_action_and_record } from '../services/task_executor.js';
+
+export const crawl_router = new Router();
+
+crawl_router.post('/api/crawl/run_action', async (ctx) => {
+ const { action_name, action_payload } = ctx.request.body || {};
+
+ if (!action_name) {
+ ctx.status = 400;
+ ctx.body = { ok: false, error: '缺少 action_name' };
+ return;
+ }
+
+ try {
+ const data = await execute_action_and_record({
+ action_name,
+ action_payload: action_payload || {},
+ source: 'api'
+ });
+ ctx.body = { ok: true, data };
+ } catch (err) {
+ ctx.status = 500;
+ ctx.body = { ok: false, error: (err && err.message) || String(err) };
+ }
+});
diff --git a/server/routes/schedule_task.js b/server/routes/schedule_task.js
new file mode 100644
index 0000000..294b067
--- /dev/null
+++ b/server/routes/schedule_task.js
@@ -0,0 +1,73 @@
+import Router from '@koa/router';
+import { schedule_task } from '../models/index.js';
+import { safe_json_parse, safe_json_stringify } from '../services/json_utils.js';
+
+export const schedule_task_router = new Router();
+
+schedule_task_router.post('/api/schedule_task/create', async (ctx) => {
+ const { name, cron_expression, action_name, payload } = ctx.request.body || {};
+ if (!name || !cron_expression || !action_name) {
+ ctx.status = 400;
+ ctx.body = { ok: false, error: '缺少 name/cron_expression/action_name' };
+ return;
+ }
+
+ const payload_json = payload ? safe_json_stringify(payload) : null;
+ const row = await schedule_task.create({
+ name,
+ cron_expression,
+ action_name,
+ payload_json,
+ enabled: true
+ });
+
+ ctx.body = { ok: true, data: { id: row.id } };
+});
+
+schedule_task_router.post('/api/schedule_task/list', async (ctx) => {
+ const rows = await schedule_task.findAll({ order: [['id', 'desc']] });
+ ctx.body = {
+ ok: true,
+ data: rows.map((r) => ({
+ id: r.id,
+ name: r.name,
+ cron_expression: r.cron_expression,
+ action_name: r.action_name,
+ payload: safe_json_parse(r.payload_json),
+ enabled: r.enabled,
+ last_run_at: r.last_run_at
+ }))
+ };
+});
+
+schedule_task_router.post('/api/schedule_task/set_enabled', async (ctx) => {
+ const { id, enabled } = ctx.request.body || {};
+ if (!id || typeof enabled !== 'boolean') {
+ ctx.status = 400;
+ ctx.body = { ok: false, error: '缺少 id/enabled(boolean)' };
+ return;
+ }
+
+ const row = await schedule_task.findByPk(id);
+ if (!row) {
+ ctx.status = 404;
+ ctx.body = { ok: false, error: '任务不存在' };
+ return;
+ }
+
+ row.enabled = enabled;
+ await row.save();
+ ctx.body = { ok: true };
+});
+
+schedule_task_router.post('/api/schedule_task/delete', async (ctx) => {
+ const { id } = ctx.request.body || {};
+ if (!id) {
+ ctx.status = 400;
+ ctx.body = { ok: false, error: '缺少 id' };
+ return;
+ }
+
+ await schedule_task.destroy({ where: { id } });
+ ctx.body = { ok: true };
+});
diff --git a/server/scripts/db_sync.js b/server/scripts/db_sync.js
new file mode 100644
index 0000000..b4e4f27
--- /dev/null
+++ b/server/scripts/db_sync.js
@@ -0,0 +1,6 @@
+import { sequelize } from '../models/index.js';
+
+await sequelize.sync({ alter: true });
+// eslint-disable-next-line no-console
+console.log('sync ok');
+await sequelize.close();
diff --git a/server/services/cron_manager.js b/server/services/cron_manager.js
new file mode 100644
index 0000000..1cd635c
--- /dev/null
+++ b/server/services/cron_manager.js
@@ -0,0 +1,30 @@
+import cron from 'node-cron';
+
+const task_id_to_cron_job = new Map();
+
+export function stop_all_cron_jobs() {
+ for (const job of task_id_to_cron_job.values()) {
+ job.stop();
+ }
+ task_id_to_cron_job.clear();
+}
+
+export function upsert_cron_job(schedule_task_id, cron_expression, on_tick) {
+ const existing = task_id_to_cron_job.get(schedule_task_id);
+ if (existing) {
+ existing.stop();
+ task_id_to_cron_job.delete(schedule_task_id);
+ }
+
+ const job = cron.schedule(cron_expression, on_tick, { scheduled: true });
+ task_id_to_cron_job.set(schedule_task_id, job);
+}
+
+export function remove_cron_job(schedule_task_id) {
+ const job = task_id_to_cron_job.get(schedule_task_id);
+ if (!job) {
+ return;
+ }
+ job.stop();
+ task_id_to_cron_job.delete(schedule_task_id);
+}
diff --git a/server/services/json_utils.js b/server/services/json_utils.js
new file mode 100644
index 0000000..9b0f70b
--- /dev/null
+++ b/server/services/json_utils.js
@@ -0,0 +1,18 @@
+export function safe_json_stringify(value) {
+ try {
+ return JSON.stringify(value);
+ } catch (err) {
+ return JSON.stringify({ error: 'json_stringify_failed', message: String(err) });
+ }
+}
+
+export function safe_json_parse(text) {
+ if (text === null || text === undefined || text === '') {
+ return null;
+ }
+ try {
+ return JSON.parse(text);
+ } catch (err) {
+ return null;
+ }
+}
diff --git a/server/services/puppeteer_runner.js b/server/services/puppeteer_runner.js
new file mode 100644
index 0000000..3948292
--- /dev/null
+++ b/server/services/puppeteer_runner.js
@@ -0,0 +1,102 @@
+import dotenv from 'dotenv';
+import path from 'node:path';
+import puppeteer from 'puppeteer';
+
+dotenv.config();
+
+let browser_singleton = null;
+
+function get_action_timeout_ms() {
+ return Number(process.env.ACTION_TIMEOUT_MS || 300000);
+}
+
+function get_crx_src_path() {
+ const crx_src_path = process.env.CRX_SRC_PATH;
+ if (!crx_src_path) {
+ throw new Error('缺少环境变量 CRX_SRC_PATH');
+ }
+ return crx_src_path;
+}
+
+function get_extension_id_from_targets(targets) {
+ for (const target of targets) {
+ const url = target.url();
+ if (!url) continue;
+ if (url.startsWith('chrome-extension://')) {
+ const match = url.match(/^chrome-extension:\/\/([^/]+)\//);
+ if (match && match[1]) return match[1];
+ }
+ }
+ return null;
+}
+
+export async function get_or_create_browser() {
+ if (browser_singleton) {
+ return browser_singleton;
+ }
+
+ const extension_path = path.resolve(get_crx_src_path());
+ const headless = String(process.env.PUPPETEER_HEADLESS || 'false') === 'true';
+
+ browser_singleton = await puppeteer.launch({
+ headless,
+ args: [
+ `--disable-extensions-except=${extension_path}`,
+ `--load-extension=${extension_path}`,
+ '--no-default-browser-check',
+ '--disable-popup-blocking',
+ '--disable-dev-shm-usage'
+ ]
+ });
+
+ return browser_singleton;
+}
+
+export async function invoke_extension_action(action_name, action_payload) {
+ const browser = await get_or_create_browser();
+
+ const page = await browser.newPage();
+ await page.goto('about:blank');
+
+ const targets = await browser.targets();
+ const extension_id = get_extension_id_from_targets(targets);
+ if (!extension_id) {
+ await page.close();
+ throw new Error('未找到扩展 extension_id(请确认 CRX_SRC_PATH 指向 src 且成功加载)');
+ }
+
+ const bridge_url = `chrome-extension://${extension_id}/bridge/bridge.html`;
+ await page.goto(bridge_url, { waitUntil: 'domcontentloaded' });
+
+ const timeout_ms = get_action_timeout_ms();
+ const action_res = await page.evaluate(
+ async (action, payload, timeout) => {
+ function with_timeout(promise, timeout_ms_inner) {
+ return new Promise((resolve, reject) => {
+ const timer = setTimeout(() => reject(new Error('action_timeout')), timeout_ms_inner);
+ promise
+ .then((v) => {
+ clearTimeout(timer);
+ resolve(v);
+ })
+ .catch((e) => {
+ clearTimeout(timer);
+ reject(e);
+ });
+ });
+ }
+
+ if (!window.server_bridge_invoke) {
+ throw new Error('bridge 未注入 window.server_bridge_invoke');
+ }
+
+ return await with_timeout(window.server_bridge_invoke(action, payload), timeout);
+ },
+ action_name,
+ action_payload || {},
+ timeout_ms
+ );
+
+ await page.close();
+ return action_res;
+}
diff --git a/server/services/schedule_loader.js b/server/services/schedule_loader.js
new file mode 100644
index 0000000..787d72b
--- /dev/null
+++ b/server/services/schedule_loader.js
@@ -0,0 +1,33 @@
+import { schedule_task } from '../models/index.js';
+import { safe_json_parse } from './json_utils.js';
+import { execute_action_and_record } from './task_executor.js';
+import { remove_cron_job, upsert_cron_job } from './cron_manager.js';
+
+export async function reload_all_schedules() {
+ const rows = await schedule_task.findAll();
+
+ for (const row of rows) {
+ if (!row.enabled) {
+ remove_cron_job(row.id);
+ continue;
+ }
+
+ upsert_cron_job(row.id, row.cron_expression, async () => {
+ try {
+ await schedule_task.update(
+ { last_run_at: new Date() },
+ { where: { id: row.id } }
+ );
+
+ await execute_action_and_record({
+ action_name: row.action_name,
+ action_payload: safe_json_parse(row.payload_json) || {},
+ source: 'cron',
+ schedule_task_id: row.id
+ });
+ } catch (err) {
+ // cron 执行失败已在 crawl_run_record 落库,避免重复抛出影响其它任务
+ }
+ });
+ }
+}
diff --git a/server/services/task_executor.js b/server/services/task_executor.js
new file mode 100644
index 0000000..ae615b7
--- /dev/null
+++ b/server/services/task_executor.js
@@ -0,0 +1,39 @@
+import { crawl_run_record } from '../models/index.js';
+import { safe_json_stringify } from './json_utils.js';
+import { invoke_extension_action } from './puppeteer_runner.js';
+
+export async function execute_action_and_record(params) {
+ const {
+ action_name,
+ action_payload,
+ source,
+ schedule_task_id
+ } = params;
+
+ const request_payload = safe_json_stringify(action_payload || {});
+
+ let ok = false;
+ let result_payload = null;
+ let error_message = null;
+
+ try {
+ const result = await invoke_extension_action(action_name, action_payload || {});
+ ok = true;
+ result_payload = safe_json_stringify(result);
+ return result;
+ } catch (err) {
+ ok = false;
+ error_message = (err && err.message) || String(err);
+ throw err;
+ } finally {
+ await crawl_run_record.create({
+ action_name,
+ request_payload,
+ ok,
+ result_payload,
+ error_message,
+ source,
+ schedule_task_id: schedule_task_id || null
+ });
+ }
+}
diff --git a/执行计划.md b/执行计划.md
index 2057b10..c078fd3 100644
--- a/执行计划.md
+++ b/执行计划.md
@@ -10,3 +10,1319 @@
|------|------|------|
| `amazon_product_detail` | `product_url`(商品详情页完整链接,须含 `/dp/ASIN`) | 抓取标题、价格、品牌、SKU、要点、变体、配送摘要、主图等 |
| `amazon_product_reviews` | `product_url`;可选 `limit`(默认 50,最大 100) | 抓取详情页「买家评论」区域已渲染的评论(`[data-hook=review]`),条数以页面实际展示为准 |
+
+
+{
+ "ac_badge": "亚马逊 精选",
+ "asin": "B0B56CHMSC",
+ "bestseller_hint": null,
+ "brand_line": "访问 Lifewit 品牌旗舰店",
+ "brand_store_url": null,
+ "bullets": [
+ "保温:午餐包采用保温材料,保冷效果长达4.5小时。 此外,内部衬里采用食品级 PEVA 箔,因此您可以直接将食物放入袋子中,无需任何担心。 内置 2 毫米 EPE 泡沫为您的容器、食物和饮料提供很好的保护",
+ "大容量:尺寸 - 10 英寸 ( 25.4 厘米 ) × 6.7 英寸 ( 17 厘米 ) × 8 英寸 ( 20.3 厘米 )。 大人午餐盒容量为9升,容量大,可容纳12罐可乐(330毫升),或午餐如三明治、沙拉、零食、饮料、水果等。 适合办公室、工作、野餐、沙滩、旅行。",
+ "【防漏防水】男士午餐盒外部采用600D防水防污牛津布制成,经久耐用,防水,易清洗。 即使装满了水和冰块,也能够很好地容纳水果和饮料,不会渗漏。",
+ "【材质】保温便当袋的内衬采用PEVA箔制成,不易沾染热食物,不易融化。 高品质强力拉链将破碎的可能性降至最低。 非常适合您在办公室和野餐食物储存的需求。",
+ "【方便便携】保冷的午餐袋的盖子采用强力双向拉链,可将饭盒放入包中,垂直取出。 防止液体从容器外渗出和弄脏包内。 坚固的手柄和肩带让您轻松携带。 此外,正面和侧面的额外口袋可以容纳钥匙和耳塞等小物品"
+ ],
+ "delivery_hint": "配送, 预计4月13日星期一送达",
+ "detail_extra_lines": [],
+ "images": [
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SY355_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SY450_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SX425_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SX466_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SX522_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SX569_.jpg",
+ "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SX679_.jpg",
+ "https://m.media-amazon.com/images/I/419MEWckZ7L._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/51K8FreJFLL._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/41ZzjBnOIsL._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/51RgeRAqnRL._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/519AKkeYVCL._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/51A9Vqde6LL._AC_US100_.jpg",
+ "https://m.media-amazon.com/images/I/51k64GfCgQL.SS125_PKplay-button-mb-image-grid-small_.jpg",
+ "https://m.media-amazon.com/images/S/sash//pLB3SkYb3bHZzHQ.svg",
+ "https://m.media-amazon.com/images/S/sash//swRPyHOrgnz358_.svg"
+ ],
+ "main_image": "https://m.media-amazon.com/images/I/71tf1kD9PBL._AC_SY355_.jpg",
+ "price": "US$7.99",
+ "product_info": {
+ "ASIN": "B0B56CHMSC",
+ "主题": "食品",
+ "亚马逊热销商品排名": "厨房和餐厅商品里排第11名 (查看厨房和餐厅商品销售排行榜) 可重复使用午餐袋商品里排第1名",
+ "产品保养说明": "仅限手洗",
+ "产品款式": "摩登",
+ "产品的推荐用途": "办公室、野餐、旅行、露营",
+ "产品类型名称": "可重复使用的午餐袋",
+ "制造商": "Lifewit",
+ "制造年份": "2022",
+ "包装内数量": "1",
+ "品牌": "Lifewit",
+ "商品尺寸": "17深度 x 25.4宽度 x 20.3高度 厘米",
+ "商品尺寸 长 x 宽 x 高": "17深度 x 25.4宽度 x 20.3高度 厘米",
+ "商品形状": "矩形",
+ "商品组成信息": "主隔层,侧口袋",
+ "商品质地": "包",
+ "商品重量": "300 克",
+ "图案": "纯色",
+ "容量": "9 升",
+ "年龄范围说明": "成人",
+ "年龄范围(描述)": "成人",
+ "建议用法": "办公室、野餐、旅行、露营",
+ "材质": "聚酯纤维",
+ "材质类型": "聚酯纤维",
+ "特殊功能": "可调节肩带, 防漏, 隔热",
+ "用户评分": "4.6 4.6 颗星,最多 5 颗星 (56,444) var dpAcrHasRegisteredArcLinkClickAction; P.when('A', 'ready').execute(function(A) { if (dpAcrHasRegisteredArcLinkClickAction !== true) { dpAcrHasRegisteredArcLinkClickAction = true; A.declarative( 'acrLink-click-metrics', 'click', { \"allowLinkDefault\": true }, function (event) { if (window.ue) { ue.count(\"acrLinkClickCount\", (ue.count(\"acrLinkClickCount\") || 0) + 1); } } ); } }); P.when('A', 'cf').execute(function(A) { A.declarative('acrStarsLink-click-metrics', 'click', { \"allowLinkDefault\" : true }, function(event){ if(window.ue) { ue.count(\"acrStarsLinkWithPopov",
+ "销售商保修": "终身质保,从购买之日起一年。",
+ "闭合类型": "拉链",
+ "隔室数量": "1",
+ "颜色": "黑色"
+ },
+ "rating_stars": "4.6 颗星,最多 5 颗星",
+ "review_count_text": "(56,444)",
+ "sku": "B0B56CHMSC|黑色|M",
+ "sku_color": "黑色",
+ "sku_size": "M",
+ "social_proof": "过去一个月有3万+顾客购买",
+ "stage": "detail",
+ "sustainability_hint": "可持续发展特性",
+ "title": "Lifewit 中号午餐包保温午餐盒柔软冷却手提包适合成年男士女士,黑色 12 罐(9 升)",
+ "url": "https://www.amazon.com/-/zh/dp/B0B56CHMSC"
+} 详情
+
+
+
+{
+ "stage": "list",
+ "limit": 100,
+ "total": 144,
+ "items": [
+ {
+ "asin": "B095YC5M82",
+ "index": 1,
+ "price": "US$19.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 22,
+ "review_count_text": "(2.2万)",
+ "title": "MIYCOO 男女午餐袋和午餐盒,双层防漏保温柔软大号成人露营冷藏袋,适合工作、沙滩、野餐、旅行(黑色,15 升)",
+ "url": "https://www.amazon.com/-/zh/dp/B095YC5M82/ref=sr_1_1?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-1"
+ },
+ {
+ "asin": "B0B56CHMSC",
+ "index": 2,
+ "price": "US$7.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 56,
+ "review_count_text": "(5.6万)",
+ "title": "Lifewit 中号午餐包保温午餐盒柔软冷却手提包适合成年男士女士,黑色 12 罐(9 升)",
+ "url": "https://www.amazon.com/-/zh/dp/B0B56CHMSC/ref=sr_1_2?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-2"
+ },
+ {
+ "asin": "B0D5MGDJ2R",
+ "index": 3,
+ "price": "US$29.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 1901,
+ "review_count_text": "(1901)",
+ "title": "Cooler Backpack - 40 罐保暖背包冷却器男女适用,便携式 2 个防漏隔层冷藏袋,适合海滩旅行野餐午餐徒步烧烤露营 - MIYCOO",
+ "url": "https://www.amazon.com/-/zh/dp/B0D5MGDJ2R/ref=sr_1_3?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-3"
+ },
+ {
+ "asin": "B0BWHHLRVF",
+ "index": 4,
+ "price": "US$8.95",
+ "rating": 4.2,
+ "rating_text": "4.2 颗星,最多 5 颗星",
+ "review_count": 153,
+ "review_count_text": "(153)",
+ "title": "隔热野餐冷藏袋 - 顶部拉链,保温或保冷 - 非常适合野餐、沙滩、食品配送和户外(13.8 x 7.9 x 7.9 英寸)",
+ "url": "https://www.amazon.com/-/zh/dp/B0BWHHLRVF/ref=sr_1_4?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-4"
+ },
+ {
+ "asin": "B0711TMHZX",
+ "index": 5,
+ "price": null,
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 1167,
+ "review_count_text": "(1167)",
+ "title": "JanSport Lunch Break 保温冷藏袋 - 防漏野餐手提包,黑色, 黑色, 午休时间",
+ "url": "https://www.amazon.com/-/zh/dp/B0711TMHZX/ref=sr_1_5?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-5"
+ },
+ {
+ "asin": "B0C5T1GPNG",
+ "index": 6,
+ "price": "US$8.99",
+ "rating": 4.3,
+ "rating_text": "4.3 颗星,最多 5 颗星",
+ "review_count": 274,
+ "review_count_text": "(274)",
+ "title": "保温野餐袋冷藏袋可重复使用,沙滩包冷藏袋带拉链顶部 - 隔热袋适合冷热,野餐篮可折叠,野餐,海滩,户外(13.8 x 7.9 x 7.9 英寸)",
+ "url": "https://www.amazon.com/-/zh/dp/B0C5T1GPNG/ref=sr_1_6?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-6"
+ },
+ {
+ "asin": "B08NHM95JJ",
+ "index": 7,
+ "price": "US$23.74",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 2923,
+ "review_count_text": "(2923)",
+ "title": "LIQING 35L 大号野餐篮 2 层内部口袋防漏隔热,折叠内部支撑,增强稳定性,情侣结婚礼物(灰色)",
+ "url": "https://www.amazon.com/-/zh/dp/B08NHM95JJ/ref=sr_1_7?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-7"
+ },
+ {
+ "asin": "B078MLMCY2",
+ "index": 8,
+ "price": "US$62.98",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 4738,
+ "review_count_text": "(4738)",
+ "title": "Apollo Walker 野餐背包适合 4 人,带冷藏隔层、酒袋、野餐毯(45 英寸 x 53 英寸),适合送给家人和爱人的礼物(棕色)",
+ "url": "https://www.amazon.com/-/zh/dp/B078MLMCY2/ref=sr_1_8?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-8"
+ },
+ {
+ "asin": "B0BT9JWG4C",
+ "index": 9,
+ "price": "US$57.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 358,
+ "review_count_text": "(358)",
+ "title": "4 人野餐背包,野餐篮套装,防漏野餐包,沙滩冷藏背包带保温酒袋,野餐毯,双层野餐背包,适用于海滩、露营、公园(拉丝卡其色)",
+ "url": "https://www.amazon.com/-/zh/dp/B0BT9JWG4C/ref=sr_1_9?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-9"
+ },
+ {
+ "asin": "B091CL4YKY",
+ "index": 10,
+ "price": "US$9.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 11,
+ "review_count_text": "(1.1万)",
+ "title": "Femuar 可重复使用午餐盒男女 – 保温午餐袋防漏午餐盒适用于工作办公室野餐海滩 – 可冷冻午餐冷藏袋带可调节肩带 – 黑色",
+ "url": "https://www.amazon.com/-/zh/dp/B091CL4YKY/ref=sr_1_10?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-10"
+ },
+ {
+ "asin": "B0CC93FQN8",
+ "index": 11,
+ "price": "US$39.99",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 1720,
+ "review_count_text": "(1720)",
+ "title": "大号防水隔热冷藏背包男女适用,防漏冷藏背包,适用于露营、沙滩、钓鱼、野餐、旅行、户外,30L,48罐",
+ "url": "https://www.amazon.com/-/zh/dp/B0CC93FQN8/ref=sr_1_11?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-11"
+ },
+ {
+ "asin": "B0CWGL8Z55",
+ "index": 12,
+ "price": "US$7.99",
+ "rating": 4.3,
+ "rating_text": "4.3 颗星,最多 5 颗星",
+ "review_count": 153,
+ "review_count_text": "(153)",
+ "title": "保温袋野餐篮包沙滩包可折叠冷藏袋可重复使用拉链顶部用于温暖或冷野餐配件,户外(13.8 x 7.9 x 7.9 英寸)",
+ "url": "https://www.amazon.com/-/zh/dp/B0CWGL8Z55/ref=sr_1_12?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-12"
+ },
+ {
+ "asin": "B0D59G1P6P",
+ "index": 13,
+ "price": "US$5.98",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 5117,
+ "review_count_text": "(5117)",
+ "title": "午餐包女士/男士午餐盒女士/男士(黑色)",
+ "url": "https://www.amazon.com/-/zh/dp/B0D59G1P6P/ref=sr_1_13?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-13"
+ },
+ {
+ "asin": "B084JCXKKP",
+ "index": 14,
+ "price": "US$69.00",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 312,
+ "review_count_text": "(312)",
+ "title": "PICNIC TIME Coronado 帆布和柳条篮手提包,野餐手提袋,沙滩手提包",
+ "url": "https://www.amazon.com/-/zh/dp/B084JCXKKP/ref=sr_1_14?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-14"
+ },
+ {
+ "asin": "B081LM4H92",
+ "index": 15,
+ "price": "US$29.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 6917,
+ "review_count_text": "(6917)",
+ "title": "Jumbo 保温冷藏袋(木炭色)带高清隔热 - 优质可折叠软冷藏袋,可制作完美的保温杂货袋,食品运输袋,旅行包,海滩或野餐袋",
+ "url": "https://www.amazon.com/-/zh/dp/B081LM4H92/ref=sr_1_15?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-15"
+ },
+ {
+ "asin": "B07FRCPC6F",
+ "index": 16,
+ "price": "US$52.98",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 4738,
+ "review_count_text": "(4738)",
+ "title": "apollo walker 野餐背包,适合2人,带冷藏隔层,可拆卸瓶/酒架,羊毛毯,盘子和餐具(蓝色)",
+ "url": "https://www.amazon.com/-/zh/dp/B07FRCPC6F/ref=sr_1_16?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-16"
+ },
+ {
+ "asin": "B0F2459DTH",
+ "index": 17,
+ "price": "US$24.96",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 1248,
+ "review_count_text": "(1248)",
+ "title": "男士保温午餐袋和午餐盒 – 双层可重复使用午餐袋女士手提包冷藏袋防漏柔软可扩展 – 大午餐盒适合工作/成人/野餐/户外(黑色,15L)",
+ "url": "https://www.amazon.com/-/zh/dp/B0F2459DTH/ref=sr_1_17?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-17"
+ },
+ {
+ "asin": "B0D6QSVFJV",
+ "index": 18,
+ "price": "US$26.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 293,
+ "review_count_text": "(293)",
+ "title": "野餐篮 SIYUAN 可折叠购物篮 带手柄 27L 大型市场篮带盖 可重复使用的折叠杂货篮保温冷藏袋,绿色",
+ "url": "https://www.amazon.com/-/zh/dp/B0D6QSVFJV/ref=sr_1_18?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-18"
+ },
+ {
+ "asin": "B0DJM2YN3Z",
+ "index": 19,
+ "price": "US$16.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 369,
+ "review_count_text": "(369)",
+ "title": "Lifewit 超大手提袋,可重复使用的杂货袋,带金属线框架和手柄,立式实用可折叠购物袋用于存放,野餐,海滩,洗衣,汽车,46升,1包,灰色",
+ "url": "https://www.amazon.com/-/zh/dp/B0DJM2YN3Z/ref=sr_1_19?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-19"
+ },
+ {
+ "asin": "B09QBZY38F",
+ "index": 20,
+ "price": "US$14.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 4382,
+ "review_count_text": "(4382)",
+ "title": "Becokan 女式沙滩包大号防水沙滩手提包拉链沙滩包防水防沙游泳泳池包大手提包",
+ "url": "https://www.amazon.com/-/zh/dp/B09QBZY38F/ref=sr_1_20?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-20"
+ },
+ {
+ "asin": "B09Y93RGJC",
+ "index": 21,
+ "price": "US$21.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 5907,
+ "review_count_text": "(5907)",
+ "title": "HSHRISH 可扩展大号成人战术午餐盒,耐用保温午餐袋带肩带,男士工作户外野餐旅行柔软冷藏袋,20 罐/16 升,黑色",
+ "url": "https://www.amazon.com/-/zh/dp/B09Y93RGJC/ref=sr_1_21?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-21"
+ },
+ {
+ "asin": "B09VT1FCYN",
+ "index": 22,
+ "price": "US$13.90",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2425,
+ "review_count_text": "(2425)",
+ "title": "KALIDI 沙滩尼龙网眼手提包,休闲手提包 Hobo 女式可折叠 MAX 23L 单肩包 适合海滩野餐度假",
+ "url": "https://www.amazon.com/-/zh/dp/B09VT1FCYN/ref=sr_1_22?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-22"
+ },
+ {
+ "asin": "B0C64BQY4S",
+ "index": 23,
+ "price": "US$29.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 665,
+ "review_count_text": "(665)",
+ "title": "冷藏袋 48 罐保温防漏软冷藏箱大号可折叠便携式旅行冷藏袋 32 升用于野餐,防水软冰箱,适合露营,海滩,钓鱼,户外 - 32 夸脱",
+ "url": "https://www.amazon.com/-/zh/dp/B0C64BQY4S/ref=sr_1_23?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-23"
+ },
+ {
+ "asin": "B0D116KDSS",
+ "index": 24,
+ "price": "US$7.99",
+ "rating": 4.3,
+ "rating_text": "4.3 颗星,最多 5 颗星",
+ "review_count": 153,
+ "review_count_text": "(153)",
+ "title": "保温可重复使用食品野餐包沙滩包,带拉链的冷藏袋 - 适合冷热,野餐篮可折叠,海滩,户外派对,露营,节日(红色)",
+ "url": "https://www.amazon.com/-/zh/dp/B0D116KDSS/ref=sr_1_24?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-24"
+ },
+ {
+ "asin": "B0BZQRFY78",
+ "index": 25,
+ "price": "US$74.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 100,
+ "review_count_text": "(100)",
+ "title": "保温沙滩冷藏袋,防漏,优质玉米壳、沙滩包,泳池包,手提包,吸管,藤,女士礼品,野餐篮,婚礼礼物,午餐, 自然/米色",
+ "url": "https://www.amazon.com/-/zh/dp/B0BZQRFY78/ref=sr_1_25?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-25"
+ },
+ {
+ "asin": "B0BDZ9H2RM",
+ "index": 26,
+ "price": "US$17.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 2704,
+ "review_count_text": "(2704)",
+ "title": "露营冷藏背包 30 罐,软背包冷却器隔热防漏旅行冷藏袋防水午餐野餐海滩工作旅行保温袋饮料饮料啤酒袋冷却器",
+ "url": "https://www.amazon.com/-/zh/dp/B0BDZ9H2RM/ref=sr_1_26?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-26"
+ },
+ {
+ "asin": "B0B971KYX4",
+ "index": 27,
+ "price": "US$25.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 293,
+ "review_count_text": "(293)",
+ "title": "野餐篮,SIYUAN 可折叠购物篮带盖 27L 大型市场篮带把手可重复使用的折叠杂货篮保温冷藏袋,适合野餐旅行,蓝色",
+ "url": "https://www.amazon.com/-/zh/dp/B0B971KYX4/ref=sr_1_27?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-27"
+ },
+ {
+ "asin": "B0D53D2Q94",
+ "index": 28,
+ "price": "US$17.99",
+ "rating": 4.2,
+ "rating_text": "4.2 颗星,最多 5 颗星",
+ "review_count": 1033,
+ "review_count_text": "(1033)",
+ "title": "背包冷却器隔热防漏男士 Wowen 36 罐软冷藏背包隔热防水大容量冷藏袋便携午餐露营旅行野餐徒步",
+ "url": "https://www.amazon.com/-/zh/dp/B0D53D2Q94/ref=sr_1_28?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-28"
+ },
+ {
+ "asin": "B0FBV7P186",
+ "index": 29,
+ "price": "US$20.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 23,
+ "review_count_text": "(23)",
+ "title": "2 个保温野餐篮,可折叠购物篮,带 29 升大市场篮带把手,折叠购物篮保温冷藏袋,适用于野餐旅行食品配送市场购物红色",
+ "url": "https://www.amazon.com/-/zh/dp/B0FBV7P186/ref=sr_1_29?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-29"
+ },
+ {
+ "asin": "B073CHBWC9",
+ "index": 30,
+ "price": "US$75.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 4923,
+ "review_count_text": "(4923)",
+ "title": "Sunflora 野餐背包,适合4人,带毛毯野餐篮套装,适合2人,带隔热冷藏酒袋,适合家庭情侣(刷米色)",
+ "url": "https://www.amazon.com/-/zh/dp/B073CHBWC9/ref=sr_1_30?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-30"
+ },
+ {
+ "asin": "B07T93TVBT",
+ "index": 31,
+ "price": "US$23.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 406,
+ "review_count_text": "(406)",
+ "title": "Tirrinia 大号保温野餐篮,34 升防水防漏可折叠便携式冷藏篮套装,带铝制手柄,适合旅行,可折叠杂货袋,黑色",
+ "url": "https://www.amazon.com/-/zh/dp/B07T93TVBT/ref=sr_1_31?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-31"
+ },
+ {
+ "asin": "B01LE7BBL4",
+ "index": 32,
+ "price": "US$21.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 3443,
+ "review_count_text": "(3443)",
+ "title": "ALLCAMP 保温冷藏袋 便携式可折叠野餐篮冷藏袋 可折叠 防漏 轻巧 缝在框架中(中灰色)",
+ "url": "https://www.amazon.com/-/zh/dp/B01LE7BBL4/ref=sr_1_32?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-32"
+ },
+ {
+ "asin": "B085ND362Z",
+ "index": 33,
+ "price": "US$53.19",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 1974,
+ "review_count_text": "(1974)",
+ "title": "ALLCAMP 野餐背包 - 带隔层的保温冷藏袋,可拆卸酒杯架,盖毯和餐具套装,2 人野餐套装,适合家庭外出,情侣礼物(灰色)",
+ "url": "https://www.amazon.com/-/zh/dp/B085ND362Z/ref=sr_1_33?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-33"
+ },
+ {
+ "asin": "B0CPYFXYLF",
+ "index": 34,
+ "price": "US$9.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 1537,
+ "review_count_text": "(1537)",
+ "title": "Mesh Beach Bag, Large Beach Tote with Zipper Pocket, Toys Pool Bag for Family Travel Vacation Cruise Essentials",
+ "url": "https://www.amazon.com/-/zh/dp/B0CPYFXYLF/ref=sr_1_34?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-34"
+ },
+ {
+ "asin": "B0FBH2YD2N",
+ "index": 35,
+ "price": "US$19.99",
+ "rating": 3.9,
+ "rating_text": "3.9 颗星,最多 5 颗星",
+ "review_count": 14,
+ "review_count_text": "(14)",
+ "title": "野餐收纳袋 – 大容量防水储物袋,可折叠收纳袋,适用于海滩、徒步和户外毛毯/餐具",
+ "url": "https://www.amazon.com/-/zh/dp/B0FBH2YD2N/ref=sr_1_35?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-35"
+ },
+ {
+ "asin": "B0F98WH91R",
+ "index": 36,
+ "price": "US$4.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 2,
+ "review_count_text": "(2)",
+ "title": "Lisianthus 女式大号保温午餐袋,适合野餐海滩或旅行,14 升防漏冷藏袋 红色",
+ "url": "https://www.amazon.com/-/zh/dp/B0F98WH91R/ref=sr_1_36?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-36"
+ },
+ {
+ "asin": "B0B38GQPGF",
+ "index": 37,
+ "price": "US$19.95",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 4689,
+ "review_count_text": "(4689)",
+ "title": "BALEINE 2 件装保温可重复使用杂货袋,可折叠冷藏袋,适用于杂货,重型大号保温袋(40.64 厘米 x 22.96 厘米 x 33.02 厘米,春季散步)",
+ "url": "https://www.amazon.com/-/zh/dp/B0B38GQPGF/ref=sr_1_37?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-37"
+ },
+ {
+ "asin": "B08RSKGYPM",
+ "index": 38,
+ "price": "US$27.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 4426,
+ "review_count_text": "(4426)",
+ "title": "TOURIT 软边冷藏袋保温48/60罐,大号可折叠防漏冰盒,适合野餐、沙滩、露营、旅行",
+ "url": "https://www.amazon.com/-/zh/dp/B08RSKGYPM/ref=sr_1_38?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-38"
+ },
+ {
+ "asin": "B094J81F6T",
+ "index": 39,
+ "price": "US$46.98",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 394,
+ "review_count_text": "(394)",
+ "title": "野餐背包和配件 – 2 人隔热野餐套装,带双隔层,轻质毛毯,餐具套装,适合新婚夫妇和情侣礼物灰色",
+ "url": "https://www.amazon.com/-/zh/dp/B094J81F6T/ref=sr_1_39?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-39"
+ },
+ {
+ "asin": "B0G1BD2MZG",
+ "index": 40,
+ "price": "US$18.23",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 10,
+ "review_count_text": "(10)",
+ "title": "男士女士保温午餐包,大号可重复使用的午餐盒,带可调节肩带,防漏冷冻-安全手提包,适用于工作、野餐、办公室,600D 防水面料",
+ "url": "https://www.amazon.com/-/zh/dp/B0G1BD2MZG/ref=sr_1_40?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-40"
+ },
+ {
+ "asin": "B0BX3HVQSP",
+ "index": 41,
+ "price": "US$26.24",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 661,
+ "review_count_text": "(661)",
+ "title": "Amazon Basics 可重复使用保温软冷藏袋/背包",
+ "url": "https://www.amazon.com/-/zh/dp/B0BX3HVQSP/ref=sr_1_41?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-41"
+ },
+ {
+ "asin": "B0F7LBC1TL",
+ "index": 42,
+ "price": "US$27.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 551,
+ "review_count_text": "(551)",
+ "title": "LOVEVOOK 保温午餐袋女士,宽开口成人午餐盒女士,大号防漏冷藏袋适用于工作野餐海滩家庭学院,午餐教师手提包带可调节肩带杯架",
+ "url": "https://www.amazon.com/-/zh/dp/B0F7LBC1TL/ref=sr_1_42?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-42"
+ },
+ {
+ "asin": "B0BX3HVQST",
+ "index": 43,
+ "price": "US$16.27",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 782,
+ "review_count_text": "(782)",
+ "title": "Amazon Basics 软保温冷却器",
+ "url": "https://www.amazon.com/-/zh/dp/B0BX3HVQST/ref=sr_1_43?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-43"
+ },
+ {
+ "asin": "B08NHLPBN9",
+ "index": 44,
+ "price": "US$25.64",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 2923,
+ "review_count_text": "(2923)",
+ "title": "LIQING 35L 大号野餐篮 2 层内部口袋防漏隔热,折叠内部支撑,增强稳定性,情侣结婚礼物(酒红色)",
+ "url": "https://www.amazon.com/-/zh/dp/B08NHLPBN9/ref=sr_1_44?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-44"
+ },
+ {
+ "asin": "B0F37N4VKN",
+ "index": 45,
+ "price": "US$22.79",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 1478,
+ "review_count_text": "(1478)",
+ "title": "Bluboon 网眼沙滩手提包带冷藏隔层隔热可拆卸野餐包带拉链和口袋泳池包 女式",
+ "url": "https://www.amazon.com/-/zh/dp/B0F37N4VKN/ref=sr_1_45?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-45"
+ },
+ {
+ "asin": "B0BMQ8M11J",
+ "index": 46,
+ "price": "US$21.24",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2184,
+ "review_count_text": "(2184)",
+ "title": "大号女士午餐袋/保温成人午餐盒/防漏冷藏午餐手提包带储物袋。可重复使用的午餐钱包适合工作野餐徒步 12 升,条纹",
+ "url": "https://www.amazon.com/-/zh/dp/B0BMQ8M11J/ref=sr_1_46?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-46"
+ },
+ {
+ "asin": "B08W4GWCZS",
+ "index": 47,
+ "price": "US$23.74",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 2923,
+ "review_count_text": "(2923)",
+ "title": "LIQING 35L 大号野餐篮 2 层内部口袋防漏隔热,折叠内部支撑,增强稳定性,情侣结婚礼物(三文鱼色)",
+ "url": "https://www.amazon.com/-/zh/dp/B08W4GWCZS/ref=sr_1_47?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-47"
+ },
+ {
+ "asin": "B01CV8JH7A",
+ "index": 48,
+ "price": "US$18.75",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 964,
+ "review_count_text": "(964)",
+ "title": "MIER 18L 大号柔软冷藏隔热野餐袋,适用于杂货、露营、汽车、亮橙色",
+ "url": "https://www.amazon.com/-/zh/dp/B01CV8JH7A/ref=sr_1_48?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.pZpJ5whTXy3XN1zWEb8nsugQTRpylzpQrIYYKNPNPOLDgyIWHU_ykg-Do1gnk-n4-wymnLzhsMgkJYl4JN2-zwgLPVkILxqYtuHiUgYIQshvcuKjgpBcSgBV3udFvatifJbR1RSfGqM-XGCCTI4g3xOkxC52ONg22tE6hKaxo9XJ5LwXrWr-PwuzLemD1u3H-4U6FHRnIhpmAuOo4iM3AQImTRw9aWAaV-ngGncdsEpWsTxPfTCYGglow8XY2gMtg7VaioccVFQZ2jUOaueXOA_GJGl2WFppKpdLj9G8tOA.BaX14ufgaUsg-8x9weiFyyrzwTV3N3E0udrfEqZikV8&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813783&sr=8-48"
+ },
+ {
+ "asin": "B07P3YNG2K",
+ "index": 1,
+ "price": null,
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 4881,
+ "review_count_text": "(4881)",
+ "title": "CleverMade Collapsible LUXE Tote - Reusable Grocery Shopping Storage Bag Organizer w/Handles Reinforced Bottom",
+ "url": "https://www.amazon.com/-/zh/dp/B07P3YNG2K/ref=sr_1_49?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-49&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B097S7P43Y",
+ "index": 2,
+ "price": "US$29.98",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 376,
+ "review_count_text": "(376)",
+ "title": "可爱格子野餐毯,防水可折叠,大号80x60英寸(约203.2x152.4厘米),超大号80x80英寸(约203.2x203.2厘米),便携式紧凑沙滩毯,超大 XL 户外垫(棕褐色,XL 码 ) )",
+ "url": "https://www.amazon.com/-/zh/dp/B097S7P43Y/ref=sr_1_50?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-50&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0D2D15S4X",
+ "index": 3,
+ "price": "US$26.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 1174,
+ "review_count_text": "(1174)",
+ "title": "可扩展战术午餐盒,大号保温午餐冷藏袋重型防漏午餐桶适合男士成人工作办公室户外野餐旅行,16L,黑色",
+ "url": "https://www.amazon.com/-/zh/dp/B0D2D15S4X/ref=sr_1_51?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-51&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0D9JJ71BN",
+ "index": 4,
+ "price": "US$16.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 535,
+ "review_count_text": "(535)",
+ "title": "JUNGYOON Heavy-Duty Insulated Grocery Bags & Insulated Bag – Collapsible Cooler Bag with Zippered Top",
+ "url": "https://www.amazon.com/-/zh/dp/B0D9JJ71BN/ref=sr_1_52?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-52&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0BDSGN485",
+ "index": 5,
+ "price": "US$24.95",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 8046,
+ "review_count_text": "(8046)",
+ "title": "BALEINE 3 件装可重复使用的杂货袋,可折叠购物袋,底部加固手柄(开花季节)",
+ "url": "https://www.amazon.com/-/zh/dp/B0BDSGN485/ref=sr_1_53?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-53&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B01FXM4OEW",
+ "index": 6,
+ "price": "US$59.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 1963,
+ "review_count_text": "(1963)",
+ "title": "Hap Tim 野餐背包适合4人,带冷藏隔层,可拆卸瓶/酒架,羊毛毯,盘子和餐具套装,非常适合户外、运动、远足、露营、烧烤(咖啡)",
+ "url": "https://www.amazon.com/-/zh/dp/B01FXM4OEW/ref=sr_1_54?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-54&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B08BYFW2QJ",
+ "index": 7,
+ "price": "US$65.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 3360,
+ "review_count_text": "(3360)",
+ "title": "Hap Tim 野餐篮背包适合4人,带隔热防漏冷藏隔层,酒架,羊毛毯,餐具套装,情侣结婚礼物,订婚礼物",
+ "url": "https://www.amazon.com/-/zh/dp/B08BYFW2QJ/ref=sr_1_55?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-55&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07DGWB7YY",
+ "index": 8,
+ "price": "US$23.69",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2704,
+ "review_count_text": "(2704)",
+ "title": "ALLCAMP 酒袋 - 带酒杯、开瓶器和葡萄酒配件的保温冷藏袋 - 适用于旅行、野餐和礼品创意的便携式葡萄酒礼品袋 (黑色)",
+ "url": "https://www.amazon.com/-/zh/dp/B07DGWB7YY/ref=sr_1_56?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-56&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0FB9SFMYJ",
+ "index": 9,
+ "price": "US$15.99",
+ "rating": 4,
+ "rating_text": "4.0 颗星,最多 5 颗星",
+ "review_count": 1,
+ "review_count_text": "(1)",
+ "title": "2 件装保温可重复使用食品野餐包沙滩包,带拉链顶部沙滩包冷藏袋 - 保温袋,适合冷热,野餐篮可折叠,户外派对,露营,节日(A)",
+ "url": "https://www.amazon.com/-/zh/dp/B0FB9SFMYJ/ref=sr_1_57?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-57&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DZ2MPY4C",
+ "index": 10,
+ "price": "US$27.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 345,
+ "review_count_text": "(345)",
+ "title": "沙滩包带冷却器,49 升大号防水防沙手提包,带拉链,可折叠旅行包,适用于海滩、游泳池、野餐",
+ "url": "https://www.amazon.com/-/zh/dp/B0DZ2MPY4C/ref=sr_1_58?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-58&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0C19ZYSVK",
+ "index": 11,
+ "price": "US$26.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 1894,
+ "review_count_text": "(1894)",
+ "title": "BeeGreen 冷藏袋柔软保温手提包,适合海滩旅行杂货购物午餐便携式大号冰冷却器带手柄硬冷冻袋,顶部拉链,可折叠防漏送货手提袋,苔藓色",
+ "url": "https://www.amazon.com/-/zh/dp/B0C19ZYSVK/ref=sr_1_59?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-59&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0BFH97CRV",
+ "index": 12,
+ "price": "US$12.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 401,
+ "review_count_text": "(401)",
+ "title": "FITDON 黄麻帆布手提包女式 - 大号黄麻沙滩包,可折叠防水购物手提包,适合野餐旅行海滩",
+ "url": "https://www.amazon.com/-/zh/dp/B0BFH97CRV/ref=sr_1_60?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-60&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0C3WHF9S3",
+ "index": 13,
+ "price": "US$54.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 124,
+ "review_count_text": "(124)",
+ "title": "Rnoony Picnic Backpack for Camping, Picnic Basket for with Insulated Cooler Bag and Bottle Pouch,Camping Gifts for Couples with Lightweight Blanket and Cutlery Set for Family, Couple and Hiking",
+ "url": "https://www.amazon.com/-/zh/dp/B0C3WHF9S3/ref=sr_1_61?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-61&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B083DHKJS5",
+ "index": 14,
+ "price": "US$11.89",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 6598,
+ "review_count_text": "(6598)",
+ "title": "TOPDesign 1 | 3 | 6 | 30 件装帆布手提包,带外部口袋,可重复使用的杂货购物袋,顶部拉链闭合,日常必需品(黑色/自然色1 件装)",
+ "url": "https://www.amazon.com/-/zh/dp/B083DHKJS5/ref=sr_1_62?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-62&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CN43GCYT",
+ "index": 15,
+ "price": "US$9.98",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 1070,
+ "review_count_text": "(1070)",
+ "title": "KALIDI FANCY FOREST 沙滩网眼手提包,女式单肩包 MAX 27L 购物袋",
+ "url": "https://www.amazon.com/-/zh/dp/B0CN43GCYT/ref=sr_1_63?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-63&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DSZ9C22R",
+ "index": 16,
+ "price": "US$12.99",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 713,
+ "review_count_text": "(713)",
+ "title": "PEASUG 食品配送保温袋,XXXL 披萨配送袋,大容量冷藏袋保温,适合购物和餐饮,可折叠,重型(黑色)",
+ "url": "https://www.amazon.com/-/zh/dp/B0DSZ9C22R/ref=sr_1_64?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-64&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0F7R8748H",
+ "index": 17,
+ "price": "US$23.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 110,
+ "review_count_text": "(110)",
+ "title": "ZOMFELT 75L Standing Extra Large Utility Tote Bag with Removable Dividers&4-sided Reinforced, Reusable Grocery Shopping Bags",
+ "url": "https://www.amazon.com/-/zh/dp/B0F7R8748H/ref=sr_1_65?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-65&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CS2R1S1B",
+ "index": 18,
+ "price": "US$24.36",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 5592,
+ "review_count_text": "(5592)",
+ "title": "BAGSMART 女式手提包,轻质蓬松手提包,带隔层单肩包手提包,适合旅行、工作、健身房 | Lightweight, Puffy, Quilted, for Travel, Work",
+ "url": "https://www.amazon.com/-/zh/dp/B0CS2R1S1B/ref=sr_1_66?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-66&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B093F7CV87",
+ "index": 19,
+ "price": "US$22.49",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 1504,
+ "review_count_text": "(1504)",
+ "title": "LHZK 立式超大实用手提包,带金属线框架和侧面加固,超大手提包带手柄,可重复使用的杂货袋可折叠,沙滩包,汽车手提包(灰色)",
+ "url": "https://www.amazon.com/-/zh/dp/B093F7CV87/ref=sr_1_67?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-67&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0892YNM1S",
+ "index": 20,
+ "price": "US$17.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 6105,
+ "review_count_text": "(6105)",
+ "title": "LUNCIA 隔热单层砂锅背带,烤宽面条行李袋可保温或保冷,保温午餐袋适合野餐和野餐,适合 9 英寸 x 13 英寸(约 22.9 厘米 x 33.0 厘米)烘焙盘,灰色",
+ "url": "https://www.amazon.com/-/zh/dp/B0892YNM1S/ref=sr_1_68?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-68&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DXFSVFZ4",
+ "index": 21,
+ "price": "US$26.28",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 110,
+ "review_count_text": "(110)",
+ "title": "升级超大实用手提包,带反光带,立式可重复使用的杂货袋,硬底,四面加固,可折叠实用手提包,带提手,适用于海滩、野餐、汽车",
+ "url": "https://www.amazon.com/-/zh/dp/B0DXFSVFZ4/ref=sr_1_69?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-69&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0B1Q169W1",
+ "index": 22,
+ "price": "US$17.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 443,
+ "review_count_text": "(443)",
+ "title": "保温冷藏袋可重复使用的杂货手提包运输大号午餐盒 女式",
+ "url": "https://www.amazon.com/-/zh/dp/B0B1Q169W1/ref=sr_1_70?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-70&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B097P26RLV",
+ "index": 23,
+ "price": "US$25.99",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 1668,
+ "review_count_text": "(1668)",
+ "title": "sapsisel 80 x 80 英寸(约 203.2 x 203.2 厘米)野餐毯超大防水可折叠沙滩毯,3 层户外毛毯,适合 6 至 8 名成人,适合露营、公园、海滩、草地、室内……",
+ "url": "https://www.amazon.com/-/zh/dp/B097P26RLV/ref=sr_1_71?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-71&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0D92ZNWK3",
+ "index": 24,
+ "price": "US$100.00",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 1887,
+ "review_count_text": "(1887)",
+ "title": "Stanley All Day Julienne 柔软冷藏袋和午餐盒 | 带拉链保温旅行包 | 不含双酚 A",
+ "url": "https://www.amazon.com/-/zh/dp/B0D92ZNWK3/ref=sr_1_72?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-72&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CBFSKW4Z",
+ "index": 25,
+ "price": "US$14.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 373,
+ "review_count_text": "(373)",
+ "title": "esouler 隔热砂锅便携袋冷热食品携带袋烤宽面条支架午餐袋适用于野餐、派对、旅行,适合 22.86 x 33.02 厘米砂锅菜-灰色",
+ "url": "https://www.amazon.com/-/zh/dp/B0CBFSKW4Z/ref=sr_1_73?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-73&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CVNMVMSY",
+ "index": 26,
+ "price": "US$59.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 4025,
+ "review_count_text": "(4025)",
+ "title": "简约现代超大沙滩包 | 防水度假橡胶手提包带拉链口袋,适合旅行、游泳池、船、杂货、运动 | 杏仁桦木",
+ "url": "https://www.amazon.com/-/zh/dp/B0CVNMVMSY/ref=sr_1_74?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-74&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DZ5WKZ15",
+ "index": 27,
+ "price": "US$9.79",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 320,
+ "review_count_text": "(320)",
+ "title": "男女保温午餐包,双防漏午餐盒柔软冷藏手提包,带 5 个口袋,600D 牛津布,EVA 衬里,可调节肩带,适合工作、野餐、海滩和旅行-黑色",
+ "url": "https://www.amazon.com/-/zh/dp/B0DZ5WKZ15/ref=sr_1_75?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-75&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B00HKVGXFI",
+ "index": 28,
+ "price": "US$23.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 576,
+ "review_count_text": "(576)",
+ "title": "ONIVA - 野餐时间品牌 - Vista 户外野餐毯和手提包 - 沙滩毯 - 露营毯,(有趣的条纹图案与水蓝色外部),40.64 x 27.94 x 7.62",
+ "url": "https://www.amazon.com/-/zh/dp/B00HKVGXFI/ref=sr_1_76?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-76&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0FHGSR81V",
+ "index": 29,
+ "price": "US$19.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 1458,
+ "review_count_text": "(1458)",
+ "title": "MEXS 女士男士保温午餐包大号可重复使用的午餐盒成人防漏便携式冷藏手提袋,适合工作野餐",
+ "url": "https://www.amazon.com/-/zh/dp/B0FHGSR81V/ref=sr_1_77?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-77&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B09CSSRGH8",
+ "index": 30,
+ "price": "US$33.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 3960,
+ "review_count_text": "(3960)",
+ "title": "冷藏背包,隔热背包冷却器防漏双层冷藏袋,男女 RFID 午餐背包",
+ "url": "https://www.amazon.com/-/zh/dp/B09CSSRGH8/ref=sr_1_78?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-78&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0BGND4C1C",
+ "index": 31,
+ "price": "US$19.99",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2794,
+ "review_count_text": "(2794)",
+ "title": "豪华保温午餐盒包 女式 – 防漏防水冷却器带多口袋可拆卸肩带,适合工作野餐 – 教师母亲节圣诞节生日礼物",
+ "url": "https://www.amazon.com/-/zh/dp/B0BGND4C1C/ref=sr_1_79?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-79&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0GFVHFT8Y",
+ "index": 32,
+ "price": "US$15.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 99,
+ "review_count_text": "(99)",
+ "title": "男女保温午餐盒,工作用灯芯绒午餐袋,防漏成人冷藏手提袋,适用于办公室、野餐、旅行、户外(粉色蝴蝶结)",
+ "url": "https://www.amazon.com/-/zh/dp/B0GFVHFT8Y/ref=sr_1_80?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-80&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0BB2CDSNB",
+ "index": 33,
+ "price": "US$25.99",
+ "rating": 4.2,
+ "rating_text": "4.2 颗星,最多 5 颗星",
+ "review_count": 569,
+ "review_count_text": "(569)",
+ "title": "新款编织包,草编网眼手提包,沙滩,单肩包,Hobo 女士,可折叠大容量,适合假日。",
+ "url": "https://www.amazon.com/-/zh/dp/B0BB2CDSNB/ref=sr_1_81?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-81&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0FN3VMVHL",
+ "index": 34,
+ "price": "US$26.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 15,
+ "review_count_text": "(15)",
+ "title": "Rexmore 保温两瓶葡萄酒袋手提包,战术冷藏袋带可调节肩带,防漏隔层适合野餐旅行海滩派对,可放置眼镜和开瓶器,送给葡萄酒爱好者的礼物",
+ "url": "https://www.amazon.com/-/zh/dp/B0FN3VMVHL/ref=sr_1_82?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-82&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B08VDBW5PW",
+ "index": 35,
+ "price": "US$32.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 1,
+ "review_count_text": "(1万)",
+ "title": "SPARTER 背包冷却器隔热防漏 33/49 罐,2 个保温隔层保温袋,便携式轻质沙滩旅行露营午餐背包男女适用",
+ "url": "https://www.amazon.com/-/zh/dp/B08VDBW5PW/ref=sr_1_83?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-83&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CJ4ZPSPH",
+ "index": 36,
+ "price": "US$49.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 114,
+ "review_count_text": "(114)",
+ "title": "35L 多功能行李袋,防水鞋子和野餐露营收纳袋,3 个可调节隔板,适合旅行、运动、健身房",
+ "url": "https://www.amazon.com/-/zh/dp/B0CJ4ZPSPH/ref=sr_1_84?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-84&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0D29DLZXK",
+ "index": 37,
+ "price": "US$23.55",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 193,
+ "review_count_text": "(193)",
+ "title": "立式超大实用手提包,坚硬底部和硬侧面,重型可重复使用的杂货袋带手柄和 3 个口袋,可购物、沙滩、野餐、汽车(57.1 厘米 x 27.9 厘米 x 30.5 厘米,灰色)",
+ "url": "https://www.amazon.com/-/zh/dp/B0D29DLZXK/ref=sr_1_85?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-85&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DNPNY85J",
+ "index": 38,
+ "price": "US$8.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 335,
+ "review_count_text": "(335)",
+ "title": "KALIDI 沙滩手提包女式大号防水防沙单肩手提包可打包杂物包 Hobo 钱包野餐度假",
+ "url": "https://www.amazon.com/-/zh/dp/B0DNPNY85J/ref=sr_1_86?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-86&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DSJC1SLT",
+ "index": 39,
+ "price": "US$47.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 143,
+ "review_count_text": "(143)",
+ "title": "2 人野餐篮带桌子和毛毯可折叠冷藏袋隔热野餐套装适用于海滩野餐篮野餐约会户外野餐配件婚礼礼物/新娘送礼会礼物",
+ "url": "https://www.amazon.com/-/zh/dp/B0DSJC1SLT/ref=sr_1_87?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-87&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0B3RDJ35Y",
+ "index": 40,
+ "price": "US$33.99",
+ "rating": 4.3,
+ "rating_text": "4.3 颗星,最多 5 颗星",
+ "review_count": 1561,
+ "review_count_text": "(1561)",
+ "title": "背包冷藏箱,带双层和12个冰袋 - 36 罐保冷长达 24 小时 - 防水防漏隔热冷藏背包 - 时尚冷藏书包 适合女性旅行工作海滩",
+ "url": "https://www.amazon.com/-/zh/dp/B0B3RDJ35Y/ref=sr_1_88?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-88&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0DJ5QPNXD",
+ "index": 41,
+ "price": "US$13.79",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 552,
+ "review_count_text": "(552)",
+ "title": "Bluboon 女士午餐盒可爱午餐袋可重复使用的保温午餐袋大容量午餐盒冷却器,适合工作野餐或旅行使用",
+ "url": "https://www.amazon.com/-/zh/dp/B0DJ5QPNXD/ref=sr_1_89?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-89&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07XXZGVSM",
+ "index": 42,
+ "price": "US$19.99",
+ "rating": 4.5,
+ "rating_text": "4.5 颗星,最多 5 颗星",
+ "review_count": 22,
+ "review_count_text": "(2.2万)",
+ "title": "Bodaon 保温食品配送袋,XXXL 披萨配送袋,适用于冷热食物,商业,大容量可重复使用的加热袋,适合骑行的餐饮冷藏袋,派对保温器(黑色,1 件装)",
+ "url": "https://www.amazon.com/-/zh/dp/B07XXZGVSM/ref=sr_1_90?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-90&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0FH6M2K7B",
+ "index": 43,
+ "price": "US$29.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 18,
+ "review_count_text": "(18)",
+ "title": "GRANNY SAYS 2 合 1 49¼ 英寸深黑色防水野餐毯和手提包,大型野餐垫适用于露营、草地和公园,可折叠 3 层户外毛毯,无沙沙滩毯,带 1 个夹子和 4 个桩子",
+ "url": "https://www.amazon.com/-/zh/dp/B0FH6M2K7B/ref=sr_1_91?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-91&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0F9KQC2ZW",
+ "index": 44,
+ "price": "US$29.90",
+ "rating": 4.3,
+ "rating_text": "4.3 颗星,最多 5 颗星",
+ "review_count": 19,
+ "review_count_text": "(19)",
+ "title": "Outdoor Packable Picnic Blanket with Zipper Folds into Tote Bag with Large Storage and Shoulder Strap, Waterproof Sandproof for Lawn Beach Hiking Camping (colorful2, Small)",
+ "url": "https://www.amazon.com/-/zh/dp/B0F9KQC2ZW/ref=sr_1_92?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-92&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07RTS9PKR",
+ "index": 45,
+ "price": "US$54.99",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 344,
+ "review_count_text": "(344)",
+ "title": "CapaBunga 农贸市场手提包带提手 - 7 个口袋大号实用手提袋 - 重型帆布实用包 带人造皮革底座 - 可重复使用的手提袋 - 天然杂货袋",
+ "url": "https://www.amazon.com/-/zh/dp/B07RTS9PKR/ref=sr_1_93?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-93&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0CDQLGJCC",
+ "index": 46,
+ "price": "US$48.95",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 60,
+ "review_count_text": "(60)",
+ "title": "Lilly Pulitzer 蓝色野餐和沙滩冷却器,带可调节肩带和拉链的保温袋,大型柔软冷却器,适合杂货或旅行,贝壳和铃铛",
+ "url": "https://www.amazon.com/-/zh/dp/B0CDQLGJCC/ref=sr_1_94?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-94&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B0B5TT75JV",
+ "index": 47,
+ "price": "US$13.99",
+ "rating": 4.4,
+ "rating_text": "4.4 颗星,最多 5 颗星",
+ "review_count": 1709,
+ "review_count_text": "(1709)",
+ "title": "沙滩包 – 女式网眼手提包防水泳池包旅行家庭泳池海滩度假游轮必备 2025",
+ "url": "https://www.amazon.com/-/zh/dp/B0B5TT75JV/ref=sr_1_95?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-95&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07M7GRBPF",
+ "index": 48,
+ "price": "US$35.00",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2368,
+ "review_count_text": "(2368)",
+ "title": "SCOUT Nooner 女士保温午餐盒,容量为 6 罐 - 适合教师和护士的轻质工作午餐袋 - 柔软冷却器适合海滩旅行和野餐",
+ "url": "https://www.amazon.com/-/zh/dp/B07M7GRBPF/ref=sr_1_96?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.rDM84kGGsPc-XWpG6MzZIa42yLEhxLYv_ZBfG8XtLJTBKQY9FOVaiIJDS-qezHjjE1zfLgHnCYQqMjJes1qqvVxUihjRKmHNjAcR7CUB4KU4cyfSzz_mryARRLb1_yLy7q559wtjtV-lzGPc6SzT4g854SSN6NEWp11HxEqgLBh6M0eI0eYKHvq8L9AR1dE_oXN3SirEoLwTXDk94GAXKUwW4qyNs7bfYMQ4ft37NZrAnq0gljbXTZYXy2wdkGEbS7N4Y7nAMMIOj6DP5OtwV_Xr2cug9XY5kAPMlWvdU2M.BqxuaAPiuKUrvJocp0Jy_SBeZhnbTXSbO7fd6NUiC74&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813786&sr=8-96&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07XTYY5R9",
+ "index": 1,
+ "price": "US$33.99",
+ "rating": 4.6,
+ "rating_text": "4.6 颗星,最多 5 颗星",
+ "review_count": 434,
+ "review_count_text": "(434)",
+ "title": "PICNIC TIME 2 and 3 Bottle Insulated Wine Bag, Distressed Waxed Canvas Wine Tote, Durable Bottle Carrier Bag for Gifts and Travel with Side Pockets & Removable Divider (Khaki Green with Brown Accents)",
+ "url": "https://www.amazon.com/-/zh/dp/B07XTYY5R9/ref=sr_1_97?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.iS1en8yR0qgFbaJIlhuIgu8YsyLV5-DCio-0JVHtap2bUfogfnAOXTXfbQv0U-s-ZS3X2ROOAZno1fsBfS0lHKCahQCNGARa0vT99PRouy-MPWkM6T473jab_-xGImr1aiHUlPxtZnR6BvInaDDYCTTagFADm1LP9tGrvWNt7LoavUT8o8Bi3TmHpgR_snrFQ_Zlyv7js1bJy-qV6h60g_t_EFvlK7VhHND8abdkWFmz_Z63JYF20qUloN0YpqoYfU_U7vTbp2r1u8_XAA3s_tKEVf8ePcfnRCEmLgE5zDQ.iS2gmUDIpX4SuQDNCUZEuxcLa8w4GyA7lqRG5_7539M&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813790&sr=8-97&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B07MC6PNLX",
+ "index": 2,
+ "price": "US$55.00",
+ "rating": 4.7,
+ "rating_text": "4.7 颗星,最多 5 颗星",
+ "review_count": 2914,
+ "review_count_text": "(2914)",
+ "title": "SCOUT Original Deano 手提包 大号 - 耐用轻质开顶海滩、游泳池和湖泊包,内部拉链口袋,可折叠放平",
+ "url": "https://www.amazon.com/-/zh/dp/B07MC6PNLX/ref=sr_1_98?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.iS1en8yR0qgFbaJIlhuIgu8YsyLV5-DCio-0JVHtap2bUfogfnAOXTXfbQv0U-s-ZS3X2ROOAZno1fsBfS0lHKCahQCNGARa0vT99PRouy-MPWkM6T473jab_-xGImr1aiHUlPxtZnR6BvInaDDYCTTagFADm1LP9tGrvWNt7LoavUT8o8Bi3TmHpgR_snrFQ_Zlyv7js1bJy-qV6h60g_t_EFvlK7VhHND8abdkWFmz_Z63JYF20qUloN0YpqoYfU_U7vTbp2r1u8_XAA3s_tKEVf8ePcfnRCEmLgE5zDQ.iS2gmUDIpX4SuQDNCUZEuxcLa8w4GyA7lqRG5_7539M&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813790&sr=8-98&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B081SLGVK7",
+ "index": 3,
+ "price": "US$28.99",
+ "rating": 4.8,
+ "rating_text": "4.8 颗星,最多 5 颗星",
+ "review_count": 13,
+ "review_count_text": "(1.3万)",
+ "title": "可重复使用的杂货袋(3 个装) – 重型可重复使用的购物袋,带盒子形状,可站立、保持打开、折叠平整 – 大号手提包可折叠长提手和硬底(海军蓝)",
+ "url": "https://www.amazon.com/-/zh/dp/B081SLGVK7/ref=sr_1_99?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.iS1en8yR0qgFbaJIlhuIgu8YsyLV5-DCio-0JVHtap2bUfogfnAOXTXfbQv0U-s-ZS3X2ROOAZno1fsBfS0lHKCahQCNGARa0vT99PRouy-MPWkM6T473jab_-xGImr1aiHUlPxtZnR6BvInaDDYCTTagFADm1LP9tGrvWNt7LoavUT8o8Bi3TmHpgR_snrFQ_Zlyv7js1bJy-qV6h60g_t_EFvlK7VhHND8abdkWFmz_Z63JYF20qUloN0YpqoYfU_U7vTbp2r1u8_XAA3s_tKEVf8ePcfnRCEmLgE5zDQ.iS2gmUDIpX4SuQDNCUZEuxcLa8w4GyA7lqRG5_7539M&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813790&sr=8-99&xpid=ik9phYLHUP1Qo"
+ },
+ {
+ "asin": "B000FYTIZY",
+ "index": 4,
+ "price": "US$79.99",
+ "rating": 4,
+ "rating_text": "4.0 颗星,最多 5 颗星",
+ "review_count": 469,
+ "review_count_text": "(469)",
+ "title": "ONIVA Picnic Time Turismo 背包冷藏箱带水瓶袋,柔软冷藏旅行袋(黑色)",
+ "url": "https://www.amazon.com/-/zh/dp/B000FYTIZY/ref=sr_1_100?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&dib=eyJ2IjoiMSJ9.iS1en8yR0qgFbaJIlhuIgu8YsyLV5-DCio-0JVHtap2bUfogfnAOXTXfbQv0U-s-ZS3X2ROOAZno1fsBfS0lHKCahQCNGARa0vT99PRouy-MPWkM6T473jab_-xGImr1aiHUlPxtZnR6BvInaDDYCTTagFADm1LP9tGrvWNt7LoavUT8o8Bi3TmHpgR_snrFQ_Zlyv7js1bJy-qV6h60g_t_EFvlK7VhHND8abdkWFmz_Z63JYF20qUloN0YpqoYfU_U7vTbp2r1u8_XAA3s_tKEVf8ePcfnRCEmLgE5zDQ.iS2gmUDIpX4SuQDNCUZEuxcLa8w4GyA7lqRG5_7539M&dib_tag=se&keywords=%E9%87%8E%E9%A4%90%E5%8C%85&qid=1773813790&sr=8-100&xpid=ik9phYLHUP1Qo"
+ }
+ ]
+} // 列表的
+
+{
+ "items": [
+ {
+ "author": "Leonardo Diaz",
+ "body": "I am very impressed with this Lifewit lunch bag. It is the perfect size—compact enough to carry easily but spacious enough to fit a full meal and drinks (9L capacity). What I like most: • Great Insulation: Keeps my food fresh and drinks cold for hours. • Smart Design: The side pockets and front zipper are very handy for keys or utensils. • Durable: The material feels high-quality and the zippers are smooth. Highly recommended for work or outdoor trips. Great value for the price!",
+ "date": "2026年2月28日在美国发布评论",
+ "index": 1,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "R1BLD2WOWJ6820",
+ "title": "5.0 颗星,最多 5 颗星 Perfect lunch bag for daily use!"
+ },
+ {
+ "author": "SB",
+ "body": "Great medium sized lunch box for an adult!!! Excellent quality with plenty of space to hold Tupperware or meal prep containers . The lunch box is well made with strong stitching and a decent zipper. It is insulated enough to keep food cold when using an ice pack and easy to clean with soapy water or Clorox wipe. Great value.",
+ "date": "2026年2月22日在美国发布评论",
+ "index": 2,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "R2VN4GMGH5E3XJ",
+ "title": "5.0 颗星,最多 5 颗星 Great lunch box"
+ },
+ {
+ "author": "OCD Reviews from Me to You",
+ "body": "I’m super happy with this lunch box. The design is sleek and low-key, so it doesn’t look bulky or awkward to carry around. It’s definitely more stylish than most lunch boxes I’ve owned, but not it a bad way. Size-wise, it’s pretty much perfect: not huge, but not cramped either. I can fit four frozen ice packs in it without any trouble, along with my food. Insulation is been impressive. If I put the lunch box in the freezer overnight or start with frozen packs, everything stays cold for around 8 hours during the day, which is exactly what I was hoping for. It feels well made, the zippers are smooth, and it holds its shape nicely. Cons: If you pack a lot of containers or bulky meals, this may feel kind of small (for me, it holds a canned soda, water bottle, a large Tupperware along with ice packs) Best for: People who want a clean-looking lunch box that fits a normal workday meal, uses ice packs, and doesn’t take up a ton of space in a fridge or bag. Overall, it’s a solid, well-designed lunch box that does what it’s supposed to do! I highly recommend it. 阅读更多",
+ "date": "2026年2月24日在美国发布评论",
+ "index": 3,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "R3H9TI7HQN1OKQ",
+ "title": "5.0 颗星,最多 5 颗星 Solid (and stylish) lunch box that does exactly what I need"
+ },
+ {
+ "author": "Cindy A Gonzales",
+ "body": "It is a very large lunchbox, it may work for someone who brings breakfast, lunch and snacks for the day. If you are bringing a sandwich, chips and soda this will be too big. It’s very lightweight but it’s lined so items will stay cool but I had mine in the refrigerator so I’m not sure how cold it will keep your items if not refrigerated. The zipper compartment is pretty big so there’s extra room for your utensils and napkins. It’s not a bad bag for the price.",
+ "date": "2026年3月10日在美国发布评论",
+ "index": 4,
+ "rating_text": "4.0 颗星,最多 5 颗星",
+ "review_id": "R20EGWJMLYMTPT",
+ "title": "4.0 颗星,最多 5 颗星 Medium size seems larger but overall a good bag"
+ },
+ {
+ "author": "Fitzgerald",
+ "body": "This is a great medium size lunch box! I love the pattern. It is not heavy but still keeps everything cold. It holds my lunch, drinks and some extra snacks. It is fully collapsible and can easily be stored away. The handles are good quality and the long strap makes it easy to carry around.",
+ "date": "2026年1月29日在美国发布评论",
+ "index": 5,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "RP0DUYFPZZTXP",
+ "title": "5.0 颗星,最多 5 颗星 Great lunch box!"
+ },
+ {
+ "author": "Amazon Customer",
+ "body": "Absolutely love my Lunch bag. Very roomy, very light weight, and obsessed with the leopard print design. I thought the material would have been a little bit thicker. But it’s not that big of a deal. But it’s still a good lunch bag. The insulation is pretty good as well. It’s really easy to clean out as well. It is kinda on the flimsy side. I guess the more you use it, it’s stop being flimsy.",
+ "date": "2026年2月2日在美国发布评论",
+ "index": 6,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "RA9OTS3CYC8GJ",
+ "title": "5.0 颗星,最多 5 颗星 Lunch is roomy"
+ },
+ {
+ "author": "Yvette D",
+ "body": "This is the bag!! Roomy, sturdy and looks fashionable.",
+ "date": "2026年3月11日在美国发布评论",
+ "index": 7,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "R3KVTE9FUV2P1F",
+ "title": "5.0 颗星,最多 5 颗星 Love this bag!!!"
+ },
+ {
+ "author": "Auvreel",
+ "body": "Quality is good for price I think it's great it has two side pockets and one front pocket. Good insulated on the inside. The color came how I wanted it black. The design is very cute.",
+ "date": "2026年3月12日在美国发布评论",
+ "index": 8,
+ "rating_text": "5.0 颗星,最多 5 颗星",
+ "review_id": "RWNTE0I1MOX96",
+ "title": "5.0 颗星,最多 5 颗星 Good lunch bag"
+ },
+ {
+ "author": "Jonathan",
+ "body": "Una bolsa muy bonita",
+ "date": "2024年6月14日在墨西哥发布评论",
+ "index": 9,
+ "rating_text": null,
+ "review_id": "R13ADEU04NTBGT",
+ "title": "Exelente"
+ },
+ {
+ "author": "Eagle eye",
+ "body": "Extremely poor quality",
+ "date": "2025年2月3日在印度发布评论",
+ "index": 10,
+ "rating_text": null,
+ "review_id": "R13S3MYF8D18BZ",
+ "title": "Don't buy this product"
+ },
+ {
+ "author": "Maxweell",
+ "body": "Excelente produto, qualidade impecável, só não dou 5 estrelas porque pedi na cor preta e veio a cinza.",
+ "date": "2025年4月7日在巴西发布评论",
+ "index": 11,
+ "rating_text": null,
+ "review_id": "R1DC39PRGSKLV8",
+ "title": "Bolsa térmica"
+ },
+ {
+ "author": "Me",
+ "body": "Excellent quality and roomy without being too large.",
+ "date": "2025年12月21日在沙特阿拉伯发布评论",
+ "index": 12,
+ "rating_text": null,
+ "review_id": "R1MO0B59P50FMI",
+ "title": "Excellent"
+ },
+ {
+ "author": "PASHA",
+ "body": "I needed a lunch bag that could hold enough food for long workdays, and this Lifewit Insulated Lunch Box does the job perfectly. Pros: ✅ Spacious Interior – Easily fits multiple containers, snacks, and even a couple of drinks. ✅ Great Insulation – Keeps food cold for hours when paired with ice packs. ✅ Waterproof & Easy to Clean – The interior is leakproof, and spills wipe up easily. ✅ Durable and Well-Made – Strong zippers, sturdy handles, and quality materials. ✅ Looks Stylish – Professional design, great for office, work, or outdoor use. Cons: None! It’s exactly what I was looking for. Highly recommend this lunch bag if you need something roomy, well-insulated, and durable for work, picnics, or travel. Definitely a great buy!",
+ "date": "2025年2月9日在加拿大发布评论",
+ "index": 13,
+ "rating_text": null,
+ "review_id": "R1VU80JRRS4JQS",
+ "title": "Spacious, Durable, and Keeps Food Cold for Hours!"
+ }
+ ],
+ "limit": 50,
+ "stage": "reviews",
+ "total": 13,
+ "url": "https://www.amazon.com/-/zh/dp/B0B56CHMSC?th=1"
+} // 评论的
\ No newline at end of file