花了点时间写了一个脚本,自动获取页面上的邀请并且成为他的受邀用户。
有需要自取(狗头)
替换邮箱和用户名即可使用
// ==UserScript==
// @name linuxdo自动受邀
// @namespace http://tampermonkey.net/
// @description 自动查找页面上的邀请链接并接受邀请
// @version 2024-03-11
// @author 刀削金坷垃
// @match https://linux.do/*
// @icon https://linux.do/uploads/default/original/1X/3a18b4b0da3e8cf96f7eea15241c3d251f28a39b.png
// @require https://unpkg.com/[email protected]/dist/jquery.min.js
// @grant GM_log
// @grant GM_notification
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function() {
'use strict';
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
const event = new CustomEvent('DOMSubtreeModified');
document.dispatchEvent(event);
});
});
observer.observe(document, {
childList: true,
subtree: true
});
document.addEventListener('DOMSubtreeModified', function() {
let allInvites=[...document.querySelectorAll('a')].map(a=>a.href).filter(href=>href.includes("https://linux.do/invites/")).map(href=>href.replace("https://linux.do/invites/",""));
let store = GM_getValue("InvitesCodeList", new Set());
let csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
let username = '填你自己的用户名';//document.getElementById("current-user").getElementsByClassName("avatar")[0].title ;
let timezone='Asia/Shanghai';
let email='你自己的邮箱';
const sendRequestsWithDelay = (urlList) => {
let index = 0;
const intervalId = setInterval(() => {
if (index < urlList.length) {
sendRequest(urlList[index]);
index++;
} else {
clearInterval(intervalId);
}
}, 1000); // 1000 毫秒 = 1 秒
};
sendRequestsWithDelay(allInvites);
let sendRequest=(code)=>{
let hasInvites=GM_getValue(code);
if(!hasInvites){
GM_setValue(code,true);
const xhr = new XMLHttpRequest();
// 构建请求URL
const apiUrl = `https://linux.do/invites/show/${code}.json`;
// 设置请求方法和URL
xhr.open('PUT', apiUrl, true);
// 设置请求头
xhr.setRequestHeader('accept', '*/*');
xhr.setRequestHeader('accept-language', 'zh-CN,zh;q=0.9,en;q=0.8');
xhr.setRequestHeader('cache-control', 'no-cache');
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.setRequestHeader('discourse-logged-in', 'true');
xhr.setRequestHeader('discourse-present', 'true');
xhr.setRequestHeader('pragma', 'no-cache');
xhr.setRequestHeader('x-csrf-token', csrfToken);
xhr.setRequestHeader('x-requested-with', 'XMLHttpRequest');
// 处理请求完成后的回调函数
xhr.onload = function () {
if (xhr.status >= 200 && xhr.status < 300) {
console.log('PUT请求成功:', xhr.responseText);
// 处理返回的数据
} else {
console.error('PUT请求失败. 状态码:', xhr.status, '错误信息:', xhr.statusText);
// 处理错误
}
};
// 处理网络错误的回调函数
xhr.onerror = function () {
console.error('网络错误发生.');
// 处理网络错误
};
// 构建请求体数据
const requestData = `username=${username}&timezone=${timezone}&email=${email}`;
// 发送请求并将数据作为字符串发送
xhr.send(requestData);
}
}
});
})();