// ==UserScript==
// @name idelpoe预设天赋
// @namespace http://yournamespace.com
// @version 0.1.1
// @description 对网页版idelpoe进行天赋预设
// @author Your Name
// @match *://*.idlepoe.com/*
// @match *://idlepoe.com/*
// @match *://poe.faith.wang/*
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// ==/UserScript==
(function() {
'use strict';
// 创建一个变量来跟踪脚本是否启用
let scriptEnabled = true;
// 创建一个函数来启用或禁用脚本
function toggleScript() {
scriptEnabled = !scriptEnabled;
if (scriptEnabled) {
// 启用脚本
container.style.display = 'block'; // 显示脚本容器
} else {
// 禁用脚本
container.style.display = 'none'; // 隐藏脚本容器
}
}
// 创建一个按钮来启用/禁用脚本
const toggleButton = document.createElement('button');
toggleButton.textContent = '启用/禁用脚本';
toggleButton.style.position = 'fixed';
toggleButton.style.top = '10px';
toggleButton.style.right = '10px';
// 设置按钮的点击事件
toggleButton.addEventListener('click', toggleScript);
// 添加按钮到页面
document.body.appendChild(toggleButton);
// 创建一个容器用于样式设置
const container = document.createElement('div');
container.style.position = 'absolute'; // 使用相对定位
container.style.top = '35px';
container.style.left = '10px';
container.style.zIndex = '99999';
container.style.width = '400px'; // 设置容器的宽度
container.style.height = '300px'; // 设置容器的高度
container.style.textAlign = 'left'; // 设置按钮和输入框居左
container.style.padding = '10px'; // 添加内边距
container.style.display = scriptEnabled ? 'block' : 'none'; // 根据脚本启用状态设置显示/隐藏
// 创建一个下拉选择框用于选择请求方法
const methodSelect = document.createElement('select');
methodSelect.id = 'methodSelect';
methodSelect.style.marginBottom = '10px'; // 设置下拉选择框下边距
const presetSelect = document.createElement('select');
presetSelect.id = 'presetSelect';
presetSelect.innerHTML = `
<option value="40BD">40级BD</option>
<option value="50BD">50级BD</option>
<option value="60BD">60级BD</option>
<option value="80BD">80级BD</option>
<option value="90BD">90级BD</option>
<option value="100BD">100级贵族电打BD</option>`;
// 创建一个按钮元素(填入预设天赋)
const fillContentButton = document.createElement('button');
fillContentButton.textContent = '填充预设内容';
// 添加选项:POST
const postOption = document.createElement('option');
postOption.value = 'POST';
postOption.textContent = 'POST';
methodSelect.appendChild(postOption);
// 添加选项:GET
const getOption = document.createElement('option');
getOption.value = 'GET';
getOption.textContent = 'GET';
methodSelect.appendChild(getOption);
// 添加选项:PUT
const putOption = document.createElement('option');
putOption.value = 'PUT';
putOption.textContent = 'PUT';
methodSelect.appendChild(putOption);
// 创建一个输入框用于输入请求地址 (不可见)
const urlInput = document.createElement('input');
urlInput.type = 'text';
urlInput.value = 'https://poe.faith.wang/api/skilltree'; // 设置默认请求地址
urlInput.style.display = 'none'; // 设置输入框不可见
// 创建一个文本框用于输入请求头(不可见)
const headersInput = document.createElement('textarea');
headersInput.style.display = 'none'; // 隐藏整个文本区域
headersInput.id = 'hiddenHeaders'; // 用于存储请求头内容
// 创建一个输入框用于输入 Authorization 头部
const authorizationInput = document.createElement('input');
authorizationInput.type = 'text';
authorizationInput.placeholder = '请输入您的token';
authorizationInput.style.display = 'block'; // 设置为块级元素,使其垂直排列
authorizationInput.style.marginBottom = '10px'; // 设置输入框下边距
// 创建一个文本区域用于输入请求内容
const requestBodyInput = document.createElement('textarea');
requestBodyInput.placeholder = '请输入天赋树代码';
requestBodyInput.rows = 5; // 设置文本区域的高度
requestBodyInput.style.display = 'block'; // 设置为块级元素,使其垂直排列
requestBodyInput.style.marginBottom = '10px'; // 设置文本区域下边距
// 添加按钮的点击事件处理程序
fillContentButton.addEventListener('click', function() {
// 获取选择的预设值
let selectedPreset = presetSelect.value;
// 根据选择的预设值设置请求内容
if (selectedPreset === '40BD') {
requestBodyInput.value = '\{"passives":["58833","15144","35179","9009","60532","918","28221","24643","33545","28574","51786","24496","39861","49978","8938","59606","1427","51235","18707","9355","4011","5823","6538","38662","50338","5616","27283","31508","48099","65210","32117","54142","3187","2715","903","1461","49900","5802","3424","36287","20807"]\}';
} else if (selectedPreset === '50BD') {
requestBodyInput.value = '\{"passives":["33558","38662","3424","9009","65210","8938","51235","35851","18707","46408","5823","49900","57248","35179","58833","46277","48477","24496","23507","20807","5802","32555","33903","39861","9355","2715","54142","54338","28221","1461","31508","59606","30205","51786","60592","36287","20812","33545","49978","6538","12412","4011","27283","60532","32117","15144","8348","24643","47484","3309","5616","48099","1427","50338","3187","6534","9786","22266","918","19506"]\}';
} else if (selectedPreset === '60BD') {
requestBodyInput.value = '预设内容 60级BD';
}
else if (selectedPreset === '80BD') {
requestBodyInput.value = '预设内容 80级BD';
}
else if (selectedPreset === '90BD') {
requestBodyInput.value = '预设内容 90级BD';
}
else if (selectedPreset === '100BD') {
requestBodyInput.value = '\{"passives":["34579","28221","56001","45035","35283","50150","59220","38344","24865","9469","60942","23439","3187","5622","17201","5823","29856","49621","30471","51786","56460","25209","22266","65033","25058","1568","60532","28012","35053","18670","21575","6","10017","54142","28754","5616","21835","42686","15144","15842","50459","33558","4565","24641","2715","34031","1201","903","64878","54338","64024","9009","56509","50338","14056","48477","4011","49978","46408","33903","20807","12720","24643","31508","60002","9355","7085","10763","59151","38664","9877","9786","65502","28574","465","52213","30626","54354","27283","63139","61306","38662","37504","33545","5408","35179","30679","1698","6538","6108","36281","57839","40100","11651","45436","25456","6580","61636","34400","45491","39861","35894","19506","39524","48807","57080","24914","918","9015","30155","22423","42104","24496","43514","32555","6741","12412","3309","37647","61050"]\}';
}
});
// 创建一个按钮用于发送接口测试请求
const sendRequestButton = document.createElement('button');
sendRequestButton.textContent = '发送接口请求';
sendRequestButton.style.display = 'block'; // 设置为块级元素,使其垂直排列
const { fetch: originalFetch } = window;
unsafeWindow.fetch = async (...args) => {
let [resource, config ] = args;
if(resource === '/api/skilltree'){
let headers = config.headers['Authorization'];
// 使用Clipboard API将字符串复制到粘贴板
authorizationInput.value = headers;
let body = config.body;
navigator.clipboard.writeText(body).then(function(){
console.log("复制请求头信息并打印控制台");});
}
let response = await originalFetch(resource, config);
return response;
};
// 设置按钮的样式
sendRequestButton.style.backgroundColor = 'white';
sendRequestButton.style.color = 'black';
sendRequestButton.style.padding = '10px 20px';
sendRequestButton.style.border = '1px solid black';
sendRequestButton.style.borderRadius = '5px';
sendRequestButton.style.cursor = 'pointer';
// 监听按钮点击事件
sendRequestButton.addEventListener('click', function() {
const selectedMethod = methodSelect.value;
const url = urlInput.value; // 获取默认请求地址
const authorization = authorizationInput.value; // 获取用户输入的 Authorization 头部内容
const requestBody = requestBodyInput.value;
// 构建请求头
const headers = `content-type: application/json
authority: poe.faith.wang
accept: */*
accept-language: zh-CN,zh;q=0.9
Authorization: ${authorization}`; // 使用用户输入的 Authorization 头部内容
// 将请求头内容放入隐藏的文本区域,以备后续使用
document.getElementById('hiddenHeaders').value = headers;
GM_xmlhttpRequest({
method: selectedMethod,
url: url, // 使用默认请求地址
headers: parseHeaders(headers), // 解析自定义请求头
data: requestBody,
onload: function(response) {
alert('接口响应数据: ' + response.responseText);
},
onerror: function(error) {
alert('请求失败: ' + error.statusText);
}
});
});
// 将元素按照垂直顺序添加到容器
container.appendChild(methodSelect);
container.appendChild(urlInput);
container.appendChild(headersInput);
container.appendChild(authorizationInput);
container.appendChild(requestBodyInput);
container.appendChild(sendRequestButton);
container.appendChild(presetSelect);
container.appendChild(fillContentButton);
// 将容器添加到页面
document.body.appendChild(container);
// 解析自定义请求头
function parseHeaders(headers) {
const parsedHeaders = {};
if (headers) {
const headerLines = headers.split('\n');
for (const line of headerLines) {
const [name, value] = line.split(':');
if (name && value) {
parsedHeaders[name.trim()] = value.trim();
}
}
}
return parsedHeaders;
}
})();