• Python 抓取 iphone13 pro 线下店供货信息并发送到钉钉机器人,最后设置为定时任务


    背景

    • 在线上买了个 iphone13pro,可是等得我好着急呀!一直不发货..甚至关注了 iphone13 超话每天看看大家下的订单都发货了没...
    • 于是乎还看到了有人预定了线下门店的提货,害得我也想直接去线下店提货了..但是每次打开官网都显示【暂无供应】
    • 于是乎想到了简单的爬虫(其实就是发个请求而已...),然后做成定时任务,当有货的时候第一时间通知我

    完成步骤

    1. 打开官网,找到获取线下门店供应情况的接口
    2. 抓包接口,猜测哪个字段影响供货显示情况
    3. 改包接口,将该字段改成有货,验证猜测
    4. Python 请求该接口,取到该字段值
    5. 接入钉钉机器人,将广州线下门店的供货情况发送到钉钉上
    6. 使用 mac 自带的 crontab 定时任务,创建执行 Python 脚本的定时任务

    找接口

    https://www.apple.com.cn/shop/fulfillment-messages?pl=true&parts.0=MLTE3CH/A&location=%E5%B9%BF%E4%B8%9C%20%E5%B9%BF%E5%B7%9E%20%E5%A4%A9%E6%B2%B3%E5%8C%BA

    很容易找到供货情况的接口是这个

    找字段

    盲猜是这个 storeSelectionEnabled 字段影响的,因为只有它是 False,当然也有猜过是下面的 pickupDisplay,但从命名来看,第一个才是影响是否可选中的字段

    验证字段

    • 通过 charles 的 map local 来改包
    • 先保存这个接口的响应体到本地,然后将 storeSelectionEnabled 改成 true
    • 再按照下面的步骤来绑定响应映射就可以了

    • 再次请求下网站,可以看到是可选中了
    • 当然,我其实并不知道真正有供货的响应体是怎么样的,因为找了好几个城市都是无货状态,无法直接复制
    • 所以只能假设可选中就是有供货,准确率估计 50%?哈哈

    Python 脚本请求该接口

    import requests
    def get_phone():
        res = requests.get(
            "https://www.apple.com.cn/shop/fulfillment-messages?pl=true&parts.0=MLTE3CH/A&location=%E5%B9%BF%E4%B8%9C%20%E5%B9%BF%E5%B7%9E%20%E5%A4%A9%E6%B2%B3%E5%8C%BA",
            verify=False)
        res = res.json()["body"]["content"]["pickupMessage"]["stores"]
    
        for num, item in enumerate(res):
            phone = item["partsAvailability"]["MLTE3CH/A"]
    
            storeSelectionEnabled = phone["storeSelectionEnabled"]
            storePickupQuote = phone["storePickupQuote"]
            pickupSearchQuote = phone["pickupSearchQuote"]
    
            if storeSelectionEnabled:
                res = {
                    "可取货": storeSelectionEnabled,
                    "取货状态": storePickupQuote,
                    "供应状态": pickupSearchQuote
                }
                yield res

    接入钉钉机器人

    https://www.cnblogs.com/poloyy/p/15565764.html

    最终脚本

    import requests
    
    
    # 获取手机供货信息
    def get_phone():
        res = requests.get(
            "https://www.apple.com.cn/shop/fulfillment-messages?pl=true&parts.0=MLTE3CH/A&location=%E5%B9%BF%E4%B8%9C%20%E5%B9%BF%E5%B7%9E%20%E5%A4%A9%E6%B2%B3%E5%8C%BA",
            verify=False)
        res = res.json()["body"]["content"]["pickupMessage"]["stores"]
    
        for num, item in enumerate(res):
            phone = item["partsAvailability"]["MLTE3CH/A"]
    
            storeSelectionEnabled = phone["storeSelectionEnabled"]
            storePickupQuote = phone["storePickupQuote"]
            pickupSearchQuote = phone["pickupSearchQuote"]
    
            if storeSelectionEnabled:
                res = {
                    "可取货": storeSelectionEnabled,
                    "取货状态": storePickupQuote,
                    "供应状态": pickupSearchQuote
                }
                yield res
    
    
    # python 3.8
    import time
    import hmac
    import hashlib
    import base64
    import urllib.parse
    
    # 加签
    timestamp = str(round(time.time() * 1000))
    secret = '此处填写 webhook token'
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
    
    
    def dingmessage():
        # 请求的URL,WebHook地址
        webhook = f"https://oapi.dingtalk.com/robot/send?access_token={token}&timestamp={timestamp}&sign={sign}"
    
        # 构建请求头部
        header = {"Content-Type": "application/json", "Charset": "UTF-8"}
    
        # 循环生成器并发送消息
        for phone in get_phone():
            message = {
                "msgtype": "text",
                "text": {"content": phone},
                "at": {
                    # @ 所有人
                    "isAtAll": True
                }
            }
            message_json = json.dumps(message)
            info = requests.post(url=webhook, data=message_json, headers=header, verify=False)  # 打印返回的结果
            print(info.text)
    
    
    if __name__ == "__main__":
        dingmessage()

    运行一下

    接入 crontab 定时任务

    我的是 mac 电脑,所有有自带 crontab,命令行敲

    sudo crontab -e

    添加定时任务

    */1 * * * * /usr/local/opt/python@3.9/bin/python3.9 /Users/test.py

    保存,会有成功信息

    > sudo crontab -e
    crontab: installing new crontab

    查看定时任务

    sudo crontab -l

    过一分钟后去看钉钉就可以了!

    特殊情况

    若遇到定时任务无法运行,可以看看这篇

    https://www.cnblogs.com/poloyy/p/15565916.html

  • 相关阅读:
    flask(十)使用alembic,进行数据库结构管理,升级,加表,加项
    Python sqlalchemy使用
    flask+script命令行交互工具
    flask+APScheduler 任务调度,计划任务,定时任务
    DBA日常工作职责
    Oracle 的 VKTM 进程
    linux
    UF2.0、O4、UFT、TA众明星背后的秘密
    ORA-01502: 索引或这类索引的分区处于不可用状态
    关于Optimizer_index_cost_adj参数的设置
  • 原文地址:https://www.cnblogs.com/poloyy/p/15565875.html
Copyright © 2020-2023  润新知