带有 Facebook Instant Articles op-tracker 和 CSP 违规的自定义跟踪代码

Custom tracking code with Facebook Instant Articles op-tracker and CSP violations

我创建了一个类似于 Google Analytics 的脚本(在加载时创建脚本,将数据推送到数组,在托管脚本中使用以将跟踪数据存储在数据库中)用于 Facebook 的Instant Article 这样我就可以在我的软件内部跟踪统计数据。但问题是 Facebook 给出了关于我的脚本的 CSP 错误:

Refused to load the script 'https://My-Domain.com/js/w_analytics.js' 
because it violates the following Content Security Policy directive: 
"script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com
 *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 
'unsafe-inline' 'unsafe-eval' fbstatic-a.akamaihd.net 
fbcdn-static-b-a.akamaihd.net *.atlassolutions.com blob: data: 'self'".

即阅文标记与预期代码块内的脚本完全正确:

<figure class="op-tracker">
   <iframe> [code] </iframe>
</figure>

我目前正在通过 Facebook 的调试页面进行调试:http://ww.ia-tracker.fbsbx.com/instant_article_test?url=<share_url>

奇怪的是,偶尔我确实会从即阅文中获取一些统计信息到我的数据库,但不是始终如一或在每次页面浏览时都如此。

Facebook 文档说您可以直接 URL 您的智能设备,如下所示:

<figure class="op-tracker">
      <iframe src="http://my-url-tracker.com/">
          <!--
          The request to http://my-url-tracker.com/ will be rewritten to
          include the following query parameters:

          ia_share_url: The URL the user shared
          ia_title: The article title
          -->
      </iframe>
</figure>

但问题是它说它只发送这两个参数,当我自己的跟踪器获取我的软件所需的更多信息(例如 UA 字符串)时,所以理想情况下我想避免这种方法.

有没有其他人有为此使用自定义跟踪脚本的经验?

在这个问题上折腾了好几天之后,我通过将 op-trackeriframe src 结合使用到我的自定义跟踪脚本中来实现它,如下所示:

<figure class="op-tracker">
      <iframe src="http://my-url.com/tracker.php"></iframe>
</figure>

Facebook 文档并没有透露太多关于此方法的信息,他们省略了一小部分信息:发送的第三个参数是引荐来源网址 ia_referrer(此 returns 作为ia.facebook.com)

然后您可以在 "tracker.php" 脚本中使用 $_GET$_SERVER 的组合来获取脚本所需的任何其他详细信息,例如:

    $instantArticleURL = urldecode($_GET['ia_share_url']);
    $HTTPreferrer = $_GET['ia_referrer'];
    $userAgent = $_SERVER['HTTP_USER_AGENT'];
    $visitorIP = $_SERVER['REMOTE_ADDR'];

您可能还需要在 tracker.php 中包含此 header() 以确保 Facebook 可以访问该脚本(修改它以适合您的站点显然需要):

header("Access-Control-Allow-Origin: https://www.facebook.com");

希望这能让其他人省去几天的头痛:)