Amazon Search Result Enhancer

Enhance Amazon search results by adding numbers and advertisement IDs.

安装此脚本?
作者推荐脚本

您可能也喜欢显示亚马逊广告ID

安装此脚本
  1. // ==UserScript==
  2. // @name Amazon Search Result Enhancer
  3. // @name:zh 亚马逊搜索结果添加序号和广告ID
  4. // @name:de Amazon Suchergebnis Verbesserer
  5. // @name:ja Amazon 検索結果エンハンサー
  6. // @name:fr Amazon Amélioration des résultats de recherche
  7. // @name:it Amazon Miglioratore di risultati di ricerca
  8. // @name:nl Amazon Zoekresultaten Verbeteraar
  9. // @name:es Amazon Mejorador de Resultados de Búsqueda
  10. // @namespace https://noobbei.top
  11. // @version 1.5.1
  12. // @description Enhance Amazon search results by adding numbers and advertisement IDs.
  13. // @description:de Verbessern Sie Amazon-Suchergebnisse durch Hinzufügen von Nummern und Werbe-IDs.
  14. // @description:ja 広告IDと番号を追加してAmazon検索結果を向上させます。
  15. // @description:fr Améliorez les résultats de recherche Amazon en ajoutant des numéros et des identifiants de publicité.
  16. // @description:it Migliora i risultati di ricerca di Amazon aggiungendo numeri e ID pubblicitari.
  17. // @description:nl Verbeter Amazon zoekresultaten door nummers en advertentie-ID's toe te voegen.
  18. // @description:es Mejora los resultados de búsqueda de Amazon añadiendo números e ID de anuncios.
  19. // @description:zh 为亚马逊搜索结果页面上的广告和自然搜索结果添加序号, 并为广告结果添加广告ID和活动ID。
  20. // @author noobbei
  21. // @match https://www.amazon.com/*
  22. // @match https://www.amazon.co.uk/*
  23. // @match https://www.amazon.de/*
  24. // @match https://www.amazon.it/*
  25. // @match https://www.amazon.fr/*
  26. // @match https://www.amazon.es/*
  27. // @match https://www.amazon.se/*
  28. // @match https://www.amazon.com.mx/*
  29. // @match https://www.amazon.co.jp/*
  30. // @match https://www.amazon.ca/*
  31. // @icon https://www.amazon.com/favicon.ico
  32. // @license MIT
  33. // @grant none
  34. // ==/UserScript==
  35.  
  36.  
  37. (function () {
  38. 'use strict';
  39.  
  40. const translations = {
  41. 'zh': {'AdID': '广告ID', 'CampaignID': '活动ID'},
  42. 'en': {'AdID': 'Ad ID', 'CampaignID': 'Campaign ID'},
  43. 'de': {'AdID': 'Werbe-ID', 'CampaignID': 'Kampagnen-ID'},
  44. 'fr': {'AdID': 'ID Publicité', 'CampaignID': 'ID Campagne'},
  45. 'es': {'AdID': 'ID Anuncio', 'CampaignID': 'ID Campaña'},
  46. 'it': {'AdID': 'ID Annuncio', 'CampaignID': 'ID Campagna'},
  47. 'nl': {'AdID': 'Advertentie-ID', 'CampaignID': 'Campagne-ID'},
  48. 'ca': {'AdID': 'ID Anunci', 'CampaignID': 'ID Campanya'},
  49. 'ko': {'AdID': '광고ID', 'CampaignID': '캠페인ID'},
  50. 'ja': {'AdID': '広告ID', 'CampaignID': 'キャンペーンID'}
  51. };
  52.  
  53. // 动态检测用户的浏览器或网站语言
  54. let lang = navigator.language || navigator.userLanguage;
  55. console.log(lang);
  56. lang = lang.split('-')[0]; // 处理类似'en-US'的语言代码
  57.  
  58. let adID_k = translations[lang].AdID;
  59. let campaignID_k = translations[lang].CampaignID;
  60.  
  61. // 改进的 applyLabelsAndIds 函数
  62. const applyLabelsAndIds = () => {
  63. // 计数器重置
  64. let adCounter = 1;
  65. let searchResultCounter = 1;
  66.  
  67. // 获取所有搜索结果的元素
  68. let searchResults = document.querySelectorAll('div[data-component-type="s-search-result"], .sbv-video-single-product');
  69.  
  70. // 清除之前的序号和ID标签
  71. document.querySelectorAll('.ad-counter-label, .search-result-counter-label').forEach(label => {
  72. label.remove();
  73. });
  74. document.querySelectorAll('.ad-id-element, .campaign-id-element').forEach(idElem => {
  75. idElem.remove();
  76. });
  77.  
  78. searchResults.forEach(result => {
  79. let label;
  80. let adIdElement;
  81. let campaignIdElement;
  82.  
  83. // 检查是否已添加过标签
  84. if (result.querySelector('.ad-counter-label, .search-result-counter-label')) {
  85. return; // 如果已添加标签,跳过这个元素
  86. }
  87.  
  88. // 检查是否是广告
  89. if (result.classList.contains('AdHolder') || result.classList.contains('sbv-video-single-product')) {
  90.  
  91. // 创建序号标签
  92. label = createLabel(`${adCounter}`, 'gold', '#000');
  93. label.classList.add('ad-counter-label'); // 添加自定义类以避免重复添加
  94.  
  95.  
  96. // 从data-s-safe-ajax-modal-trigger属性获取广告ID
  97. let adDataAttribute = result.querySelector('[data-s-safe-ajax-modal-trigger]');
  98. // console.log('adData');
  99. // console.log(adDataAttribute);
  100. let adId = null;
  101. let campaignId = null;
  102. if (adDataAttribute) {
  103. // 解码HTML实体,然后解析JSON
  104. const adData = JSON.parse(adDataAttribute.getAttribute('data-s-safe-ajax-modal-trigger'));
  105. let ajaxUrl = adData.ajaxUrl;
  106. adId = decodeURIComponent(ajaxUrl).match(/"adId":"([^"]*)"/)[1];
  107. campaignId = decodeURIComponent(ajaxUrl).match(/"campaignId":"([^"]*)"/)[1];
  108.  
  109. }
  110.  
  111. // 如果找到广告ID,则创建并添加一个包含广告ID的标签
  112. if (adId) {
  113. adIdElement = createIdElement(`${adID_k}: ${adId}`, 'ad-id-element');
  114.  
  115. }
  116.  
  117. if (campaignId) {
  118. campaignIdElement = createIdElement(`${campaignID_k}: ${campaignId}`, 'campaign-id-element');
  119.  
  120. }
  121.  
  122.  
  123. // 增加广告计数器
  124. adCounter++;
  125.  
  126. } else {
  127. // 创建序号标签
  128. label = createLabel(`${searchResultCounter}`, 'green', '#FFF');
  129. label.classList.add('search-result-counter-label'); // 添加自定义类以避免重复添加
  130.  
  131. // 增加搜索结果计数器
  132. searchResultCounter++;
  133. }
  134.  
  135. // 将序号标签预置到搜索结果元素的标题下方
  136. const titleElement = result.querySelector('div[data-cy="title-recipe"]'); // 标题元素的选择器可能依网页而异
  137. if (titleElement) {
  138. let infoContainer = createInfoContainer();
  139. infoContainer.appendChild(label); // 序号标签
  140. if (adIdElement) {
  141. // 广告ID标签
  142. let adIdContainer = document.createElement('span'); // 创建一个新的容器
  143. adIdContainer.appendChild(adIdElement); // 将广告ID元素加入新容器
  144. infoContainer.appendChild(adIdContainer); // 将新容器加入信息容器
  145. }
  146.  
  147. if (campaignIdElement) {
  148. // 活动ID标签
  149. let campaignIdContainer = document.createElement('div'); // 创建一个新的容器
  150. campaignIdContainer.appendChild(campaignIdElement); // 将活动ID元素加入新容器
  151. infoContainer.appendChild(campaignIdContainer); // 将新容器加入信息容器
  152. }
  153.  
  154. // 将信息容器插入到标题元素的下一行
  155. titleElement.parentNode.insertBefore(infoContainer, titleElement.nextSibling);
  156. }
  157. });
  158. };
  159.  
  160. // 创建信息容器的函数,将标签和ID聚合在一起
  161. function createInfoContainer() {
  162. let container = document.createElement('div');
  163. container.style.display = 'block';
  164. container.style.flexDirection = 'row';
  165. container.style.alignItems = 'center';
  166. container.style.marginTop = '5px'; // 在标题下方添加一些间距
  167. return container;
  168. }
  169.  
  170. // 创建标签的函数,避免重复代码
  171. function createLabel(text, backgroundColor, foregroundColor) {
  172. let label = document.createElement('span');
  173. label.textContent = text;
  174. // 样式设置
  175. label.style.backgroundColor = backgroundColor;
  176. label.style.borderRadius = '50%';
  177. label.style.color = foregroundColor;
  178. label.style.display = 'inline-table';
  179. label.style.width = '25px';
  180. label.style.height = '25px';
  181. label.style.textAlign = 'center';
  182. label.style.marginLeft = '10px';
  183. label.style.marginRight = '5px';
  184. label.style.lineHeight = '25px';
  185. label.style.verticalAlign = 'middle';
  186. return label;
  187. }
  188.  
  189. // 创建广告id或活动id元素的函数,避免重复代码
  190. function createIdElement(text, className) {
  191. let idElement;
  192.  
  193. idElement = document.createElement('div');
  194. idElement.textContent = text;
  195. idElement.style.backgroundColor = '#DAA520'; // 金色背景色
  196. idElement.style.color = '#FFFFFF'; // 白色字体
  197. idElement.style.fontWeight = 'bold'; // 字体加粗
  198. idElement.style.padding = '3px 6px'; // 内边距
  199. idElement.style.marginLeft = '10px'; // 左边距
  200. idElement.style.borderRadius = '4px'; // 边框圆角
  201. idElement.style.boxShadow = '0 1px 3px rgba(0, 0, 0, 0.3)'; // 简单阴影效果
  202. idElement.style.fontSize = '0.75rem'; // 字体大小
  203. idElement.style.textAlign = 'center'; // 文本居中
  204. idElement.style.verticalAlign = 'middle'; // 垂直居中
  205. idElement.style.display = 'inline-block'; // 使用inline-block以便应用宽高、边距等
  206. idElement.style.minWidth = '80px'; // 最小宽度,保证布局的一致性
  207. idElement.style.height = '20px'; // 元素高度
  208. idElement.style.lineHeight = '20px'; // 行高与元素高度一致以垂直居中文本
  209.  
  210. idElement.classList.add(className); // 添加自定义类以便删除
  211. return idElement;
  212. }
  213.  
  214.  
  215. // 保存当前页面的URL
  216. let currentUrl = window.location.href;
  217.  
  218. const observer = new MutationObserver((mutations) => {
  219. let pageChanged = window.location.href !== currentUrl;
  220. if (pageChanged) {
  221. currentUrl = window.location.href;
  222. waitForContentLoaded().then(() => {
  223. applyLabelsAndIds(); // 确保新内容加载后再运行
  224. });
  225. }
  226. });
  227.  
  228. const waitForContentLoaded = () => {
  229. return new Promise((resolve) => {
  230. // 假设新内容加载大约需要500ms
  231. setTimeout(resolve, 500);
  232. });
  233. };
  234.  
  235. // 设置 observer 监听
  236. observer.observe(document.body, {childList: true, subtree: true});
  237.  
  238. // 初次调用
  239. applyLabelsAndIds();
  240.  
  241. })();

QingJ © 2025

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