麦当劳获取奖券脚本(JS版?)

麦当劳获取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)
38 个赞

你这没发sid啊?

const response = await fetch(TARGET_URL, {method: 'POST',headers: HEADERS,body: new URLSearchParams(pld),credentials: 'include',});

注意credentials: 'include',当然这就代表必须用同一个auth过的浏览器做fetch

2 个赞

很好使,不错哦

大伙可都太刑了 坐等脚本移步小戏精 :yaoming:

一下拿了50+个code 这特么小号都不用了 :yaoming:

这可太行了 一下子成了55个 这下必须得多注册几个账号了 不然不够玩

感谢,很好用,就是邮件等太久要饿死了 :cry:

今天邮件好慢,现在还没收到

收到邮件后可以直接用gmail内置的Gemini快速抓出来邮件里的code,不需要用脚本。脚本会被block掉。

收到Gemini整理好的code后可以去notion里让ai帮你排版一下,弄个勾选框,记下来哪些用掉了

7 个赞

幹這超猛比py還好用

2 个赞

太牛了!

随手干了一周的code 圣上 要不咱移驾白金吧

1 个赞

拾人牙慧而已,原帖也不是白金区的

我不会啊,毕竟只是读DOM而已

一般多久会收到邮件?

我这边会报error,可能取决于浏览器

感谢分享。

感谢分享,不是码农没看懂。BTW每次中奖的coupon,可以在同一单使用吗?之前去麦当劳,用coupon下了四五单,很社死。。。

不能,可以去主楼搜搜有没有qjyq

是啥。。。抱歉 :face_without_mouth: