Greasy Fork镜像 支持简体中文。

自动上传邀请码

直接上传邀请码!

目前為 2024-04-01 提交的版本,檢視 最新版本

// ==UserScript==
// @name         自动上传邀请码
// @namespace    https://linux.do
// @version      0.0.3
// @description  直接上传邀请码!
// @author       codecow
// @match        https://linux.do/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=linux.do
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant        none
// @license      MIT
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';

    // 获取csrfToken
    let csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
    let headers = {
        "accept": "*/*",
        "accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
        "cache-control": "no-cache",
        "discourse-logged-in": "true",
        "discourse-present": "true",
        "pragma": "no-cache",
        "x-csrf-token": csrfToken,
        "x-requested-with": "XMLHttpRequest",
        'sec-ch-ua': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
        'Discourse-Logged-In': 'true',
        'sec-ch-ua-arch': '"x86"',
        'sec-ch-ua-platform-version': '"10.0.0"',
        'X-Requested-With': 'XMLHttpRequest',
        'sec-ch-ua-full-version-list': '"Google Chrome";v="123.0.6312.60", "Not:A-Brand";v="8.0.0.0", "Chromium";v="123.0.6312.60"',
        'sec-ch-ua-bitness': '"64"',
        'sec-ch-ua-model': '',
        'sec-ch-ua-platform': '"Windows"',
        'Discourse-Present': 'true',
        'sec-ch-ua-mobile': '?0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'sec-ch-ua-full-version': '"123.0.6312.60"',
        'Referer': 'https://linux.do/u/codecow/invited/pending'
    }
    let upload_headers = {
        'Content-Type': 'application/json',
    };
    // 获取用户名称
    let username = document.getElementsByClassName("header-dropdown-toggle current-user")[0].querySelector("button").getAttribute("href").replace("/u/", "");
    // 循环flag
    let flag = true;
    // 邀请链接
    let inviteLinks = [];

    // 获取过期时间
    async function getExpiresAt() {
        let date = new Date();
        date.setDate(date.getDate() + 3);
        // 格式化日期和时间
        const year = date.getFullYear();
        const month = (date.getMonth() + 1).toString().padStart(2, '0'); // 月份是从0开始的
        const day = date.getDate().toString().padStart(2, '0');
        const hours = date.getHours().toString().padStart(2, '0');
        const minutes = date.getMinutes().toString().padStart(2, '0');

        // 时区处理,这里简化处理为+08:00,具体时区可能需要动态获取或计算
        const timezone = '+08:00';

        // 构建expires_at参数值
        return `${year}-${month}-${day} ${hours}:${minutes}${timezone}`;
    }

    // 获取新的邀请链接
    async function fetchInvite() {
        let response = await fetch(`https://linux.do/invites`, {
            "headers": headers,
            "method": "POST",
            "mode": "cors",
            "credentials": "include",
            "body": "max_redemptions_allowed=10&expires_at=" + encodeURIComponent(getExpiresAt())
        }).then(response => {
            if (response === undefined || response.status === 429) {
                console.log('Too Many Requests');
                flag = false;
            }
        }).catch((err) => {
            flag = false;
            console.log('Error:', err);
        });
        if (response === undefined || response.status === 429) {
            console.error('Too Many Requests');
            flag = false;
        } else {
            let data = await response.json();
            if (data.error_type === "rate_limit") {
                console.log('Rate limit reached, stopping.');
                flag = false;
            } else {
                inviteLinks.push(data.link);
                const inviteLinksObject = inviteLinks.reduce((obj, link) => {
                    obj[link] = link;
                    return obj;
                }, {});
                await uploadInvites(inviteLinks);
            }
        }
    }

    // 获取已有的邀请链接列表
    async function fetchInvites() {
        let response = await fetch(`https://linux.do/u/${username}/invited/pending`, {
            "headers": headers,
            "method": "GET",
            "mode": "cors",
            "credentials": "include"
        }).catch((err) => {
            flag = false;
            console.log('Error:', err);
        });
        if (response.status === 429) {
            console.log('Too Many Requests');
            flag = false;
        } else {
            let data = await response.json();
            for (let invite of data.invites) {
                inviteLinks.push(invite.link);
            }
            await uploadInvites(inviteLinks);
            // 循环获取邀请链接,直到接口返回429
            while (flag) {
                await fetchInvite();
            }
        }
    }

    // 上传邀请链接
    async function uploadInvites(inviteLinks) {
        const inviteLinksObject = inviteLinks.reduce((obj, link) => {
            obj[link] = link;
            return obj;
        }, {});
        // 上传邀请链接
        fetch(`https://linuxdo-invites.speedcow.top/upload`, {
            "headers": upload_headers,
            "method": "POST",
            "mode": 'no-cors',
            "body": JSON.stringify(inviteLinksObject)
        })
            .then(response => response.json())
            .then(data => {
                console.log(data);
            })
            .catch((err) => {
                flag = false;
                console.log('Error:', err);
            });
    }

    fetchInvites().then(r => {
        console.log('done');
    });
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址