Display the bundleID on Apple App Store preview pages with a Copy button
目前為
// ==UserScript==
// @name App Store BundleID Viewer (with Copy Button)
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Display the bundleID on Apple App Store preview pages with a Copy button
// @author sharmanhall
// @match https://apps.apple.com/*/app/*/id*
// @icon https://www.apple.com/favicon.ico
// @grant GM_setClipboard
// @license MIT
// ==/UserScript==
(function () {
'use strict';
const MAX_ATTEMPTS = 10;
const RETRY_INTERVAL = 1000; // ms
function waitForPageReady(attempt = 0) {
if (document.body) {
getBundleID();
} else if (attempt < MAX_ATTEMPTS) {
setTimeout(() => waitForPageReady(attempt + 1), RETRY_INTERVAL);
} else {
console.error('[BundleID Viewer] Failed to load body after multiple attempts.');
}
}
async function getBundleID() {
const appIdMatch = window.location.href.match(/id(\d+)/);
if (!appIdMatch) {
console.warn('[BundleID Viewer] App ID not found in URL.');
return;
}
const appId = appIdMatch[1];
const lookupUrl = `https://itunes.apple.com/lookup?id=${appId}`;
try {
const response = await fetch(lookupUrl);
const data = await response.json();
if (!data.results || !data.results[0] || !data.results[0].bundleId) {
console.warn('[BundleID Viewer] Bundle ID not found in API response.');
return;
}
const bundleId = data.results[0].bundleId;
console.log('[BundleID Viewer] Found Bundle ID:', bundleId);
showBundleID(bundleId);
} catch (err) {
console.error('[BundleID Viewer] Error fetching bundle ID:', err);
}
}
function showBundleID(bundleId) {
const wrapper = document.createElement('div');
wrapper.style.position = 'fixed';
wrapper.style.bottom = '20px';
wrapper.style.right = '20px';
wrapper.style.backgroundColor = '#000';
wrapper.style.color = '#fff';
wrapper.style.padding = '10px 14px';
wrapper.style.borderRadius = '8px';
wrapper.style.boxShadow = '0 0 12px rgba(0,0,0,0.4)';
wrapper.style.zIndex = '99999';
wrapper.style.fontFamily = 'monospace';
wrapper.style.display = 'flex';
wrapper.style.alignItems = 'center';
wrapper.style.gap = '8px';
const text = document.createElement('span');
text.textContent = `📦 Bundle ID: ${bundleId}`;
const button = document.createElement('button');
button.textContent = 'Copy';
button.style.background = '#1E88E5';
button.style.color = 'white';
button.style.border = 'none';
button.style.padding = '4px 8px';
button.style.cursor = 'pointer';
button.style.borderRadius = '4px';
button.style.fontSize = '12px';
button.onclick = () => {
if (typeof GM_setClipboard === 'function') {
GM_setClipboard(bundleId);
} else {
navigator.clipboard.writeText(bundleId).catch(err =>
alert('Clipboard copy failed: ' + err)
);
}
button.textContent = 'Copied!';
setTimeout(() => (button.textContent = 'Copy'), 1500);
};
wrapper.appendChild(text);
wrapper.appendChild(button);
document.body.appendChild(wrapper);
}
window.addEventListener('load', () => waitForPageReady());
})();