🏠 Home 

[BROKEN] Show Amazon Questions button + context menu

Creates a "Show questions" button for Amazon. Once clicked it opens a new tab of the questions.


ติดตั้งสคริปต์นี้?
สคริปต์ที่แนะนำของผู้เขียน

คุณอาจชื่นชอบ Keyboard shortcut for switching between Chat GPT 4o mini and Chat GPT 4o


ติดตั้งสคริปต์นี้
// ==UserScript==
// @name     [BROKEN] Show Amazon Questions button + context menu
// @author   u/iNeedAProperAccount
// @description Creates a "Show questions" button for Amazon. Once clicked it opens a new tab of the questions.
//              It also creates an "Open Questions tab" context menu entry, which also when clicked opens a new tab of the questions.
//              Thanks to u/CaptSkinny, u/lilgeeky, u/Sanpete_in_Utah and u/TTum.
//              How it looks like:
//              https://i.imgur.com/mZSLDun.png
//              https://i.imgur.com/GHmUuEM.png
//              Original thread at: https://old.reddit.com/r/AmazonVine/comments/14aynxt/are_product_question_and_answer_sections_gone/
// @version  0.6
// @license  MIT
// @match    *://*.amazon.com/*
// @match    *://*.amazon.ca/*
// @match    *://*.amazon.com.mx/*
// @match    *://*.amazon.co.uk/*
// @match    *://*.amazon.fr/*
// @match    *://*.amazon.de/*
// @match    *://*.amazon.es/*
// @match    *://*.amazon.it/*
// @match    *://*.amazon.nl/*
// @match    *://*.amazon.se/*
// @match    *://*.amazon.pl/*
// @match    *://*.amazon.com.tr/*
// @match    *://*.amazon.ae/*
// @match    *://*.amazon.sa/*
// @match    *://*.amazon.co.jp/*
// @match    *://*.amazon.in/*
// @match    *://*.amazon.sg/*
// @match    *://*.amazon.com.au/*
// @match    *://*.amazon.com.br/*
// @icon     https://www.google.com/s2/favicons?sz=64&domain=amazon.ca
// @grant    GM_registerMenuCommand
// @namespace https://greasyfork.org/users/877912
// ==/UserScript==
const PRODUCT_TITLE_SELECTOR = "span#productTitle";
const REGEX_PATTERN = "^(http[s]?://[^/]+)/(?:.+?/)?(?:dp|gp/product|asin)/(?:.+?/)?([a-zA-Z0-9]{10})(?:[/?]|$)";
function getQuestionsUrl() {
try {
const url = document.URL;
const regex = new RegExp(REGEX_PATTERN, "i");
const matches = url.match(regex);
if (matches) {
const scheme_and_host = matches[1];
const asin = matches[2];
if (scheme_and_host && asin) {
return `${scheme_and_host}/ask/questions/asin/${asin}`;
}
}
} catch (error) {
console.error("Error in getQuestionsUrl:", error);
}
}
function contextOpenQuestionsTab() {
try {
const questions_url = getQuestionsUrl();
if (questions_url) {
window.open(questions_url, '_blank');
}
} catch (error) {
console.error("Error in contextOpenQuestionsTab:", error);
}
}
function openQuestionsTab() {
try {
const questions_url = getQuestionsUrl();
if (questions_url) {
const productTitle = document.querySelector(PRODUCT_TITLE_SELECTOR);
if (productTitle) {
const button = document.createElement("button");
button.innerHTML = "Show Questions";
button.style.margin = '0.2rem 0.2rem 0.2rem 0rem';
button.style.fontSize = '0.9rem';
button.addEventListener("click", function () {
window.open(questions_url, '_blank');
});
const brElement = document.createElement("br");
productTitle.parentNode.insertBefore(brElement, productTitle.nextSibling);
productTitle.parentNode.insertBefore(button, brElement.nextSibling);
const brAfter = document.createElement("br");
productTitle.parentNode.insertBefore(brAfter, button.nextSibling);
GM_registerMenuCommand("Open Questions tab", contextOpenQuestionsTab, "a");
}
}
} catch (error) {
console.error("Error in openQuestionsTab:", error);
}
}
const observer = new MutationObserver(function (mutations) {
try {
mutations.forEach(function (mutation) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
for (let i = 0; i < mutation.addedNodes.length; i++) {
const addedNode = mutation.addedNodes[i];
if (addedNode.nodeType === 1 && addedNode.matches && addedNode.matches(PRODUCT_TITLE_SELECTOR)) {
openQuestionsTab();
break;
}
}
}
});
} catch (error) {
console.error("Error in MutationObserver:", error);
}
});
const observerConfig = {
childList: true,
subtree: true
};
try {
observer.observe(document.body, observerConfig);
openQuestionsTab();
} catch (error) {
console.error("Error in script initialization:", error);
}