代码如下
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` 方法中设置的请求头包含了多个字段,用于模拟从特定设备(如微信小程序或浏览器)发出的请求。这些设置有助于绕过一些基于请求头的访问控制。
使用场景
该脚本适用于需要自动化获取和监控在线票务平台演出信息的场景,特别是在需要快速响应和购买限量票务的情况下。
注意事项
– 代码的可维护性: 当接口路径或参数、请求头等信息变更时,需要相应地更新代码。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
1. 转载请在文内以超链形式注明出处,谢谢合作!
2. 本站除原创内容,其余所有内容均收集自互联网,仅限用于学习和研究目的,本站不对其内容的合法性承担任何责任。如有版权内容,请通知我们或作者删除,其版权均归原作者所有,本站虽力求保存原有版权信息,但因众多资源经多次转载,已无法确定其真实来源,或已将原有信息丢失,所以敬请原作者谅解!
3. 本站用户所发布的一切资源内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责,若您对本站所载资源作品版权归属存有异议,请留言附说明联系邮箱,我们将在第一时间予以处理 ,同时向您表示歉意!为尊重作者版权,请购买原版作品,支持您喜欢的作者,谢谢!
4. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客如有发现请立即向站长举报;本站资源文件大多存储在云盘,如发现链接或图片失效,请联系作者或站长及时更新。
暂无评论内容