POE2 trade 繁体

POE2 trade 繁体化 - 放课后

目前为 2024-12-11 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name POE2 trade 繁体
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.6
  5. // @description POE2 trade 繁体化 - 放课后
  6. // @author 放课后
  7. // @match https://www.pathofexile.com/trade2/*
  8. // @grant GM_xmlhttpRequest
  9. // @license MIT
  10. // @run-at document-start
  11. // @require https://scriptcat.org/lib/637/1.4.3/ajaxHooker.js#sha256=y1sWy1M/U5JP1tlAY5e80monDp27fF+GMRLsOiIrSUY=
  12. // @grant GM_setValue
  13. // @grant GM_getValue
  14. // ==/UserScript==
  15.  
  16.  
  17. (async () => {
  18.  
  19. 'use strict';
  20. const applyState = GM_getValue('applyState') ? GM_getValue('applyState') : 1
  21.  
  22. window.addEventListener('load', function() {
  23. document.addEventListener('click', function(event) {
  24. if (event.target.closest('.applyTw')) {
  25. event.preventDefault(); // 阻止默认行为
  26. const applyState = GM_getValue('applyState') || 1;
  27. GM_setValue('applyState', applyState === 1 ? 2 : 1);
  28. localStorage.clear();
  29. location.reload();
  30. }
  31. });
  32.  
  33. // 查找目标 ul 元素
  34. const tabList = document.querySelector('ul.nav.nav-tabs.account');
  35. if (!tabList) {
  36. console.error('未找到目标元素');
  37. return; // 如果找不到目标元素,退出
  38. }
  39. // 创建应用按钮
  40. const applyLi = document.createElement('li');
  41. applyLi.role = 'presentation';
  42. applyLi.className = 'applyTw'
  43. applyLi.style.float = 'right';
  44. applyLi.style.height = '32px';
  45. const applyLink = document.createElement('a');
  46. applyLink.href = '#';
  47. applyLink.innerHTML = `<span>${applyState == 1 ? '已应用繁体化':'未应用繁体化'}</span>`;
  48. applyLi.appendChild(applyLink);
  49.  
  50. // 将按钮添加到 ul 元素中
  51. tabList.appendChild(applyLi);
  52. });
  53.  
  54. const dataMap = {}
  55.  
  56. if(applyState == 2) return
  57. ajaxHooker.hook(request => {
  58. request.response = res => {
  59. const responseText = res.responseText;
  60. const response = JSON.parse(responseText);
  61. if (request.url.includes('api/trade2/fetch') && dataMap['stats'] && dataMap['stats'].length) {
  62. response.result.forEach(item => {
  63. if(item.item.extended.hashes){
  64. const keys = Object.keys(item.item.extended.hashes)
  65.  
  66. keys.forEach(key => {
  67. const mods = item.item.extended.hashes[key]
  68. const entry = dataMap['stats'].find(a => a.id == key)
  69. const modTexts = item.item[key+'Mods']
  70.  
  71. if(entry && entry.entries && modTexts){
  72. let index = 0
  73. const newModTexts = mods.map(m => {
  74. const oldText = modTexts[index++]
  75. const mod = entry.entries.find(a => a.id == m[0])
  76. if(mod){
  77. let newModText = mod.text
  78. const values = oldText.match(/\d*\.\d+|\d+/g)
  79. if(values){
  80. let i = 0
  81. values.forEach(v => {
  82. newModText = newModText.replace(/#/,values[i++])
  83. })
  84. }
  85. if(newModText.match(/增加/) && oldText.match(/reduced/)){
  86. newModText = newModText.replace(/增加/,'降低')
  87. }
  88. return `${newModText}(${ oldText})`
  89. console.log(values)
  90. }
  91. return oldText
  92. })
  93. item.item[key+'Mods'] = newModTexts
  94. }
  95.  
  96. })
  97. }
  98.  
  99. })
  100. res.responseText = JSON.stringify(response);
  101. }else if (request.url.includes('api/trade2/data')){
  102. const key = request.url.split('/').pop();
  103. if(key == 'items'){
  104. const result = response.result
  105.  
  106. res.responseText = new Promise(resolve => {
  107. GM_xmlhttpRequest({
  108. method: 'GET',
  109. url: 'https://p2.710421059.xyz/enTradeItems2Tw.json',
  110. onload: function(response1) {
  111. if (response1.status === 200) {
  112. try {
  113. const enTradeItems2Tw = JSON.parse(response1.responseText);
  114. for (let i = 0; i < result.length; i++) {
  115. try {
  116. result[i].label = enTradeItems2Tw[i].label;
  117. } catch (e) {
  118. console.error(`Error processing item ${i}:`, e);
  119. }
  120. if (result[i].entries) {
  121. for (let j = 0; j < result[i].entries.length; j++) {
  122. const find = enTradeItems2Tw[i].entries.find(a => a.type === result[i].entries[j].type && (result[i].entries[j].name ? a.name === result[i].entries[j].name : true));
  123. if (find) {
  124. result[i].entries[j].text = find.text;
  125. }
  126. }
  127. }
  128. }
  129. dataMap[key] = result
  130. response.result = result
  131. resolve(JSON.stringify(response));
  132. } catch (e) {
  133. console.error(e)
  134. resolve(responseText);
  135. }
  136. } else {
  137. resolve(responseText);
  138. }
  139. },
  140. onerror: function(error) {
  141. resolve(responseText);
  142. }
  143. });
  144. });
  145. }else{
  146. const twUrl = 'https://pathofexile.tw'+request.url
  147. res.responseText = new Promise(resolve => {
  148. GM_xmlhttpRequest({
  149. method: 'GET',
  150. url: twUrl,
  151. onload: function(response) {
  152. if (response.status === 200) {
  153. try {
  154. const data = JSON.parse(response.responseText);
  155. dataMap[key] = data.result
  156. resolve(response.responseText);
  157. } catch (e) {
  158. resolve(responseText);
  159. }
  160. } else {
  161. resolve(responseText);
  162. }
  163. },
  164. onerror: function(error) {
  165. resolve(responseText);
  166. }
  167. });
  168. });
  169. }
  170.  
  171. }
  172. };
  173. });
  174. })();

QingJ © 2025

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