V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oreainters
V2EX  ›  Apple

又造了个轮子,监控实体店库存,实现自动下单

  •  
  •   oreainters · 2023-09-21 11:18:09 +08:00 · 4583 次点击
    这是一个创建于 431 天前的主题,其中的信息可能已经有所发展或是发生改变。

    监控库存的脚本已经比较多了,实现起来也比较简单,几行代码就完成了,只是好像没有用起来特别方便的。

    支持了一下 docker ,这样可以直接方便跑在服务器上。

    自动下单没找到现有的,索性花了点时间实现了,但是这两天 15 的实体店库存都刷不出来,也不知道能不能一次成功,等测成功了再提上去吧。

    Github 地址:ToolGallery

    推送支持了 bark, 钉钉通知。

    懒人示例:

    docker run --rm toolgallery/ape-store-assistant:main -p MTQ43CH/A -l '广东 深圳 罗湖区' -c cn
    
    # 产品型号可以通过 -lp --code 15-pro -c cn 获取
    

    比较菜,轻喷。

    第 1 条附言  ·  2023-09-22 16:38:06 +08:00
    已推,带上 -o 参数可自动下单,--code 参数也需要,以及以下环境变量

    DELIVERY_FIRST_NAME
    DELIVERY_LAST_NAME
    DELIVERY_EMAIL
    DELIVERY_PHONE
    DELIVERY_IDCARD // 后 4 位
    DELIVERY_PAYMENT // -lpa 查看 如: installments0001243254
    DELIVERY_PAYMENT_NUMBER // int 分期期数 普通支付为 0
    58 条回复    2023-10-17 17:01:08 +08:00
    mylighting
        1
    mylighting  
       2023-09-21 11:26:03 +08:00
    谢谢,我要试试,首发没抢到啊啊啊啊
    cairnechen
        2
    cairnechen  
       2023-09-21 11:47:11 +08:00
    俺用的站内另一位同学做的,只是提醒不能自动下单,等楼主做好了我试试,官网预计发货时间 10 月 24 号以后确实等不了
    tallest
        3
    tallest  
       2023-09-21 12:12:58 +08:00
    啊~
    我魔改的一个 Java 的,好像也是站内另一个同学的,我给它加了个微信消息提醒
    ![20230921121136.png]( https://s2.loli.net/2023/09/21/Gg2zj6cBYpyrxPZ.png)
    cairnechen
        4
    cairnechen  
       2023-09-21 13:38:20 +08:00
    @tallest 求教怎么加微信提醒啊
    TAFMT
        5
    TAFMT  
       2023-09-21 13:45:55 +08:00
    感谢,我前几天用那个库存提醒的 + 手动抢。费好大劲也没抢到。。
    infante
        6
    infante  
       2023-09-21 13:58:24 +08:00
    感谢, 真的很需要
    Soulkim
        7
    Soulkim  
       2023-09-21 14:36:55 +08:00
    请问 location 是怎么获取的?
    gps949
        8
    gps949  
       2023-09-21 14:40:45 +08:00
    OP 可以拿别的有库存的旧型号产品做一下自动下单实验。感觉这个还是很必要的
    Soulkim
        9
    Soulkim  
       2023-09-21 15:08:04 +08:00
    @Soulkim #7 搞定了,是型号填错
    oreainters
        10
    oreainters  
    OP
       2023-09-21 15:11:35 +08:00
    oreainters
        11
    oreainters  
    OP
       2023-09-21 15:13:13 +08:00
    @gps949 其他型号测试成功了的,就是不知道在新款上效果如何
    gps949
        12
    gps949  
       2023-09-21 15:16:29 +08:00
    @oreainters 那应该问题不大,毕竟提交订单模式都是一致的。OP 把这个加上呗,大不了可以跑俩容器,一个只监测的,一个开自动下单的
    oreainters
        13
    oreainters  
    OP
       2023-09-21 15:27:48 +08:00
    @gps949 我都是固定参数测试的,等我改改推上去
    Soulkim
        14
    Soulkim  
       2023-09-21 15:50:37 +08:00
    @oreainters #10 感谢,通知搞定了,期待能自动下单
    565656
        15
    565656  
       2023-09-21 15:52:15 +08:00
    是不是因为这个玩意 很多实体店直接关了取货通道了
    fighte97
        16
    fighte97  
       2023-09-21 16:01:17 +08:00
    @565656 江浙沪取货直接被关了
    Felixxyq
        17
    Felixxyq  
       2023-09-21 16:11:29 +08:00
    @565656 临近发售这俩天每年都是关闭的
    Richared
        18
    Richared  
       2023-09-21 16:12:42 +08:00
    去年抢 14pm 自己实现了一个,提醒再去刷就没有了,还是自动下单靠谱。
    Canm
        19
    Canm  
       2023-09-21 16:18:06 +08:00 via iPhone
    哈哈,厉害了厉害👍🏻
    WenJimmy
        20
    WenJimmy  
       2023-09-21 16:30:48 +08:00
    等个自动下单
    Fange
        21
    Fange  
       2023-09-22 02:10:56 +08:00
    有点好奇 不需要填写个人信息和付款方式吗?
    oreainters
        22
    oreainters  
    OP
       2023-09-22 16:34:00 +08:00
    @Fange 需要基本信息
    calpes
        23
    calpes  
       2023-09-22 16:58:36 +08:00
    @oreainters 我注意到似乎没有填写到店时间?
    Soulkim
        24
    Soulkim  
       2023-09-22 16:59:42 +08:00
    @oreainters #22 大佬能给个自动下单的示例吗,刚上手不太明白,还有个问题就是不用登录 appleid 的吗?
    Heroininu
        25
    Heroininu  
       2023-09-22 17:20:07 +08:00
    @calpes 自动取第一个到店时间得
    calpes
        26
    calpes  
       2023-09-22 17:23:07 +08:00
    @oreainters 设置为 5s 后边都会失败,apple store 的服务器不太行吗
    zjunjun
        27
    zjunjun  
       2023-09-22 17:51:38 +08:00
    用脚本买到一个 256 黑,后天下午可取。楼主厉害👍
    oreainters
        28
    oreainters  
    OP
       2023-09-22 18:08:45 +08:00
    @zjunjun 厉害厉害,实话讲,我到现在也没买到,放的太少了。
    oreainters
        29
    oreainters  
    OP
       2023-09-22 18:14:25 +08:00
    @Soulkim 不用,这个是用游客进行下单,下单成功后在邮件里进行支付,示例我看看补充在 readme 里
    rzjsbbbb
        30
    rzjsbbbb  
       2023-09-22 23:45:51 +08:00
    可不可以加一个白名单或者限制距离的功能啊,苏州甚至查长沙的库存。。。
    oreainters
        31
    oreainters  
    OP
       2023-09-23 15:36:54 +08:00
    @rzjsbbbb 已加
    cairnechen
        32
    cairnechen  
       2023-09-23 17:51:48 +08:00
    @oreainters

    大佬,问一下不用 docker 怎么运行
    Hades300
        33
    Hades300  
       2023-09-23 21:49:01 +08:00
    感谢楼主,已经挂着跑了一整个下午了,发现不少这种报错,每次都在 start_checkout: Starting checkout... 之后,代码我改过一些行数不一定准。。 准备开个 debug level 调调看,楼主遇到过吗
    File "/Users/XXX/PycharmProjects/APEStoreAssistant/src/actions/order.py", line 148, in start_checkout
    signin_url = resp_json["head"]["data"]["url"]
    KeyError: 'data'
    Hades300
        34
    Hades300  
       2023-09-24 08:44:41 +08:00
    InventoryMonitor 持有的 Order 一直复用一个 session ,会不会存在前面下单失败,购物车里积攒了很多个商品的问题🧐
    Hades300
        35
    Hades300  
       2023-09-24 10:11:52 +08:00
    感谢楼主贡献的代码和思路,对我而言感觉是个很规范的 python 项目,学到了蛮多。
    发现一个问题和一些优化点
    1. 我在页面上购买杭州的 14Plus 测试,无法在付款前拿到 timewindow 的,这个不是下单的必要条件。
    2. 填充付款方式和联系人信息是可以并行的🤣(杭州货好难抢,每次补货只持续 2-10s )
    3. monitor 模块和 order 模块目前串行耦合,一个 available 的机会是可以开多个 order 并行 race 一下的(相当于模拟多位 guest 同时下单)
    4. 激进一些,甚至可以初始化时拿好 store 信息,不 check 库存直接下单(这个有些脑补,需要测出无库存时的表现)
    关于第一点,可能是不同地区的下单逻辑稍有不同,比如上海就能通过楼主给的流程下单,但对其他地区是致命的因为必失败。
    除此之外,刚刚验证了,上面 order 复用问题确实是个缺陷,购物车会越攒越多(程序一直挂着跑,抢 15PM 的话首次失败后后续失败也几乎是必然的)。
    感觉是个潘多拉魔盒,想给楼主提 PR 但是又有点不敢提了,不过该说的都说了,,我相信一定有闭源的现存下单工具。。但真的很纠结。。。 @oreainters
    oreainters
        36
    oreainters  
    OP
       2023-09-24 12:30:48 +08:00
    @Hades300 哈哈,可以提 PR ,order 复用的问题已经发现了,后面修改下。

    第一点应该是必要条件,那个是获取取货的时间,很多时候监控到有货,再到拿取货时间的时候已经没了

    2 ,3 ,4 都是速度相关的优化,其实已经写好了一个维护 order 池下单的一个方案,下单可以做到 5-6 秒左右,不太确定要不要放出来。
    Hades300
        37
    Hades300  
       2023-09-24 14:08:47 +08:00
    @oreainters 酷酷!不过取货时间真的是必要的吗,在杭州下单 iPhone14 是不显示可预约取货时间的,得先付款🤯。在抢 15PM 的时候经常发现有机器但是没有可约时间,怀疑也是和 14 一样。
    rzjsbbbb
        38
    rzjsbbbb  
       2023-09-24 14:28:01 +08:00
    @oreainters 我看很多现货产品 14/iPad 之类的都是取货日期待付款完成后确定,要先付款才行
    oreainters
        39
    oreainters  
    OP
       2023-09-24 21:26:48 +08:00   ❤️ 1
    @Hades300
    @rzjsbbbb 不太确定,空了试试
    c5QzzesMys8FudxI
        40
    c5QzzesMys8FudxI  
       2023-09-25 08:23:11 +08:00
    OP 我没看懂这个参数 能举个简单的例子么? 比如我在北京想监控 iPhone15promax 钛原色 256G 请问怎么跑
    thy44h2
        41
    thy44h2  
       2023-09-25 10:40:25 +08:00
    显示下单成功,但是一个小时了还没收到支付的邮件和信息,然后马上下单的取货时间也快过了
    @oreainters 想问一下,有什么办法可以看到下单的状态吗?谢谢
    c5QzzesMys8FudxI
        42
    c5QzzesMys8FudxI  
       2023-09-25 11:37:55 +08:00
    @thy44h2 请问下下单的参数怎么加
    kiraku
        43
    kiraku  
       2023-09-25 12:43:51 +08:00 via iPhone
    @4rat 示例:docker run -e DELIVERY_FIRST_NAME=myname (剩余的环境变量…) --rm toolgallery/ape-store-assistant:main -p MTQ43CH/A -l '广东 深圳 罗湖区' -c cn
    tallest
        44
    tallest  
       2023-09-25 15:28:03 +08:00
    @cairnechen 调 PC 微信 hook 的接口
    ddv12138
        45
    ddv12138  
       2023-09-25 18:21:14 +08:00
    救大命,库存监控跑了两天,就出现两次有货,每次都是几秒钟货就没了,没有脚本根本抢不赢
    kiraku
        46
    kiraku  
       2023-09-25 20:34:57 +08:00
    请问会不定期报这个错误是为啥呀,有无大佬帮忙看看:
    Traceback (most recent call last):
    File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 971, in json
    return complexjson.loads(self.text, **kwargs)
    File "/usr/local/lib/python3.10/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
    File "/usr/local/lib/python3.10/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/local/lib/python3.10/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "/app/actions/inventory_monitoring.py", line 44, in start
    inventory_data = self.get_data(
    File "/app/actions/inventory_monitoring.py", line 164, in get_data
    return resp.json()
    File "/usr/local/lib/python3.10/site-packages/requests/models.py", line 975, in json
    raise RequestsJSONDecodeError(e.msg, e.doc, e.pos)
    requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
    rzjsbbbb
        47
    rzjsbbbb  
       2023-09-26 12:26:37 +08:00
    @kiraku 我的也是 翻一下记录甚至能发现有一大半都在爆这个错没几条监控的
    lesswest
        48
    lesswest  
       2023-09-26 12:58:10 +08:00
    @kiraku 同一个错误
    thy44h2
        49
    thy44h2  
       2023-09-26 16:58:50 +08:00
    今天抢到了,来分享一下经验。
    @kiraku 你这个问题,我的感受就是你设置的查询间隔太短了,我设置的 8 秒,基本就没在报这个错误。
    然后前面我提到的问题,下单成功但是没收到邮件和消息,也就是其实下单没有成功。受前面的 v 友的启发 @Hades300 ,在想有没有可能 order 复用的问题导致的,索性删除 image 重新安装,然后就成功下单收到订单号了。
    最后感谢 op @oreainters 的贡献,让我能提前半月拿到新机。
    Hades300
        50
    Hades300  
       2023-09-28 00:41:41 +08:00
    @thy44h2 🎉
    fivesmallq
        51
    fivesmallq  
       2023-09-29 14:46:58 +08:00
    已抢到 15pm 512 黑色,北京,感谢 @Hades300 今天放货贼多,感觉黄牛要砸手里了,可能过几天就都有现货了。
    Hades300
        52
    Hades300  
       2023-09-29 15:35:28 +08:00
    @fivesmallq 手持 15PM 回复😏,是不是感谢错人了
    fivesmallq
        53
    fivesmallq  
       2023-09-29 18:04:44 +08:00
    @Hades300 @oreainters 都感谢:)
    nZWVjowEHkQN
        54
    nZWVjowEHkQN  
       2023-10-01 11:44:01 +08:00
    @oreainters 麻烦楼主帮忙看下参数正不正确, 伺服器上挂了两个, 其实前几天都抢到了, 最后脚本终止了. 但是手机这边没有收到推送通知, 邮箱里面也没有订购的邮件. 我可以保证的是, 等号后面的参数一定是正确的. 提前感謝!

    nohup docker run -e DELIVERY_FIRST_NAME=姓 -e DELIVERY_LAST_NAME=名 -e DELIVERY_EMAIL=邮箱 -e DELIVERY_PHONE=手机 -e DELIVERY_IDCARD=身分证最后四位 -e DELIVERY_PAYMENT=WECHAT -e DELIVERY_PAYMENT_NUMBER=0 -e BARK_TOKRN=bark 唯一 ID --rm toolgallery/ape-store-assistant:main -c cn -p MU2N3CH/A -l "广东 广州 天河区" -o -onc -1 --code 15-pro -i 30 -sft 珠江新城 天环广场 > monitor.log 2>&1 &
    nZWVjowEHkQN
        55
    nZWVjowEHkQN  
       2023-10-01 13:01:19 +08:00
    @thy44h2 可以分享一下指令吗, 谢谢!
    mylighting
        56
    mylighting  
       2023-10-02 07:51:38 +08:00   ❤️ 1
    @nZWVjowEHkQN 你那个指令我感觉没啥问题,除了姓名弄反了
    thy44h2
        57
    thy44h2  
       2023-10-02 15:25:40 +08:00   ❤️ 1
    @nZWVjowEHkQN 看起来没问题,其实你这个和我之前遇到的问题一样,以为成功下单了,其实并没有。成功下单了会收到一条提供临时 icloud 空间的短信,里面有订单号。你没有收到这个消息就表示下单失败。我的经验是删掉 image 重新下载,就能成功下单了
    Neight99
        58
    Neight99  
       2023-10-17 17:01:08 +08:00
    基本没怎么写过 python ,很简陋地支持了一版下单时一并下单 ac+的功能,提了个 pr
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:00 · PVG 17:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.