从麦当劳获取code脚本继续讨论:
不想用python所以让gemini写了这个,webworker版本因为浏览器安全策略不好使,只能退而求其次用js
(async function() {
const qs = (s) => document.querySelector(s);
const cl = (s) => console.log(s);
const TOT = 100; // 总共要发送的请求数量
const MC = 100; // 最大并发请求数
const BD = 100; // 每个请求发送前的基础延迟 (毫秒)
const JIT = 50; // 延迟抖动范围 (± 毫秒)
cl("--- McDonald's AMOE 并发请求脚本 ---");
const pld = {
first_name: qs("#first_name")?.value,
last_name: qs("#last_name")?.value,
suffix: qs("#suffix")?.value,
email: qs("#email")?.value,
address: qs("#address")?.value,
address2: qs("#address2")?.value,
city: qs("#city")?.value,
state: qs("#state")?.value,
zip: qs("#zip")?.value,
placeid: qs("#placeid")?.value,
suggested_placeid: qs("#suggested_placeid")?.value,
csrf_token: qs("input[name='csrf_token']")?.value,
token: qs("input[name='token']")?.value,
};
const TARGET_URL = "https://amoe.playatmcd.com/complete_your_game_code_request";
const HEADERS = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "https://amoe.playatmcd.com",
"Referer": `https://amoe.playatmcd.com/complete_your_game_code_request?token=${pld.token}`,
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
};
let ss = 0;
let ff = 0;
let cpd = 0;
const sleep = (t) => new Promise(r => setTimeout(r, t));
async function sendRequest(i) {
const low = Math.max(0.0, BD - JIT);
const high = BD + JIT;
const randomDelay = Math.random() * (high - low) + low;
await sleep(randomDelay);
try {
const response = await fetch(TARGET_URL, {method: 'POST',headers: HEADERS,body: new URLSearchParams(pld),credentials: 'include',});
const txt = await response.text();
const ex = txt.substring(0, 1500).replace(/\n|\r/g, ' ');
const ok = (response.status >= 200 && response.status < 300) && txt.includes("Success");
cpd++;
ok ? cl(`${i} [${cpd.toString().padStart(3, '0')}/${TOT}] ✓ ${response.status} - ${ex} ${++ss}`) : cl(`[${cpd.toString().padStart(3, '0')}/${TOT}] ✗ ${response.status} - ${ex} ${++ff}`);
} catch (e) {
cl(`${i} [${cpd.toString().padStart(3, '0')}/${TOT}] ✗ NetworkError - ${e.message} ${++cpd} ${++ff}`);
}
}
const tts = [];
for (let i = 1; i <= TOT; i++) tts.push(i);
async function w() {
while (tts.length > 0) {
const taskIndex = tts.shift();
if (taskIndex) await sendRequest(taskIndex);
}
}
const wps = [];
for (let i = 0; i < MC; i++) wps.push(w());
await Promise.all(wps);
cl(`成功: ${ss}`);cl(`失败: ${ff}`);
})();
或者把这坨放到浏览器的书签里
javascript:(async function() { const qs = (s) => document.querySelector(s); const cl = (s) => console.log(s); const TOT = 100; const MC = 100; const BD = 100; const JIT = 50; cl("--- McDonald's AMOE %E5%B9%B6%E5%8F%91%E8%AF%B7%E6%B1%82%E8%84%9A%E6%9C%AC ---"); const pld = { first_name: qs("#first_name")?.value,%20last_name:%20qs("#last_name")?.value,%20suffix:%20qs("#suffix")?.value,%20email:%20qs("#email")?.value,%20address:%20qs("#address")?.value,%20address2:%20qs("#address2")?.value,%20city:%20qs("#city")?.value,%20state:%20qs("#state")?.value,%20zip:%20qs("#zip")?.value,%20placeid:%20qs("#placeid")?.value,%20suggested_placeid:%20qs("#suggested_placeid")?.value,%20csrf_token:%20qs("input[name='csrf_token']")?.value,%20token:%20qs("input[name='token']")?.value,%20};%20const%20TARGET_URL%20=%20"https://amoe.playatmcd.com/complete_your_game_code_request";%20const%20HEADERS%20=%20{%20"Accept":%20"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",%20"Content-Type":%20"application/x-www-form-urlencoded",%20"Origin":%20"https://amoe.playatmcd.com",%20"Referer":%20`https://amoe.playatmcd.com/complete_your_game_code_request?token=${pld.token}`,%20"Upgrade-Insecure-Requests":%20"1",%20"User-Agent":%20"Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/141.0.0.0%20Safari/537.36"%20};%20let%20ss%20=%200;%20let%20ff%20=%200;%20let%20cpd%20=%200;%20const%20sleep%20=%20(t)%20=>%20new%20Promise(r%20=>%20setTimeout(r,%20t));%20async%20function%20sendRequest(i)%20{%20const%20low%20=%20Math.max(0.0,%20BD%20-%20JIT);%20const%20high%20=%20BD%20+%20JIT;%20const%20randomDelay%20=%20Math.random()%20*%20(high%20-%20low)%20+%20low;%20await%20sleep(randomDelay);%20try%20{%20const%20response%20=%20await%20fetch(TARGET_URL,%20{method:%20'POST',headers:%20HEADERS,body:%20new%20URLSearchParams(pld),credentials:%20'include',});%20const%20txt%20=%20await%20response.text();%20const%20ex%20=%20txt.substring(0,%201500).replace(/\n|\r/g,%20'%20');%20const%20ok%20=%20(response.status%20>=%20200%20&&%20response.status%20<%20300)%20&&%20txt.includes("Success");%20%20cpd++;%20ok%20?%20cl(`${i}%20[${cpd.toString().padStart(3,%20'0')}/${TOT}]%20%E2%9C%93%20${response.status}%20-%20${ex}%20${++ss}`)%20:%20cl(`[${cpd.toString().padStart(3,%20'0')}/${TOT}]%20%E2%9C%97%20${response.status}%20-%20${ex}%20${++ff}`);%20}%20catch%20(e)%20{%20cl(`${i}%20[${cpd.toString().padStart(3,%20'0')}/${TOT}]%20%E2%9C%97%20NetworkError%20-%20${e.message}%20${++cpd}%20${++ff}`);%20}%20}%20%20const%20tts%20=%20[];%20for%20(let%20i%20=%201;%20i%20<=%20TOT;%20i++)%20tts.push(i);%20async%20function%20w()%20{%20while%20(tts.length%20>%200)%20{%20const%20taskIndex%20=%20tts.shift();%20if%20(taskIndex)%20await%20sendRequest(taskIndex);%20}%20}%20const%20wps%20=%20[];%20for%20(let%20i%20=%200;%20i%20<%20MC;%20i++)%20wps.push(w());%20await%20Promise.all(wps);%20cl(`%E6%88%90%E5%8A%9F:%20${ss}`);cl(`%E5%A4%B1%E8%B4%A5:%20${ff}`);})();
点之前记得打开开发者选项控制台
用这个js脚本可以批量从gmail拿到奖券(YMMV)
[...document.querySelectorAll('span[style="color:#603e51;font-size:18px"]')].map(e => e.innerText)
