苹果门店库存,是指实体门店是否有货,有货了可以选择线下自提,如果线上第一时间抢不到,比如可能要等两个星期,那可以通过库存通知第一时间购买门店的机器。库存通知让人们拥有更多次第一时间买到新品的机会。
我没有通过这种方式购买过手机,准确点说,这个购买流程叫「预约自提」,在购买页面和购物车页面,都会显示两种日期:店内取货日期、快递送上门的日期。比如现在购买 iPhone 13,店内取货日期可以是今天,送上门的日期就是明天。
库存检测、开售通知,不一定通过小程序进行订阅,也可以通过公众号对话完成配置,配置完成后,在小程序显示,取消订阅也在小程序取消。
v2ex 网友分享他如何抢 iPhone 13,提到几项工具。
在 GitHub 找到一个项目,从中可分析苹果库存检测的流程:
重庆 重庆 九龙坡区
;微信小程序“库存小工具”,检测方法和上面是一样的,广告超级多,而且在多个小程序之间频繁跳转来跳转去,很烦。
这是一个电脑软件,不同于工具一让用户选择城市地区,这个工具是让用户选择零售店,这才是正确的做法。比如选择肇庆,工具一会通知广州零售店的到货通知,这是不合理的。
从工具三找到一个获取所有零售店的网址,拿到的是全球所有门店,通过下面的代码筛选出国内门店:
const url = "https://www.apple.com/rsp-web/store-list?locale=zh_CN";
const json = await got(url).json();
const stores = json.storeListData
.filter((item) => item.locale === "zh_CN")[0]
.state.map((item) => {
return item.store;
});
const storesFlatted = [].concat.apply([], stores).map((item) => {
return {
address: item.address.stateName,
name: item.name,
storeId: item.id,
};
});
console.log(storesFlatted);
补充:找到一个更简洁的获取国内门店列表的接口。
通过上述方法拿到门店 storeId,然后通过其他方法拿到产品的 partNumber 之后,传入下面这个链接可以获取这个产品在这个门店的库存情况,通过 unavailable
判断是否可以到店取货,示例代码:
const partNumber = "MME73CH/A";
const storeId = "R577"; //天环
const url = `https://www.apple.com.cn/shop/fulfillment-messages?pl=true&parts.0=${partNumber}&store=${storeId}`;
const json = await got(url).json();
const pickupMsg =
json.body.content.pickupMessage.stores[0].partsAvailability[partNumber]
.pickupDisplay;
const isAvailable = pickupMsg === "unavailable" ? false : true;
console.log(isAvailable);
这个链接可以传入多个产品 partNumber:
async function app() {
const parts = ["MME73CH/A", "MK1A3CH/A"];
const partNumberList = parts
.map((item, index) => {
return `parts.${index}=${item}`;
})
.join("&");
const storeId = "R577"; //天环
const url = `https://www.apple.com.cn/shop/fulfillment-messages?pl=true&${partNumberList}&store=${storeId}`;
const json = await got(url).json();
const result = parts.map((partNumber) => {
const pickupMsg =
json.body.content.pickupMessage.stores[0].partsAvailability[partNumber]
.pickupDisplay;
const isAvailable = pickupMsg === "unavailable" ? false : true;
return {
partNumber,
isAvailable,
};
});
console.log(result);
}
补充:苹果有一个针对 iPhone 的预约购买和取货的网页,从这个页面可以获得各个零售店的 iPhone 库存信息 。
通过上面的 API 你应该知道查询一款产品的库存情况,至少需要两个参数,一个是 storeId,另一个就是产品 partNumber,storeId 获取方式很简单,前面已经有说明,partNumber 有一点麻烦。
打开苹果官网某个产品的购买页面,选择某个型号的产品及其配置,在链接处应该就能看到这个产品的 partNumber,不同颜色、不同容量的两部 iPhone,即使都叫 iPhone 13,但他们的 partNumber 是不一样的。
如果想批量获取 partNumber 可以打开苹果官网的产品页面,可以在网络请求中搜索 locator 找到获取某个产品系列 partNumber 的链接,例如:
从链接中提取某个系列产品的 partNumber 列表的代码示例:
//获取 iPhone 的 partNumber 列表
const got = require("got");
async function app() {
const api =
"https://www.apple.com.cn/shop/product-locator-meta?family=iphone13";
const json = await got(api).json();
const products =
json.body.productLocatorOverlayData.productLocatorMeta.products.map(
(item) => {
return {
name: item.productTitle,
partNumber: item.partNumber,
// capacity: item.dimensionCapacity,
// size: item.dimensionScreensize,
price: item.price,
link: item.productLink,
};
}
);
console.log(products);
}
app();