From 671386c035a8506e9d6b687260e563308f10ffd6 Mon Sep 17 00:00:00 2001 From: Doar Mihai Date: Tue, 24 Mar 2026 22:42:31 +0200 Subject: [PATCH] ad blockers resistent code --- .../Controllers/TrackingScriptController.php | 7 ++++++- app/Models/Website.php | 12 +++++++++++- resources/views/websites/snippet.blade.php | 10 +++++++--- routes/api.php | 16 ++++++++++++++++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/TrackingScriptController.php b/app/Http/Controllers/TrackingScriptController.php index 488d029..7f5889b 100644 --- a/app/Http/Controllers/TrackingScriptController.php +++ b/app/Http/Controllers/TrackingScriptController.php @@ -18,7 +18,12 @@ class TrackingScriptController extends Controller ->header('Content-Type', 'application/javascript'); } - $collectUrl = route('collect.store'); + // Use ad-blocker resistant endpoint if script is loaded from /cdn/resources/ + // Otherwise use the original endpoint for backward compatibility + $currentRoute = request()->route()->getName(); + $collectUrl = $currentRoute === 'tracking.script.alt' + ? route('collect.store.alt') + : route('collect.store'); $js = view('tracking.tracker', [ 'trackingId' => $trackingId, diff --git a/app/Models/Website.php b/app/Models/Website.php index 11aa3af..a1d4dd7 100644 --- a/app/Models/Website.php +++ b/app/Models/Website.php @@ -115,11 +115,21 @@ class Website extends Model public function embedSnippet(): string { - $scriptUrl = route('tracking.script', $this->tracking_id); + $scriptUrl = route('tracking.script.alt', $this->tracking_id); return << HTML; } + + public function embedSnippetLegacy(): string + { + $scriptUrl = route('tracking.script', $this->tracking_id); + + return << + + HTML; + } } diff --git a/resources/views/websites/snippet.blade.php b/resources/views/websites/snippet.blade.php index fe9db1e..2945931 100644 --- a/resources/views/websites/snippet.blade.php +++ b/resources/views/websites/snippet.blade.php @@ -15,12 +15,16 @@

{{ __('Install the tracking code') }}

-

+

{{ __('Copy and paste the following code snippet into the') }} <head> {{ __('section of every page on') }} {{ $website->domain }}.

+

+ {{ __('Ad-blocker resistant:') }} + {{ __('This snippet uses paths that bypass most ad blockers.') }} +

{{ $website->embedSnippet() }}
@@ -79,11 +83,11 @@ ta('event', 'purchase', {
{{ __('Script URL') }}
-
{{ route('tracking.script', $website->tracking_id) }}
+
{{ route('tracking.script.alt', $website->tracking_id) }}
{{ __('Collection Endpoint') }}
-
{{ route('collect.store') }}
+
{{ route('collect.store.alt') }}
diff --git a/routes/api.php b/routes/api.php index 5f9e01c..bec0cdf 100644 --- a/routes/api.php +++ b/routes/api.php @@ -5,6 +5,7 @@ use App\Http\Controllers\CollectController; use App\Http\Controllers\TrackingScriptController; use Illuminate\Support\Facades\Route; +// Original endpoints (kept for backward compatibility) Route::get('/t/{trackingId}.js', [TrackingScriptController::class, 'script']) ->middleware('collect.cors') ->name('tracking.script'); @@ -19,6 +20,21 @@ Route::middleware('collect.cors')->group(function () { ->name('collect.pixel'); }); +// Ad-blocker resistant endpoints (use these in production) +Route::get('/cdn/resources/{trackingId}.js', [TrackingScriptController::class, 'script']) + ->middleware('collect.cors') + ->name('tracking.script.alt'); + +Route::middleware('collect.cors')->group(function () { + Route::post('/cdn/feedback', [CollectController::class, 'store']) + ->middleware('throttle:collect') + ->name('collect.store.alt'); + + Route::get('/cdn/status.gif', [CollectController::class, 'pixel']) + ->middleware('throttle:collect') + ->name('collect.pixel.alt'); +}); + Route::prefix('v1')->middleware(['auth:sanctum', 'throttle:api'])->name('api.v1.')->group(function () { Route::get('websites', [ApiWebsiteController::class, 'index'])->name('websites.index'); Route::get('websites/{website}/stats', [ApiWebsiteController::class, 'stats'])->name('websites.stats');