某玩岛监控回流脚本

代码如下

import json
import logging

import requests
from requests import Response

from Monitor import Monitor


class FWD(Monitor):

    def __init__(self, perform: dict) -> None:
        super().__init__()
        logging.info(f"某玩岛 {perform.get('show_name')} 开始加载")
        self.performId = perform.get('show_id')
        self.show_info = dict()
        self.get_show_infos()
        logging.info(f"某玩岛 {self.show_info.get('show_name')} 加载成功")

    def get_show_infos(self):
        response = self.request(f'https://api.livelab.com.cn/performance/app/project/get_project_info?project_id={self.performId}&v=1695113662390&retry=false')
        self.show_info["show_id"] = str(json.loads(response.text).get("data").get("projectId"))
        self.show_info["show_name"] = json.loads(response.text).get("data").get("projectName")
        self.show_info["seat_info"] = list()
        self.show_info["platform"] = 2
        response = self.request(f'https://api.livelab.com.cn/performance/app/project/get_performs?project_id={self.performId}&v=1694683437294&retry=false')
        show_info = json.loads(response.text)
        for session_info in show_info.get("data").get("performInfos"):
            session = session_info.get("performInfo")[0]
            session_id = session.get("id")
            session_name = session.get("name")
            for seat in session.get("seatPlans"):
                seat_info = dict()
                seat_info["session_id"] = session_id
                seat_info["session_name"] = session_name
                seat_info["seat_plan_id"] = seat.get("seatPlanId")
                seat_info["seat_plan_name"] = seat.get("seatPlanName")
                self.show_info["seat_info"].append(seat_info)

    def monitor(self) -> list:
        logging.info(f"某玩岛 {self.show_info.get('show_name')} 监控中")
        can_buy_list = list()
        response = self.request(f'https://api.livelab.com.cn/performance/app/project/countDown?projectId={self.performId}')
        if json.loads(response.text).get("data") > 0:
            return can_buy_list
        response = self.request(f'https://api.livelab.com.cn/performance/app/project/get_performs?project_id={self.performId}&v=1694683437294&retry=false')
        show_info = json.loads(response.text)
        if show_info.get("code") != 10000:
            return can_buy_list
        for session_info in show_info.get("data").get("performInfos"):
            for seat in session_info.get("performInfo")[0].get("seatPlans"):
                if seat.get("display") != 1:
                    continue
                can_buy_list.append(str(seat.get("seatPlanId")))
        return can_buy_list

    def request(self, url: str) -> Response:
        return requests.get(
            url=url,
            headers={
                'xweb_xhr': '1',
                'Accept': '*/*',
                'Sec-Fetch-Mode': 'cors',
                'Sec-Fetch-Dest': 'empty',
                'Host': 'api.livelab.com.cn',
                'Accept-Language': 'zh-CN,zh',
                'Sec-Fetch-Site': 'cross-site',
                'Content-Type': 'application/json',
                'Referer': 'https://servicewechat.com/wx5a8f481d967649eb/70/page-frame.html',
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF XWEB/30817',
                'authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJjdCI6MTcxMzI1MTY0Nzg1NCwibWlkIjoxNzU4ODA4NTcxMzc3NDI2MzMzLCJ0eXBlIjoiYXBwIiwiZGlkIjoiZDVhNGUwMDg0ODc0NTY4OCJ9.Q1ltCrRG48TfjAWaAnfuLHo0oX2NQKsSMNalffwncztBjYVb38LnbLYOCgXhf7hK5vGOHy_xf11qBe5Xk9hqhA',
            },
            proxies=super()._proxy,
            verify=False,
            timeout=10
        )

解析

这段代码定义了一个名为 `FWD` 的类,它继承自 `Monitor` 类。`FWD` 主要用于通过 API 自动获取和监控某玩岛的演出信息,包括演出的时间、座位等详细信息。下面是代码的详细解析:

类定义和初始化

– __init__ 方法: 类的构造函数,它首先调用基类 `Monitor` 的构造方法,接着初始化演出的ID,并拉取演出的详细信息。

方法说明

– get_show_infos 方法: 此方法通过两次 API 请求来获取演出的详细信息。首先,它获取基本的演出信息,如项目ID和名称。接着,它获取该演出的所有场次信息,并进一步获取每场演出的座位计划,这些信息都被存储在 `show_info` 字典中。

– monitor 方法: 该方法用于定期检查某个演出的可购票状态。它首先检查演出是否开始倒计时(即是否可购买),如果倒计时结束,它将检查每个座位是否可购买,并返回可购买的座位列表。

– request 方法: 这是一个用于发起网络请求的方法,使用 `requests.get` 发送 GET 请求。此方法接受一个 URL 并配置了请求头和代理,返回请求的响应。请求头中包括了一些特定的字段,如 `xweb_xhr`, `Sec-Fetch-Mode` 等,这些字段有助于确保请求被服务器正确接收和处理。

其他关键点

– 请求头: `request` 方法中设置的请求头包含了多个字段,用于模拟从特定设备(如微信小程序或浏览器)发出的请求。这些设置有助于绕过一些基于请求头的访问控制。

使用场景

该脚本适用于需要自动化获取和监控在线票务平台演出信息的场景,特别是在需要快速响应和购买限量票务的情况下。

注意事项

– 代码的可维护性: 当接口路径或参数、请求头等信息变更时,需要相应地更新代码。

注意

本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。

© 版权声明
THE END
喜欢就支持一下吧
点赞28 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容