您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Check supplied item IDs and list prices with colors
// ==UserScript== // @name Item stalker // @namespace http://torn.city.com.dot.com.com // @version 0.2 // @description Check supplied item IDs and list prices with colors // @author Adobi // @match https://www.torn.com/* // @grant GM_setValue // @grant GM_getValue // @license MIT // ==/UserScript== (function() { 'use strict'; ///////////////////////////////// USER DEFINED VARIABLES ///////////////////////////////// const itemIDs = [817,818]; const itemNames = ['alcohol', 'energy drinks']; const desiredPrices = [990000, 16000000] const leftAligned = false; // select true for left aligned, false for right aligned ////////// END OF USER DEFINED VARIABLES. Change things below at your own risk. ////////// // Function to create and display yellow square with the option to enter API key function displayYellowSquare() { const yellowSquare = document.createElement('div'); yellowSquare.id = 'yellowSquare'; yellowSquare.style.position = 'fixed'; yellowSquare.style.left = '0'; yellowSquare.style.top = '0'; yellowSquare.style.color = 'black'; yellowSquare.style.top = '300px'; yellowSquare.style.width = '100px'; yellowSquare.style.height = '100px'; yellowSquare.style.backgroundColor = 'yellow'; yellowSquare.style.zIndex = '99999999'; yellowSquare.style.display = 'flex'; // Use flexbox for centering yellowSquare.style.cursor = 'pointer'; // Change cursor to pointer // Create a container div for centered text const textContainer = document.createElement('div'); textContainer.style.margin = 'auto'; // Center horizontally textContainer.style.textAlign = 'center'; // Center text textContainer.style.display = 'flex'; textContainer.style.flexDirection = 'column'; // Center vertically // Create text nodes for the yellow square with a line break const yellowTextNode0 = document.createTextNode('Busting friends'); const lineBreak = document.createElement('br'); const yellowTextNode1 = document.createTextNode('Click here to'); const lineBreak2 = document.createElement('br'); const yellowTextNode2 = document.createTextNode('supply public API key'); // Append the text nodes and line break to the text container textContainer.appendChild(yellowTextNode0); textContainer.appendChild(lineBreak); textContainer.appendChild(yellowTextNode1); textContainer.appendChild(lineBreak2); textContainer.appendChild(yellowTextNode2); // Append the text container to the yellow square yellowSquare.appendChild(textContainer); // Append the yellow square to the body (if it's not already added) if (!document.getElementById('yellowSquare')) { document.body.appendChild(yellowSquare); } // Add a click event listener to the yellow square yellowSquare.addEventListener('click', () => { const apiKey = prompt('Enter your API key:'); if (apiKey) { // Store the API key with GM_setValue GM_setValue('item_stalk_api_key', apiKey); yellowSquare.remove(); // Remove the yellow square after entering the API key fetchAndDisplayData(); // Run an API call with the new key } }); } // Check if the API key is already stored using GM_getValue const apiKey = GM_getValue('item_stalk_api_key', ''); // If the API key is not stored, display the yellow square if (!apiKey) { displayYellowSquare(); } function displayText(bustlist, links, difficulty) { // Check if the text container already exists and remove it const existingTextContainer = document.getElementById('item-stalk-container-id'); if (existingTextContainer) { existingTextContainer.remove(); } const mainContainer = document.getElementById('mainContainer'); // Get the main container element if (mainContainer) { const textContainer = document.createElement('div'); textContainer.id = 'item-stalk-container-id'; textContainer.style.position = 'fixed'; if (leftAligned) { textContainer.style.left = '0'; } else { textContainer.style.right = '0'; } textContainer.style.top = '100px'; textContainer.style.zIndex = '9999'; textContainer.style.display = 'block'; for (let j = 0; j < bustlist.length; j++) { const link = document.createElement('a'); link.href = links[j]; link.textContent = bustlist[j] + difficulty[j]; if (difficulty[j] < desiredPrices[j]) { link.style.color = '#00FF00'; } else { link.style.color = 'red'; } link.style.display = 'block'; link.style.marginBottom = '2px'; textContainer.appendChild(link); } mainContainer.appendChild(textContainer); // Append textContainer to mainContainer } displayBlackSquare(4 + bustlist.length * Math.round(125 / 9)); } // Function to create and display the black square function displayBlackSquare(squareHeight) { const existingSquare = document.getElementById('item_stalk_blackSquare'); if (existingSquare) { existingSquare.remove(); } if (squareHeight > 4 ) { const mainContainer = document.getElementById('mainContainer'); // Get the main container element const blackSquare = document.createElement('div'); blackSquare.id = 'item_stalk_blackSquare'; blackSquare.style.position = 'fixed'; if (leftAligned) { blackSquare.style.left = '0'; } else { blackSquare.style.right = '0'; } blackSquare.style.top = '98px'; blackSquare.style.width = '260px'; blackSquare.style.height = squareHeight + 'px'; blackSquare.style.backgroundColor = '#191919'; blackSquare.style.zIndex = '999'; if (!document.getElementById('item_stalk_blackSquare')) { mainContainer.appendChild(blackSquare); } } } // Function to fetch API data for a single faction function fetchFactionData(factionID, apiKey, name) { return fetch(`https://api.torn.com/market/${factionID}?selections=bazaar,itemmarket&key=${apiKey}`) .then(response => response.json()) .then(data => { const faction_and_name = []; const profile_link = []; const difficulty = []; // Check if there's an error in the API response if (data.error && data.error.error === 'Incorrect key') { GM_setValue('item_stalk_api_key', ''); displayYellowSquare(); } else { const mathyhelp = Math.min(data['itemmarket'][0]['cost'], data['bazaar'][0]['cost']); faction_and_name.push(name + " - "); profile_link.push('https://www.torn.com/imarket.php#/p=shop&step=shop&type=' + factionID); difficulty.push(mathyhelp); } return { faction_and_name, profile_link, difficulty }; }) .catch(error => { console.error('there was an API Error:', error); return { faction_and_name: [], profile_link: [], difficulty: [] }; }); } // Function to fetch API data and display the red square function fetchAndDisplayData() { const currentTime = Date.now(); const lastCallTime = GM_getValue('item_stalk_lastCallTime', 0); // Check if at least 30 seconds have passed since the last API call if (currentTime - lastCallTime >= 30000) { // Check if the API key is already stored using GM_getValue const apiKey = GM_getValue('item_stalk_api_key', ''); // If the API key is not stored, display the yellow square if (!apiKey) { displayYellowSquare(); } const fetchPromises = []; GM_setValue('item_stalk_lastCallTime', currentTime); // Store the current timestamp for (let i = 0; i < itemIDs.length; i++) { const promise = fetchFactionData(itemIDs[i], apiKey, itemNames[i]); fetchPromises.push(promise); } Promise.all(fetchPromises) .then(results => { const faction_and_name = []; const profile_link = []; const difficulty = []; results.forEach(result => { faction_and_name.push(...result.faction_and_name); profile_link.push(...result.profile_link); difficulty.push(...result.difficulty); }); if (profile_link.length > 0) { GM_setValue('item_stalk_fan', faction_and_name); GM_setValue('item_stalk_pl', profile_link); GM_setValue('item_stalk_t', difficulty); displayText(faction_and_name, profile_link, difficulty); } else { GM_setValue('item_stalk_fan', ""); GM_setValue('item_stalk_pl', ""); GM_setValue('item_stalk_t', ""); } }); } else { displayText(GM_getValue('item_stalk_fan'), GM_getValue('item_stalk_pl'), GM_getValue('item_stalk_t')); } } // Repeat every 5 seconds fetchAndDisplayData(); setInterval(fetchAndDisplayData, 5000); })();