Kā neļaut Plausible reģistrēt lapas skatījumu 404 kļūdas gadījumā Laravel projektā

Man ļoti patīk izmantot Plausible analītikai. Google Analytics (turpmāk vienkārši GA) man šķita „nedaudz“ par daudz, jo īpaši ņemot vērā, ka PageSpeed Insights katru reizi man atgādina, ka GA skripts ir „pārāk smags“ (ironiski).

Viena no lietām, kas mani pārliecināja, bija viņu dokumentācija — īsa, vienkārša, bet efektīva, un īpaši man patika instalācijas/integrācijas ceļveži (tur īpaši tiek pieminēts Laravel, kas ir mans galvenais rīks un kas šādā dokumentācijā reizēm vienkārši nav minēts).

Maršruta problēma

Šai vietnei es izmantoju composer pakotni vincentbean/laravel-plausible, un integrācija noritēja gana raiti. Diemžēl pēc mēneša lietošanas es pamanīju problēmu — daudz fiktīvu pieprasījumu uz neeksistējošām lapām un resursiem. Tas bija diezgan saprotami, jo viens no maršrutiem bija šāds aizstājējzīmju (wildcard) maršruts:

Route::get('/{slug}', [PageController::class, 'page'])->where('slug', '^(?!.*\.|^\/(favicon|css|js|storage|build)).*$')->name('page');

Spama pieprasījumu saraksts

Kad šis galapunktu saraksts parādījās manā vadības panelī, es nodomāju — nekas liels, izslēgšu tos, un viss būs kārtībā. Tā šķita gana laba doma... Bet, ak vai, cik ļoti es maldījos... Lūk, kas mani sagaidīja pēc tam, kad biju izslēgšanai pievienojis visus pamata galapunktus:

Nejaušu Krievijas banku galapunktu saraksts

Ieraudzījis šo dažu Krievijas banku galapunktu sarakstu, es sapratu, ka filtrēt visu noteikti nav mans ceļš. Tāpēc, sagatavojis sev gāzētu dzērienu ar ledu, es ķēros pie meklēšanas — kā šo problēmu atrisināt visnesāpīgāk, ar minimālām izmaiņām kodā.

Mērķi

Lūk, kādu uzvedību es būtībā gaidīju:

  1. Izsaukt notikumu, kad pakotne ir konfigurēta;
  2. Izsaukt notikumu, kad lapa eksistē;
  3. Izsaukt notikumu, kad tas nav CLI (kā bonuss, jo tas arī nedaudz sabojāja statistiku);

Labojums

Pakotnes middleware gana labi parūpējās par 1. punktu, bet 2. un 3. punkts palika neatrisināti. Tāpēc, apskatījis šo middleware, kas, tāpat kā lielākā daļa middleware, izrādījās diezgan tukšs, es uzlaboju tā kodu šādi:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;
use VincentBean\Plausible\Facades\PlausibleEvent;

class TrackPlausiblePageviews
{
    public function handle(Request $request, Closure $next): mixed
    {
        $response = $next($request);

        if (config('plausible.tracking_domain') !== null 
						&& $response->status() !== Response::HTTP_NOT_FOUND 
						&& is_string($request->userAgent())
            && !in_array($request->userAgent(), config('plausible.ignore_agents'))) {
            PlausibleEvent::fire('pageview');
        }

        return $response;
    }

Tātad, pirmkārt, es joprojām pārbaudu, vai man ir konfigurēts tracking_domain, jo, ja nav, tad ar notikumu tālāk turpināt tik un tā nav jēgas. Pēc tam es izmantoju Laravel gatavo funkcionalitāti — 404 izmešanu, izmantojot firstOrFail(). Un visbeidzot, tas rūpīgi pārbauda User Agent, jo citādi mani nospamotu mans paša vietnes kartes ģenerators.

Failā config/plausible.php es vienkārši pievienoju kaitinošos aģentus (un jā, es tos ierakstīju tieši kodā, jo tie nemainās pārāk bieži). Tāpēc droši pievienojiet arī šo savā konfigurācijā:

	'ignore_agents' => [
        'GuzzleHttp/7'
    ],

Nobeigums

Pieņemu, ka ikviens zina teicienu „ja tas strādā, neaiztiec to“. Nu, šajā konkrētajā gadījumā es tam piekrītu. Mana problēma tika atrisināta ar dažām koda rindiņām vien, un mans ledainais dzēriens vēl joprojām nav izdzerts.

P.S. Plausible komandai — kā es varu izdzēst DAĻU no vecajiem ierakstiem Analytics? 😅