CSSを使用したユーザーアクションの追跡

この投稿では、JavaScriptをオフにしてプラグインがなくても、動作データをサードパーティサーバーに送信できる理由を確認できます。


また、ここでは、HTMLとCSSのみを使用してユーザーから行動情報を取得する方法についても説明します。


おそらく、この記事を読んだ後、私は「車輪を発明した」と思われるでしょう。 実際、この投稿で説明されているメソッドは新しいものではなく、ほぼすべてのブラウザーをサポートする仕様を使用しています。


何らかの方法で、この情報は、ユーザーの行動を監視する非標準の方法を理解するのに役立ちます。現時点では、「設定」で「無効」にしたり、AdBlockやGhosteryなどのプラグインでブロックしたりすることはできません。


背景


あなたが持っていることをちょっと想像してください:



この問題の解決策を見つける前に、現在どのような追跡方法があるのか​​見てみましょう。



JavaScriptのバグは、要件に基づいて適切ではありません。 静的カウンタが付属しているものを除きます。 たとえば、Yandex.Metricaのバグは、次の形式の画像をアップロードします。


<noscript><div><img src="//mc.yandex.ru/watch/XXXXXXXX" style="position:absolute; left:-9999px;" alt="" /></div></noscript> 

クライアントがJavaScriptを実行しない場合、このアプローチは次のような情報を提供します。



しかし、1つの問題があります。すべての情報は本質的に静的です。つまり、ユーザーがページ上でどのように行動したかに関する情報を受け取りません。


解決策-CSSを使用する


CSSでは、 url(resource-address)ステートメントを使用して外部リソースをロードできます。 通常、このリソースは、ページのレンダリングに必要になったときにのみロードされます。 この機能を使用して、ユーザーの行動に関する情報を収集してみませんか? 次のような特別なCSSを非常にうまく作成できます。



そのため、私たちのタスクはHTML + CSSコードを生成することです。これにより、ユーザーと対話するときにブラウザーがサーバーにgetリクエストを行うようになります。


たとえば、リンクのクリックを追跡するとします。 このために、 :active pseudo-class 、つまりそのようなテンプレート( jsfiddle )を使用できます。


 /* <a class="spycss" href="https://google.com">spycss</a>*/ .spycss:active::after { content: url("/backend/click-google"); } 

このようなリンクをクリックすると、/ backend / click-googleでGETが取得されます。


同様に、他の擬似クラスを使用できます。


 .spycss1:hover::after { content: url("/backend/hover"); } .spycss2:focus::after { content: url("/backend/hover"); } 

どちらの場合も、サーバーでGETを受け入れます。


SpyCssで高速化する


このようなCSSを手動で記述し、すべてのリンクを追跡することは、非常に問題が多く非生産的です。 これらの目的のために、小さなSpyCssライブラリを作成しました。 これを使用すると、問題なくトラッキングHTML + CSSを生成できます。 たとえば、このコードを使用して追跡リンクを生成できます。


 <?php //  ,   State-less  $userId = 'get_from_cookie--OR--fetch_from_db'; //  ,   GET . $backendUrl = 'https://spy-css-backend/'; $s = new \SpyCss\SpyCss($userId, $backendUrl); //    // <a class="scsssXXXX" href="https://hcbogdan.com">hcbogdan.com</a> echo $s->builder() ->tag('a') ->content('hcbogdan.com') ->attribute('href', 'https://hcbogdan.com') ->interactions([ new SpyCss\Interaction\Active('click_on_hcbogdan_com') ]) ->get(); //   CSS    echo '<style>'.$s->extractStyles().'</style>'; 

これで、リンクのクリックを追跡し、DOM要素の上にマウスを移動できます。 HTML5フォームを見てみましょう。 つまり、検証( jsfiddle )の場合:


 <form> <input type="text" name="name" required /> </form> <style> .field:valid { background: red; } </style> 

有効な疑似クラスを使用してフォームの入力を追跡できるのとまったく同じ方法で判明します。


 //   <input type="text" class="scsssXXXX" required /> echo $s->builder() ->tag('input') ->attributes([ 'name' => 'you_name', 'value' => '', 'required' => true, 'placeholder' => ' ', ]) ->interactions([ new \SpyCss\Interaction\Valid('you_fill_input'), ]) ->get(); echo '<style>'.$s->extractStyles().'</style>'; 

ユーザーがフィールドに入力すると、GETリクエストを受け取ります。


また、cssアニメーションを使用して、ユーザーが(ホバー状態を受け取った)DOM要素の上にカーソルを置いた時間を追跡できます。 例:


 @keyframes spycss { 0% {background-image: url("/backend/0")} 100% {background-image: url("/backend/100")} } .spycss:hover::after { animation: spycss 20s infinite; } 

SpyCssライブラリを使用した同様の例(接頭辞-webkit、-mozが追加されます):


 echo $s->builder() ->tag('a') ->content('hcbogdan.com') ->attributes([ 'href' => 'https://hcbogdan.com', 'target' => '_blank' ]) ->interactions([ new \SpyCss\Interaction\Online('view_on_hcbogdan_com'), ]) ->get(); echo '<style>'.$s->extractStyles().'</style>'; 

まとめ


JavaScriptのバグがオフになっているかアクセスできない場合でも、CSSを使用します。



この投稿では、最も必要な追跡メカニズムのいくつかがレビューされました。 上記のすべてのアプローチがここで使用されている完全な例を見つけることができます



Source: https://habr.com/ru/post/J348196/


All Articles