پوسته اپلیکیشن و ناوبری
اسکریپتهای کاربر هوشمند
اسکریپت برای هر سایت با تطبیق URL و زمانبندی (مثل Greasemonkey)
1Smart User Scripts چیست؟#
Smart User Scripts اسکریپتهای جداگانهٔ نامدار هستند - هرکدام با این موارد:
🌐 الگوهای تطبیق URL (اجرا روی کدام صفحهها)
⏱ زمانبندی اجرا (پیش از بارگذاری، حین آن یا پس از آن)
✅ کلید فعال/غیرفعال
مانند Greasemonkey یا Tampermonkey در مرورگرهای دسکتاپ کار میکنند - اما مستقیم در خود اپلیکیشن شما تعبیه شدهاند.
✅ عالی برای:
- ورود خودکار فقط در صفحه /login
- پنهان کردن تبلیغات فقط در صفحههای مقاله (https://news.com/article/*)
- پایش تغییرات DOM با MutationObserver
- تزریق پیش از رندر صفحه (document-start) برای جلوگیری از سوسو
تفاوت اصلی با Quick Injection:
Quick Injection = همان CSS/JS روی همهٔ صفحهها
Smart User Scripts = کنترل جداگانه برای هر اسکریپت، هر URL و هر زمانبندی
2کجا پیدایش کنیم#
مرحله ۴ (مجوزها) ← پایین بروید ← کارت 🤖 Smart User Scripts.
برای ساخت اسکریپت جدید روی «+ افزودن» بزنید. هر اسکریپت این موارد را دارد:
- نام - در فهرست مدیریت نمایش داده میشود
- الگوهای تطبیق URL - هر الگو در یک خط (از علامت * پشتیبانی میشود)
- Run At - document-end / document-start / document-idle
- Code - جاوااسکریپت شما
- کلید فعال/غیرفعال
برای ویرایش یا حذف یک اسکریپت، روی ردیف آن بزنید.
3نمونههایی از الگوهای تطبیق URL#
الگوها تعیین میکنند اسکریپت روی کدام صفحهها اجرا شود. از * بهعنوان علامت جایگزین (wildcard) استفاده کنید:
# Run on every page of every site
*://*/*
# Run only on example.com (any path)
https://example.com/*
# Run on ALL pages of ANY .com domain
https://*.com/*
# Run only on the /login path
https://example.com/login
https://example.com/login/*
# Run on news article pages
https://news.example.com/article/*4توضیح زمانبندی اجرا (Run-At)#
- document-end (پیشفرض)
پس از اتمام بارگذاری صفحه اجرا میشود. امن و سازگارترین حالت است. برای پنهان کردن عناصر، افزودن دکمهها و ردیابی استفاده کنید.
- document-start ⚡ (پیشرفته)
پیش از رندر شدن صفحه اجرا میشود. اسکریپت را از طریق shouldInterceptRequest در HTML خام تزریق میکند و سرآیندهای CSP را حذف میکند. برای CSS حالت تیره یا تنظیم viewport پیش از چیدمان صفحه استفاده کنید.
- document-idle ⏱
۱٫۵ ثانیه پس از بارگذاری صفحه اجرا میشود. برای محتوای AJAX که دیر بارگذاری میشود یا پنجرههایی که با تأخیر ظاهر میشوند مناسب است.
5مثال ۱: ورود خودکار فقط در /login#
Match: https://myapp.com/login
Run-at: document-end
// Auto-fill login form
(function() {
var email = document.querySelector('input[type=email], input[name=email]');
var pass = document.querySelector('input[type=password]');
if (email) email.value = '[email protected]';
if (pass) pass.value = 'mypassword';
// Uncomment to auto-submit:
// var form = document.querySelector('form');
// if (form) form.submit();
})();6مثال 2: پنهان کردن Paywall در صفحههای مقاله#
Match: https://news.site.com/article/*
Run-at: document-end
// Hide paywall overlay and restore scroll
(function() {
var overlay = document.querySelector('.paywall-overlay, .metered-content, #paywall');
if (overlay) overlay.remove();
document.body.style.overflow = 'auto';
document.documentElement.style.overflow = 'auto';
})();7مثال ۳: پایش محتوای پویا (MutationObserver)#
Match: *://*/*
Run-at: document-end
برای عناصری که پس از بارگذاری صفحه ظاهر میشوند (پنجرهها و تبلیغات با بارگذاری تنبل):
// Remove any modal/popup that appears dynamically
(function() {
var sel = '.modal, .popup, .overlay, [class*="modal"], [class*="popup"]';
// Remove existing ones first
document.querySelectorAll(sel).forEach(function(el) { el.remove(); });
// Watch for new ones
var obs = new MutationObserver(function() {
document.querySelectorAll(sel).forEach(function(el) { el.remove(); });
});
obs.observe(document.body, { childList: true, subtree: true });
// Stop watching after 30 s to save battery
setTimeout(function() { obs.disconnect(); }, 30000);
})();8مثال ۴: اجبار حالت تیره پیش از رندر (document-start)#
Match: *://*/*
Run-at: document-start
CSS را پیش از نمایش صفحه تزریق میکند - بدون سوسوی سفید:
// Inject dark theme before page renders
(function() {
var s = document.createElement('style');
s.id = '__force_dark__';
s.textContent = [
'html { filter: invert(1) hue-rotate(180deg) !important; }',
'img,video,canvas,svg { filter: invert(1) hue-rotate(180deg) !important; }'
].join('\
');
(document.head || document.documentElement).appendChild(s);
})();9مثال ۵: آنالیتیکس / ردیابی رویداد سفارشی#
Match: https://myshop.com/*
Run-at: document-idle
رویدادهای سفارشی را پس از آرام گرفتن کامل صفحه ارسال کنید:
// Track page views + button clicks
(function() {
// Page view
console.log('[Analytics] Page: ' + location.href);
// Track all CTA button clicks
document.querySelectorAll('button, .btn, a[href]').forEach(function(el) {
el.addEventListener('click', function() {
console.log('[Analytics] Clicked: ' + (el.textContent || el.href));
// Replace with your own tracker call, e.g. gtag('event', ...)
});
});
})();10امنیت و محدودیتها#
⚡ document-start سرآیندهای Content-Security-Policy را برای صفحهٔ منطبق حذف میکند. فقط روی سایتهایی استفاده کنید که مال خودتان است یا صراحتاً به آنها اعتماد دارید.
🔒 Same-Origin Policy: جاوااسکریپت نمیتواند به iframeهای با مبدأ متفاوت (PayPal، Stripe، ورود با Google) دسترسی پیدا کند. این محدودیت را موتور مرورگر اعمال میکند و قابل دور زدن نیست.
📵 فقط HTTPS: APIهایی مانند geolocation یا دوربین در اسکریپتهای تزریقشده به HTTPS نیاز دارند.
✅ جلوگیری از اجرای دوباره: هر اسکریپت با یک پرچم window محافظت میشود تا در هر صفحه فقط یک بار اجرا شود.
✅ آفلاین هم کار میکند: Smart User Scripts در اپلیکیشنهای آفلاین بستهبندیشده با ZIP هم اجرا میشوند.