steam市场 汇率自动转换

steam市场 汇率自动转换, 大部分代码用gpt生成的, 能跑就行

  1. // ==UserScript==
  2. // @name steam市场 汇率自动转换
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.1.3
  5. // @description steam市场 汇率自动转换, 大部分代码用gpt生成的, 能跑就行
  6. // @author bestcondition.cn
  7. // @match https://steamcommunity.com/market/listings/*
  8. // @icon https://www.google.com/s2/favicons?sz=64&domain=steamcommunity.com
  9. // @grant none
  10. // @license Apache-2.0
  11. // ==/UserScript==
  12. let ekv = {};
  13. let current_key_str = '';
  14. let cny_str = 'CNY¥'
  15. let input = document.createElement('input');
  16. let div = document.createElement('div');
  17.  
  18. function add_cal_input() {
  19. // 创建一个浮动的文本输入框
  20. input.type = 'text';
  21. input.placeholder = '请输入';
  22.  
  23. // 从 localStorage 中读取初始值
  24. const storedValue = localStorage.getItem('myInputValue');
  25. input.value = storedValue || 'x * 0.85';
  26.  
  27. // 监听文本框值的改变,并将其持久化到 localStorage 中
  28. input.addEventListener('input', () => {
  29. localStorage.setItem('myInputValue', input.value);
  30. });
  31. let p = document.createElement('p');
  32. p.innerText = '手续费后价格计算公式, 其中x为原价';
  33. div.appendChild(p);
  34. // 将文本框添加到页面中
  35. div.appendChild(input);
  36. }
  37.  
  38. function on_change() {
  39. let market_buyorder_info_details_tablecontainer = document.querySelector("#market_buyorder_info_details_tablecontainer")
  40. if (market_buyorder_info_details_tablecontainer) {
  41. market_buyorder_info_details_tablecontainer.style.width = 'auto';
  42. }
  43. let td_list = document.querySelectorAll("#market_commodity_buyreqeusts_table > table > tbody > tr > td:nth-child(odd)")
  44. td_list.forEach((td) => {
  45. let o_text = td.innerText
  46. if (!current_key_str) {
  47. for (let a in ekv) {
  48. if (o_text.includes(a)) {
  49. current_key_str = a;
  50. break;
  51. }
  52. }
  53. }
  54. if (o_text.includes(current_key_str) && !o_text.includes(cny_str)) {
  55. let currency_rate = ekv[current_key_str];
  56. if (currency_rate && input.value) {
  57. let ars_money = extractNumber(o_text)
  58. let cn_money = ars_money / currency_rate
  59. let x = cn_money
  60. let post_cn_money = eval(input.value)
  61. let cn_money_str = cn_money.toFixed(2)
  62. let post_cn_money_str = post_cn_money.toFixed(2)
  63. td.innerText = `${o_text} ( ${cny_str} ${cn_money_str} | ${post_cn_money_str} )`
  64. }
  65. }
  66. })
  67. }
  68.  
  69. function add_table() {
  70. // 大部分代码用gpt生成的, 能跑就行
  71. function sync_ekv(data) {
  72. for (let i = 0; i < data.length; i++) {
  73. let [key, value] = data[i];
  74. ekv[key] = value;
  75. }
  76. }
  77.  
  78. // 从 localStorage 中读取数据
  79. let exchangeRates = JSON.parse(localStorage.getItem('exchangeRates')) || [['CNY', 1.00]];
  80. sync_ekv(exchangeRates)
  81. // 创建表格元素
  82. let table = document.createElement('table');
  83.  
  84. // 创建表头行
  85. let thead = document.createElement('thead');
  86. let tr = document.createElement('tr');
  87. let th1 = document.createElement('th');
  88. let th2 = document.createElement('th');
  89. let th3 = document.createElement('th');
  90. th1.textContent = '币种';
  91. th2.textContent = '汇率';
  92. th3.textContent = '操作';
  93. tr.appendChild(th1);
  94. tr.appendChild(th2);
  95. tr.appendChild(th3);
  96. thead.appendChild(tr);
  97. // 创建表格数据行
  98. let tbody = document.createElement('tbody');
  99.  
  100. function create_table_data() {
  101. for (let i = 0; i < exchangeRates.length; i++) {
  102. let tr = document.createElement('tr');
  103. let td1 = document.createElement('td');
  104. let td2 = document.createElement('td');
  105. let td3 = document.createElement('td');
  106. td1.textContent = exchangeRates[i][0];
  107. td2.textContent = exchangeRates[i][1];
  108. let editButton = document.createElement('button');
  109. editButton.textContent = '修改';
  110. editButton.dataset.index = i;
  111. editButton.addEventListener('click', function (e) {
  112. let index = e.target.dataset.index;
  113. let currency = exchangeRates[index][0];
  114. let rate = exchangeRates[index][1];
  115. let newCurrency = prompt('请输入新的币种', currency);
  116. let newRate = prompt('请输入新的汇率', rate);
  117. if (newCurrency && newRate) {
  118. exchangeRates[index] = [newCurrency, parseFloat(newRate)];
  119. updateTable();
  120. saveExchangeRates();
  121. }
  122. });
  123. let deleteButton = document.createElement('button');
  124. deleteButton.textContent = '删除';
  125. deleteButton.dataset.index = i;
  126. deleteButton.addEventListener('click', function (e) {
  127. let index = e.target.dataset.index;
  128. if (confirm('确认删除?')) {
  129. exchangeRates.splice(index, 1);
  130. updateTable();
  131. saveExchangeRates();
  132. }
  133. });
  134. td3.appendChild(editButton);
  135. td3.appendChild(deleteButton);
  136. tr.appendChild(td1);
  137. tr.appendChild(td2);
  138. tr.appendChild(td3);
  139. tbody.appendChild(tr);
  140. }
  141. }
  142.  
  143. create_table_data()
  144. // 将表头和表格数据添加到表格中
  145. table.appendChild(thead);
  146. table.appendChild(tbody);
  147.  
  148. // 将表格添加到页面中
  149. div.id = 'exchange-rates';
  150. div.style.position = 'fixed';
  151. div.style.top = '0';
  152. div.style.right = '0';
  153. div.style.backgroundColor = 'white';
  154. div.style.border = '1px solid black';
  155. div.style.padding = '10px';
  156. div.appendChild(table);
  157. document.body.appendChild(div);
  158.  
  159. // 添加“新增”按钮
  160. let addButton = document.createElement('button');
  161. addButton.textContent = '新增';
  162. addButton.addEventListener('click', function () {
  163. let currency = prompt('请输入币种');
  164. let rate = prompt('请输入汇率');
  165. if (currency && rate) {
  166. exchangeRates.push([currency, parseFloat(rate)]);
  167. updateTable();
  168. saveExchangeRates();
  169. }
  170. });
  171. div.appendChild(addButton);
  172. // 添加拖动功能
  173. let isDragging = false;
  174. let currentX;
  175. let currentY;
  176. let initialX;
  177. let initialY;
  178. let xOffset = 0;
  179. let yOffset = 0;
  180.  
  181. div.addEventListener("mousedown", function (e) {
  182. isDragging = true;
  183. initialX = e.clientX - xOffset;
  184. initialY = e.clientY - yOffset;
  185. });
  186.  
  187. div.addEventListener("mouseup", function (e) {
  188. isDragging = false;
  189. });
  190.  
  191. div.addEventListener("mousemove", function (e) {
  192. if (isDragging) {
  193. e.preventDefault();
  194. currentX = e.clientX - initialX;
  195. currentY = e.clientY - initialY;
  196.  
  197. xOffset = currentX;
  198. yOffset = currentY;
  199.  
  200. div.style.transform = "translate(" + currentX + "px, " + currentY + "px)";
  201. }
  202. });
  203.  
  204. // 更新表格数据
  205. function updateTable() {
  206. tbody.innerHTML = '';
  207. for (let i = 0; i < exchangeRates.length; i++) {
  208. let tr = document.createElement('tr');
  209. let td1 = document.createElement('td');
  210. let td2 = document.createElement('td');
  211. let td3 = document.createElement('td');
  212. td1.textContent = exchangeRates[i][0];
  213. td2.textContent = exchangeRates[i][1];
  214. let editButton = document.createElement('button');
  215. editButton.textContent = '修改';
  216. editButton.dataset.index = i;
  217. editButton.addEventListener('click', function (e) {
  218. let index = e.target.dataset.index;
  219. let currency = exchangeRates[index][0];
  220. let rate = exchangeRates[index][1];
  221. let newCurrency = prompt('请输入新的币种', currency);
  222. let newRate = prompt('请输入新的汇率', rate);
  223. if (newCurrency && newRate) {
  224. exchangeRates[index] = [newCurrency, parseFloat(newRate)];
  225. updateTable();
  226. saveExchangeRates();
  227. }
  228. });
  229. let deleteButton = document.createElement('button');
  230. deleteButton.textContent = '删除';
  231. deleteButton.dataset.index = i;
  232. deleteButton.addEventListener('click', function (e) {
  233. let index = e.target.dataset.index;
  234. if (confirm('确认删除?')) {
  235. exchangeRates.splice(index, 1);
  236. updateTable();
  237. saveExchangeRates();
  238. }
  239. });
  240. td3.appendChild(editButton);
  241. td3.appendChild(deleteButton);
  242. tr.appendChild(td1);
  243. tr.appendChild(td2);
  244. tr.appendChild(td3);
  245. tbody.appendChild(tr);
  246. }
  247. }
  248.  
  249. // 将数据保存到 localStorage 中
  250. function saveExchangeRates() {
  251. localStorage.setItem('exchangeRates', JSON.stringify(exchangeRates));
  252. // 同步内存数据
  253. sync_ekv(exchangeRates);
  254. // 修改也要即时改变
  255. on_change();
  256. }
  257. add_cal_input();
  258. }
  259.  
  260. function extractNumber(str) {
  261. // 将字符串中的所有非数字字符替换为空格
  262. let numStr = str.replace(/[^\d,]/g, ' ');
  263.  
  264. // 将逗号替换为小数点
  265. numStr = numStr.replace(/,/g, '.');
  266.  
  267. // 将字符串拆分成数字数组
  268. let numArr = numStr.trim().split(' ');
  269.  
  270. // 将最后一个数字前面的空格替换为空字符串
  271. let lastNumIndex = numArr.length - 1;
  272. numArr[lastNumIndex] = numArr[lastNumIndex].replace(/^\s+/, '');
  273.  
  274. // 将数字数组转换为浮点数
  275. return parseFloat(numArr.join(''));
  276. }
  277.  
  278.  
  279. function observe_table() {
  280. // 选择要观察的目标节点
  281. let targetNode = document.querySelector('#market_commodity_buyreqeusts_table');
  282.  
  283. // 创建一个观察器实例并定义回调函数
  284. let observer = new MutationObserver(function (mutations) {
  285. mutations.forEach(function (mutation) {
  286. //console.log('Mutation type: ' + mutation.type);
  287. //console.log('Changed node: ' + mutation.target);
  288. on_change();
  289. });
  290. });
  291.  
  292. // 配置观察选项
  293. let config = {attributes: true, childList: true, subtree: true};
  294. on_change();
  295. // 传入目标节点和观察选项
  296. observer.observe(targetNode, config);
  297.  
  298. // 停止观察
  299. //observer.disconnect();
  300.  
  301. }
  302.  
  303. (function () {
  304. 'use strict';
  305. // 添加汇率展示表格
  306. add_table();
  307. // 先默认转换一次
  308. on_change();
  309. // 监控steam表格变化
  310. observe_table();
  311. // Your code here...
  312. })();

QingJ © 2025

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