logo科技微讯

苹果门店库存检测

作者:科技微讯
日期:2022-03-02
📝 笔记

苹果门店库存,是指实体门店是否有货,有货了可以选择线下自提,如果线上第一时间抢不到,比如可能要等两个星期,那可以通过库存通知第一时间购买门店的机器。库存通知让人们拥有更多次第一时间买到新品的机会。

我没有通过这种方式购买过手机,准确点说,这个购买流程叫「预约自提」,在购买页面和购物车页面,都会显示两种日期:店内取货日期、快递送上门的日期。比如现在购买 iPhone 13,店内取货日期可以是今天,送上门的日期就是明天。

库存检测、开售通知,不一定通过小程序进行订阅,也可以通过公众号对话完成配置,配置完成后,在小程序显示,取消订阅也在小程序取消。

v2ex 网友分享他如何抢 iPhone 13,提到几项工具。

工具一

在 GitHub 找到一个项目,从中可分析苹果库存检测的流程:

  • 确认 iPhone 型号,例如 “iPhone 13 Mini 128GB 午夜色” 是 MLDC3CH/A,获得购买链接
  • 这个链接获取苹果产品可以在哪个省份购买;
  • 这个链接获取苹果产品可以在哪个城市购买;
  • 这个链接获取苹果产品可以在哪个地区购买;
  • 这个链接返回苹果可以识别的地区,例如重庆 重庆 九龙坡区
  • 最后这个链接返回所选择的地区的所有 stores 是否可取货的信息;

工具二

微信小程序“库存小工具”,检测方法和上面是一样的,广告超级多,而且在多个小程序之间频繁跳转来跳转去,很烦。

工具三

这是一个电脑软件,不同于工具一让用户选择城市地区,这个工具是让用户选择零售店,这才是正确的做法。比如选择肇庆,工具一会通知广州零售店的到货通知,这是不合理的。

从工具三找到一个获取所有零售店的网址,拿到的是全球所有门店,通过下面的代码筛选出国内门店:

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 库存信息

partNumber

通过上面的 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();
donation赞赏
thumbsup0
thumbsdown0
暂无评论