刘念的个人博客

0%

10元成本抢到周杰伦演唱会门票

10 元成本抢到周杰伦演唱会门票

周杰伦忽然就又翻红,抢个票实在是太难了,前有粉丝黄牛抢、后有大麦不放票。年龄大了手速根本跟不上,所以只能靠脑子解决了。

抢票无非就三点

网速、手速和运气

现在就来解决这些问题。

网速

  • 首先网速问题很好解决。大麦的集群使用的是阿里云的服务器,官方默认内网速度为千兆,那么我们挑一个非演唱会举办地区以及其周边的服务器那么就可以大概率避过抢票的大军。所以可以选择青岛或者北京的服务器。
  • 由于只是抢票用,所以选择按量付费,也就是按小时计费
  • 因为按量付费非常适合当前的场景,所以在这配置直接拉满服务器配置当然内存 64G 就不需要了,能省 3 块就省 3 块
  • 这样一台 16 核,40G 内存,带宽 3Gbps(大概 3000M/S)的服务器就到手了。

网速问题解决了,成本 8.79 元。

手速

首先买票的流程很简单,以下以大麦为例:

  1. 选择票价
  2. 确认购买
  3. 选择购票人
  4. 确认订单
  5. 付款(人工操作)

流程确认明白后首先准备前期工作:

注册一个大麦的账号,配置好收货地址,购票人的身份证。先买一下别的演出票,确认账号可以正常使用。

首先运行环境当然选择headless-chrome。当然如果你觉得windows比较好用的话直接Chrome + Tampermonkey也勉强可以。

运行的环境为 Node.js® ,所以安装谷歌提供的Puppeteer

首先启动 Puppeteer:

1
2
const puppeteer = require("puppeteer");
const browser = await puppeteer.launch();

然后打开大麦的登录地址:

1
2
3
4
await page.goto(" https://passport.damai.cn/login", {
//等待页面加载结束后再执行
waitUntil: "domcontentloaded"
});

在开发者工具中找到大麦的账号密码输入框,分别是:

fm-login-id

fm-login-password

直接输入并点击登录就可以了:

1
2
3
document.querySelector("#fm-login-id").value = "你的账号";
document.querySelector("#fm-login-password").value = "你的密码";
document.querySelector(".fm-button.fm-submit.password-login").click();

之后跳转你需要购买的页面,以下以周杰伦杭州场的举例:

首先看到页面的结构为日期+票价

damai

那么流程就是选场次然后选票价:

首先找到全部的场次:

1
2
3
let performs = document.querySelectorAll(
".perform__order__select__performs .select_right_list_item"
);

判断一下非无票的并点击

1
[...performs].find(el => el.querySelector(".presell").innerText !== "无票");

如果是undefined那就证明都没有票了,果断刷新页面再次重复执行。

接下来票档同样操作。

在这提取字符串里的数字,用来筛选想要买的档位

1
skuname.innerText.replace(/[^\d.]/g, "");

之后就是等待购买了,在这使用MutationObserver来监听DOM的变化,如果disabled没有了那么直接点击就可以了

1
2
3
4
5
6
7
8
9
10
11
12
const targetNode = document.getElementById('[data-spm="dbuy"]');
const config = { attributes: true };

// Callback function to execute when mutations are observed
const callback = function(mutationsList, observer) {
for (let mutation of mutationsList) {
if (mutation.type === "attributes") {
targetNode.click();
}
}
};
const observer = new MutationObserver(callback);

之后跳转到确认订单页就没什么了,找到之前配置好的演出参加人的checkbox直接click提交订单就可以了。

在这记得加个延时,20s 左右,在 20s 期间每 3s + Math.random()左右提交一次点击,如果页面没跳转那么大概率是失败了,跳转回选择场次的页面重复之前的流程。

如果跳转了,那么直接关闭程序,执行browser.close();就可以了,抓紧拿起手机去订单里面付款。

消耗电费 1 元。

运气

如果 20 分钟之后还是没成功,那么就是没抢到票。问题没有解决,接下来解决出问题的人就可以了 img

成本 0 元。