steam show Community Items beta

add Community Items images

目前为 2023-03-20 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name steam show Community Items beta
  3. // @description add Community Items images
  4. // @namespace steam_Items_images
  5. // @author Covenant
  6. // @version 1.0.3
  7. // @license MIT
  8. // @homepage
  9. // @match https://store.steampowered.com/*
  10. // @match https://steamcommunity.com/*
  11. // @match https://steamdb.info/*
  12. // @match https://www.steamcardexchange.net/*
  13. // @icon data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjAgMTYiIHdpZHRoPSI0MCIgaGVpZ2h0PSIzMiI+CjxjaXJjbGUgc3Ryb2tlLXdpZHRoPSIxLjVweCIgY3k9IjQuNSIgY3g9IjE1LjUiIHI9IjMuNzUiIGNsYXNzPSJzdHJva2UiIHN0cm9rZT0iI0JCQkJCQiIgZmlsbD0ibm9uZSI+PC9jaXJjbGU+CjxjaXJjbGUgY3g9IjE1LjUiIGN5PSI0LjUiIHI9IjEuODU1IiBjbGFzcz0iZmlsbCIgZmlsbD0iI0JCQkJCQiI+PC9jaXJjbGU+CjxwYXRoIGQ9Ik0xMS42NTYgNC4yTDEyLjc1IDcuMTRsMi44NjUgMS4zODctNS4xMyAzLjg1My0uODY3LTIuMDktMS43NzMtLjk0MnoiIGNsYXNzPSJmaWxsIiBmaWxsPSIjQkJCQkJCIj48L3BhdGg+CjxjaXJjbGUgY3k9IjEyLjUiIGN4PSI3LjUiIHI9IjMiIGNsYXNzPSJzdHJva2UiIHN0cm9rZT0iI0JCQkJCQiIgZmlsbD0ibm9uZSI+PC9jaXJjbGU+CjxyZWN0IHRyYW5zZm9ybT0ibWF0cml4KC45MjQzMiAuMzgxNiAtLjM4NzI3IC45MjE5NiAwIDApIiByeT0iMS41MjYiIHdpZHRoPSI5LjQ3NyIgeT0iNy4xNTUiIHg9IjMuNzY3IiBoZWlnaHQ9IjMuMDUzIiBjbGFzcz0iZmlsbCIgZmlsbD0iI0JCQkJCQiI+PC9yZWN0Pgo8L3N2Zz4=
  14. // @grant GM_setValue
  15. // @grant GM_getValue
  16. // @grant GM_registerMenuCommand
  17. // @grant GM_xmlhttpRequest
  18. // @connect www.steamcardexchange.net
  19. // @connect steamcommunity.com
  20. // @run-at document-end
  21. // @noframes
  22. // ==/UserScript==
  23. var timeoutID;
  24. var is_Community_Items_Exist=true;
  25. var is_avatar_Exist=true;
  26. var ary_lang_steam=["english","japanese","latam","bulgarian","schinese","tchinese","czech","danish","dutch","finnish","french","german","greek","hungarian","italian","koreana","norwegian","polish","brazilian","portuguese","romanian","russian","spanish","swedish","thai","turkish","ukrainian","vietnamese"];
  27. var akamaihd="steamcdn-a.akamaihd.net";
  28. var steamstatic="cdn.cloudflare.steamstatic.com";
  29. var steamcommunity="steamcommunity.com";
  30. var profilebackground="/economy/profilebackground";
  31. var public_images="/steamcommunity/public/images";
  32. var url_steam_app;
  33. var url_category_753_Game;
  34. var url_avatar;
  35. var url_points_shop;
  36. var url_curatorsreviewing;
  37. var url_cardexchange;
  38. var url_steamdb_app;
  39. var url_steamdb_communityitems;
  40. var url_steamdb_achievements;
  41. function create_style(innerText,class_name){
  42. var style=document.createElement("style");
  43. if(Array.isArray(class_name)){
  44. for(let i=0; i<class_name.length; i++){style.classList.add(class_name[i]);}
  45. }
  46. else if(typeof class_name==='string'){style.classList.add(class_name);}
  47. style.textContent=innerText;
  48. style.title="user_gm_css";
  49. document.body.appendChild(style);
  50. return style;
  51. }
  52. var style_font_face=create_style("@font-face{font-family: 'color_emoji';src: local('Segoe UI Emoji'),local('Noto Color Emoji');}\n",["user_gm_css","css_steam_Items_images"]);
  53. var font_family_steam_main="font-family: 'Motiva Sans','color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','old_emoji',sans-serif;";
  54. var font_family_steam_info="font-family: Arial, Helvetica,'color_emoji','Noto Sans CJK JP','Meiryo','Yu Gothic','Microsoft JhengHei','old_emoji',sans-serif;";
  55. var style=create_style(".user_div_steam_main{"+font_family_steam_main+"font-weight: 100;}\n",["user_gm_css","css_steam_Items_images"]);
  56. style.textContent+=".user_div_steam_info{"+font_family_steam_info+"font-weight: 100;}\n";
  57. style.textContent+=".user_newmodal_background{position: fixed;z-index: 900;background: #000000;opacity: 0.8;top: 0;right: 0;bottom: 0;left: 0;}\n";
  58. function create_div(class_name,is_appendChild,node,refNode){
  59. var div=document.createElement("div");
  60. if(Array.isArray(class_name)){
  61. for(let i=0; i<class_name.length; i++){div.classList.add(class_name[i]);}
  62. }
  63. else if(typeof class_name==='string'){div.classList.add(class_name);}
  64. div.style.backgroundSize='contain';
  65. div.style.backgroundRepeat='no-repeat';
  66. div.lang='ja';
  67. if(is_appendChild){
  68. node.appendChild(div);
  69. }
  70. else{node.insertBefore(div, refNode);}
  71. return div;
  72. }
  73. var newmodal_background=create_div("user_newmodal_background",true,document.body);
  74. newmodal_background.style.setProperty('display','none');
  75. function create_a(text,url,class_name,is_appendChild,node,refNode){
  76. var anchor=document.createElement("a");
  77. anchor.href=url;
  78. anchor.innerText=text;
  79. anchor.title=text;
  80. if(Array.isArray(class_name)){
  81. for(let i=0; i<class_name.length; i++){anchor.classList.add(class_name[i]);}
  82. }
  83. else if(typeof class_name==='string'){anchor.classList.add(class_name);}
  84. anchor.target="_blank";
  85. if(is_appendChild){
  86. node.appendChild(anchor);
  87. }
  88. else{node.insertBefore(anchor, refNode);}
  89. return anchor;
  90. }
  91. function create_img_click(url,title,class_name,is_appendChild,node,refNode){
  92. let img = document.createElement('img');
  93. img.src=url;
  94. img.title=title;
  95. img.alt=title;
  96. img.width=54;
  97. img.style.setProperty('z-index','1000');
  98. img.addEventListener('click',() => {
  99. if(img.style.getPropertyValue('position')!="fixed"){
  100. img.style.setProperty('position','fixed');
  101. img.style.setProperty('left',"50%");
  102. img.style.setProperty('top',"50%");
  103. img.style.setProperty('transform',"translate(-50%,-50%)");
  104. img.style.setProperty('max-height',"95%");
  105. img.removeAttribute('width');
  106. newmodal_background.style.removeProperty('display');
  107. }
  108. else{
  109. img.style.removeProperty('position');
  110. img.style.removeProperty('left');
  111. img.style.removeProperty('top');
  112. img.style.removeProperty('transform');
  113. img.setAttribute('width', '54');
  114. newmodal_background.style.setProperty('display','none');
  115. }
  116. });
  117. if(is_appendChild){
  118. node.appendChild(img);
  119. }
  120. else{node.insertBefore(img, refNode);}
  121. return img;
  122. }
  123. function create_span(text,class_name,is_appendChild,node,refNode){
  124. var span=document.createElement("span");
  125. span.innerText=text;
  126. if(Array.isArray(class_name)){
  127. for(let i=0; i<class_name.length; i++){span.classList.add(class_name[i]);}
  128. }
  129. else if(typeof class_name==='string'){span.classList.add(class_name);}
  130. if(is_appendChild){
  131. node.appendChild(span);
  132. }
  133. else{node.insertBefore(span, refNode);}
  134. return span;
  135. }
  136. function create_br(is_appendChild,node,refNode){
  137. var br = document.createElement("br");
  138. if(is_appendChild){
  139. node.appendChild(br);
  140. }
  141. else{node.insertBefore(br, refNode);}
  142. return br;
  143. }
  144. function fn_gm_XMLHttpRequest(url,fn){
  145. GM_xmlhttpRequest({
  146. method: "GET",
  147. url: url,
  148. headers:{
  149. 'content-type': 'text/html; charset=UTF-8',
  150. 'user-agent':window.navigator.userAgent
  151. },
  152. onload: function (response){
  153. fn(response);
  154. /*console.log([
  155. "GM_xmlhttpRequest",
  156. response.status,
  157. response.statusText,
  158. response.readyState,
  159. response.responseHeaders,
  160. //response.responseText,
  161. response.finalUrl].join("\n")
  162. );//*/
  163. }
  164. });
  165. }
  166. function fn_url(url){
  167. var str_url=new URL(url);
  168. var params=new URLSearchParams(str_url.search);
  169. return [str_url,params];
  170. }
  171. //console.log("break");
  172. function steam_app_id(url){
  173. url=fn_url(url);
  174. var host=url[0].host;
  175. var pathname=url[0].pathname;
  176. var ary_pathname=pathname.split('/');
  177. if(url[0].host=="store.steampowered.com"){
  178. if(ary_pathname[1]=="app")return ary_pathname[2];
  179. else if(ary_pathname[1]=="api")return url[1].get('appids');
  180. }
  181. else if(url[0].host=="steamdb.info"){
  182. if(ary_pathname[1]=="app")return ary_pathname[2];
  183. }
  184. else if(url[0].host=="steamcommunity.com"){
  185. if(ary_pathname[1]=="app")return ary_pathname[2];
  186. if(ary_pathname[3]=="achievements"){//achievements
  187. if(!isNaN(ary_pathname[2])){return ary_pathname[2];}
  188. else{
  189. var gameLogo_a=document.querySelectorAll('div.gameLogo>a')[0];
  190. if(gameLogo_a!=undefined){return fn_url(gameLogo_a.href)[0].pathname.split('/')[2];}
  191. else{return null;}
  192. }
  193. }
  194. if(url[1].get('category_753_Game[]')!=null)return url[1].get('category_753_Game[]').replace(/tag_app_/i, '');//Community Market
  195. if(ary_pathname[3]=="753")return parseInt(ary_pathname[4],10);//Community Market item
  196. if(ary_pathname[3]=="gamecards")return parseInt(ary_pathname[4],10);//badge
  197. }
  198. else if(url[0].host=="www.steamcardexchange.net"){
  199. if(url[0].search.search(new RegExp("\\?gamepage-appid-", "i"))==0){
  200. return url[0].search.replace(/[^0-9.]/g, '').replace(/(\\..*?)\\..*/g, '$1');
  201. }
  202. }
  203. return null;
  204. }
  205. function fn_re_market_check(response){
  206. let dom=document.createRange().createContextualFragment(response.responseText);
  207. if(response.status==200){
  208. if(dom.querySelectorAll('div.market_sortable_column').length==0)is_Community_Items_Exist=false;
  209. var anchor=document.querySelectorAll('a.anchor_Items');
  210. for(let i = 0; i < anchor.length; i++){
  211. if(is_Community_Items_Exist){
  212. anchor[i].parentNode.classList.add('link_item');
  213. }
  214. else{anchor[i].style.display="none";}
  215. }
  216. anchor[0].parentNode.classList.add('checked_item');
  217. }
  218. else{//451
  219. console.log("market response.status: "+response.status+response.responseHeaders);
  220. }
  221. }
  222. function fn_re_avatar_check(response){
  223. if(response.status==200){
  224. if(response.finalUrl.search(new RegExp("/Avatar/List", "i"))==-1)is_avatar_Exist=false;
  225. var anchor=document.querySelectorAll('a.anchor_avatar')[0];
  226. if(is_avatar_Exist){
  227. anchor.parentNode.classList.add('link_avatar');
  228. }
  229. else{anchor.style.display="none";}
  230. anchor.parentNode.classList.add('checked_avatar');
  231. }
  232. else{//
  233. console.log("avatar response.status: "+response.status+response.responseHeaders);
  234. }
  235. }
  236. function fn_re_item(response){
  237. let dom=document.createRange().createContextualFragment(response.responseText);
  238. var url=fn_url(response.finalUrl);
  239. var appid=url[0].search.replace(/\?gamepage-appid-/i, '');
  240. if(response.status==200){
  241. var output=document.querySelectorAll('div.user_item')[0];
  242. var badge=Array.from(dom.querySelectorAll('div.badge>div>img'));//badge
  243. for(let j=0; j<badge.length; j++){
  244. create_img_click(badge[j].src.replace(akamaihd, steamstatic),'badge','',true,output);
  245. }
  246. create_br(true,output);
  247. var ary_img=Array.from(dom.querySelectorAll('div.emoticon>div>img'));//emoticon
  248. ary_img=ary_img.concat(Array.from(dom.querySelectorAll('div.background>div>a>img')));
  249. for(let j=0; j<ary_img.length; j++){
  250. if(ary_img[j].src.search(new RegExp("/economy/emoticon", "i"))==-1){
  251. let img_url=ary_img[j].src.replace(akamaihd, steamstatic);
  252. img_url=img_url.replace(steamcommunity, steamstatic);
  253. img_url=img_url.replace(profilebackground, public_images);
  254. create_img_click(img_url,'','',true,output);
  255. }
  256. }
  257. create_br(true,output);
  258. var ary_animated=Array.from(dom.querySelectorAll('div.avataranimated>div>img.image-animated'));//animated
  259. ary_animated=ary_animated.concat(Array.from(dom.querySelectorAll('div.sticker>div>img.image-animated')),Array.from(dom.querySelectorAll('div.animated>div>a>img')));
  260. ary_animated=ary_animated.concat(Array.from(dom.querySelectorAll('div.minibg>div>img')),Array.from(dom.querySelectorAll('div.aframe>div>img.image-animated')));
  261. for(let j=0; j<ary_animated.length; j++){
  262. if(true){
  263. create_img_click(ary_animated[j].src.replace(akamaihd, steamstatic),'','',true,output);
  264. }
  265. }
  266. var href=dom.querySelectorAll('div.booster>div>div>a')[0].href;
  267. var card=dom.querySelectorAll('div.card>div>a>img');
  268. create_a("booster "+6000/(card.length/2),href,"linkbar",true,output);
  269. console.log("fn_re_item 200");
  270. }
  271. else{//
  272. console.log("response.status: "+response.status+response.responseHeaders);
  273. }
  274. }
  275. function fn_re_avatar(response){
  276. let dom=document.createRange().createContextualFragment(response.responseText);
  277. var url=fn_url(response.finalUrl);
  278. if(response.status==200){
  279. var output=document.querySelectorAll('div.user_item')[0];//console.log(response.responseText);
  280. var avatarBlockFull=Array.from(dom.querySelectorAll('div#avatarBlockFull>a>img'));
  281. for(let j=0; j<avatarBlockFull.length; j++){
  282. let img_url=avatarBlockFull[j].src;
  283. create_img_click(img_url,'','',true,output);
  284. }
  285. create_br(true,output);
  286. console.log("fn_re_avatar 200");
  287. }
  288. else{//
  289. console.log("response.status: "+response.status+response.responseHeaders);
  290. }
  291. }
  292. function main_01(game_meta_data,appid){
  293. var tmp=document.querySelectorAll('div.Community_Items')[0];//old script
  294. if(tmp==undefined){
  295. var category_block=document.querySelectorAll('div#category_block')[0];
  296. var div_item_link=create_div(['block',"user_div_steam_info","Community_Items"],false,game_meta_data[0],category_block);
  297. var a_avatar=create_a("Avatar",url_avatar,['linkbar',"anchor_avatar"],true,div_item_link);
  298. var a_market=create_a("Community Market",url_category_753_Game,['linkbar',"anchor_Items"],true,div_item_link);
  299. var a_points=create_a("Points Shop",url_points_shop,['linkbar',"anchor_Items"],true,div_item_link);
  300. var a_steamcardexchange=create_a("steamcardexchange",url_cardexchange,['linkbar',"anchor_Items"],true,div_item_link);
  301. var a_steamdb=create_a("steamdb/communityitems",url_steamdb_communityitems,['linkbar',"anchor_Items"],true,div_item_link);
  302. div_item_link.style.backgroundImage="url('https://cdn.cloudflare.steamstatic.com/steam/apps/"+appid+"/page_bg_generated_v6b.jpg')";
  303. div_item_link.classList.add('link_dev');
  304. fn_gm_XMLHttpRequest(url_category_753_Game,fn_re_market_check);
  305. fn_gm_XMLHttpRequest(url_avatar,fn_re_avatar_check);
  306. }
  307. }
  308. function main_02(appid){
  309. var div_Community_item=document.querySelectorAll('div.Community_Items')[0];
  310. if(div_Community_item.classList.contains('checked_item')&&div_Community_item.classList.contains('checked_avatar')){
  311. window.clearInterval(timeoutID);
  312. if(div_Community_item.classList.contains('link_item'))fn_gm_XMLHttpRequest(url_cardexchange,fn_re_item);
  313. if(div_Community_item.classList.contains('link_avatar'))fn_gm_XMLHttpRequest("https://steamcommunity.com/ogg/"+appid+"/Avatar/List",fn_re_avatar);//page dont load
  314. }
  315. }
  316. function fn_steam_url(appid){
  317. url_steam_app="https://store.steampowered.com/app/"+appid;
  318. url_category_753_Game="https://steamcommunity.com/market/search?appid=753&category_753_Game[]=tag_app_"+appid+"#p1_name_asc";
  319. url_avatar="https://steamcommunity.com/ogg/"+appid+"/Avatar/List";
  320. url_points_shop="https://store.steampowered.com/points/shop/app/"+appid;
  321. url_curatorsreviewing="https://store.steampowered.com/curators/curatorsreviewing/?appid="+appid;
  322. url_cardexchange="https://www.steamcardexchange.net/index.php?gamepage-appid-"+appid;
  323. url_steamdb_app="https://steamdb.info/app/"+appid+"/";
  324. url_steamdb_communityitems="https://steamdb.info/app/"+appid+"/communityitems/";
  325. url_steamdb_achievements="https://steamdb.info/app/"+appid+"/stats/";
  326. }
  327. (function(){//main
  328. 'use strict';
  329. let url=fn_url(document.location);
  330. let appid=steam_app_id(document.location);//document.location.host+document.location.pathname+document.location.search+document.location.hash
  331. fn_steam_url(appid);
  332. let lang=document.documentElement.lang;
  333. console.log("steam: "+appid);
  334. if(url[0].host=="store.steampowered.com"){
  335. var game_meta_data=document.querySelectorAll('div.game_meta_data');//steam game page
  336. if(game_meta_data.length>0){
  337. window.setTimeout(( () => main_01(game_meta_data,appid) ), 100);//old script
  338. var div_item=create_div(['block',"user_div_steam_info","user_item"],true,game_meta_data[0]);
  339. timeoutID = window.setInterval(( () => main_02(appid)), 1000);//show item image
  340. var div_curators=create_div(['block',"user_div_steam_info","user_curators"],true,game_meta_data[0]);
  341. create_a("curators",url_curatorsreviewing,"linkbar",true,div_curators);
  342. }
  343. if(url[0].pathname=="/curators/curatorsreviewing/"){//steam curatorsreviewing page
  344. var page_content=document.querySelectorAll('div.light_container>div.page_content');
  345. var div_lang=create_div(["breadcrumbs","user_div_steam_main"],false,page_content[0],page_content[0].firstChild);
  346. for(let i=0; i<ary_lang_steam.length; i++){
  347. let anchor_lang=create_a(ary_lang_steam[i],"#","lang",true,div_lang);
  348. anchor_lang.setAttribute("onclick","ChangeLanguage('"+ary_lang_steam[i]+"'); return false;");
  349. create_span(" / ","breadcrumb_separator",true,div_lang);
  350. }
  351. }
  352. }
  353. else if(url[0].host=="steamcommunity.com"){
  354. var div_1=document.querySelectorAll('div.market_search_results_header>div')[0];//
  355. if(div_1!=undefined){
  356. create_a(appid,url_steam_app,"market_searchedForTerm",true,div_1);
  357. create_a("steamdb",url_steamdb_communityitems,"market_searchedForTerm",true,div_1);
  358. create_a("steamcardexchange",url_cardexchange,"market_searchedForTerm",true,div_1);
  359. }
  360. var div_2=document.querySelectorAll('div.market_listing_nav')[0];//
  361. if(div_2!=undefined){
  362. create_a(appid,url_steam_app,"btn_green_white_innerfade",true,div_2);
  363. create_a("steamdb",url_steamdb_communityitems,"btn_green_white_innerfade",true,div_2);
  364. create_a("steamcardexchange",url_cardexchange,"btn_green_white_innerfade",true,div_2);
  365. var anchor=document.querySelectorAll('div.market_listing_nav>a');
  366. for(let i=0; i<anchor.length; i++){
  367. if(anchor[i].href.search(new RegExp("category_753_Game", "i"))!=-1){
  368. anchor[i].href+="#p1_name_asc";
  369. break;
  370. }
  371. }
  372. }
  373. var div_profile_small_header_text=document.querySelectorAll('div.profile_small_header_text')[0];//profile game badge
  374. let gamecard=document.querySelectorAll('img.gamecard');
  375. if(div_profile_small_header_text!=undefined){
  376. create_span("🛍️","profile_small_header_arrow",true,div_profile_small_header_text);
  377. create_a("Community Market",url_category_753_Game,"anchor",true,div_profile_small_header_text);
  378. }
  379. if(gamecard.length>0)document.querySelectorAll('div.badge_title')[0].innerText+=" ["+6000/gamecard.length+"]";
  380. var div_tab=document.querySelectorAll('div#mainContents>div#tabs')[0];//achievements
  381. if(div_tab!=undefined){
  382. var div_achievements=create_div(["tabOff","user_div_steam_info"],true,div_tab);
  383. create_a("steamdb achievements",url_steamdb_achievements,"steamdb",true,div_achievements);
  384. }
  385. }
  386. else if(url[0].host=="steamdb.info"){
  387. if(appid!=null){
  388. var app_links=document.querySelectorAll('nav.app-links')[0];
  389. var tab_communityitems=document.querySelectorAll('a#tab-communityitems')[0];
  390. if(app_links!=undefined){
  391. if(tab_communityitems!=undefined)create_a("Community Market",url_category_753_Game,"linkbar",true,app_links);
  392. create_a("curators",url_curatorsreviewing,"linkbar",true,app_links);
  393. }
  394. }
  395. }
  396. else if(url[0].host=="www.steamcardexchange.net"){
  397. let img_card=document.querySelectorAll('div.card>div>a>img');
  398. if(img_card.length>0)document.querySelectorAll('div.game-title>h1')[0].innerText+=" ["+6000/(img_card.length/2)+"]";
  399. let div_game_links=document.querySelectorAll('div.game-links')[0];
  400. if(div_game_links!=undefined){
  401. let button_blue=div_game_links.querySelectorAll('div.game-links>a.button-blue');
  402. for(let i=0; i<button_blue.length; i++){
  403. if(button_blue[i].innerText.search(new RegExp("STEAM MARKET", "i"))==0){
  404. button_blue[i].href+="#p1_name_asc";
  405. break;
  406. }
  407. }
  408. create_br(true,div_game_links);
  409. create_a("steamdb",url_steamdb_app,'button-blue',true,div_game_links);
  410. }
  411. }
  412. })();